diff --git a/CLAUDE.md b/CLAUDE.md index bd3a23a..198f871 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -8,7 +8,7 @@ Single-user local-first knowledge base + RAG. Rust 2024 workspace, 20 crates, si The repo's documentation is split by audience + zone — don't duplicate across them. **[DOCS.md](DOCS.md)** is the doc map (what's the Source-of-Truth for what); start there if unsure where something belongs. -**zones**: *living* (현재 진실, 갱신 필수) · *frozen 계약* (설계 의도 baseline, 편집 금지 — `docs/superpowers/specs/2026-04-27-…-design.md` 하나) · *증거* (rust_report, dogfood/v0.18.0). 그 외 historical 문서(옛 plans/handoffs/task specs/feature specs)는 2026-06-27 doc-reorg 에서 삭제 — git history 에만. **새 plan/handoff/per-feature spec 문서를 쌓지 않는다**(그게 268개로 불어난 원인): 결정·deviation 은 HOTFIXES, 구조·불변식은 ARCHITECTURE, 릴리스는 CHANGELOG 에 직접. +**zones**: *living* (현재 진실, 갱신 필수) · *설계 계약* (설계 의도 baseline — `docs/superpowers/specs/2026-04-27-…-design.md` 하나; 원칙 동결이되 코드와 크게 어긋나면 **dated 재조정 주석**(✂제거/⟳갱신/⚠모순수정)으로 정합, 2026-06-27 재조정 선례) · *증거* (rust_report, dogfood/v0.18.0). 그 외 historical 문서(옛 plans/handoffs/task specs/feature specs)는 2026-06-27 doc-reorg 에서 삭제 — git history 에만. **새 plan/handoff/per-feature spec 문서를 쌓지 않는다**(그게 268개로 불어난 원인): 결정·deviation 은 HOTFIXES, 구조·불변식은 ARCHITECTURE, 릴리스는 CHANGELOG 에 직접. - **[README.md](README.md)** — first stop for an end user. Quick start, command table, one Mermaid logical-architecture diagram, configuration pointers, license. Stays narrow. (living) - **[DOCS.md](DOCS.md)** — 문서 지도 / Source-of-Truth 인덱스. "어느 문서가 현재 진실인지" 한눈에. (living) @@ -42,9 +42,9 @@ The dev/test profile is already trimmed (`debug = "line-tables-only"`, `split-de ## Spec contract -`docs/superpowers/specs/2026-04-27-kebab-final-form-design.md` (12 sections) is the **single frozen design contract** for the whole workspace — "무엇을 의도했나"의 baseline. (The per-component task specs `tasks/p/` + per-feature design specs that referenced it were removed in the 2026-06-27 doc-reorg; the shipped **code is the implementation truth**, the design contract is the intent baseline, and deviations live in HOTFIXES.) +`docs/superpowers/specs/2026-04-27-kebab-final-form-design.md` (12 sections) is the **single frozen design contract** for the whole workspace — "무엇을 의도했나"의 baseline. (The per-component task specs `tasks/p/` + per-feature design specs that referenced it were removed in the 2026-06-27 doc-reorg; the shipped **code is the implementation truth**, the design contract is the intent baseline (periodically dated-reconciled to current code — see the doc's 2026-06-27 banner), and live deviations live in HOTFIXES between reconciliations.) -- The design contract stays **frozen** — don't edit it retroactively to match what shipped. +- The design contract is the intent **baseline**, kept stable — avoid free-form rewriting to chase every code change. BUT when accumulated drift/removals make it describe nonexistent features, a **periodic dated reconciliation pass** (✂ removed / ⟳ updated / ⚠ contradiction-fix — see the 2026-06-27 banner in the doc) is permitted and expected. HOTFIXES remains the fine-grained live deviation log between reconciliations. - **Live deviations from the contract go in `tasks/HOTFIXES.md`** as dated entries. Treat HOTFIXES.md as the live source of truth when behavior and the contract disagree. Don't recreate per-feature spec/plan/handoff files — record decisions in HOTFIXES, structure/invariants in `docs/ARCHITECTURE.md`, releases in `CHANGELOG.md`. `tasks/INDEX.md` is the per-component status dashboard; `HANDOFF.md` is the phase-level dashboard. Update them when a component/phase status changes. The full doc map (what's the SoT for what) is **[DOCS.md](DOCS.md)**. diff --git a/DOCS.md b/DOCS.md index 971816c..3208f9a 100644 --- a/DOCS.md +++ b/DOCS.md @@ -1,6 +1,6 @@ # 📍 kebab 문서 지도 (Documentation Map / Source-of-Truth Index) -**현재 코드베이스의 진실 = 코드 + 아래 *living* 문서.** *계약* 은 "무엇을 의도했나"의 동결된 baseline, *증거* 는 과거 검증 기록이다. 그 외 historical 문서(옛 실행계획·task spec·feature spec·handoff)는 **git history 에만** 있다 — 2026-06-27 doc-reorg 에서 압축·삭제했고, durable 한 내용은 전부 아래 living 문서로 흡수했다. +**현재 코드베이스의 진실 = 코드 + 아래 *living* 문서.** *계약* 은 "무엇을 의도했나"의 baseline(원칙 동결, 주기적 dated 재조정), *증거* 는 과거 검증 기록이다. 그 외 historical 문서(옛 실행계획·task spec·feature spec·handoff)는 **git history 에만** 있다 — 2026-06-27 doc-reorg 에서 압축·삭제했고, durable 한 내용은 전부 아래 living 문서로 흡수했다. > 처음 보는 사람은 이 표 하나로 "어디를 봐야 현재 진실인지" 알 수 있다. 무엇이 최신인지 헷갈리면 여기부터. @@ -19,14 +19,14 @@ | 격리 KB 로 직접 돌려보기 (smoke) | [docs/SMOKE.md](docs/SMOKE.md) | living | | 기능별 도그푸딩 시나리오 | [docs/DOGFOOD.md](docs/DOGFOOD.md) | living | | AI 코딩 에이전트 작업 규칙 | [CLAUDE.md](CLAUDE.md) | living | -| 설계 원안 (12 섹션 계약) | [docs/superpowers/specs/2026-04-27-kebab-final-form-design.md](docs/superpowers/specs/2026-04-27-kebab-final-form-design.md) | **계약 (frozen)** | +| 설계 원안 (12 섹션 계약) | [docs/superpowers/specs/2026-04-27-kebab-final-form-design.md](docs/superpowers/specs/2026-04-27-kebab-final-form-design.md) | **계약 (reconciled baseline)** | | 설계 기원·근거 (최초 보고서) | [kebab_local_rust_report.md](kebab_local_rust_report.md) | 증거 | | v0.18.0 NLI 검증 도그푸딩 증거 | [docs/dogfood/v0.18.0/](docs/dogfood/v0.18.0/) | 증거 | ## 구역 (zones) - **living** — 현재 코드베이스의 진실. 기능/표면 변경 시 동기화 필수 (CLAUDE.md §User-facing docs 가 강제). -- **계약 (frozen)** — `docs/superpowers/specs/2026-04-27-…-design.md` 단 하나. "무엇을 의도했나"의 동결 baseline. 편집 금지. 실제 동작이 이와 다르면 **HOTFIXES.md 가 진실**. +- **계약 (reconciled baseline)** — `docs/superpowers/specs/2026-04-27-…-design.md` 단 하나. "무엇을 의도했나"의 baseline. 원칙 동결이되 누적 drift/삭제로 현실과 모순되면 **주기적 dated 재조정**(✂/⟳/⚠, 2026-06-27 선례)으로 정합. 그 사이엔 동작이 이와 다르면 **HOTFIXES.md 가 진실**. - **증거** — 과거 검증/설계 기록 (rust_report, dogfood/v0.18.0). 갱신 안 함. - **git history** — 삭제된 historical 문서(plans·handoffs·task specs·feature specs)는 git 에만. `git log --all -- ` 로 복구 가능. durable 내용은 이미 living 으로 흡수됨. diff --git a/crates/kebab-rag/src/pipeline.rs b/crates/kebab-rag/src/pipeline.rs index 0faf7df..9677a6e 100644 --- a/crates/kebab-rag/src/pipeline.rs +++ b/crates/kebab-rag/src/pipeline.rs @@ -577,7 +577,7 @@ impl RagPipeline { /// Only the *initial* decompose's parse failure is a refusal. /// /// `prompt_template_version` on the returned `Answer` is - /// [`PROMPT_TEMPLATE_VERSION_MULTI_HOP`] (`rag-multi-hop-v1`) so + /// [`PROMPT_TEMPLATE_VERSION_MULTI_HOP`] (`rag-multi-hop-v2`) so /// eval `compare` can isolate multi-hop runs from single-pass. pub fn ask_multi_hop(&self, query: &str, opts: AskOpts) -> Result { let started = std::time::Instant::now();