sourcecode 5.8.5__tar.gz → 5.8.7__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.

Potentially problematic release.


This version of sourcecode might be problematic. Click here for more details.

Files changed (384) hide show
  1. {sourcecode-5.8.5 → sourcecode-5.8.7}/CHANGELOG.md +192 -0
  2. {sourcecode-5.8.5 → sourcecode-5.8.7}/PKG-INFO +17 -12
  3. {sourcecode-5.8.5 → sourcecode-5.8.7}/README.md +16 -11
  4. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/CACHE.md +5 -1
  5. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/DEFECT-LEDGER.md +18 -17
  6. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/DEVELOPMENT-ROADMAP.md +190 -0
  7. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/EXECUTIVE-ROADMAP.md +22 -12
  8. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/USER_GUIDE.md +128 -11
  9. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/perf/REGRESSION-GATE.md +39 -0
  10. {sourcecode-5.8.5 → sourcecode-5.8.7}/pyproject.toml +1 -1
  11. {sourcecode-5.8.5 → sourcecode-5.8.7}/scripts/perf_harness.py +139 -0
  12. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/__init__.py +1 -1
  13. sourcecode-5.8.7/src/sourcecode/answer_bounds.py +230 -0
  14. sourcecode-5.8.7/src/sourcecode/audit_clusters.py +314 -0
  15. sourcecode-5.8.7/src/sourcecode/audit_recipe.py +289 -0
  16. sourcecode-5.8.7/src/sourcecode/audit_since.py +228 -0
  17. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/breaking_changes.py +61 -15
  18. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/cache_model.py +25 -1
  19. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/canonical_ir.py +62 -2
  20. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/cli.py +684 -30
  21. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/client_calls.py +111 -11
  22. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/consumer_join.py +6 -3
  23. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/envelope.py +15 -0
  24. sourcecode-5.8.7/src/sourcecode/explain_endpoint.py +485 -0
  25. sourcecode-5.8.7/src/sourcecode/field_deprecations.py +175 -0
  26. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/format_contract.py +3 -0
  27. sourcecode-5.8.7/src/sourcecode/functional_routes.py +425 -0
  28. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/perf.py +258 -0
  29. sourcecode-5.8.7/src/sourcecode/regress.py +264 -0
  30. sourcecode-5.8.7/src/sourcecode/remediation_diff.py +229 -0
  31. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/repository_ir.py +306 -18
  32. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/risk.py +163 -32
  33. sourcecode-5.8.7/src/sourcecode/schema_producers.py +247 -0
  34. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/schema_registry.py +55 -2
  35. sourcecode-5.8.7/src/sourcecode/selftest.py +445 -0
  36. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/semantic_analyzer.py +2298 -2250
  37. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/spring_impact.py +36 -2
  38. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/spring_security_audit.py +98 -3
  39. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/timeline.py +72 -27
  40. sourcecode-5.8.7/src/sourcecode/timeline_cache.py +174 -0
  41. {sourcecode-5.8.5 → sourcecode-5.8.7}/.github/workflows/build-windows.yml +0 -0
  42. {sourcecode-5.8.5 → sourcecode-5.8.7}/.github/workflows/perf-gate.yml +0 -0
  43. {sourcecode-5.8.5 → sourcecode-5.8.7}/.gitignore +0 -0
  44. {sourcecode-5.8.5 → sourcecode-5.8.7}/.ruff.toml +0 -0
  45. {sourcecode-5.8.5 → sourcecode-5.8.7}/CLAUDE.md +0 -0
  46. {sourcecode-5.8.5 → sourcecode-5.8.7}/CONTRIBUTING.md +0 -0
  47. {sourcecode-5.8.5 → sourcecode-5.8.7}/LICENSE +0 -0
  48. {sourcecode-5.8.5 → sourcecode-5.8.7}/NOTICE +0 -0
  49. {sourcecode-5.8.5 → sourcecode-5.8.7}/SECURITY.md +0 -0
  50. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/COMMERCIAL-OFFER.md +0 -0
  51. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/CUSTOMER-VALIDATION.md +0 -0
  52. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/DEMO-5MIN.md +0 -0
  53. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/EXECUTION-PLAN-12MO.md +0 -0
  54. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/MANUAL-USUARIO.md +0 -0
  55. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/MODERNIZATION.md +0 -0
  56. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/PRODUCT_AUDIT.md +0 -0
  57. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/PRODUCT_IDENTITY.md +0 -0
  58. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/PRODUCT_TIERS.md +0 -0
  59. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/RC1-CHECKLIST.md +0 -0
  60. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/RELEASE-CHECKLIST.md +0 -0
  61. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/architecture/CATALOG-retrieval-intents.md +0 -0
  62. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/architecture/DESIGN-knowledge-provider-integration.md +0 -0
  63. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/architecture/DESIGN-p5.3b-statement-surface.md +0 -0
  64. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/architecture/DESIGN-p5.5-span-index.md +0 -0
  65. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/architecture/DESIGN-p6-semantic-impact-engine.md +0 -0
  66. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/architecture/DESIGN-p6-semantic-integration-engine.md +0 -0
  67. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/architecture/DESIGN-p7-semantic-services.md +0 -0
  68. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/architecture/DESIGN-robustness-security-inference.md +0 -0
  69. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/architecture/DESIGN-semantic-retrieval.md +0 -0
  70. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/architecture/EPV-p6-class-typeref.md +0 -0
  71. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/architecture/REPORT-p6-flow-analyzer-comparison.md +0 -0
  72. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/architecture/REPORT-p6-integration-detector-comparison.md +0 -0
  73. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/architecture/REPORT-p8-flow-analyzer-migration.md +0 -0
  74. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/architecture/REPORT-p9-integration-detector-migration.md +0 -0
  75. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/architecture/adr/0001-semantic-ir.md +0 -0
  76. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/architecture/adr/0002-source-evidence-boundary.md +0 -0
  77. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/architecture/adr/0003-architectural-characterization.md +0 -0
  78. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/architecture/adr/0004-semantic-retrieval.md +0 -0
  79. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/architecture/adr/0005-evidence-reconciliation.md +0 -0
  80. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/architecture/adr/0006-performance-harness.md +0 -0
  81. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/architecture/adr/0007-composition-semantics.md +0 -0
  82. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/architecture/adr/0008-answer-coherence.md +0 -0
  83. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/architecture/consumer-disposition-inventory.md +0 -0
  84. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/architecture/overview.md +0 -0
  85. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/architecture/product-architecture-review.md +0 -0
  86. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/architecture/product-strategy-layering.md +0 -0
  87. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/architecture/semantic-ir-consumer-matrix.md +0 -0
  88. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/architecture/semantic-ir-roadmap.md +0 -0
  89. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/baseline-ci.yml +0 -0
  90. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/commercial-pipeline-audit.md +0 -0
  91. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/contracts-ci.yml +0 -0
  92. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/contracts.md +0 -0
  93. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/eval/2026-06-15-petclinic-rest-issue11-vets-pagination.md +0 -0
  94. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/eval/2026-06-15-petclinic-rest-issue147-validation.md +0 -0
  95. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/eval/2026-06-15-petclinic-rest-workflow.md +0 -0
  96. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/eval/2026-06-15-phase18-openapi-surface.md +0 -0
  97. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/eval/2026-06-15-phase20-validation-surface.md +0 -0
  98. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/eval/2026-06-16-broadleaf-checkout-impact-fieldtest.md +0 -0
  99. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/eval/2026-06-16-petclinic-rest-issue11-weakness2-closed.md +0 -0
  100. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/eval/2026-06-16-spring-petclinic-issue2333-dead-vets.md +0 -0
  101. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/licensing-schema.md +0 -0
  102. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/migrate-check.md +0 -0
  103. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/perf/README.md +0 -0
  104. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/perf/baselines/2.5.15/SUMMARY.md +0 -0
  105. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/perf/baselines/2.5.15/alfresco__ask__cold.json +0 -0
  106. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/perf/baselines/2.5.15/alfresco__ask__warm.json +0 -0
  107. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/perf/baselines/2.5.15/broadleaf__ask__cold.json +0 -0
  108. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/perf/baselines/2.5.15/broadleaf__ask__warm.json +0 -0
  109. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/perf/baselines/2.5.15/eureka__ask__cold.json +0 -0
  110. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/perf/baselines/2.5.15/eureka__ask__warm.json +0 -0
  111. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/perf/baselines/2.5.15/jenkins__ask__cold.json +0 -0
  112. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/perf/baselines/2.5.15/jenkins__ask__warm.json +0 -0
  113. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/perf/baselines/2.5.15/jobrunr__ask__cold.json +0 -0
  114. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/perf/baselines/2.5.15/jobrunr__ask__warm.json +0 -0
  115. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/perf/baselines/2.5.15/keycloak__ask__cold.json +0 -0
  116. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/perf/baselines/2.5.15/keycloak__ask__warm.json +0 -0
  117. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/perf/baselines/2.5.15/neo4j__ask__cold.json +0 -0
  118. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/perf/baselines/2.5.15/neo4j__ask__warm.json +0 -0
  119. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/perf/baselines/2.5.15/ofbiz__ask__cold.json +0 -0
  120. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/perf/baselines/2.5.15/ofbiz__ask__warm.json +0 -0
  121. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/perf/baselines/2.5.15/openmrs__ask__cold.json +0 -0
  122. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/perf/baselines/2.5.15/openmrs__ask__warm.json +0 -0
  123. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/perf/baselines/2.5.15/petclinic__ask__cold.json +0 -0
  124. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/perf/baselines/2.5.15/petclinic__ask__warm.json +0 -0
  125. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/perf/baselines/2.5.16/SUMMARY.md +0 -0
  126. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/perf/baselines/2.5.16/alfresco__ask__cold.json +0 -0
  127. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/perf/baselines/2.5.16/alfresco__ask__warm.json +0 -0
  128. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/perf/baselines/2.5.16/broadleaf__ask__cold.json +0 -0
  129. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/perf/baselines/2.5.16/broadleaf__ask__warm.json +0 -0
  130. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/perf/baselines/2.5.16/eureka__ask__cold.json +0 -0
  131. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/perf/baselines/2.5.16/eureka__ask__warm.json +0 -0
  132. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/perf/baselines/2.5.16/jenkins__ask__cold.json +0 -0
  133. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/perf/baselines/2.5.16/jenkins__ask__warm.json +0 -0
  134. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/perf/baselines/2.5.16/jobrunr__ask__cold.json +0 -0
  135. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/perf/baselines/2.5.16/jobrunr__ask__warm.json +0 -0
  136. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/perf/baselines/2.5.16/keycloak__ask__cold.json +0 -0
  137. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/perf/baselines/2.5.16/keycloak__ask__warm.json +0 -0
  138. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/perf/baselines/2.5.16/neo4j__ask__cold.json +0 -0
  139. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/perf/baselines/2.5.16/neo4j__ask__warm.json +0 -0
  140. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/perf/baselines/2.5.16/ofbiz__ask__cold.json +0 -0
  141. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/perf/baselines/2.5.16/ofbiz__ask__warm.json +0 -0
  142. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/perf/baselines/2.5.16/openmrs__ask__cold.json +0 -0
  143. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/perf/baselines/2.5.16/openmrs__ask__warm.json +0 -0
  144. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/perf/baselines/2.5.16/petclinic__ask__cold.json +0 -0
  145. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/perf/baselines/2.5.16/petclinic__ask__warm.json +0 -0
  146. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/perf/baselines/gate-latest/README.md +0 -0
  147. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/perf/baselines/gate-latest/broadleaf__ask__warm.json +0 -0
  148. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/perf/baselines/gate-latest/broadleaf__endpoints__warm.json +0 -0
  149. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/perf/baselines/gate-latest/broadleaf__migrate-check__warm.json +0 -0
  150. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/perf/baselines/gate-latest/broadleaf__posture__warm.json +0 -0
  151. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/perf/baselines/gate-latest/broadleaf__spring-audit__warm.json +0 -0
  152. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/perf/baselines/gate-latest/broadleaf__validation__warm.json +0 -0
  153. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/perf/baselines/reference-best/README.md +0 -0
  154. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/posture.md +0 -0
  155. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/privacy.md +0 -0
  156. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/pro-experience-audit.md +0 -0
  157. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/schema.md +0 -0
  158. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/spec/envelope-v1.md +0 -0
  159. {sourcecode-5.8.5 → sourcecode-5.8.7}/docs/spring-audit-ci.yml +0 -0
  160. {sourcecode-5.8.5 → sourcecode-5.8.7}/scripts/compare_integration_engines.py +0 -0
  161. {sourcecode-5.8.5 → sourcecode-5.8.7}/scripts/customer_smoke_test.sh +0 -0
  162. {sourcecode-5.8.5 → sourcecode-5.8.7}/scripts/generate_jdk_exports.py +0 -0
  163. {sourcecode-5.8.5 → sourcecode-5.8.7}/scripts/perf_gate.py +0 -0
  164. {sourcecode-5.8.5 → sourcecode-5.8.7}/scripts/sync_gate_anchors.py +0 -0
  165. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/adaptive_scanner.py +0 -0
  166. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/archetype.py +0 -0
  167. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/architectural_baseline.py +0 -0
  168. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/architectural_delta.py +0 -0
  169. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/architecture_analyzer.py +0 -0
  170. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/architecture_summary.py +0 -0
  171. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/ast_extractor.py +0 -0
  172. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/audit_report.py +0 -0
  173. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/baseline_autocapture.py +0 -0
  174. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/build_modules.py +0 -0
  175. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/bundled_docs.py +0 -0
  176. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/cache.py +0 -0
  177. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/call_surface.py +0 -0
  178. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/caller_metrics.py +0 -0
  179. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/caller_reach.py +0 -0
  180. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/chain_rules.py +0 -0
  181. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/change_plan.py +0 -0
  182. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/cir_graphs.py +0 -0
  183. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/classifier.py +0 -0
  184. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/code_notes_analyzer.py +0 -0
  185. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/compare.py +0 -0
  186. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/confidence_analyzer.py +0 -0
  187. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/constraint_diff.py +0 -0
  188. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/container_wiring.py +0 -0
  189. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/context_cache.py +0 -0
  190. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/context_graph.py +0 -0
  191. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/context_scorer.py +0 -0
  192. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/context_summarizer.py +0 -0
  193. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/contract_diff.py +0 -0
  194. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/contract_init.py +0 -0
  195. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/contract_model.py +0 -0
  196. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/contract_pipeline.py +0 -0
  197. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/coverage_parser.py +0 -0
  198. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/data_exposure.py +0 -0
  199. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/data_labels.py +0 -0
  200. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/declarations.py +0 -0
  201. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/defect_identity.py +0 -0
  202. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/degradation.py +0 -0
  203. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/dependency_analyzer.py +0 -0
  204. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/deployment_prefix.py +0 -0
  205. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/detach.py +0 -0
  206. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/detectors/__init__.py +0 -0
  207. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/detectors/base.py +0 -0
  208. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/detectors/csproj_parser.py +0 -0
  209. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/detectors/dart.py +0 -0
  210. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/detectors/dotnet.py +0 -0
  211. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/detectors/elixir.py +0 -0
  212. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/detectors/go.py +0 -0
  213. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/detectors/heuristic.py +0 -0
  214. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/detectors/hybrid.py +0 -0
  215. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/detectors/java.py +0 -0
  216. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/detectors/jvm_ext.py +0 -0
  217. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/detectors/nodejs.py +0 -0
  218. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/detectors/parsers.py +0 -0
  219. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/detectors/php.py +0 -0
  220. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/detectors/project.py +0 -0
  221. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/detectors/python.py +0 -0
  222. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/detectors/ruby.py +0 -0
  223. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/detectors/rust.py +0 -0
  224. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/detectors/systems.py +0 -0
  225. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/detectors/terraform.py +0 -0
  226. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/detectors/tooling.py +0 -0
  227. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/doc_analyzer.py +0 -0
  228. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/dynamic_argument_surface.py +0 -0
  229. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/empty_reach.py +0 -0
  230. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/endpoint_disposition.py +0 -0
  231. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/endpoint_literals.py +0 -0
  232. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/endpoint_metrics.py +0 -0
  233. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/entrypoint_classifier.py +0 -0
  234. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/env_analyzer.py +0 -0
  235. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/environment_resolution.py +0 -0
  236. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/error_schema.py +0 -0
  237. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/evidence_provider.py +0 -0
  238. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/execution_plan.py +0 -0
  239. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/explain.py +0 -0
  240. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/facts/__init__.py +0 -0
  241. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/facts/registry.json +0 -0
  242. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/file_chunker.py +0 -0
  243. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/file_classifier.py +0 -0
  244. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/filter_surface.py +0 -0
  245. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/fqn_utils.py +0 -0
  246. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/gate_anchors.py +0 -0
  247. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/git_analyzer.py +0 -0
  248. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/git_checkout.py +0 -0
  249. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/graph_analyzer.py +0 -0
  250. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/graph_evidence.py +0 -0
  251. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/hibernate_strat.py +0 -0
  252. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/identity_fallback.py +0 -0
  253. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/integration_coordinates.py +0 -0
  254. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/jdk_exports.py +0 -0
  255. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/license.py +0 -0
  256. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/manifest_cache.py +0 -0
  257. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/mcp/__init__.py +0 -0
  258. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/mcp/dependency_import.py +0 -0
  259. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/mcp/onboarding/__init__.py +0 -0
  260. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/mcp/onboarding/applier.py +0 -0
  261. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/mcp/onboarding/backup.py +0 -0
  262. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/mcp/onboarding/detector.py +0 -0
  263. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/mcp/onboarding/planner.py +0 -0
  264. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/mcp/orchestrator.py +0 -0
  265. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/mcp/registry.py +0 -0
  266. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/mcp/runner.py +0 -0
  267. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/mcp/server.py +0 -0
  268. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/mcp_nudge.py +0 -0
  269. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/metrics_analyzer.py +0 -0
  270. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/migrate_check.py +0 -0
  271. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/migration_blast.py +0 -0
  272. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/non_coverage.py +0 -0
  273. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/openapi_surface.py +0 -0
  274. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/openrewrite_recipe.py +0 -0
  275. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/output_bounds.py +0 -0
  276. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/output_budget.py +0 -0
  277. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/output_ceiling.py +0 -0
  278. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/output_encoding.py +0 -0
  279. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/output_sink.py +0 -0
  280. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/parallel.py +0 -0
  281. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/parse_cache.py +0 -0
  282. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/partial_contract.py +0 -0
  283. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/path_admission.py +0 -0
  284. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/path_filters.py +0 -0
  285. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/phased_run.py +0 -0
  286. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/pipe_contract.py +0 -0
  287. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/posture.py +0 -0
  288. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/pr_comment_renderer.py +0 -0
  289. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/pr_impact.py +0 -0
  290. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/prepare_context.py +0 -0
  291. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/product_info.py +0 -0
  292. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/progress.py +0 -0
  293. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/provenance.py +0 -0
  294. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/ranking_engine.py +0 -0
  295. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/readiness_timeline.py +0 -0
  296. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/readonly.py +0 -0
  297. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/reconciliation.py +0 -0
  298. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/redactor.py +0 -0
  299. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/reference_facts.py +0 -0
  300. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/release_info.py +0 -0
  301. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/relevance_scorer.py +0 -0
  302. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/remedies.py +0 -0
  303. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/rename_refactor.py +0 -0
  304. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/repo_classifier.py +0 -0
  305. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/retrieval/__init__.py +0 -0
  306. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/retrieval/context.py +0 -0
  307. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/retrieval/errors.py +0 -0
  308. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/retrieval/executor.py +0 -0
  309. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/retrieval/planner.py +0 -0
  310. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/retrieval/query.py +0 -0
  311. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/retrieval/request.py +0 -0
  312. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/retrieval/resolution.py +0 -0
  313. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/retrieval/result.py +0 -0
  314. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/retrieval/retriever.py +0 -0
  315. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/retrieval/runtime.py +0 -0
  316. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/retrieval/steps.py +0 -0
  317. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/retrieval/steps_endpoint.py +0 -0
  318. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/retrieval/steps_graph.py +0 -0
  319. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/retrieval/steps_impact.py +0 -0
  320. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/retrieval/steps_intf.py +0 -0
  321. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/retrieval/steps_struct.py +0 -0
  322. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/retrieval/steps_txsec.py +0 -0
  323. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/ris.py +0 -0
  324. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/risk_model.py +0 -0
  325. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/rule_catalog.py +0 -0
  326. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/rule_pass.py +0 -0
  327. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/runs.py +0 -0
  328. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/runtime_classifier.py +0 -0
  329. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/sarif.py +0 -0
  330. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/scanner.py +0 -0
  331. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/schema.py +0 -0
  332. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/schemas/core-analysis-v1.schema.json +0 -0
  333. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/schemas/endpoints-v1.schema.json +0 -0
  334. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/schemas/envelope-v1.schema.json +0 -0
  335. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/schemas/pr-impact-v1.schema.json +0 -0
  336. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/schemas/verify-edit-v1.schema.json +0 -0
  337. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/schemas/verify-v1.schema.json +0 -0
  338. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/security_chain.py +0 -0
  339. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/security_config.py +0 -0
  340. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/security_config_scan.py +0 -0
  341. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/security_posture.py +0 -0
  342. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/semantic_impact_engine.py +0 -0
  343. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/semantic_integration_engine.py +0 -0
  344. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/semantic_services.py +0 -0
  345. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/serializer.py +0 -0
  346. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/servlet_surface.py +0 -0
  347. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/source_text.py +0 -0
  348. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/spring_event_topology.py +0 -0
  349. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/spring_findings.py +0 -0
  350. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/spring_model.py +0 -0
  351. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/spring_profiles.py +0 -0
  352. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/spring_properties.py +0 -0
  353. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/spring_semantic.py +0 -0
  354. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/spring_tx_analyzer.py +0 -0
  355. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/sql_taint.py +0 -0
  356. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/summarizer.py +0 -0
  357. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/target_admission.py +0 -0
  358. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/telemetry/__init__.py +0 -0
  359. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/telemetry/config.py +0 -0
  360. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/telemetry/consent.py +0 -0
  361. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/telemetry/events.py +0 -0
  362. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/telemetry/filters.py +0 -0
  363. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/telemetry/transport.py +0 -0
  364. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/test_gap_ranking.py +0 -0
  365. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/test_sources.py +0 -0
  366. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/text_input.py +0 -0
  367. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/token_estimate.py +0 -0
  368. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/tree_utils.py +0 -0
  369. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/type_usage_surface.py +0 -0
  370. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/validation_inference.py +0 -0
  371. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/validation_surface.py +0 -0
  372. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/verify_edit.py +0 -0
  373. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/verify_repo.py +0 -0
  374. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/verify_rules.py +0 -0
  375. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/version_check.py +0 -0
  376. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/waivers.py +0 -0
  377. {sourcecode-5.8.5 → sourcecode-5.8.7}/src/sourcecode/workspace.py +0 -0
  378. {sourcecode-5.8.5 → sourcecode-5.8.7}/supabase/functions/README.md +0 -0
  379. {sourcecode-5.8.5 → sourcecode-5.8.7}/supabase/functions/get-license/index.ts +0 -0
  380. {sourcecode-5.8.5 → sourcecode-5.8.7}/supabase/functions/lemonsqueezy-webhook/index.ts +0 -0
  381. {sourcecode-5.8.5 → sourcecode-5.8.7}/supabase/functions/telemetry/index.ts +0 -0
  382. {sourcecode-5.8.5 → sourcecode-5.8.7}/supabase/sql/license_event_ordering.sql +0 -0
  383. {sourcecode-5.8.5 → sourcecode-5.8.7}/supabase/sql/licensing_schema.sql +0 -0
  384. {sourcecode-5.8.5 → sourcecode-5.8.7}/supabase/sql/telemetry_events.sql +0 -0
@@ -2,6 +2,177 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [5.8.7] — 2026-08-18
6
+
7
+ *An ASK polish pass, and then the recommended-feature queue emptied. The theme
8
+ of the fixes is again the one the field keeps teaching: **three of the seven
9
+ closed by finding the premise wrong**. E-9's caveat was not dropped between two
10
+ commands — on that shape nothing ever produced it. E-14's row said "either the
11
+ limit is not enforced or it is enforced and unreported"; it was neither, two
12
+ authorities disagreed about the same number. And `C3-84`'s confident falsehood
13
+ turned out to be **our own qualifier**, added a release earlier to close a
14
+ silence, refuted by our own measurement.*
15
+
16
+ ### Fixed
17
+ - **A partially resolved route path is unresolved, and its id stays readable**
18
+ (E-9). `@Path("/{accountId:" + UUID_PATTERN + "}")` contains string literals,
19
+ so every reader concluded the path was known and published the first literal —
20
+ `/{accountId:` — as the route, silently. A partial resolution is not a
21
+ resolution. The caveat is now a field of `CanonicalEndpoint`, so `endpoints`,
22
+ `impact-chain` and `impact` publish it from one authority; and `make_id`
23
+ percent-escapes the separator, so an endpoint id has four fields for every
24
+ route rather than five.
25
+ - **The re-export hop budget is enforced, and running out of it is declared**
26
+ (E-14). Two authorities disagreed: the test said a three-level chain must not
27
+ resolve, the walk said "depth=2 total" and resolved it. The walk wins — two
28
+ hops land on the module where the symbol is declared. What was missing is the
29
+ other side, plus two defects found while adjudicating: a chain still going
30
+ when the budget ran out was published as if it had ended, and a chain that
31
+ simply ends inside a package reported a limit it never reached.
32
+ - **`impact-chain`'s sentence names the unit its number is in** (C1-16, witness
33
+ a). It printed the entry count under the words "22 direct callers" while the
34
+ field beside it said 14. `impact` had closed this half already.
35
+ - **`--jobs` states the measured cost split, not the estimate** (C3-84). The
36
+ 4.15.0 wording called the rule pass *"where a repository-wide audit spends
37
+ most of its time"*. Instrumented: the CIR build is 88 % of the clock and every
38
+ rule together 8 %. All three surfaces carry the measurement now, and the
39
+ correction reverses what the flag implies — it covers the phase with the cost.
40
+ - **A run cannot exit 0 without producing the file it promised** (C3-122). One
41
+ field report: 444 s, exit 0, no output, no file. Fixed as the shape rather
42
+ than the occurrence — the promise is noted from the argument vector, so all 65
43
+ commands that publish `--output` are covered including one that returns before
44
+ its emit seam, and a file write is never silent.
45
+ - **SEC-001 reports an absence it measured, not a verdict it did not** (C1-43).
46
+ It told the reader *"any caller can reach this endpoint without
47
+ authentication"* from the absence of the two chain shapes it knows how to look
48
+ for, at `confidence: high`. It now states what was looked for and not found,
49
+ publishes the premise as evidence, and binds the coverage answer to the
50
+ authority that owns it.
51
+ - **DEAD-001 keeps `high`, and the reason is on the record** (C3-101 c). The
52
+ severity was never the defect; the precision was, and it shipped.
53
+
54
+ ### Added
55
+ - **`spring-audit --since <ref> --fail-on-new`** (F-BL) — the gate a repository
56
+ with existing debt can actually turn on. Joins two audits on the content-stable
57
+ `defect_id` and fails only on what the change introduced. Both sides are asked
58
+ the same question and the payload says which; a renamed symbol reads as one
59
+ resolved plus one new and says so; a comparison that could not be made exits
60
+ non-zero, never 0.
61
+ - **`ask explain-endpoint '<VERB> <path>'`** (F-BN) — show your work for one
62
+ route: match, declaration, handler, chain, profiles, verdict, each naming the
63
+ authority that produced it and the file it can be checked against. A step that
64
+ could not be derived is `undetermined` **with the reason** — none of the six is
65
+ ever absent in silence.
66
+ - **`spring-audit --remediation-diff`** (F-BK) — the findings as patches `git
67
+ apply` takes, for the defects whose repair is the lexical inverse of the
68
+ defect. Not `--recipe` with a different encoding: a recipe is run, a diff is
69
+ decided, and every patch carries what applying it decides.
70
+ - **`spring-audit --clusters`** (F-BM) — 386 rows as the handful of things
71
+ somebody has to do, keyed on `(defect_kind, repair_shape, locus)` with the axis
72
+ declared. The effort figure is an assumption with its arithmetic exposed; an
73
+ owner comes from CODEOWNERS or is absent.
74
+ - **A deprecation channel for published payload keys** (F-BQ, BC-003). A key on
75
+ its way out is published beside its replacement with the release that removes
76
+ it. `auth status` moves onto it, so it ships with a real population.
77
+ - **The base URL a client centralises is resolved from its own declaration**
78
+ (F-BO). 115 of 135 client calls were unresolved for one reason: the head is a
79
+ constant written a few lines up. A name bound twice — `environment.ts` and
80
+ `environment.prod.ts` — is still not resolved.
81
+ - **A declaration split across lines is still a declaration** (F-BP). A wrapped
82
+ generic return type published the member with *no annotations at all*, so the
83
+ route left the census and its guard left with it. `endpoints` on
84
+ BroadleafCommerce and spring-boot-admin is byte-identical: recall on the broken
85
+ shapes and nothing else.
86
+ - **A cost fixture for the composition family** (F-BR, second half) — counted,
87
+ not timed, so it means the same thing on any machine.
88
+
89
+ ## [5.8.6] — 2026-08-18
90
+
91
+ *The queue the two 5.8.5 re-audits left, worked in their own order, and the
92
+ theme is again measurement: two of the five rows were closed by **refuting the
93
+ premise the queue carried** — the HTTP-input walk's cost turned out to be a
94
+ parse nobody needed, and the rule pass everyone wanted parallelised is 8 % of
95
+ the clock. The only defect either corpus still held open — WebFlux functional
96
+ routing, eight cycles — is modelled. Four features that had been proposed for
97
+ three rounds without landing shipped behind it.*
98
+
99
+ ### Fixed
100
+ - **A series never measures a commit it has already measured** (C3-129,
101
+ residual of C3-128). The phase split said 82,9 % `measure:<metric>` and
102
+ 13,8 % materialising the tree, so the command was not slow — it was one
103
+ analysis paid once per sampled tree, re-paid on every overlapping re-run. A
104
+ sampled metric is a pure function of the tree at a sha, which makes the key
105
+ exact rather than heuristic: analyzer fingerprint + metric + commit. Measured
106
+ on BroadleafCommerce: **26 845 ms → 12 ms** on the same range, samples and
107
+ transitions byte-identical, and the tree is not materialised at all when
108
+ every watched metric is a hit. A failed sample is never stored, the hit is
109
+ published (`sample_cache`, `from_cache`), and `--no-cache` measures
110
+ everything again.
111
+ - **The HTTP-input walk parses only what it can reach** (C3-127). Two corpora
112
+ put `reading HTTP-input query sinks` at the top of `risk`; instrumented, none
113
+ of it was the analysis: 14,0 s of method extraction over 2 766 files feeding
114
+ a walk that runs in 0,01 s and finds nothing. The walk resolves callees by
115
+ name, and a file whose text cannot contain that name cannot declare it — an
116
+ equivalence, not a heuristic. Measured end to end: **risk 13 396 → 5 722 ms
117
+ (−57 %)**, the phase 10 126 → 526 ms, every row byte-identical.
118
+ - **The measurement protocol ships as code, with a control command**
119
+ (P1-proc, seventh request). `steady_verdict` (six runs, not four — a
120
+ transient survived four passes and died on six), `contention_verdict` (a
121
+ control command interleaved: if the cheap command disperses too, the host is
122
+ the subject and nothing may be attributed to the build), `host_verdict` (no
123
+ other `ask` process, since cross-session contention has produced +549 %
124
+ here), and `scripts/perf_harness.py --steady` to run them. The field's three
125
+ sessions are replayed as data, so a later change to a threshold that stops
126
+ classifying them correctly fails in the battery instead of in a round.
127
+ - **Every renamed shape names its producer or says why it cannot** (B21). The
128
+ producer is derived from the registered command tree and the import graph
129
+ rather than typed out; five of the six silent shapes now name a command, and
130
+ the sixth (`canonical-ir-v1`, reached from 28 modules) publishes `substrate`
131
+ with the count, because naming every command would be less true than naming
132
+ none.
133
+
134
+ ### Added
135
+ - **WebFlux functional routing is modelled** (R2, eight cycles, the only defect
136
+ either corpus still held open). Paths are composed along the builder chain —
137
+ `.path(…)`, `.nest(…)`, the predicate form, and Kotlin's `coRouter { }` /
138
+ `"/x".nest { }` — so a route declared `/posts/{name}` under a nested prefix is
139
+ published at the path it is served on. Measured on halo: **0 → 155
140
+ endpoints**, and through the CIR the cascade closes too — `posture` and
141
+ `spring-audit` go from 0 to 173 endpoints analysed. A route whose base path is
142
+ decided where the router is mounted is published with `path_resolution:
143
+ unresolved` and the reason, never at an invented path.
144
+ - **`ask spring-audit --recipe`** (F-BS): the audit report as an
145
+ `openrewrite-plan-v1` document — the findings a published recipe repairs, and
146
+ for every finding no recipe repairs, why its fix is a decision rather than a
147
+ rewrite. On this rule catalogue that first set is empty today, and the plan
148
+ says so: a product claiming to fix a `@Transactional` private method or a
149
+ stored SHA-1 digest would be claiming to make those decisions for you.
150
+ - **`ask regress <before.json> <after.json>`** (F-BU): what moved between two
151
+ answers, with each delta attributed to a declaration the payloads already
152
+ carry, and `unattributed` for the ones nothing explains — the operational
153
+ definition of a silent regression. It refuses comparisons taken under
154
+ different cache states, which is what four of the field's nine false
155
+ positives were.
156
+ - **`ask selftest <repo>`** (F-BV): this product's own defect ledger, run
157
+ against your repository through the entry point you invoke. Seven rows ship;
158
+ a row whose precondition your repository does not meet answers
159
+ `not_applicable` with the reason, never `pass` — a green run over nothing is
160
+ how ASK-09 was closed twice.
161
+ - **`_meta.answer_bounds`** (F-BT): one envelope aggregating the twelve
162
+ disclosure fields this product publishes, so *"can I act on this answer?"* is
163
+ one line instead of twelve. It copies no value — provenance and confidence
164
+ are published as the paths where the payload states them — and lives under
165
+ `_meta`, so no payload shape a consumer pins moves.
166
+
167
+ ### Changed
168
+ - **Four commands leave the experimental tier on their evidence**: `risk`,
169
+ `data-exposure`, `audit-report` and `migrate-recipe` become `supported` after
170
+ ten external rounds on two corpora with a census that never moved. The three
171
+ that stay now name what is still moving (`cli.EXPERIMENTAL_BASIS`), so
172
+ membership of that tier is a decision rather than an omission — `posture`
173
+ spent four releases published as *"do not gate CI on it"* while two field
174
+ evaluations recommended it first.
175
+
5
176
  ## [5.8.5] — 2026-08-18
6
177
 
7
178
  *Six rows, and the theme is that four of them were closed by **measuring** rather
@@ -300,6 +471,27 @@ changes a **published value** while every exit code stays 0. Declared in
300
471
  for the exit-code kind — named in the `--help` of every command it can fire on,
301
472
  so an upgrade can be planned instead of discovered by a red pipeline.*
302
473
 
474
+ ### BC-003 — deprecated payload keys are removed (announced 5.8.7, takes effect 6.0.0)
475
+
476
+ **Who is affected.** Any consumer reading a key that `field_deprecations` lists.
477
+ **No exit code moves**: the key stops being emitted, and a consumer that reads it
478
+ gets nothing rather than a wrong value.
479
+
480
+ A published key that has been replaced is emitted **beside** its replacement for
481
+ the whole window, listed in the payload's own `deprecated_fields`, and described
482
+ in `field_deprecations` with the release that removes it — `alias_of` where the
483
+ key was renamed and is copied from its replacement, `replaced_by` where the
484
+ value is derived differently and the command still produces it. In 6.0.0 those
485
+ keys stop being emitted, and nothing is removed that was not declared here
486
+ first. C3-124 is the reason the channel exists rather than the schedule: an
487
+ experimental tier is permission to change shape, not permission to change it in
488
+ silence.
489
+
490
+ The population is read from `sourcecode.field_deprecations` rather than copied
491
+ here. Today it is the four `pro*` keys on `ask auth status`, which that payload
492
+ publishes side by side with the entitlement block that replaced them — so the
493
+ migration is checkable against one run.
494
+
303
495
  ### BC-002 — `schema_version` values are renamed to their canonical names (announced 5.8.5, takes effect 6.0.0)
304
496
 
305
497
  **Who is affected.** Any consumer that dispatches on the emitted
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sourcecode
3
- Version: 5.8.5
3
+ Version: 5.8.7
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
@@ -49,7 +49,7 @@ Description-Content-Type: text/markdown
49
49
 
50
50
  **Context · Impact · Migration · Architecture · Review — everything from one structural model.**
51
51
 
52
- ![Version](https://img.shields.io/badge/version-5.8.5-blue)
52
+ ![Version](https://img.shields.io/badge/version-5.8.7-blue)
53
53
  ![Python](https://img.shields.io/badge/python-3.9%2B-green)
54
54
 
55
55
  Copyright (c) 2026 Dominique Haroun. All rights reserved. ASK Engine 5.7.0 and
@@ -91,9 +91,11 @@ in the environment, and the heartbeat is emitted by the analysis itself, not onl
91
91
  by a timer thread, so a CPU-bound stretch is never silent. `--jobs N` / `-j`
92
92
  (env `ASK_JOBS`) sets the worker processes that parse files — default CPU count
93
93
  − 1; parallelism only warms the content-addressed parse cache, so the answer is
94
- byte-identical at any value. It does **not** parallelise the rule pass, which is
95
- where a repository-wide audit spends most of its time, and a warm cache leaves it
96
- nothing to parse so raising it there buys nothing. Long repo-wide/deep runs also write durable records
94
+ byte-identical at any value. It does **not** parallelise the rule pass
95
+ measured with `metadata.timings` on a 2 766-file repository, the CIR build is
96
+ 88 % of a repository-wide audit's clock and every rule together 8 %, so the flag
97
+ covers the phase that holds the cost; a warm cache leaves it nothing to parse, so
98
+ raising it there buys nothing. Long repo-wide/deep runs also write durable records
97
99
  under `~/.sourcecode/runs/<repo-hash>/` by default, not inside the audited
98
100
  repository; set `ASK_RUNS_IN_REPO=1` only when repo-local `.ask/runs` records are
99
101
  intentional. Use `ask audit-report --from-risk risk.json` to package an existing
@@ -137,7 +139,7 @@ brew tap haroundominique/sourcecode && brew install sourcecode
137
139
  # pip / pipx
138
140
  pipx install sourcecode # or: pip install sourcecode
139
141
 
140
- ask version # ask 5.8.5 — and, on a build that has aged,
142
+ ask version # ask 5.8.7 — and, on a build that has aged,
141
143
  # how many releases have probably shipped since
142
144
  ```
143
145
 
@@ -328,7 +330,7 @@ Unresolved is a first-class outcome: a condition the resolver cannot decide is r
328
330
  hole with the condition named, never folded into active or inactive. **A posture answer that
329
331
  guesses is a confident security falsehood — the worst failure mode this tool has.**
330
332
 
331
- ### 5c · Composed Risk *(experimental)*
333
+ ### 5c · Composed Risk
332
334
  Every command above answers one axis, and a reader composes them by hand. `ask risk` does the
333
335
  join over the endpoint and symbol ids these commands already share with each other:
334
336
  `severity_effective = defect_severity × reachability × auth_verdict × write_effect × query_construction × input_constraints`. The
@@ -370,7 +372,7 @@ experimental: both are true, and they are two different facts.
370
372
  |---|---|---|
371
373
  | **core** | contract stable within a major — safe to gate CI on | `endpoints` · `spring-audit` · `migrate-check` · `impact` · `impact-chain` · `pr-impact` · `verify` |
372
374
  | **supported** | maintained; fields are added, never removed without a major | every command not named in another row |
373
- | **experimental** | shape may change in a minor — do not gate CI on it | `risk` · `enrich` · `audit-report` · `data-exposure` · `migrate-recipe` · `archetype` · `timeline` |
375
+ | **experimental** | shape may change in a minor — do not gate CI on it | `enrich` · `archetype` · `timeline` |
374
376
  | **parked** | kept working, no longer developed | `retrieve` |
375
377
 
376
378
  The same table is printed by `ask --help`, and both are generated from one authority
@@ -387,11 +389,11 @@ from it.
387
389
  | Command | Tier | Answers | Note |
388
390
  |---|---|---|---|
389
391
  | `posture` | supported | which beans a profile set wires, and how effective endpoint access differs between two sets | the most differentiated capability here. `--resolve-environments` says which set the repository decides; `--profile-from <file>` reads the artefact that actually decides it (Kubernetes manifest, compose file, deployment plan, `Dockerfile`, dotenv) and answers under that set, with the `file:line` — deciding nothing leaves the verdict untouched |
390
- | `risk` | experimental | what each defect actually costs, once reach, access, write effect and the shape of the input path are in it | `defect_severity × reachability × auth_verdict × write_effect × query_construction × input_constraints`; every factor names its authority; the `query_construction` factor covers MyBatis `${}` splicing with a three-state verdict (`reaches` / `does_not_reach` / `undecidable`) and publishes the census; `--table --rule SEC-008 --band high --top-n 20` gives audit triage without `jq` |
392
+ | `risk` | supported | what each defect actually costs, once reach, access, write effect and the shape of the input path are in it | `defect_severity × reachability × auth_verdict × write_effect × query_construction × input_constraints`; every factor names its authority; the `query_construction` factor covers MyBatis `${}` splicing with a three-state verdict (`reaches` / `does_not_reach` / `undecidable`) and publishes the census; `--table --rule SEC-008 --band high --top-n 20` gives audit triage without `jq` |
391
393
  | `enrich` | experimental | another scanner's SARIF findings, ranked by what this repository does with them | `--sarif <log>`; same composition as `risk`, with `--table --rule <id> --band high --top-n 20` for triage |
392
- | `audit-report` | experimental | human audit bundle over existing `risk` + `posture` evidence, optionally signed | includes `evidence_manifest` claim provenance; `--format markdown`; `--sign-key <file>` signs canonical JSON with HMAC-SHA256 |
393
- | `migrate-recipe` | experimental | the migration report as the OpenRewrite recipe that applies it | only recipes a finding named; the manual remainder published beside them; writes nothing without `--write`, and never a runnable command for an empty recipe list |
394
- | `data-exposure` | experimental | which routes can carry the data you labelled, and who reaches them | labels declared in `sourcecode.config.json` — never inferred from a name; `signature` and `call_reach` evidence published apart, field-level flow out of scope (NC-008). With nothing declared, `ask data-exposure /path/to/repo` answers `answered: false` and hands back the file, the key and an example to declare — it never reports zero exposed routes |
394
+ | `audit-report` | supported | human audit bundle over existing `risk` + `posture` evidence, optionally signed | includes `evidence_manifest` claim provenance; `--format markdown`; `--sign-key <file>` signs canonical JSON with HMAC-SHA256 |
395
+ | `migrate-recipe` | supported | the migration report as the OpenRewrite recipe that applies it | only recipes a finding named; the manual remainder published beside them; writes nothing without `--write`, and never a runnable command for an empty recipe list |
396
+ | `data-exposure` | supported | which routes can carry the data you labelled, and who reaches them | labels declared in `sourcecode.config.json` — never inferred from a name; `signature` and `call_reach` evidence published apart, field-level flow out of scope (NC-008). With nothing declared, `ask data-exposure /path/to/repo` answers `answered: false` and hands back the file, the key and an example to declare — it never reports zero exposed routes |
395
397
  | `endpoints` | core | every REST endpoint, effective path, security policy, confidence | Spring MVC + JAX-RS (~65 % recall on JAX-RS sub-resource locators). `--compact` answers the exposure census without the rows; `--servlets` lists the servlet-mounted surface as its own population; `--client-usage` says which routes the TS/JS client in this repository actually calls; `--consumer <repo>` (repeatable) joins the routes against consumers in **other** repositories — TypeScript/JS and Java — and turns the census into a surface-reduction plan: open and called (fix now), open and called by nobody (delete rather than guard), and calls this server serves no route for |
396
398
  | `spring-audit` | core | transactional anomalies + security configuration/exposure + validation gaps | `--ci`, `-f github-comment`; `--table --rule SEC-008 --top-n 20` for human-scale review. Every run inventories its own rules — `rules_run`, `rules_not_run`, `rules_partially_run`, `rules_run_count`/`rules_total` — so "all of them" is a fact, not an assumption |
397
399
  | `migrate-check` | core | Boot 2→3 readiness + Java LTS/licensing inventory: located blockers, per-dimension score, effort, detected Java 8/11/17/21/25 evidence and explicit licensing-review signals | `--target-jdk 25` sets the target LTS route; `--blast-radius` orders the re-test plan; `--table --rule MIG-001 --band critical --top-n 20` for blocker triage |
@@ -409,6 +411,9 @@ from it.
409
411
  | `baseline capture\|diff` · `trend` | supported | versioned architectural metrics over time; `ask trend .` reads the series (a repository path or a baselines directory), `ask baseline diff .` compares the tree against its newest point | trend reporting, not gating. Baselines land in `.ask/baselines` **inside the repository** — the history travels with the code, not with a vendor; an audit that must not write passes `--dir`. `capture --auto` is the unattended form (one baseline per commit, never rewrites one, never fails the build) — automate it: [baseline-ci.yml](docs/baseline-ci.yml) |
410
412
  | `retrieve` | parked | typed knowledge queries over the model | |
411
413
  | `timeline` | experimental | since when a number moved, and in which commit window | walks the commit series and re-runs the shipped analyses (`posture`, `data-exposure`, `endpoints`, `spring-audit`) on a read-only materialisation of each sampled tree; publishes transitions, not a per-commit dump. A sample that could not be analysed is `null` with a reason, never 0, and a transition under sampling carries the window it could have happened in |
414
+ | `regress` | supported | what moved between two payloads of the same command, and which declaration accounts for it | attributes each delta to a declaration the answers carry (`test_source_excluded`, `symbols_excluded`, `coverage.gaps`, `*_cap`, `waivers`); a delta nothing explains is `unattributed`. Refuses the comparison when `cache_layers`, `base_env` or the analyzer fingerprint differ |
415
+ | `explain-endpoint` | supported | the derivation behind one route's verdict | six steps — match, declaration, handler, chain, profiles, verdict — each naming the authority that produced it and the file it can be checked against; a step that could not be derived is `undetermined` with the reason, never absent |
416
+ | `selftest` | supported | this product's own defect ledger, run against your repository | each ledger row's acceptance criterion as an executable assertion, with the subject (repository, size, platform, entry point) beside every verdict; a row whose precondition the repository does not meet is `not_applicable` with the reason, never a pass |
412
417
  | `archetype` | experimental | evidence-based architectural archetype | |
413
418
  | `rename-class` / `chunk-file` | supported | word-boundary Java rename; split a large file for an agent | |
414
419
  | `cache status\|warm\|model\|clear` · `auth` · `telemetry` · `mcp` · `config` · `version` | supported | housekeeping | `cache model [path]` explains what a warm buys per command; `activate` too |
@@ -4,7 +4,7 @@
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.8.5-blue)
7
+ ![Version](https://img.shields.io/badge/version-5.8.7-blue)
8
8
  ![Python](https://img.shields.io/badge/python-3.9%2B-green)
9
9
 
10
10
  Copyright (c) 2026 Dominique Haroun. All rights reserved. ASK Engine 5.7.0 and
@@ -46,9 +46,11 @@ in the environment, and the heartbeat is emitted by the analysis itself, not onl
46
46
  by a timer thread, so a CPU-bound stretch is never silent. `--jobs N` / `-j`
47
47
  (env `ASK_JOBS`) sets the worker processes that parse files — default CPU count
48
48
  − 1; parallelism only warms the content-addressed parse cache, so the answer is
49
- byte-identical at any value. It does **not** parallelise the rule pass, which is
50
- where a repository-wide audit spends most of its time, and a warm cache leaves it
51
- nothing to parse so raising it there buys nothing. Long repo-wide/deep runs also write durable records
49
+ byte-identical at any value. It does **not** parallelise the rule pass
50
+ measured with `metadata.timings` on a 2 766-file repository, the CIR build is
51
+ 88 % of a repository-wide audit's clock and every rule together 8 %, so the flag
52
+ covers the phase that holds the cost; a warm cache leaves it nothing to parse, so
53
+ raising it there buys nothing. Long repo-wide/deep runs also write durable records
52
54
  under `~/.sourcecode/runs/<repo-hash>/` by default, not inside the audited
53
55
  repository; set `ASK_RUNS_IN_REPO=1` only when repo-local `.ask/runs` records are
54
56
  intentional. Use `ask audit-report --from-risk risk.json` to package an existing
@@ -92,7 +94,7 @@ brew tap haroundominique/sourcecode && brew install sourcecode
92
94
  # pip / pipx
93
95
  pipx install sourcecode # or: pip install sourcecode
94
96
 
95
- ask version # ask 5.8.5 — and, on a build that has aged,
97
+ ask version # ask 5.8.7 — and, on a build that has aged,
96
98
  # how many releases have probably shipped since
97
99
  ```
98
100
 
@@ -283,7 +285,7 @@ Unresolved is a first-class outcome: a condition the resolver cannot decide is r
283
285
  hole with the condition named, never folded into active or inactive. **A posture answer that
284
286
  guesses is a confident security falsehood — the worst failure mode this tool has.**
285
287
 
286
- ### 5c · Composed Risk *(experimental)*
288
+ ### 5c · Composed Risk
287
289
  Every command above answers one axis, and a reader composes them by hand. `ask risk` does the
288
290
  join over the endpoint and symbol ids these commands already share with each other:
289
291
  `severity_effective = defect_severity × reachability × auth_verdict × write_effect × query_construction × input_constraints`. The
@@ -325,7 +327,7 @@ experimental: both are true, and they are two different facts.
325
327
  |---|---|---|
326
328
  | **core** | contract stable within a major — safe to gate CI on | `endpoints` · `spring-audit` · `migrate-check` · `impact` · `impact-chain` · `pr-impact` · `verify` |
327
329
  | **supported** | maintained; fields are added, never removed without a major | every command not named in another row |
328
- | **experimental** | shape may change in a minor — do not gate CI on it | `risk` · `enrich` · `audit-report` · `data-exposure` · `migrate-recipe` · `archetype` · `timeline` |
330
+ | **experimental** | shape may change in a minor — do not gate CI on it | `enrich` · `archetype` · `timeline` |
329
331
  | **parked** | kept working, no longer developed | `retrieve` |
330
332
 
331
333
  The same table is printed by `ask --help`, and both are generated from one authority
@@ -342,11 +344,11 @@ from it.
342
344
  | Command | Tier | Answers | Note |
343
345
  |---|---|---|---|
344
346
  | `posture` | supported | which beans a profile set wires, and how effective endpoint access differs between two sets | the most differentiated capability here. `--resolve-environments` says which set the repository decides; `--profile-from <file>` reads the artefact that actually decides it (Kubernetes manifest, compose file, deployment plan, `Dockerfile`, dotenv) and answers under that set, with the `file:line` — deciding nothing leaves the verdict untouched |
345
- | `risk` | experimental | what each defect actually costs, once reach, access, write effect and the shape of the input path are in it | `defect_severity × reachability × auth_verdict × write_effect × query_construction × input_constraints`; every factor names its authority; the `query_construction` factor covers MyBatis `${}` splicing with a three-state verdict (`reaches` / `does_not_reach` / `undecidable`) and publishes the census; `--table --rule SEC-008 --band high --top-n 20` gives audit triage without `jq` |
347
+ | `risk` | supported | what each defect actually costs, once reach, access, write effect and the shape of the input path are in it | `defect_severity × reachability × auth_verdict × write_effect × query_construction × input_constraints`; every factor names its authority; the `query_construction` factor covers MyBatis `${}` splicing with a three-state verdict (`reaches` / `does_not_reach` / `undecidable`) and publishes the census; `--table --rule SEC-008 --band high --top-n 20` gives audit triage without `jq` |
346
348
  | `enrich` | experimental | another scanner's SARIF findings, ranked by what this repository does with them | `--sarif <log>`; same composition as `risk`, with `--table --rule <id> --band high --top-n 20` for triage |
347
- | `audit-report` | experimental | human audit bundle over existing `risk` + `posture` evidence, optionally signed | includes `evidence_manifest` claim provenance; `--format markdown`; `--sign-key <file>` signs canonical JSON with HMAC-SHA256 |
348
- | `migrate-recipe` | experimental | the migration report as the OpenRewrite recipe that applies it | only recipes a finding named; the manual remainder published beside them; writes nothing without `--write`, and never a runnable command for an empty recipe list |
349
- | `data-exposure` | experimental | which routes can carry the data you labelled, and who reaches them | labels declared in `sourcecode.config.json` — never inferred from a name; `signature` and `call_reach` evidence published apart, field-level flow out of scope (NC-008). With nothing declared, `ask data-exposure /path/to/repo` answers `answered: false` and hands back the file, the key and an example to declare — it never reports zero exposed routes |
349
+ | `audit-report` | supported | human audit bundle over existing `risk` + `posture` evidence, optionally signed | includes `evidence_manifest` claim provenance; `--format markdown`; `--sign-key <file>` signs canonical JSON with HMAC-SHA256 |
350
+ | `migrate-recipe` | supported | the migration report as the OpenRewrite recipe that applies it | only recipes a finding named; the manual remainder published beside them; writes nothing without `--write`, and never a runnable command for an empty recipe list |
351
+ | `data-exposure` | supported | which routes can carry the data you labelled, and who reaches them | labels declared in `sourcecode.config.json` — never inferred from a name; `signature` and `call_reach` evidence published apart, field-level flow out of scope (NC-008). With nothing declared, `ask data-exposure /path/to/repo` answers `answered: false` and hands back the file, the key and an example to declare — it never reports zero exposed routes |
350
352
  | `endpoints` | core | every REST endpoint, effective path, security policy, confidence | Spring MVC + JAX-RS (~65 % recall on JAX-RS sub-resource locators). `--compact` answers the exposure census without the rows; `--servlets` lists the servlet-mounted surface as its own population; `--client-usage` says which routes the TS/JS client in this repository actually calls; `--consumer <repo>` (repeatable) joins the routes against consumers in **other** repositories — TypeScript/JS and Java — and turns the census into a surface-reduction plan: open and called (fix now), open and called by nobody (delete rather than guard), and calls this server serves no route for |
351
353
  | `spring-audit` | core | transactional anomalies + security configuration/exposure + validation gaps | `--ci`, `-f github-comment`; `--table --rule SEC-008 --top-n 20` for human-scale review. Every run inventories its own rules — `rules_run`, `rules_not_run`, `rules_partially_run`, `rules_run_count`/`rules_total` — so "all of them" is a fact, not an assumption |
352
354
  | `migrate-check` | core | Boot 2→3 readiness + Java LTS/licensing inventory: located blockers, per-dimension score, effort, detected Java 8/11/17/21/25 evidence and explicit licensing-review signals | `--target-jdk 25` sets the target LTS route; `--blast-radius` orders the re-test plan; `--table --rule MIG-001 --band critical --top-n 20` for blocker triage |
@@ -364,6 +366,9 @@ from it.
364
366
  | `baseline capture\|diff` · `trend` | supported | versioned architectural metrics over time; `ask trend .` reads the series (a repository path or a baselines directory), `ask baseline diff .` compares the tree against its newest point | trend reporting, not gating. Baselines land in `.ask/baselines` **inside the repository** — the history travels with the code, not with a vendor; an audit that must not write passes `--dir`. `capture --auto` is the unattended form (one baseline per commit, never rewrites one, never fails the build) — automate it: [baseline-ci.yml](docs/baseline-ci.yml) |
365
367
  | `retrieve` | parked | typed knowledge queries over the model | |
366
368
  | `timeline` | experimental | since when a number moved, and in which commit window | walks the commit series and re-runs the shipped analyses (`posture`, `data-exposure`, `endpoints`, `spring-audit`) on a read-only materialisation of each sampled tree; publishes transitions, not a per-commit dump. A sample that could not be analysed is `null` with a reason, never 0, and a transition under sampling carries the window it could have happened in |
369
+ | `regress` | supported | what moved between two payloads of the same command, and which declaration accounts for it | attributes each delta to a declaration the answers carry (`test_source_excluded`, `symbols_excluded`, `coverage.gaps`, `*_cap`, `waivers`); a delta nothing explains is `unattributed`. Refuses the comparison when `cache_layers`, `base_env` or the analyzer fingerprint differ |
370
+ | `explain-endpoint` | supported | the derivation behind one route's verdict | six steps — match, declaration, handler, chain, profiles, verdict — each naming the authority that produced it and the file it can be checked against; a step that could not be derived is `undetermined` with the reason, never absent |
371
+ | `selftest` | supported | this product's own defect ledger, run against your repository | each ledger row's acceptance criterion as an executable assertion, with the subject (repository, size, platform, entry point) beside every verdict; a row whose precondition the repository does not meet is `not_applicable` with the reason, never a pass |
367
372
  | `archetype` | experimental | evidence-based architectural archetype | |
368
373
  | `rename-class` / `chunk-file` | supported | word-boundary Java rename; split a large file for an agent | |
369
374
  | `cache status\|warm\|model\|clear` · `auth` · `telemetry` · `mcp` · `config` · `version` | supported | housekeeping | `cache model [path]` explains what a warm buys per command; `activate` too |
@@ -65,6 +65,7 @@ the enclosing monorepo, and `cache status` / `cache clear` resolve to that same
65
65
  | `ris` | the Repository Intelligence Snapshot — structural index, endpoint index, summaries | tree state (the snapshot records the tree it describes) | rebuilt on every warm |
66
66
  | `cir` | the shared Canonical IR — the Java parse every knowledge command reuses | tree state · analyzer fingerprint · schema version | built |
67
67
  | `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 |
68
+ | `timeline-samples` | one watched metric as measured at one sampled commit, so a series re-run over an overlapping range measures only what is new (C3-129) | the analyzer fingerprint and the commit sha, both in the key. The tree at a sha never changes, so an entry is never stale — the fingerprint is what keeps a corrected analysis from being served from a previous release. `timeline --no-cache` (or `ASK_TIMELINE_NO_SAMPLE_CACHE=1`) measures every sample again | never — a warm analyses the working tree, not history |
68
69
  | `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, and the last interval before a process exits is never swept — so the store rests up to one interval per writing process above its budget, and the figure to size a disk by is the ceiling `cache status` publishes beside it, not the budget itself (ASK-15)) and reported in `cache status` (F-AR) | filled for every Java file the warm parses |
69
70
 
70
71
  Measured on BroadleafCommerce (2 000+ Java files, dirty tree), warm machine, 3.2.2, each command in isolation.
@@ -106,7 +107,10 @@ The second anchor is the field one, and it carries its own build for the same re
106
107
  | `modernize` | the shared work | 5.2 s → 3.0 s | no | `parse` | Blocked in the session that recorded C3-53 and measured since: a run that did not finish once is not a command that cannot finish. |
107
108
  | `chunk-file` | nothing | not timed | no | — | Reads one file; nothing to cache. |
108
109
  | `cold-start` | the answer | 0.2 s either way | yes | `ris` | Reads the RIS a warm rebuilds — that is all it does. Without one it answers `no_ris` instead of a snapshot. |
109
- | `timeline` | nothing | not timed | no | | Each sample is a fresh materialisation of a different commit, so nothing is shared between samples: two commits are two trees, and a cache keyed on a tree state can only ever serve one of them. The per-sample cost is measured and published in the payload. |
110
+ | `timeline` | nothing | not timed | yes | `timeline-samples` | Two commits are two trees, so nothing is shared *within* a run but a metric at a commit is a pure function of that tree, and the tree at a sha never changes, so a sample an earlier run of this analyser already measured is read from the store instead of being measured again (C3-129). A warm builds nothing for it: a warm analyses the working tree, not history. `--no-cache` measures every sample again, and the payload publishes the hits. |
111
+ | `explain-endpoint` | the shared work | not measured on the battery yet — bounded by `endpoints` on the same repository | yes | `cir`, `parse` | Builds the repository IR to answer about ONE route, so the warm it shares with `endpoints` and `posture` is the whole difference between a question you ask once and a question you ask twenty times. |
112
+ | `selftest` | the shared work | not timed | no | `cir`, `parse` | Runs the ledger's acceptance criteria by invoking other commands against this repository, so it inherits their layers — a warm makes those runs warm. It holds no cache of its own and stores nothing. |
113
+ | `regress` | nothing | not timed | no | — | Diffs two payload files this CLI already wrote; analyses no source, so no cache layer applies. What it reads about caching is the `cache_layers` field inside those payloads — to refuse a comparison taken under different cache states, not to use one. |
110
114
  | `trend` | nothing | not timed | no | — | Reads stored baseline artifacts from disk; analyses no source, so no cache layer applies. Same command as `baseline trend`. |
111
115
  | `baseline` | the shared work | capture 8.7 s → 3.6 s | no | `parse` | `capture`/`diff`/`trend` over architectural metrics. The field figure is `capture`, the subcommand that analyses; `trend` reads stored artifacts and has its own row. |
112
116
  | `retrieve` | the shared work | not timed | no | `cir`, `parse` | Every query builds or reuses the shared CIR a warm builds. |