codegraph-brain 0.28.0__tar.gz → 0.30.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (516) hide show
  1. codegraph_brain-0.30.0/.github/test-count-baseline +1 -0
  2. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/.github/workflows/ci.yml +18 -1
  3. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/.gitignore +2 -0
  4. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/.pre-commit-config.yaml +1 -0
  5. codegraph_brain-0.30.0/.release-please-manifest.json +3 -0
  6. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/CHANGELOG.md +58 -0
  7. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/CLAUDE.md +33 -12
  8. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/PKG-INFO +3 -2
  9. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/README.md +1 -1
  10. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/benchmarks/agent_ab/README.md +21 -2
  11. codegraph_brain-0.30.0/benchmarks/agent_ab/RESULTS.md +177 -0
  12. codegraph_brain-0.30.0/benchmarks/agent_ab/results.jsonl +65 -0
  13. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/AUDIT.md +1 -1
  14. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/architecture/HOW_IT_WORKS.md +45 -39
  15. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/architecture/ONTOLOGY.md +1 -1
  16. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/architecture/diagrams/pipeline_flow.mermaid +25 -21
  17. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/how-to/AGENT_ONBOARDING.md +19 -0
  18. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/how-to/MCP_REFERENCE.md +32 -13
  19. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/ontology/core.yaml +1 -0
  20. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/ontology/domains.yaml +6 -7
  21. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/ontology/patterns.yaml +50 -26
  22. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/ontology/tolerances.lock +4 -4
  23. codegraph_brain-0.30.0/docs/plans/2026-10-14-language-packs-step1.md +1037 -0
  24. codegraph_brain-0.30.0/docs/plans/2026-10-14-language-packs-step2.md +773 -0
  25. codegraph_brain-0.30.0/docs/plans/2026-10-14-language-packs-step3.md +732 -0
  26. codegraph_brain-0.30.0/docs/plans/2026-10-14-language-packs-step4.md +681 -0
  27. codegraph_brain-0.30.0/docs/plans/2026-10-14-language-packs-step5.md +187 -0
  28. codegraph_brain-0.30.0/docs/plans/2026-10-14-language-packs-step6.md +270 -0
  29. codegraph_brain-0.30.0/docs/plans/2026-10-14-language-packs-step7.md +485 -0
  30. codegraph_brain-0.30.0/docs/plans/2026-10-14-language-packs.md +888 -0
  31. codegraph_brain-0.30.0/docs/specs/2026-10-14-language-packs-design.md +537 -0
  32. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/plugin/README.md +1 -1
  33. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/plugin/skills/cgis/SKILL.md +1 -1
  34. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/plugin/skills/ingest/SKILL.md +1 -1
  35. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/pyproject.toml +7 -1
  36. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/scripts/agent_ab.py +143 -23
  37. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/scripts/generate_health.py +2 -3
  38. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/scripts/generate_mcp_ref.py +10 -1
  39. codegraph_brain-0.30.0/scripts/graph_identity.py +187 -0
  40. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/scripts/guardian_martian.py +4 -4
  41. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/server.json +3 -3
  42. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/api/auto_refresh.py +2 -2
  43. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/api/mcp_server.py +193 -39
  44. codegraph_brain-0.30.0/src/cgis/api/server_instructions.py +60 -0
  45. codegraph_brain-0.30.0/src/cgis/api/tool_allowlist.py +95 -0
  46. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/bench/guard.py +27 -5
  47. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/bench/transcript.py +9 -1
  48. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/cli.py +11 -15
  49. codegraph_brain-0.30.0/src/cgis/core/extractor.py +110 -0
  50. codegraph_brain-0.30.0/src/cgis/core/index.py +44 -0
  51. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/core/js_globals.py +64 -1
  52. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/core/models.py +25 -0
  53. codegraph_brain-0.30.0/src/cgis/core/project.py +38 -0
  54. codegraph_brain-0.30.0/src/cgis/core/resolution.py +78 -0
  55. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/guardian/collector.py +6 -6
  56. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/guardian/martian.py +1 -1
  57. codegraph_brain-0.30.0/src/cgis/import_names.py +170 -0
  58. codegraph_brain-0.30.0/src/cgis/languages/__init__.py +241 -0
  59. codegraph_brain-0.30.0/src/cgis/languages/go/__init__.py +70 -0
  60. codegraph_brain-0.30.0/src/cgis/languages/go/_syntax.py +215 -0
  61. codegraph_brain-0.30.0/src/cgis/languages/go/extractor.py +452 -0
  62. codegraph_brain-0.30.0/src/cgis/languages/go/index.py +141 -0
  63. codegraph_brain-0.30.0/src/cgis/languages/go/naming.py +49 -0
  64. codegraph_brain-0.30.0/src/cgis/languages/go/project.py +139 -0
  65. codegraph_brain-0.30.0/src/cgis/languages/go/resolution.py +115 -0
  66. codegraph_brain-0.30.0/src/cgis/languages/python/__init__.py +72 -0
  67. codegraph_brain-0.28.0/src/cgis/extractors/_python_annotations.py → codegraph_brain-0.30.0/src/cgis/languages/python/_annotations.py +2 -2
  68. codegraph_brain-0.28.0/src/cgis/extractors/_python_classes.py → codegraph_brain-0.30.0/src/cgis/languages/python/_classes.py +1 -1
  69. codegraph_brain-0.28.0/src/cgis/extractors/_python_functions.py → codegraph_brain-0.30.0/src/cgis/languages/python/_functions.py +41 -3
  70. codegraph_brain-0.28.0/src/cgis/extractors/_python_imports.py → codegraph_brain-0.30.0/src/cgis/languages/python/_imports.py +1 -1
  71. codegraph_brain-0.30.0/src/cgis/languages/python/_routes.py +138 -0
  72. codegraph_brain-0.28.0/src/cgis/extractors/_python_types.py → codegraph_brain-0.30.0/src/cgis/languages/python/_types.py +1 -1
  73. codegraph_brain-0.28.0/src/cgis/extractors/python_extractor.py → codegraph_brain-0.30.0/src/cgis/languages/python/extractor.py +16 -13
  74. codegraph_brain-0.30.0/src/cgis/languages/python/index.py +288 -0
  75. codegraph_brain-0.30.0/src/cgis/languages/python/project.py +42 -0
  76. codegraph_brain-0.30.0/src/cgis/languages/python/resolution.py +32 -0
  77. codegraph_brain-0.30.0/src/cgis/languages/typescript/__init__.py +72 -0
  78. codegraph_brain-0.28.0/src/cgis/extractors/_typescript_bindings.py → codegraph_brain-0.30.0/src/cgis/languages/typescript/_bindings.py +55 -2
  79. codegraph_brain-0.28.0/src/cgis/resolver/js_builtins.py → codegraph_brain-0.30.0/src/cgis/languages/typescript/builtins.py +6 -21
  80. codegraph_brain-0.28.0/src/cgis/extractors/typescript_extractor.py → codegraph_brain-0.30.0/src/cgis/languages/typescript/extractor.py +14 -39
  81. codegraph_brain-0.30.0/src/cgis/languages/typescript/index.py +163 -0
  82. codegraph_brain-0.30.0/src/cgis/languages/typescript/naming.py +37 -0
  83. codegraph_brain-0.30.0/src/cgis/languages/typescript/npm.py +73 -0
  84. codegraph_brain-0.30.0/src/cgis/languages/typescript/project.py +109 -0
  85. codegraph_brain-0.30.0/src/cgis/languages/typescript/resolution.py +160 -0
  86. codegraph_brain-0.28.0/src/cgis/tsconfig_paths.py → codegraph_brain-0.30.0/src/cgis/languages/typescript/tsconfig.py +40 -16
  87. codegraph_brain-0.30.0/src/cgis/languages/typescript/workspaces.py +204 -0
  88. codegraph_brain-0.28.0/src/cgis/pipeline.py → codegraph_brain-0.30.0/src/cgis/pipeline/__init__.py +126 -16
  89. {codegraph_brain-0.28.0/src/cgis/resolver → codegraph_brain-0.30.0/src/cgis/pipeline}/uplift.py +2 -1
  90. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/query/analysis/suggest_service.py +2 -0
  91. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/query/context/audit.py +18 -4
  92. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/query/context/orphans.py +2 -0
  93. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/query/engine.py +144 -18
  94. codegraph_brain-0.30.0/src/cgis/query/fqn.py +183 -0
  95. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/query/render/mermaid.py +11 -6
  96. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/query/render/metrics.py +3 -2
  97. codegraph_brain-0.30.0/src/cgis/query/render/text.py +127 -0
  98. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/resolver/engine.py +33 -8
  99. codegraph_brain-0.30.0/src/cgis/resolver/indices.py +474 -0
  100. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/resolver/symbols.py +163 -18
  101. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/storage/sqlite_store.py +136 -2
  102. codegraph_brain-0.30.0/tests/fixtures/graph_identity/corpus/py/lib/legacy/tool.py +5 -0
  103. codegraph_brain-0.30.0/tests/fixtures/graph_identity/corpus/py/pyproject.toml +3 -0
  104. codegraph_brain-0.30.0/tests/fixtures/graph_identity/corpus/py/src/alembic/env.py +2 -0
  105. codegraph_brain-0.30.0/tests/fixtures/graph_identity/corpus/py/src/shop/__init__.py +1 -0
  106. codegraph_brain-0.30.0/tests/fixtures/graph_identity/corpus/py/src/shop/cli.py +5 -0
  107. codegraph_brain-0.30.0/tests/fixtures/graph_identity/corpus/py/src/shop/deps.py +12 -0
  108. codegraph_brain-0.30.0/tests/fixtures/graph_identity/corpus/py/src/shop/repo.py +11 -0
  109. codegraph_brain-0.30.0/tests/fixtures/graph_identity/corpus/py/src/shop/service.py +16 -0
  110. codegraph_brain-0.30.0/tests/fixtures/graph_identity/corpus/py/tests/test_service.py +5 -0
  111. codegraph_brain-0.30.0/tests/fixtures/graph_identity/corpus/ts/apps/web/package.json +1 -0
  112. codegraph_brain-0.30.0/tests/fixtures/graph_identity/corpus/ts/apps/web/src/main.ts +16 -0
  113. codegraph_brain-0.30.0/tests/fixtures/graph_identity/corpus/ts/apps/web/src/types.d.ts +3 -0
  114. codegraph_brain-0.30.0/tests/fixtures/graph_identity/corpus/ts/apps/web/src/util.ts +3 -0
  115. codegraph_brain-0.30.0/tests/fixtures/graph_identity/corpus/ts/package.json +1 -0
  116. codegraph_brain-0.30.0/tests/fixtures/graph_identity/corpus/ts/packages/lib/index.ts +3 -0
  117. codegraph_brain-0.30.0/tests/fixtures/graph_identity/corpus/ts/packages/lib/package.json +1 -0
  118. codegraph_brain-0.30.0/tests/fixtures/graph_identity/corpus/ts/pnpm-workspace.yaml +3 -0
  119. codegraph_brain-0.30.0/tests/fixtures/graph_identity/corpus/ts/tsconfig.json +1 -0
  120. codegraph_brain-0.30.0/tests/fixtures/graph_identity/snapshot.json +3074 -0
  121. codegraph_brain-0.30.0/tests/fixtures/graph_identity_go/corpus/go.mod +7 -0
  122. codegraph_brain-0.30.0/tests/fixtures/graph_identity_go/corpus/internal/native/native.go +8 -0
  123. codegraph_brain-0.30.0/tests/fixtures/graph_identity_go/corpus/internal/server/server.go +19 -0
  124. codegraph_brain-0.30.0/tests/fixtures/graph_identity_go/corpus/internal/server/server_test.go +9 -0
  125. codegraph_brain-0.30.0/tests/fixtures/graph_identity_go/corpus/internal/server/types.go +19 -0
  126. codegraph_brain-0.30.0/tests/fixtures/graph_identity_go/corpus/internal/server/validate.go +5 -0
  127. codegraph_brain-0.30.0/tests/fixtures/graph_identity_go/corpus/internal/store/store.go +26 -0
  128. codegraph_brain-0.30.0/tests/fixtures/graph_identity_go/corpus/main.go +17 -0
  129. codegraph_brain-0.30.0/tests/fixtures/graph_identity_go/corpus/money/money.go +8 -0
  130. codegraph_brain-0.30.0/tests/fixtures/graph_identity_go/snapshot.json +1361 -0
  131. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/self_parsing/conftest.py +2 -2
  132. codegraph_brain-0.30.0/tests/self_parsing/forbidden_edges_allowlist.json +16 -0
  133. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/self_parsing/test_annotation_calibration.py +24 -3
  134. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/self_parsing/test_architecture.py +146 -7
  135. codegraph_brain-0.30.0/tests/self_parsing/test_domains_ontology.py +43 -0
  136. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/self_parsing/test_drift.py +52 -26
  137. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/self_parsing/test_init_ontology_roundtrip.py +3 -3
  138. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/self_parsing/test_receiver_resolution.py +2 -2
  139. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/self_parsing/test_self_parse.py +4 -4
  140. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/self_parsing/test_self_parse_ts.py +2 -2
  141. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/agent_ab_stubs.py +4 -1
  142. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/conftest.py +6 -0
  143. codegraph_brain-0.30.0/tests/unit/review_path_inventory.txt +69 -0
  144. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_agent_ab_guard.py +22 -0
  145. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_agent_ab_script.py +155 -2
  146. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_agent_ab_task.py +10 -2
  147. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_agent_ab_transcript.py +12 -0
  148. codegraph_brain-0.30.0/tests/unit/test_annotated_alias_receiver.py +224 -0
  149. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_annotation_edges.py +1 -1
  150. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_audit.py +1 -1
  151. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_class_cohesion.py +1 -1
  152. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_cli.py +1 -1
  153. codegraph_brain-0.30.0/tests/unit/test_configs_above_root.py +261 -0
  154. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_context_service.py +1 -1
  155. codegraph_brain-0.30.0/tests/unit/test_coverage_claims.py +60 -0
  156. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_di_acceptance.py +1 -1
  157. codegraph_brain-0.30.0/tests/unit/test_dispatch_edges.py +223 -0
  158. codegraph_brain-0.30.0/tests/unit/test_extraction_fingerprint.py +212 -0
  159. codegraph_brain-0.30.0/tests/unit/test_find_symbol_path_prefix.py +141 -0
  160. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_fingerprint.py +1 -1
  161. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_fqn.py +66 -0
  162. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_freshness.py +1 -1
  163. codegraph_brain-0.30.0/tests/unit/test_go_extractor.py +461 -0
  164. codegraph_brain-0.30.0/tests/unit/test_go_graph_identity.py +145 -0
  165. codegraph_brain-0.30.0/tests/unit/test_go_incremental.py +95 -0
  166. codegraph_brain-0.30.0/tests/unit/test_go_naming.py +44 -0
  167. codegraph_brain-0.30.0/tests/unit/test_go_project.py +103 -0
  168. codegraph_brain-0.30.0/tests/unit/test_go_resolution.py +457 -0
  169. codegraph_brain-0.30.0/tests/unit/test_go_surfaces.py +91 -0
  170. codegraph_brain-0.30.0/tests/unit/test_graph_identity.py +93 -0
  171. codegraph_brain-0.30.0/tests/unit/test_graph_identity_dump.py +141 -0
  172. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_guardian_collector.py +2 -2
  173. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_guardian_martian.py +3 -3
  174. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_guardian_martian_script.py +2 -2
  175. codegraph_brain-0.30.0/tests/unit/test_impact_agent_sized.py +195 -0
  176. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_import_acceptance.py +1 -1
  177. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_inject_architecture_graph.py +2 -2
  178. codegraph_brain-0.30.0/tests/unit/test_languages.py +397 -0
  179. codegraph_brain-0.30.0/tests/unit/test_mcp_server_instructions.py +177 -0
  180. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_mermaid.py +22 -0
  181. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_metrics_resolution.py +1 -1
  182. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_name_load_positions.py +1 -1
  183. codegraph_brain-0.30.0/tests/unit/test_npm_dependencies.py +321 -0
  184. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_patterns_yaml.py +34 -9
  185. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_pipeline.py +21 -1
  186. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_pipeline_incremental_symbols.py +1 -1
  187. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_pipeline_ts_workspaces.py +1 -1
  188. codegraph_brain-0.30.0/tests/unit/test_project_facts.py +236 -0
  189. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_python_annotations.py +2 -2
  190. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_python_dependencies.py +2 -2
  191. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_python_extractor.py +2 -2
  192. codegraph_brain-0.30.0/tests/unit/test_python_index.py +100 -0
  193. codegraph_brain-0.30.0/tests/unit/test_python_routes.py +230 -0
  194. codegraph_brain-0.30.0/tests/unit/test_resolution_rules.py +124 -0
  195. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_resolver.py +1 -1
  196. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_resolver_indices.py +40 -4
  197. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_resolver_js_builtins.py +17 -7
  198. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_resolver_language_scope.py +4 -4
  199. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_resolver_phantom_internal.py +1 -1
  200. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_resolver_symbols.py +39 -0
  201. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_resolver_ts_declarations.py +1 -1
  202. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_review_fingerprint_closure.py +1 -1
  203. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_self_types.py +1 -1
  204. codegraph_brain-0.30.0/tests/unit/test_text_format.py +256 -0
  205. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_tsconfig_paths.py +2 -2
  206. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_type_checking_imports.py +1 -1
  207. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_typescript_extractor.py +2 -1
  208. codegraph_brain-0.30.0/tests/unit/test_typescript_index.py +82 -0
  209. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_uplift.py +2 -2
  210. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/uv.lock +22 -4
  211. codegraph_brain-0.28.0/.github/test-count-baseline +0 -1
  212. codegraph_brain-0.28.0/.release-please-manifest.json +0 -3
  213. codegraph_brain-0.28.0/src/cgis/extractors/base.py +0 -58
  214. codegraph_brain-0.28.0/src/cgis/extractors/registry.py +0 -93
  215. codegraph_brain-0.28.0/src/cgis/import_names.py +0 -84
  216. codegraph_brain-0.28.0/src/cgis/query/fqn.py +0 -82
  217. codegraph_brain-0.28.0/src/cgis/resolver/indices.py +0 -763
  218. codegraph_brain-0.28.0/src/cgis/workspaces.py +0 -104
  219. codegraph_brain-0.28.0/tests/unit/.gitkeep +0 -0
  220. codegraph_brain-0.28.0/tests/unit/review_path_inventory.txt +0 -43
  221. codegraph_brain-0.28.0/tests/unit/test_extractor_registry.py +0 -184
  222. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/.claude-plugin/marketplace.json +0 -0
  223. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/.gitattributes +0 -0
  224. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/.github/workflows/autodoc.yml +0 -0
  225. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/.github/workflows/guardian.yml +0 -0
  226. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/.github/workflows/mcp-registry.yml +0 -0
  227. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/.github/workflows/pr-title.yml +0 -0
  228. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/.github/workflows/release-please.yml +0 -0
  229. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/.github/workflows/ui.yml +0 -0
  230. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/.python-version +0 -0
  231. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/CONTRIBUTING.md +0 -0
  232. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/LICENSE +0 -0
  233. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/Makefile +0 -0
  234. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/PRIVACY.md +0 -0
  235. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/benchmarks/agent_ab/.gitignore +0 -0
  236. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/benchmarks/agent_ab/tasks/cgis-control-sqlite-pragmas.yaml +0 -0
  237. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/benchmarks/agent_ab/tasks/cgis-flow-ingest-to-sqlite.yaml +0 -0
  238. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/benchmarks/agent_ab/tasks/cgis-impact-drift-same-name.yaml +0 -0
  239. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/benchmarks/agent_ab/tasks/cgis-impact-language-for.yaml +0 -0
  240. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/benchmarks/agent_ab/tasks/cgis-impact-transitive-tsconfig.yaml +0 -0
  241. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/benchmarks/agent_ab/tasks/cgis-orientation-call-resolution.yaml +0 -0
  242. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/benchmarks/agent_ab/tasks/owner-impact-credit-wallet.yaml +0 -0
  243. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/benchmarks/agent_ab/tasks/owner-impact-occupied-window-same-name.yaml +0 -0
  244. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/benchmarks/guardian/CURATION.md +0 -0
  245. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/benchmarks/guardian/calibration.jsonl +0 -0
  246. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/benchmarks/guardian/experiments/246-cross-vendor/README.md +0 -0
  247. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/benchmarks/guardian/experiments/246-cross-vendor/free-nemotron-quota-cutoff.jsonl +0 -0
  248. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/benchmarks/guardian/experiments/401-evidence/README.md +0 -0
  249. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/benchmarks/guardian/experiments/401-evidence/pr-399-control-rows.jsonl +0 -0
  250. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/benchmarks/guardian/experiments/401-evidence/pr-399-recording.json +0 -0
  251. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/benchmarks/guardian/experiments/401-evidence/pr-399-treatment-rows.jsonl +0 -0
  252. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/benchmarks/guardian/experiments/407-no-checker-appeal/README.md +0 -0
  253. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/benchmarks/guardian/experiments/407-no-checker-appeal/pr-399-control-directive-rows.jsonl +0 -0
  254. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/benchmarks/guardian/experiments/407-no-checker-appeal/pr-399-control-prohibition-rows.jsonl +0 -0
  255. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/benchmarks/guardian/pr-122.yaml +0 -0
  256. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/benchmarks/guardian/pr-140.yaml +0 -0
  257. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/benchmarks/guardian/pr-141.yaml +0 -0
  258. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/benchmarks/guardian/pr-142.yaml +0 -0
  259. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/benchmarks/guardian/pr-143.yaml +0 -0
  260. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/benchmarks/guardian/pr-144.yaml +0 -0
  261. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/benchmarks/guardian/pr-278.yaml +0 -0
  262. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/benchmarks/guardian/pr-313.yaml +0 -0
  263. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/benchmarks/guardian/results.jsonl +0 -0
  264. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/benchmarks/martian/README.md +0 -0
  265. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/benchmarks/martian/cal_dot_com.json +0 -0
  266. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/benchmarks/martian/discourse.json +0 -0
  267. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/benchmarks/martian/grafana.json +0 -0
  268. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/benchmarks/martian/keycloak.json +0 -0
  269. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/benchmarks/martian/sentry.json +0 -0
  270. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/benchmarks/martian-judged.jsonl +0 -0
  271. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/benchmarks/martian-p3-judged-run1.jsonl +0 -0
  272. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/benchmarks/martian-p3-judged-run1.jsonl.corrupted-backup +0 -0
  273. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/benchmarks/martian-p3-run1.jsonl +0 -0
  274. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/benchmarks/martian-p3-run2.jsonl +0 -0
  275. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/benchmarks/martian-p3-run3.jsonl +0 -0
  276. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/benchmarks/martian-plan.json +0 -0
  277. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/benchmarks/martian-repeat-judged.jsonl +0 -0
  278. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/benchmarks/martian-repeat-reviews.jsonl +0 -0
  279. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/benchmarks/martian-reviews.jsonl +0 -0
  280. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/data/.gitkeep +0 -0
  281. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/CASE_STUDY.md +0 -0
  282. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/GUARDIAN_LOCAL_BENCH.md +0 -0
  283. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/GUARDIAN_REMOTE_OLLAMA.md +0 -0
  284. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/architecture/PATTERNS_AND_TRIADS.md +0 -0
  285. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/architecture/SELF_PORTRAIT.md +0 -0
  286. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/architecture/health_badge.json +0 -0
  287. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/assets/.gitignore +0 -0
  288. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/assets/cgis-app-avatar.png +0 -0
  289. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/assets/cgis-app-avatar.svg +0 -0
  290. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/assets/generate_avatar.py +0 -0
  291. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/examples/.gitkeep +0 -0
  292. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/how-to/CLI_USAGE.md +0 -0
  293. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/lab-notes/2026-06-11-chunked-review-negative-result.md +0 -0
  294. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/ontology/.gitkeep +0 -0
  295. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/plans/2026-09-09-graph-freshness.md +0 -0
  296. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/specs/2026-06-09-domain-pattern-fingerprint-design.md +0 -0
  297. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/specs/2026-06-09-pattern-alphabet-motif-basis-design.md +0 -0
  298. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/specs/2026-06-10-guardian-sprint-design.md +0 -0
  299. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/specs/2026-06-11-fastapi-di-edges-design.md +0 -0
  300. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/specs/2026-06-11-guardian-chunked-review-design.md +0 -0
  301. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/specs/2026-06-11-guardian-chunker-design.md +0 -0
  302. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/specs/2026-06-11-mcp-drift-validate-fqn-design.md +0 -0
  303. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/specs/2026-06-11-resolver-split-design.md +0 -0
  304. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/specs/2026-06-11-symbol-import-edges-design.md +0 -0
  305. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/specs/2026-06-12-drift-empty-domains-design.md +0 -0
  306. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/specs/2026-06-12-gate-semantics-design.md +0 -0
  307. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/specs/2026-06-12-init-ontology-design.md +0 -0
  308. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/specs/2026-06-12-release-please-ci-design.md +0 -0
  309. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/specs/2026-06-13-suggest-packages-design.md +0 -0
  310. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/specs/2026-06-13-tangle-anti-pattern-design.md +0 -0
  311. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/specs/2026-07-29-guardian-skeptic-scoring-design.md +0 -0
  312. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/specs/2026-07-30-cgis-fractal-design.md +0 -0
  313. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/specs/2026-07-30-cgis-fractal-plan.md +0 -0
  314. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/specs/2026-07-30-chunk-source-filter-design.md +0 -0
  315. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/specs/2026-07-30-chunk-source-filter-plan.md +0 -0
  316. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/specs/2026-07-30-genai-client-close-design.md +0 -0
  317. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/specs/2026-07-30-genai-client-close-plan.md +0 -0
  318. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/specs/2026-07-30-guardian-precision-bench-design.md +0 -0
  319. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/specs/2026-07-30-guardian-precision-bench-plan.md +0 -0
  320. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/specs/2026-07-30-guardian-timeout-retry-design.md +0 -0
  321. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/specs/2026-07-30-guardian-timeout-retry-plan.md +0 -0
  322. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/specs/2026-07-31-finder-bug-class-taxonomy.md +0 -0
  323. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/specs/2026-08-01-aura-autoevolution-poc.md +0 -0
  324. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/specs/2026-08-11-guardian-code-review-bench.md +0 -0
  325. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/specs/2026-08-14-review-fingerprint-design.md +0 -0
  326. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/specs/2026-09-05-annotation-graph-design.md +0 -0
  327. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/specs/2026-09-09-graph-freshness-design.md +0 -0
  328. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/specs/BLUEPRINT.md +0 -0
  329. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/specs/PRD.md +0 -0
  330. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/specs/TDD.md +0 -0
  331. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/specs/plans/2026-06-09-fingerprint-drift.md +0 -0
  332. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/specs/plans/2026-06-10-guardian-context-skeptic-inline.md +0 -0
  333. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/specs/plans/2026-06-10-guardian-structured-findings-bench.md +0 -0
  334. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/specs/plans/2026-06-10-motif-basis-part-b.md +0 -0
  335. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/specs/plans/2026-06-10-unified-pattern-alphabet.md +0 -0
  336. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/specs/plans/2026-06-11-fastapi-di-edges.md +0 -0
  337. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/specs/plans/2026-06-11-guardian-chunked-review.md +0 -0
  338. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/specs/plans/2026-06-11-guardian-chunker.md +0 -0
  339. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/specs/plans/2026-06-11-mcp-drift-validate-fqn.md +0 -0
  340. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/specs/plans/2026-06-11-resolver-split.md +0 -0
  341. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/specs/plans/2026-06-12-drift-empty-domains.md +0 -0
  342. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/specs/plans/2026-06-12-gate-semantics.md +0 -0
  343. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/specs/plans/2026-06-12-init-ontology.md +0 -0
  344. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/specs/plans/2026-06-12-release-please-ci.md +0 -0
  345. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/specs/plans/2026-06-12-symbol-import-edges.md +0 -0
  346. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/specs/plans/2026-06-13-suggest-packages.md +0 -0
  347. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/specs/plans/2026-07-29-guardian-skeptic-scoring.md +0 -0
  348. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/specs/plans/2026-08-14-review-fingerprint.md +0 -0
  349. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/specs/plans/2026-09-05-annotation-graph-pr1.md +0 -0
  350. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/docs/specs/plans/2026-09-05-annotation-graph-pr2.md +0 -0
  351. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/glama.json +0 -0
  352. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/main.py +0 -0
  353. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/plugin/.claude-plugin/plugin.json +0 -0
  354. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/plugin/.mcp.json +0 -0
  355. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/release-please-config.json +0 -0
  356. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/scripts/backfill_calibration_fingerprint.py +0 -0
  357. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/scripts/backfill_review_fingerprint.py +0 -0
  358. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/scripts/check_pytest_raises.py +0 -0
  359. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/scripts/check_test_count.py +0 -0
  360. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/scripts/colab_bench.sh +0 -0
  361. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/scripts/gen_ideal_graph.py +0 -0
  362. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/scripts/generate_schema_docs.py +0 -0
  363. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/scripts/guardian_bench.py +0 -0
  364. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/scripts/guardian_calibrate.py +0 -0
  365. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/scripts/guardian_replay_skeptic.py +0 -0
  366. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/scripts/guardian_review.py +0 -0
  367. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/scripts/inject_architecture_graph.py +0 -0
  368. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/scripts/mcp_registry_gate.sh +0 -0
  369. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/scripts/ollama_visitor.sh +0 -0
  370. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/scripts/probe_closure_gap.py +0 -0
  371. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/scripts/probe_tier_ladder.py +0 -0
  372. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/scripts/recordings_from_corpus.py +0 -0
  373. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/scripts/skeptic_arms.py +0 -0
  374. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/__init__.py +0 -0
  375. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/__main__.py +0 -0
  376. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/api/.gitkeep +0 -0
  377. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/api/__init__.py +0 -0
  378. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/bench/__init__.py +0 -0
  379. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/bench/agent_task.py +0 -0
  380. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/core/.gitkeep +0 -0
  381. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/core/coverage.py +0 -0
  382. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/core/freshness.py +0 -0
  383. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/core/generated.py +0 -0
  384. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/core/paths.py +0 -0
  385. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/guardian/__init__.py +0 -0
  386. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/guardian/axes.py +0 -0
  387. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/guardian/bench.py +0 -0
  388. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/guardian/calibrate.py +0 -0
  389. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/guardian/chunked.py +0 -0
  390. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/guardian/chunker.py +0 -0
  391. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/guardian/core.py +0 -0
  392. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/guardian/diff_index.py +0 -0
  393. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/guardian/evidence.py +0 -0
  394. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/guardian/findings.py +0 -0
  395. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/guardian/github_poster.py +0 -0
  396. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/guardian/metrics.py +0 -0
  397. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/guardian/prompts.py +0 -0
  398. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/guardian/providers/__init__.py +0 -0
  399. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/guardian/providers/base.py +0 -0
  400. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/guardian/providers/gemini.py +0 -0
  401. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/guardian/providers/mistral.py +0 -0
  402. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/guardian/providers/ollama.py +0 -0
  403. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/guardian/providers/openrouter.py +0 -0
  404. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/guardian/recording.py +0 -0
  405. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/guardian/render.py +0 -0
  406. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/guardian/review_fingerprint.py +0 -0
  407. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/guardian/runner.py +0 -0
  408. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/guardian/skeptic.py +0 -0
  409. /codegraph_brain-0.28.0/src/cgis/extractors/_python_ast.py → /codegraph_brain-0.30.0/src/cgis/languages/python/_syntax.py +0 -0
  410. /codegraph_brain-0.28.0/src/cgis/python_dependencies.py → /codegraph_brain-0.30.0/src/cgis/languages/python/dependencies.py +0 -0
  411. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/py.typed +0 -0
  412. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/query/analysis/__init__.py +0 -0
  413. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/query/analysis/analyzer.py +0 -0
  414. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/query/analysis/anomaly.py +0 -0
  415. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/query/analysis/cohesion.py +0 -0
  416. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/query/analysis/health.py +0 -0
  417. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/query/analysis/overview.py +0 -0
  418. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/query/context/__init__.py +0 -0
  419. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/query/context/context_service.py +0 -0
  420. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/query/context/prompt.py +0 -0
  421. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/query/context/snippet.py +0 -0
  422. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/query/drift/__init__.py +0 -0
  423. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/query/drift/_scc.py +0 -0
  424. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/query/drift/catalog.py +0 -0
  425. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/query/drift/drift.py +0 -0
  426. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/query/drift/drift_service.py +0 -0
  427. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/query/drift/fingerprint.py +0 -0
  428. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/query/drift/fractal.py +0 -0
  429. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/query/drift/ontology_init.py +0 -0
  430. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/query/drift/quotient.py +0 -0
  431. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/query/drift/scoring.py +0 -0
  432. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/query/drift/triads.py +0 -0
  433. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/query/render/__init__.py +0 -0
  434. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/query/render/graph_json.py +0 -0
  435. {codegraph_brain-0.28.0/src/cgis/extractors → codegraph_brain-0.30.0/src/cgis/resolver}/.gitkeep +0 -0
  436. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/src/cgis/resolver/__init__.py +0 -0
  437. {codegraph_brain-0.28.0/src/cgis/resolver → codegraph_brain-0.30.0/src/cgis/storage}/.gitkeep +0 -0
  438. {codegraph_brain-0.28.0/src/cgis/storage → codegraph_brain-0.30.0/tests/integration}/.gitkeep +0 -0
  439. {codegraph_brain-0.28.0/tests/integration → codegraph_brain-0.30.0/tests/self_parsing}/.gitkeep +0 -0
  440. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/self_parsing/__init__.py +0 -0
  441. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/self_parsing/test_fractal.py +0 -0
  442. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/self_parsing/test_overview.py +0 -0
  443. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/self_parsing/test_suggest.py +0 -0
  444. {codegraph_brain-0.28.0/tests/self_parsing → codegraph_brain-0.30.0/tests/unit}/.gitkeep +0 -0
  445. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/guardian_stubs.py +0 -0
  446. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test___main__.py +0 -0
  447. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_analyzer.py +0 -0
  448. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_auto_refresh.py +0 -0
  449. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_backfill_calibration_fingerprint.py +0 -0
  450. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_backfill_review_fingerprint.py +0 -0
  451. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_check_pytest_raises.py +0 -0
  452. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_check_test_count.py +0 -0
  453. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_cohesion.py +0 -0
  454. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_drift.py +0 -0
  455. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_drift_service.py +0 -0
  456. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_features_source.py +0 -0
  457. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_fractal.py +0 -0
  458. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_gen_ideal_graph.py +0 -0
  459. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_generate_mcp_ref.py +0 -0
  460. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_generated.py +0 -0
  461. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_graph_json.py +0 -0
  462. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_guardian_axes.py +0 -0
  463. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_guardian_bench.py +0 -0
  464. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_guardian_bench_script.py +0 -0
  465. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_guardian_calibrate.py +0 -0
  466. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_guardian_calibrate_script.py +0 -0
  467. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_guardian_chunked.py +0 -0
  468. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_guardian_chunker.py +0 -0
  469. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_guardian_core.py +0 -0
  470. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_guardian_diff_index.py +0 -0
  471. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_guardian_evidence.py +0 -0
  472. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_guardian_findings.py +0 -0
  473. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_guardian_martian_union.py +0 -0
  474. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_guardian_metrics.py +0 -0
  475. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_guardian_mistral_sampling.py +0 -0
  476. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_guardian_ollama_sampling.py +0 -0
  477. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_guardian_ollama_truncation.py +0 -0
  478. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_guardian_openrouter.py +0 -0
  479. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_guardian_poster.py +0 -0
  480. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_guardian_providers.py +0 -0
  481. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_guardian_providers_name.py +0 -0
  482. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_guardian_recording.py +0 -0
  483. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_guardian_render.py +0 -0
  484. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_guardian_replay_skeptic.py +0 -0
  485. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_guardian_review_script.py +0 -0
  486. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_guardian_runner.py +0 -0
  487. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_guardian_salvage.py +0 -0
  488. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_guardian_skeptic.py +0 -0
  489. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_health_scorer.py +0 -0
  490. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_mcp_server.py +0 -0
  491. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_mcp_tool_schemas.py +0 -0
  492. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_metrics.py +0 -0
  493. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_metrics_file_coupling.py +0 -0
  494. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_models.py +0 -0
  495. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_ontology_compliance.py +0 -0
  496. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_ontology_init.py +0 -0
  497. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_orphans.py +0 -0
  498. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_overview.py +0 -0
  499. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_overview_tools.py +0 -0
  500. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_package_view.py +0 -0
  501. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_paths.py +0 -0
  502. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_prompt.py +0 -0
  503. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_query_coverage.py +0 -0
  504. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_quotient.py +0 -0
  505. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_recordings_from_corpus.py +0 -0
  506. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_resolver_import_layout.py +0 -0
  507. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_resolver_ts_workspaces.py +0 -0
  508. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_review_fingerprint_contract.py +0 -0
  509. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_review_fingerprint_digest.py +0 -0
  510. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_review_fingerprint_record.py +0 -0
  511. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_skeptic_arms.py +0 -0
  512. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_snippet.py +0 -0
  513. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_sqlite_store.py +0 -0
  514. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_suggest_service.py +0 -0
  515. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_temperature_source.py +0 -0
  516. {codegraph_brain-0.28.0 → codegraph_brain-0.30.0}/tests/unit/test_triads.py +0 -0
@@ -162,6 +162,20 @@ jobs:
162
162
  # this exemption hides it — that is the cost, and it is the reason the
163
163
  # rule stays on for src/.
164
164
  #
165
+ # pythonsecurity:S8706 (connection-string injection) is the same
166
+ # finding at sqlite3.connect: graph_identity.py opens a database named
167
+ # on its own command line. `dump()` requires an existing .db/.sqlite/
168
+ # .sqlite3 regular file before connecting, and passes no `uri=True`, so
169
+ # the argument is a file name and never a connection string. Exempted
170
+ # for scripts/ on the S2083 reasoning above — the engine does not model
171
+ # the check — and kept on for src/.
172
+ #
173
+ # tests/fixtures/ is excluded from test analysis
174
+ # (`sonar.test.exclusions`; it sits under `sonar.tests`, so
175
+ # `sonar.exclusions` would not reach it): it holds input corpora, not
176
+ # code. Its package.json files exist to be parsed by cgis, and a lock
177
+ # file next to them (text:S8564) would be a fixture nothing reads.
178
+ #
165
179
  # `sonar.newCode.referenceBranch` overrides the server-side new-code
166
180
  # definition for this analysis. The instance default is
167
181
  # `previous_version` (confirmed: sonar.leak.period=previous_version,
@@ -218,13 +232,16 @@ jobs:
218
232
  -Dsonar.newCode.referenceBranch=main
219
233
  -Dsonar.sources=src,scripts,.github
220
234
  -Dsonar.tests=tests
235
+ -Dsonar.test.exclusions=tests/fixtures/**
221
236
  -Dsonar.python.version=3.12
222
237
  -Dsonar.python.coverage.reportPaths=coverage.xml
223
- -Dsonar.issue.ignore.multicriteria=e1,e2,e3,e4
238
+ -Dsonar.issue.ignore.multicriteria=e1,e2,e3,e4,e5
224
239
  -Dsonar.issue.ignore.multicriteria.e1.ruleKey=pythonsecurity:S8707
225
240
  -Dsonar.issue.ignore.multicriteria.e1.resourceKey=scripts/**/*.py
226
241
  -Dsonar.issue.ignore.multicriteria.e4.ruleKey=pythonsecurity:S2083
227
242
  -Dsonar.issue.ignore.multicriteria.e4.resourceKey=scripts/**/*.py
243
+ -Dsonar.issue.ignore.multicriteria.e5.ruleKey=pythonsecurity:S8706
244
+ -Dsonar.issue.ignore.multicriteria.e5.resourceKey=scripts/**/*.py
228
245
  -Dsonar.issue.ignore.multicriteria.e2.ruleKey=githubactions:S8541
229
246
  -Dsonar.issue.ignore.multicriteria.e2.resourceKey=.github/workflows/*.yml
230
247
  -Dsonar.issue.ignore.multicriteria.e3.ruleKey=githubactions:S8544
@@ -15,6 +15,8 @@ downloads/
15
15
  eggs/
16
16
  .eggs/
17
17
  lib/
18
+ # The graph-identity corpus has lib/ directories that are inputs, not build output.
19
+ !tests/fixtures/graph_identity/corpus/**/lib/
18
20
  lib64/
19
21
  parts/
20
22
  sdist/
@@ -40,6 +40,7 @@ repos:
40
40
  - tree-sitter>=0.25.2
41
41
  - tree-sitter-python>=0.25.0
42
42
  - tree-sitter-typescript>=0.23.2
43
+ - tree-sitter-go>=0.25.0
43
44
  - pytest>=9.0.3
44
45
  - "mcp[cli]>=2" # must match the pyproject bound
45
46
  - duckdb>=1.1.0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.30.0"
3
+ }
@@ -1,5 +1,63 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.30.0](https://github.com/zaebee/codegraph-brain/compare/codegraph-brain-v0.29.0...codegraph-brain-v0.30.0) (2026-10-15)
4
+
5
+
6
+ ### Features
7
+
8
+ * **languages:** Go field and call-result types resolve receiver calls ([#608](https://github.com/zaebee/codegraph-brain/issues/608)) ([#614](https://github.com/zaebee/codegraph-brain/issues/614)) ([96ec5f3](https://github.com/zaebee/codegraph-brain/commit/96ec5f380d52ba1560c63b8b84af673627bc88d0))
9
+ * **languages:** step 7b — the Go pilot ([#607](https://github.com/zaebee/codegraph-brain/issues/607)) ([4a62703](https://github.com/zaebee/codegraph-brain/commit/4a62703f41a4dfb74d1f96bee132b3f78f84c895))
10
+ * **pipeline:** a graph built by other extraction code is rebuilt in full ([#617](https://github.com/zaebee/codegraph-brain/issues/617)) ([dc33153](https://github.com/zaebee/codegraph-brain/commit/dc331531556cc2dc49c8adfacbec079584953eb8))
11
+ * **python:** FastAPI handlers play the ROUTE_HANDLER role ([#566](https://github.com/zaebee/codegraph-brain/issues/566)) ([#616](https://github.com/zaebee/codegraph-brain/issues/616)) ([9098ccd](https://github.com/zaebee/codegraph-brain/commit/9098ccd87ef08fbb3139243fda426b62e8d1b32b))
12
+
13
+
14
+ ### Bug Fixes
15
+
16
+ * **docs:** coverage claims name Go — the MCP instructions are built from the registry ([#615](https://github.com/zaebee/codegraph-brain/issues/615)) ([8ea6362](https://github.com/zaebee/codegraph-brain/commit/8ea636239122b24c4a42b2a65517ebb12dad1b03))
17
+
18
+
19
+ ### Documentation
20
+
21
+ * auto-sync architecture graph and MCP reference ([#598](https://github.com/zaebee/codegraph-brain/issues/598)) ([3feb1ac](https://github.com/zaebee/codegraph-brain/commit/3feb1ac40b1896acb0e57109c9bd1f2bf941d7bc))
22
+ * auto-sync architecture graph and MCP reference ([#620](https://github.com/zaebee/codegraph-brain/issues/620)) ([3f36e15](https://github.com/zaebee/codegraph-brain/commit/3f36e15c30dca7280b57bebd70a8793764cd872e))
23
+ * **spec:** language packs and a two-plane topology ([#593](https://github.com/zaebee/codegraph-brain/issues/593)) ([d9e7d85](https://github.com/zaebee/codegraph-brain/commit/d9e7d852b17d4cab4a2a4a0f2519f11f8de9236e))
24
+
25
+ ## [0.29.0](https://github.com/zaebee/codegraph-brain/compare/codegraph-brain-v0.28.0...codegraph-brain-v0.29.0) (2026-10-14)
26
+
27
+
28
+ ### Features
29
+
30
+ * **bench:** cgis-narrow arm — the cgis arm with three tools listed ([#586](https://github.com/zaebee/codegraph-brain/issues/586)) ([5a5c836](https://github.com/zaebee/codegraph-brain/commit/5a5c836e2fda1f41e6420e0d1160a56a0859ef94))
31
+ * **mcp:** agent-sized cgis_analyze_impact — no test callers, files as dead ends, node budget ([#563](https://github.com/zaebee/codegraph-brain/issues/563)) ([d173d57](https://github.com/zaebee/codegraph-brain/commit/d173d5791e30983b58e7cbe7fb91cac8c7059154))
32
+ * **mcp:** output_format="text" for traversals; trace_flow gets impact's node budget and test screen ([#581](https://github.com/zaebee/codegraph-brain/issues/581)) ([a1dd2b8](https://github.com/zaebee/codegraph-brain/commit/a1dd2b871d34c22e29f25103b9ee349a004ea28a))
33
+ * **mcp:** server instructions in initialize, CGIS_MCP_TOOLS allowlist ([#565](https://github.com/zaebee/codegraph-brain/issues/565)) ([3c37874](https://github.com/zaebee/codegraph-brain/commit/3c37874f78e4a3d439be153641afe1fc19a32f03))
34
+ * **query:** resolve an FQN given with the directories above the graph ([#571](https://github.com/zaebee/codegraph-brain/issues/571)) ([ea43ba9](https://github.com/zaebee/codegraph-brain/commit/ea43ba9f5451e0ee55575570eb8a5341eb906115))
35
+ * **resolver:** DISPATCHES edges from a base-class method to each override ([#575](https://github.com/zaebee/codegraph-brain/issues/575)) ([827143e](https://github.com/zaebee/codegraph-brain/commit/827143ee2a13866602daaea84f1142106c69d49d))
36
+ * **resolver:** type a parameter annotated with an Annotated[T, Depends(...)] alias as T ([#572](https://github.com/zaebee/codegraph-brain/issues/572)) ([fc33b20](https://github.com/zaebee/codegraph-brain/commit/fc33b202b607aecda9d3b317edc1d16f2ba350c6))
37
+ * **workspaces:** read pnpm-workspace.yaml above the ingest root ([#591](https://github.com/zaebee/codegraph-brain/issues/591)) ([b0d67f8](https://github.com/zaebee/codegraph-brain/commit/b0d67f8124da3c414b852f045f6127ab2eec5c3e))
38
+
39
+
40
+ ### Bug Fixes
41
+
42
+ * **bench:** agent A/B runner survives a failed session and continues run numbers ([#578](https://github.com/zaebee/codegraph-brain/issues/578)) ([bc303eb](https://github.com/zaebee/codegraph-brain/commit/bc303eb82e3ef25c01093452c2d68e8c3a53d1d9))
43
+ * **bench:** guard — no false refusal on a grep for an import, no bypass through env/newline/prefix ([#590](https://github.com/zaebee/codegraph-brain/issues/590)) ([73ee4e2](https://github.com/zaebee/codegraph-brain/commit/73ee4e260cf3a65a31630f4cc6a46b618872ce7f))
44
+ * **ingest:** read the tsconfig.json and package.json above a sub-directory ingest root ([#560](https://github.com/zaebee/codegraph-brain/issues/560)) ([9722f8c](https://github.com/zaebee/codegraph-brain/commit/9722f8c18da97cba20400cbd109fd8fea684a5e3))
45
+ * **query:** one effective_prefix rule for every FQN-prefix entry point ([#585](https://github.com/zaebee/codegraph-brain/issues/585)) ([b5f10b3](https://github.com/zaebee/codegraph-brain/commit/b5f10b360ab021ba2dcd8dd9a211b222c989e183))
46
+ * **resolver:** TypeScript imports of declared npm packages are EXTERNAL ([#557](https://github.com/zaebee/codegraph-brain/issues/557)) ([73d380a](https://github.com/zaebee/codegraph-brain/commit/73d380acb915671e9597fc01eaf509ba29e78a8b))
47
+
48
+
49
+ ### Documentation
50
+
51
+ * auto-sync architecture graph and MCP reference ([#558](https://github.com/zaebee/codegraph-brain/issues/558)) ([ee275a4](https://github.com/zaebee/codegraph-brain/commit/ee275a412b9af8b2d900e16b84335a343f68a7fa))
52
+ * auto-sync architecture graph and MCP reference ([#564](https://github.com/zaebee/codegraph-brain/issues/564)) ([50637b3](https://github.com/zaebee/codegraph-brain/commit/50637b3b8d01cb4be01cbae3710f21a1cb5f1b02))
53
+ * auto-sync architecture graph and MCP reference ([#573](https://github.com/zaebee/codegraph-brain/issues/573)) ([225499d](https://github.com/zaebee/codegraph-brain/commit/225499dd1a17163160e270b9dbeb73a7ad376b7d))
54
+ * **bench:** agent A/B after [#568](https://github.com/zaebee/codegraph-brain/issues/568) and [#550](https://github.com/zaebee/codegraph-brain/issues/550) — cgis-forced at $0.184 against control $0.298 ([#574](https://github.com/zaebee/codegraph-brain/issues/574)) ([8e0ef37](https://github.com/zaebee/codegraph-brain/commit/8e0ef37b76fffc01e32338c67325535f8cb501f4))
55
+ * **bench:** agent A/B on a task no fix was tuned on (occupied_window) ([#576](https://github.com/zaebee/codegraph-brain/issues/576)) ([a6eb679](https://github.com/zaebee/codegraph-brain/commit/a6eb679b51ae7fd3f52c73eb2da005857f2e6126))
56
+ * **bench:** agent A/B on three deep-chain cgis tasks — impact pays, trace_flow's 32k answer does not ([#579](https://github.com/zaebee/codegraph-brain/issues/579)) ([eb7e951](https://github.com/zaebee/codegraph-brain/commit/eb7e9516a8e952fdbd2266c43accfee1a16109e7))
57
+ * **bench:** agent A/B results for owner-impact-credit-wallet after [#563](https://github.com/zaebee/codegraph-brain/issues/563) and [#565](https://github.com/zaebee/codegraph-brain/issues/565) ([#570](https://github.com/zaebee/codegraph-brain/issues/570)) ([ae84feb](https://github.com/zaebee/codegraph-brain/commit/ae84febcc2621a92d00233e81e994171b6b14cd8))
58
+ * **bench:** flow A/B after [#581](https://github.com/zaebee/codegraph-brain/issues/581) — text cut the answer 4x and the cost by a third; precision unchanged ([#583](https://github.com/zaebee/codegraph-brain/issues/583)) ([e36c850](https://github.com/zaebee/codegraph-brain/commit/e36c85099a85300f46a9b6fa28d375fa68f67227))
59
+ * **bench:** unprompted agents do not call cgis — a short menu changes nothing, one instruction line 2 of 6 ([#587](https://github.com/zaebee/codegraph-brain/issues/587)) ([6534f74](https://github.com/zaebee/codegraph-brain/commit/6534f74f23fcd3d1193bda2201bbf598959cac8e))
60
+
3
61
  ## [0.28.0](https://github.com/zaebee/codegraph-brain/compare/codegraph-brain-v0.27.0...codegraph-brain-v0.28.0) (2026-10-02)
4
62
 
5
63
 
@@ -45,21 +45,24 @@ make coverage-html # same, writes htmlcov/
45
45
  The pipeline runs in three phases: **Extract → Resolve → Store**.
46
46
 
47
47
  ```
48
- IngestionPipeline (pipeline.py)
49
- ├── BaseExtractor subclasses (extractors/) ← language-specific AST → Nodes+Edges
50
- │ └── PythonExtractor ← only language implemented so far
48
+ IngestionPipeline (pipeline/__init__.py)
49
+ ├── cgis.languages (registry) ← lazy: a pack is imported when its first file is met
50
+ │ ├── languages/python/ ← PythonExtractor + PACK
51
+ │ ├── languages/typescript/ ← TypeScriptExtractor (.ts/.tsx) + PACK
52
+ │ └── languages/go/ ← GoExtractor (.go) + go.mod reader + PACK (pilot)
51
53
  ├── ResolverEngine (resolver/engine.py) ← raw_call: targets → resolved FQN edges
52
- └── SQLiteStore (storage/sqlite_store.py) ← persists graph; WAL mode
54
+ ├── SQLiteStore (storage/sqlite_store.py) ← persists graph; WAL mode
55
+ └── post-write passes (pipeline/) ← refresh_dispatch, SemanticUpliftEngine (pipeline/uplift.py)
53
56
  └── QueryEngine (query/engine.py) ← BFS traversals (impact / flow)
54
57
  ```
55
58
 
56
- **Node FQN format**: `module.ClassName.method_name` — fully dot-separated, derived from the file path (e.g., `src/cgis/pipeline.py` → `src.cgis.pipeline.IngestionPipeline.run`). Use `file_path_to_module_fqn(path)` from `extractors/python_extractor.py` to convert paths. `__init__.py` strips the `/__init__` suffix.
59
+ **Node FQN format**: `module.ClassName.method_name` — fully dot-separated, derived from the file path (e.g., `src/cgis/pipeline.py` → `src.cgis.pipeline.IngestionPipeline.run`). Use `cgis.languages.scope_of(path, source_root)` to convert paths (it picks the file's own pack; the Python rule lives in `languages/python/extractor.py`). `__init__.py` strips the `/__init__` suffix.
57
60
 
58
61
  **Raw call convention**: Extractors emit edges with `target = "raw_call:<name>"`. The `ResolverEngine` then resolves these to actual FQNs or leaves them unresolved (keeps the `raw_call:` prefix in output).
59
62
 
60
63
  **`ResolverEngine` resolution order** for a call to `name`:
61
64
  1. `self.method` → look up `method` on the enclosing class via `_class_methods` index
62
- 2. Unqualified call → `_global_symbols` by name; if ambiguous, prefer same-file candidate via `_file_global_symbols`
65
+ 2. Unqualified call → `_global_symbols` by name; if ambiguous, prefer the same-scope candidate via `file_global_symbols` (a file's scope is its path, or the `metadata["scope"]` its FILE node declares — a Go package)
63
66
 
64
67
  ## Core Models (`src/cgis/core/models.py`)
65
68
 
@@ -68,12 +71,30 @@ IngestionPipeline (pipeline.py)
68
71
  - `NodeType` — structural (`FILE`, `MODULE`, `CLASS`, `FUNCTION`, `METHOD`…), runtime (`API_ENDPOINT`, `DB_TABLE`…), semantic (`DOMAIN_CONCEPT`).
69
72
  - `EdgeType` — structural (`CONTAINS`, `DECLARES`, `IMPORTS`), behavioral (`CALLS`, `REFERENCES`), semantic (`HANDLES`, `PERSISTS`, `AUTHORIZES`).
70
73
 
71
- ## Adding a New Language Extractor
72
-
73
- 1. Subclass `BaseExtractor` in `src/cgis/extractors/`.
74
- 2. Implement `parse(code: str, file_path: str) -> tuple[list[Node], list[Edge]]`.
75
- 3. Emit `CALLS` edges with `target="raw_call:<name>"` — the resolver handles the rest.
76
- 4. Register the extractor in `cli.py`'s `extractors` dict with the file extension key.
74
+ ## Adding a Language Pack
75
+
76
+ 1. Create `src/cgis/languages/<name>/` with an extractor subclassing `cgis.core.extractor.BaseExtractor`
77
+ (`parse(code, file_path) -> tuple[list[Node], list[Edge]]`; emit `CALLS` edges with
78
+ `target="raw_call:<name>"`, set `Node.language = "<name>"`).
79
+ 2. In its `__init__.py`, define `PACK`, subclassing `cgis.core.extractor.LanguagePack` (mark methods `@override`)
80
+ (`name`, `extensions`, `code_fence`, `is_test`, `scope_of`, `extractor`, `project_reader`,
81
+ `index_facts`, `classify`, `resolution`). `resolution()` returns `ResolutionRules`
82
+ (`cgis.core.resolution`): type normalizers, steps at a position (`after:import_map`), a
83
+ fallback with its confidence, `reconcile_import` — all reading the index as `ResolutionView`.
84
+ Metadata other files resolve against goes in the manifest's `cross_file_metadata`. `classify` answers for references from the pack's own files and
85
+ runs the whole chain; a source with no pack gets the generic tail in `SymbolIndex.classify_fqn`.
86
+ 3. Add one `Manifest` to `MANIFESTS` in `src/cgis/languages/__init__.py`, with a `load` function that
87
+ imports the pack statically inside it (lazy, yet visible to the review-fingerprint walk). Nothing
88
+ else names the pack: CLI, MCP server, guardian and scripts all go through the registry, and the
89
+ `surface-packs` forbidden-edge gate fails if a surface imports a pack directly.
90
+ 4. A pack never imports another pack or `cgis.storage` (`cross-pack`, `pack-isolation` gates).
91
+ 5. A pack's `__init__` imports no grammar: import the extractor inside `extractor()`. Config reading
92
+ goes in a `ProjectReader` (`cgis.core.project`) whose facts are data keyed by `ingest_state`
93
+ key — the collector (`cgis.import_names`), not the pack, writes them. A key other than the four
94
+ built-ins (`_FACT_SHAPES`) travels as `ImportNames.extra`: recorded, compared, and merged into the
95
+ `state` the pack's `index_facts` reads. Its value must read back equal from JSON (no tuples).
96
+ 6. A FILE node's id comes from `file_node_id`, its definitions' namespace from `scope_of`; they differ
97
+ only where several files share a scope (Go), which the FILE node declares as `metadata["scope"]`.
77
98
 
78
99
  ## Type Discipline
79
100
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: codegraph-brain
3
- Version: 0.28.0
3
+ Version: 0.30.0
4
4
  Summary: Semantic code graph for AI agents — deterministic FQN resolution, impact analysis and architectural drift gates, exposed over MCP.
5
5
  Project-URL: Homepage, https://github.com/zaebee/codegraph-brain
6
6
  Project-URL: Repository, https://github.com/zaebee/codegraph-brain
@@ -29,6 +29,7 @@ Requires-Dist: pydantic>=2.13.4
29
29
  Requires-Dist: pyyaml>=6.0.2
30
30
  Requires-Dist: rich>=15.0.0
31
31
  Requires-Dist: structlog>=25.5.0
32
+ Requires-Dist: tree-sitter-go>=0.25.0
32
33
  Requires-Dist: tree-sitter-python>=0.25.0
33
34
  Requires-Dist: tree-sitter-typescript>=0.23.2
34
35
  Requires-Dist: tree-sitter>=0.25.2
@@ -60,7 +61,7 @@ Description-Content-Type: text/markdown
60
61
 
61
62
  CGIS parses a repository with tree-sitter into a graph of fully qualified symbols and the calls, imports and containment between them, stores it in SQLite, and serves it to AI agents over MCP. An agent that would otherwise grep and read whole files asks the graph instead.
62
63
 
63
- - **Languages:** Python · TypeScript / TSX
64
+ - **Languages:** Python · TypeScript / TSX · Go (pilot)
64
65
  - **Runs:** locally — no account, no telemetry; the graph never leaves your disk ([the one opt-in exception](https://github.com/zaebee/codegraph-brain/blob/main/PRIVACY.md))
65
66
 
66
67
  ```console
@@ -10,7 +10,7 @@
10
10
 
11
11
  CGIS parses a repository with tree-sitter into a graph of fully qualified symbols and the calls, imports and containment between them, stores it in SQLite, and serves it to AI agents over MCP. An agent that would otherwise grep and read whole files asks the graph instead.
12
12
 
13
- - **Languages:** Python · TypeScript / TSX
13
+ - **Languages:** Python · TypeScript / TSX · Go (pilot)
14
14
  - **Runs:** locally — no account, no telemetry; the graph never leaves your disk ([the one opt-in exception](https://github.com/zaebee/codegraph-brain/blob/main/PRIVACY.md))
15
15
 
16
16
  ```console
@@ -40,9 +40,17 @@ resolver gets wrong. Each task's `notes` say how it was checked.
40
40
  |---|---|---|---|---|
41
41
  | `control` | none (`--strict-mcp-config`, empty config) | no | all deleted | no |
42
42
  | `cgis` | this checkout's `cgis-mcp` | yes (the plugin minus its `.mcp.json`) | `graph.db` built before the clock starts | no |
43
+ | `cgis-narrow` | as `cgis`, listing only `analyze_impact`, `find_symbol`, `trace_flow` (`CGIS_MCP_TOOLS`) | as `cgis` | as `cgis` | no |
43
44
  | `cgis-instructed` | as `cgis` | as `cgis` | as `cgis` | one line: query cgis first |
44
45
  | `cgis-forced` | as `cgis` | as `cgis` | as `cgis` | as `cgis-instructed`, and the guard refuses Read/Grep/Glob/Bash until one cgis call |
45
46
 
47
+ `cgis-narrow` asks whether a short tool menu gets an unprompted agent to call the
48
+ graph (#542). The server instructions and the plugin skill still name all fifteen
49
+ tools, so it measures a short menu with a longer guide beside it. Each results line
50
+ records `cgis_tools`, the number of `mcp__cgis__*` tools the session was offered,
51
+ so an `env` the client ignored would show as 15. With no `--arm` a run now covers
52
+ five arms.
53
+
46
54
  `cgis-instructed` exists because the first pilot's `cgis` arm made no cgis call in
47
55
  12 of 12 sessions: with the server connected and the skill loaded, Sonnet still
48
56
  went straight to Grep. It stands in for #542's MCP server instructions. It barely moved the agent (2 cgis
@@ -75,8 +83,19 @@ uv run python scripts/agent_ab.py report
75
83
 
76
84
  `--model` defaults to `claude-sonnet-5-5`; `--max-budget-usd` (default 2.00)
77
85
  caps each session. Every non-dry run is a paid session, so this never runs in
78
- CI. Transcripts are written to `transcripts/` (git-ignored); `results.jsonl`
79
- gets one line per (task, arm, run) and is meant to be committed with the write-up.
86
+ CI. Transcripts are written to `transcripts/<task>/<arm>-<sha7>-<run>.jsonl`, with
87
+ the first 7 characters of the cgis commit (git-ignored); `results.jsonl` gets one
88
+ line per (task, arm, cgis commit, run) and is meant to be committed with the
89
+ write-up.
90
+
91
+ Run numbers continue from the highest one already in `--results` for the same
92
+ task, arm and cgis commit, so a second invocation that finishes an interrupted
93
+ batch adds runs instead of reusing them. A session that fails is written as a
94
+ line with `failed` set to the reason, and the batch goes on: an ingest or
95
+ worktree that raises gives a line with no metrics, and a `claude -p` that exits
96
+ non-zero keeps its scored metrics and cost but is marked failed too. `run` exits
97
+ 1 at the end if any session failed; `report` counts failed sessions in their own
98
+ column and leaves them out of the medians. A dry run writes nothing.
80
99
 
81
100
  ## Tasks
82
101
 
@@ -0,0 +1,177 @@
1
+ # Agent A/B results
2
+
3
+ One section per run, newest first. The raw lines are in `results.jsonl`; the
4
+ transcripts they point at are git-ignored and stay on the machine that ran them.
5
+
6
+ ## 2026-10-14: does one instruction line get the agent to call cgis?
7
+
8
+ cgis at 5a5c836, `cgis-instructed` — the `cgis` arm plus one appended system-prompt
9
+ line, "query cgis first, then read source only to confirm", the nearest stand-in for
10
+ a line in a project's CLAUDE.md. Same two impact tasks, 3 runs each, about $0.8.
11
+
12
+ | task | cgis calls per run | cost per run |
13
+ |---|---|---|
14
+ | `cgis-impact-drift-same-name` | 0, 0, **1** | 0.184, 0.148, **0.075** |
15
+ | `cgis-impact-transitive-tsconfig` | **1**, 0, 0 | **0.099**, 0.154, 0.153 |
16
+
17
+ - **The line moves the agent a little: 2 of 6 sessions called the graph**, against 0
18
+ of 18 without it. Both made one call, and both were the cheapest runs of the
19
+ six, at the level of `cgis-forced` (0.085 / 0.091). The other four ignored the
20
+ line and cost more than plain `cgis` (median 0.150 against 0.126–0.138).
21
+ - So an instruction is a coin toss weighted against the graph; the hook that refuses
22
+ Read/Grep/Bash until one cgis call (`cgis-forced`) is what delivers the saving
23
+ reliably. A project wanting the gain needs that hook, not a sentence.
24
+ - One run is marked `contaminated` with no cgis CLI call in it: on a task in this
25
+ repository every path contains `cgis/`, and the guard's predicate took the agent's
26
+ own `grep`/`sed` over `src/cgis/...` for one. A harness false positive, kept out of
27
+ the medians by the report as usual.
28
+
29
+ ## 2026-10-14: does a short tool menu get an unprompted agent to call cgis? (#542 item 3)
30
+
31
+ cgis at dbf3de9 (the `cgis-narrow` arm of #586), Sonnet 5.5, 3 runs per arm, 0 failed,
32
+ 0 contaminated, about $1.6. One probe session confirmed the narrowing reached the
33
+ client: the `init` event listed exactly `mcp__cgis__cgis_analyze_impact`,
34
+ `mcp__cgis__cgis_find_symbol`, `mcp__cgis__cgis_trace_flow`.
35
+
36
+ | task | arm | cgis calls | recall | precision | median $ |
37
+ |---|---|---|---|---|---|
38
+ | `cgis-impact-drift-same-name` | cgis (15 tools) | 0, 0, 0 | 1.00 | 1.00 | 0.126 |
39
+ | | cgis-narrow (3 tools) | 0, 0, 0 | 1.00 | 1.00 | 0.125 |
40
+ | `cgis-impact-transitive-tsconfig` | cgis | 0, 0, 0 | 1.00 | 1.00 | 0.138 |
41
+ | | cgis-narrow | 0, 0, 0 | 1.00 | 1.00 | 0.154 |
42
+
43
+ - **Refuted.** Three tools instead of fifteen changed nothing: no unprompted
44
+ session called the graph, here or in any of the six `cgis` sessions before it —
45
+ 0 of 18 today, across four tasks. The server instructions (#542 item 1) did not
46
+ move it either. Item 3's smaller default set has no evidence behind it.
47
+ - These are the two tasks where `cgis-forced` was about 30% cheaper than control
48
+ (#579), so the graph would have paid; the agent never looked.
49
+ - A likely reason sits in the client: Claude Code defers MCP tools, listing names
50
+ only, so a first call needs a ToolSearch to load the schema — every forced
51
+ session made one. An agent holding Grep and Bash, with a task grep finishes in
52
+ 7–13 calls, does not take that step unasked.
53
+ - Confound, as the README notes: the instructions and the plugin skill still name
54
+ all fifteen tools beside the three offered.
55
+
56
+ ## 2026-10-14: `cgis-flow-ingest-to-sqlite` after #581 (text format, trace budget)
57
+
58
+ cgis at a1dd2b8, Sonnet 5.5, 3 runs per arm, 0 failed, 0 contaminated, about $0.6.
59
+
60
+ | arm | recall | precision | median $ | trace answer |
61
+ |---|---|---|---|---|
62
+ | control | 1.00 | 0.94 | **0.101** | — |
63
+ | cgis-forced, before (#579) | 1.00 | 0.52 | 0.167 | 32,637 chars of json |
64
+ | cgis-forced, now | 1.00 | 0.58 | 0.112 | 6.3–8.9k chars of text |
65
+
66
+ - **Size: fixed.** All three sessions asked for `output_format="text"` on their
67
+ own (the server instructions now say to), and the answer shrank about 4×.
68
+ Cost fell by a third, to 11% above control.
69
+ - **Precision: not fixed.** Given every node the root reaches, the agent still
70
+ lists most of them (17–21 outside the key: `_compute_hash`,
71
+ `_is_noop_incremental`, `ResolverEngine` helpers). Control reads the code and
72
+ names the spine. The format no longer costs the agent; deciding which
73
+ branches are the main path is the part the graph does not do.
74
+ - Two sessions first called `cgis_find_symbol(query="ingest", fqn_prefix="src.cgis")`
75
+ and got nothing: #568 taught `resolve_fqn` to drop a directory above the
76
+ graph, but `find_symbol`'s `fqn_prefix` filter was not given the same rule.
77
+
78
+ ## 2026-10-14: three cgis tasks with a deep chain
79
+
80
+ cgis at bc303eb, Sonnet 5.5, 3 runs per arm, 0 failed, 0 contaminated, about $2.3.
81
+ None of these tasks was used to find the recent fixes.
82
+
83
+ | task | arm | recall | precision | median $ | median tool calls | cgis calls |
84
+ |---|---|---|---|---|---|---|
85
+ | `cgis-impact-drift-same-name` | control | 1.00 | 1.00 | 0.124 | 9 | — |
86
+ | | cgis-forced | 1.00 | 1.00 | **0.085** | 3 | 1, 1, 1 |
87
+ | `cgis-impact-transitive-tsconfig` | control | 1.00 | 1.00 | 0.126 | 7 | — |
88
+ | | cgis-forced | 1.00 | 1.00 | **0.091** | 4 | 1, 2, 1 |
89
+ | `cgis-flow-ingest-to-sqlite` | control | 1.00 | 0.86 | **0.112** | 5 | — |
90
+ | | cgis-forced | 1.00 | 0.52 | 0.167 | 4 | 2, 2, 2 |
91
+
92
+ - **Impact across several hops pays:** about 30% cheaper on both impact tasks,
93
+ with one cgis call doing what took control 7–9 greps and reads. Together with
94
+ `credit_wallet`, that makes three impact tasks out of three where the graph
95
+ wins once the question needs more than one hop.
96
+ - **Flow does not, and the cause is the answer's size.** Every forced session
97
+ called `cgis_trace_flow(cgis.cli.ingest, depth=3, json)` and got **32,637
98
+ characters**, the bloat #551 fixed for impact only: trace has no node budget
99
+ and no test filter. Given everything downstream, the agent cannot tell the
100
+ main path from side branches and names them all (precision 0.52, 20 extra
101
+ symbols such as every `ResolverEngine._resolved_*_edge`).
102
+ - `occupied_window` (above) and these together say where cgis earns its place:
103
+ multi-hop impact. A one-hop caller list and a "main path" flow question are
104
+ not where it helps today.
105
+
106
+ ## 2026-10-14: `owner-impact-occupied-window-same-name`, a task no fix was tuned on
107
+
108
+ cgis at 827143e (after #551, #568, #550, #545), Sonnet 5.5, 0 contaminated. The
109
+ three fixes before this were all found in `credit_wallet` transcripts and measured
110
+ there; this task checks whether the gain carries to a question they never saw.
111
+
112
+ | arm | runs | recall | precision | median $ | median tool calls | cgis calls per run |
113
+ |---|---|---|---|---|---|---|
114
+ | control | 3 | 1.00 | 1.00 | **0.130** | 2 | — |
115
+ | cgis | 3 | 1.00 | 1.00 | 0.145 | 4 | 0, 0, 0 |
116
+ | cgis-forced | 2 | 1.00 | 1.00 | 0.135 | 3.5 | 2, 1 |
117
+
118
+ - **It does not carry.** On "list the direct callers", with a same-named
119
+ function in another module as the trap, control answered with one grep and
120
+ one look at the imports, and was the cheapest arm. The graph names the four
121
+ callers exactly (`impact depth=1`, 2.5k characters), but there is nothing
122
+ for it to save on a one-hop question that grep plus the imports already
123
+ answer.
124
+ - The `credit_wallet` gain came from a deep transitive chain through DI. That
125
+ is where the graph pays, so the question for #542's default tool set is
126
+ which kinds of question agents ask, not whether cgis is cheaper in general.
127
+ - `cgis` made no graph call again: 0 in 6 sessions across the two tasks.
128
+ - `cgis-forced` has 2 runs, not 3. The host ran out of memory, and earlyoom
129
+ sent SIGTERM to the third session's `cgis ingest`, which aborted the runner
130
+ twice. Not a cgis failure. The runner stops at the first failed ingest
131
+ instead of recording it and going on.
132
+
133
+ ## 2026-10-14: `owner-impact-credit-wallet`, after #568 and #550
134
+
135
+ cgis at fc33b20, Sonnet 5.5, 3 runs per arm, 0 contaminated, about $1.5 in total.
136
+ `cgis` was not re-run: it made no cgis call on this task in the run below.
137
+
138
+ | arm | recall | precision | median $ | median tool calls | cgis calls per run |
139
+ |---|---|---|---|---|---|
140
+ | control | 1.00 | 1.00 | 0.298 | 7 | — |
141
+ | cgis-forced | 1.00 | 1.00 | **0.184** | 5 | 2, 5, 1 |
142
+
143
+ - `cgis-forced` went from $0.235 to $0.184 median and is now about 38% cheaper
144
+ than control. Control was unchanged ($0.30 to $0.298).
145
+ - **#568.** Two of the three sessions opened with
146
+ `app.domains.finance.service.credit_wallet` again, and this time it resolved:
147
+ the first answer was the full chain (6,746 characters), with no not-found
148
+ first. The third tried the bare `credit_wallet`, which is still ambiguous.
149
+ - **#550.** That first answer now includes both routes, `get_top_up` and
150
+ `stripe_webhook`. One session finished on a single cgis call. The greps that
151
+ remain are the agent confirming that `FinanceService.top_up` and the worker
152
+ tasks have no further callers, not looking for missing ones.
153
+
154
+ ## 2026-10-13: `owner-impact-credit-wallet`, after #563 and #565
155
+
156
+ cgis at 3c37874, Sonnet 5.5, 3 runs per arm, 0 contaminated, about $2.5 in total.
157
+
158
+ | arm | recall | precision | median $ | median tool calls | cgis calls per run |
159
+ |---|---|---|---|---|---|
160
+ | control | 1.00 | 1.00 | 0.30 | 7 | — |
161
+ | cgis | 1.00 | 1.00 | 0.30 | 6 | 0, 0, 0 |
162
+ | cgis-forced | 1.00 | 1.00 | 0.235 | 8 | 3, 11, 3 |
163
+
164
+ - **#551.** The call that returned 51,624 characters in the first pilot,
165
+ `cgis_analyze_impact(domains.finance.service.credit_wallet, depth=8, json)`,
166
+ returned 6,136 here. `cgis-forced` went from more expensive than control
167
+ ($0.207 vs $0.195) to cheaper. Control ranged from $0.198 to $0.327 across
168
+ three runs, so this shows the direction, not the size.
169
+ - **#542.** The `cgis` arm now gets server instructions in `initialize`, and its
170
+ server reported `connected` every time. It still made no cgis call: the task
171
+ is solvable by grep in about seven calls, and the agent took that route.
172
+ - **#568.** Every forced session's first call was
173
+ `app.domains.finance.service.credit_wallet`, built from the file path, which
174
+ is not found because the graph is ingested from `ownima-backend/app`. That
175
+ cost one or two calls per session before the agent found the real FQN.
176
+ - Every arm recovered the two routes the graph misses at this sha
177
+ (`get_top_up`, `stripe_webhook`) by grepping for them.