sourcecode 5.8.4__tar.gz → 5.8.6__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 (381) hide show
  1. {sourcecode-5.8.4 → sourcecode-5.8.6}/CHANGELOG.md +204 -5
  2. {sourcecode-5.8.4 → sourcecode-5.8.6}/PKG-INFO +11 -9
  3. {sourcecode-5.8.4 → sourcecode-5.8.6}/README.md +10 -8
  4. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/CACHE.md +17 -8
  5. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/DEFECT-LEDGER.md +15 -9
  6. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/DEVELOPMENT-ROADMAP.md +345 -0
  7. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/EXECUTIVE-ROADMAP.md +53 -12
  8. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/USER_GUIDE.md +58 -10
  9. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/perf/REGRESSION-GATE.md +39 -0
  10. {sourcecode-5.8.4 → sourcecode-5.8.6}/pyproject.toml +1 -1
  11. {sourcecode-5.8.4 → sourcecode-5.8.6}/scripts/perf_harness.py +139 -0
  12. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/__init__.py +1 -1
  13. sourcecode-5.8.6/src/sourcecode/answer_bounds.py +230 -0
  14. sourcecode-5.8.6/src/sourcecode/audit_recipe.py +289 -0
  15. sourcecode-5.8.6/src/sourcecode/breaking_changes.py +288 -0
  16. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/cache.py +33 -1
  17. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/cache_model.py +19 -1
  18. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/cli.py +334 -32
  19. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/envelope.py +15 -0
  20. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/format_contract.py +2 -0
  21. sourcecode-5.8.6/src/sourcecode/functional_routes.py +425 -0
  22. sourcecode-5.8.6/src/sourcecode/output_ceiling.py +500 -0
  23. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/parse_cache.py +147 -0
  24. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/perf.py +258 -0
  25. sourcecode-5.8.6/src/sourcecode/regress.py +264 -0
  26. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/release_info.py +1 -1
  27. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/repository_ir.py +208 -18
  28. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/risk.py +163 -32
  29. sourcecode-5.8.6/src/sourcecode/schema_producers.py +247 -0
  30. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/schema_registry.py +62 -2
  31. sourcecode-5.8.6/src/sourcecode/selftest.py +445 -0
  32. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/timeline.py +91 -15
  33. sourcecode-5.8.6/src/sourcecode/timeline_cache.py +174 -0
  34. sourcecode-5.8.4/src/sourcecode/breaking_changes.py +0 -163
  35. sourcecode-5.8.4/src/sourcecode/output_ceiling.py +0 -248
  36. {sourcecode-5.8.4 → sourcecode-5.8.6}/.github/workflows/build-windows.yml +0 -0
  37. {sourcecode-5.8.4 → sourcecode-5.8.6}/.github/workflows/perf-gate.yml +0 -0
  38. {sourcecode-5.8.4 → sourcecode-5.8.6}/.gitignore +0 -0
  39. {sourcecode-5.8.4 → sourcecode-5.8.6}/.ruff.toml +0 -0
  40. {sourcecode-5.8.4 → sourcecode-5.8.6}/CLAUDE.md +0 -0
  41. {sourcecode-5.8.4 → sourcecode-5.8.6}/CONTRIBUTING.md +0 -0
  42. {sourcecode-5.8.4 → sourcecode-5.8.6}/LICENSE +0 -0
  43. {sourcecode-5.8.4 → sourcecode-5.8.6}/NOTICE +0 -0
  44. {sourcecode-5.8.4 → sourcecode-5.8.6}/SECURITY.md +0 -0
  45. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/COMMERCIAL-OFFER.md +0 -0
  46. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/CUSTOMER-VALIDATION.md +0 -0
  47. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/DEMO-5MIN.md +0 -0
  48. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/EXECUTION-PLAN-12MO.md +0 -0
  49. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/MANUAL-USUARIO.md +0 -0
  50. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/MODERNIZATION.md +0 -0
  51. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/PRODUCT_AUDIT.md +0 -0
  52. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/PRODUCT_IDENTITY.md +0 -0
  53. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/PRODUCT_TIERS.md +0 -0
  54. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/RC1-CHECKLIST.md +0 -0
  55. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/RELEASE-CHECKLIST.md +0 -0
  56. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/architecture/CATALOG-retrieval-intents.md +0 -0
  57. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/architecture/DESIGN-knowledge-provider-integration.md +0 -0
  58. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/architecture/DESIGN-p5.3b-statement-surface.md +0 -0
  59. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/architecture/DESIGN-p5.5-span-index.md +0 -0
  60. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/architecture/DESIGN-p6-semantic-impact-engine.md +0 -0
  61. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/architecture/DESIGN-p6-semantic-integration-engine.md +0 -0
  62. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/architecture/DESIGN-p7-semantic-services.md +0 -0
  63. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/architecture/DESIGN-robustness-security-inference.md +0 -0
  64. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/architecture/DESIGN-semantic-retrieval.md +0 -0
  65. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/architecture/EPV-p6-class-typeref.md +0 -0
  66. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/architecture/REPORT-p6-flow-analyzer-comparison.md +0 -0
  67. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/architecture/REPORT-p6-integration-detector-comparison.md +0 -0
  68. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/architecture/REPORT-p8-flow-analyzer-migration.md +0 -0
  69. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/architecture/REPORT-p9-integration-detector-migration.md +0 -0
  70. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/architecture/adr/0001-semantic-ir.md +0 -0
  71. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/architecture/adr/0002-source-evidence-boundary.md +0 -0
  72. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/architecture/adr/0003-architectural-characterization.md +0 -0
  73. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/architecture/adr/0004-semantic-retrieval.md +0 -0
  74. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/architecture/adr/0005-evidence-reconciliation.md +0 -0
  75. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/architecture/adr/0006-performance-harness.md +0 -0
  76. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/architecture/adr/0007-composition-semantics.md +0 -0
  77. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/architecture/adr/0008-answer-coherence.md +0 -0
  78. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/architecture/consumer-disposition-inventory.md +0 -0
  79. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/architecture/overview.md +0 -0
  80. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/architecture/product-architecture-review.md +0 -0
  81. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/architecture/product-strategy-layering.md +0 -0
  82. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/architecture/semantic-ir-consumer-matrix.md +0 -0
  83. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/architecture/semantic-ir-roadmap.md +0 -0
  84. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/baseline-ci.yml +0 -0
  85. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/commercial-pipeline-audit.md +0 -0
  86. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/contracts-ci.yml +0 -0
  87. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/contracts.md +0 -0
  88. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/eval/2026-06-15-petclinic-rest-issue11-vets-pagination.md +0 -0
  89. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/eval/2026-06-15-petclinic-rest-issue147-validation.md +0 -0
  90. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/eval/2026-06-15-petclinic-rest-workflow.md +0 -0
  91. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/eval/2026-06-15-phase18-openapi-surface.md +0 -0
  92. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/eval/2026-06-15-phase20-validation-surface.md +0 -0
  93. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/eval/2026-06-16-broadleaf-checkout-impact-fieldtest.md +0 -0
  94. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/eval/2026-06-16-petclinic-rest-issue11-weakness2-closed.md +0 -0
  95. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/eval/2026-06-16-spring-petclinic-issue2333-dead-vets.md +0 -0
  96. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/licensing-schema.md +0 -0
  97. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/migrate-check.md +0 -0
  98. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/perf/README.md +0 -0
  99. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/perf/baselines/2.5.15/SUMMARY.md +0 -0
  100. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/perf/baselines/2.5.15/alfresco__ask__cold.json +0 -0
  101. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/perf/baselines/2.5.15/alfresco__ask__warm.json +0 -0
  102. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/perf/baselines/2.5.15/broadleaf__ask__cold.json +0 -0
  103. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/perf/baselines/2.5.15/broadleaf__ask__warm.json +0 -0
  104. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/perf/baselines/2.5.15/eureka__ask__cold.json +0 -0
  105. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/perf/baselines/2.5.15/eureka__ask__warm.json +0 -0
  106. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/perf/baselines/2.5.15/jenkins__ask__cold.json +0 -0
  107. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/perf/baselines/2.5.15/jenkins__ask__warm.json +0 -0
  108. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/perf/baselines/2.5.15/jobrunr__ask__cold.json +0 -0
  109. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/perf/baselines/2.5.15/jobrunr__ask__warm.json +0 -0
  110. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/perf/baselines/2.5.15/keycloak__ask__cold.json +0 -0
  111. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/perf/baselines/2.5.15/keycloak__ask__warm.json +0 -0
  112. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/perf/baselines/2.5.15/neo4j__ask__cold.json +0 -0
  113. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/perf/baselines/2.5.15/neo4j__ask__warm.json +0 -0
  114. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/perf/baselines/2.5.15/ofbiz__ask__cold.json +0 -0
  115. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/perf/baselines/2.5.15/ofbiz__ask__warm.json +0 -0
  116. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/perf/baselines/2.5.15/openmrs__ask__cold.json +0 -0
  117. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/perf/baselines/2.5.15/openmrs__ask__warm.json +0 -0
  118. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/perf/baselines/2.5.15/petclinic__ask__cold.json +0 -0
  119. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/perf/baselines/2.5.15/petclinic__ask__warm.json +0 -0
  120. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/perf/baselines/2.5.16/SUMMARY.md +0 -0
  121. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/perf/baselines/2.5.16/alfresco__ask__cold.json +0 -0
  122. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/perf/baselines/2.5.16/alfresco__ask__warm.json +0 -0
  123. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/perf/baselines/2.5.16/broadleaf__ask__cold.json +0 -0
  124. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/perf/baselines/2.5.16/broadleaf__ask__warm.json +0 -0
  125. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/perf/baselines/2.5.16/eureka__ask__cold.json +0 -0
  126. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/perf/baselines/2.5.16/eureka__ask__warm.json +0 -0
  127. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/perf/baselines/2.5.16/jenkins__ask__cold.json +0 -0
  128. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/perf/baselines/2.5.16/jenkins__ask__warm.json +0 -0
  129. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/perf/baselines/2.5.16/jobrunr__ask__cold.json +0 -0
  130. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/perf/baselines/2.5.16/jobrunr__ask__warm.json +0 -0
  131. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/perf/baselines/2.5.16/keycloak__ask__cold.json +0 -0
  132. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/perf/baselines/2.5.16/keycloak__ask__warm.json +0 -0
  133. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/perf/baselines/2.5.16/neo4j__ask__cold.json +0 -0
  134. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/perf/baselines/2.5.16/neo4j__ask__warm.json +0 -0
  135. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/perf/baselines/2.5.16/ofbiz__ask__cold.json +0 -0
  136. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/perf/baselines/2.5.16/ofbiz__ask__warm.json +0 -0
  137. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/perf/baselines/2.5.16/openmrs__ask__cold.json +0 -0
  138. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/perf/baselines/2.5.16/openmrs__ask__warm.json +0 -0
  139. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/perf/baselines/2.5.16/petclinic__ask__cold.json +0 -0
  140. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/perf/baselines/2.5.16/petclinic__ask__warm.json +0 -0
  141. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/perf/baselines/gate-latest/README.md +0 -0
  142. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/perf/baselines/gate-latest/broadleaf__ask__warm.json +0 -0
  143. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/perf/baselines/gate-latest/broadleaf__endpoints__warm.json +0 -0
  144. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/perf/baselines/gate-latest/broadleaf__migrate-check__warm.json +0 -0
  145. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/perf/baselines/gate-latest/broadleaf__posture__warm.json +0 -0
  146. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/perf/baselines/gate-latest/broadleaf__spring-audit__warm.json +0 -0
  147. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/perf/baselines/gate-latest/broadleaf__validation__warm.json +0 -0
  148. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/perf/baselines/reference-best/README.md +0 -0
  149. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/posture.md +0 -0
  150. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/privacy.md +0 -0
  151. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/pro-experience-audit.md +0 -0
  152. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/schema.md +0 -0
  153. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/spec/envelope-v1.md +0 -0
  154. {sourcecode-5.8.4 → sourcecode-5.8.6}/docs/spring-audit-ci.yml +0 -0
  155. {sourcecode-5.8.4 → sourcecode-5.8.6}/scripts/compare_integration_engines.py +0 -0
  156. {sourcecode-5.8.4 → sourcecode-5.8.6}/scripts/customer_smoke_test.sh +0 -0
  157. {sourcecode-5.8.4 → sourcecode-5.8.6}/scripts/generate_jdk_exports.py +0 -0
  158. {sourcecode-5.8.4 → sourcecode-5.8.6}/scripts/perf_gate.py +0 -0
  159. {sourcecode-5.8.4 → sourcecode-5.8.6}/scripts/sync_gate_anchors.py +0 -0
  160. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/adaptive_scanner.py +0 -0
  161. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/archetype.py +0 -0
  162. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/architectural_baseline.py +0 -0
  163. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/architectural_delta.py +0 -0
  164. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/architecture_analyzer.py +0 -0
  165. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/architecture_summary.py +0 -0
  166. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/ast_extractor.py +0 -0
  167. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/audit_report.py +0 -0
  168. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/baseline_autocapture.py +0 -0
  169. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/build_modules.py +0 -0
  170. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/bundled_docs.py +0 -0
  171. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/call_surface.py +0 -0
  172. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/caller_metrics.py +0 -0
  173. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/caller_reach.py +0 -0
  174. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/canonical_ir.py +0 -0
  175. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/chain_rules.py +0 -0
  176. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/change_plan.py +0 -0
  177. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/cir_graphs.py +0 -0
  178. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/classifier.py +0 -0
  179. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/client_calls.py +0 -0
  180. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/code_notes_analyzer.py +0 -0
  181. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/compare.py +0 -0
  182. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/confidence_analyzer.py +0 -0
  183. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/constraint_diff.py +0 -0
  184. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/consumer_join.py +0 -0
  185. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/container_wiring.py +0 -0
  186. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/context_cache.py +0 -0
  187. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/context_graph.py +0 -0
  188. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/context_scorer.py +0 -0
  189. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/context_summarizer.py +0 -0
  190. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/contract_diff.py +0 -0
  191. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/contract_init.py +0 -0
  192. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/contract_model.py +0 -0
  193. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/contract_pipeline.py +0 -0
  194. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/coverage_parser.py +0 -0
  195. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/data_exposure.py +0 -0
  196. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/data_labels.py +0 -0
  197. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/declarations.py +0 -0
  198. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/defect_identity.py +0 -0
  199. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/degradation.py +0 -0
  200. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/dependency_analyzer.py +0 -0
  201. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/deployment_prefix.py +0 -0
  202. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/detach.py +0 -0
  203. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/detectors/__init__.py +0 -0
  204. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/detectors/base.py +0 -0
  205. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/detectors/csproj_parser.py +0 -0
  206. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/detectors/dart.py +0 -0
  207. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/detectors/dotnet.py +0 -0
  208. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/detectors/elixir.py +0 -0
  209. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/detectors/go.py +0 -0
  210. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/detectors/heuristic.py +0 -0
  211. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/detectors/hybrid.py +0 -0
  212. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/detectors/java.py +0 -0
  213. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/detectors/jvm_ext.py +0 -0
  214. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/detectors/nodejs.py +0 -0
  215. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/detectors/parsers.py +0 -0
  216. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/detectors/php.py +0 -0
  217. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/detectors/project.py +0 -0
  218. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/detectors/python.py +0 -0
  219. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/detectors/ruby.py +0 -0
  220. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/detectors/rust.py +0 -0
  221. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/detectors/systems.py +0 -0
  222. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/detectors/terraform.py +0 -0
  223. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/detectors/tooling.py +0 -0
  224. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/doc_analyzer.py +0 -0
  225. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/dynamic_argument_surface.py +0 -0
  226. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/empty_reach.py +0 -0
  227. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/endpoint_disposition.py +0 -0
  228. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/endpoint_literals.py +0 -0
  229. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/endpoint_metrics.py +0 -0
  230. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/entrypoint_classifier.py +0 -0
  231. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/env_analyzer.py +0 -0
  232. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/environment_resolution.py +0 -0
  233. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/error_schema.py +0 -0
  234. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/evidence_provider.py +0 -0
  235. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/execution_plan.py +0 -0
  236. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/explain.py +0 -0
  237. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/facts/__init__.py +0 -0
  238. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/facts/registry.json +0 -0
  239. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/file_chunker.py +0 -0
  240. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/file_classifier.py +0 -0
  241. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/filter_surface.py +0 -0
  242. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/fqn_utils.py +0 -0
  243. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/gate_anchors.py +0 -0
  244. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/git_analyzer.py +0 -0
  245. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/git_checkout.py +0 -0
  246. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/graph_analyzer.py +0 -0
  247. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/graph_evidence.py +0 -0
  248. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/hibernate_strat.py +0 -0
  249. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/identity_fallback.py +0 -0
  250. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/integration_coordinates.py +0 -0
  251. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/jdk_exports.py +0 -0
  252. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/license.py +0 -0
  253. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/manifest_cache.py +0 -0
  254. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/mcp/__init__.py +0 -0
  255. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/mcp/dependency_import.py +0 -0
  256. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/mcp/onboarding/__init__.py +0 -0
  257. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/mcp/onboarding/applier.py +0 -0
  258. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/mcp/onboarding/backup.py +0 -0
  259. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/mcp/onboarding/detector.py +0 -0
  260. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/mcp/onboarding/planner.py +0 -0
  261. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/mcp/orchestrator.py +0 -0
  262. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/mcp/registry.py +0 -0
  263. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/mcp/runner.py +0 -0
  264. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/mcp/server.py +0 -0
  265. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/mcp_nudge.py +0 -0
  266. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/metrics_analyzer.py +0 -0
  267. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/migrate_check.py +0 -0
  268. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/migration_blast.py +0 -0
  269. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/non_coverage.py +0 -0
  270. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/openapi_surface.py +0 -0
  271. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/openrewrite_recipe.py +0 -0
  272. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/output_bounds.py +0 -0
  273. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/output_budget.py +0 -0
  274. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/output_encoding.py +0 -0
  275. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/output_sink.py +0 -0
  276. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/parallel.py +0 -0
  277. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/partial_contract.py +0 -0
  278. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/path_admission.py +0 -0
  279. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/path_filters.py +0 -0
  280. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/phased_run.py +0 -0
  281. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/pipe_contract.py +0 -0
  282. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/posture.py +0 -0
  283. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/pr_comment_renderer.py +0 -0
  284. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/pr_impact.py +0 -0
  285. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/prepare_context.py +0 -0
  286. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/product_info.py +0 -0
  287. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/progress.py +0 -0
  288. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/provenance.py +0 -0
  289. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/ranking_engine.py +0 -0
  290. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/readiness_timeline.py +0 -0
  291. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/readonly.py +0 -0
  292. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/reconciliation.py +0 -0
  293. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/redactor.py +0 -0
  294. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/reference_facts.py +0 -0
  295. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/relevance_scorer.py +0 -0
  296. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/remedies.py +0 -0
  297. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/rename_refactor.py +0 -0
  298. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/repo_classifier.py +0 -0
  299. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/retrieval/__init__.py +0 -0
  300. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/retrieval/context.py +0 -0
  301. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/retrieval/errors.py +0 -0
  302. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/retrieval/executor.py +0 -0
  303. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/retrieval/planner.py +0 -0
  304. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/retrieval/query.py +0 -0
  305. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/retrieval/request.py +0 -0
  306. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/retrieval/resolution.py +0 -0
  307. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/retrieval/result.py +0 -0
  308. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/retrieval/retriever.py +0 -0
  309. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/retrieval/runtime.py +0 -0
  310. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/retrieval/steps.py +0 -0
  311. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/retrieval/steps_endpoint.py +0 -0
  312. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/retrieval/steps_graph.py +0 -0
  313. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/retrieval/steps_impact.py +0 -0
  314. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/retrieval/steps_intf.py +0 -0
  315. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/retrieval/steps_struct.py +0 -0
  316. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/retrieval/steps_txsec.py +0 -0
  317. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/ris.py +0 -0
  318. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/risk_model.py +0 -0
  319. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/rule_catalog.py +0 -0
  320. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/rule_pass.py +0 -0
  321. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/runs.py +0 -0
  322. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/runtime_classifier.py +0 -0
  323. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/sarif.py +0 -0
  324. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/scanner.py +0 -0
  325. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/schema.py +0 -0
  326. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/schemas/core-analysis-v1.schema.json +0 -0
  327. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/schemas/endpoints-v1.schema.json +0 -0
  328. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/schemas/envelope-v1.schema.json +0 -0
  329. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/schemas/pr-impact-v1.schema.json +0 -0
  330. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/schemas/verify-edit-v1.schema.json +0 -0
  331. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/schemas/verify-v1.schema.json +0 -0
  332. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/security_chain.py +0 -0
  333. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/security_config.py +0 -0
  334. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/security_config_scan.py +0 -0
  335. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/security_posture.py +0 -0
  336. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/semantic_analyzer.py +0 -0
  337. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/semantic_impact_engine.py +0 -0
  338. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/semantic_integration_engine.py +0 -0
  339. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/semantic_services.py +0 -0
  340. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/serializer.py +0 -0
  341. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/servlet_surface.py +0 -0
  342. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/source_text.py +0 -0
  343. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/spring_event_topology.py +0 -0
  344. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/spring_findings.py +0 -0
  345. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/spring_impact.py +0 -0
  346. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/spring_model.py +0 -0
  347. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/spring_profiles.py +0 -0
  348. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/spring_properties.py +0 -0
  349. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/spring_security_audit.py +0 -0
  350. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/spring_semantic.py +0 -0
  351. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/spring_tx_analyzer.py +0 -0
  352. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/sql_taint.py +0 -0
  353. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/summarizer.py +0 -0
  354. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/target_admission.py +0 -0
  355. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/telemetry/__init__.py +0 -0
  356. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/telemetry/config.py +0 -0
  357. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/telemetry/consent.py +0 -0
  358. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/telemetry/events.py +0 -0
  359. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/telemetry/filters.py +0 -0
  360. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/telemetry/transport.py +0 -0
  361. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/test_gap_ranking.py +0 -0
  362. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/test_sources.py +0 -0
  363. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/text_input.py +0 -0
  364. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/token_estimate.py +0 -0
  365. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/tree_utils.py +0 -0
  366. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/type_usage_surface.py +0 -0
  367. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/validation_inference.py +0 -0
  368. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/validation_surface.py +0 -0
  369. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/verify_edit.py +0 -0
  370. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/verify_repo.py +0 -0
  371. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/verify_rules.py +0 -0
  372. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/version_check.py +0 -0
  373. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/waivers.py +0 -0
  374. {sourcecode-5.8.4 → sourcecode-5.8.6}/src/sourcecode/workspace.py +0 -0
  375. {sourcecode-5.8.4 → sourcecode-5.8.6}/supabase/functions/README.md +0 -0
  376. {sourcecode-5.8.4 → sourcecode-5.8.6}/supabase/functions/get-license/index.ts +0 -0
  377. {sourcecode-5.8.4 → sourcecode-5.8.6}/supabase/functions/lemonsqueezy-webhook/index.ts +0 -0
  378. {sourcecode-5.8.4 → sourcecode-5.8.6}/supabase/functions/telemetry/index.ts +0 -0
  379. {sourcecode-5.8.4 → sourcecode-5.8.6}/supabase/sql/license_event_ordering.sql +0 -0
  380. {sourcecode-5.8.4 → sourcecode-5.8.6}/supabase/sql/licensing_schema.sql +0 -0
  381. {sourcecode-5.8.4 → sourcecode-5.8.6}/supabase/sql/telemetry_events.sql +0 -0
@@ -2,6 +2,173 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [5.8.6] — 2026-08-18
6
+
7
+ *The queue the two 5.8.5 re-audits left, worked in their own order, and the
8
+ theme is again measurement: two of the five rows were closed by **refuting the
9
+ premise the queue carried** — the HTTP-input walk's cost turned out to be a
10
+ parse nobody needed, and the rule pass everyone wanted parallelised is 8 % of
11
+ the clock. The only defect either corpus still held open — WebFlux functional
12
+ routing, eight cycles — is modelled. Four features that had been proposed for
13
+ three rounds without landing shipped behind it.*
14
+
15
+ ### Fixed
16
+ - **A series never measures a commit it has already measured** (C3-129,
17
+ residual of C3-128). The phase split said 82,9 % `measure:<metric>` and
18
+ 13,8 % materialising the tree, so the command was not slow — it was one
19
+ analysis paid once per sampled tree, re-paid on every overlapping re-run. A
20
+ sampled metric is a pure function of the tree at a sha, which makes the key
21
+ exact rather than heuristic: analyzer fingerprint + metric + commit. Measured
22
+ on BroadleafCommerce: **26 845 ms → 12 ms** on the same range, samples and
23
+ transitions byte-identical, and the tree is not materialised at all when
24
+ every watched metric is a hit. A failed sample is never stored, the hit is
25
+ published (`sample_cache`, `from_cache`), and `--no-cache` measures
26
+ everything again.
27
+ - **The HTTP-input walk parses only what it can reach** (C3-127). Two corpora
28
+ put `reading HTTP-input query sinks` at the top of `risk`; instrumented, none
29
+ of it was the analysis: 14,0 s of method extraction over 2 766 files feeding
30
+ a walk that runs in 0,01 s and finds nothing. The walk resolves callees by
31
+ name, and a file whose text cannot contain that name cannot declare it — an
32
+ equivalence, not a heuristic. Measured end to end: **risk 13 396 → 5 722 ms
33
+ (−57 %)**, the phase 10 126 → 526 ms, every row byte-identical.
34
+ - **The measurement protocol ships as code, with a control command**
35
+ (P1-proc, seventh request). `steady_verdict` (six runs, not four — a
36
+ transient survived four passes and died on six), `contention_verdict` (a
37
+ control command interleaved: if the cheap command disperses too, the host is
38
+ the subject and nothing may be attributed to the build), `host_verdict` (no
39
+ other `ask` process, since cross-session contention has produced +549 %
40
+ here), and `scripts/perf_harness.py --steady` to run them. The field's three
41
+ sessions are replayed as data, so a later change to a threshold that stops
42
+ classifying them correctly fails in the battery instead of in a round.
43
+ - **Every renamed shape names its producer or says why it cannot** (B21). The
44
+ producer is derived from the registered command tree and the import graph
45
+ rather than typed out; five of the six silent shapes now name a command, and
46
+ the sixth (`canonical-ir-v1`, reached from 28 modules) publishes `substrate`
47
+ with the count, because naming every command would be less true than naming
48
+ none.
49
+
50
+ ### Added
51
+ - **WebFlux functional routing is modelled** (R2, eight cycles, the only defect
52
+ either corpus still held open). Paths are composed along the builder chain —
53
+ `.path(…)`, `.nest(…)`, the predicate form, and Kotlin's `coRouter { }` /
54
+ `"/x".nest { }` — so a route declared `/posts/{name}` under a nested prefix is
55
+ published at the path it is served on. Measured on halo: **0 → 155
56
+ endpoints**, and through the CIR the cascade closes too — `posture` and
57
+ `spring-audit` go from 0 to 173 endpoints analysed. A route whose base path is
58
+ decided where the router is mounted is published with `path_resolution:
59
+ unresolved` and the reason, never at an invented path.
60
+ - **`ask spring-audit --recipe`** (F-BS): the audit report as an
61
+ `openrewrite-plan-v1` document — the findings a published recipe repairs, and
62
+ for every finding no recipe repairs, why its fix is a decision rather than a
63
+ rewrite. On this rule catalogue that first set is empty today, and the plan
64
+ says so: a product claiming to fix a `@Transactional` private method or a
65
+ stored SHA-1 digest would be claiming to make those decisions for you.
66
+ - **`ask regress <before.json> <after.json>`** (F-BU): what moved between two
67
+ answers, with each delta attributed to a declaration the payloads already
68
+ carry, and `unattributed` for the ones nothing explains — the operational
69
+ definition of a silent regression. It refuses comparisons taken under
70
+ different cache states, which is what four of the field's nine false
71
+ positives were.
72
+ - **`ask selftest <repo>`** (F-BV): this product's own defect ledger, run
73
+ against your repository through the entry point you invoke. Seven rows ship;
74
+ a row whose precondition your repository does not meet answers
75
+ `not_applicable` with the reason, never `pass` — a green run over nothing is
76
+ how ASK-09 was closed twice.
77
+ - **`_meta.answer_bounds`** (F-BT): one envelope aggregating the twelve
78
+ disclosure fields this product publishes, so *"can I act on this answer?"* is
79
+ one line instead of twelve. It copies no value — provenance and confidence
80
+ are published as the paths where the payload states them — and lives under
81
+ `_meta`, so no payload shape a consumer pins moves.
82
+
83
+ ### Changed
84
+ - **Four commands leave the experimental tier on their evidence**: `risk`,
85
+ `data-exposure`, `audit-report` and `migrate-recipe` become `supported` after
86
+ ten external rounds on two corpora with a census that never moved. The three
87
+ that stay now name what is still moving (`cli.EXPERIMENTAL_BASIS`), so
88
+ membership of that tier is a decision rather than an omission — `posture`
89
+ spent four releases published as *"do not gate CI on it"* while two field
90
+ evaluations recommended it first.
91
+
92
+ ## [5.8.5] — 2026-08-18
93
+
94
+ *Six rows, and the theme is that four of them were closed by **measuring** rather
95
+ than by reasoning — including the one that had been closed twice before on
96
+ reasoning. `ASK-09`'s fifth cycle turned out to be one line of behaviour nobody
97
+ had measured: the hint derived with no Click context returns the field's sentence
98
+ byte for byte, about a command that declares two bounding flags. The `+66 %`
99
+ regression `ASK-17` was holding does not reproduce under controlled conditions
100
+ (+2,3 %), and the mechanism it suspected is worth ~3 %. `timeline`'s 198 s is 83 %
101
+ the analysis it re-runs per tree and 17 % git. And two of the six were found by
102
+ the measurements themselves rather than reported by anyone.*
103
+
104
+ ### Fixed
105
+ - **A ceiling hint that could not read the command's flags now says so** (ASK-09,
106
+ fifth cycle, second false closure). Measured on the previous tree:
107
+ `build_hint(None)` — the guard reached with no Click context — returns *"No
108
+ smaller inline variant is available with the current flags"*, the field's
109
+ sentence byte for byte, about a command that declares `--compact` and
110
+ `--limit`. `_declared_and_used(None)` answered `([], set())` and the prefix rule
111
+ spelled that *absence of a reading* as a *claim about the command*; a
112
+ `CliRunner` always has a context, which is why nine batteries stayed green
113
+ through three cycles. Four halves close it: a **second, context-free authority**
114
+ (the command tree resolved from `sys.argv`, consulted only when the context
115
+ yields no bounding flag); **observability** — every `OUTPUT_TOO_LARGE` refusal
116
+ publishes `hint_basis` (`derived_from`, `command`, `declared_flags`,
117
+ `flags_already_passed`, `context_found`), AST-enforced across all four guards;
118
+ a **loud failure** when nothing could be resolved, instead of a confident
119
+ falsehood; and the collateral the row named — the `--force` bypass read the same
120
+ thread-local and degraded on the identical path. On the field's own subject
121
+ (`tutorials`, 24 074 `.java`, real 50K ceiling): `estimated_tokens: 241 527`,
122
+ 0,06 % from the reporter's 241 394, hint naming both flags.
123
+ - **The shared parse store names which repository is cold** (ASK-17). It is
124
+ content-addressed across repositories, so it published one total for every
125
+ repository the machine had analysed and no attribution — and the field paid
126
+ 457,6 s on a cold `--compact` to discover an eviction. Both halves were already
127
+ held and thrown away: the walk knows the repository and computes the key. The
128
+ run records the pairs, `cache status` intersects them with the entry walk it
129
+ already performs, and coverage is published per repository. The index is merged
130
+ rather than replaced (a `--changed-only` run must not publish *"12 of 12 cached"*
131
+ about a cold repository), carries its basis, and is neither an entry nor
132
+ evictable.
133
+ - **`timeline` publishes where its clock goes** (C3-128). Attribution before
134
+ tuning, the rule ASK-16 proved: BroadleafCommerce, `--since HEAD~5 --watch
135
+ posture`, wall 38 921 ms — `measure:posture` 82,9 %, `materialise_tree` 13,8 %,
136
+ `release_tree` 3,3 %, unaccounted 0,0 %. So five sixths of the cost is the
137
+ analysis re-run per tree by construction; there is no timeline-specific overhead
138
+ to remove, and the gain belongs to the metric being sampled.
139
+ - **The declared `schema_version` renames get a date** (B20). `BC-002`: announced
140
+ 5.8.5, takes effect 6.0.0, printed by `ask schema breaking-changes-v1`, carried
141
+ in `## Upgrading`, and projected into `schemas-v1` as `pending_renames_window` —
142
+ one fact, two surfaces. The registry's policy is generalised rather than
143
+ loosened: a declared change is `kind: exit_code` (must move an exit code) or
144
+ `kind: contract` (must move a published value *and* name when). Correction to
145
+ the reported cause: **seven** shapes spell their version `1.0`, not two.
146
+ - **Every cache store names the variable that moves it** (E-37, found while
147
+ measuring ASK-17). Two variables cover three stores whose defaults are siblings
148
+ under one home, so an operator who empties *the cache* can empty one and be
149
+ served answers out of the other — which is exactly what happened: 2,4 s against
150
+ 113 s, with an empty parse store. `cache status` now publishes `base_env` per
151
+ store from one authority and prints it beside each path; `docs/CACHE.md` carries
152
+ a column instead of a sentence. The assertions are behavioural.
153
+
154
+ ### Measured, not fixed
155
+ - **The `+66 %` cold regression `ASK-17` was holding does not reproduce.**
156
+ `tutorials` (24 073 `.java`), root `--compact`, both cache bases isolated and
157
+ emptied between runs, `ASK_PARSE_CACHE_MAX_MB` fixed: 5.7.2 112,0 / 112,6 s
158
+ against 113,8 / 115,2 s here, **+2,3 %**. With the store pre-filled to 489 MB
159
+ against the default 512 MB budget — the audit's own condition, isolated as the
160
+ only variable — **117,0 s, +2,7 %**. So permanent LRU sweeping costs ~3 %, not
161
+ 66 %. What the measurement *does* confirm is the row's own claim: one
162
+ 24 073-file repository leaves 470 MB in a 512 MB budget, so a second repository
163
+ of any size guarantees a permanently sweeping store. Sizing rule, measured:
164
+ ~20 KB of store per Java file.
165
+
166
+ ### Found on the way
167
+ - **B21**: six of the thirteen shapes being renamed name no producing command
168
+ (`emitted_by: []`) beside seven that do, which reads as *"nothing emits this"* —
169
+ i.e. tells the affected consumer it is unaffected. Each row now carries
170
+ `emitted_by_basis` naming the gap instead of shipping the empty list as a fact.
171
+
5
172
  ## [5.8.4] — 2026-08-17
6
173
 
7
174
  *Four rows, and three of them were reported with the wrong cause — which is the
@@ -213,11 +380,43 @@ cap the message names.*
213
380
 
214
381
  ## Upgrading — incompatible changes
215
382
 
216
- *A change that turns `exit 0` into `exit 1` is a breaking change, and it belongs
217
- here rather than in a line of a release section. Declared in
218
- `sourcecode.breaking_changes`, printed by `ask schema breaking-changes-v1`, and
219
- named in the `--help` of every command it can fire on, so an upgrade can be
220
- planned instead of discovered by a red pipeline.*
383
+ *A change that breaks a caller belongs here rather than in a line of a release
384
+ section. Two kinds qualify: one that turns `exit 0` into `exit 1`, and one that
385
+ changes a **published value** while every exit code stays 0. Declared in
386
+ `sourcecode.breaking_changes`, printed by `ask schema breaking-changes-v1`, and
387
+ for the exit-code kind — named in the `--help` of every command it can fire on,
388
+ so an upgrade can be planned instead of discovered by a red pipeline.*
389
+
390
+ ### BC-002 — `schema_version` values are renamed to their canonical names (announced 5.8.5, takes effect 6.0.0)
391
+
392
+ **Who is affected.** Any consumer that dispatches on the emitted
393
+ `schema_version` string, or validates a payload by matching it. **No exit code
394
+ moves**: a run that answered 0 still answers 0, and what changes is a value
395
+ inside the payload.
396
+
397
+ Thirteen shapes spell their version in a form that does not follow the naming
398
+ rule (`1.0`, `1.1`, `final-v1`, …). Each already carries the name it becomes —
399
+ `ask schema schemas-v1` publishes them as `pending_renames`, and the list is read
400
+ from the registry rather than copied here. **Seven of them spell it `1.0`
401
+ today** — `core-analysis-v1`, `impact-chain-v1`, `pr-impact-v1`,
402
+ `migration-blast-v1`, `spring-impact-v1`, `event-topology-v1` and
403
+ `test-gap-ranking-v1` — so that identifier does not name a contract on its own;
404
+ the registry publishes that as `ambiguous_identifiers`, and `ask schema 1.0`
405
+ resolves to all seven with the canonical name to pin for each.
406
+
407
+ **What was missing until now was the date.** The renames were declared without a
408
+ cut-off, so a consumer could read what would change and not when (B20). The
409
+ window: the emitted value is unchanged for the whole of 5.x, and becomes the
410
+ canonical name in **6.0.0**.
411
+
412
+ **Pin the canonical name today** — `ask schema <canonical>` already resolves, and
413
+ a consumer written against it needs no change in 6.0.0. That is the point of
414
+ announcing a major ahead. **Stop dispatching on `1.0`**: it is ambiguous by
415
+ construction, so match the canonical name or the `subject` the registry publishes
416
+ beside it.
417
+
418
+ The rename is deliberately **not** made early. Renaming an emitted value before
419
+ its window is exactly the incompatible change this policy exists to prevent.
221
420
 
222
421
  ### BC-001 — stdout over the output ceiling exits 1 (since 5.7.0)
223
422
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sourcecode
3
- Version: 5.8.4
3
+ Version: 5.8.6
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.4-blue)
52
+ ![Version](https://img.shields.io/badge/version-5.8.6-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
@@ -137,7 +137,7 @@ brew tap haroundominique/sourcecode && brew install sourcecode
137
137
  # pip / pipx
138
138
  pipx install sourcecode # or: pip install sourcecode
139
139
 
140
- ask version # ask 5.8.4 — and, on a build that has aged,
140
+ ask version # ask 5.8.6 — and, on a build that has aged,
141
141
  # how many releases have probably shipped since
142
142
  ```
143
143
 
@@ -328,7 +328,7 @@ Unresolved is a first-class outcome: a condition the resolver cannot decide is r
328
328
  hole with the condition named, never folded into active or inactive. **A posture answer that
329
329
  guesses is a confident security falsehood — the worst failure mode this tool has.**
330
330
 
331
- ### 5c · Composed Risk *(experimental)*
331
+ ### 5c · Composed Risk
332
332
  Every command above answers one axis, and a reader composes them by hand. `ask risk` does the
333
333
  join over the endpoint and symbol ids these commands already share with each other:
334
334
  `severity_effective = defect_severity × reachability × auth_verdict × write_effect × query_construction × input_constraints`. The
@@ -370,7 +370,7 @@ experimental: both are true, and they are two different facts.
370
370
  |---|---|---|
371
371
  | **core** | contract stable within a major — safe to gate CI on | `endpoints` · `spring-audit` · `migrate-check` · `impact` · `impact-chain` · `pr-impact` · `verify` |
372
372
  | **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` |
373
+ | **experimental** | shape may change in a minor — do not gate CI on it | `enrich` · `archetype` · `timeline` |
374
374
  | **parked** | kept working, no longer developed | `retrieve` |
375
375
 
376
376
  The same table is printed by `ask --help`, and both are generated from one authority
@@ -387,11 +387,11 @@ from it.
387
387
  | Command | Tier | Answers | Note |
388
388
  |---|---|---|---|
389
389
  | `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` |
390
+ | `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
391
  | `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 |
392
+ | `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 |
393
+ | `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 |
394
+ | `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
395
  | `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
396
  | `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
397
  | `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 +409,8 @@ from it.
409
409
  | `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
410
  | `retrieve` | parked | typed knowledge queries over the model | |
411
411
  | `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 |
412
+ | `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 |
413
+ | `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
414
  | `archetype` | experimental | evidence-based architectural archetype | |
413
415
  | `rename-class` / `chunk-file` | supported | word-boundary Java rename; split a large file for an agent | |
414
416
  | `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.4-blue)
7
+ ![Version](https://img.shields.io/badge/version-5.8.6-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
@@ -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.8.4 — and, on a build that has aged,
95
+ ask version # ask 5.8.6 — and, on a build that has aged,
96
96
  # how many releases have probably shipped since
97
97
  ```
98
98
 
@@ -283,7 +283,7 @@ Unresolved is a first-class outcome: a condition the resolver cannot decide is r
283
283
  hole with the condition named, never folded into active or inactive. **A posture answer that
284
284
  guesses is a confident security falsehood — the worst failure mode this tool has.**
285
285
 
286
- ### 5c · Composed Risk *(experimental)*
286
+ ### 5c · Composed Risk
287
287
  Every command above answers one axis, and a reader composes them by hand. `ask risk` does the
288
288
  join over the endpoint and symbol ids these commands already share with each other:
289
289
  `severity_effective = defect_severity × reachability × auth_verdict × write_effect × query_construction × input_constraints`. The
@@ -325,7 +325,7 @@ experimental: both are true, and they are two different facts.
325
325
  |---|---|---|
326
326
  | **core** | contract stable within a major — safe to gate CI on | `endpoints` · `spring-audit` · `migrate-check` · `impact` · `impact-chain` · `pr-impact` · `verify` |
327
327
  | **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` |
328
+ | **experimental** | shape may change in a minor — do not gate CI on it | `enrich` · `archetype` · `timeline` |
329
329
  | **parked** | kept working, no longer developed | `retrieve` |
330
330
 
331
331
  The same table is printed by `ask --help`, and both are generated from one authority
@@ -342,11 +342,11 @@ from it.
342
342
  | Command | Tier | Answers | Note |
343
343
  |---|---|---|---|
344
344
  | `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` |
345
+ | `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
346
  | `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 |
347
+ | `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 |
348
+ | `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 |
349
+ | `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
350
  | `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
351
  | `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
352
  | `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 +364,8 @@ from it.
364
364
  | `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
365
  | `retrieve` | parked | typed knowledge queries over the model | |
366
366
  | `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 |
367
+ | `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 |
368
+ | `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
369
  | `archetype` | experimental | evidence-based architectural archetype | |
368
370
  | `rename-class` / `chunk-file` | supported | word-boundary Java rename; split a large file for an agent | |
369
371
  | `cache status\|warm\|model\|clear` · `auth` · `telemetry` · `mcp` · `config` · `version` | supported | housekeeping | `cache model [path]` explains what a warm buys per command; `activate` too |
@@ -37,13 +37,19 @@ Two things invalidate everything, everywhere:
37
37
 
38
38
  ## Where it lives
39
39
 
40
- | Path | Holds |
41
- |---|---|
42
- | `~/.sourcecode/cache/<repo-id>/` | snapshot cache (`core-*`, `view-*`), the RIS, `prepare-context` task answers |
43
- | `~/.sourcecode/ctx-*.json.gz` | the shared Canonical IR |
44
- | `~/.sourcecode/parse-cache-v1/` | the per-file parse cache |
45
-
46
- `SOURCECODE_CACHE_DIR` and `SOURCECODE_CONTEXT_CACHE_DIR` move them. Nothing leaves the machine.
40
+ | Path | Holds | Moved by |
41
+ |---|---|---|
42
+ | `~/.sourcecode/cache/<repo-id>/` | snapshot cache (`core-*`, `view-*`), the RIS, `prepare-context` task answers | `SOURCECODE_CACHE_DIR` |
43
+ | `~/.sourcecode/ctx-*.json.gz` | the shared Canonical IR | `SOURCECODE_CONTEXT_CACHE_DIR` |
44
+ | `~/.sourcecode/parse-cache-v1/` | the per-file parse cache | `SOURCECODE_CONTEXT_CACHE_DIR` |
45
+
46
+ Two variables, three stores, and the column says which moves which — because the paths are
47
+ siblings under one home and the split is not derivable from them. **Redirecting or emptying one
48
+ and not the other leaves the other serving answers**: measured on 2026-08-18 while taking the
49
+ `ASK-17` A/B, a cold run with only `SOURCECODE_CONTEXT_CACHE_DIR` redirected answered from the
50
+ snapshot store in 2,4 s against 113 s, with an empty parse store — a cold measurement that had
51
+ silently become a warm one (E-37). `ask cache status` names the variable beside each store for
52
+ the same reason. Nothing leaves the machine.
47
53
 
48
54
  The cache is keyed to **the path you analysed**: `cache warm ./service-a` warms `service-a`, not
49
55
  the enclosing monorepo, and `cache status` / `cache clear` resolve to that same scope.
@@ -59,6 +65,7 @@ the enclosing monorepo, and `cache status` / `cache clear` resolve to that same
59
65
  | `ris` | the Repository Intelligence Snapshot — structural index, endpoint index, summaries | tree state (the snapshot records the tree it describes) | rebuilt on every warm |
60
66
  | `cir` | the shared Canonical IR — the Java parse every knowledge command reuses | tree state · analyzer fingerprint · schema version | built |
61
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 |
62
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 |
63
70
 
64
71
  Measured on BroadleafCommerce (2 000+ Java files, dirty tree), warm machine, 3.2.2, each command in isolation.
@@ -100,7 +107,9 @@ The second anchor is the field one, and it carries its own build for the same re
100
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. |
101
108
  | `chunk-file` | nothing | not timed | no | — | Reads one file; nothing to cache. |
102
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. |
103
- | `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
+ | `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. |
112
+ | `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. |
104
113
  | `trend` | nothing | not timed | no | — | Reads stored baseline artifacts from disk; analyses no source, so no cache layer applies. Same command as `baseline trend`. |
105
114
  | `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. |
106
115
  | `retrieve` | the shared work | not timed | no | `cir`, `parse` | Every query builds or reuses the shared CIR a warm builds. |