# p10-1C-Go β€” Go AST chunker **Status:** 🟑 μ§„ν–‰ 쀑 **Contract sections:** Β§3.3 (chunker_version `code-go-ast-v1`), Β§3.4 (symbol path β€” Go `package.Func` / `package.(*Receiver).Method`), Β§3.5 (code_lang `go`, ext `.go`), Β§6.1 (`kebab-parse-code/src/go.rs`), Β§6.2 (`kebab-chunk/src/code_go_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) Β§1C (Go λΆ€λΆ„ β€” Java + Kotlin 은 후속 PR). **Plan:** [2026-05-20-p10-1c-go-ast-chunker.md](../../docs/superpowers/plans/2026-05-20-p10-1c-go-ast-chunker.md). ## Goal 1A-2 / 1B 인프라 μœ„μ— Go AST chunker ν™œμ„±ν™”. μ‚¬μš©μž κ²°μ •μœΌλ‘œ 1C 의 3 μ–Έμ–΄ (Go + Java + Kotlin) λ₯Ό 2 PR 둜 λΆ„ν•  β€” Go κ°€ method receiver / package convention λ©΄μ—μ„œ Java/Kotlin (JVM family) κ³Ό λ‹€λ₯΄λ―€λ‘œ 별 PR. λ³Έ PR λ¨Έμ§€ μ‹œμ λΆ€ν„° Go ν”„λ‘œμ νŠΈ dogfooding κ°€λŠ₯. ## λ™κ²°λœ 섀계 κ²°μ • (이 task 둜 ν™•μ •) - **Symbol path 의 package prefix = μ†ŒμŠ€ μ½”λ“œμ˜ `package` μ„ μ–Έμ—μ„œ μΆ”μΆœ** (design Β§3.4 κ·ΈλŒ€λ‘œ). 1B 의 workspace-path λ³€ν™˜κ³Ό 닀름 β€” Go λŠ” μ–Έμ–΄ μžμ²΄μ— `package` declaration 이 μžˆμ–΄ 그게 canonical source. tree-sitter-go 의 `source_file` root 의 첫 named child `package_clause` μ—μ„œ μΆ”μΆœ. 빈 경우 (이둠상 invalid Go, μ‹€μš©μ—” 거의 μ—†μŒ) `` λ˜λŠ” fallback `` (1A `` νŒ¨ν„΄κ³Ό μœ μ‚¬). - **Method receiver ν‘œν˜„** (design μ˜ˆμ‹œ κ·ΈλŒ€λ‘œ): `package.(*Receiver).Method` (포인터 receiver), `package.(Receiver).Method` (value receiver). tree-sitter-go 의 `method_declaration` 의 `receiver` field μ—μ„œ type + pointer μ—¬λΆ€ μΆ”μΆœ. 예: `func (m *MdHeadingV1Chunker) ChunkDoc(...)` β†’ symbol `chunk.(*MdHeadingV1Chunker).ChunkDoc`. - **Top-level unit μ’…λ₯˜**: - `function_declaration` β†’ 1 unit, symbol `package.Func` - `method_declaration` β†’ 1 unit, symbol `package.(*Receiver).Method` / `package.(Receiver).Method` - `type_declaration` (struct / interface / type alias) β†’ 1 unit each, symbol `package.TypeName` - `const_declaration`, `var_declaration`, `import_declaration` (블둝 λ˜λŠ” 단일) β†’ glue, grouped β†’ `package.` (1A/1B νŒ¨ν„΄) - **Go 의 generic 처리**: `func Foo[T any](...)` λ˜λŠ” `type Foo[T any] struct{}` 의 type parameter λŠ” symbol 에 미포함 (Go μžμ²΄λ„ 보톡 symbol 에 μ•ˆ 적음). λ‹¨μˆœ `package.Foo` 만. - **Test detection**: Go 의 `func TestXxx(t *testing.T)` λŠ” *일반 fn 으둜 emit*. test 감지 boost/penalty λ“± ranking 영ν–₯은 λ³Έ task λ²”μœ„ λ°– (ranking brainstorm 보λ₯˜ λ©”λͺ¨λ¦¬ 따름). - frozen design μžμ²΄λŠ” λ³€κ²½ μ—†μŒ (Β§3.4 의 Go 행이 이미 λ³Έ κ²°μ •κ³Ό 일치). Β§10.1 에 1C-Go ν™œμ„±ν™” ν•œ 쀄 μΆ”κ°€. ## Acceptance criteria - `cargo test --workspace --no-fail-fast -j 1` passes (memory-conscious: per-crate μœ„μ£Ό, full-suite gate λŠ” docs task 직전 1회). - `cargo clippy --workspace --all-targets -- -D warnings` passes. - Go fixture (`tests/fixtures/sample.go`) ingest β†’ chunk snapshot μ•ˆμ • + `Citation::Code` 의 symbol 이 Β§3.4 μ»¨λ²€μ…˜ 일치 (`pkg.Func` / `pkg.(*Receiver).Method`). - 격리 TempDir KB 에 Go 파일 두고 `kebab search --code-lang go --json` κ°€ `Citation::Code { lang: "go", symbol: "...", ... }` λ°˜ν™˜. - `kebab schema --json | jq .stats.code_lang_breakdown` 에 `"go"` 카운트. - README + HANDOFF + ARCHITECTURE + SMOKE + tasks/INDEX + tasks/p10/INDEX κ°±μ‹ . - frozen design Β§10.1 ν•œ 쀄 μΆ”κ°€. - workspace `Cargo.toml` minor bump (0.11.1 β†’ 0.12.0). ## Allowed dependencies - `kebab-parse-code` 에 `tree-sitter-go` μΆ”κ°€ (workspace deps). κΈ°μ‘΄ deps μœ μ§€. - `kebab-chunk` 의 μƒˆ λͺ¨λ“ˆ `code_go_ast_v1.rs` β€” kebab-core + serde_json_canonicalizer + blake3 + anyhow + tracing. tree-sitter μ ˆλŒ€ import κΈˆμ§€. - `kebab-app`, `kebab-source-fs` λ³€κ²½ β€” μƒˆ crate dep μ—†μŒ. ## Forbidden dependencies - `kebab-chunk` κ°€ `tree-sitter-go` 직접 import κΈˆμ§€. - UI crate κ°€ `kebab-parse-code` 직접 import κΈˆμ§€. - `kebab-parse-code` κ°€ store / embed / llm / rag 직접 import κΈˆμ§€. ## Risks / notes - tree-sitter-go 의 `package_clause` node κ°€ root 의 첫 named child 인지 grammar 버전에 따라 λ‹€λ₯Ό 수 있음 β€” extractor κ°€ `source_file` 전체λ₯Ό named_children iterate ν•˜λ©΄μ„œ 첫 `package_clause` μž‘λŠ” 방식이 μ•ˆμ „. - `method_declaration` 의 receiver pointer μ—¬λΆ€: tree-sitter-go AST μ—μ„œ receiver type 이 `pointer_type` λ…Έλ“œλ©΄ `*Receiver`, κ·Έλƒ₯ `type_identifier` λ©΄ `Receiver`. μ •ν™•ν•œ ν…μŠ€νŠΈ μΆ”μΆœ ν•„μš”. - Generic type parameter (`[T any]`) κ°€ method_declaration / function_declaration 의 name field 와 별도 child β€” name 만 μΆ”μΆœν•˜λ©΄ generic λΆ€λΆ„ μžλ™ μ œμ™Έ. - 1B Python/TS/JS νŒ¨ν„΄ (helpers from lang.rs) 와 *λ‹€λ₯Έ* λͺ¨λΈ β€” λ³Έ task 의 mod_prefix λŠ” source-side AST μ—μ„œ μΆ”μΆœ, helper fn λΆˆν•„μš”. - λ¨Έμ§€ ν›„ deviation 은 `tasks/HOTFIXES.md` 에 dated 둜그 + λ³Έ spec `Risks / notes` 에 one-line cross-link.