codegraph-brain 0.11.0__tar.gz → 0.14.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 (318) hide show
  1. codegraph_brain-0.14.0/.gitattributes +6 -0
  2. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/.github/workflows/ci.yml +31 -1
  3. codegraph_brain-0.14.0/.pre-commit-config.yaml +45 -0
  4. codegraph_brain-0.14.0/.release-please-manifest.json +3 -0
  5. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/CHANGELOG.md +59 -0
  6. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/PKG-INFO +3 -1
  7. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/README.md +2 -0
  8. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/benchmarks/guardian/CURATION.md +97 -0
  9. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/benchmarks/guardian/calibration.jsonl +236 -236
  10. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/benchmarks/guardian/results.jsonl +118 -118
  11. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/benchmarks/martian/README.md +11 -0
  12. codegraph_brain-0.14.0/benchmarks/martian-judged.jsonl +109 -0
  13. codegraph_brain-0.14.0/benchmarks/martian-p3-judged-run1.jsonl +2 -0
  14. codegraph_brain-0.14.0/benchmarks/martian-p3-judged-run1.jsonl.corrupted-backup +11 -0
  15. codegraph_brain-0.14.0/benchmarks/martian-p3-run1.jsonl +19 -0
  16. codegraph_brain-0.14.0/benchmarks/martian-p3-run2.jsonl +19 -0
  17. codegraph_brain-0.14.0/benchmarks/martian-p3-run3.jsonl +7 -0
  18. codegraph_brain-0.14.0/benchmarks/martian-repeat-judged.jsonl +6 -0
  19. codegraph_brain-0.14.0/benchmarks/martian-repeat-reviews.jsonl +6 -0
  20. codegraph_brain-0.14.0/benchmarks/martian-reviews.jsonl +64 -0
  21. codegraph_brain-0.14.0/docs/GUARDIAN_LOCAL_BENCH.md +157 -0
  22. codegraph_brain-0.14.0/docs/GUARDIAN_REMOTE_OLLAMA.md +105 -0
  23. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/specs/2026-08-11-guardian-code-review-bench.md +620 -2
  24. codegraph_brain-0.14.0/docs/specs/2026-08-14-review-fingerprint-design.md +545 -0
  25. codegraph_brain-0.14.0/docs/specs/plans/2026-08-14-review-fingerprint.md +1389 -0
  26. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/pyproject.toml +1 -1
  27. codegraph_brain-0.14.0/scripts/backfill_calibration_fingerprint.py +246 -0
  28. codegraph_brain-0.14.0/scripts/backfill_review_fingerprint.py +314 -0
  29. codegraph_brain-0.14.0/scripts/check_pytest_raises.py +152 -0
  30. codegraph_brain-0.14.0/scripts/colab_bench.sh +90 -0
  31. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/scripts/guardian_bench.py +58 -8
  32. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/scripts/guardian_calibrate.py +37 -0
  33. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/scripts/guardian_martian.py +386 -42
  34. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/scripts/guardian_review.py +15 -2
  35. codegraph_brain-0.14.0/scripts/ollama_visitor.sh +107 -0
  36. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/guardian/calibrate.py +39 -1
  37. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/guardian/core.py +30 -4
  38. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/guardian/findings.py +64 -1
  39. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/guardian/martian.py +318 -3
  40. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/guardian/metrics.py +4 -0
  41. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/guardian/providers/base.py +45 -0
  42. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/guardian/providers/gemini.py +4 -0
  43. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/guardian/providers/mistral.py +49 -2
  44. codegraph_brain-0.14.0/src/cgis/guardian/providers/ollama.py +211 -0
  45. codegraph_brain-0.14.0/src/cgis/guardian/review_fingerprint.py +288 -0
  46. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/guardian/runner.py +183 -8
  47. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/conftest.py +45 -1
  48. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/guardian_stubs.py +8 -0
  49. codegraph_brain-0.14.0/tests/unit/review_path_inventory.txt +43 -0
  50. codegraph_brain-0.14.0/tests/unit/test_backfill_calibration_fingerprint.py +745 -0
  51. codegraph_brain-0.14.0/tests/unit/test_backfill_review_fingerprint.py +454 -0
  52. codegraph_brain-0.14.0/tests/unit/test_check_pytest_raises.py +119 -0
  53. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test_fingerprint.py +3 -1
  54. codegraph_brain-0.14.0/tests/unit/test_guardian_bench_script.py +195 -0
  55. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test_guardian_calibrate_script.py +92 -0
  56. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test_guardian_chunked.py +3 -0
  57. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test_guardian_core.py +20 -1
  58. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test_guardian_martian.py +2 -0
  59. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test_guardian_martian_script.py +822 -8
  60. codegraph_brain-0.14.0/tests/unit/test_guardian_martian_union.py +347 -0
  61. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test_guardian_metrics.py +37 -0
  62. codegraph_brain-0.14.0/tests/unit/test_guardian_mistral_sampling.py +213 -0
  63. codegraph_brain-0.14.0/tests/unit/test_guardian_ollama_sampling.py +254 -0
  64. codegraph_brain-0.14.0/tests/unit/test_guardian_ollama_truncation.py +204 -0
  65. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test_guardian_providers.py +4 -0
  66. codegraph_brain-0.14.0/tests/unit/test_guardian_providers_name.py +128 -0
  67. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test_guardian_runner.py +248 -0
  68. codegraph_brain-0.14.0/tests/unit/test_guardian_salvage.py +299 -0
  69. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test_guardian_skeptic.py +3 -0
  70. codegraph_brain-0.14.0/tests/unit/test_review_fingerprint_closure.py +259 -0
  71. codegraph_brain-0.14.0/tests/unit/test_review_fingerprint_contract.py +211 -0
  72. codegraph_brain-0.14.0/tests/unit/test_review_fingerprint_digest.py +226 -0
  73. codegraph_brain-0.14.0/tests/unit/test_review_fingerprint_record.py +25 -0
  74. codegraph_brain-0.14.0/tests/unit/test_temperature_source.py +168 -0
  75. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/uv.lock +43 -46
  76. codegraph_brain-0.11.0/.pre-commit-config.yaml +0 -27
  77. codegraph_brain-0.11.0/.release-please-manifest.json +0 -3
  78. codegraph_brain-0.11.0/benchmarks/martian-judged.jsonl +0 -1
  79. codegraph_brain-0.11.0/benchmarks/martian-reviews.jsonl +0 -1
  80. codegraph_brain-0.11.0/src/cgis/guardian/providers/ollama.py +0 -99
  81. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/.claude-plugin/marketplace.json +0 -0
  82. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/.github/workflows/autodoc.yml +0 -0
  83. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/.github/workflows/guardian.yml +0 -0
  84. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/.github/workflows/pr-title.yml +0 -0
  85. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/.github/workflows/release-please.yml +0 -0
  86. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/.gitignore +0 -0
  87. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/.python-version +0 -0
  88. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/CLAUDE.md +0 -0
  89. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/CONTRIBUTING.md +0 -0
  90. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/LICENSE +0 -0
  91. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/Makefile +0 -0
  92. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/PRIVACY.md +0 -0
  93. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/benchmarks/guardian/pr-122.yaml +0 -0
  94. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/benchmarks/guardian/pr-140.yaml +0 -0
  95. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/benchmarks/guardian/pr-141.yaml +0 -0
  96. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/benchmarks/guardian/pr-142.yaml +0 -0
  97. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/benchmarks/guardian/pr-143.yaml +0 -0
  98. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/benchmarks/guardian/pr-144.yaml +0 -0
  99. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/benchmarks/guardian/pr-278.yaml +0 -0
  100. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/benchmarks/guardian/pr-313.yaml +0 -0
  101. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/benchmarks/martian/cal_dot_com.json +0 -0
  102. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/benchmarks/martian/discourse.json +0 -0
  103. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/benchmarks/martian/grafana.json +0 -0
  104. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/benchmarks/martian/keycloak.json +0 -0
  105. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/benchmarks/martian/sentry.json +0 -0
  106. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/benchmarks/martian-plan.json +0 -0
  107. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/data/.gitkeep +0 -0
  108. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/AUDIT.md +0 -0
  109. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/CASE_STUDY.md +0 -0
  110. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/architecture/HOW_IT_WORKS.md +0 -0
  111. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/architecture/ONTOLOGY.md +0 -0
  112. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/architecture/PATTERNS_AND_TRIADS.md +0 -0
  113. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/architecture/SELF_PORTRAIT.md +0 -0
  114. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/architecture/diagrams/pipeline_flow.mermaid +0 -0
  115. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/architecture/health_badge.json +0 -0
  116. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/assets/.gitignore +0 -0
  117. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/assets/cgis-app-avatar.png +0 -0
  118. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/assets/cgis-app-avatar.svg +0 -0
  119. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/assets/generate_avatar.py +0 -0
  120. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/examples/.gitkeep +0 -0
  121. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/how-to/AGENT_ONBOARDING.md +0 -0
  122. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/how-to/CLI_USAGE.md +0 -0
  123. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/how-to/MCP_REFERENCE.md +0 -0
  124. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/lab-notes/2026-06-11-chunked-review-negative-result.md +0 -0
  125. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/ontology/.gitkeep +0 -0
  126. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/ontology/core.yaml +0 -0
  127. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/ontology/domains.yaml +0 -0
  128. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/ontology/patterns.yaml +0 -0
  129. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/ontology/tolerances.lock +0 -0
  130. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/specs/2026-06-09-domain-pattern-fingerprint-design.md +0 -0
  131. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/specs/2026-06-09-pattern-alphabet-motif-basis-design.md +0 -0
  132. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/specs/2026-06-10-guardian-sprint-design.md +0 -0
  133. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/specs/2026-06-11-fastapi-di-edges-design.md +0 -0
  134. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/specs/2026-06-11-guardian-chunked-review-design.md +0 -0
  135. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/specs/2026-06-11-guardian-chunker-design.md +0 -0
  136. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/specs/2026-06-11-mcp-drift-validate-fqn-design.md +0 -0
  137. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/specs/2026-06-11-resolver-split-design.md +0 -0
  138. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/specs/2026-06-11-symbol-import-edges-design.md +0 -0
  139. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/specs/2026-06-12-drift-empty-domains-design.md +0 -0
  140. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/specs/2026-06-12-gate-semantics-design.md +0 -0
  141. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/specs/2026-06-12-init-ontology-design.md +0 -0
  142. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/specs/2026-06-12-release-please-ci-design.md +0 -0
  143. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/specs/2026-06-13-suggest-packages-design.md +0 -0
  144. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/specs/2026-06-13-tangle-anti-pattern-design.md +0 -0
  145. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/specs/2026-07-29-guardian-skeptic-scoring-design.md +0 -0
  146. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/specs/2026-07-30-cgis-fractal-design.md +0 -0
  147. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/specs/2026-07-30-cgis-fractal-plan.md +0 -0
  148. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/specs/2026-07-30-chunk-source-filter-design.md +0 -0
  149. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/specs/2026-07-30-chunk-source-filter-plan.md +0 -0
  150. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/specs/2026-07-30-genai-client-close-design.md +0 -0
  151. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/specs/2026-07-30-genai-client-close-plan.md +0 -0
  152. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/specs/2026-07-30-guardian-precision-bench-design.md +0 -0
  153. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/specs/2026-07-30-guardian-precision-bench-plan.md +0 -0
  154. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/specs/2026-07-30-guardian-timeout-retry-design.md +0 -0
  155. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/specs/2026-07-30-guardian-timeout-retry-plan.md +0 -0
  156. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/specs/2026-07-31-finder-bug-class-taxonomy.md +0 -0
  157. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/specs/2026-08-01-aura-autoevolution-poc.md +0 -0
  158. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/specs/BLUEPRINT.md +0 -0
  159. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/specs/PRD.md +0 -0
  160. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/specs/TDD.md +0 -0
  161. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/specs/plans/2026-06-09-fingerprint-drift.md +0 -0
  162. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/specs/plans/2026-06-10-guardian-context-skeptic-inline.md +0 -0
  163. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/specs/plans/2026-06-10-guardian-structured-findings-bench.md +0 -0
  164. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/specs/plans/2026-06-10-motif-basis-part-b.md +0 -0
  165. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/specs/plans/2026-06-10-unified-pattern-alphabet.md +0 -0
  166. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/specs/plans/2026-06-11-fastapi-di-edges.md +0 -0
  167. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/specs/plans/2026-06-11-guardian-chunked-review.md +0 -0
  168. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/specs/plans/2026-06-11-guardian-chunker.md +0 -0
  169. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/specs/plans/2026-06-11-mcp-drift-validate-fqn.md +0 -0
  170. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/specs/plans/2026-06-11-resolver-split.md +0 -0
  171. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/specs/plans/2026-06-12-drift-empty-domains.md +0 -0
  172. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/specs/plans/2026-06-12-gate-semantics.md +0 -0
  173. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/specs/plans/2026-06-12-init-ontology.md +0 -0
  174. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/specs/plans/2026-06-12-release-please-ci.md +0 -0
  175. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/specs/plans/2026-06-12-symbol-import-edges.md +0 -0
  176. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/specs/plans/2026-06-13-suggest-packages.md +0 -0
  177. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/docs/specs/plans/2026-07-29-guardian-skeptic-scoring.md +0 -0
  178. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/main.py +0 -0
  179. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/plugin/.claude-plugin/plugin.json +0 -0
  180. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/plugin/.mcp.json +0 -0
  181. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/plugin/README.md +0 -0
  182. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/plugin/skills/cgis/SKILL.md +0 -0
  183. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/plugin/skills/ingest/SKILL.md +0 -0
  184. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/release-please-config.json +0 -0
  185. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/scripts/gen_ideal_graph.py +0 -0
  186. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/scripts/generate_health.py +0 -0
  187. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/scripts/generate_mcp_ref.py +0 -0
  188. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/scripts/generate_schema_docs.py +0 -0
  189. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/scripts/inject_readme_graph.py +0 -0
  190. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/scripts/probe_closure_gap.py +0 -0
  191. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/scripts/probe_tier_ladder.py +0 -0
  192. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/__init__.py +0 -0
  193. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/__main__.py +0 -0
  194. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/api/.gitkeep +0 -0
  195. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/api/__init__.py +0 -0
  196. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/api/mcp_server.py +0 -0
  197. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/cli.py +0 -0
  198. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/core/.gitkeep +0 -0
  199. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/core/models.py +0 -0
  200. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/extractors/.gitkeep +0 -0
  201. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/extractors/_python_ast.py +0 -0
  202. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/extractors/_python_classes.py +0 -0
  203. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/extractors/_python_functions.py +0 -0
  204. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/extractors/_python_imports.py +0 -0
  205. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/extractors/_python_types.py +0 -0
  206. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/extractors/base.py +0 -0
  207. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/extractors/python_extractor.py +0 -0
  208. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/extractors/registry.py +0 -0
  209. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/extractors/typescript_extractor.py +0 -0
  210. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/guardian/__init__.py +0 -0
  211. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/guardian/axes.py +0 -0
  212. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/guardian/bench.py +0 -0
  213. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/guardian/chunked.py +0 -0
  214. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/guardian/chunker.py +0 -0
  215. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/guardian/collector.py +0 -0
  216. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/guardian/diff_index.py +0 -0
  217. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/guardian/github_poster.py +0 -0
  218. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/guardian/prompts.py +0 -0
  219. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/guardian/providers/__init__.py +0 -0
  220. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/guardian/recording.py +0 -0
  221. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/guardian/render.py +0 -0
  222. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/guardian/skeptic.py +0 -0
  223. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/pipeline.py +0 -0
  224. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/py.typed +0 -0
  225. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/query/analysis/__init__.py +0 -0
  226. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/query/analysis/analyzer.py +0 -0
  227. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/query/analysis/anomaly.py +0 -0
  228. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/query/analysis/cohesion.py +0 -0
  229. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/query/analysis/health.py +0 -0
  230. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/query/analysis/suggest_service.py +0 -0
  231. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/query/context/__init__.py +0 -0
  232. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/query/context/audit.py +0 -0
  233. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/query/context/context_service.py +0 -0
  234. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/query/context/prompt.py +0 -0
  235. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/query/context/snippet.py +0 -0
  236. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/query/drift/__init__.py +0 -0
  237. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/query/drift/_scc.py +0 -0
  238. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/query/drift/drift.py +0 -0
  239. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/query/drift/drift_service.py +0 -0
  240. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/query/drift/fingerprint.py +0 -0
  241. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/query/drift/fractal.py +0 -0
  242. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/query/drift/ontology_init.py +0 -0
  243. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/query/drift/quotient.py +0 -0
  244. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/query/drift/triads.py +0 -0
  245. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/query/engine.py +0 -0
  246. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/query/fqn.py +0 -0
  247. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/query/render/__init__.py +0 -0
  248. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/query/render/graph_json.py +0 -0
  249. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/query/render/mermaid.py +0 -0
  250. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/query/render/metrics.py +0 -0
  251. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/resolver/.gitkeep +0 -0
  252. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/resolver/__init__.py +0 -0
  253. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/resolver/engine.py +0 -0
  254. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/resolver/indices.py +0 -0
  255. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/resolver/symbols.py +0 -0
  256. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/resolver/uplift.py +0 -0
  257. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/storage/.gitkeep +0 -0
  258. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/src/cgis/storage/sqlite_store.py +0 -0
  259. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/integration/.gitkeep +0 -0
  260. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/self_parsing/.gitkeep +0 -0
  261. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/self_parsing/__init__.py +0 -0
  262. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/self_parsing/conftest.py +0 -0
  263. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/self_parsing/test_architecture.py +0 -0
  264. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/self_parsing/test_drift.py +0 -0
  265. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/self_parsing/test_fractal.py +0 -0
  266. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/self_parsing/test_init_ontology_roundtrip.py +0 -0
  267. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/self_parsing/test_self_parse.py +0 -0
  268. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/self_parsing/test_self_parse_ts.py +0 -0
  269. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/self_parsing/test_suggest.py +0 -0
  270. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/.gitkeep +0 -0
  271. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test___main__.py +0 -0
  272. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test_analyzer.py +0 -0
  273. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test_audit.py +0 -0
  274. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test_cli.py +0 -0
  275. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test_cohesion.py +0 -0
  276. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test_context_service.py +0 -0
  277. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test_di_acceptance.py +0 -0
  278. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test_drift.py +0 -0
  279. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test_drift_service.py +0 -0
  280. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test_extractor_registry.py +0 -0
  281. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test_fqn.py +0 -0
  282. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test_fractal.py +0 -0
  283. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test_gen_ideal_graph.py +0 -0
  284. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test_generate_mcp_ref.py +0 -0
  285. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test_graph_json.py +0 -0
  286. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test_guardian_axes.py +0 -0
  287. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test_guardian_bench.py +0 -0
  288. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test_guardian_calibrate.py +0 -0
  289. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test_guardian_chunker.py +0 -0
  290. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test_guardian_collector.py +0 -0
  291. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test_guardian_diff_index.py +0 -0
  292. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test_guardian_findings.py +0 -0
  293. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test_guardian_poster.py +0 -0
  294. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test_guardian_recording.py +0 -0
  295. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test_guardian_render.py +0 -0
  296. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test_guardian_review_script.py +0 -0
  297. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test_health_scorer.py +0 -0
  298. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test_import_acceptance.py +0 -0
  299. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test_mcp_server.py +0 -0
  300. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test_mermaid.py +0 -0
  301. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test_metrics.py +0 -0
  302. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test_models.py +0 -0
  303. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test_ontology_compliance.py +0 -0
  304. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test_ontology_init.py +0 -0
  305. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test_patterns_yaml.py +0 -0
  306. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test_pipeline.py +0 -0
  307. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test_prompt.py +0 -0
  308. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test_python_extractor.py +0 -0
  309. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test_quotient.py +0 -0
  310. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test_resolver.py +0 -0
  311. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test_resolver_indices.py +0 -0
  312. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test_resolver_symbols.py +0 -0
  313. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test_snippet.py +0 -0
  314. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test_sqlite_store.py +0 -0
  315. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test_suggest_service.py +0 -0
  316. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test_triads.py +0 -0
  317. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test_typescript_extractor.py +0 -0
  318. {codegraph_brain-0.11.0 → codegraph_brain-0.14.0}/tests/unit/test_uplift.py +0 -0
@@ -0,0 +1,6 @@
1
+ # The review fingerprint (#375) hashes file bytes, so a checkout that stores
2
+ # CRLF would produce a different digest for identical code — and the measured
3
+ # digest would disagree with the reconstructed one on the same commit. Pinned
4
+ # rather than normalised at hash time, because a normaliser can only fail by
5
+ # merging two reviewers that differ.
6
+ *.py text eol=lf
@@ -115,6 +115,34 @@ jobs:
115
115
  # Deliberately scoped to scripts/. src/ keeps the rule — metrics.py:70
116
116
  # is library code and its instance deserves a real answer (#342).
117
117
  #
118
+ # pythonsecurity:S2083 ("do not construct the path from user-controlled
119
+ # data") is exempted for scripts/ too, but for a DIFFERENT reason than
120
+ # S8707 above, and the difference matters. S8707's argument is that
121
+ # confining these tools to a root would break legitimate ad-hoc runs.
122
+ # S2083 was raised against backfill_review_fingerprint.py, which does
123
+ # the opposite: `safe_corpus_path` resolves the argument, requires a
124
+ # .jsonl regular file, confines it under the repository root, raises
125
+ # otherwise, and returns the resolved path that `backfill()` then uses
126
+ # for every read and write — the original argument never reaches the
127
+ # filesystem again (#375).
128
+ #
129
+ # The finding survived that. It was reported first at the read, then at
130
+ # the write, unchanged by binding the check to the value used, because
131
+ # SonarCloud's Python taint engine does not model `Path.resolve()` plus
132
+ # `is_relative_to()` as a sanitiser. The remaining report is an engine
133
+ # limitation, not an unvalidated path. Verified rather than assumed:
134
+ # main carries no open S2083, and the one S8707 left in src/ is marked
135
+ # FALSE-POSITIVE by a human, so neither rule has a working precedent
136
+ # here to copy blindly.
137
+ #
138
+ # The alternative considered and rejected was taking a bare filename
139
+ # and building the path from a fixed base, which the engine would
140
+ # accept. It makes traversal inexpressible, but it changes a documented
141
+ # CLI to satisfy an analyser rather than to close a hole that is
142
+ # already closed. If a script ever takes a path it does NOT validate,
143
+ # this exemption hides it — that is the cost, and it is the reason the
144
+ # rule stays on for src/.
145
+ #
118
146
  # `sonar.newCode.referenceBranch` overrides the server-side new-code
119
147
  # definition for this analysis. The instance default is
120
148
  # `previous_version` (confirmed: sonar.leak.period=previous_version,
@@ -173,9 +201,11 @@ jobs:
173
201
  -Dsonar.tests=tests
174
202
  -Dsonar.python.version=3.12
175
203
  -Dsonar.python.coverage.reportPaths=coverage.xml
176
- -Dsonar.issue.ignore.multicriteria=e1,e2,e3
204
+ -Dsonar.issue.ignore.multicriteria=e1,e2,e3,e4
177
205
  -Dsonar.issue.ignore.multicriteria.e1.ruleKey=pythonsecurity:S8707
178
206
  -Dsonar.issue.ignore.multicriteria.e1.resourceKey=scripts/**/*.py
207
+ -Dsonar.issue.ignore.multicriteria.e4.ruleKey=pythonsecurity:S2083
208
+ -Dsonar.issue.ignore.multicriteria.e4.resourceKey=scripts/**/*.py
179
209
  -Dsonar.issue.ignore.multicriteria.e2.ruleKey=githubactions:S8541
180
210
  -Dsonar.issue.ignore.multicriteria.e2.resourceKey=.github/workflows/*.yml
181
211
  -Dsonar.issue.ignore.multicriteria.e3.ruleKey=githubactions:S8544
@@ -0,0 +1,45 @@
1
+ repos:
2
+ - repo: local
3
+ hooks:
4
+ # SonarCloud's python:S5778, enforced before the push rather than after it.
5
+ # Sonar only decorates a pull request, so the loop was write -> push ->
6
+ # get told -> fix -> forget, five times over. `pass_filenames: false`
7
+ # because the check is a repo-wide ratchet (a stale baseline entry is a
8
+ # failure too), which a staged-files-only view cannot see.
9
+ #
10
+ # This hook is the fast half, not the gate: CI does not run pre-commit,
11
+ # so `tests/unit/test_check_pytest_raises.py` is what actually blocks a
12
+ # merge. Both call the same `check()`.
13
+ - id: pytest-raises-single-call
14
+ name: one throwing call per pytest.raises block (S5778)
15
+ entry: python scripts/check_pytest_raises.py
16
+ language: system
17
+ pass_filenames: false
18
+ files: ^tests/.*\.py$
19
+
20
+ - repo: https://github.com/astral-sh/ruff-pre-commit
21
+ rev: v0.15.16
22
+ hooks:
23
+ - id: ruff
24
+ args: [--fix]
25
+ - id: ruff-format
26
+
27
+ - repo: https://github.com/pre-commit/mirrors-mypy
28
+ rev: v2.1.0
29
+ hooks:
30
+ - id: mypy
31
+ args: [--config-file=pyproject.toml]
32
+ files: ^src/
33
+ additional_dependencies:
34
+ - httpx>=0.27 # imported directly by guardian/providers/base.py (#275)
35
+ - pydantic>=2.13.4
36
+ - structlog>=25.5.0
37
+ - types-pyyaml>=6.0.12.20260518
38
+ - rich>=15.0.0
39
+ - typer>=0.26.7
40
+ - tree-sitter>=0.25.2
41
+ - tree-sitter-python>=0.25.0
42
+ - tree-sitter-typescript>=0.23.2
43
+ - pytest>=9.0.3
44
+ - "mcp[cli]>=2" # must match the pyproject bound
45
+ - duckdb>=1.1.0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.14.0"
3
+ }
@@ -1,5 +1,64 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.14.0](https://github.com/zaebee/codegraph-brain/compare/codegraph-brain-v0.13.0...codegraph-brain-v0.14.0) (2026-08-16)
4
+
5
+
6
+ ### Features
7
+
8
+ * **guardian:** give measured recall a reviewer it can name ([#390](https://github.com/zaebee/codegraph-brain/issues/390)) ([#391](https://github.com/zaebee/codegraph-brain/issues/391)) ([acc1887](https://github.com/zaebee/codegraph-brain/commit/acc18874b7ce67fa38b7dab41552838f9578516d))
9
+ * **guardian:** say whether a temperature was chosen or inherited ([#393](https://github.com/zaebee/codegraph-brain/issues/393)) ([#395](https://github.com/zaebee/codegraph-brain/issues/395)) ([1b2c3c3](https://github.com/zaebee/codegraph-brain/commit/1b2c3c3f1619f00d20c36fb315eaca3dce5661d9))
10
+
11
+
12
+ ### Bug Fixes
13
+
14
+ * **guardian:** close the deferred cleanups that could only narrow silently ([#385](https://github.com/zaebee/codegraph-brain/issues/385)) ([#386](https://github.com/zaebee/codegraph-brain/issues/386)) ([e7020ff](https://github.com/zaebee/codegraph-brain/commit/e7020ff237964a66728f0b437f13b70dc8bfe2f9))
15
+ * **guardian:** refuse a model name carrying whitespace ([#382](https://github.com/zaebee/codegraph-brain/issues/382)) ([#389](https://github.com/zaebee/codegraph-brain/issues/389)) ([45fb110](https://github.com/zaebee/codegraph-brain/commit/45fb110d3e440e858f57c28cd3e343e61218697c))
16
+
17
+
18
+ ### Documentation
19
+
20
+ * **bench:** a failed parse is not a draw ([#394](https://github.com/zaebee/codegraph-brain/issues/394)) ([a70b09b](https://github.com/zaebee/codegraph-brain/commit/a70b09bf1faf67ddefff2d7fdcf555aba51ced9f))
21
+ * **bench:** repeated rows are samples, not corrections ([#392](https://github.com/zaebee/codegraph-brain/issues/392)) ([e1fcc3f](https://github.com/zaebee/codegraph-brain/commit/e1fcc3f4728e61363d06b022b14bc66f45f3a031))
22
+
23
+ ## [0.13.0](https://github.com/zaebee/codegraph-brain/compare/codegraph-brain-v0.12.0...codegraph-brain-v0.13.0) (2026-08-15)
24
+
25
+
26
+ ### Features
27
+
28
+ * **guardian:** an identity for a reviewer, that a commit does not fragment ([#375](https://github.com/zaebee/codegraph-brain/issues/375)) ([#383](https://github.com/zaebee/codegraph-brain/issues/383)) ([e339a38](https://github.com/zaebee/codegraph-brain/commit/e339a38743ddfdaac1e7c8f0724281844d5a8b38))
29
+
30
+ ## [0.12.0](https://github.com/zaebee/codegraph-brain/compare/codegraph-brain-v0.11.0...codegraph-brain-v0.12.0) (2026-08-13)
31
+
32
+
33
+ ### Features
34
+
35
+ * **guardian:** an ablation arm, because G5 cannot separate graph from language ([#342](https://github.com/zaebee/codegraph-brain/issues/342)) ([#366](https://github.com/zaebee/codegraph-brain/issues/366)) ([e2374a7](https://github.com/zaebee/codegraph-brain/commit/e2374a72016413414241e71d3cc37a7ce251c590))
36
+ * **guardian:** bound the local finder's output, because it does not stop ([#246](https://github.com/zaebee/codegraph-brain/issues/246)) ([#381](https://github.com/zaebee/codegraph-brain/issues/381)) ([1e0b5e1](https://github.com/zaebee/codegraph-brain/commit/1e0b5e13332c697102a22838f90fed265c0fec67))
37
+ * **guardian:** expose judge concurrency, because Mistral needs it at 1 ([#342](https://github.com/zaebee/codegraph-brain/issues/342)) ([#364](https://github.com/zaebee/codegraph-brain/issues/364)) ([47392e8](https://github.com/zaebee/codegraph-brain/commit/47392e829e8653e6d145533a637342e8a46b4982))
38
+ * **guardian:** keep the valid prefix of a truncated finder response ([#248](https://github.com/zaebee/codegraph-brain/issues/248)) ([#377](https://github.com/zaebee/codegraph-brain/issues/377)) ([d34f01f](https://github.com/zaebee/codegraph-brain/commit/d34f01fa11208c0f8202579edc7e07dccb163ad4))
39
+ * **guardian:** record what the judge spent, per row ([#342](https://github.com/zaebee/codegraph-brain/issues/342)) ([#378](https://github.com/zaebee/codegraph-brain/issues/378)) ([c4eea31](https://github.com/zaebee/codegraph-brain/commit/c4eea31b12492d90dafb92b3afacfbe9a942bab5))
40
+ * **guardian:** refuse a review of a truncated prompt, and supply the missing visitor ([#248](https://github.com/zaebee/codegraph-brain/issues/248)) ([#371](https://github.com/zaebee/codegraph-brain/issues/371)) ([5f3e9b7](https://github.com/zaebee/codegraph-brain/commit/5f3e9b73bcc36aabe64d634e4aa95ea0f5bd7fb7))
41
+ * **guardian:** review --slice, so the registered population is a command ([#342](https://github.com/zaebee/codegraph-brain/issues/342)) ([#373](https://github.com/zaebee/codegraph-brain/issues/373)) ([4d1fe6a](https://github.com/zaebee/codegraph-brain/commit/4d1fe6a8073641cdd46a9d9af24a3c31abd70764))
42
+ * **guardian:** sampling reaches Ollama, instead of the chat template deciding ([#246](https://github.com/zaebee/codegraph-brain/issues/246)) ([#380](https://github.com/zaebee/codegraph-brain/issues/380)) ([14cb966](https://github.com/zaebee/codegraph-brain/commit/14cb9664f200aa9507f1f364f72dfb0de0981259))
43
+ * **guardian:** send the registered temperature, and survive a 429 ([#342](https://github.com/zaebee/codegraph-brain/issues/342)) ([#372](https://github.com/zaebee/codegraph-brain/issues/372)) ([3d7efd8](https://github.com/zaebee/codegraph-brain/commit/3d7efd82efe750283a43eb0d5cb7941f7f67ddd1))
44
+ * **guardian:** the union arm scores offline, and a unit bug made G8 unfailable ([#342](https://github.com/zaebee/codegraph-brain/issues/342)) ([#370](https://github.com/zaebee/codegraph-brain/issues/370)) ([dd290fe](https://github.com/zaebee/codegraph-brain/commit/dd290fef986ad0dcf0b62da9fa2824e0ace1b90d))
45
+
46
+
47
+ ### Bug Fixes
48
+
49
+ * **guardian:** a dead judge is not a reviewer that found nothing ([#342](https://github.com/zaebee/codegraph-brain/issues/342)) ([#376](https://github.com/zaebee/codegraph-brain/issues/376)) ([2772c30](https://github.com/zaebee/codegraph-brain/commit/2772c305e9d7ca70c31bdfc2b12297392768330c))
50
+ * **guardian:** a truncated review is not a review that found nothing ([#342](https://github.com/zaebee/codegraph-brain/issues/342)) ([#374](https://github.com/zaebee/codegraph-brain/issues/374)) ([9f86bb6](https://github.com/zaebee/codegraph-brain/commit/9f86bb63e297e2b8bdda6bf6214e5d1e1bbd9339))
51
+ * **guardian:** the ablation must skip PRs with no graph to remove ([#342](https://github.com/zaebee/codegraph-brain/issues/342)) ([#367](https://github.com/zaebee/codegraph-brain/issues/367)) ([f9c36f5](https://github.com/zaebee/codegraph-brain/commit/f9c36f5cae503d83002ad03957eb7bf0cf31d263))
52
+
53
+
54
+ ### Documentation
55
+
56
+ * **guardian:** bench a local model in a notebook, and retire a wrong lever ([#246](https://github.com/zaebee/codegraph-brain/issues/246)) ([#379](https://github.com/zaebee/codegraph-brain/issues/379)) ([419fcc1](https://github.com/zaebee/codegraph-brain/commit/419fcc1eb28fddd9a2c0cef814480d861e6d8c88))
57
+ * **spec:** Phase 2 results — G5 fails at +9.5 pp against a 10 pp gate ([#342](https://github.com/zaebee/codegraph-brain/issues/342)) ([#362](https://github.com/zaebee/codegraph-brain/issues/362)) ([9481a54](https://github.com/zaebee/codegraph-brain/commit/9481a54c02b60786e14e6317d3a71c8a4cee12a0))
58
+ * **spec:** Phase 3 registers the union arm, and the pilot says it is marginal ([#342](https://github.com/zaebee/codegraph-brain/issues/342)) ([#369](https://github.com/zaebee/codegraph-brain/issues/369)) ([bc9caf4](https://github.com/zaebee/codegraph-brain/commit/bc9caf43c16a2ce27a0075b14eb0766569ae8c2d))
59
+ * **spec:** R5 — the noise floor equals the effect, so Phase 2 cannot answer its question ([#342](https://github.com/zaebee/codegraph-brain/issues/342)) ([#368](https://github.com/zaebee/codegraph-brain/issues/368)) ([8540bf1](https://github.com/zaebee/codegraph-brain/commit/8540bf1178a8535849bdd2fadfa5473f42040eb8))
60
+ * **spec:** second judge — G5 fails under both, and the row becomes publishable ([#342](https://github.com/zaebee/codegraph-brain/issues/342)) ([#365](https://github.com/zaebee/codegraph-brain/issues/365)) ([62c49e4](https://github.com/zaebee/codegraph-brain/commit/62c49e4b36c0950df0c10cce26c09418674130eb))
61
+
3
62
  ## [0.11.0](https://github.com/zaebee/codegraph-brain/compare/codegraph-brain-v0.10.0...codegraph-brain-v0.11.0) (2026-08-12)
4
63
 
5
64
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: codegraph-brain
3
- Version: 0.11.0
3
+ Version: 0.14.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
@@ -169,6 +169,8 @@ GUARDIAN_PROVIDER=ollama GUARDIAN_MODEL=qwen2.5-coder:14b \
169
169
  uv run python scripts/guardian_review.py --pr 123 --db graph.db --inline
170
170
  ```
171
171
 
172
+ No GPU on hand? **[Benchmark it on a notebook GPU →](docs/GUARDIAN_LOCAL_BENCH.md)** — free end to end, since the fixtures score without an LLM judge. Or **[point Guardian at a remote Ollama →](docs/GUARDIAN_REMOTE_OLLAMA.md)** — over an frp stcp tunnel, no public port, and a guard that refuses a review of a silently truncated prompt.
173
+
172
174
  ---
173
175
 
174
176
  ## 📈 Proof at Real Scale
@@ -119,6 +119,8 @@ GUARDIAN_PROVIDER=ollama GUARDIAN_MODEL=qwen2.5-coder:14b \
119
119
  uv run python scripts/guardian_review.py --pr 123 --db graph.db --inline
120
120
  ```
121
121
 
122
+ No GPU on hand? **[Benchmark it on a notebook GPU →](docs/GUARDIAN_LOCAL_BENCH.md)** — free end to end, since the fixtures score without an LLM judge. Or **[point Guardian at a remote Ollama →](docs/GUARDIAN_REMOTE_OLLAMA.md)** — over an frp stcp tunnel, no public port, and a guard that refuses a review of a silently truncated prompt.
123
+
122
124
  ---
123
125
 
124
126
  ## 📈 Proof at Real Scale
@@ -54,6 +54,103 @@ carries `matched`, `noise` and `ambiguous_hits`, so either definition can be
54
54
  re-derived from it. (Contrast `calibration.jsonl`, which *was* rewritten — that
55
55
  was a scorer bug, wrong under its own stated algorithm, not a policy change.)
56
56
 
57
+ ## Repeated rows are samples, not corrections (2026-08-16, #390)
58
+
59
+ **Do not deduplicate any corpus in this repository by "one row per subject,
60
+ latest wins."** Every repeat here was paid for on purpose, and collapsing to the
61
+ newest draw silently discards the experiment it belongs to.
62
+
63
+ Written down because a downstream consumer adopted exactly that rule — reasoning
64
+ that a re-run is a correction, so counting both would let a reviewer improve its
65
+ record by re-running — and nothing in this repository contradicted it. The
66
+ reasoning is sound for a corpus of corrections. It is wrong for these.
67
+
68
+ ### `benchmarks/martian-*.jsonl` — 115 review rows, 83 distinct subjects
69
+
70
+ Keyed by subject and genome (`url`, `head_sha`, `review_fingerprint`,
71
+ `finder_model`, `had_graph`), 32 of 115 rows are repeats. Every one of them
72
+ comes from a registered sampling arm:
73
+
74
+ | repeat group | count | source |
75
+ |---|---|---|
76
+ | `p3-run1` + `p3-run2` | 12 | Phase 3 union arm |
77
+ | `p3-run1` + `p3-run2` + `p3-run3` | 7 | Phase 3 union arm |
78
+ | `reviews` + `repeat-reviews` | 6 | R5 repeat probe |
79
+
80
+ Phase 3 registered three runs at `temperature = 0.7` **because the runs must
81
+ differ** — see the spec, "Configuration under test": at temperature 0 "the three
82
+ runs collapse toward one and the union arm becomes identically equal to a single
83
+ run." Gate G8 is defined as `F₂(union) > F₂(mean of the 3 runs)`; a mean over
84
+ three draws is not computable from one of them.
85
+
86
+ The variance is not theoretical. **21 of the 25 repeat groups disagree on how
87
+ many findings the review produced**, with spreads including 8→14, 15→24, 26→38
88
+ and one 0→25 — the same reviewer, the same commit, the same configuration. Keep
89
+ one draw and the number you publish is a coin flip over that range.
90
+
91
+ ### `benchmarks/guardian/results.jsonl` — 118 scored rows, 53 distinct
92
+
93
+ Repeats here carry an explicit `run` index (0/1/2) for the same reason. A row is
94
+ identified by `pr` + `model` + `guardian_sha` + `run`, and dropping `run` averages
95
+ away the per-PR sampling noise that R5 was written to measure.
96
+
97
+ ### `benchmarks/guardian/calibration.jsonl` — 236 rows, 118 subjects
98
+
99
+ Exactly two rows per recorded review, one per judge (`gemini-2.5-flash` and
100
+ `mistral-medium-latest`). The pair *is* the measurement — inter-judge agreement
101
+ is the G3 statistic — so `row_key` alone is not a unique key here; `row_key` +
102
+ `judge_model` is.
103
+
104
+ ### If you do need one row per reviewer
105
+
106
+ Aggregate over the draws (mean, or union where the arm defines one); do not
107
+ select among them. Selecting by recency is the one choice guaranteed to be
108
+ uncorrelated with quality, and it deletes 28% of this corpus.
109
+
110
+ **Aggregate over the subject's *draws*, which is not the same set as its rows.**
111
+ Say what a draw is rather than which rows to exclude: an exclusion list is
112
+ open-ended and the next entry arrives after it has already been believed, while
113
+ a positive definition is closed.
114
+
115
+ **A draw is a review that completed and whose output was parsed** — a row with
116
+ `parse_failed: false`. That is the whole test; `error` is `None` on all 115 rows,
117
+ because a run that failed outright never reached a record.
118
+
119
+ **A `parse_failed` row is not a draw.** Its structured output could not be read,
120
+ so it carries zero findings, and averaging it in charges the model for a harness
121
+ failure. This is exactly the distinction #374 established ("a truncated review is
122
+ not a review that found nothing"); before it, `parse_failed` was recorded and
123
+ read by nothing.
124
+
125
+ **A row with zero findings and `parse_failed: false` *is* a draw.** Three exist
126
+ (PRs 6, 77754 and 107534, all gemini), and each spent real tokens — 106, 117 and
127
+ 124 completion tokens. The reviewer ran and said nothing, which is evidence about
128
+ the reviewer. Same output shape as the parse failure, opposite meaning; keeping
129
+ them and dropping the parse failure is the one combination that is right about
130
+ both. The `arm` field exists for the mirror of this hazard: a failure and a
131
+ controlled removal must not look alike in the record.
132
+
133
+ There is exactly **one** parse-failed row in the review corpora:
134
+ `martian-p3-run1.jsonl` for PR 11059 — the same row #374 was written about. One
135
+ row out of 115 sounds ignorable and is not, because of how the averaging works:
136
+
137
+ - PR 11059 has three rows. Dropping the parse-failed one leaves draws of `9/13`
138
+ and `8/8`, so the subject contributes mean `c = 8.5` over mean `n = 10.5` —
139
+ a rate of **81.0%**, which is *below* mistral/graph's pooled 86.6%.
140
+ - Averaging the parse failure in as a third draw keeps that 81.0% but shrinks the
141
+ subject to `c = 5.667` over `n = 7.0`. Its **weight** falls, not its rate.
142
+ - A below-average subject carrying less weight pulls the pooled figure **up**:
143
+ 86.6% → **86.9%**.
144
+
145
+ So including the harness failure makes the reviewer look better, which is the
146
+ direction that makes this easy to leave in. That is how the gap was found — a
147
+ downstream consumer computed 86.6%, this repository computed 86.9%, and the
148
+ disagreement had exactly one cause.
149
+
150
+ The same applies to the `error` rows in `results.jsonl`, for the same reason and
151
+ by the same rule: they are already excluded there because `is_scored` requires
152
+ `matched` and `precision`, which a failed run never gets.
153
+
57
154
  ## Curation policy
58
155
 
59
156
  - Style/idiom-only findings → `ambiguous` (guardian's PRECISION RULES forbid