# p10-1A-2 β€” Rust AST chunker **Status:** 🟑 μ§„ν–‰ 쀑 **Contract sections:** Β§3.3 (chunker_version `code-rust-ast-v1`), Β§3.4 (symbol path β€” Rust convention), Β§3.4 frozen-design (`SourceSpan::Code` μ‹ κ·œ internal variant), Β§5 (code ingest ν™œμ„±ν™”), Β§6.1 (`kebab-parse-code/src/rust.rs` β€” tree-sitter-rust β†’ CanonicalDocument), Β§6.2 (`kebab-chunk/src/code_rust_ast_v1.rs`), Β§9.1 (Tier 1 AST per-language + oversize fallback). **Design:** [2026-05-15-kebab-code-ingest-design.md](../../docs/superpowers/specs/2026-05-15-kebab-code-ingest-design.md) Β§1A-2. **Plan:** [2026-05-19-p10-1a-2-rust-ast-chunker.md](../../docs/superpowers/plans/2026-05-19-p10-1a-2-rust-ast-chunker.md). ## Goal 1A-1 의 ν”„λ ˆμž„μ›Œν¬ μœ„μ— **Rust AST chunker 자체**λ₯Ό μ˜¬λ¦°λ‹€. `tree-sitter` + `tree-sitter-rust` λ„μž…, `kebab-parse-code/src/rust.rs` (tree-sitter-rust β†’ `CanonicalDocument`, AST 의미 λ‹¨μœ„λ§ˆλ‹€ `Block::Code` + `SourceSpan::Code`), `kebab-chunk/src/code_rust_ast_v1.rs` (1 block β†’ 1 chunk + oversize fallback split), `MediaType::Code` μ‹ μ„€, `kebab-app` dispatch. λ¨Έμ§€ μ‹œμ μ— kebab 자기 μžμ‹  dogfooding κ°€λŠ₯. ## λ™κ²°λœ 섀계 κ²°μ • (이 task 둜 ν™•μ •) - **tree-sitter μœ„μΉ˜ = parser (`kebab-parse-code`)**, chunker μ•„λ‹˜. design Β§6.3 μ˜μ‘΄μ„± κ·Έλž˜ν”„ (`kebab-parse-code β†’ tree-sitter, tree-sitter-rust`) κ°€ authoritative. PDF 선둀와 λ™ν˜• β€” parser κ°€ κ΅¬μ‘°ν™”λœ block 생성, chunker κ°€ λ§€ν•‘. Β§9.1 의 "chunker κ°€ AST" μ„œμˆ μ€ *oversize fallback split* 만 chunker-side λΌλŠ” 의미둜 해석. - **`SourceSpan::Code { line_start, line_end, symbol, lang }` λ‚΄λΆ€ variant μ‹ μ„€** (kebab-core). chunk 의 `source_spans_json` (chunks ν…Œμ΄λΈ”) 은 *λ‚΄λΆ€ μ €μž₯*이라 wire schema μ•„λ‹˜ β†’ wire major bump λΆˆν•„μš”. `Citation::Code` (wire) λŠ” 1A-1 μ—μ„œ 이미 좔가됨. `citation_helper::citation_from_first_span` 에 `SourceSpan::Code β†’ Citation::Code` arm μΆ”κ°€λ‘œ symbol/lang 이 μžμ—°μŠ€λŸ½κ²Œ 흐름. - **`MediaType::Code(String)` μ‹ μ„€** β€” String = canonical code_lang (1A λŠ” `"rust"` 만 μ‹€μ œ 처리, κ·Έ μ™Έ μΈμ‹λœ code lang 은 `Skipped` β€” Tier 2/3 λŠ” 후속 phase). - frozen design Β§3.4 의 `SourceSpan` enum 및 (ν•΄λ‹Ή μ‹œ) `MediaType` enum λͺ©λ‘μ„ 같은 PR μ—μ„œ κ°±μ‹ . λ³Έ task spec 은 λ¨Έμ§€ ν›„ frozen. ## Acceptance criteria - `cargo test --workspace --no-fail-fast -j 1` passes. - κΈ°μ‘΄ markdown / PDF / image corpus regression test 무영ν–₯ (citation 5β†’6 variant: `Citation::Code` λŠ” 1A-1 에 이미 쑴재; κΈ°μ‘΄ 5 variant 직렬화 λΆˆλ³€). - `cargo clippy --workspace --all-targets -- -D warnings` passes. - Rust fixture ν•œ 개 (fn / impl method / struct / trait / top-level use + 200쀄 초과 fn) ingest β†’ chunk snapshot μ•ˆμ • + `Citation::Code` 의 symbol/line 이 spec Β§3.4 Rust convention κ³Ό 일치. - kebab 자기 crate ν•œ 개λ₯Ό isolated TempDir KB 에 ingest β†’ `kebab search --json` κ²°κ³Όκ°€ `citation.kind == "code"`, `repo`, `code_lang == "rust"` λ°˜ν™˜ (SMOKE 절차). - `docs/superpowers/specs/2026-04-27-kebab-final-form-design.md` Β§3.4 (SourceSpan / MediaType) + Β§10.1 κ°±μ‹ . - README + HANDOFF + ARCHITECTURE + SMOKE + tasks/INDEX.md + tasks/p10/INDEX.md κ°±μ‹ . - workspace `Cargo.toml` version minor bump (도그푸딩 κ°€λŠ₯ = bump 트리거, design Β§10.4) + release cut. ## Allowed dependencies - `kebab-parse-code` 에 `tree-sitter` + `tree-sitter-rust` μΆ”κ°€ (workspace deps 경유). κΈ°μ‘΄ `kebab-core` / `anyhow` / `gix` μœ μ§€. - `kebab-chunk` λŠ” `kebab-core` 만 (chunker λŠ” `CanonicalDocument` 만 μ†ŒλΉ„ β€” tree-sitter import κΈˆμ§€). - `kebab-app β†’ kebab-parse-code` (facade κ°€ Extractor 호좜). ## Forbidden dependencies - `kebab-chunk` κ°€ `tree-sitter*` import κΈˆμ§€ (AST λŠ” parser-side). - UI crate (cli / mcp / tui) κ°€ `kebab-parse-code` 직접 import κΈˆμ§€ β€” `kebab-app` facade 만. - `kebab-parse-code` κ°€ store / embed / llm / rag import κΈˆμ§€ (design Β§8 inheritance). ## Risks / notes - tree-sitter-rust 의 grammar 버전에 따라 node kind λͺ…μΉ­ 차이 κ°€λŠ₯ β€” `function_item` / `impl_item` / `struct_item` / `enum_item` / `trait_item` / `mod_item` / `use_declaration` λŠ” λ„μž… λ²„μ „μœΌλ‘œ pin ν›„ ν…ŒμŠ€νŠΈλ‘œ κ³ μ •. - `SourceSpan::Code` μΆ”κ°€λ‘œ `SourceSpan` 의 λͺ¨λ“  exhaustive match (citation_helper, store-sqlite serde, search) κ°€ 영ν–₯ β€” μ»΄νŒŒμΌλŸ¬κ°€ non-exhaustive λ₯Ό μž‘μ•„μ£Όλ―€λ‘œ μ „μˆ˜ λŒ€μ‘. - oversize fallback (단일 fn > `ast_chunk_max_lines`) 의 `symbol [part i/N]` ν‘œκΈ°λŠ” 1A-2 chunker λ‚΄λΆ€ ν•œμ •. 일반 Tier-3 `code-text-paragraph-v1` 은 Phase 3. - λ¨Έμ§€ ν›„ λ™μž‘ deviation 은 `tasks/HOTFIXES.md` 에 dated 둜그 + λ³Έ spec `Risks / notes` 에 one-line cross-link. - AST_CHUNK_MAX_LINES deviation logged in HOTFIXES.md (2026-05-19): `Chunker` trait 이 per-medium config λ―Έλ…ΈμΆœ β€” μƒμˆ˜ 200 κ³ μ •, default 와 λ™μΌν•˜λ―€λ‘œ user-visible 영ν–₯ μ—†μŒ. - SourceType::Code deferred logged in HOTFIXES.md (2026-05-19): code 파일이 `SourceType::Note` 둜 λΆ„λ₯˜λ¨, `MediaType::Code` 기반 filter λŠ” 정상 λ™μž‘.