codegraph-brain 0.19.0__tar.gz → 0.20.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 (359) hide show
  1. codegraph_brain-0.20.0/.release-please-manifest.json +3 -0
  2. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/CHANGELOG.md +12 -0
  3. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/PKG-INFO +1 -1
  4. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/how-to/MCP_REFERENCE.md +13 -5
  5. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/pyproject.toml +1 -1
  6. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/api/mcp_server.py +47 -12
  7. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/cli.py +27 -6
  8. codegraph_brain-0.20.0/src/cgis/core/coverage.py +57 -0
  9. codegraph_brain-0.20.0/src/cgis/query/engine.py +340 -0
  10. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/query/render/graph_json.py +16 -3
  11. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/storage/sqlite_store.py +26 -0
  12. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_cli.py +35 -0
  13. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_graph_json.py +28 -0
  14. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_mcp_server.py +30 -0
  15. codegraph_brain-0.20.0/tests/unit/test_query_coverage.py +395 -0
  16. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/uv.lock +1 -1
  17. codegraph_brain-0.19.0/.release-please-manifest.json +0 -3
  18. codegraph_brain-0.19.0/src/cgis/query/engine.py +0 -170
  19. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/.claude-plugin/marketplace.json +0 -0
  20. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/.gitattributes +0 -0
  21. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/.github/test-count-baseline +0 -0
  22. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/.github/workflows/autodoc.yml +0 -0
  23. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/.github/workflows/ci.yml +0 -0
  24. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/.github/workflows/guardian.yml +0 -0
  25. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/.github/workflows/pr-title.yml +0 -0
  26. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/.github/workflows/release-please.yml +0 -0
  27. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/.gitignore +0 -0
  28. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/.pre-commit-config.yaml +0 -0
  29. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/.python-version +0 -0
  30. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/CLAUDE.md +0 -0
  31. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/CONTRIBUTING.md +0 -0
  32. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/LICENSE +0 -0
  33. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/Makefile +0 -0
  34. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/PRIVACY.md +0 -0
  35. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/README.md +0 -0
  36. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/guardian/CURATION.md +0 -0
  37. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/guardian/calibration.jsonl +0 -0
  38. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/guardian/experiments/246-cross-vendor/README.md +0 -0
  39. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/guardian/experiments/246-cross-vendor/free-nemotron-quota-cutoff.jsonl +0 -0
  40. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/guardian/experiments/401-evidence/README.md +0 -0
  41. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/guardian/experiments/401-evidence/pr-399-control-rows.jsonl +0 -0
  42. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/guardian/experiments/401-evidence/pr-399-recording.json +0 -0
  43. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/guardian/experiments/401-evidence/pr-399-treatment-rows.jsonl +0 -0
  44. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/guardian/experiments/407-no-checker-appeal/README.md +0 -0
  45. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/guardian/experiments/407-no-checker-appeal/pr-399-control-directive-rows.jsonl +0 -0
  46. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/guardian/experiments/407-no-checker-appeal/pr-399-control-prohibition-rows.jsonl +0 -0
  47. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/guardian/pr-122.yaml +0 -0
  48. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/guardian/pr-140.yaml +0 -0
  49. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/guardian/pr-141.yaml +0 -0
  50. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/guardian/pr-142.yaml +0 -0
  51. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/guardian/pr-143.yaml +0 -0
  52. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/guardian/pr-144.yaml +0 -0
  53. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/guardian/pr-278.yaml +0 -0
  54. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/guardian/pr-313.yaml +0 -0
  55. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/guardian/results.jsonl +0 -0
  56. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/martian/README.md +0 -0
  57. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/martian/cal_dot_com.json +0 -0
  58. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/martian/discourse.json +0 -0
  59. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/martian/grafana.json +0 -0
  60. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/martian/keycloak.json +0 -0
  61. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/martian/sentry.json +0 -0
  62. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/martian-judged.jsonl +0 -0
  63. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/martian-p3-judged-run1.jsonl +0 -0
  64. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/martian-p3-judged-run1.jsonl.corrupted-backup +0 -0
  65. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/martian-p3-run1.jsonl +0 -0
  66. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/martian-p3-run2.jsonl +0 -0
  67. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/martian-p3-run3.jsonl +0 -0
  68. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/martian-plan.json +0 -0
  69. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/martian-repeat-judged.jsonl +0 -0
  70. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/martian-repeat-reviews.jsonl +0 -0
  71. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/benchmarks/martian-reviews.jsonl +0 -0
  72. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/data/.gitkeep +0 -0
  73. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/AUDIT.md +0 -0
  74. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/CASE_STUDY.md +0 -0
  75. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/GUARDIAN_LOCAL_BENCH.md +0 -0
  76. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/GUARDIAN_REMOTE_OLLAMA.md +0 -0
  77. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/architecture/HOW_IT_WORKS.md +0 -0
  78. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/architecture/ONTOLOGY.md +0 -0
  79. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/architecture/PATTERNS_AND_TRIADS.md +0 -0
  80. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/architecture/SELF_PORTRAIT.md +0 -0
  81. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/architecture/diagrams/pipeline_flow.mermaid +0 -0
  82. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/architecture/health_badge.json +0 -0
  83. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/assets/.gitignore +0 -0
  84. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/assets/cgis-app-avatar.png +0 -0
  85. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/assets/cgis-app-avatar.svg +0 -0
  86. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/assets/generate_avatar.py +0 -0
  87. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/examples/.gitkeep +0 -0
  88. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/how-to/AGENT_ONBOARDING.md +0 -0
  89. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/how-to/CLI_USAGE.md +0 -0
  90. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/lab-notes/2026-06-11-chunked-review-negative-result.md +0 -0
  91. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/ontology/.gitkeep +0 -0
  92. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/ontology/core.yaml +0 -0
  93. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/ontology/domains.yaml +0 -0
  94. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/ontology/patterns.yaml +0 -0
  95. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/ontology/tolerances.lock +0 -0
  96. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/plans/2026-09-09-graph-freshness.md +0 -0
  97. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-06-09-domain-pattern-fingerprint-design.md +0 -0
  98. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-06-09-pattern-alphabet-motif-basis-design.md +0 -0
  99. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-06-10-guardian-sprint-design.md +0 -0
  100. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-06-11-fastapi-di-edges-design.md +0 -0
  101. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-06-11-guardian-chunked-review-design.md +0 -0
  102. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-06-11-guardian-chunker-design.md +0 -0
  103. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-06-11-mcp-drift-validate-fqn-design.md +0 -0
  104. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-06-11-resolver-split-design.md +0 -0
  105. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-06-11-symbol-import-edges-design.md +0 -0
  106. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-06-12-drift-empty-domains-design.md +0 -0
  107. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-06-12-gate-semantics-design.md +0 -0
  108. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-06-12-init-ontology-design.md +0 -0
  109. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-06-12-release-please-ci-design.md +0 -0
  110. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-06-13-suggest-packages-design.md +0 -0
  111. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-06-13-tangle-anti-pattern-design.md +0 -0
  112. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-07-29-guardian-skeptic-scoring-design.md +0 -0
  113. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-07-30-cgis-fractal-design.md +0 -0
  114. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-07-30-cgis-fractal-plan.md +0 -0
  115. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-07-30-chunk-source-filter-design.md +0 -0
  116. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-07-30-chunk-source-filter-plan.md +0 -0
  117. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-07-30-genai-client-close-design.md +0 -0
  118. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-07-30-genai-client-close-plan.md +0 -0
  119. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-07-30-guardian-precision-bench-design.md +0 -0
  120. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-07-30-guardian-precision-bench-plan.md +0 -0
  121. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-07-30-guardian-timeout-retry-design.md +0 -0
  122. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-07-30-guardian-timeout-retry-plan.md +0 -0
  123. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-07-31-finder-bug-class-taxonomy.md +0 -0
  124. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-08-01-aura-autoevolution-poc.md +0 -0
  125. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-08-11-guardian-code-review-bench.md +0 -0
  126. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-08-14-review-fingerprint-design.md +0 -0
  127. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-09-05-annotation-graph-design.md +0 -0
  128. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/2026-09-09-graph-freshness-design.md +0 -0
  129. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/BLUEPRINT.md +0 -0
  130. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/PRD.md +0 -0
  131. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/TDD.md +0 -0
  132. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/plans/2026-06-09-fingerprint-drift.md +0 -0
  133. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/plans/2026-06-10-guardian-context-skeptic-inline.md +0 -0
  134. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/plans/2026-06-10-guardian-structured-findings-bench.md +0 -0
  135. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/plans/2026-06-10-motif-basis-part-b.md +0 -0
  136. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/plans/2026-06-10-unified-pattern-alphabet.md +0 -0
  137. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/plans/2026-06-11-fastapi-di-edges.md +0 -0
  138. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/plans/2026-06-11-guardian-chunked-review.md +0 -0
  139. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/plans/2026-06-11-guardian-chunker.md +0 -0
  140. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/plans/2026-06-11-mcp-drift-validate-fqn.md +0 -0
  141. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/plans/2026-06-11-resolver-split.md +0 -0
  142. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/plans/2026-06-12-drift-empty-domains.md +0 -0
  143. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/plans/2026-06-12-gate-semantics.md +0 -0
  144. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/plans/2026-06-12-init-ontology.md +0 -0
  145. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/plans/2026-06-12-release-please-ci.md +0 -0
  146. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/plans/2026-06-12-symbol-import-edges.md +0 -0
  147. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/plans/2026-06-13-suggest-packages.md +0 -0
  148. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/plans/2026-07-29-guardian-skeptic-scoring.md +0 -0
  149. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/plans/2026-08-14-review-fingerprint.md +0 -0
  150. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/plans/2026-09-05-annotation-graph-pr1.md +0 -0
  151. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/docs/specs/plans/2026-09-05-annotation-graph-pr2.md +0 -0
  152. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/main.py +0 -0
  153. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/plugin/.claude-plugin/plugin.json +0 -0
  154. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/plugin/.mcp.json +0 -0
  155. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/plugin/README.md +0 -0
  156. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/plugin/skills/cgis/SKILL.md +0 -0
  157. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/plugin/skills/ingest/SKILL.md +0 -0
  158. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/release-please-config.json +0 -0
  159. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/scripts/backfill_calibration_fingerprint.py +0 -0
  160. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/scripts/backfill_review_fingerprint.py +0 -0
  161. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/scripts/check_pytest_raises.py +0 -0
  162. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/scripts/check_test_count.py +0 -0
  163. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/scripts/colab_bench.sh +0 -0
  164. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/scripts/gen_ideal_graph.py +0 -0
  165. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/scripts/generate_health.py +0 -0
  166. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/scripts/generate_mcp_ref.py +0 -0
  167. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/scripts/generate_schema_docs.py +0 -0
  168. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/scripts/guardian_bench.py +0 -0
  169. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/scripts/guardian_calibrate.py +0 -0
  170. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/scripts/guardian_martian.py +0 -0
  171. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/scripts/guardian_replay_skeptic.py +0 -0
  172. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/scripts/guardian_review.py +0 -0
  173. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/scripts/inject_readme_graph.py +0 -0
  174. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/scripts/ollama_visitor.sh +0 -0
  175. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/scripts/probe_closure_gap.py +0 -0
  176. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/scripts/probe_tier_ladder.py +0 -0
  177. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/scripts/recordings_from_corpus.py +0 -0
  178. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/scripts/skeptic_arms.py +0 -0
  179. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/__init__.py +0 -0
  180. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/__main__.py +0 -0
  181. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/api/.gitkeep +0 -0
  182. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/api/__init__.py +0 -0
  183. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/core/.gitkeep +0 -0
  184. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/core/freshness.py +0 -0
  185. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/core/generated.py +0 -0
  186. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/core/models.py +0 -0
  187. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/core/paths.py +0 -0
  188. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/extractors/.gitkeep +0 -0
  189. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/extractors/_python_annotations.py +0 -0
  190. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/extractors/_python_ast.py +0 -0
  191. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/extractors/_python_classes.py +0 -0
  192. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/extractors/_python_functions.py +0 -0
  193. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/extractors/_python_imports.py +0 -0
  194. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/extractors/_python_types.py +0 -0
  195. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/extractors/base.py +0 -0
  196. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/extractors/python_extractor.py +0 -0
  197. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/extractors/registry.py +0 -0
  198. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/extractors/typescript_extractor.py +0 -0
  199. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/guardian/__init__.py +0 -0
  200. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/guardian/axes.py +0 -0
  201. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/guardian/bench.py +0 -0
  202. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/guardian/calibrate.py +0 -0
  203. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/guardian/chunked.py +0 -0
  204. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/guardian/chunker.py +0 -0
  205. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/guardian/collector.py +0 -0
  206. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/guardian/core.py +0 -0
  207. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/guardian/diff_index.py +0 -0
  208. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/guardian/evidence.py +0 -0
  209. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/guardian/findings.py +0 -0
  210. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/guardian/github_poster.py +0 -0
  211. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/guardian/martian.py +0 -0
  212. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/guardian/metrics.py +0 -0
  213. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/guardian/prompts.py +0 -0
  214. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/guardian/providers/__init__.py +0 -0
  215. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/guardian/providers/base.py +0 -0
  216. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/guardian/providers/gemini.py +0 -0
  217. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/guardian/providers/mistral.py +0 -0
  218. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/guardian/providers/ollama.py +0 -0
  219. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/guardian/providers/openrouter.py +0 -0
  220. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/guardian/recording.py +0 -0
  221. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/guardian/render.py +0 -0
  222. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/guardian/review_fingerprint.py +0 -0
  223. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/guardian/runner.py +0 -0
  224. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/guardian/skeptic.py +0 -0
  225. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/pipeline.py +0 -0
  226. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/py.typed +0 -0
  227. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/query/analysis/__init__.py +0 -0
  228. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/query/analysis/analyzer.py +0 -0
  229. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/query/analysis/anomaly.py +0 -0
  230. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/query/analysis/cohesion.py +0 -0
  231. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/query/analysis/health.py +0 -0
  232. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/query/analysis/suggest_service.py +0 -0
  233. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/query/context/__init__.py +0 -0
  234. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/query/context/audit.py +0 -0
  235. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/query/context/context_service.py +0 -0
  236. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/query/context/orphans.py +0 -0
  237. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/query/context/prompt.py +0 -0
  238. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/query/context/snippet.py +0 -0
  239. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/query/drift/__init__.py +0 -0
  240. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/query/drift/_scc.py +0 -0
  241. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/query/drift/drift.py +0 -0
  242. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/query/drift/drift_service.py +0 -0
  243. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/query/drift/fingerprint.py +0 -0
  244. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/query/drift/fractal.py +0 -0
  245. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/query/drift/ontology_init.py +0 -0
  246. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/query/drift/quotient.py +0 -0
  247. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/query/drift/triads.py +0 -0
  248. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/query/fqn.py +0 -0
  249. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/query/render/__init__.py +0 -0
  250. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/query/render/mermaid.py +0 -0
  251. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/query/render/metrics.py +0 -0
  252. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/resolver/.gitkeep +0 -0
  253. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/resolver/__init__.py +0 -0
  254. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/resolver/engine.py +0 -0
  255. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/resolver/indices.py +0 -0
  256. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/resolver/symbols.py +0 -0
  257. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/resolver/uplift.py +0 -0
  258. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/src/cgis/storage/.gitkeep +0 -0
  259. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/integration/.gitkeep +0 -0
  260. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/self_parsing/.gitkeep +0 -0
  261. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/self_parsing/__init__.py +0 -0
  262. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/self_parsing/conftest.py +0 -0
  263. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/self_parsing/test_annotation_calibration.py +0 -0
  264. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/self_parsing/test_architecture.py +0 -0
  265. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/self_parsing/test_drift.py +0 -0
  266. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/self_parsing/test_fractal.py +0 -0
  267. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/self_parsing/test_init_ontology_roundtrip.py +0 -0
  268. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/self_parsing/test_receiver_resolution.py +0 -0
  269. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/self_parsing/test_self_parse.py +0 -0
  270. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/self_parsing/test_self_parse_ts.py +0 -0
  271. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/self_parsing/test_suggest.py +0 -0
  272. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/.gitkeep +0 -0
  273. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/conftest.py +0 -0
  274. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/guardian_stubs.py +0 -0
  275. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/review_path_inventory.txt +0 -0
  276. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test___main__.py +0 -0
  277. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_analyzer.py +0 -0
  278. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_annotation_edges.py +0 -0
  279. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_audit.py +0 -0
  280. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_backfill_calibration_fingerprint.py +0 -0
  281. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_backfill_review_fingerprint.py +0 -0
  282. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_check_pytest_raises.py +0 -0
  283. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_check_test_count.py +0 -0
  284. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_cohesion.py +0 -0
  285. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_context_service.py +0 -0
  286. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_di_acceptance.py +0 -0
  287. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_drift.py +0 -0
  288. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_drift_service.py +0 -0
  289. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_extractor_registry.py +0 -0
  290. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_fingerprint.py +0 -0
  291. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_fqn.py +0 -0
  292. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_fractal.py +0 -0
  293. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_freshness.py +0 -0
  294. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_gen_ideal_graph.py +0 -0
  295. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_generate_mcp_ref.py +0 -0
  296. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_generated.py +0 -0
  297. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_axes.py +0 -0
  298. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_bench.py +0 -0
  299. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_bench_script.py +0 -0
  300. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_calibrate.py +0 -0
  301. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_calibrate_script.py +0 -0
  302. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_chunked.py +0 -0
  303. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_chunker.py +0 -0
  304. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_collector.py +0 -0
  305. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_core.py +0 -0
  306. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_diff_index.py +0 -0
  307. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_evidence.py +0 -0
  308. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_findings.py +0 -0
  309. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_martian.py +0 -0
  310. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_martian_script.py +0 -0
  311. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_martian_union.py +0 -0
  312. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_metrics.py +0 -0
  313. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_mistral_sampling.py +0 -0
  314. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_ollama_sampling.py +0 -0
  315. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_ollama_truncation.py +0 -0
  316. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_openrouter.py +0 -0
  317. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_poster.py +0 -0
  318. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_providers.py +0 -0
  319. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_providers_name.py +0 -0
  320. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_recording.py +0 -0
  321. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_render.py +0 -0
  322. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_replay_skeptic.py +0 -0
  323. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_review_script.py +0 -0
  324. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_runner.py +0 -0
  325. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_salvage.py +0 -0
  326. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_guardian_skeptic.py +0 -0
  327. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_health_scorer.py +0 -0
  328. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_import_acceptance.py +0 -0
  329. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_mermaid.py +0 -0
  330. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_metrics.py +0 -0
  331. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_models.py +0 -0
  332. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_name_load_positions.py +0 -0
  333. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_ontology_compliance.py +0 -0
  334. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_ontology_init.py +0 -0
  335. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_orphans.py +0 -0
  336. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_paths.py +0 -0
  337. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_patterns_yaml.py +0 -0
  338. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_pipeline.py +0 -0
  339. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_prompt.py +0 -0
  340. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_python_annotations.py +0 -0
  341. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_python_extractor.py +0 -0
  342. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_quotient.py +0 -0
  343. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_recordings_from_corpus.py +0 -0
  344. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_resolver.py +0 -0
  345. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_resolver_indices.py +0 -0
  346. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_resolver_symbols.py +0 -0
  347. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_review_fingerprint_closure.py +0 -0
  348. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_review_fingerprint_contract.py +0 -0
  349. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_review_fingerprint_digest.py +0 -0
  350. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_review_fingerprint_record.py +0 -0
  351. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_self_types.py +0 -0
  352. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_skeptic_arms.py +0 -0
  353. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_snippet.py +0 -0
  354. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_sqlite_store.py +0 -0
  355. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_suggest_service.py +0 -0
  356. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_temperature_source.py +0 -0
  357. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_triads.py +0 -0
  358. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_typescript_extractor.py +0 -0
  359. {codegraph_brain-0.19.0 → codegraph_brain-0.20.0}/tests/unit/test_uplift.py +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.20.0"
3
+ }
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.20.0](https://github.com/zaebee/codegraph-brain/compare/codegraph-brain-v0.19.0...codegraph-brain-v0.20.0) (2026-09-11)
4
+
5
+
6
+ ### Features
7
+
8
+ * **query:** a traversal says how much of its neighbourhood resolved ([#201](https://github.com/zaebee/codegraph-brain/issues/201)) ([#448](https://github.com/zaebee/codegraph-brain/issues/448)) ([0c63469](https://github.com/zaebee/codegraph-brain/commit/0c634697789f5264316c8a218e993f13a9a0f73f))
9
+
10
+
11
+ ### Documentation
12
+
13
+ * auto-sync architecture graph and MCP reference ([#449](https://github.com/zaebee/codegraph-brain/issues/449)) ([e9eccae](https://github.com/zaebee/codegraph-brain/commit/e9eccae8d43e8dc264ca87f8ea0a45752471f079))
14
+
3
15
  ## [0.19.0](https://github.com/zaebee/codegraph-brain/compare/codegraph-brain-v0.18.0...codegraph-brain-v0.19.0) (2026-09-09)
4
16
 
5
17
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: codegraph-brain
3
- Version: 0.19.0
3
+ Version: 0.20.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
@@ -10,9 +10,13 @@
10
10
  Analyse transitive upstream callers of a specific FQN.
11
11
 
12
12
  Answers "what breaks if I change X?". ``output_format="mermaid"`` (default)
13
- returns a diagram; ``"json"`` returns a joinable ``{root, nodes, edges}``
14
- payload with real FQNs — letting an agent compute set differences (e.g.
15
- "which route handlers never reach ``verify_ownership``?") directly.
13
+ returns a diagram; ``"json"`` returns a joinable ``{root, nodes, edges,
14
+ coverage}`` payload with real FQNs — letting an agent compute set
15
+ differences (e.g. "which route handlers never reach ``verify_ownership``?")
16
+ directly. ``coverage`` counts unresolved calls whose name matches a
17
+ traversed function, method or class: callers that may be missing, named in
18
+ ``top_unresolved``. It is an upper bound — a common name matches calls on
19
+ unrelated objects, which the names make visible.
16
20
 
17
21
  | Argument | Type | Required | Description |
18
22
  | :--- | :--- | :---: | :--- |
@@ -325,8 +329,12 @@ Suggest sub-package boundaries for a package from its dependency communities.
325
329
  Trace the execution call-graph starting from a specific FQN downwards.
326
330
 
327
331
  ``output_format="mermaid"`` (default) returns a human-readable diagram;
328
- ``"json"`` returns a joinable ``{root, nodes, edges}`` payload with real
329
- FQNs (not display hashes) for agent/CI use. Use ``cgis_ingest`` first if
332
+ ``"json"`` returns a joinable ``{root, nodes, edges, coverage}`` payload
333
+ with real FQNs (not display hashes) for agent/CI use. ``coverage`` counts
334
+ the calls the traversed functions make that resolved to nothing, and
335
+ ``top_unresolved`` names the most frequent. Read the names, not only the
336
+ ratio: in Python most are methods on untyped locals (``logger.info``,
337
+ ``items.append``), which cut nothing short. Use ``cgis_ingest`` first if
330
338
  the database does not exist yet.
331
339
 
332
340
  | Argument | Type | Required | Description |
@@ -7,7 +7,7 @@ packages = ["src/cgis"]
7
7
 
8
8
  [project]
9
9
  name = "codegraph-brain"
10
- version = "0.19.0"
10
+ version = "0.20.0"
11
11
  description = "Semantic code graph for AI agents — deterministic FQN resolution, impact analysis and architectural drift gates, exposed over MCP."
12
12
  readme = "README.md"
13
13
  requires-python = ">=3.12"
@@ -13,6 +13,7 @@ from typing import Any
13
13
  import structlog
14
14
  from mcp.server.mcpserver import MCPServer
15
15
 
16
+ from cgis.core.coverage import TraversalCoverage
16
17
  from cgis.core.freshness import Freshness, FreshnessState
17
18
  from cgis.core.models import Edge, Node, NodeType
18
19
  from cgis.extractors.python_extractor import PythonExtractor
@@ -64,6 +65,11 @@ def _blank_fqn_error(fqn: str) -> str | None:
64
65
  return None
65
66
 
66
67
 
68
+ def _wants_json(output_format: str) -> bool:
69
+ """True when a traversal will be rendered as JSON — the only shape that carries coverage."""
70
+ return output_format.strip().lower() == "json"
71
+
72
+
67
73
  def _render_subgraph_with_freshness(
68
74
  db_path: str,
69
75
  output_format: str,
@@ -72,10 +78,11 @@ def _render_subgraph_with_freshness(
72
78
  title: str,
73
79
  nodes: list[Node],
74
80
  edges: list[Edge],
81
+ coverage: TraversalCoverage | None = None,
75
82
  ) -> str:
76
83
  """`_render_subgraph`, with this database's freshness measured for it (#175)."""
77
84
  return _render_subgraph(
78
- output_format, root, note, title, nodes, edges, _graph_freshness(db_path)
85
+ output_format, root, note, title, nodes, edges, _graph_freshness(db_path), coverage
79
86
  )
80
87
 
81
88
 
@@ -87,6 +94,7 @@ def _render_subgraph(
87
94
  nodes: list[Node],
88
95
  edges: list[Edge],
89
96
  freshness: "Freshness | None" = None,
97
+ coverage: TraversalCoverage | None = None,
90
98
  ) -> str:
91
99
  """Render a traversal result as a Mermaid diagram or joinable JSON (#171).
92
100
 
@@ -98,11 +106,12 @@ def _render_subgraph(
98
106
  ``freshness`` is placed differently in each: a key inside the JSON object,
99
107
  a prose note above the diagram. Prefixing the JSON would make it unparseable
100
108
  exactly when the graph goes stale, and this renderer is the only place that
101
- knows which shape it is about to produce (#175).
109
+ knows which shape it is about to produce (#175). ``coverage`` (#201) rides
110
+ in the JSON only.
102
111
  """
103
112
  fmt = output_format.strip().lower()
104
113
  if fmt == "json":
105
- payload = graph_to_json(root, nodes, edges)
114
+ payload = graph_to_json(root, nodes, edges, coverage)
106
115
  if freshness is not None and freshness.state is not FreshnessState.FRESH:
107
116
  payload = {**payload, "freshness": freshness.model_dump()}
108
117
  return json.dumps(payload, indent=2)
@@ -300,8 +309,12 @@ def cgis_trace_flow(
300
309
  """Trace the execution call-graph starting from a specific FQN downwards.
301
310
 
302
311
  ``output_format="mermaid"`` (default) returns a human-readable diagram;
303
- ``"json"`` returns a joinable ``{root, nodes, edges}`` payload with real
304
- FQNs (not display hashes) for agent/CI use. Use ``cgis_ingest`` first if
312
+ ``"json"`` returns a joinable ``{root, nodes, edges, coverage}`` payload
313
+ with real FQNs (not display hashes) for agent/CI use. ``coverage`` counts
314
+ the calls the traversed functions make that resolved to nothing, and
315
+ ``top_unresolved`` names the most frequent. Read the names, not only the
316
+ ratio: in Python most are methods on untyped locals (``logger.info``,
317
+ ``items.append``), which cut nothing short. Use ``cgis_ingest`` first if
305
318
  the database does not exist yet.
306
319
  """
307
320
  if blank := _blank_fqn_error(fqn):
@@ -313,13 +326,22 @@ def cgis_trace_flow(
313
326
  res = resolve_fqn(store, fqn)
314
327
  if res.resolved is None:
315
328
  return _resolution_error(fqn, res.candidates, res.truncated)
316
- nodes, edges = QueryEngine(store).get_flow_graph(res.resolved, max_depth=depth)
329
+ result = QueryEngine(store).get_flow_result(
330
+ res.resolved, max_depth=depth, with_coverage=_wants_json(output_format)
331
+ )
317
332
  except Exception as exc:
318
333
  return f"❌ {exc}"
319
334
 
320
335
  note = f"> Resolved '{fqn}' → '{res.resolved}'\n\n" if res.via_suffix else ""
321
336
  return _render_subgraph_with_freshness(
322
- db_path, output_format, res.resolved, note, "Execution flow for", nodes, edges
337
+ db_path,
338
+ output_format,
339
+ res.resolved,
340
+ note,
341
+ "Execution flow for",
342
+ result.nodes,
343
+ result.edges,
344
+ result.coverage,
323
345
  )
324
346
 
325
347
 
@@ -330,9 +352,13 @@ def cgis_analyze_impact(
330
352
  """Analyse transitive upstream callers of a specific FQN.
331
353
 
332
354
  Answers "what breaks if I change X?". ``output_format="mermaid"`` (default)
333
- returns a diagram; ``"json"`` returns a joinable ``{root, nodes, edges}``
334
- payload with real FQNs — letting an agent compute set differences (e.g.
335
- "which route handlers never reach ``verify_ownership``?") directly.
355
+ returns a diagram; ``"json"`` returns a joinable ``{root, nodes, edges,
356
+ coverage}`` payload with real FQNs — letting an agent compute set
357
+ differences (e.g. "which route handlers never reach ``verify_ownership``?")
358
+ directly. ``coverage`` counts unresolved calls whose name matches a
359
+ traversed function, method or class: callers that may be missing, named in
360
+ ``top_unresolved``. It is an upper bound — a common name matches calls on
361
+ unrelated objects, which the names make visible.
336
362
  """
337
363
  if blank := _blank_fqn_error(fqn):
338
364
  return blank
@@ -343,13 +369,22 @@ def cgis_analyze_impact(
343
369
  res = resolve_fqn(store, fqn)
344
370
  if res.resolved is None:
345
371
  return _resolution_error(fqn, res.candidates, res.truncated)
346
- nodes, edges = QueryEngine(store).get_impact_graph(res.resolved, max_depth=depth)
372
+ result = QueryEngine(store).get_impact_result(
373
+ res.resolved, max_depth=depth, with_coverage=_wants_json(output_format)
374
+ )
347
375
  except Exception as exc:
348
376
  return f"❌ {exc}"
349
377
 
350
378
  note = f"> Resolved '{fqn}' → '{res.resolved}'\n\n" if res.via_suffix else ""
351
379
  return _render_subgraph_with_freshness(
352
- db_path, output_format, res.resolved, note, "Impact analysis for", nodes, edges
380
+ db_path,
381
+ output_format,
382
+ res.resolved,
383
+ note,
384
+ "Impact analysis for",
385
+ result.nodes,
386
+ result.edges,
387
+ result.coverage,
353
388
  )
354
389
 
355
390
 
@@ -31,6 +31,7 @@ from rich.table import Table
31
31
  from rich.tree import Tree
32
32
 
33
33
  from cgis import __app_name__, __version__
34
+ from cgis.core.coverage import TraversalCoverage
34
35
  from cgis.core.freshness import FreshnessState
35
36
  from cgis.core.models import VIRTUAL_FILE_PATH, Edge, EdgeType, Node, NodeNamespace, NodeType
36
37
  from cgis.extractors.python_extractor import file_path_to_module_fqn
@@ -287,12 +288,17 @@ def _render_graph(
287
288
  nodes: list[Node],
288
289
  edges: list[Edge],
289
290
  internal_only: bool = False,
291
+ coverage: TraversalCoverage | None = None,
290
292
  ) -> str:
291
- """Render a subgraph for a non-text format (Mermaid for eyes, JSON for agents)."""
293
+ """Render a subgraph for a non-text format (Mermaid for eyes, JSON for agents).
294
+
295
+ ``coverage`` was measured by the engine before ``internal_only`` filters
296
+ anything, so the filter cannot hide the unresolved calls it removes (#201).
297
+ """
292
298
  if internal_only:
293
299
  nodes, edges = _filter_internal(nodes, edges)
294
300
  if output_format == OutputFormat.JSON:
295
- return _json.dumps(graph_to_json(root, nodes, edges), indent=2)
301
+ return _json.dumps(graph_to_json(root, nodes, edges, coverage), indent=2)
296
302
  return MermaidCompiler().compile(nodes, edges)
297
303
 
298
304
 
@@ -412,14 +418,19 @@ def trace(
412
418
  raise typer.Exit(code=1)
413
419
 
414
420
  if output_format != OutputFormat.TEXT:
415
- nodes, edges = QueryEngine(store).get_flow_graph(
421
+ flow = QueryEngine(store).get_flow_result(
416
422
  start,
423
+ with_coverage=output_format == OutputFormat.JSON,
417
424
  max_depth=depth,
418
425
  allowed_edge_types=allowed,
419
426
  show_external=show_external,
420
427
  min_confidence=min_confidence,
421
428
  )
422
- typer.echo(_render_graph(output_format, start, nodes, edges, internal_only))
429
+ typer.echo(
430
+ _render_graph(
431
+ output_format, start, flow.nodes, flow.edges, internal_only, flow.coverage
432
+ )
433
+ )
423
434
  else:
424
435
  if internal_only:
425
436
  raise typer.BadParameter(_INTERNAL_ONLY_TEXT_ERR)
@@ -544,14 +555,24 @@ def impact(
544
555
  raise typer.Exit(code=1)
545
556
 
546
557
  if output_format != OutputFormat.TEXT:
547
- nodes, edges = QueryEngine(store).get_impact_graph(
558
+ impact_result = QueryEngine(store).get_impact_result(
548
559
  target,
560
+ with_coverage=output_format == OutputFormat.JSON,
549
561
  max_depth=depth,
550
562
  allowed_edge_types=allowed,
551
563
  show_external=show_external,
552
564
  min_confidence=min_confidence,
553
565
  )
554
- typer.echo(_render_graph(output_format, target, nodes, edges, internal_only))
566
+ typer.echo(
567
+ _render_graph(
568
+ output_format,
569
+ target,
570
+ impact_result.nodes,
571
+ impact_result.edges,
572
+ internal_only,
573
+ impact_result.coverage,
574
+ )
575
+ )
555
576
  else:
556
577
  if internal_only:
557
578
  raise typer.BadParameter(_INTERNAL_ONLY_TEXT_ERR)
@@ -0,0 +1,57 @@
1
+ """How much of a traversal's neighbourhood the graph could actually place (#201).
2
+
3
+ `cgis validate` reports resolution health for the whole graph. An agent holding
4
+ one `trace_flow` or `analyze_impact` answer needs the local version: were the
5
+ calls around *this* result resolved, or is the answer short because they were not?
6
+ """
7
+
8
+ from collections.abc import Mapping
9
+ from typing import Literal
10
+
11
+ from pydantic import BaseModel, ConfigDict, Field, computed_field
12
+
13
+ #: How many unresolved targets a coverage report names. The counts cover all of them.
14
+ TOP_UNRESOLVED_LIMIT = 10
15
+
16
+ #: What `calls_unresolved` counts, which differs by traversal direction.
17
+ #:
18
+ #: ``unresolved_calls_made`` — calls the expanded nodes make that resolved to
19
+ #: nothing: dead ends downstream. Exact.
20
+ #:
21
+ #: ``unresolved_calls_by_name`` — unresolved calls anywhere in the graph whose
22
+ #: called name matches an expanded node: callers that may be missing upstream.
23
+ #: An upper bound — a name is not an identity, and a common one (``items``)
24
+ #: matches calls on unrelated objects.
25
+ CoverageBasis = Literal["unresolved_calls_made", "unresolved_calls_by_name"]
26
+
27
+
28
+ def rank_unresolved(counts: Mapping[str, int]) -> list[tuple[str, int]]:
29
+ """The most frequent unresolved targets first, ties by name, at most `TOP_UNRESOLVED_LIMIT`."""
30
+ return sorted(counts.items(), key=lambda item: (-item[1], item[0]))[:TOP_UNRESOLVED_LIMIT]
31
+
32
+
33
+ class TraversalCoverage(BaseModel):
34
+ """Resolution coverage of the CALLS edges around one traversal result.
35
+
36
+ ``top_unresolved`` names what the counts are made of, because a ratio alone
37
+ cannot tell ``logger.info`` from ``billing.charge``. On cgis's own
38
+ ``IngestionPipeline.run`` (``cgis trace --depth 3`` at 7eb324b) 92 of 235
39
+ calls are unresolved, and the most frequent are ``logger.info``,
40
+ ``edge.model_copy`` and ``resolved_edges.append`` — methods on untyped
41
+ locals, none of them a first-party call the flow is missing.
42
+ """
43
+
44
+ model_config = ConfigDict(frozen=True)
45
+
46
+ basis: CoverageBasis
47
+ calls_examined: int
48
+ calls_unresolved: int
49
+ top_unresolved: list[tuple[str, int]] = Field(default_factory=list)
50
+
51
+ @computed_field # type: ignore[prop-decorator]
52
+ @property
53
+ def unresolved_ratio(self) -> float:
54
+ """Share of the examined calls that are unresolved; 0.0 when none were examined."""
55
+ if not self.calls_examined:
56
+ return 0.0
57
+ return self.calls_unresolved / self.calls_examined