sourcecode 5.6.1__tar.gz → 5.8.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 (361) hide show
  1. {sourcecode-5.6.1 → sourcecode-5.8.0}/CHANGELOG.md +341 -0
  2. {sourcecode-5.6.1 → sourcecode-5.8.0}/PKG-INFO +11 -4
  3. {sourcecode-5.6.1 → sourcecode-5.8.0}/README.md +10 -3
  4. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/CACHE.md +1 -1
  5. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/DEFECT-LEDGER.md +50 -3
  6. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/DEVELOPMENT-ROADMAP.md +351 -0
  7. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/USER_GUIDE.md +1 -1
  8. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/migrate-check.md +7 -0
  9. {sourcecode-5.6.1 → sourcecode-5.8.0}/pyproject.toml +1 -1
  10. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/__init__.py +1 -1
  11. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/archetype.py +8 -1
  12. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/cache_model.py +4 -2
  13. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/canonical_ir.py +6 -1
  14. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/change_plan.py +7 -0
  15. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/cir_graphs.py +67 -0
  16. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/cli.py +412 -46
  17. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/container_wiring.py +226 -17
  18. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/contract_diff.py +6 -1
  19. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/detectors/java.py +7 -1
  20. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/explain.py +46 -0
  21. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/integration_coordinates.py +109 -1
  22. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/migrate_check.py +59 -0
  23. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/non_coverage.py +31 -0
  24. sourcecode-5.8.0/src/sourcecode/output_ceiling.py +195 -0
  25. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/parse_cache.py +23 -1
  26. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/posture.py +138 -28
  27. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/pr_impact.py +52 -1
  28. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/reconciliation.py +33 -0
  29. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/release_info.py +6 -4
  30. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/repository_ir.py +1091 -126
  31. sourcecode-5.8.0/src/sourcecode/risk_model.py +188 -0
  32. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/security_posture.py +27 -7
  33. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/semantic_integration_engine.py +33 -0
  34. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/serializer.py +123 -15
  35. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/spring_impact.py +188 -56
  36. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/spring_model.py +155 -19
  37. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/verify_edit.py +110 -1
  38. {sourcecode-5.6.1 → sourcecode-5.8.0}/.github/workflows/build-windows.yml +0 -0
  39. {sourcecode-5.6.1 → sourcecode-5.8.0}/.github/workflows/perf-gate.yml +0 -0
  40. {sourcecode-5.6.1 → sourcecode-5.8.0}/.gitignore +0 -0
  41. {sourcecode-5.6.1 → sourcecode-5.8.0}/.ruff.toml +0 -0
  42. {sourcecode-5.6.1 → sourcecode-5.8.0}/CLAUDE.md +0 -0
  43. {sourcecode-5.6.1 → sourcecode-5.8.0}/CONTRIBUTING.md +0 -0
  44. {sourcecode-5.6.1 → sourcecode-5.8.0}/LICENSE +0 -0
  45. {sourcecode-5.6.1 → sourcecode-5.8.0}/NOTICE +0 -0
  46. {sourcecode-5.6.1 → sourcecode-5.8.0}/SECURITY.md +0 -0
  47. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/COMMERCIAL-OFFER.md +0 -0
  48. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/CUSTOMER-VALIDATION.md +0 -0
  49. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/DEMO-5MIN.md +0 -0
  50. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/EXECUTION-PLAN-12MO.md +0 -0
  51. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/EXECUTIVE-ROADMAP.md +0 -0
  52. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/MANUAL-USUARIO.md +0 -0
  53. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/MODERNIZATION.md +0 -0
  54. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/PRODUCT_AUDIT.md +0 -0
  55. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/PRODUCT_IDENTITY.md +0 -0
  56. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/PRODUCT_TIERS.md +0 -0
  57. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/RC1-CHECKLIST.md +0 -0
  58. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/RELEASE-CHECKLIST.md +0 -0
  59. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/architecture/CATALOG-retrieval-intents.md +0 -0
  60. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/architecture/DESIGN-knowledge-provider-integration.md +0 -0
  61. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/architecture/DESIGN-p5.3b-statement-surface.md +0 -0
  62. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/architecture/DESIGN-p5.5-span-index.md +0 -0
  63. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/architecture/DESIGN-p6-semantic-impact-engine.md +0 -0
  64. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/architecture/DESIGN-p6-semantic-integration-engine.md +0 -0
  65. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/architecture/DESIGN-p7-semantic-services.md +0 -0
  66. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/architecture/DESIGN-robustness-security-inference.md +0 -0
  67. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/architecture/DESIGN-semantic-retrieval.md +0 -0
  68. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/architecture/EPV-p6-class-typeref.md +0 -0
  69. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/architecture/REPORT-p6-flow-analyzer-comparison.md +0 -0
  70. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/architecture/REPORT-p6-integration-detector-comparison.md +0 -0
  71. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/architecture/REPORT-p8-flow-analyzer-migration.md +0 -0
  72. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/architecture/REPORT-p9-integration-detector-migration.md +0 -0
  73. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/architecture/adr/0001-semantic-ir.md +0 -0
  74. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/architecture/adr/0002-source-evidence-boundary.md +0 -0
  75. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/architecture/adr/0003-architectural-characterization.md +0 -0
  76. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/architecture/adr/0004-semantic-retrieval.md +0 -0
  77. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/architecture/adr/0005-evidence-reconciliation.md +0 -0
  78. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/architecture/adr/0006-performance-harness.md +0 -0
  79. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/architecture/adr/0007-composition-semantics.md +0 -0
  80. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/architecture/adr/0008-answer-coherence.md +0 -0
  81. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/architecture/consumer-disposition-inventory.md +0 -0
  82. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/architecture/overview.md +0 -0
  83. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/architecture/product-architecture-review.md +0 -0
  84. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/architecture/product-strategy-layering.md +0 -0
  85. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/architecture/semantic-ir-consumer-matrix.md +0 -0
  86. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/architecture/semantic-ir-roadmap.md +0 -0
  87. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/baseline-ci.yml +0 -0
  88. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/commercial-pipeline-audit.md +0 -0
  89. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/contracts-ci.yml +0 -0
  90. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/contracts.md +0 -0
  91. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/eval/2026-06-15-petclinic-rest-issue11-vets-pagination.md +0 -0
  92. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/eval/2026-06-15-petclinic-rest-issue147-validation.md +0 -0
  93. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/eval/2026-06-15-petclinic-rest-workflow.md +0 -0
  94. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/eval/2026-06-15-phase18-openapi-surface.md +0 -0
  95. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/eval/2026-06-15-phase20-validation-surface.md +0 -0
  96. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/eval/2026-06-16-broadleaf-checkout-impact-fieldtest.md +0 -0
  97. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/eval/2026-06-16-petclinic-rest-issue11-weakness2-closed.md +0 -0
  98. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/eval/2026-06-16-spring-petclinic-issue2333-dead-vets.md +0 -0
  99. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/licensing-schema.md +0 -0
  100. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/perf/README.md +0 -0
  101. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/perf/REGRESSION-GATE.md +0 -0
  102. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/perf/baselines/2.5.15/SUMMARY.md +0 -0
  103. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/perf/baselines/2.5.15/alfresco__ask__cold.json +0 -0
  104. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/perf/baselines/2.5.15/alfresco__ask__warm.json +0 -0
  105. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/perf/baselines/2.5.15/broadleaf__ask__cold.json +0 -0
  106. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/perf/baselines/2.5.15/broadleaf__ask__warm.json +0 -0
  107. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/perf/baselines/2.5.15/eureka__ask__cold.json +0 -0
  108. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/perf/baselines/2.5.15/eureka__ask__warm.json +0 -0
  109. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/perf/baselines/2.5.15/jenkins__ask__cold.json +0 -0
  110. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/perf/baselines/2.5.15/jenkins__ask__warm.json +0 -0
  111. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/perf/baselines/2.5.15/jobrunr__ask__cold.json +0 -0
  112. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/perf/baselines/2.5.15/jobrunr__ask__warm.json +0 -0
  113. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/perf/baselines/2.5.15/keycloak__ask__cold.json +0 -0
  114. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/perf/baselines/2.5.15/keycloak__ask__warm.json +0 -0
  115. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/perf/baselines/2.5.15/neo4j__ask__cold.json +0 -0
  116. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/perf/baselines/2.5.15/neo4j__ask__warm.json +0 -0
  117. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/perf/baselines/2.5.15/ofbiz__ask__cold.json +0 -0
  118. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/perf/baselines/2.5.15/ofbiz__ask__warm.json +0 -0
  119. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/perf/baselines/2.5.15/openmrs__ask__cold.json +0 -0
  120. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/perf/baselines/2.5.15/openmrs__ask__warm.json +0 -0
  121. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/perf/baselines/2.5.15/petclinic__ask__cold.json +0 -0
  122. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/perf/baselines/2.5.15/petclinic__ask__warm.json +0 -0
  123. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/perf/baselines/2.5.16/SUMMARY.md +0 -0
  124. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/perf/baselines/2.5.16/alfresco__ask__cold.json +0 -0
  125. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/perf/baselines/2.5.16/alfresco__ask__warm.json +0 -0
  126. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/perf/baselines/2.5.16/broadleaf__ask__cold.json +0 -0
  127. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/perf/baselines/2.5.16/broadleaf__ask__warm.json +0 -0
  128. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/perf/baselines/2.5.16/eureka__ask__cold.json +0 -0
  129. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/perf/baselines/2.5.16/eureka__ask__warm.json +0 -0
  130. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/perf/baselines/2.5.16/jenkins__ask__cold.json +0 -0
  131. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/perf/baselines/2.5.16/jenkins__ask__warm.json +0 -0
  132. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/perf/baselines/2.5.16/jobrunr__ask__cold.json +0 -0
  133. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/perf/baselines/2.5.16/jobrunr__ask__warm.json +0 -0
  134. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/perf/baselines/2.5.16/keycloak__ask__cold.json +0 -0
  135. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/perf/baselines/2.5.16/keycloak__ask__warm.json +0 -0
  136. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/perf/baselines/2.5.16/neo4j__ask__cold.json +0 -0
  137. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/perf/baselines/2.5.16/neo4j__ask__warm.json +0 -0
  138. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/perf/baselines/2.5.16/ofbiz__ask__cold.json +0 -0
  139. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/perf/baselines/2.5.16/ofbiz__ask__warm.json +0 -0
  140. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/perf/baselines/2.5.16/openmrs__ask__cold.json +0 -0
  141. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/perf/baselines/2.5.16/openmrs__ask__warm.json +0 -0
  142. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/perf/baselines/2.5.16/petclinic__ask__cold.json +0 -0
  143. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/perf/baselines/2.5.16/petclinic__ask__warm.json +0 -0
  144. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/perf/baselines/gate-latest/README.md +0 -0
  145. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/perf/baselines/gate-latest/broadleaf__ask__warm.json +0 -0
  146. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/perf/baselines/gate-latest/broadleaf__endpoints__warm.json +0 -0
  147. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/perf/baselines/gate-latest/broadleaf__migrate-check__warm.json +0 -0
  148. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/perf/baselines/gate-latest/broadleaf__posture__warm.json +0 -0
  149. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/perf/baselines/gate-latest/broadleaf__spring-audit__warm.json +0 -0
  150. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/perf/baselines/gate-latest/broadleaf__validation__warm.json +0 -0
  151. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/perf/baselines/reference-best/README.md +0 -0
  152. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/posture.md +0 -0
  153. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/privacy.md +0 -0
  154. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/pro-experience-audit.md +0 -0
  155. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/schema.md +0 -0
  156. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/spec/envelope-v1.md +0 -0
  157. {sourcecode-5.6.1 → sourcecode-5.8.0}/docs/spring-audit-ci.yml +0 -0
  158. {sourcecode-5.6.1 → sourcecode-5.8.0}/raw +0 -0
  159. {sourcecode-5.6.1 → sourcecode-5.8.0}/scripts/compare_integration_engines.py +0 -0
  160. {sourcecode-5.6.1 → sourcecode-5.8.0}/scripts/customer_smoke_test.sh +0 -0
  161. {sourcecode-5.6.1 → sourcecode-5.8.0}/scripts/generate_jdk_exports.py +0 -0
  162. {sourcecode-5.6.1 → sourcecode-5.8.0}/scripts/perf_gate.py +0 -0
  163. {sourcecode-5.6.1 → sourcecode-5.8.0}/scripts/perf_harness.py +0 -0
  164. {sourcecode-5.6.1 → sourcecode-5.8.0}/scripts/sync_gate_anchors.py +0 -0
  165. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/adaptive_scanner.py +0 -0
  166. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/architectural_baseline.py +0 -0
  167. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/architectural_delta.py +0 -0
  168. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/architecture_analyzer.py +0 -0
  169. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/architecture_summary.py +0 -0
  170. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/ast_extractor.py +0 -0
  171. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/audit_report.py +0 -0
  172. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/baseline_autocapture.py +0 -0
  173. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/bundled_docs.py +0 -0
  174. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/cache.py +0 -0
  175. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/call_surface.py +0 -0
  176. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/caller_metrics.py +0 -0
  177. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/caller_reach.py +0 -0
  178. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/chain_rules.py +0 -0
  179. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/classifier.py +0 -0
  180. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/client_calls.py +0 -0
  181. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/code_notes_analyzer.py +0 -0
  182. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/compare.py +0 -0
  183. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/confidence_analyzer.py +0 -0
  184. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/constraint_diff.py +0 -0
  185. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/consumer_join.py +0 -0
  186. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/context_cache.py +0 -0
  187. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/context_graph.py +0 -0
  188. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/context_scorer.py +0 -0
  189. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/context_summarizer.py +0 -0
  190. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/contract_init.py +0 -0
  191. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/contract_model.py +0 -0
  192. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/contract_pipeline.py +0 -0
  193. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/coverage_parser.py +0 -0
  194. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/data_exposure.py +0 -0
  195. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/data_labels.py +0 -0
  196. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/declarations.py +0 -0
  197. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/defect_identity.py +0 -0
  198. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/degradation.py +0 -0
  199. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/dependency_analyzer.py +0 -0
  200. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/deployment_prefix.py +0 -0
  201. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/detach.py +0 -0
  202. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/detectors/__init__.py +0 -0
  203. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/detectors/base.py +0 -0
  204. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/detectors/csproj_parser.py +0 -0
  205. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/detectors/dart.py +0 -0
  206. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/detectors/dotnet.py +0 -0
  207. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/detectors/elixir.py +0 -0
  208. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/detectors/go.py +0 -0
  209. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/detectors/heuristic.py +0 -0
  210. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/detectors/hybrid.py +0 -0
  211. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/detectors/jvm_ext.py +0 -0
  212. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/detectors/nodejs.py +0 -0
  213. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/detectors/parsers.py +0 -0
  214. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/detectors/php.py +0 -0
  215. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/detectors/project.py +0 -0
  216. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/detectors/python.py +0 -0
  217. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/detectors/ruby.py +0 -0
  218. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/detectors/rust.py +0 -0
  219. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/detectors/systems.py +0 -0
  220. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/detectors/terraform.py +0 -0
  221. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/detectors/tooling.py +0 -0
  222. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/doc_analyzer.py +0 -0
  223. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/dynamic_argument_surface.py +0 -0
  224. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/endpoint_literals.py +0 -0
  225. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/endpoint_metrics.py +0 -0
  226. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/entrypoint_classifier.py +0 -0
  227. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/env_analyzer.py +0 -0
  228. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/envelope.py +0 -0
  229. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/environment_resolution.py +0 -0
  230. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/error_schema.py +0 -0
  231. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/evidence_provider.py +0 -0
  232. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/execution_plan.py +0 -0
  233. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/facts/__init__.py +0 -0
  234. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/facts/registry.json +0 -0
  235. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/file_chunker.py +0 -0
  236. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/file_classifier.py +0 -0
  237. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/filter_surface.py +0 -0
  238. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/format_contract.py +0 -0
  239. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/fqn_utils.py +0 -0
  240. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/gate_anchors.py +0 -0
  241. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/git_analyzer.py +0 -0
  242. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/git_checkout.py +0 -0
  243. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/graph_analyzer.py +0 -0
  244. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/graph_evidence.py +0 -0
  245. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/hibernate_strat.py +0 -0
  246. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/identity_fallback.py +0 -0
  247. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/jdk_exports.py +0 -0
  248. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/license.py +0 -0
  249. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/manifest_cache.py +0 -0
  250. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/mcp/__init__.py +0 -0
  251. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/mcp/dependency_import.py +0 -0
  252. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/mcp/onboarding/__init__.py +0 -0
  253. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/mcp/onboarding/applier.py +0 -0
  254. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/mcp/onboarding/backup.py +0 -0
  255. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/mcp/onboarding/detector.py +0 -0
  256. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/mcp/onboarding/planner.py +0 -0
  257. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/mcp/orchestrator.py +0 -0
  258. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/mcp/registry.py +0 -0
  259. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/mcp/runner.py +0 -0
  260. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/mcp/server.py +0 -0
  261. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/mcp_nudge.py +0 -0
  262. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/metrics_analyzer.py +0 -0
  263. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/migration_blast.py +0 -0
  264. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/openapi_surface.py +0 -0
  265. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/openrewrite_recipe.py +0 -0
  266. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/output_budget.py +0 -0
  267. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/output_encoding.py +0 -0
  268. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/parallel.py +0 -0
  269. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/partial_contract.py +0 -0
  270. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/path_admission.py +0 -0
  271. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/path_filters.py +0 -0
  272. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/perf.py +0 -0
  273. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/phased_run.py +0 -0
  274. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/pipe_contract.py +0 -0
  275. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/pr_comment_renderer.py +0 -0
  276. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/prepare_context.py +0 -0
  277. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/product_info.py +0 -0
  278. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/progress.py +0 -0
  279. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/provenance.py +0 -0
  280. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/ranking_engine.py +0 -0
  281. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/readiness_timeline.py +0 -0
  282. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/readonly.py +0 -0
  283. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/redactor.py +0 -0
  284. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/reference_facts.py +0 -0
  285. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/relevance_scorer.py +0 -0
  286. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/remedies.py +0 -0
  287. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/rename_refactor.py +0 -0
  288. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/repo_classifier.py +0 -0
  289. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/retrieval/__init__.py +0 -0
  290. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/retrieval/context.py +0 -0
  291. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/retrieval/errors.py +0 -0
  292. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/retrieval/executor.py +0 -0
  293. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/retrieval/planner.py +0 -0
  294. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/retrieval/query.py +0 -0
  295. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/retrieval/request.py +0 -0
  296. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/retrieval/resolution.py +0 -0
  297. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/retrieval/result.py +0 -0
  298. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/retrieval/retriever.py +0 -0
  299. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/retrieval/runtime.py +0 -0
  300. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/retrieval/steps.py +0 -0
  301. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/retrieval/steps_endpoint.py +0 -0
  302. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/retrieval/steps_graph.py +0 -0
  303. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/retrieval/steps_impact.py +0 -0
  304. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/retrieval/steps_intf.py +0 -0
  305. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/retrieval/steps_struct.py +0 -0
  306. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/retrieval/steps_txsec.py +0 -0
  307. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/ris.py +0 -0
  308. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/risk.py +0 -0
  309. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/rule_catalog.py +0 -0
  310. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/rule_pass.py +0 -0
  311. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/runs.py +0 -0
  312. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/runtime_classifier.py +0 -0
  313. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/sarif.py +0 -0
  314. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/scanner.py +0 -0
  315. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/schema.py +0 -0
  316. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/schemas/envelope-v1.schema.json +0 -0
  317. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/security_chain.py +0 -0
  318. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/security_config.py +0 -0
  319. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/security_config_scan.py +0 -0
  320. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/semantic_analyzer.py +0 -0
  321. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/semantic_impact_engine.py +0 -0
  322. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/semantic_services.py +0 -0
  323. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/servlet_surface.py +0 -0
  324. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/source_text.py +0 -0
  325. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/spring_event_topology.py +0 -0
  326. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/spring_findings.py +0 -0
  327. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/spring_profiles.py +0 -0
  328. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/spring_properties.py +0 -0
  329. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/spring_security_audit.py +0 -0
  330. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/spring_semantic.py +0 -0
  331. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/spring_tx_analyzer.py +0 -0
  332. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/sql_taint.py +0 -0
  333. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/summarizer.py +0 -0
  334. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/target_admission.py +0 -0
  335. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/telemetry/__init__.py +0 -0
  336. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/telemetry/config.py +0 -0
  337. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/telemetry/consent.py +0 -0
  338. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/telemetry/events.py +0 -0
  339. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/telemetry/filters.py +0 -0
  340. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/telemetry/transport.py +0 -0
  341. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/test_gap_ranking.py +0 -0
  342. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/test_sources.py +0 -0
  343. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/text_input.py +0 -0
  344. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/timeline.py +0 -0
  345. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/token_estimate.py +0 -0
  346. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/tree_utils.py +0 -0
  347. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/type_usage_surface.py +0 -0
  348. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/validation_inference.py +0 -0
  349. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/validation_surface.py +0 -0
  350. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/verify_repo.py +0 -0
  351. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/verify_rules.py +0 -0
  352. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/version_check.py +0 -0
  353. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/waivers.py +0 -0
  354. {sourcecode-5.6.1 → sourcecode-5.8.0}/src/sourcecode/workspace.py +0 -0
  355. {sourcecode-5.6.1 → sourcecode-5.8.0}/supabase/functions/README.md +0 -0
  356. {sourcecode-5.6.1 → sourcecode-5.8.0}/supabase/functions/get-license/index.ts +0 -0
  357. {sourcecode-5.6.1 → sourcecode-5.8.0}/supabase/functions/lemonsqueezy-webhook/index.ts +0 -0
  358. {sourcecode-5.6.1 → sourcecode-5.8.0}/supabase/functions/telemetry/index.ts +0 -0
  359. {sourcecode-5.6.1 → sourcecode-5.8.0}/supabase/sql/license_event_ordering.sql +0 -0
  360. {sourcecode-5.6.1 → sourcecode-5.8.0}/supabase/sql/licensing_schema.sql +0 -0
  361. {sourcecode-5.6.1 → sourcecode-5.8.0}/supabase/sql/telemetry_events.sql +0 -0
@@ -2,6 +2,347 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [5.8.0] — 2026-08-16
6
+
7
+ *The field queue from the two 5.7.3 validations, closed end to end: the blast
8
+ radius stopped losing the relation everything else is projected over, and the
9
+ answers that were floors stopped being published as totals. One commit per row,
10
+ A/B measured against the parent commit on each.*
11
+
12
+ ### Fixed
13
+ - A type that declares parameters of its own still declares a supertype (E-34).
14
+ The parameter block was matched as "everything up to the next `>`", which
15
+ stops inside `<T, V>`; to reach the body brace the group then swallowed the
16
+ whole `extends …` clause. `class Generic<T, V> extends Base {` produced **no
17
+ edge of either kind**, and 254 of 8 182 types across the fleet (3,1 %) had no
18
+ supertype anywhere in the model. The block is now a balanced `<…>` span, which
19
+ also settles the bounded-parameter trap `class E<T extends Map<String, X>>`.
20
+ Measured over 25 repositories: 0 type declarations lost, 0 gained; clauses
21
+ recovered wherever the shape occurs (dubbo +207, alfresco +130, jenkins +104).
22
+ - A call made through an inherited member belongs to the class that makes it
23
+ (E-27). Neither pass climbed the supertype chain: the field map is keyed on
24
+ the class that declares the field, and the intra-class scan only ever saw the
25
+ methods a class declares itself. Both now resolve against `supertype_closure`,
26
+ one authority for what is above a type, nearest declaration first — Java's own
27
+ rule. On BroadleafCommerce, `ask impact ExploitProtectionService .` goes from
28
+ **38 to 276 endpoints affected** and from **34 to 247 security declarations**;
29
+ `ask impact FormBuilderService .` from 3 to 7 direct callers. Fleet: +1 021
30
+ call-graph edges on Broadleaf, +7 210 on killbill, **+0 on mall** — the
31
+ correct answer for a repository whose calls are not inheritance-mediated.
32
+ - A filter is container-wired through the chain, not the clause (E-28). The
33
+ classification compared a class's *immediate* supertypes against the
34
+ framework's published extension points, so one repository-local hop hid a
35
+ filter: `AdminSecurityFilter` published `low` / `1.0` / `confidence: high` /
36
+ "Low-risk isolated change" over the admin chain, while its base class one
37
+ level up published `high`. Now `high` / `risk_score: null` / `container_wired`,
38
+ and the evidence names the hop (`inherits X via Y`) instead of citing a clause
39
+ the class never wrote. `ask spring-audit .` carries 20 → 42 authentication
40
+ pipeline relations.
41
+ - Two routes that share one inherited handler are two endpoints (E-30). The
42
+ de-duplication was already keyed on `endpoint_id`; the loss was one step
43
+ earlier, in walking from a caller to its own class when the route's controller
44
+ is a subclass. `impact-chain ExploitProtectionService` 189 → 239 affected
45
+ endpoints, `FormBuilderService` 186 → 236.
46
+ - A walk that stopped short says so (E-32). `bfs_truncated` reported whether the
47
+ hub guard cut the depth, not whether the closure was exhausted, so a run whose
48
+ frontier was still 76 nodes wide published `false` beside its depth. It now
49
+ means "the closure was not exhausted", with `closure_complete`,
50
+ `depth_capped_by_guard` and `frontier_open_at_depth_limit` beside it — the two
51
+ ways a walk stops early have different remedies — and the explanation says it
52
+ in prose.
53
+ - The owner of an anonymous member, and the `throws` clause it declares (E-33).
54
+ `verify-edit` answered correctly and cited the wrong evidence twice: a method
55
+ of an anonymous `Runnable` reported as removed from the file's named type, and
56
+ a removed `throws PrivilegedActionException` not reported at all. Anonymous
57
+ class bodies now open a scope named the way Java names it (`Outer$1`), the
58
+ public-surface readers skip such owners, and the `throws` clause is part of the
59
+ compared signature (the DR-1 precedent).
60
+ - A bean reached from a template is declared, not silently missed (E-31).
61
+ **NC-012** states that a SpEL `@beanName` reference in a template is outside
62
+ what a call-graph projection looks at, and what answers it today. The block
63
+ itself was published only by `pr-impact`; `impact`, `impact-chain` and `plan`
64
+ publish it now.
65
+ - A JAX-RS client is an outbound integration (E-26). `export --integrations`
66
+ returned 0 on a codebase that exists to speak HTTP. The JAX-RS client API and
67
+ RESTEasy are admitted the way every other row is — an FQN-guarded import edge
68
+ to a type named by a published specification, never the build coordinate.
69
+ keycloak-config-cli 0 → 3, seven golden repositories byte-identical.
70
+ - A statement is not a declaration (E-35). `return unknownHelper("x");` matched
71
+ the method-declaration shape and minted a method that does not exist, with a
72
+ call edge pointing at it: 1 047 such symbols on BroadleafCommerce (4,4 % of
73
+ its methods), 846 on killbill. The return-type slot is the discriminator;
74
+ `void` is deliberately not in the rejected set. Phantoms → 0, and the method
75
+ population falls by exactly that count, so no real declaration is lost.
76
+
77
+ ### Changed
78
+ - `impact`, `impact-chain` and `plan` publish the `blast_radius` non-coverage
79
+ block (E-31), and `impact` publishes `closure_complete`,
80
+ `depth_capped_by_guard` and `frontier_open_at_depth_limit` (E-32).
81
+ - The symbol population grows by the anonymous types now modelled and shrinks by
82
+ the phantom methods no longer minted (E-33, E-35). Endpoint populations are
83
+ byte-identical on every repository measured.
84
+
85
+ ### Positioning
86
+ - **CL-30 reversed.** The exclusion claim it froze is measurable again — the
87
+ reversal condition the row set was met, not argued. The field revalidation on
88
+ the evaluator's repository is still owed before the differential promise goes
89
+ into commercial material, and the row says so.
90
+
91
+ ## [5.7.3] — 2026-08-16
92
+
93
+ *Two more rows of the same family — a population published under the wrong name,
94
+ and source read past the point it could be read — plus one row closed by
95
+ measurement rather than by code.*
96
+
97
+ ### Fixed
98
+ - A caller that never names the target is not a direct caller (E-11). On
99
+ `examples`, `ask impact OrdersService` reported critical/35.5 with four direct
100
+ callers; three were `MicroserviceUtils` and its nested classes, which contain
101
+ zero occurrences of `OrdersService` — what they touch is the `Service`
102
+ interface it implements. The DI recovery stays (a walk that stops at the
103
+ interface loses every real production dependent), but the population is
104
+ published under its own name — `interface_mediated_callers` — and scored on
105
+ the indirect axis, because a class that reaches the target only if the
106
+ container binds this implementation is at the same conditional distance as a
107
+ transitive caller. Reach is untouched: endpoints, transactions, mappers and
108
+ cross-module figures are unchanged. Measured across 8 symbols on 7
109
+ repositories: 7 byte-identical, `examples/OrdersService` 4 → 1 direct callers,
110
+ 35.5 → 31.0, endpoints still 3.
111
+ - Source that cannot compile is named as such (E-10). spaghetti-api's
112
+ `BrokenSyntax.java` has two opening braces and no closing one, and the payload
113
+ reported a clean class and method from it with nothing anywhere saying the file
114
+ was broken. A `parse_structure` gap now names files whose braces do not balance
115
+ once comments and strings are masked, and states what is missing from the
116
+ model. The symbols stay — a file that fails to compile still tells us its type
117
+ exists — and the cost is a `str.count` per file, with the mask running only for
118
+ the rare candidate, so braces inside strings and comments are not false
119
+ positives.
120
+
121
+ ### Verified
122
+ - C3-112 was open on a stale state: B4 (5.7.0) already replaced the clean-tree
123
+ predicate with `_can_move_a_verdict`, and `analysis.disregarded_changes`
124
+ already publishes the paths git printed that no axis reads. Re-measured on
125
+ jobrunr with an untracked `.md` present: **0.44 s**, `model_built: false`,
126
+ against the 3.74 s the row recorded at 5.2.0. Closed by measurement; no code
127
+ was changed for it.
128
+
129
+ ## [5.7.2] — 2026-08-16
130
+
131
+ *Four rows from the open ledger, chosen for one property: each was a number or a
132
+ verdict the product published with more confidence than it had measured. Every
133
+ change is measured on the golden corpus, and the surfaces that were already
134
+ right are byte-identical.*
135
+
136
+ ### Fixed
137
+ - Freshness is measured, and it says which store it measured (C1-47).
138
+ `_cache.is_stale` was a literal `False` on the cache-hit branch, and the head
139
+ printed beside it was overwritten with the current sha — so the one value that
140
+ could contradict the claim was replaced by the claim. Three repositories
141
+ published root `is_stale: false` while `ask cache freshness` published STALE
142
+ for the same tree; both were right about different stores. `is_stale` is now
143
+ derived from the two heads published next to it and is `null` when either
144
+ could not be read; the hit branch recovers `git_head_at_generation` from the
145
+ cached content; and a served-from-cache answer carries the RIS fact under its
146
+ own name (`ris_exists`, `ris_git_head`, `ris_is_stale`) with the sentence that
147
+ reconciles the two when they disagree. A fresh answer publishes no RIS verdict
148
+ on purpose — that run rebuilds the RIS after the block is written.
149
+ - One authority for `risk_score`, and every answer names its axes (C1-48).
150
+ `impact` and `impact-chain` scored the identical symbol from two
151
+ independently-maintained formulas — different terms, different compression
152
+ constants, different band edges, an exposure floor only one of them had — and
153
+ disagreed on the **band** for `GuidesController`/sagan (high vs medium) and
154
+ `ApiGatewayController`/spring-petclinic-microservices (medium vs low). Both now
155
+ score through `risk_model`, whose weights, knee and band floors are `impact`'s
156
+ own, moved unchanged. Each command publishes the axes it measured, so a
157
+ remaining difference can only be a difference in measurement — which the
158
+ payload names. Measured on six symbols: `impact` byte-identical on 6 of 6, and
159
+ the two commands agree on the band on 6 of 6.
160
+ - A name that matches four classes is not an answer about one (E-8). tutorials
161
+ declares four unrelated `PersonService` classes; `impact-chain` merged callers
162
+ from two of them into one chain and scored it `critical`/25.0 with nothing in
163
+ the payload naming the candidates. The callers stay (each is a real caller of
164
+ some candidate); the figure that reads as this symbol's risk is void, with the
165
+ reason beside the null, the four classes in `metadata.matched_classes`, and a
166
+ warning that names the way to a single-symbol answer.
167
+ - A module leaving the surface is a judgement, and it is published (E-6). Apache
168
+ SkyWalking roots its e2e harness at a directory named `test/`, so the
169
+ module-name exclusion removed three deployable `@RestController` modules and
170
+ `ask endpoints` published `total: 0` with `coverage.gaps` empty.
171
+ `test_source_excluded_detail.excluded_by_module_name_rule` now names the
172
+ modules and the route annotations, states that the rule judges the module
173
+ rather than the file, and gives both ways back; `coverage.gaps` carries the
174
+ entry. Admission is unchanged — the judgement is the maintainer's, the silence
175
+ was the defect.
176
+
177
+ ### Contract
178
+ - `impact-chain` is `core` tier, so neither fix widens a published enum inside a
179
+ major. The shared model's fifth level, `none`, maps to `low` at this command's
180
+ publication boundary and travels named as `risk_model.level_shared_model`; the
181
+ ambiguous case uses `unknown`, which its schema already documents. Every key
182
+ either fix adds appears only in the case it describes, so an unambiguous,
183
+ unaffected answer is byte-identical. 6.0.0 removes the level shim.
184
+
185
+ ## [5.7.1] — 2026-08-16
186
+
187
+ *Second golden-repo battery over 5.7.0 (16 repositories, from spring-petclinic's 47
188
+ Java files to the Baeldung `tutorials` monorepo's 24 074) plus a sweep of the
189
+ suite's own vacuous assertions. Six rows closed, one suspicion refuted with the
190
+ measurement that contradicts it, one row left open on purpose with a strict
191
+ `xfail` holding the property.*
192
+
193
+ ### Fixed
194
+ - A JAX-RS route declares its own admission class (E-5). `route.get("source",
195
+ "annotation")` made `annotation` the default, so a repository with no Spring
196
+ MVC at all was published as if it had: neo4j 4 → **0**, killbill 282 → **0**,
197
+ keycloak 695 → **0**, examples 3 → **0** `spring_mvc_annotations`;
198
+ spring-petclinic (17) and BroadleafCommerce (268/4/1) unchanged. The one-line
199
+ fix at the phase-2 construction site was not enough — the phase-3 inheritance
200
+ projection builds its own route dict and is not Spring-only, so the family is
201
+ read from the declaring symbol's annotations.
202
+ - A bean annotation is resolved, not merely spelled (E-12). `_BEAN_ANNOTATIONS`
203
+ matched **simple names**, which is the vendor-agnostic rule inverted: neo4j's
204
+ 34 beans were all its own `org.neo4j.annotations.service.Service` (0
205
+ occurrences of `org.springframework` in the tree) and carried
206
+ `spring_detected: true`. The annotation is now resolved against the `imports`
207
+ edges the graph already holds; nothing unresolved is left without a verdict.
208
+ neo4j 34 → **0** Spring beans, `spring_detected` true → false; sa-token's 35
209
+ beans were Solon's and jobrunr's 1 was Micronaut's. Controls unchanged
210
+ (petclinic 12, dubbo 133/133, mall 158/158, spring-boot-admin 199/199).
211
+ - A field belongs to its class, and the edge says so (E-13). `_enclosing_class`
212
+ split on `#` only, so a field — spelled `Type.member` — was handed back
213
+ unchanged and its `contained_in` edge dropped: **0 of 14** fields on
214
+ spring-petclinic, **0 of 821** on mall, **0 of 1 086** on neo4j, **0 of 2 188**
215
+ on keycloak. The consequence was a silent gate: `ask verify`, the `core`-tier
216
+ CI gate, returned `pass` on repositories that violated their own declared
217
+ contract.
218
+ - One authority for member → owner resolution (E-15). E-13's patch was at one
219
+ emission site and a second consumer with the same root made that the wrong
220
+ shape: no repository had ever published a `field_type`. `_owner_type_of(symbol,
221
+ kind)` is now the single resolution; spring-petclinic gains `field_type: 6,
222
+ field_type_arg: 3` and sagan `field_type: 22, field_type_arg: 10`, with the
223
+ other three contexts byte-identical — recovered, not double-counted.
224
+ - A method's own declaration is not a security call site (E-7). The programmatic
225
+ policy regex matched the shape of a call and equally the shape of the method
226
+ that declares one, so sa-token's `AtCheckController` published every handler as
227
+ `programmatic` — including `ignore()`, annotated `@SaIgnore`, the explicit
228
+ opposite. Across all 23 golden repositories **22 of 23** policy censuses are
229
+ byte-identical; sa-token is the only mover.
230
+ - The answer is the end of the work, and the wait to get there is visible
231
+ (C3-125, C3-126). A cold `ask <repo> --compact` on a 24 074-file repository
232
+ took **305 s**, roughly two thirds of it *after* the complete JSON had been
233
+ written: the L1 cache write renders the compact, agent and standard views a
234
+ second time, and each of them re-derived the spring-profiles block — five
235
+ derivations of one pure function, ~50 s apiece, 57 % of the sampled stacks.
236
+ Two costs inside it are gone: the per-profile file matcher built three
237
+ `pathlib.Path` objects per (profile, file) pair — 4,2 million of them against
238
+ a 24 000-file live heap — and now derives the stems once from the file list
239
+ under the same matching rule; and the block is memoized per snapshot, handing
240
+ back a copy so no caller can edit the next caller's answer. `agent_view`'s
241
+ event signal also stopped building its own CIR and asks
242
+ `context_cache.shared_cir`, the one door. Same repository, same
243
+ 17 426-byte answer: **102 s** wall, 78 s CPU (2,98× / 3,54×). The post-answer
244
+ build now runs under a spinner reading *building cache entry (the answer above
245
+ is complete)*, so a caller that waits on process exit can tell "still working"
246
+ from "done, stuck" — the reason the field report read the silent tail as a
247
+ hang and killed it at 180 s. `ask cache warm` inherits the fix (131 s on the
248
+ same repository, warm `ask` at 2,2 s afterwards) and no longer captures the
249
+ child's stdout: it reads the exit code and, on failure, stderr, so a
250
+ repository-sized payload is no longer buffered in order to be dropped.
251
+
252
+ ### Changed
253
+ - An assertion must be able to fail (E-13 residue, E-14). A sweep of the suite's
254
+ vacuous assertions: a test named `test_field_has_contained_in_edge` existed for
255
+ exactly the property E-13 broke and asserted nothing, and another ended in
256
+ `assert ... or True`. Both now assert; the Python re-export chain limit E-14
257
+ names is held by `xfail(strict=True)`, so the day it is fixed the suite turns
258
+ red rather than letting the fix land unnoticed.
259
+
260
+ ### Known
261
+ - E-14 stays open by decision: a 3-level Python re-export chain resolves through
262
+ a documented 2-level limit and reports no limitation. Tracked by the strict
263
+ `xfail` above. Python import resolution is not the Java/Spring core this
264
+ product is bought for, and no headline field is built on it.
265
+
266
+ ## [5.7.0] — 2026-08-14
267
+
268
+ *Field-defect battery over the ASK 5.5.6 and 5.6.1 audits: seven rows re-measured
269
+ on the local corpus (spring-petclinic 47, open-banking-gateway 1 126,
270
+ BroadleafCommerce 2 985, keycloak 7 885, neo4j 8 830 Java files), four of them
271
+ closed here, two refuted with the measurement that contradicts them.*
272
+
273
+ ### Fixed
274
+ - Every view declares what it cut, and none of them drops its own identity
275
+ (B14). `--compact` capped `key_dependencies` at 50, `env_map` and `code_notes`
276
+ at 15 and production entry points at 5 while publishing none of it — on
277
+ BroadleafCommerce that hid 40 dependencies, 144 environment variables and 64
278
+ code notes behind lists that read as complete. Each cap now publishes
279
+ `total`/`shown`/`omitted` and the registered statement of what a display cap
280
+ changes, in the same shape the rest of the product uses; a cap that did not
281
+ bite claims nothing. The root analysis also carries the response envelope it
282
+ never had in any view (`command`, `tool_version`, `run_id`, tree state, and
283
+ the analysed path rather than the working directory), and `--agent` keeps
284
+ `schema_version`.
285
+ - `spring-audit` publishes the test-source exclusion its answer was measured
286
+ over, and `--include-tests` reaches the other population (ASK-08). The command
287
+ fell from 3 SEC-003 findings to 0 when 131 sources were classified
288
+ `test-source`, and neither the count nor the flag was anywhere in the payload
289
+ or the help. `metadata.test_source_excluded(_detail)` now carries the count,
290
+ the matched patterns, a sample and the basis, in the same shape `endpoints`
291
+ publishes, filled by the file walk that made the exclusion rather than by a
292
+ second classification. Measured: keycloak reports 2 258 excluded sources;
293
+ BroadleafCommerce goes from 20 to 26 findings with `--include-tests`.
294
+ - `verify-edit` no longer rebuilds a repository-wide model when the only
295
+ differences from HEAD are files no axis reads (B4). A README, a build log or
296
+ this tool's own `.sourcecode-cache/` used to defeat the clean-tree short
297
+ circuit: measured on keycloak (7 885 Java files), `verify-edit .` took 32,5 s
298
+ to answer `changed_files: []`, `verdict: pass`. It now answers in 0,58 s with
299
+ `model_built: false`, and publishes `disregarded_changes` — the paths that do
300
+ differ and why none of them can move a verdict. An unrecognised extension is
301
+ never disregarded, and `.ask/` stays analysed because the custom-rule axis
302
+ reads `verify-rules.json` there.
303
+ - One output-size policy for every command that prints a payload (ASK-03). The
304
+ ~50K estimated-token ceiling used to exist on `migrate-check` and `repo-ir`
305
+ only, so the same size was refused by one command and printed in silence by
306
+ another — `endpoints` on a 7 885-file repository emitted 353 112 B (~88K
307
+ tokens) with `exit=0`. The guard now runs at the single output seam, with the
308
+ same `OUTPUT_TOO_LARGE` code, the same `expected`, and escapes derived from
309
+ the running command's own options, so a hint never proposes a flag the caller
310
+ already passed. `--max-output-tokens N` and `ASK_MAX_OUTPUT_TOKENS` move the
311
+ ceiling for every command at once; `0` prints the payload whatever its size;
312
+ `--output FILE` and `--force` are unchanged.
313
+ - The parse cache now describes the eviction it performs (ASK-05). `cache
314
+ status`, `cache model` and `docs/CACHE.md` said "least-recently-used, enforced
315
+ on write" and "the next write evicts" while the field watched the store grow
316
+ 25 MB past its 512 MB budget. The sweep is periodic — once per 32 MB written,
317
+ per process — so the policy line names that interval, `sweep_interval_mb` is
318
+ published, and an over-budget store carries a note bounding the overshoot and
319
+ naming `ask cache clear --global`.
320
+ - `cache warm` states what a warm buys **before** the cost is paid, and reads
321
+ the commands it buys nothing for from `cache model` instead of a
322
+ hand-written sentence (ASK-07). The old sentence named `endpoints` as gaining
323
+ nothing while the model measures it at 3,3 s → 1,4 s, which is how a field
324
+ battery timed the two commands a warm does not help and concluded a warm does
325
+ not amortize below ~1 500 Java files. No size threshold is published: measured
326
+ here, the root view goes 2,5 s → 0,3 s at 47 files and 15,4 s → 0,3 s at
327
+ 2 985.
328
+ - `migrate-check --compact` bounds the sections that scale with modules rather
329
+ than with findings (ASK-01b): `evidence_manifest.claims`/`sources`,
330
+ `java_lts_inventory.evidence` and `hibernate.module_exposure_map`, each with
331
+ the `*_cap` contract the other collections already publish. `--top-n N` now
332
+ reaches the compact answer instead of only the `--table` rendering, so a
333
+ caller refused by the output ceiling can ask for a smaller answer. On keycloak
334
+ the compact report goes 80 094 B → 36 190 B, and 26 665 B with `--top-n 1`;
335
+ the full report is unchanged.
336
+
337
+ ## [5.6.1] — 2026-08-13
338
+
339
+ ### Fixed
340
+ - `endpoints` publishes `coverage`, `functional_routing`, `warnings` and
341
+ `zero_result_reason`, so an empty or partial HTTP surface names the routing
342
+ style it could not model instead of reading as "no public API".
343
+ - Duplicate Spring audit serialization removed; `cache status` reports parse
344
+ store overage.
345
+
5
346
  ## [5.6.0] — 2026-08-13
6
347
 
7
348
  ### Legal And Provenance
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sourcecode
3
- Version: 5.6.1
3
+ Version: 5.8.0
4
4
  Summary: Persistent structural context and ultra-fast repeated analysis for AI coding agents
5
5
  Project-URL: Homepage, https://github.com/HarounDominique/sourcecode
6
6
  Project-URL: Repository, https://github.com/HarounDominique/sourcecode
@@ -47,10 +47,10 @@ Description-Content-Type: text/markdown
47
47
 
48
48
  **Context · Impact · Migration · Architecture · Review — everything from one structural model.**
49
49
 
50
- ![Version](https://img.shields.io/badge/version-5.6.1-blue)
50
+ ![Version](https://img.shields.io/badge/version-5.8.0-blue)
51
51
  ![Python](https://img.shields.io/badge/python-3.9%2B-green)
52
52
 
53
- Copyright (c) 2026 Dominique Haroun. All rights reserved. ASK Engine 5.6.1 and
53
+ Copyright (c) 2026 Dominique Haroun. All rights reserved. ASK Engine 5.7.0 and
54
54
  later are proprietary; see [LICENSE](LICENSE) and [NOTICE](NOTICE). Releases up
55
55
  to and including 5.5.6 remain governed by their published Apache-2.0 terms.
56
56
 
@@ -135,7 +135,7 @@ brew tap haroundominique/sourcecode && brew install sourcecode
135
135
  # pip / pipx
136
136
  pipx install sourcecode # or: pip install sourcecode
137
137
 
138
- ask version # ask 5.6.1 — and, on a build that has aged,
138
+ ask version # ask 5.8.0 — and, on a build that has aged,
139
139
  # how many releases have probably shipped since
140
140
  ```
141
141
 
@@ -487,6 +487,13 @@ And one about blast radius:
487
487
  | Not covered | Why | What answers it |
488
488
  |---|---|---|
489
489
  | **The reach of a component the container invokes rather than the code — a security filter chain, an around-advice aspect, a `@ControllerAdvice`, a bean resolved through the interface it implements.** | Blast radius here is projected over the call graph: who calls the changed symbol, and which routes reach those callers. Nothing in the repository calls a container-wired component, so its measured call-graph fan-in is ~0 and every figure derived from it — affected endpoints, direct callers, rollback surface — reads as no impact. The fan-in figure is correct; using it as a risk proxy on this population is not. Publishing that as a low verdict would be a confident zero, which is the one thing this product does not do. | Such a change is flagged in `analysis_warnings` and its verdict is floored, never rated on fan-in. The reach itself is measured elsewhere and was there all along: `ask endpoints` resolves a gate annotation to the routes carrying it, `ask explain <class>` prints the request chain a configuration declares with its source line, and `ask posture --profile <set>` states what each profile leaves open. Projecting those into the blast radius (pointcut → routes, matcher → routes) is a measurement this command does not yet make. |
490
+ | **A bean reached from a template rather than from code — a Thymeleaf or JSP expression that resolves a bean by name (`${@blExploitProtectionService.getCsrfTokenParameter()}`) and invokes a method on it.** | Every reacher this blast radius models is a typed edge or a structural fact recovered from Java: a call, an injection, a container extension point, a string literal inside a reflective lookup. A template is none of those — it is not compiled against the bean, and the reference lives in a file this analysis does not parse. So a component invoked only from a template has a measured fan-in of ~0 and, unlike every other blind spot here, that silence was published without a label: the field found `blind_spots: []` on a service two templates call by name. The miss is ordinary; presenting it as an empty result is the defect (E-31). | A SpEL bean reference in a template is fixed, published syntax (`@beanName` inside `${...}`), so a text search for the bean's name across `.html`/`.jsp` answers it today: `grep -rn '@<beanName>' src/main/resources`. Admitting it as a fourth reacher would be evidence-shaped for the same reason — the reference is a literal naming a bean this repository declares — and it is not modelled yet, which is what this row states rather than implies. |
491
+
492
+ And one about request-body validation:
493
+
494
+ | Not covered | Why | What answers it |
495
+ |---|---|---|
496
+ | **Programmatic Spring request-body validation wired with `org.springframework.validation.Validator` or `@InitBinder`.** | This surface reads declared bean-validation constraints recovered from OpenAPI or DTO annotations. A validator registered in controller code can enforce body rules without any declarative constraint on the payload, so treating the result as fully verified would overstate what the declared-constraint scan proves. | `@InitBinder` / `setValidator(...)` wiring, or a Spring `Validator` implementation, which this surface reports only as a coverage boundary. `validation` still shows the declared rules; the programmatic validator remains outside that model. |
490
497
 
491
498
  The one row above with a remedy in this build: `ask endpoints /path/to/repo --servlets`
492
499
  lists the servlet-mounted HTTP surface as a population of its own — `web.xml` mappings and
@@ -4,10 +4,10 @@
4
4
 
5
5
  **Context · Impact · Migration · Architecture · Review — everything from one structural model.**
6
6
 
7
- ![Version](https://img.shields.io/badge/version-5.6.1-blue)
7
+ ![Version](https://img.shields.io/badge/version-5.8.0-blue)
8
8
  ![Python](https://img.shields.io/badge/python-3.9%2B-green)
9
9
 
10
- Copyright (c) 2026 Dominique Haroun. All rights reserved. ASK Engine 5.6.1 and
10
+ Copyright (c) 2026 Dominique Haroun. All rights reserved. ASK Engine 5.7.0 and
11
11
  later are proprietary; see [LICENSE](LICENSE) and [NOTICE](NOTICE). Releases up
12
12
  to and including 5.5.6 remain governed by their published Apache-2.0 terms.
13
13
 
@@ -92,7 +92,7 @@ brew tap haroundominique/sourcecode && brew install sourcecode
92
92
  # pip / pipx
93
93
  pipx install sourcecode # or: pip install sourcecode
94
94
 
95
- ask version # ask 5.6.1 — and, on a build that has aged,
95
+ ask version # ask 5.8.0 — and, on a build that has aged,
96
96
  # how many releases have probably shipped since
97
97
  ```
98
98
 
@@ -444,6 +444,13 @@ And one about blast radius:
444
444
  | Not covered | Why | What answers it |
445
445
  |---|---|---|
446
446
  | **The reach of a component the container invokes rather than the code — a security filter chain, an around-advice aspect, a `@ControllerAdvice`, a bean resolved through the interface it implements.** | Blast radius here is projected over the call graph: who calls the changed symbol, and which routes reach those callers. Nothing in the repository calls a container-wired component, so its measured call-graph fan-in is ~0 and every figure derived from it — affected endpoints, direct callers, rollback surface — reads as no impact. The fan-in figure is correct; using it as a risk proxy on this population is not. Publishing that as a low verdict would be a confident zero, which is the one thing this product does not do. | Such a change is flagged in `analysis_warnings` and its verdict is floored, never rated on fan-in. The reach itself is measured elsewhere and was there all along: `ask endpoints` resolves a gate annotation to the routes carrying it, `ask explain <class>` prints the request chain a configuration declares with its source line, and `ask posture --profile <set>` states what each profile leaves open. Projecting those into the blast radius (pointcut → routes, matcher → routes) is a measurement this command does not yet make. |
447
+ | **A bean reached from a template rather than from code — a Thymeleaf or JSP expression that resolves a bean by name (`${@blExploitProtectionService.getCsrfTokenParameter()}`) and invokes a method on it.** | Every reacher this blast radius models is a typed edge or a structural fact recovered from Java: a call, an injection, a container extension point, a string literal inside a reflective lookup. A template is none of those — it is not compiled against the bean, and the reference lives in a file this analysis does not parse. So a component invoked only from a template has a measured fan-in of ~0 and, unlike every other blind spot here, that silence was published without a label: the field found `blind_spots: []` on a service two templates call by name. The miss is ordinary; presenting it as an empty result is the defect (E-31). | A SpEL bean reference in a template is fixed, published syntax (`@beanName` inside `${...}`), so a text search for the bean's name across `.html`/`.jsp` answers it today: `grep -rn '@<beanName>' src/main/resources`. Admitting it as a fourth reacher would be evidence-shaped for the same reason — the reference is a literal naming a bean this repository declares — and it is not modelled yet, which is what this row states rather than implies. |
448
+
449
+ And one about request-body validation:
450
+
451
+ | Not covered | Why | What answers it |
452
+ |---|---|---|
453
+ | **Programmatic Spring request-body validation wired with `org.springframework.validation.Validator` or `@InitBinder`.** | This surface reads declared bean-validation constraints recovered from OpenAPI or DTO annotations. A validator registered in controller code can enforce body rules without any declarative constraint on the payload, so treating the result as fully verified would overstate what the declared-constraint scan proves. | `@InitBinder` / `setValidator(...)` wiring, or a Spring `Validator` implementation, which this surface reports only as a coverage boundary. `validation` still shows the declared rules; the programmatic validator remains outside that model. |
447
454
 
448
455
  The one row above with a remedy in this build: `ask endpoints /path/to/repo --servlets`
449
456
  lists the servlet-mounted HTTP surface as a population of its own — `web.xml` mappings and
@@ -59,7 +59,7 @@ the enclosing monorepo, and `cache status` / `cache clear` resolve to that same
59
59
  | `ris` | the Repository Intelligence Snapshot — structural index, endpoint index, summaries | tree state (the snapshot records the tree it describes) | rebuilt on every warm |
60
60
  | `cir` | the shared Canonical IR — the Java parse every knowledge command reuses | tree state · analyzer fingerprint · schema version | built |
61
61
  | `task` | one `prepare-context` task answer, per task and per option set | tree state · task · --symptom / --all / --include-config / --format | never — a warm does not run any task |
62
- | `parse` | the symbol extraction of one file, keyed by its bytes | the file's own bytes and the extractor's source — content-addressed, so it is never stale and never needs invalidating. Bounded by `ASK_PARSE_CACHE_MAX_MB` (default 512 MB, least-recently-used, enforced on write) and reported in `cache status` (F-AR) | filled for every Java file the warm parses |
62
+ | `parse` | the symbol extraction of one file, keyed by its bytes | the file's own bytes and the extractor's source — content-addressed, so it is never stale and never needs invalidating. Bounded by `ASK_PARSE_CACHE_MAX_MB` (default 512 MB, least-recently-used, swept every 32 MB written rather than on every write, so the size can sit one sweep interval per running process above the budget) and reported in `cache status` (F-AR) | filled for every Java file the warm parses |
63
63
 
64
64
  Measured on BroadleafCommerce (2 000+ Java files, dirty tree), warm machine, 3.2.2, each command in isolation.
65
65