plan(p10-1a-1): code ingest framework implementation plan + spec wire-shape fix

21 task plan: kebab-core 도메인 타입 (Citation::Code variant, SearchHit repo/code_lang, IngestReport skip counters, Metadata extension), 새 kebab-parse-code crate (lang/repo/skip 모듈, gix dep), kebab-source-fs gitignore+blacklist 통합, kebab-config [ingest.code] 절, kebab-cli --repo/--code-lang flag, wire schema JSON 갱신, frozen design doc 갱신, README/HANDOFF/SMOKE 갱신, task index. 각 task 가 5-step TDD cycle (test fail → impl → pass → commit). 코드 chunker 는 1A-1 에 없음 — 1A-2 에서 추가.

spec 의 Citation::Code 예시가 기존 5 variants 의 flat wire 형태와 안 맞아서 (`code: {...}` 중첩이 아니라 top-level field) 같이 fix.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
th-kim0823
2026-05-15 14:31:22 +09:00
parent c6d61b0b37
commit 005a9011ea
2 changed files with 2273 additions and 9 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -101,18 +101,17 @@ frozen design §2.1 의 5 variant (`line` / `page` / `region` / `caption` / `tim
"kind": "code",
"path": "kebab/crates/kebab-chunk/src/md_heading_v1.rs",
"uri": "kebab/crates/kebab-chunk/src/md_heading_v1.rs#L142-L168",
"code": {
"line_start": 142,
"line_end": 168,
"symbol": "MdHeadingV1Chunker::chunk_doc",
"lang": "rust"
}
"line_start": 142,
"line_end": 168,
"symbol": "MdHeadingV1Chunker::chunk_doc",
"lang": "rust"
}
```
`code.symbol` 은 nullable — Tier 1 AST chunk 면 채움, Tier 2/3 면 비움 (`null`).
`code.lang``--code-lang` filter 와 같은 식별자 (lowercase). null 가능.
**Wire 형태 — flat**: 기존 5 variants 와 동일한 패턴 (`Citation::Line``start` / `end` / `section` 이 top-level, 중첩 없음). serde `#[serde(tag = "kind")]` 외부 tag enum 이라 variant 별 필드가 top-level 에 들어감.
`symbol` 은 nullable — Tier 1 AST chunk 면 채움, Tier 2/3 면 `null`.
`lang``--code-lang` filter 와 같은 식별자 (lowercase). null 가능.
기존 5 variant 와 마찬가지로 `path` + `uri` 는 항상 채움. `uri``path#L<start>-L<end>` (W3C Media Fragments) 그대로.