Append-only architecture decisions. Rule: never edit old entries; add a new entry to supersede prior decisions.
- Status: accepted
- Decision: Introduce a generated runtime dataset (
data/places.json) produced from candidate pool + selected SIDs + per-SID overrides. - Rationale: Enables reliable automation while preserving static build and minimal runtime complexity.
- Status: accepted
- Decision: Keep only
/,/guide,/place/[slug]; do not introduce/food,/dining,/shopcategories now. - Rationale: Minimize routing complexity and avoid migration churn while content volume is small.
- Status: accepted
- Decision: Raw export artifacts are ignored from git; only sanitized candidate fields are committed.
- Rationale: Reduce sensitive/noisy data in repository and keep deterministic, reviewable inputs.
- Status: accepted
- Decision:
scripts/sync_selected_sids.mjsrewritesselected_sids.txtwith every SID incandidates.naver.json. No manual cherry-picking step. - Rationale: Curation happens upstream at the import stage (which candidates enter
candidates.naver.json), not at the selection stage. Keeps the publish loop to 4 commands:import:naver → select:sync → build:places → pages:build. - Consequence: to exclude a specific place, remove it from
candidates.naver.json(or add an override) rather than editingselected_sids.txtby hand.
- Status: accepted (manual path pending implementation)
- Decision:
places.jsonwill be merged from two sources: (1) Naver pipeline viacandidates.naver.json+selected_sids.txt, (2)data/manual.jsonfor non-Naver places (Instagram, blog-sourced, etc.). Manual entries require explicitslugfield; nosidneeded. - Slug convention: Naver slugs →
{ascii-name}-{sid}(ends in numeric). Manual slugs → plain words. Prevents collision by convention. - Status note:
manual.jsonpath not yet implemented inbuild_places.mjs.
- Status: accepted
- Decision:
build_places.mjsnow iterates all deduped candidates directly and no longer readsdata/selected_sids.txt. - Supersedes: “select:sync publishes all candidates by default” for runtime behavior.
- Rationale: removes one file and one command from the operational loop while preserving overrides and dedupe.
- Status: accepted
- Decision: Deploy using
npx wrangler pages deploywith API token authentication. Project name:gluten-free-korea. - Config:
wrangler.tomlat repo root manages compatibility flags and env vars. - Rationale: SSH environment prevents browser-based OAuth login; API token with Cloudflare Pages:Edit permission works headlessly.
- Status: accepted
- Decision: All environment variables (
NEXT_PUBLIC_SITE_URL,SITE_URL) are declared inwrangler.toml [vars]. Dashboard env var management is disabled when wrangler.toml is present. - Consequence: Non-secret env vars must be committed to
wrangler.toml; only secrets (encrypted) can be set via dashboard.
- Status: accepted
- Decision:
app/sitemap.jsusesprocess.env.SITE_URL || process.env.NEXT_PUBLIC_SITE_URLwith hardcoded fallbackhttps://gluten-free-korea.pages.dev. - Rationale:
NEXT_PUBLIC_SITE_URLis inlined at build time by Next.js; sitemap may run at runtime in Cloudflare Workers where build-time inlining is unavailable.SITE_URL(non-prefixed) is available at runtime via wrangler.toml vars.
- Status: accepted
- Decision: Improvement tasks (P0–P3) and deployment automation are tracked in
docs/TASKS.mdusing a Codex-executable format. Claude plans; Codex executes. - Task scope: sitemap dates, Tailwind v4 cleanup, html lang, aria-labels, shared utils extraction, OG meta cleanup, canonical URLs, custom 404, security headers, GitHub Actions CI/CD.
- CI/CD target: GitHub Actions →
npm run pages:build→npx wrangler pages deployon push to main. - Rationale: Separates planning (Claude) from implementation (Codex) to keep context clean and diffs reviewable.
- Status: accepted
- Decision: All 11 places have
nameEn,addressEn, andlocation(English) fields inoverrides.json. Place detail pages show Korean + English address side by side for taxi use. - Rationale: Target users are English-speaking tourists who need readable addresses for navigation.
- Status: accepted
- Decision: Place overrides may include
note_koalongside Englishnote, andbuild_places.mjspasses both through intodata/places.json. - Rationale: The UI now renders practical safety notes in both English and Korean without introducing a second runtime data source.
- Status: accepted
- Decision: Original photos in
public/images/NoGlutenSeoul_Assets/{한국어폴더}/are converted to webp via sharp (1200px full + 640px thumb) intopublic/images/places/{slug}/. Output dir is cleaned before each run. - Rationale: Reduces 332MB originals to ~6MB; keeps static build; avoids external image services.
- Status: accepted
- Decision:
overrides.jsonsupports"coverImage": "05.webp"to select card thumbnail.build_places.mjsmoves it to front of images array. Omit for default (01.webp). - Rationale: Decouples thumbnail selection from file naming; no file renaming needed.
- Status: accepted
- Supersedes: "Dual data entry paths" (manual.json path)
- Decision: Manual places use string SIDs (e.g.,
manual_francois) directly inoverrides.json.build_places.mjsprocesses override-only entries not found in candidates. - Rationale: Simpler than a separate
manual.json; single file to manage all overrides.
- Status: accepted
- Decision:
docs/PROJECT.mdis the sole comprehensive reference.CLAUDE.mdandAGENTS.mdpoint to it. Includes image system, pipeline commands, component specs, and known gaps. - Rationale: Eliminates need for agents to scan multiple files on every session start.
- Status: accepted
- Decision: An Obsidian vault at
NoGlutenKorea/serves as an LLM Wiki following Karpathy's pattern: raw sources → wiki markdown → schema (CLAUDE.md). Separate git repo. - Rationale: Structured knowledge base for LLM-assisted site operation and gluten-free domain knowledge.
- Status: accepted
- Supersedes: "All 11 places" count in 2026-03-10 bilingual entry
- Decision:
data/places.jsonnow contains 21 verified places. All 21 have at least 1 image. 4 places tagged Dedicated GF (sisemdal-atelier, 237-pizza, cafe-rebirths, monil2-house). - Rationale: Documentation audit found PROJECT.md stated 18, actual data has 21. Previous "5 places without photos" gap is resolved.
- Status: accepted
- Supersedes: MULTI_AGENT.md, OPERATING_MODEL.md (이력 보존, SUPERSEDED 표시)
- Decision: 모든 비자명한 작업은 Planner→Generator→Evaluator 3단계 루프를 거침.
docs/HARNESS.md가 아키텍처 정의,docs/HANDOFF.md가 세션 간 컨텍스트 전달. - Subagent 가드레일: 파일 4개/agent, 1000줄/파일, 병렬 3개, 같은 파일 동시 수정 금지.
- Rationale: 에이전트 자체 평가 부재로 품질 불안정 + 세션 간 컨텍스트 소실 문제 해결.
- Status: accepted
- Supersedes: CODEX_RUN.md (이력 보존, SUPERSEDED 표시)
- Decision: CODEX_RUN.md의 14개 태스크 시스템을
docs/TASKS.md(HARNESS 포맷)으로 이관. 13/14 완료 아카이브, TASK-12(CopyButton 통합)만 미완으로 이관. 각 태스크에 Evaluator 체크리스트 추가. - Rationale: CODEX_RUN.md는 Codex 전용이었으나, HARNESS 체계는 Claude Code/Codex 모두 사용 가능하며 Evaluator 단계가 추가되어 품질 게이트가 강화됨.