codegraph-brain 0.29.0__tar.gz → 0.31.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 (576) hide show
  1. codegraph_brain-0.31.0/.github/test-count-baseline +1 -0
  2. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/.github/workflows/ci.yml +18 -1
  3. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/.gitignore +2 -0
  4. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/.pre-commit-config.yaml +1 -0
  5. codegraph_brain-0.31.0/.release-please-manifest.json +3 -0
  6. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/CHANGELOG.md +47 -0
  7. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/CLAUDE.md +34 -12
  8. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/PKG-INFO +3 -2
  9. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/README.md +1 -1
  10. codegraph_brain-0.31.0/benchmarks/agent_ab/analysis/exp1_gates.py +88 -0
  11. codegraph_brain-0.31.0/benchmarks/agent_ab/analysis/exp2_gates.py +54 -0
  12. codegraph_brain-0.31.0/benchmarks/agent_ab/analysis/exp2_pairs.json +71 -0
  13. codegraph_brain-0.31.0/benchmarks/agent_ab/analysis/exp2_post_review.py +34 -0
  14. codegraph_brain-0.31.0/benchmarks/agent_ab/analysis/exp3_gates.py +76 -0
  15. codegraph_brain-0.31.0/benchmarks/agent_ab/results-exp1-full.jsonl +60 -0
  16. codegraph_brain-0.31.0/benchmarks/agent_ab/results-exp1.jsonl +18 -0
  17. codegraph_brain-0.31.0/benchmarks/agent_ab/results-exp2-full.jsonl +51 -0
  18. codegraph_brain-0.31.0/benchmarks/agent_ab/results-exp2-pilot.jsonl +5 -0
  19. codegraph_brain-0.31.0/benchmarks/agent_ab/results-exp3-forced.jsonl +111 -0
  20. codegraph_brain-0.31.0/benchmarks/agent_ab/results-exp3b-forced.jsonl +6 -0
  21. codegraph_brain-0.31.0/benchmarks/agent_ab/results-exp3c-arm-a.jsonl +3 -0
  22. codegraph_brain-0.31.0/benchmarks/agent_ab/results-exp3c-arm-b.jsonl +3 -0
  23. codegraph_brain-0.31.0/benchmarks/agent_ab/tasks/cgis-exp2-desc-record-usage.yaml +98 -0
  24. codegraph_brain-0.31.0/benchmarks/agent_ab/tasks/cgis-exp2-desc-relative.yaml +118 -0
  25. codegraph_brain-0.31.0/benchmarks/agent_ab/tasks/cgis-exp2-desc-specifier-fqn.yaml +128 -0
  26. codegraph_brain-0.31.0/benchmarks/agent_ab/tasks/cgis-exp2-dir-build-ladder.yaml +43 -0
  27. codegraph_brain-0.31.0/benchmarks/agent_ab/tasks/cgis-exp2-dir-effective-prefix.yaml +59 -0
  28. codegraph_brain-0.31.0/benchmarks/agent_ab/tasks/cgis-exp2-dir-extractors.yaml +59 -0
  29. codegraph_brain-0.31.0/benchmarks/agent_ab/tasks/cgis-exp2-dir-loc.yaml +49 -0
  30. codegraph_brain-0.31.0/benchmarks/agent_ab/tasks/cgis-exp2-dir-reject-metrics-path.yaml +35 -0
  31. codegraph_brain-0.31.0/benchmarks/agent_ab/tasks/cgis-exp2-dir-resolve-fqn.yaml +53 -0
  32. codegraph_brain-0.31.0/benchmarks/agent_ab/tasks/cgis-exp2-dir-visible-findings.yaml +40 -0
  33. codegraph_brain-0.31.0/benchmarks/agent_ab/tasks/cgis-exp2-ind-as-terms.yaml +51 -0
  34. codegraph_brain-0.31.0/benchmarks/agent_ab/tasks/cgis-exp2-ind-finder-pass.yaml +37 -0
  35. codegraph_brain-0.31.0/benchmarks/agent_ab/tasks/cgis-exp2-ind-fit-config.yaml +52 -0
  36. codegraph_brain-0.31.0/benchmarks/agent_ab/tasks/cgis-exp2-ind-fit-templates.yaml +52 -0
  37. codegraph_brain-0.31.0/benchmarks/agent_ab/tasks/cgis-exp2-ind-get-edge-stats.yaml +48 -0
  38. codegraph_brain-0.31.0/benchmarks/agent_ab/tasks/cgis-exp2-ind-get-incoming-edges.yaml +47 -0
  39. codegraph_brain-0.31.0/benchmarks/agent_ab/tasks/cgis-exp2-ind-sanitize-finder-result.yaml +47 -0
  40. codegraph_brain-0.31.0/benchmarks/agent_ab/tasks/owner-exp1-big-dir-calculate-pagination.yaml +58 -0
  41. codegraph_brain-0.31.0/benchmarks/agent_ab/tasks/owner-exp1-big-dir-vehicle-by-id-query.yaml +68 -0
  42. codegraph_brain-0.31.0/benchmarks/agent_ab/tasks/owner-exp1-big-ind-calculate-average-rating.yaml +71 -0
  43. codegraph_brain-0.31.0/benchmarks/agent_ab/tasks/owner-exp1-big-ind-calculate-total-price.yaml +69 -0
  44. codegraph_brain-0.31.0/benchmarks/agent_ab/tasks/owner-exp1-big-ind-credit-document.yaml +54 -0
  45. codegraph_brain-0.31.0/benchmarks/agent_ab/tasks/owner-exp1-big-ind-extra-options-filter.yaml +57 -0
  46. codegraph_brain-0.31.0/benchmarks/agent_ab/tasks/owner-exp1-big-ind-live-dispute-clause.yaml +54 -0
  47. codegraph_brain-0.31.0/benchmarks/agent_ab/tasks/owner-exp1-big-ind-lock-wallet.yaml +57 -0
  48. codegraph_brain-0.31.0/benchmarks/agent_ab/tasks/owner-exp1-big-ind-opensearch-mget.yaml +68 -0
  49. codegraph_brain-0.31.0/benchmarks/agent_ab/tasks/owner-exp1-big-ind-reservation-conflict-query.yaml +132 -0
  50. codegraph_brain-0.31.0/benchmarks/agent_ab/tasks/owner-exp1-big-ind-s3-presigned-url.yaml +56 -0
  51. codegraph_brain-0.31.0/benchmarks/agent_ab/tasks/owner-exp1-big-ind-signup-bonus-reference.yaml +59 -0
  52. codegraph_brain-0.31.0/benchmarks/agent_ab/tasks/owner-exp1-big-ind-thread-for.yaml +177 -0
  53. codegraph_brain-0.31.0/benchmarks/agent_ab/tasks/owner-exp1-small-dir-get-client-ip.yaml +46 -0
  54. codegraph_brain-0.31.0/benchmarks/agent_ab/tasks/owner-exp1-small-dir-owner-name.yaml +49 -0
  55. codegraph_brain-0.31.0/benchmarks/agent_ab/tasks/owner-exp1-small-dir-raise-vehicle-not-found.yaml +57 -0
  56. codegraph_brain-0.31.0/benchmarks/agent_ab/tasks/owner-exp1-small-dir-select-random-payment-method.yaml +46 -0
  57. codegraph_brain-0.31.0/benchmarks/agent_ab/tasks/owner-exp1-small-ind-counterparty-cards.yaml +45 -0
  58. codegraph_brain-0.31.0/benchmarks/agent_ab/tasks/owner-exp1-small-ind-notify-top-up-failed.yaml +43 -0
  59. codegraph_brain-0.31.0/benchmarks/agent_ab/tasks/owner-exp1-small-ind-search-by-owner.yaml +36 -0
  60. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/AUDIT.md +1 -1
  61. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/architecture/HOW_IT_WORKS.md +41 -37
  62. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/architecture/ONTOLOGY.md +1 -1
  63. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/architecture/diagrams/pipeline_flow.mermaid +22 -20
  64. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/how-to/MCP_REFERENCE.md +6 -5
  65. codegraph_brain-0.31.0/docs/lab-notes/2026-10-15-exp1-radius-indirection.md +252 -0
  66. codegraph_brain-0.31.0/docs/lab-notes/2026-10-15-exp2-indirection-cgis.md +278 -0
  67. codegraph_brain-0.31.0/docs/lab-notes/2026-10-15-exp3-does-cgis-help.md +124 -0
  68. codegraph_brain-0.31.0/docs/lab-notes/2026-10-15-exp3b-any-fix-rerun.md +80 -0
  69. codegraph_brain-0.31.0/docs/lab-notes/2026-10-15-exp3c-coverage-sites.md +116 -0
  70. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/ontology/domains.yaml +6 -7
  71. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/ontology/patterns.yaml +74 -26
  72. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/ontology/tolerances.lock +7 -4
  73. codegraph_brain-0.31.0/docs/plans/2026-10-14-language-packs-step1.md +1037 -0
  74. codegraph_brain-0.31.0/docs/plans/2026-10-14-language-packs-step2.md +773 -0
  75. codegraph_brain-0.31.0/docs/plans/2026-10-14-language-packs-step3.md +732 -0
  76. codegraph_brain-0.31.0/docs/plans/2026-10-14-language-packs-step4.md +681 -0
  77. codegraph_brain-0.31.0/docs/plans/2026-10-14-language-packs-step5.md +187 -0
  78. codegraph_brain-0.31.0/docs/plans/2026-10-14-language-packs-step6.md +270 -0
  79. codegraph_brain-0.31.0/docs/plans/2026-10-14-language-packs-step7.md +485 -0
  80. codegraph_brain-0.31.0/docs/plans/2026-10-14-language-packs.md +888 -0
  81. codegraph_brain-0.31.0/docs/specs/2026-10-14-language-packs-design.md +564 -0
  82. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/plugin/README.md +1 -1
  83. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/plugin/skills/cgis/SKILL.md +1 -1
  84. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/plugin/skills/ingest/SKILL.md +1 -1
  85. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/pyproject.toml +15 -1
  86. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/scripts/agent_ab.py +2 -0
  87. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/scripts/backfill_calibration_fingerprint.py +2 -0
  88. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/scripts/backfill_review_fingerprint.py +2 -0
  89. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/scripts/generate_health.py +4 -3
  90. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/scripts/generate_mcp_ref.py +2 -0
  91. codegraph_brain-0.31.0/scripts/graph_identity.py +189 -0
  92. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/scripts/guardian_bench.py +2 -0
  93. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/scripts/guardian_calibrate.py +2 -0
  94. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/scripts/guardian_martian.py +6 -4
  95. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/scripts/guardian_replay_skeptic.py +2 -0
  96. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/scripts/guardian_review.py +2 -0
  97. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/scripts/inject_architecture_graph.py +2 -0
  98. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/scripts/probe_closure_gap.py +2 -0
  99. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/scripts/probe_tier_ladder.py +2 -0
  100. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/scripts/recordings_from_corpus.py +2 -0
  101. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/scripts/skeptic_arms.py +2 -0
  102. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/server.json +3 -3
  103. codegraph_brain-0.31.0/src/cgis/__init__.py +59 -0
  104. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/api/auto_refresh.py +2 -2
  105. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/api/mcp_server.py +37 -19
  106. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/api/server_instructions.py +20 -4
  107. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/bench/agent_task.py +26 -1
  108. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/cli.py +9 -13
  109. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/core/coverage.py +45 -2
  110. codegraph_brain-0.31.0/src/cgis/core/extractor.py +110 -0
  111. codegraph_brain-0.31.0/src/cgis/core/index.py +44 -0
  112. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/core/js_globals.py +57 -0
  113. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/core/models.py +21 -0
  114. codegraph_brain-0.31.0/src/cgis/core/project.py +38 -0
  115. codegraph_brain-0.31.0/src/cgis/core/resolution.py +85 -0
  116. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/guardian/collector.py +6 -6
  117. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/guardian/martian.py +1 -1
  118. codegraph_brain-0.31.0/src/cgis/import_names.py +170 -0
  119. codegraph_brain-0.31.0/src/cgis/languages/__init__.py +246 -0
  120. codegraph_brain-0.31.0/src/cgis/languages/go/__init__.py +70 -0
  121. codegraph_brain-0.31.0/src/cgis/languages/go/_syntax.py +240 -0
  122. codegraph_brain-0.31.0/src/cgis/languages/go/dispatch.py +138 -0
  123. codegraph_brain-0.31.0/src/cgis/languages/go/extractor.py +459 -0
  124. codegraph_brain-0.31.0/src/cgis/languages/go/index.py +141 -0
  125. codegraph_brain-0.31.0/src/cgis/languages/go/naming.py +49 -0
  126. codegraph_brain-0.31.0/src/cgis/languages/go/project.py +139 -0
  127. codegraph_brain-0.31.0/src/cgis/languages/go/resolution.py +117 -0
  128. codegraph_brain-0.31.0/src/cgis/languages/python/__init__.py +72 -0
  129. codegraph_brain-0.29.0/src/cgis/extractors/_python_annotations.py → codegraph_brain-0.31.0/src/cgis/languages/python/_annotations.py +2 -2
  130. codegraph_brain-0.29.0/src/cgis/extractors/_python_classes.py → codegraph_brain-0.31.0/src/cgis/languages/python/_classes.py +1 -1
  131. codegraph_brain-0.29.0/src/cgis/extractors/_python_functions.py → codegraph_brain-0.31.0/src/cgis/languages/python/_functions.py +9 -9
  132. codegraph_brain-0.29.0/src/cgis/extractors/_python_imports.py → codegraph_brain-0.31.0/src/cgis/languages/python/_imports.py +1 -1
  133. codegraph_brain-0.31.0/src/cgis/languages/python/_routes.py +138 -0
  134. codegraph_brain-0.29.0/src/cgis/extractors/_python_types.py → codegraph_brain-0.31.0/src/cgis/languages/python/_types.py +23 -2
  135. codegraph_brain-0.29.0/src/cgis/extractors/python_extractor.py → codegraph_brain-0.31.0/src/cgis/languages/python/extractor.py +15 -12
  136. codegraph_brain-0.31.0/src/cgis/languages/python/index.py +288 -0
  137. codegraph_brain-0.31.0/src/cgis/languages/python/project.py +42 -0
  138. codegraph_brain-0.31.0/src/cgis/languages/python/resolution.py +32 -0
  139. codegraph_brain-0.31.0/src/cgis/languages/typescript/__init__.py +72 -0
  140. codegraph_brain-0.31.0/src/cgis/languages/typescript/builtins.py +29 -0
  141. codegraph_brain-0.29.0/src/cgis/extractors/typescript_extractor.py → codegraph_brain-0.31.0/src/cgis/languages/typescript/extractor.py +3 -37
  142. codegraph_brain-0.31.0/src/cgis/languages/typescript/index.py +163 -0
  143. codegraph_brain-0.31.0/src/cgis/languages/typescript/naming.py +37 -0
  144. codegraph_brain-0.31.0/src/cgis/languages/typescript/project.py +109 -0
  145. codegraph_brain-0.31.0/src/cgis/languages/typescript/resolution.py +160 -0
  146. codegraph_brain-0.29.0/src/cgis/tsconfig_paths.py → codegraph_brain-0.31.0/src/cgis/languages/typescript/tsconfig.py +12 -5
  147. {codegraph_brain-0.29.0/src/cgis → codegraph_brain-0.31.0/src/cgis/languages/typescript}/workspaces.py +15 -8
  148. codegraph_brain-0.29.0/src/cgis/pipeline.py → codegraph_brain-0.31.0/src/cgis/pipeline/__init__.py +108 -19
  149. {codegraph_brain-0.29.0/src/cgis/resolver → codegraph_brain-0.31.0/src/cgis/pipeline}/uplift.py +2 -1
  150. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/query/analysis/health.py +0 -11
  151. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/query/context/audit.py +16 -4
  152. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/query/drift/scoring.py +12 -7
  153. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/query/engine.py +97 -11
  154. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/query/render/mermaid.py +11 -6
  155. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/resolver/engine.py +31 -8
  156. codegraph_brain-0.31.0/src/cgis/resolver/indices.py +474 -0
  157. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/resolver/symbols.py +94 -59
  158. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/storage/sqlite_store.py +82 -8
  159. codegraph_brain-0.31.0/tests/fixtures/graph_identity/corpus/py/lib/legacy/tool.py +5 -0
  160. codegraph_brain-0.31.0/tests/fixtures/graph_identity/corpus/py/pyproject.toml +3 -0
  161. codegraph_brain-0.31.0/tests/fixtures/graph_identity/corpus/py/src/alembic/env.py +2 -0
  162. codegraph_brain-0.31.0/tests/fixtures/graph_identity/corpus/py/src/shop/__init__.py +1 -0
  163. codegraph_brain-0.31.0/tests/fixtures/graph_identity/corpus/py/src/shop/cli.py +5 -0
  164. codegraph_brain-0.31.0/tests/fixtures/graph_identity/corpus/py/src/shop/deps.py +12 -0
  165. codegraph_brain-0.31.0/tests/fixtures/graph_identity/corpus/py/src/shop/repo.py +11 -0
  166. codegraph_brain-0.31.0/tests/fixtures/graph_identity/corpus/py/src/shop/service.py +16 -0
  167. codegraph_brain-0.31.0/tests/fixtures/graph_identity/corpus/py/tests/test_service.py +5 -0
  168. codegraph_brain-0.31.0/tests/fixtures/graph_identity/corpus/ts/apps/web/package.json +1 -0
  169. codegraph_brain-0.31.0/tests/fixtures/graph_identity/corpus/ts/apps/web/src/main.ts +16 -0
  170. codegraph_brain-0.31.0/tests/fixtures/graph_identity/corpus/ts/apps/web/src/types.d.ts +3 -0
  171. codegraph_brain-0.31.0/tests/fixtures/graph_identity/corpus/ts/apps/web/src/util.ts +3 -0
  172. codegraph_brain-0.31.0/tests/fixtures/graph_identity/corpus/ts/package.json +1 -0
  173. codegraph_brain-0.31.0/tests/fixtures/graph_identity/corpus/ts/packages/lib/index.ts +3 -0
  174. codegraph_brain-0.31.0/tests/fixtures/graph_identity/corpus/ts/packages/lib/package.json +1 -0
  175. codegraph_brain-0.31.0/tests/fixtures/graph_identity/corpus/ts/pnpm-workspace.yaml +3 -0
  176. codegraph_brain-0.31.0/tests/fixtures/graph_identity/corpus/ts/tsconfig.json +1 -0
  177. codegraph_brain-0.31.0/tests/fixtures/graph_identity/snapshot.json +3074 -0
  178. codegraph_brain-0.31.0/tests/fixtures/graph_identity_go/corpus/go.mod +7 -0
  179. codegraph_brain-0.31.0/tests/fixtures/graph_identity_go/corpus/internal/native/native.go +8 -0
  180. codegraph_brain-0.31.0/tests/fixtures/graph_identity_go/corpus/internal/server/server.go +19 -0
  181. codegraph_brain-0.31.0/tests/fixtures/graph_identity_go/corpus/internal/server/server_test.go +9 -0
  182. codegraph_brain-0.31.0/tests/fixtures/graph_identity_go/corpus/internal/server/types.go +19 -0
  183. codegraph_brain-0.31.0/tests/fixtures/graph_identity_go/corpus/internal/server/validate.go +5 -0
  184. codegraph_brain-0.31.0/tests/fixtures/graph_identity_go/corpus/internal/store/store.go +26 -0
  185. codegraph_brain-0.31.0/tests/fixtures/graph_identity_go/corpus/main.go +17 -0
  186. codegraph_brain-0.31.0/tests/fixtures/graph_identity_go/corpus/money/money.go +8 -0
  187. codegraph_brain-0.31.0/tests/fixtures/graph_identity_go/snapshot.json +1400 -0
  188. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/self_parsing/conftest.py +2 -2
  189. codegraph_brain-0.31.0/tests/self_parsing/forbidden_edges_allowlist.json +16 -0
  190. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/self_parsing/test_annotation_calibration.py +18 -3
  191. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/self_parsing/test_architecture.py +146 -7
  192. codegraph_brain-0.31.0/tests/self_parsing/test_domains_ontology.py +43 -0
  193. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/self_parsing/test_drift.py +71 -26
  194. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/self_parsing/test_init_ontology_roundtrip.py +3 -3
  195. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/self_parsing/test_receiver_resolution.py +2 -2
  196. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/self_parsing/test_self_parse.py +4 -4
  197. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/self_parsing/test_self_parse_ts.py +2 -2
  198. codegraph_brain-0.31.0/tests/unit/review_path_inventory.txt +69 -0
  199. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_agent_ab_task.py +104 -2
  200. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_annotation_edges.py +1 -1
  201. codegraph_brain-0.31.0/tests/unit/test_any_typed_receiver.py +150 -0
  202. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_audit.py +1 -1
  203. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_class_cohesion.py +1 -1
  204. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_cli.py +1 -1
  205. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_configs_above_root.py +2 -2
  206. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_context_service.py +1 -1
  207. codegraph_brain-0.31.0/tests/unit/test_coverage_claims.py +60 -0
  208. codegraph_brain-0.31.0/tests/unit/test_coverage_screen_and_sites.py +202 -0
  209. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_di_acceptance.py +1 -1
  210. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_dispatch_edges.py +144 -2
  211. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_drift.py +53 -0
  212. codegraph_brain-0.31.0/tests/unit/test_extraction_fingerprint.py +212 -0
  213. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_fingerprint.py +1 -1
  214. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_freshness.py +1 -1
  215. codegraph_brain-0.31.0/tests/unit/test_go_dispatch.py +350 -0
  216. codegraph_brain-0.31.0/tests/unit/test_go_extractor.py +461 -0
  217. codegraph_brain-0.31.0/tests/unit/test_go_graph_identity.py +145 -0
  218. codegraph_brain-0.31.0/tests/unit/test_go_incremental.py +95 -0
  219. codegraph_brain-0.31.0/tests/unit/test_go_naming.py +44 -0
  220. codegraph_brain-0.31.0/tests/unit/test_go_project.py +103 -0
  221. codegraph_brain-0.31.0/tests/unit/test_go_resolution.py +457 -0
  222. codegraph_brain-0.31.0/tests/unit/test_go_surfaces.py +91 -0
  223. codegraph_brain-0.31.0/tests/unit/test_graph_identity.py +93 -0
  224. codegraph_brain-0.31.0/tests/unit/test_graph_identity_dump.py +141 -0
  225. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_graph_json.py +3 -1
  226. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_guardian_collector.py +2 -2
  227. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_guardian_martian.py +3 -3
  228. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_guardian_martian_script.py +2 -2
  229. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_import_acceptance.py +1 -1
  230. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_inject_architecture_graph.py +2 -2
  231. codegraph_brain-0.31.0/tests/unit/test_languages.py +397 -0
  232. codegraph_brain-0.31.0/tests/unit/test_logs_to_stderr.py +161 -0
  233. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_mermaid.py +22 -0
  234. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_metrics_resolution.py +1 -1
  235. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_name_load_positions.py +1 -1
  236. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_npm_dependencies.py +2 -2
  237. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_patterns_yaml.py +34 -9
  238. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_pipeline.py +21 -1
  239. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_pipeline_incremental_symbols.py +1 -1
  240. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_pipeline_ts_workspaces.py +1 -1
  241. codegraph_brain-0.31.0/tests/unit/test_project_facts.py +236 -0
  242. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_python_annotations.py +2 -2
  243. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_python_dependencies.py +2 -2
  244. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_python_extractor.py +2 -2
  245. codegraph_brain-0.31.0/tests/unit/test_python_index.py +100 -0
  246. codegraph_brain-0.31.0/tests/unit/test_python_routes.py +230 -0
  247. codegraph_brain-0.31.0/tests/unit/test_resolution_rules.py +124 -0
  248. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_resolver.py +1 -1
  249. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_resolver_indices.py +40 -4
  250. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_resolver_js_builtins.py +2 -2
  251. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_resolver_language_scope.py +4 -4
  252. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_resolver_phantom_internal.py +1 -1
  253. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_resolver_symbols.py +39 -0
  254. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_resolver_ts_declarations.py +1 -1
  255. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_review_fingerprint_closure.py +1 -1
  256. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_self_types.py +1 -1
  257. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_tsconfig_paths.py +2 -2
  258. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_type_checking_imports.py +1 -1
  259. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_typescript_extractor.py +2 -1
  260. codegraph_brain-0.31.0/tests/unit/test_typescript_index.py +82 -0
  261. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_uplift.py +2 -2
  262. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/uv.lock +22 -4
  263. codegraph_brain-0.29.0/.github/test-count-baseline +0 -1
  264. codegraph_brain-0.29.0/.release-please-manifest.json +0 -3
  265. codegraph_brain-0.29.0/src/cgis/__init__.py +0 -10
  266. codegraph_brain-0.29.0/src/cgis/extractors/base.py +0 -58
  267. codegraph_brain-0.29.0/src/cgis/extractors/registry.py +0 -93
  268. codegraph_brain-0.29.0/src/cgis/import_names.py +0 -162
  269. codegraph_brain-0.29.0/src/cgis/resolver/indices.py +0 -840
  270. codegraph_brain-0.29.0/src/cgis/resolver/js_builtins.py +0 -97
  271. codegraph_brain-0.29.0/tests/unit/.gitkeep +0 -0
  272. codegraph_brain-0.29.0/tests/unit/review_path_inventory.txt +0 -43
  273. codegraph_brain-0.29.0/tests/unit/test_extractor_registry.py +0 -184
  274. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/.claude-plugin/marketplace.json +0 -0
  275. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/.gitattributes +0 -0
  276. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/.github/workflows/autodoc.yml +0 -0
  277. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/.github/workflows/guardian.yml +0 -0
  278. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/.github/workflows/mcp-registry.yml +0 -0
  279. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/.github/workflows/pr-title.yml +0 -0
  280. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/.github/workflows/release-please.yml +0 -0
  281. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/.github/workflows/ui.yml +0 -0
  282. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/.python-version +0 -0
  283. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/CONTRIBUTING.md +0 -0
  284. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/LICENSE +0 -0
  285. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/Makefile +0 -0
  286. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/PRIVACY.md +0 -0
  287. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/benchmarks/agent_ab/.gitignore +0 -0
  288. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/benchmarks/agent_ab/README.md +0 -0
  289. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/benchmarks/agent_ab/RESULTS.md +0 -0
  290. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/benchmarks/agent_ab/results.jsonl +0 -0
  291. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/benchmarks/agent_ab/tasks/cgis-control-sqlite-pragmas.yaml +0 -0
  292. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/benchmarks/agent_ab/tasks/cgis-flow-ingest-to-sqlite.yaml +0 -0
  293. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/benchmarks/agent_ab/tasks/cgis-impact-drift-same-name.yaml +0 -0
  294. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/benchmarks/agent_ab/tasks/cgis-impact-language-for.yaml +0 -0
  295. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/benchmarks/agent_ab/tasks/cgis-impact-transitive-tsconfig.yaml +0 -0
  296. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/benchmarks/agent_ab/tasks/cgis-orientation-call-resolution.yaml +0 -0
  297. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/benchmarks/agent_ab/tasks/owner-impact-credit-wallet.yaml +0 -0
  298. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/benchmarks/agent_ab/tasks/owner-impact-occupied-window-same-name.yaml +0 -0
  299. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/benchmarks/guardian/CURATION.md +0 -0
  300. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/benchmarks/guardian/calibration.jsonl +0 -0
  301. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/benchmarks/guardian/experiments/246-cross-vendor/README.md +0 -0
  302. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/benchmarks/guardian/experiments/246-cross-vendor/free-nemotron-quota-cutoff.jsonl +0 -0
  303. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/benchmarks/guardian/experiments/401-evidence/README.md +0 -0
  304. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/benchmarks/guardian/experiments/401-evidence/pr-399-control-rows.jsonl +0 -0
  305. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/benchmarks/guardian/experiments/401-evidence/pr-399-recording.json +0 -0
  306. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/benchmarks/guardian/experiments/401-evidence/pr-399-treatment-rows.jsonl +0 -0
  307. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/benchmarks/guardian/experiments/407-no-checker-appeal/README.md +0 -0
  308. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/benchmarks/guardian/experiments/407-no-checker-appeal/pr-399-control-directive-rows.jsonl +0 -0
  309. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/benchmarks/guardian/experiments/407-no-checker-appeal/pr-399-control-prohibition-rows.jsonl +0 -0
  310. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/benchmarks/guardian/pr-122.yaml +0 -0
  311. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/benchmarks/guardian/pr-140.yaml +0 -0
  312. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/benchmarks/guardian/pr-141.yaml +0 -0
  313. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/benchmarks/guardian/pr-142.yaml +0 -0
  314. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/benchmarks/guardian/pr-143.yaml +0 -0
  315. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/benchmarks/guardian/pr-144.yaml +0 -0
  316. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/benchmarks/guardian/pr-278.yaml +0 -0
  317. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/benchmarks/guardian/pr-313.yaml +0 -0
  318. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/benchmarks/guardian/results.jsonl +0 -0
  319. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/benchmarks/martian/README.md +0 -0
  320. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/benchmarks/martian/cal_dot_com.json +0 -0
  321. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/benchmarks/martian/discourse.json +0 -0
  322. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/benchmarks/martian/grafana.json +0 -0
  323. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/benchmarks/martian/keycloak.json +0 -0
  324. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/benchmarks/martian/sentry.json +0 -0
  325. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/benchmarks/martian-judged.jsonl +0 -0
  326. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/benchmarks/martian-p3-judged-run1.jsonl +0 -0
  327. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/benchmarks/martian-p3-judged-run1.jsonl.corrupted-backup +0 -0
  328. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/benchmarks/martian-p3-run1.jsonl +0 -0
  329. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/benchmarks/martian-p3-run2.jsonl +0 -0
  330. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/benchmarks/martian-p3-run3.jsonl +0 -0
  331. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/benchmarks/martian-plan.json +0 -0
  332. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/benchmarks/martian-repeat-judged.jsonl +0 -0
  333. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/benchmarks/martian-repeat-reviews.jsonl +0 -0
  334. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/benchmarks/martian-reviews.jsonl +0 -0
  335. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/data/.gitkeep +0 -0
  336. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/CASE_STUDY.md +0 -0
  337. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/GUARDIAN_LOCAL_BENCH.md +0 -0
  338. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/GUARDIAN_REMOTE_OLLAMA.md +0 -0
  339. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/architecture/PATTERNS_AND_TRIADS.md +0 -0
  340. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/architecture/SELF_PORTRAIT.md +0 -0
  341. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/architecture/health_badge.json +0 -0
  342. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/assets/.gitignore +0 -0
  343. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/assets/cgis-app-avatar.png +0 -0
  344. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/assets/cgis-app-avatar.svg +0 -0
  345. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/assets/generate_avatar.py +0 -0
  346. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/examples/.gitkeep +0 -0
  347. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/how-to/AGENT_ONBOARDING.md +0 -0
  348. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/how-to/CLI_USAGE.md +0 -0
  349. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/lab-notes/2026-06-11-chunked-review-negative-result.md +0 -0
  350. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/ontology/.gitkeep +0 -0
  351. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/ontology/core.yaml +0 -0
  352. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/plans/2026-09-09-graph-freshness.md +0 -0
  353. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/specs/2026-06-09-domain-pattern-fingerprint-design.md +0 -0
  354. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/specs/2026-06-09-pattern-alphabet-motif-basis-design.md +0 -0
  355. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/specs/2026-06-10-guardian-sprint-design.md +0 -0
  356. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/specs/2026-06-11-fastapi-di-edges-design.md +0 -0
  357. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/specs/2026-06-11-guardian-chunked-review-design.md +0 -0
  358. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/specs/2026-06-11-guardian-chunker-design.md +0 -0
  359. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/specs/2026-06-11-mcp-drift-validate-fqn-design.md +0 -0
  360. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/specs/2026-06-11-resolver-split-design.md +0 -0
  361. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/specs/2026-06-11-symbol-import-edges-design.md +0 -0
  362. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/specs/2026-06-12-drift-empty-domains-design.md +0 -0
  363. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/specs/2026-06-12-gate-semantics-design.md +0 -0
  364. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/specs/2026-06-12-init-ontology-design.md +0 -0
  365. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/specs/2026-06-12-release-please-ci-design.md +0 -0
  366. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/specs/2026-06-13-suggest-packages-design.md +0 -0
  367. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/specs/2026-06-13-tangle-anti-pattern-design.md +0 -0
  368. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/specs/2026-07-29-guardian-skeptic-scoring-design.md +0 -0
  369. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/specs/2026-07-30-cgis-fractal-design.md +0 -0
  370. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/specs/2026-07-30-cgis-fractal-plan.md +0 -0
  371. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/specs/2026-07-30-chunk-source-filter-design.md +0 -0
  372. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/specs/2026-07-30-chunk-source-filter-plan.md +0 -0
  373. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/specs/2026-07-30-genai-client-close-design.md +0 -0
  374. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/specs/2026-07-30-genai-client-close-plan.md +0 -0
  375. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/specs/2026-07-30-guardian-precision-bench-design.md +0 -0
  376. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/specs/2026-07-30-guardian-precision-bench-plan.md +0 -0
  377. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/specs/2026-07-30-guardian-timeout-retry-design.md +0 -0
  378. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/specs/2026-07-30-guardian-timeout-retry-plan.md +0 -0
  379. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/specs/2026-07-31-finder-bug-class-taxonomy.md +0 -0
  380. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/specs/2026-08-01-aura-autoevolution-poc.md +0 -0
  381. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/specs/2026-08-11-guardian-code-review-bench.md +0 -0
  382. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/specs/2026-08-14-review-fingerprint-design.md +0 -0
  383. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/specs/2026-09-05-annotation-graph-design.md +0 -0
  384. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/specs/2026-09-09-graph-freshness-design.md +0 -0
  385. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/specs/BLUEPRINT.md +0 -0
  386. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/specs/PRD.md +0 -0
  387. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/specs/TDD.md +0 -0
  388. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/specs/plans/2026-06-09-fingerprint-drift.md +0 -0
  389. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/specs/plans/2026-06-10-guardian-context-skeptic-inline.md +0 -0
  390. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/specs/plans/2026-06-10-guardian-structured-findings-bench.md +0 -0
  391. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/specs/plans/2026-06-10-motif-basis-part-b.md +0 -0
  392. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/specs/plans/2026-06-10-unified-pattern-alphabet.md +0 -0
  393. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/specs/plans/2026-06-11-fastapi-di-edges.md +0 -0
  394. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/specs/plans/2026-06-11-guardian-chunked-review.md +0 -0
  395. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/specs/plans/2026-06-11-guardian-chunker.md +0 -0
  396. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/specs/plans/2026-06-11-mcp-drift-validate-fqn.md +0 -0
  397. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/specs/plans/2026-06-11-resolver-split.md +0 -0
  398. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/specs/plans/2026-06-12-drift-empty-domains.md +0 -0
  399. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/specs/plans/2026-06-12-gate-semantics.md +0 -0
  400. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/specs/plans/2026-06-12-init-ontology.md +0 -0
  401. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/specs/plans/2026-06-12-release-please-ci.md +0 -0
  402. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/specs/plans/2026-06-12-symbol-import-edges.md +0 -0
  403. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/specs/plans/2026-06-13-suggest-packages.md +0 -0
  404. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/specs/plans/2026-07-29-guardian-skeptic-scoring.md +0 -0
  405. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/specs/plans/2026-08-14-review-fingerprint.md +0 -0
  406. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/specs/plans/2026-09-05-annotation-graph-pr1.md +0 -0
  407. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/docs/specs/plans/2026-09-05-annotation-graph-pr2.md +0 -0
  408. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/glama.json +0 -0
  409. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/main.py +0 -0
  410. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/plugin/.claude-plugin/plugin.json +0 -0
  411. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/plugin/.mcp.json +0 -0
  412. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/release-please-config.json +0 -0
  413. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/scripts/check_pytest_raises.py +0 -0
  414. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/scripts/check_test_count.py +0 -0
  415. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/scripts/colab_bench.sh +0 -0
  416. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/scripts/gen_ideal_graph.py +0 -0
  417. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/scripts/generate_schema_docs.py +0 -0
  418. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/scripts/mcp_registry_gate.sh +0 -0
  419. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/scripts/ollama_visitor.sh +0 -0
  420. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/__main__.py +0 -0
  421. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/api/.gitkeep +0 -0
  422. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/api/__init__.py +0 -0
  423. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/api/tool_allowlist.py +0 -0
  424. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/bench/__init__.py +0 -0
  425. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/bench/guard.py +0 -0
  426. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/bench/transcript.py +0 -0
  427. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/core/.gitkeep +0 -0
  428. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/core/freshness.py +0 -0
  429. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/core/generated.py +0 -0
  430. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/core/paths.py +0 -0
  431. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/guardian/__init__.py +0 -0
  432. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/guardian/axes.py +0 -0
  433. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/guardian/bench.py +0 -0
  434. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/guardian/calibrate.py +0 -0
  435. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/guardian/chunked.py +0 -0
  436. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/guardian/chunker.py +0 -0
  437. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/guardian/core.py +0 -0
  438. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/guardian/diff_index.py +0 -0
  439. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/guardian/evidence.py +0 -0
  440. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/guardian/findings.py +0 -0
  441. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/guardian/github_poster.py +0 -0
  442. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/guardian/metrics.py +0 -0
  443. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/guardian/prompts.py +0 -0
  444. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/guardian/providers/__init__.py +0 -0
  445. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/guardian/providers/base.py +0 -0
  446. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/guardian/providers/gemini.py +0 -0
  447. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/guardian/providers/mistral.py +0 -0
  448. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/guardian/providers/ollama.py +0 -0
  449. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/guardian/providers/openrouter.py +0 -0
  450. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/guardian/recording.py +0 -0
  451. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/guardian/render.py +0 -0
  452. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/guardian/review_fingerprint.py +0 -0
  453. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/guardian/runner.py +0 -0
  454. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/guardian/skeptic.py +0 -0
  455. /codegraph_brain-0.29.0/src/cgis/extractors/_python_ast.py → /codegraph_brain-0.31.0/src/cgis/languages/python/_syntax.py +0 -0
  456. /codegraph_brain-0.29.0/src/cgis/python_dependencies.py → /codegraph_brain-0.31.0/src/cgis/languages/python/dependencies.py +0 -0
  457. /codegraph_brain-0.29.0/src/cgis/extractors/_typescript_bindings.py → /codegraph_brain-0.31.0/src/cgis/languages/typescript/_bindings.py +0 -0
  458. /codegraph_brain-0.29.0/src/cgis/npm_dependencies.py → /codegraph_brain-0.31.0/src/cgis/languages/typescript/npm.py +0 -0
  459. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/py.typed +0 -0
  460. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/query/analysis/__init__.py +0 -0
  461. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/query/analysis/analyzer.py +0 -0
  462. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/query/analysis/anomaly.py +0 -0
  463. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/query/analysis/cohesion.py +0 -0
  464. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/query/analysis/overview.py +0 -0
  465. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/query/analysis/suggest_service.py +0 -0
  466. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/query/context/__init__.py +0 -0
  467. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/query/context/context_service.py +0 -0
  468. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/query/context/orphans.py +0 -0
  469. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/query/context/prompt.py +0 -0
  470. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/query/context/snippet.py +0 -0
  471. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/query/drift/__init__.py +0 -0
  472. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/query/drift/_scc.py +0 -0
  473. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/query/drift/catalog.py +0 -0
  474. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/query/drift/drift.py +0 -0
  475. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/query/drift/drift_service.py +0 -0
  476. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/query/drift/fingerprint.py +0 -0
  477. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/query/drift/fractal.py +0 -0
  478. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/query/drift/ontology_init.py +0 -0
  479. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/query/drift/quotient.py +0 -0
  480. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/query/drift/triads.py +0 -0
  481. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/query/fqn.py +0 -0
  482. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/query/render/__init__.py +0 -0
  483. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/query/render/graph_json.py +0 -0
  484. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/query/render/metrics.py +0 -0
  485. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/query/render/text.py +0 -0
  486. {codegraph_brain-0.29.0/src/cgis/extractors → codegraph_brain-0.31.0/src/cgis/resolver}/.gitkeep +0 -0
  487. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/src/cgis/resolver/__init__.py +0 -0
  488. {codegraph_brain-0.29.0/src/cgis/resolver → codegraph_brain-0.31.0/src/cgis/storage}/.gitkeep +0 -0
  489. {codegraph_brain-0.29.0/src/cgis/storage → codegraph_brain-0.31.0/tests/integration}/.gitkeep +0 -0
  490. {codegraph_brain-0.29.0/tests/integration → codegraph_brain-0.31.0/tests/self_parsing}/.gitkeep +0 -0
  491. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/self_parsing/__init__.py +0 -0
  492. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/self_parsing/test_fractal.py +0 -0
  493. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/self_parsing/test_overview.py +0 -0
  494. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/self_parsing/test_suggest.py +0 -0
  495. {codegraph_brain-0.29.0/tests/self_parsing → codegraph_brain-0.31.0/tests/unit}/.gitkeep +0 -0
  496. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/agent_ab_stubs.py +0 -0
  497. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/conftest.py +0 -0
  498. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/guardian_stubs.py +0 -0
  499. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test___main__.py +0 -0
  500. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_agent_ab_guard.py +0 -0
  501. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_agent_ab_script.py +0 -0
  502. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_agent_ab_transcript.py +0 -0
  503. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_analyzer.py +0 -0
  504. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_annotated_alias_receiver.py +0 -0
  505. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_auto_refresh.py +0 -0
  506. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_backfill_calibration_fingerprint.py +0 -0
  507. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_backfill_review_fingerprint.py +0 -0
  508. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_check_pytest_raises.py +0 -0
  509. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_check_test_count.py +0 -0
  510. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_cohesion.py +0 -0
  511. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_drift_service.py +0 -0
  512. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_features_source.py +0 -0
  513. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_find_symbol_path_prefix.py +0 -0
  514. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_fqn.py +0 -0
  515. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_fractal.py +0 -0
  516. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_gen_ideal_graph.py +0 -0
  517. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_generate_mcp_ref.py +0 -0
  518. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_generated.py +0 -0
  519. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_guardian_axes.py +0 -0
  520. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_guardian_bench.py +0 -0
  521. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_guardian_bench_script.py +0 -0
  522. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_guardian_calibrate.py +0 -0
  523. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_guardian_calibrate_script.py +0 -0
  524. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_guardian_chunked.py +0 -0
  525. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_guardian_chunker.py +0 -0
  526. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_guardian_core.py +0 -0
  527. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_guardian_diff_index.py +0 -0
  528. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_guardian_evidence.py +0 -0
  529. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_guardian_findings.py +0 -0
  530. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_guardian_martian_union.py +0 -0
  531. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_guardian_metrics.py +0 -0
  532. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_guardian_mistral_sampling.py +0 -0
  533. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_guardian_ollama_sampling.py +0 -0
  534. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_guardian_ollama_truncation.py +0 -0
  535. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_guardian_openrouter.py +0 -0
  536. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_guardian_poster.py +0 -0
  537. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_guardian_providers.py +0 -0
  538. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_guardian_providers_name.py +0 -0
  539. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_guardian_recording.py +0 -0
  540. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_guardian_render.py +0 -0
  541. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_guardian_replay_skeptic.py +0 -0
  542. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_guardian_review_script.py +0 -0
  543. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_guardian_runner.py +0 -0
  544. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_guardian_salvage.py +0 -0
  545. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_guardian_skeptic.py +0 -0
  546. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_health_scorer.py +0 -0
  547. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_impact_agent_sized.py +0 -0
  548. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_mcp_server.py +0 -0
  549. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_mcp_server_instructions.py +0 -0
  550. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_mcp_tool_schemas.py +0 -0
  551. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_metrics.py +0 -0
  552. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_metrics_file_coupling.py +0 -0
  553. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_models.py +0 -0
  554. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_ontology_compliance.py +0 -0
  555. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_ontology_init.py +0 -0
  556. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_orphans.py +0 -0
  557. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_overview.py +0 -0
  558. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_overview_tools.py +0 -0
  559. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_package_view.py +0 -0
  560. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_paths.py +0 -0
  561. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_prompt.py +0 -0
  562. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_query_coverage.py +0 -0
  563. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_quotient.py +0 -0
  564. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_recordings_from_corpus.py +0 -0
  565. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_resolver_import_layout.py +0 -0
  566. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_resolver_ts_workspaces.py +0 -0
  567. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_review_fingerprint_contract.py +0 -0
  568. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_review_fingerprint_digest.py +0 -0
  569. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_review_fingerprint_record.py +0 -0
  570. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_skeptic_arms.py +0 -0
  571. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_snippet.py +0 -0
  572. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_sqlite_store.py +0 -0
  573. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_suggest_service.py +0 -0
  574. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_temperature_source.py +0 -0
  575. {codegraph_brain-0.29.0 → codegraph_brain-0.31.0}/tests/unit/test_text_format.py +0 -0
  576. {codegraph_brain-0.29.0 → codegraph_brain-0.31.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.31.0"
3
+ }
@@ -1,5 +1,52 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.31.0](https://github.com/zaebee/codegraph-brain/compare/codegraph-brain-v0.30.0...codegraph-brain-v0.31.0) (2026-10-16)
4
+
5
+
6
+ ### Features
7
+
8
+ * **bench:** score Go method spellings ([#653](https://github.com/zaebee/codegraph-brain/issues/653)) ([3eccec7](https://github.com/zaebee/codegraph-brain/commit/3eccec74a01af9c128431714d47270badf739e7c))
9
+ * **go:** interface satisfaction compares arity, not just names ([#651](https://github.com/zaebee/codegraph-brain/issues/651)) ([05a8dd2](https://github.com/zaebee/codegraph-brain/commit/05a8dd2b5d7486733d74d9c139519c873a43d523))
10
+ * **go:** interface satisfaction dispatches; embedding no longer does ([#647](https://github.com/zaebee/codegraph-brain/issues/647)) ([ff785f7](https://github.com/zaebee/codegraph-brain/commit/ff785f7e40a91e159266d1c7cb38ed912a1ed676))
11
+ * **query:** a DISPATCHES hop costs no traversal depth ([#649](https://github.com/zaebee/codegraph-brain/issues/649)) ([b5c9ed9](https://github.com/zaebee/codegraph-brain/commit/b5c9ed91bec8b7c857e17f974f5d351c0c745094))
12
+ * **query:** coverage note screens test callers and says where each gap is ([#644](https://github.com/zaebee/codegraph-brain/issues/644)) ([814a679](https://github.com/zaebee/codegraph-brain/commit/814a67904f980048f9d699f14408b6f4a3732c4f))
13
+
14
+
15
+ ### Bug Fixes
16
+
17
+ * **logging:** the CLI and the MCP server log to stderr ([#619](https://github.com/zaebee/codegraph-brain/issues/619)) ([#622](https://github.com/zaebee/codegraph-brain/issues/622)) ([3fc1db2](https://github.com/zaebee/codegraph-brain/commit/3fc1db20d5c8a1cdb5793d357550c7854f499161))
18
+ * **resolver:** an Any-typed receiver declares no type ([#638](https://github.com/zaebee/codegraph-brain/issues/638)) ([4cb43b6](https://github.com/zaebee/codegraph-brain/commit/4cb43b676e43a82b3a9edf3a6175e34623b68bba))
19
+
20
+
21
+ ### Documentation
22
+
23
+ * **lab-notes:** exp1 — change radius and indirection vs agent cost (pre-registered) ([#633](https://github.com/zaebee/codegraph-brain/issues/633)) ([b6c002c](https://github.com/zaebee/codegraph-brain/commit/b6c002c9522a863b2412c06ca5130f622887ee40))
24
+ * **lab-notes:** exp2 — indirection at fixed radius and answer size, on cgis (pre-registered) ([#634](https://github.com/zaebee/codegraph-brain/issues/634)) ([c74c90d](https://github.com/zaebee/codegraph-brain/commit/c74c90d6dd4e13d5fcd52339ed7b699bce6fa535))
25
+ * **lab-notes:** exp3 — does cgis help an agent (pre-registered, kill criterion) ([#635](https://github.com/zaebee/codegraph-brain/issues/635)) ([507ada5](https://github.com/zaebee/codegraph-brain/commit/507ada5561147b7ec94fab9e8a3a21eb673755eb))
26
+ * **lab-notes:** exp3b — rerun after the [#636](https://github.com/zaebee/codegraph-brain/issues/636) fix (pre-registered) ([#640](https://github.com/zaebee/codegraph-brain/issues/640)) ([c5cb290](https://github.com/zaebee/codegraph-brain/commit/c5cb290eb993cbf7fcee78c092d7f6bb61aa22b0))
27
+
28
+ ## [0.30.0](https://github.com/zaebee/codegraph-brain/compare/codegraph-brain-v0.29.0...codegraph-brain-v0.30.0) (2026-10-15)
29
+
30
+
31
+ ### Features
32
+
33
+ * **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))
34
+ * **languages:** step 7b — the Go pilot ([#607](https://github.com/zaebee/codegraph-brain/issues/607)) ([4a62703](https://github.com/zaebee/codegraph-brain/commit/4a62703f41a4dfb74d1f96bee132b3f78f84c895))
35
+ * **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))
36
+ * **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))
37
+
38
+
39
+ ### Bug Fixes
40
+
41
+ * **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))
42
+
43
+
44
+ ### Documentation
45
+
46
+ * 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))
47
+ * 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))
48
+ * **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))
49
+
3
50
  ## [0.29.0](https://github.com/zaebee/codegraph-brain/compare/codegraph-brain-v0.28.0...codegraph-brain-v0.29.0) (2026-10-14)
4
51
 
5
52
 
@@ -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,31 @@ 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`, and optionally `dispatch` (which methods a call through
84
+ another type's may run; default: class hierarchy) — all reading the index as `ResolutionView`.
85
+ Metadata other files resolve against goes in the manifest's `cross_file_metadata`. `classify` answers for references from the pack's own files and
86
+ runs the whole chain; a source with no pack gets the generic tail in `SymbolIndex.classify_fqn`.
87
+ 3. Add one `Manifest` to `MANIFESTS` in `src/cgis/languages/__init__.py`, with a `load` function that
88
+ imports the pack statically inside it (lazy, yet visible to the review-fingerprint walk). Nothing
89
+ else names the pack: CLI, MCP server, guardian and scripts all go through the registry, and the
90
+ `surface-packs` forbidden-edge gate fails if a surface imports a pack directly.
91
+ 4. A pack never imports another pack or `cgis.storage` (`cross-pack`, `pack-isolation` gates).
92
+ 5. A pack's `__init__` imports no grammar: import the extractor inside `extractor()`. Config reading
93
+ goes in a `ProjectReader` (`cgis.core.project`) whose facts are data keyed by `ingest_state`
94
+ key — the collector (`cgis.import_names`), not the pack, writes them. A key other than the four
95
+ built-ins (`_FACT_SHAPES`) travels as `ImportNames.extra`: recorded, compared, and merged into the
96
+ `state` the pack's `index_facts` reads. Its value must read back equal from JSON (no tuples).
97
+ 6. A FILE node's id comes from `file_node_id`, its definitions' namespace from `scope_of`; they differ
98
+ only where several files share a scope (Go), which the FILE node declares as `metadata["scope"]`.
77
99
 
78
100
  ## Type Discipline
79
101
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: codegraph-brain
3
- Version: 0.29.0
3
+ Version: 0.31.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
@@ -0,0 +1,88 @@
1
+ """Exp1 gates, exactly as pre-registered (docs/lab-notes/2026-10-15-exp1-radius-indirection.md)."""
2
+ import json
3
+ import statistics as st
4
+ import sys
5
+ from collections import defaultdict
6
+
7
+ results, drift_path = sys.argv[1], sys.argv[2]
8
+ rows = [json.loads(l) for l in open(results)]
9
+ drift = json.load(open(drift_path))
10
+ by = defaultdict(list)
11
+ for r in rows:
12
+ by[r["task"]].append(r)
13
+
14
+ billing_note = f"runs {len(rows)}, failed {sum(1 for r in rows if r.get('is_error') or r.get('subtype') != 'success')}, total ${sum(r.get('cost_usd') or 0 for r in rows):.2f}"
15
+ print(billing_note)
16
+
17
+ tasks = {}
18
+ for t, rs in by.items():
19
+ cell = t.split("owner-exp1-")[1].split("-")[:2]
20
+ tasks[t] = {
21
+ "row": cell[0], "ind": cell[1] == "ind",
22
+ "cost": st.median(r["cost_usd"] for r in rs),
23
+ "recall": st.median(r["recall"] for r in rs),
24
+ "precision": st.median(r["precision"] for r in rs),
25
+ "calls": st.median(r["total_tool_calls"] for r in rs),
26
+ "n": len(rs), **drift[t],
27
+ }
28
+
29
+ print(f"\n{'task':52} {'cost':>6} {'recall':>6} {'prec':>5} {'calls':>5} {'files':>5} {'drift':>5}")
30
+ for t, v in sorted(tasks.items(), key=lambda kv: (kv[1]["row"], kv[1]["ind"], kv[1]["cost"])):
31
+ print(f"{t:52} {v['cost']:6.3f} {v['recall']:6.2f} {v['precision']:5.2f} {v['calls']:5.1f} {v['files']:5} {v['drift']:5.3f}")
32
+
33
+
34
+ def med(sel, key="cost"):
35
+ xs = [v[key] for v in tasks.values() if sel(v)]
36
+ return (st.median(xs), len(xs)) if xs else (float("nan"), 0)
37
+
38
+
39
+ print("\ncell medians (cost, recall):")
40
+ for row in ("big", "small"):
41
+ for ind in (False, True):
42
+ c, n = med(lambda v: v["row"] == row and v["ind"] == ind)
43
+ r, _ = med(lambda v: v["row"] == row and v["ind"] == ind, "recall")
44
+ print(f" {row:5} {'indirect' if ind else 'direct '} n={n:2} cost {c:.3f} recall {r:.2f}")
45
+
46
+ big, nb = med(lambda v: v["row"] == "big")
47
+ small, ns = med(lambda v: v["row"] == "small")
48
+ print(f"\nG1 radius: big {big:.3f} (n={nb}) / small {small:.3f} (n={ns}) = x{big / small:.2f} -> {'PASS' if big >= 1.5 * small else 'FAIL'} (>= x1.5)")
49
+
50
+ print("G2 indirection (descriptive; big x direct n=2):")
51
+ for row in ("big", "small"):
52
+ d, nd = med(lambda v: v["row"] == row and not v["ind"])
53
+ i, ni = med(lambda v: v["row"] == row and v["ind"])
54
+ rd, _ = med(lambda v: v["row"] == row and not v["ind"], "recall")
55
+ ri, _ = med(lambda v: v["row"] == row and v["ind"], "recall")
56
+ print(f" {row}: indirect/direct cost x{i / d:.2f} (n {ni}/{nd}), recall drop {rd - ri:+.2f}")
57
+
58
+
59
+ def ranks(xs):
60
+ order = sorted(range(len(xs)), key=lambda i: xs[i])
61
+ r = [0.0] * len(xs)
62
+ i = 0
63
+ while i < len(order):
64
+ j = i
65
+ while j + 1 < len(order) and xs[order[j + 1]] == xs[order[i]]:
66
+ j += 1
67
+ for k in range(i, j + 1):
68
+ r[order[k]] = (i + j) / 2 + 1
69
+ i = j + 1
70
+ return r
71
+
72
+
73
+ def pearson(a, b):
74
+ ma, mb = st.mean(a), st.mean(b)
75
+ num = sum((x - ma) * (y - mb) for x, y in zip(a, b))
76
+ den = (sum((x - ma) ** 2 for x in a) * sum((y - mb) ** 2 for y in b)) ** 0.5
77
+ return num / den
78
+
79
+
80
+ vs = list(tasks.values())
81
+ c, d, f = ranks([v["cost"] for v in vs]), ranks([v["drift"] for v in vs]), ranks([v["files"] for v in vs])
82
+ rcd, rcf, rdf = pearson(c, d), pearson(c, f), pearson(d, f)
83
+ partial = (rcd - rcf * rdf) / ((1 - rcf**2) * (1 - rdf**2)) ** 0.5
84
+ verdict = "PASS (drift adds nothing)" if abs(partial) < 0.2 else ("FAIL: drift matters, H1 refuted" if abs(partial) >= 0.3 else "INCONCLUSIVE")
85
+ print(f"\nG3 Spearman: cost~files {rcf:+.2f}, cost~drift {rcd:+.2f}, drift~files {rdf:+.2f}; partial cost~drift|files {partial:+.2f} -> {verdict}")
86
+ allr = [r["recall"] for r in rows]
87
+ print(f"G4 ceiling: recall 1.00 in {sum(x >= 0.999 for x in allr)}/{len(allr)} runs; min {min(allr):.2f}; "
88
+ f"{'every cell at 1.00 -> cost-only' if all(v['recall'] >= 0.999 for v in vs) else 'not every task at 1.00'}")
@@ -0,0 +1,54 @@
1
+ """Exp2 gates as pre-registered (paired). Usage: gates2.py results.jsonl pairs.json"""
2
+ import json, math, random, statistics as st, sys
3
+ from collections import defaultdict
4
+
5
+ rows = [json.loads(l) for l in open(sys.argv[1])]
6
+ pairs = json.load(open(sys.argv[2]))["pairs"]
7
+ by = defaultdict(list)
8
+ for r in rows:
9
+ by[r["task"]].append(r)
10
+ print(f"runs {len(rows)}, errors {sum(1 for r in rows if r.get('is_error') or r.get('subtype') != 'success')}, "
11
+ f"contaminated {sum(r['contaminated'] for r in rows)}, total ${sum(r['cost_usd'] or 0 for r in rows):.2f}")
12
+
13
+
14
+ def tid(fqn, cell):
15
+ return f"cgis-exp2-{cell}-" + fqn.rsplit(".", 1)[-1].strip("_").replace("_", "-")
16
+
17
+
18
+ def med(t, k):
19
+ return st.median(r[k] for r in by[t])
20
+
21
+
22
+ P = []
23
+ for n, (d, fd, sd, i, fi, si) in enumerate(pairs, 1):
24
+ td, ti = tid(d, "dir"), tid(i, "ind")
25
+ P.append({"n": n, "d": td, "i": ti, "ratio": med(ti, "cost_usd") / med(td, "cost_usd"),
26
+ "drec": med(td, "recall") - med(ti, "recall"),
27
+ "cd": med(td, "cost_usd"), "ci": med(ti, "cost_usd"), "rd": med(td, "recall"), "ri": med(ti, "recall")})
28
+ print(f"\n{'#':>2} {'direct':38} {'cost':>6} {'rec':>5} | {'indirect':38} {'cost':>6} {'rec':>5} | ratio Δrec")
29
+ for p in P:
30
+ print(f"{p['n']:>2} {p['d'][10:]:38} {p['cd']:6.3f} {p['rd']:5.2f} | {p['i'][10:]:38} {p['ci']:6.3f} {p['ri']:5.2f} | {p['ratio']:5.2f} {p['drec']:+.2f}")
31
+
32
+
33
+ def gate(ps, label):
34
+ ratios = [p["ratio"] for p in ps]
35
+ mr = st.median(ratios)
36
+ wins = sum(r > 1 for r in ratios)
37
+ need = math.ceil(0.75 * len(ps))
38
+ v = "PASS" if mr >= 1.3 and wins >= need else ("REFUTED (≤1.1)" if mr <= 1.1 else "INCONCLUSIVE")
39
+ rnd = random.Random(0)
40
+ boots = sorted(st.median(rnd.choice(ratios) for _ in ratios) for _ in range(10000))
41
+ lo, hi = boots[250], boots[9749]
42
+ md = st.median(p["drec"] for p in ps)
43
+ print(f"\n[{label}] n={len(ps)} G1 cost: median ratio {mr:.2f} (95% CI {lo:.2f}–{hi:.2f}), indirect dearer in {wins}/{len(ps)} (need {need}) -> {v}")
44
+ print(f"[{label}] G2 recall: median Δ(direct−indirect) {md:+.2f} -> {'PASS' if md >= 0.10 else 'not met'}")
45
+
46
+
47
+ gate(P, "all pairs")
48
+ gate([p for p in P if p["n"] != 3], "without pair 3")
49
+ allr = [r["recall"] for r in rows if "-desc-" not in r["task"]]
50
+ print(f"\nG4 ceiling: per run {sum(x >= 0.999 for x in allr)}/{len(allr)} paired runs at 1.00 (min {min(allr):.2f}); "
51
+ f"per pair-task median: {sum(1 for p in P for x in (p['rd'], p['ri']) if x >= 0.999)}/{2 * len(P)} at 1.00")
52
+ print("\nDescriptive (unpaired, dynamic hops):")
53
+ for t in sorted(t for t in by if "-desc-" in t):
54
+ print(f" {t[10:]:36} cost {med(t, 'cost_usd'):.3f} recall {med(t, 'recall'):.2f} precision {med(t, 'precision'):.2f}")
@@ -0,0 +1,71 @@
1
+ {
2
+ "pairs": [
3
+ [
4
+ "cgis.guardian.metrics.reject_metrics_path",
5
+ 3,
6
+ 5,
7
+ "cgis.guardian.core.GuardianReviewer._finder_pass",
8
+ 3,
9
+ 5
10
+ ],
11
+ [
12
+ "cgis.languages.extractors",
13
+ 4,
14
+ 4,
15
+ "cgis.storage.sqlite_store.SQLiteStore.get_edge_stats",
16
+ 5,
17
+ 6
18
+ ],
19
+ [
20
+ "cgis.query.drift.fractal.build_ladder",
21
+ 4,
22
+ 6,
23
+ "cgis.guardian.core._sanitize_finder_result",
24
+ 4,
25
+ 10
26
+ ],
27
+ [
28
+ "cgis.query.fqn.resolve_fqn",
29
+ 4,
30
+ 13,
31
+ "cgis.query.render.metrics._as_terms",
32
+ 4,
33
+ 12
34
+ ],
35
+ [
36
+ "cgis.guardian.skeptic.visible_findings",
37
+ 5,
38
+ 6,
39
+ "cgis.storage.sqlite_store.SQLiteStore.get_incoming_edges",
40
+ 5,
41
+ 8
42
+ ],
43
+ [
44
+ "cgis.query.context.prompt._loc",
45
+ 5,
46
+ 10,
47
+ "cgis.query.drift.drift.DriftScorer.fit_templates",
48
+ 6,
49
+ 10
50
+ ],
51
+ [
52
+ "cgis.query.fqn.effective_prefix",
53
+ 7,
54
+ 15,
55
+ "cgis.query.drift.drift._fit_config",
56
+ 6,
57
+ 12
58
+ ]
59
+ ],
60
+ "unpaired": [
61
+ "cgis.guardian.render.render_finding",
62
+ "cgis.languages.go.naming._relative",
63
+ "cgis.languages.python._syntax.resolve_relative_module",
64
+ "cgis.languages.python._types.TypeResolver._first_top_level_arg",
65
+ "cgis.query.render.metrics._segment_exclusion",
66
+ "cgis.languages.python._annotations._collect",
67
+ "cgis.core.js_globals.specifier_fqn",
68
+ "cgis.guardian.providers.base.BaseProvider._record_usage",
69
+ "cgis.pipeline.refresh_dispatch"
70
+ ]
71
+ }
@@ -0,0 +1,34 @@
1
+ """Exp2 post-review recompute (#634 review C1): pair 2 dropped, extractors rescored on corrected gold.
2
+
3
+ Run from the repository root: uv run python benchmarks/agent_ab/analysis/exp2_post_review.py
4
+ """
5
+ import json, random, statistics as st
6
+ from pathlib import Path
7
+ from cgis.bench.agent_task import load_tasks, score_answer
8
+ from cgis.bench.transcript import parse_transcript
9
+
10
+ tasks = {t.id: t for t in load_tasks(Path("benchmarks/agent_ab/tasks"))}
11
+ rows = [json.loads(l) for l in open("benchmarks/agent_ab/results-exp2-full.jsonl")]
12
+ for r in rows:
13
+ if r["task"].endswith("dir-extractors"):
14
+ tr = Path(r["transcript"])
15
+ if not tr.is_file(): # transcripts are git-ignored; a clean clone has only the stored scores
16
+ print(f"extractors run {r['run']}: transcript absent, stored precision {r['precision']:.2f}")
17
+ continue
18
+ s = score_answer(tasks[r["task"]], parse_transcript(tr.read_text().splitlines()).answer)
19
+ print(f"extractors run {r['run']}: recall {s.recall:.2f} precision {s.precision:.2f} (stored {r['precision']:.2f})")
20
+ cost = {}
21
+ for r in rows:
22
+ cost.setdefault(r["task"], []).append(r["cost_usd"])
23
+ pairs = [("reject-metrics-path", "finder-pass"), ("build-ladder", "sanitize-finder-result"), ("resolve-fqn", "as-terms"),
24
+ ("visible-findings", "get-incoming-edges"), ("loc", "fit-templates"), ("effective-prefix", "fit-config")]
25
+ rat = [st.median(cost["cgis-exp2-ind-" + i]) / st.median(cost["cgis-exp2-dir-" + d]) for d, i in pairs]
26
+ rnd = random.Random(0)
27
+ b = sorted(st.median(rnd.choice(rat) for _ in rat) for _ in range(10000))
28
+ m = st.median(rat)
29
+ v = "PASS" if m >= 1.3 and sum(x > 1 for x in rat) >= 5 else ("REFUTED" if m <= 1.1 else "INCONCLUSIVE")
30
+ print(f"6 pairs: ratios {[round(x, 2) for x in rat]}, median {m:.3f}, 95% CI {b[250]:.2f}-{b[9749]:.2f}, dearer {sum(x > 1 for x in rat)}/6 -> {v}")
31
+ gm = 1.0
32
+ for x in rat:
33
+ gm *= x
34
+ print(f"geometric mean {gm ** (1 / len(rat)):.3f}")
@@ -0,0 +1,76 @@
1
+ """Exp3 gates as pre-registered. Usage: exp3_gates.py forced.jsonl (control is the stored exp1/exp2 full runs)."""
2
+ import json, random, statistics as st, sys
3
+ from collections import defaultdict
4
+
5
+ FORCED = sys.argv[1]
6
+ CONTROL = ["benchmarks/agent_ab/results-exp1-full.jsonl", "benchmarks/agent_ab/results-exp2-full.jsonl"]
7
+ # Declared post-hoc gold corrections to stored control recall (lab notes exp1 C1, exp2 C1).
8
+ RECALL_FIX = {("owner-exp1-big-ind-thread-for", 0): 1.0, ("owner-exp1-big-ind-thread-for", 1): 1.0,
9
+ ("owner-exp1-big-ind-thread-for", 2): 0.949}
10
+
11
+
12
+ def load(paths, arm):
13
+ by = defaultdict(list)
14
+ for p in paths:
15
+ for line in open(p):
16
+ r = json.loads(line)
17
+ if r["arm"] != arm:
18
+ continue
19
+ r["recall"] = RECALL_FIX.get((r["task"], r["run"]), r["recall"]) if arm == "control" else r["recall"]
20
+ by[r["task"]].append(r)
21
+ return by
22
+
23
+
24
+ ctl, frc = load(CONTROL, "control"), load([FORCED], "cgis-forced")
25
+ rows = [r for rs in frc.values() for r in rs]
26
+ print(f"forced runs {len(rows)}, errors {sum(1 for r in rows if r.get('is_error') or r.get('subtype') != 'success')}, "
27
+ f"contaminated {sum(r['contaminated'] for r in rows)}, cost ${sum(r['cost_usd'] or 0 for r in rows):.2f}, "
28
+ f"sessions with 0 cgis calls {sum(1 for r in rows if not r.get('cgis_calls'))}")
29
+
30
+
31
+ def med(rs, k):
32
+ return st.median(r[k] for r in rs)
33
+
34
+
35
+ def is_primary(t):
36
+ return t.startswith("owner-exp1-big-ind-") or t.startswith("cgis-exp2-desc-")
37
+
38
+
39
+ T = {}
40
+ for t in sorted(set(ctl) & set(frc)):
41
+ T[t] = {"ratio": med(frc[t], "cost_usd") / med(ctl[t], "cost_usd"),
42
+ "drec": med(frc[t], "recall") - med(ctl[t], "recall"),
43
+ "pc": med(ctl[t], "precision"), "pf": med(frc[t], "precision"),
44
+ "cc": med(ctl[t], "cost_usd"), "cf": med(frc[t], "cost_usd"),
45
+ "calls": med(frc[t], "cgis_calls"), "turns_c": med(ctl[t], "turns"), "turns_f": med(frc[t], "turns")}
46
+ missing = sorted(set(ctl) ^ set(frc))
47
+ if missing:
48
+ print("tasks not in both arms:", missing)
49
+ print(f"\n{'task':52} {'ctl$':>6} {'cgis$':>6} {'ratio':>5} {'Δrec':>6} {'P ctl':>5} {'P cgis':>6} {'calls':>5}")
50
+ for t, v in T.items():
51
+ print(f"{'*' if is_primary(t) else ' '}{t:51} {v['cc']:6.3f} {v['cf']:6.3f} {v['ratio']:5.2f} {v['drec']:+6.2f} {v['pc']:5.2f} {v['pf']:6.2f} {v['calls']:5.1f}")
52
+
53
+ prim = [v for t, v in T.items() if is_primary(t)]
54
+ r = [v["ratio"] for v in prim]
55
+ mr, md = st.median(r), st.median(v["drec"] for v in prim)
56
+ rnd = random.Random(0)
57
+ b = sorted(st.median(rnd.choice(r) for _ in r) for _ in range(10000))
58
+ helps = mr <= 0.80 and md >= -0.02
59
+ print(f"\nPRIMARY (n={len(prim)}): median cost ratio {mr:.3f} (95% CI {b[250]:.2f}-{b[9749]:.2f}), "
60
+ f"median Δrecall {md:+.3f} -> {'HELPS (keep positioning)' if helps else 'DOES NOT HELP (kill agent-context positioning)'}")
61
+ print(f"PRIMARY precision: control {st.median(v['pc'] for v in prim):.2f}, cgis-forced {st.median(v['pf'] for v in prim):.2f}")
62
+
63
+
64
+ def cell(t):
65
+ p = t.split("-")
66
+ return "-".join(p[:4]) if t.startswith("owner-exp1") else "-".join(p[:3])
67
+
68
+
69
+ groups = defaultdict(list)
70
+ for t, v in T.items():
71
+ groups[cell(t)].append(v)
72
+ print("\nSECONDARY by cell:")
73
+ for g, vs in sorted(groups.items()):
74
+ print(f" {g:24} n={len(vs):2} median ratio {st.median(v['ratio'] for v in vs):.2f} Δrecall {st.median(v['drec'] for v in vs):+.2f}")
75
+ allr = [v["ratio"] for v in T.values()]
76
+ print(f" ALL n={len(allr)} median ratio {st.median(allr):.2f}")