Step 1 of 4
Extract symbols per file
The atom of the map is a signature, not a filename.
Build the extraction layer. Use tree-sitter (with the language grammars my repo needs) to parse each source file and extract: top-level functions and classes with full signatures, methods with signatures under their class, and export/visibility markers where the language has them. Store per-file digests: {path, language, symbols: [{kind, name, signature, line}], mtime, hash}. Skip vendored/generated directories via ignore rules. Handle parse failures gracefully (log, fall back to a names-only entry). Run extraction across the repo and spot-check 5 files: digests must match the code.
Expected after this step
Per-file symbol digests across the repo, spot-checked.
Should not happen
- ✕Dumping the file tree and calling it a map - names without symbols barely orient
- ✕Unranked maps where the budget is spent alphabetically instead of relevantly
- ✕Stale maps confidently pointing at moved or deleted symbols
- ✕Maps so large they recreate the raw-dump problem they were meant to solve
Verify before continuing
Do not move on until every check is true. The complete button stays locked until then.
Do not continue if…
- !Dumping the file tree and calling it a map - names without symbols barely orient
- !Unranked maps where the budget is spent alphabetically instead of relevantly
- !Stale maps confidently pointing at moved or deleted symbols
- !Maps so large they recreate the raw-dump problem they were meant to solve
If the AI messes this up
Use this when the AI fakes progress or breaks the feature. It forces a real fix.
Symbols are missing for one language. Verify the tree-sitter grammar for it is installed and the query patterns cover its declaration forms - each language needs its own extraction queries.