sourcecode 5.9.1__tar.gz → 5.9.2__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 (449) hide show
  1. {sourcecode-5.9.1 → sourcecode-5.9.2}/CHANGELOG.md +22 -0
  2. {sourcecode-5.9.1 → sourcecode-5.9.2}/PKG-INFO +25 -9
  3. {sourcecode-5.9.1 → sourcecode-5.9.2}/README.md +24 -8
  4. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/CACHE.md +2 -0
  5. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/DEVELOPMENT-ROADMAP.md +11 -5
  6. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/EXECUTIVE-ROADMAP.md +4 -1
  7. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/PRODUCT-ROUTE.md +5 -0
  8. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/USER_GUIDE.md +59 -9
  9. {sourcecode-5.9.1 → sourcecode-5.9.2}/pyproject.toml +1 -1
  10. sourcecode-5.9.2/scripts/context_cost_harness.py +183 -0
  11. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/__init__.py +1 -1
  12. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/audit_report.py +20 -0
  13. sourcecode-5.9.2/src/sourcecode/audit_verify.py +76 -0
  14. sourcecode-5.9.2/src/sourcecode/baseline_attestation.py +77 -0
  15. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/cache_model.py +5 -0
  16. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/cli.py +340 -9
  17. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/format_contract.py +5 -1
  18. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/license.py +42 -0
  19. sourcecode-5.9.2/src/sourcecode/regulatory_pack.py +84 -0
  20. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/release_info.py +1 -1
  21. sourcecode-5.9.2/src/sourcecode/remediation_report.py +78 -0
  22. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/sarif_emit.py +54 -0
  23. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/schema_registry.py +12 -0
  24. sourcecode-5.9.2/src/sourcecode/vex.py +83 -0
  25. {sourcecode-5.9.1 → sourcecode-5.9.2}/.github/workflows/build-windows.yml +0 -0
  26. {sourcecode-5.9.1 → sourcecode-5.9.2}/.github/workflows/perf-gate.yml +0 -0
  27. {sourcecode-5.9.1 → sourcecode-5.9.2}/.github/workflows/windows-battery.yml +0 -0
  28. {sourcecode-5.9.1 → sourcecode-5.9.2}/.gitignore +0 -0
  29. {sourcecode-5.9.1 → sourcecode-5.9.2}/.ruff.toml +0 -0
  30. {sourcecode-5.9.1 → sourcecode-5.9.2}/CLAUDE.md +0 -0
  31. {sourcecode-5.9.1 → sourcecode-5.9.2}/CODE_OF_CONDUCT.md +0 -0
  32. {sourcecode-5.9.1 → sourcecode-5.9.2}/CONTRIBUTING.md +0 -0
  33. {sourcecode-5.9.1 → sourcecode-5.9.2}/LICENSE +0 -0
  34. {sourcecode-5.9.1 → sourcecode-5.9.2}/NOTICE +0 -0
  35. {sourcecode-5.9.1 → sourcecode-5.9.2}/SECURITY.md +0 -0
  36. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/AUDIT-2026-08-22-5.8.22.md +0 -0
  37. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/AUDIT-2026-08-23-5.8.24.md +0 -0
  38. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/AUDIT-2026-08-23-COMMERCIAL.md +0 -0
  39. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/AUDIT-2026-08-23-CORPUS-AMPLIADO.md +0 -0
  40. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/AUDIT-2026-08-23-EXTERNAL-5.8.25.md +0 -0
  41. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/AUDIT-2026-08-23-EXTERNAL-5.8.26.md +0 -0
  42. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/AUDIT-2026-08-23-THINGSBOARD-FINDINGS.md +0 -0
  43. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/AUDIT-2026-08-26-EXTERNAL-5.8.26.md +0 -0
  44. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/AUDIT-2026-08-26-EXTERNAL-5.8.27.md +0 -0
  45. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/AUDIT-2026-08-26-EXTERNAL-5.8.28-PACK.md +0 -0
  46. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/AUDIT-2026-08-26-EXTERNAL-5.8.28.md +0 -0
  47. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/AUDIT-2026-08-26-EXTERNAL-5.8.31.md +0 -0
  48. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/AUDIT-2026-08-26-EXTERNAL-5.8.32.md +0 -0
  49. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/AUDIT-2026-08-26-EXTERNAL-5.9.0.md +0 -0
  50. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/AUDIT-2026-08-26-MONETIZATION.md +0 -0
  51. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/AUDIT-TESTING-CORPUS-2026-08-22.md +0 -0
  52. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/COMMERCIAL-OFFER.md +0 -0
  53. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/CUSTOMER-VALIDATION.md +0 -0
  54. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/DEFECT-LEDGER.md +0 -0
  55. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/DEMO-5MIN.md +0 -0
  56. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/DOCUMENTATION-HYGIENE-2026-08-23.md +0 -0
  57. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/EXECUTION-PLAN-12MO.md +0 -0
  58. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/MANUAL-USUARIO.md +0 -0
  59. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/MODERNIZATION.md +0 -0
  60. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/PRODUCT_AUDIT.md +0 -0
  61. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/PRODUCT_IDENTITY.md +0 -0
  62. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/PRODUCT_TIERS.md +0 -0
  63. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/RC1-CHECKLIST.md +0 -0
  64. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/RELEASE-CHECKLIST.md +0 -0
  65. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/STRATEGY-2026-08-26-AGENT-CONTEXT.md +0 -0
  66. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/architecture/CATALOG-retrieval-intents.md +0 -0
  67. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/architecture/DESIGN-assessment-deployment-evidence.md +0 -0
  68. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/architecture/DESIGN-assessment-report.md +0 -0
  69. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/architecture/DESIGN-build-closure-provenance.md +0 -0
  70. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/architecture/DESIGN-knowledge-provider-integration.md +0 -0
  71. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/architecture/DESIGN-p5.3b-statement-surface.md +0 -0
  72. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/architecture/DESIGN-p5.5-span-index.md +0 -0
  73. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/architecture/DESIGN-p6-semantic-impact-engine.md +0 -0
  74. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/architecture/DESIGN-p6-semantic-integration-engine.md +0 -0
  75. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/architecture/DESIGN-p7-semantic-services.md +0 -0
  76. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/architecture/DESIGN-pack-gate-ci.md +0 -0
  77. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/architecture/DESIGN-pack-manifest.md +0 -0
  78. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/architecture/DESIGN-pack-mcp-api.md +0 -0
  79. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/architecture/DESIGN-robustness-security-inference.md +0 -0
  80. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/architecture/DESIGN-semantic-retrieval.md +0 -0
  81. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/architecture/EPV-p6-class-typeref.md +0 -0
  82. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/architecture/REPORT-p6-flow-analyzer-comparison.md +0 -0
  83. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/architecture/REPORT-p6-integration-detector-comparison.md +0 -0
  84. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/architecture/REPORT-p8-flow-analyzer-migration.md +0 -0
  85. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/architecture/REPORT-p9-integration-detector-migration.md +0 -0
  86. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/architecture/adr/0001-semantic-ir.md +0 -0
  87. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/architecture/adr/0002-source-evidence-boundary.md +0 -0
  88. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/architecture/adr/0003-architectural-characterization.md +0 -0
  89. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/architecture/adr/0004-semantic-retrieval.md +0 -0
  90. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/architecture/adr/0005-evidence-reconciliation.md +0 -0
  91. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/architecture/adr/0006-performance-harness.md +0 -0
  92. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/architecture/adr/0007-composition-semantics.md +0 -0
  93. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/architecture/adr/0008-answer-coherence.md +0 -0
  94. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/architecture/consumer-disposition-inventory.md +0 -0
  95. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/architecture/overview.md +0 -0
  96. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/architecture/product-architecture-review.md +0 -0
  97. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/architecture/product-strategy-layering.md +0 -0
  98. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/architecture/semantic-ir-consumer-matrix.md +0 -0
  99. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/architecture/semantic-ir-roadmap.md +0 -0
  100. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/baseline-ci.yml +0 -0
  101. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/commercial-pipeline-audit.md +0 -0
  102. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/contracts-ci.yml +0 -0
  103. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/contracts.md +0 -0
  104. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/eval/2026-06-15-petclinic-rest-issue11-vets-pagination.md +0 -0
  105. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/eval/2026-06-15-petclinic-rest-issue147-validation.md +0 -0
  106. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/eval/2026-06-15-petclinic-rest-workflow.md +0 -0
  107. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/eval/2026-06-15-phase18-openapi-surface.md +0 -0
  108. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/eval/2026-06-15-phase20-validation-surface.md +0 -0
  109. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/eval/2026-06-16-broadleaf-checkout-impact-fieldtest.md +0 -0
  110. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/eval/2026-06-16-petclinic-rest-issue11-weakness2-closed.md +0 -0
  111. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/eval/2026-06-16-spring-petclinic-issue2333-dead-vets.md +0 -0
  112. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/licensing-schema.md +0 -0
  113. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/migrate-check.md +0 -0
  114. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/pack-gate-github-actions.yml +0 -0
  115. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/pack-gate-gitlab.yml +0 -0
  116. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/perf/README.md +0 -0
  117. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/perf/REGRESSION-GATE.md +0 -0
  118. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/perf/baselines/2.5.15/SUMMARY.md +0 -0
  119. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/perf/baselines/2.5.15/alfresco__ask__cold.json +0 -0
  120. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/perf/baselines/2.5.15/alfresco__ask__warm.json +0 -0
  121. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/perf/baselines/2.5.15/broadleaf__ask__cold.json +0 -0
  122. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/perf/baselines/2.5.15/broadleaf__ask__warm.json +0 -0
  123. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/perf/baselines/2.5.15/eureka__ask__cold.json +0 -0
  124. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/perf/baselines/2.5.15/eureka__ask__warm.json +0 -0
  125. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/perf/baselines/2.5.15/jenkins__ask__cold.json +0 -0
  126. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/perf/baselines/2.5.15/jenkins__ask__warm.json +0 -0
  127. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/perf/baselines/2.5.15/jobrunr__ask__cold.json +0 -0
  128. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/perf/baselines/2.5.15/jobrunr__ask__warm.json +0 -0
  129. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/perf/baselines/2.5.15/keycloak__ask__cold.json +0 -0
  130. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/perf/baselines/2.5.15/keycloak__ask__warm.json +0 -0
  131. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/perf/baselines/2.5.15/neo4j__ask__cold.json +0 -0
  132. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/perf/baselines/2.5.15/neo4j__ask__warm.json +0 -0
  133. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/perf/baselines/2.5.15/ofbiz__ask__cold.json +0 -0
  134. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/perf/baselines/2.5.15/ofbiz__ask__warm.json +0 -0
  135. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/perf/baselines/2.5.15/openmrs__ask__cold.json +0 -0
  136. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/perf/baselines/2.5.15/openmrs__ask__warm.json +0 -0
  137. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/perf/baselines/2.5.15/petclinic__ask__cold.json +0 -0
  138. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/perf/baselines/2.5.15/petclinic__ask__warm.json +0 -0
  139. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/perf/baselines/2.5.16/SUMMARY.md +0 -0
  140. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/perf/baselines/2.5.16/alfresco__ask__cold.json +0 -0
  141. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/perf/baselines/2.5.16/alfresco__ask__warm.json +0 -0
  142. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/perf/baselines/2.5.16/broadleaf__ask__cold.json +0 -0
  143. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/perf/baselines/2.5.16/broadleaf__ask__warm.json +0 -0
  144. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/perf/baselines/2.5.16/eureka__ask__cold.json +0 -0
  145. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/perf/baselines/2.5.16/eureka__ask__warm.json +0 -0
  146. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/perf/baselines/2.5.16/jenkins__ask__cold.json +0 -0
  147. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/perf/baselines/2.5.16/jenkins__ask__warm.json +0 -0
  148. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/perf/baselines/2.5.16/jobrunr__ask__cold.json +0 -0
  149. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/perf/baselines/2.5.16/jobrunr__ask__warm.json +0 -0
  150. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/perf/baselines/2.5.16/keycloak__ask__cold.json +0 -0
  151. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/perf/baselines/2.5.16/keycloak__ask__warm.json +0 -0
  152. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/perf/baselines/2.5.16/neo4j__ask__cold.json +0 -0
  153. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/perf/baselines/2.5.16/neo4j__ask__warm.json +0 -0
  154. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/perf/baselines/2.5.16/ofbiz__ask__cold.json +0 -0
  155. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/perf/baselines/2.5.16/ofbiz__ask__warm.json +0 -0
  156. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/perf/baselines/2.5.16/openmrs__ask__cold.json +0 -0
  157. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/perf/baselines/2.5.16/openmrs__ask__warm.json +0 -0
  158. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/perf/baselines/2.5.16/petclinic__ask__cold.json +0 -0
  159. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/perf/baselines/2.5.16/petclinic__ask__warm.json +0 -0
  160. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/perf/baselines/gate-latest/README.md +0 -0
  161. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/perf/baselines/gate-latest/broadleaf__ask__warm.json +0 -0
  162. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/perf/baselines/gate-latest/broadleaf__endpoints__warm.json +0 -0
  163. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/perf/baselines/gate-latest/broadleaf__migrate-check__warm.json +0 -0
  164. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/perf/baselines/gate-latest/broadleaf__posture__warm.json +0 -0
  165. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/perf/baselines/gate-latest/broadleaf__spring-audit__warm.json +0 -0
  166. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/perf/baselines/gate-latest/broadleaf__validation__warm.json +0 -0
  167. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/perf/baselines/reference-best/README.md +0 -0
  168. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/perf/corpus-testing-2026-08-22.md +0 -0
  169. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/posture.md +0 -0
  170. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/privacy.md +0 -0
  171. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/pro-experience-audit.md +0 -0
  172. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/schema.md +0 -0
  173. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/spec/envelope-v1.md +0 -0
  174. {sourcecode-5.9.1 → sourcecode-5.9.2}/docs/spring-audit-ci.yml +0 -0
  175. {sourcecode-5.9.1 → sourcecode-5.9.2}/hatch_build.py +0 -0
  176. {sourcecode-5.9.1 → sourcecode-5.9.2}/scripts/compare_integration_engines.py +0 -0
  177. {sourcecode-5.9.1 → sourcecode-5.9.2}/scripts/customer_smoke_test.sh +0 -0
  178. {sourcecode-5.9.1 → sourcecode-5.9.2}/scripts/generate_jdk_exports.py +0 -0
  179. {sourcecode-5.9.1 → sourcecode-5.9.2}/scripts/perf_gate.py +0 -0
  180. {sourcecode-5.9.1 → sourcecode-5.9.2}/scripts/perf_harness.py +0 -0
  181. {sourcecode-5.9.1 → sourcecode-5.9.2}/scripts/sync_gate_anchors.py +0 -0
  182. {sourcecode-5.9.1 → sourcecode-5.9.2}/scripts/test_fast.sh +0 -0
  183. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/__main__.py +0 -0
  184. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/access_drift.py +0 -0
  185. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/adaptive_scanner.py +0 -0
  186. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/analysis_budget.py +0 -0
  187. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/answer_bounds.py +0 -0
  188. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/archetype.py +0 -0
  189. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/architectural_baseline.py +0 -0
  190. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/architectural_delta.py +0 -0
  191. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/architecture_analyzer.py +0 -0
  192. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/architecture_summary.py +0 -0
  193. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/ast_extractor.py +0 -0
  194. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/audit_clusters.py +0 -0
  195. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/audit_recipe.py +0 -0
  196. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/audit_since.py +0 -0
  197. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/baseline_autocapture.py +0 -0
  198. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/breaking_changes.py +0 -0
  199. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/build_modules.py +0 -0
  200. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/build_stamp.py +0 -0
  201. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/bundled_docs.py +0 -0
  202. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/c4_render.py +0 -0
  203. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/cache.py +0 -0
  204. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/cache_observation.py +0 -0
  205. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/call_surface.py +0 -0
  206. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/caller_metrics.py +0 -0
  207. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/caller_reach.py +0 -0
  208. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/canonical_ir.py +0 -0
  209. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/chain_rules.py +0 -0
  210. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/change_plan.py +0 -0
  211. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/ci_output.py +0 -0
  212. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/cir_graphs.py +0 -0
  213. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/classifier.py +0 -0
  214. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/client_calls.py +0 -0
  215. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/code_notes_analyzer.py +0 -0
  216. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/compare.py +0 -0
  217. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/confidence_analyzer.py +0 -0
  218. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/constraint_diff.py +0 -0
  219. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/consumer_join.py +0 -0
  220. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/container_wiring.py +0 -0
  221. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/context_cache.py +0 -0
  222. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/context_graph.py +0 -0
  223. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/context_scorer.py +0 -0
  224. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/context_summarizer.py +0 -0
  225. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/contract_diff.py +0 -0
  226. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/contract_init.py +0 -0
  227. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/contract_model.py +0 -0
  228. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/contract_pipeline.py +0 -0
  229. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/coverage_parser.py +0 -0
  230. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/cve_feed.py +0 -0
  231. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/cve_reachability.py +0 -0
  232. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/data_exposure.py +0 -0
  233. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/data_labels.py +0 -0
  234. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/declarations.py +0 -0
  235. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/defect_classes/__init__.py +0 -0
  236. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/defect_classes/registry.json +0 -0
  237. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/defect_identity.py +0 -0
  238. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/degradation.py +0 -0
  239. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/dependency_analyzer.py +0 -0
  240. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/deployment_prefix.py +0 -0
  241. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/detach.py +0 -0
  242. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/detectors/__init__.py +0 -0
  243. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/detectors/base.py +0 -0
  244. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/detectors/csproj_parser.py +0 -0
  245. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/detectors/dart.py +0 -0
  246. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/detectors/dotnet.py +0 -0
  247. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/detectors/elixir.py +0 -0
  248. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/detectors/go.py +0 -0
  249. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/detectors/heuristic.py +0 -0
  250. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/detectors/hybrid.py +0 -0
  251. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/detectors/java.py +0 -0
  252. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/detectors/jvm_ext.py +0 -0
  253. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/detectors/nodejs.py +0 -0
  254. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/detectors/parsers.py +0 -0
  255. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/detectors/php.py +0 -0
  256. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/detectors/project.py +0 -0
  257. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/detectors/python.py +0 -0
  258. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/detectors/ruby.py +0 -0
  259. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/detectors/rust.py +0 -0
  260. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/detectors/systems.py +0 -0
  261. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/detectors/terraform.py +0 -0
  262. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/detectors/tooling.py +0 -0
  263. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/doc_analyzer.py +0 -0
  264. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/dynamic_argument_surface.py +0 -0
  265. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/empty_reach.py +0 -0
  266. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/endpoint_disposition.py +0 -0
  267. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/endpoint_literals.py +0 -0
  268. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/endpoint_metrics.py +0 -0
  269. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/entrypoint_classifier.py +0 -0
  270. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/env_analyzer.py +0 -0
  271. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/envelope.py +0 -0
  272. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/environment_resolution.py +0 -0
  273. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/error_schema.py +0 -0
  274. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/evidence_provider.py +0 -0
  275. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/execution_plan.py +0 -0
  276. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/explain.py +0 -0
  277. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/explain_endpoint.py +0 -0
  278. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/facts/__init__.py +0 -0
  279. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/facts/registry.json +0 -0
  280. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/field_deprecations.py +0 -0
  281. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/file_chunker.py +0 -0
  282. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/file_classifier.py +0 -0
  283. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/filter_surface.py +0 -0
  284. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/findings_baseline.py +0 -0
  285. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/fqn_utils.py +0 -0
  286. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/functional_routes.py +0 -0
  287. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/gate_anchors.py +0 -0
  288. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/git_analyzer.py +0 -0
  289. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/git_checkout.py +0 -0
  290. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/github_diff.py +0 -0
  291. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/graph_analyzer.py +0 -0
  292. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/graph_evidence.py +0 -0
  293. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/hibernate_strat.py +0 -0
  294. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/identity_fallback.py +0 -0
  295. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/integration_coordinates.py +0 -0
  296. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/intent_router.py +0 -0
  297. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/jdk_exports.py +0 -0
  298. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/manifest_cache.py +0 -0
  299. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/mcp/__init__.py +0 -0
  300. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/mcp/dependency_import.py +0 -0
  301. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/mcp/onboarding/__init__.py +0 -0
  302. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/mcp/onboarding/applier.py +0 -0
  303. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/mcp/onboarding/backup.py +0 -0
  304. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/mcp/onboarding/detector.py +0 -0
  305. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/mcp/onboarding/planner.py +0 -0
  306. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/mcp/orchestrator.py +0 -0
  307. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/mcp/registry.py +0 -0
  308. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/mcp/runner.py +0 -0
  309. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/mcp/server.py +0 -0
  310. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/mcp_nudge.py +0 -0
  311. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/metrics_analyzer.py +0 -0
  312. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/migrate_check.py +0 -0
  313. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/migration_apply.py +0 -0
  314. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/migration_blast.py +0 -0
  315. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/non_coverage.py +0 -0
  316. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/openapi_surface.py +0 -0
  317. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/openrewrite_recipe.py +0 -0
  318. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/output_bounds.py +0 -0
  319. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/output_budget.py +0 -0
  320. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/output_ceiling.py +0 -0
  321. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/output_encoding.py +0 -0
  322. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/output_sink.py +0 -0
  323. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/pack_manifest.py +0 -0
  324. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/packs.py +0 -0
  325. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/parallel.py +0 -0
  326. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/parse_cache.py +0 -0
  327. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/partial_contract.py +0 -0
  328. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/path_admission.py +0 -0
  329. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/path_display.py +0 -0
  330. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/path_filters.py +0 -0
  331. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/perf.py +0 -0
  332. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/phased_run.py +0 -0
  333. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/pipe_contract.py +0 -0
  334. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/posture.py +0 -0
  335. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/pr_comment_renderer.py +0 -0
  336. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/pr_impact.py +0 -0
  337. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/pr_risk.py +0 -0
  338. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/prepare_context.py +0 -0
  339. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/product_info.py +0 -0
  340. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/progress.py +0 -0
  341. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/provenance.py +0 -0
  342. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/ranking_engine.py +0 -0
  343. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/readiness_timeline.py +0 -0
  344. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/readonly.py +0 -0
  345. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/reconciliation.py +0 -0
  346. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/redactor.py +0 -0
  347. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/reference_facts.py +0 -0
  348. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/regress.py +0 -0
  349. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/relevance_scorer.py +0 -0
  350. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/remediation_diff.py +0 -0
  351. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/remediation_flow.py +0 -0
  352. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/remedies.py +0 -0
  353. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/rename_refactor.py +0 -0
  354. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/repo_classifier.py +0 -0
  355. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/repository_ir.py +0 -0
  356. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/resource_budget.py +0 -0
  357. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/retrieval/__init__.py +0 -0
  358. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/retrieval/context.py +0 -0
  359. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/retrieval/errors.py +0 -0
  360. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/retrieval/executor.py +0 -0
  361. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/retrieval/planner.py +0 -0
  362. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/retrieval/query.py +0 -0
  363. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/retrieval/request.py +0 -0
  364. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/retrieval/resolution.py +0 -0
  365. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/retrieval/result.py +0 -0
  366. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/retrieval/retriever.py +0 -0
  367. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/retrieval/runtime.py +0 -0
  368. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/retrieval/steps.py +0 -0
  369. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/retrieval/steps_endpoint.py +0 -0
  370. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/retrieval/steps_graph.py +0 -0
  371. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/retrieval/steps_impact.py +0 -0
  372. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/retrieval/steps_intf.py +0 -0
  373. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/retrieval/steps_struct.py +0 -0
  374. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/retrieval/steps_txsec.py +0 -0
  375. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/ris.py +0 -0
  376. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/risk.py +0 -0
  377. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/risk_model.py +0 -0
  378. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/rule_catalog.py +0 -0
  379. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/rule_pass.py +0 -0
  380. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/runs.py +0 -0
  381. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/runtime_classifier.py +0 -0
  382. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/sarif.py +0 -0
  383. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/scanner.py +0 -0
  384. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/schema.py +0 -0
  385. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/schema_producers.py +0 -0
  386. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/schemas/core-analysis-v1.schema.json +0 -0
  387. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/schemas/cve-reachability-v1.schema.json +0 -0
  388. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/schemas/endpoints-v1.schema.json +0 -0
  389. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/schemas/envelope-v1.schema.json +0 -0
  390. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/schemas/pr-impact-v1.schema.json +0 -0
  391. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/schemas/verify-edit-v1.schema.json +0 -0
  392. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/schemas/verify-v1.schema.json +0 -0
  393. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/security_chain.py +0 -0
  394. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/security_config.py +0 -0
  395. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/security_config_scan.py +0 -0
  396. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/security_posture.py +0 -0
  397. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/selection_contract.py +0 -0
  398. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/self_audit.py +0 -0
  399. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/selftest.py +0 -0
  400. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/semantic_analyzer.py +0 -0
  401. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/semantic_impact_engine.py +0 -0
  402. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/semantic_integration_engine.py +0 -0
  403. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/semantic_services.py +0 -0
  404. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/serializer.py +0 -0
  405. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/servlet_surface.py +0 -0
  406. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/source_text.py +0 -0
  407. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/spring_event_topology.py +0 -0
  408. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/spring_findings.py +0 -0
  409. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/spring_impact.py +0 -0
  410. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/spring_model.py +0 -0
  411. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/spring_profiles.py +0 -0
  412. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/spring_properties.py +0 -0
  413. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/spring_security_audit.py +0 -0
  414. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/spring_semantic.py +0 -0
  415. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/spring_tx_analyzer.py +0 -0
  416. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/sql_taint.py +0 -0
  417. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/summarizer.py +0 -0
  418. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/target_admission.py +0 -0
  419. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/telemetry/__init__.py +0 -0
  420. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/telemetry/config.py +0 -0
  421. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/telemetry/consent.py +0 -0
  422. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/telemetry/events.py +0 -0
  423. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/telemetry/filters.py +0 -0
  424. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/telemetry/transport.py +0 -0
  425. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/test_gap_ranking.py +0 -0
  426. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/test_sources.py +0 -0
  427. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/text_input.py +0 -0
  428. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/timeline.py +0 -0
  429. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/timeline_cache.py +0 -0
  430. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/token_estimate.py +0 -0
  431. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/tree_utils.py +0 -0
  432. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/type_usage_surface.py +0 -0
  433. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/validation_inference.py +0 -0
  434. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/validation_surface.py +0 -0
  435. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/verify_edit.py +0 -0
  436. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/verify_repo.py +0 -0
  437. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/verify_rules.py +0 -0
  438. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/version_check.py +0 -0
  439. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/waivers.py +0 -0
  440. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/watch_loop.py +0 -0
  441. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/wired_surface.py +0 -0
  442. {sourcecode-5.9.1 → sourcecode-5.9.2}/src/sourcecode/workspace.py +0 -0
  443. {sourcecode-5.9.1 → sourcecode-5.9.2}/supabase/functions/README.md +0 -0
  444. {sourcecode-5.9.1 → sourcecode-5.9.2}/supabase/functions/get-license/index.ts +0 -0
  445. {sourcecode-5.9.1 → sourcecode-5.9.2}/supabase/functions/lemonsqueezy-webhook/index.ts +0 -0
  446. {sourcecode-5.9.1 → sourcecode-5.9.2}/supabase/functions/telemetry/index.ts +0 -0
  447. {sourcecode-5.9.1 → sourcecode-5.9.2}/supabase/sql/license_event_ordering.sql +0 -0
  448. {sourcecode-5.9.1 → sourcecode-5.9.2}/supabase/sql/licensing_schema.sql +0 -0
  449. {sourcecode-5.9.1 → sourcecode-5.9.2}/supabase/sql/telemetry_events.sql +0 -0
@@ -1,5 +1,27 @@
1
1
  # Changelog
2
2
 
3
+ ## [5.9.2] — 2026-08-27
4
+
5
+ *Commercial positioning increment: bounded agent context, reproducible cost
6
+ measurement, source-level SARIF delivery and workspace entitlement pilot.*
7
+
8
+ **Added**
9
+
10
+ - `repo-ir --budget-tokens N` composes with `--since` and declares graph
11
+ non-coverage instead of truncating an answer.
12
+ - `scripts/context_cost_harness.py` compares two declared task commands without
13
+ a shell and publishes no delta unless both sides resolve comparably.
14
+ - `migrate-check --format sarif` emits ASK-owned migration findings with source
15
+ locations, provenance and non-coverage.
16
+ - `auth workspace --enforce` provides an opt-in named-buyer pilot using the
17
+ existing Pro gate; advisory mode remains the default.
18
+
19
+ **Documentation and validation**
20
+
21
+ - README, user guide, roadmap and CLI help describe the new commercial surfaces.
22
+ - The changes were verified against the four repositories in
23
+ `Documents/workspace/testing` and the focused regression batteries.
24
+
3
25
  ## [5.9.1] — 2026-08-26
4
26
 
5
27
  *Audit correction and stress-validation patch release. The `AUD-608` fixes
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sourcecode
3
- Version: 5.9.1
3
+ Version: 5.9.2
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
@@ -59,7 +59,7 @@ Description-Content-Type: text/markdown
59
59
  > question. All analysis is local and deterministic; see [Privacy](#configuration--privacy)
60
60
  > before inspecting a repository whose telemetry policy you need to control.
61
61
 
62
- ![Version](https://img.shields.io/badge/version-5.9.1-blue)
62
+ ![Version](https://img.shields.io/badge/version-5.9.2-blue)
63
63
  ![Python](https://img.shields.io/badge/python-3.9%2B-green)
64
64
 
65
65
  Copyright (c) 2026 Dominique Haroun. All rights reserved. ASK Engine 5.7.0 and
@@ -122,6 +122,14 @@ the CI signal; `--allow-unverified` can change only that exit code, never the
122
122
  reported verdict. Every pack carries a manifest with component invocations,
123
123
  source evidence and content fingerprints.
124
124
 
125
+ For agent integrations, `ask repo-ir --since <ref> --budget-tokens N` bounds the
126
+ serialized inline answer. If the full graph does not fit, ASK returns its summary
127
+ view and declares `token_budget.coverage: non_coverage`; it never silently truncates
128
+ JSON. For a rerunnable cost comparison, use `scripts/context_cost_harness.py` with
129
+ explicit `--with-ask` and `--without-ask` command templates. It executes without a
130
+ shell and publishes a token delta only when both commands resolve and `--comparable`
131
+ is declared.
132
+
125
133
  The [Product Route](docs/PRODUCT-ROUTE.md) is normative: ASK focuses on
126
134
  deterministic evidence for Java/Spring modernization and safe change. Packs
127
135
  compose existing commands; they do not hide or replace them.
@@ -188,7 +196,7 @@ set `ASK_MAX_RSS_MB=<megabytes>`; if the process exceeds it, ASK refuses the
188
196
  answer with `MEMORY_TOO_LARGE`, including the observed peak and limit. Leave it
189
197
  unset, or set it to `0`, to disable the ceiling explicitly.
190
198
 
191
- **Current performance status.** Release 5.9.1 retains the shared Canonical IR
199
+ **Current performance status.** Release 5.9.2 retains the shared Canonical IR
192
200
  path used by `validation` and now passes that same CIR into labelled `data-exposure`
193
201
  runs; the no-label path remains parse-free. These are implementation properties,
194
202
  not duration promises. A controlled external warm-path audit has opened performance
@@ -197,6 +205,13 @@ and bounded-output regressions for this release; use `ask cache model <repo>` an
197
205
  [latest external audit intake](docs/AUDIT-2026-08-26-EXTERNAL-5.9.0.md) before
198
206
  treating a historical timing or bounded flag as a current guarantee.
199
207
 
208
+ **CI delivery and workspace licensing.** `migrate-check --format sarif` emits
209
+ ASK-owned migration findings with source locations and provenance; it does not
210
+ re-emit imported scanner findings. `ask auth workspace <repo>...` previews the
211
+ aggregate Java entitlement. `--enforce` is an opt-in named-buyer pilot that reuses
212
+ the existing Pro gate; advisory mode remains the default and no billing is
213
+ performed by the CLI.
214
+
200
215
  **What a warm actually covers.** `ask cache warm` rebuilds the declared root views and their
201
216
  shared structural layers (L1/L2 + the Repository Intelligence Snapshot + the shared Canonical
202
217
  IR). Pass `--views compact` or `--views compact,agent` to warm only selected views; without
@@ -222,7 +237,7 @@ brew tap haroundominique/sourcecode && brew install sourcecode
222
237
  # pip / pipx
223
238
  pipx install sourcecode # or: pip install sourcecode
224
239
 
225
- ask version # ask 5.9.1 — and, on a build that has aged,
240
+ ask version # ask 5.9.2 — and, on a build that has aged,
226
241
  # how many releases have probably shipped since
227
242
  ```
228
243
 
@@ -506,27 +521,28 @@ from it.
506
521
  | `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 |
507
522
  | `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` |
508
523
  | `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 |
509
- | `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 |
524
+ | `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; `--pack ens` adds a technical ENS control matrix |
525
+ | `audit-verify` | supported | offline verification of a signed `audit-report` bundle | recomputes the canonical payload and HMAC-SHA256; returns `valid: true/false` and a CI-friendly exit code without re-running the audit |
510
526
  | `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 |
511
527
  | `migrate-apply` | supported | apply a measured recipe without touching the main tree | Maven and Gradle executors; plan by default; `--write` requires clean Git, pinned version and isolated worktree; no automatic commit or merge |
512
528
  | `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 |
513
529
  | `data-exposure --init` | supported | generate review-only label candidates | writes only `.ask/data-label-candidates-v1.json` with `status: proposed_only`; it never activates labels |
514
530
  | `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 |
515
531
  | `spring-audit` | core | transactional anomalies + security configuration/exposure + validation gaps | `--ci`, `-f github-comment`, or `-f github-actions` for native CI annotations; `--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 |
516
- | `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; `--format github-actions` emits a stable CI annotation; `--table --rule MIG-001 --band critical --top-n 20` for blocker triage |
532
+ | `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; `--format github-actions` emits a stable CI annotation; `--format sarif` emits located ASK-owned findings; `--table --rule MIG-001 --band critical --top-n 20` for blocker triage |
517
533
  | `impact` / `impact-chain` | core | blast radius of a change, to the endpoints it reaches | target the **interface**, not the `Impl` |
518
534
  | `pr-impact` | core | the same, scoped to a PR diff | local `git diff HEAD`, `--since REF`, explicit `--files`, or opt-in `--pr NUMBER`; `--format github-actions` emits CI annotations; `--fail-on` gates |
519
535
  | `verify` | core | does the repo satisfy its declared contracts, **relative to a baseline** | `.ask/contracts.yml`; `--format github-actions` emits a native CI annotation while preserving exit 0/1/2. `.ask/waivers.yml` adjudicates a finding as *not a defect here* (stable id + required reason, optional expiry) so a reviewed row stops holding the gate red — a baseline records accepted debt, a waiver says it was never a defect |
520
536
  | `verify-edit` | supported | did the working-tree edits change runtime behaviour | semantic diff gate for the edit loop |
521
537
  | `--compact` / `--agent` | — | bounded structural context for an agent | flags of the root command, not commands: not tiered |
522
538
  | `onboard` / `explain` / `cold-start` | supported | orientation in an unfamiliar repo; per-class summary; bootstrap snapshot | `onboard` publishes `population`, `population_unit` and `population_total` for its source-file universe |
523
- | `export` / `repo-ir` / `schema` | supported | tool-agnostic views (C4, module graph, integrations); symbol-level IR; published JSON Schemas | `export --c4 --render mermaid\|svg` **draws** the model instead of only emitting it presentation over the same payload, with the node cap written on the canvas |
539
+ | `export` / `repo-ir` / `schema` | supported | tool-agnostic views (C4, module graph, integrations); symbol-level IR; published JSON Schemas | `export --c4 --render mermaid\|svg` **draws** the model instead of only emitting it; `repo-ir --since REF --budget-tokens N` provides bounded, deterministic agent context |
524
540
  | `modernize` | supported | coupling hubs, cycles, dead zones, refactor candidates | |
525
541
  | `review-pr` / `fix-bug` / `prepare-context` | supported | diff review, symptom triage, task-shaped context | |
526
542
  | `plan` / `compare` / `delta` / `contract-diff` | supported | what to review for a change; candidates by measured cost; outcome of a change; public-contract break | no verdicts, measured cost only |
527
543
  | `validation` | supported | request-body validation coverage and gaps | |
528
- | `baseline capture\|diff` · `trend` | supported | versioned architectural metrics over time — and, with `--kind findings`, the **defect population** as a series, so "open since 5.8.28" is answerable without anybody keeping the tally (`first_seen` is the earliest STORED capture, and the payload says so); `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) |
529
- | `cve` | supported | which dependency advisories a route can actually **reach** — not which are on the classpath | reads a **local** OSV feed (`--feed`); takes no network at analysis time, so a CI gate can never pass because a fetch timed out. Four verdicts: `reachable` (with the routes), `imported_not_exposed`, `not_observed` and `unknown`. Nothing answers *"not reachable"* — reflection, SPI loading and container wiring reach code no source edge names — and an unresolved Maven version is `unknown`, never `not_affected`. Feed staleness is read off the feed's own dates |
544
+ | `baseline capture\|diff\|trend\|attest` | supported | versioned architectural metrics over time, findings history and a bounded read-only evidence attestation (`baseline-attestation-v1`) with explicit comparability and non-coverage | trend reporting and evidence continuity, not gating or legal compliance. Baselines land in `.ask/baselines` **inside the repository** or an external `--dir`; automate capture with [baseline-ci.yml](docs/baseline-ci.yml) |
545
+ | `cve` | supported | which dependency advisories a route can actually **reach** — not which are on the classpath | reads a **local** OSV feed (`--feed`) and optional local VEX statements (`--vex`); VEX is matched exactly and annotates `accepted_by_vex` without changing reachability; takes no network at analysis time |
530
546
  | `intent` | supported | a plain-language question, resolved to the typed `retrieve` query that answers it | `ask intent "what breaks if I change OrderService?"`. A scored lexical match against a declared vocabulary — **no model, no generation** — so it resolves identically on every machine. It selects a query and prints it; `--run` executes it. A question fitting two intents too closely is refused with both named, because a well-formed answer to a question you did not ask is invisible once printed |
531
547
  | `remediate` | supported | the loop from a finding to a **verified** change | audit → recipe → apply in a dedicated worktree → `verify-edit`. Dry by default. Most findings are not mechanical and the plan says which and why; an apply that could not be verified reports `unverified`, never `applied` |
532
548
  | `pr-risk` | supported | one verdict for **this diff** — does the change make things worse? | `pack gate` answers about the repository; this answers about the change. Joins `pr-impact` reach, endpoint access, the shared risk model and CODEOWNERS. `--since` differences route inventories so `new_endpoints` is a fact rather than a guess. A changed file that maps to no class caps the verdict at `UNKNOWN`, which fails every gate — a partial blast radius is not a small one |
@@ -10,7 +10,7 @@
10
10
  > question. All analysis is local and deterministic; see [Privacy](#configuration--privacy)
11
11
  > before inspecting a repository whose telemetry policy you need to control.
12
12
 
13
- ![Version](https://img.shields.io/badge/version-5.9.1-blue)
13
+ ![Version](https://img.shields.io/badge/version-5.9.2-blue)
14
14
  ![Python](https://img.shields.io/badge/python-3.9%2B-green)
15
15
 
16
16
  Copyright (c) 2026 Dominique Haroun. All rights reserved. ASK Engine 5.7.0 and
@@ -73,6 +73,14 @@ the CI signal; `--allow-unverified` can change only that exit code, never the
73
73
  reported verdict. Every pack carries a manifest with component invocations,
74
74
  source evidence and content fingerprints.
75
75
 
76
+ For agent integrations, `ask repo-ir --since <ref> --budget-tokens N` bounds the
77
+ serialized inline answer. If the full graph does not fit, ASK returns its summary
78
+ view and declares `token_budget.coverage: non_coverage`; it never silently truncates
79
+ JSON. For a rerunnable cost comparison, use `scripts/context_cost_harness.py` with
80
+ explicit `--with-ask` and `--without-ask` command templates. It executes without a
81
+ shell and publishes a token delta only when both commands resolve and `--comparable`
82
+ is declared.
83
+
76
84
  The [Product Route](docs/PRODUCT-ROUTE.md) is normative: ASK focuses on
77
85
  deterministic evidence for Java/Spring modernization and safe change. Packs
78
86
  compose existing commands; they do not hide or replace them.
@@ -139,7 +147,7 @@ set `ASK_MAX_RSS_MB=<megabytes>`; if the process exceeds it, ASK refuses the
139
147
  answer with `MEMORY_TOO_LARGE`, including the observed peak and limit. Leave it
140
148
  unset, or set it to `0`, to disable the ceiling explicitly.
141
149
 
142
- **Current performance status.** Release 5.9.1 retains the shared Canonical IR
150
+ **Current performance status.** Release 5.9.2 retains the shared Canonical IR
143
151
  path used by `validation` and now passes that same CIR into labelled `data-exposure`
144
152
  runs; the no-label path remains parse-free. These are implementation properties,
145
153
  not duration promises. A controlled external warm-path audit has opened performance
@@ -148,6 +156,13 @@ and bounded-output regressions for this release; use `ask cache model <repo>` an
148
156
  [latest external audit intake](docs/AUDIT-2026-08-26-EXTERNAL-5.9.0.md) before
149
157
  treating a historical timing or bounded flag as a current guarantee.
150
158
 
159
+ **CI delivery and workspace licensing.** `migrate-check --format sarif` emits
160
+ ASK-owned migration findings with source locations and provenance; it does not
161
+ re-emit imported scanner findings. `ask auth workspace <repo>...` previews the
162
+ aggregate Java entitlement. `--enforce` is an opt-in named-buyer pilot that reuses
163
+ the existing Pro gate; advisory mode remains the default and no billing is
164
+ performed by the CLI.
165
+
151
166
  **What a warm actually covers.** `ask cache warm` rebuilds the declared root views and their
152
167
  shared structural layers (L1/L2 + the Repository Intelligence Snapshot + the shared Canonical
153
168
  IR). Pass `--views compact` or `--views compact,agent` to warm only selected views; without
@@ -173,7 +188,7 @@ brew tap haroundominique/sourcecode && brew install sourcecode
173
188
  # pip / pipx
174
189
  pipx install sourcecode # or: pip install sourcecode
175
190
 
176
- ask version # ask 5.9.1 — and, on a build that has aged,
191
+ ask version # ask 5.9.2 — and, on a build that has aged,
177
192
  # how many releases have probably shipped since
178
193
  ```
179
194
 
@@ -457,27 +472,28 @@ from it.
457
472
  | `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 |
458
473
  | `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` |
459
474
  | `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 |
460
- | `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 |
475
+ | `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; `--pack ens` adds a technical ENS control matrix |
476
+ | `audit-verify` | supported | offline verification of a signed `audit-report` bundle | recomputes the canonical payload and HMAC-SHA256; returns `valid: true/false` and a CI-friendly exit code without re-running the audit |
461
477
  | `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 |
462
478
  | `migrate-apply` | supported | apply a measured recipe without touching the main tree | Maven and Gradle executors; plan by default; `--write` requires clean Git, pinned version and isolated worktree; no automatic commit or merge |
463
479
  | `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 |
464
480
  | `data-exposure --init` | supported | generate review-only label candidates | writes only `.ask/data-label-candidates-v1.json` with `status: proposed_only`; it never activates labels |
465
481
  | `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 |
466
482
  | `spring-audit` | core | transactional anomalies + security configuration/exposure + validation gaps | `--ci`, `-f github-comment`, or `-f github-actions` for native CI annotations; `--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 |
467
- | `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; `--format github-actions` emits a stable CI annotation; `--table --rule MIG-001 --band critical --top-n 20` for blocker triage |
483
+ | `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; `--format github-actions` emits a stable CI annotation; `--format sarif` emits located ASK-owned findings; `--table --rule MIG-001 --band critical --top-n 20` for blocker triage |
468
484
  | `impact` / `impact-chain` | core | blast radius of a change, to the endpoints it reaches | target the **interface**, not the `Impl` |
469
485
  | `pr-impact` | core | the same, scoped to a PR diff | local `git diff HEAD`, `--since REF`, explicit `--files`, or opt-in `--pr NUMBER`; `--format github-actions` emits CI annotations; `--fail-on` gates |
470
486
  | `verify` | core | does the repo satisfy its declared contracts, **relative to a baseline** | `.ask/contracts.yml`; `--format github-actions` emits a native CI annotation while preserving exit 0/1/2. `.ask/waivers.yml` adjudicates a finding as *not a defect here* (stable id + required reason, optional expiry) so a reviewed row stops holding the gate red — a baseline records accepted debt, a waiver says it was never a defect |
471
487
  | `verify-edit` | supported | did the working-tree edits change runtime behaviour | semantic diff gate for the edit loop |
472
488
  | `--compact` / `--agent` | — | bounded structural context for an agent | flags of the root command, not commands: not tiered |
473
489
  | `onboard` / `explain` / `cold-start` | supported | orientation in an unfamiliar repo; per-class summary; bootstrap snapshot | `onboard` publishes `population`, `population_unit` and `population_total` for its source-file universe |
474
- | `export` / `repo-ir` / `schema` | supported | tool-agnostic views (C4, module graph, integrations); symbol-level IR; published JSON Schemas | `export --c4 --render mermaid\|svg` **draws** the model instead of only emitting it presentation over the same payload, with the node cap written on the canvas |
490
+ | `export` / `repo-ir` / `schema` | supported | tool-agnostic views (C4, module graph, integrations); symbol-level IR; published JSON Schemas | `export --c4 --render mermaid\|svg` **draws** the model instead of only emitting it; `repo-ir --since REF --budget-tokens N` provides bounded, deterministic agent context |
475
491
  | `modernize` | supported | coupling hubs, cycles, dead zones, refactor candidates | |
476
492
  | `review-pr` / `fix-bug` / `prepare-context` | supported | diff review, symptom triage, task-shaped context | |
477
493
  | `plan` / `compare` / `delta` / `contract-diff` | supported | what to review for a change; candidates by measured cost; outcome of a change; public-contract break | no verdicts, measured cost only |
478
494
  | `validation` | supported | request-body validation coverage and gaps | |
479
- | `baseline capture\|diff` · `trend` | supported | versioned architectural metrics over time — and, with `--kind findings`, the **defect population** as a series, so "open since 5.8.28" is answerable without anybody keeping the tally (`first_seen` is the earliest STORED capture, and the payload says so); `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) |
480
- | `cve` | supported | which dependency advisories a route can actually **reach** — not which are on the classpath | reads a **local** OSV feed (`--feed`); takes no network at analysis time, so a CI gate can never pass because a fetch timed out. Four verdicts: `reachable` (with the routes), `imported_not_exposed`, `not_observed` and `unknown`. Nothing answers *"not reachable"* — reflection, SPI loading and container wiring reach code no source edge names — and an unresolved Maven version is `unknown`, never `not_affected`. Feed staleness is read off the feed's own dates |
495
+ | `baseline capture\|diff\|trend\|attest` | supported | versioned architectural metrics over time, findings history and a bounded read-only evidence attestation (`baseline-attestation-v1`) with explicit comparability and non-coverage | trend reporting and evidence continuity, not gating or legal compliance. Baselines land in `.ask/baselines` **inside the repository** or an external `--dir`; automate capture with [baseline-ci.yml](docs/baseline-ci.yml) |
496
+ | `cve` | supported | which dependency advisories a route can actually **reach** — not which are on the classpath | reads a **local** OSV feed (`--feed`) and optional local VEX statements (`--vex`); VEX is matched exactly and annotates `accepted_by_vex` without changing reachability; takes no network at analysis time |
481
497
  | `intent` | supported | a plain-language question, resolved to the typed `retrieve` query that answers it | `ask intent "what breaks if I change OrderService?"`. A scored lexical match against a declared vocabulary — **no model, no generation** — so it resolves identically on every machine. It selects a query and prints it; `--run` executes it. A question fitting two intents too closely is refused with both named, because a well-formed answer to a question you did not ask is invisible once printed |
482
498
  | `remediate` | supported | the loop from a finding to a **verified** change | audit → recipe → apply in a dedicated worktree → `verify-edit`. Dry by default. Most findings are not mechanical and the plan says which and why; an apply that could not be verified reports `unverified`, never `applied` |
483
499
  | `pr-risk` | supported | one verdict for **this diff** — does the change make things worse? | `pack gate` answers about the repository; this answers about the change. Joins `pr-impact` reach, endpoint access, the shared risk model and CODEOWNERS. `--since` differences route inventories so `new_endpoints` is a fact rather than a guess. A changed file that maps to no class caps the verdict at `UNKNOWN`, which fails every gate — a partial blast radius is not a small one |
@@ -137,6 +137,7 @@ The second anchor is the field one, and it carries its own build for the same re
137
137
  | `chunk-file` | nothing | not timed | no | — | Reads one file; nothing to cache. |
138
138
  | `intent` | nothing | not timed | no | — | Resolving a question is a string operation over a declared vocabulary; only --run reaches the retrieval engine. |
139
139
  | `self-audit` | nothing | not timed | no | — | Reads this build's own registries and manifest; it never analyses a repository, so there is nothing to cache. |
140
+ | `remediation-report` | nothing | not timed | no | — | Reads the bundled remediation ledger and build provenance; it analyses no repository and uses no cache layer. |
140
141
  | `drift` | the shared work | not timed | no | `parse`, `cir` | Resolves the posture through the shared CIR; --against resolves a second profile set over the same parse. |
141
142
  | `watch` | the shared work | not timed | yes | `parse`, `cir` | Warms once, then answers each save against the warm IR — the reason a per-save question is affordable at all. |
142
143
  | `pr-risk` | the shared work | not timed | no | `parse`, `cir` | Reuses the shared CIR for the blast radius; --since builds a second IR over the base tree, which is not cached. |
@@ -147,6 +148,7 @@ The second anchor is the field one, and it carries its own build for the same re
147
148
  | `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. |
148
149
  | `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. |
149
150
  | `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. |
151
+ | `audit-verify` | nothing | not timed | no | — | Verifies one local report and key; it does not inspect a repository or use ASK analysis caches. |
150
152
  | `trend` | nothing | not timed | no | — | Reads stored baseline artifacts from disk; analyses no source, so no cache layer applies. Same command as `baseline trend`. |
151
153
  | `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. |
152
154
  | `retrieve` | the shared work | not timed | no | `cir`, `parse` | Every query builds or reuses the shared CIR a warm builds. |
@@ -3,7 +3,7 @@
3
3
  *Chief-engineer development record. This is the internal, dev-facing counterpart to the
4
4
  customer-facing `docs/EXECUTIVE-ROADMAP.md`.*
5
5
 
6
- > **CURRENT QUEUE — release `5.9.1`; external reconciliation `AUD-608` is implemented.**
6
+ > **CURRENT QUEUE — release `5.9.2`; external reconciliation `AUD-608` is implemented.**
7
7
  > `AUD-608-C01` is closed in `fe1f624`: `cve` declares static
8
8
  > dependency-inventory coverage and non-coverage. `AUD-608-P01` is closed in
9
9
  > `b479465`: `pr-risk --since` constructs its base context and surfaces failures
@@ -98,6 +98,7 @@ aspirations: each is asserted by that row's tests.
98
98
  | `AUD-607-X07` | P3 | Stored finding baselines across releases. | `ask baseline capture/diff/trend --kind findings` (`findings-baseline-v1`) | **Implemented (`55b93c2`).** The same store as the architectural series, prefixed so neither reads the other's documents. `first_seen` is the earliest STORED capture and the payload says so. A rename is published as one resolved and one new. |
99
99
  | `AUD-607-X08` | P3 | Environment drift alerting. | `ask drift` (`access-drift-v1`) | **Implemented (`6463fdf`).** One arithmetic for both axes (time and environment), so the two answers cannot disagree. `newly_unmatched` and `newly_matched` are separate buckets; a `removed` route is never reported as having become safe. |
100
100
  | `AUD-607-X09` | P3 | `self-audit` — run ASK against its own build. | `ask self-audit` (`self-audit-v1`) | **Implemented (`f1fa913`), with its "not recommended" reason shipped inside the payload.** The semantic engine does not apply to Python source, so those figures are absent and declared rather than reported as zeros. What it does check — cache model, format contract, schema registry and output affordances over the INSTALLED build — found a real drift on its first run. |
101
+ | `ASK-COM-01` | P1 | Continuous evidence attestation over persisted baseline history. | `ask baseline attest` (`baseline-attestation-v1`) | **Implemented.** Read-only projection of architecture or findings trend; publishes capture boundaries, latest commit, comparability and explicit non-coverage. It never claims legal compliance, improvement, or a clean zero without history. |
101
102
 
102
103
  ### Explicitly Rejected
103
104
 
@@ -677,12 +678,17 @@ Java file, ~500 MB per 24 000-file repository), which is a sizing document and a
677
678
  **What blocks `S-18` is `S-27`, and no memo saw it.** The row below is the reason `fleet`
678
679
  moves ahead of everything except `S-23`.
679
680
 
681
+ **S-27 measurement increment shipped:** `ask auth workspace <repo>...` now publishes
682
+ `workspace-entitlement-v1` with unique repository count, aggregate Java population and
683
+ an explicit `advisory_only` policy status. It does not alter the existing per-repository
684
+ gate; entitlement enforcement remains pending named-buyer validation.
685
+
680
686
  | # | Row | Mechanism | Done when |
681
687
  |---|---|---|---|
682
- | `S-27` | **The licence axis cannot charge the buyer the product is being built for** ⭐ — `P-13` | `is_large_repo()` counts Java files **per repository path** against `_FREE_REPO_JAVA_FILE_LIMIT = 500` (`license.py:121`, `:521`), and the only other axis is the `delta` automation quota (`:267`). An organisation of 40 microservices at 300 Java files each crosses no threshold on any repository and **pays nothing**. That is precisely the buyer the third memo identifies correctly — flota, defendibilidad, *"how many unauthenticated routes does my organisation have"* — so the product's own price model excludes it. This is not a pricing preference: it is a measured contradiction between the gate in `license.py` and the route in `PRODUCT-ROUTE.md` | An axis that can charge an organisation — repository count, or a fleet manifest, or seats over a workspace — declared in `license.entitlement()` with `when_it_changes` saying what it costs, exactly as `P-2` established for the existing axis. **Not** by lowering the per-repo threshold, which would start charging the users the current rule deliberately leaves free. Acceptance: a fixture workspace of N small repositories reaches the same entitlement decision as one large repository of the same total size, or the difference is published as a stated product decision rather than an accident of the counter |
683
- | `S-28` | **SARIF out — the findings reach the tab the developer already reads** — **first safe increment in `17fe1ca`**: `ask pack gate --format sarif` emits SARIF 2.1.0 decision diagnostics from the gate manifest only. A BLOCK/UNVERIFIED component becomes a locationless result with its component, status and exit code; a PASS emits nothing. This is deliberately narrower than an audit-finding export: no source location is invented and no component payload is re-emitted. | The schema was already in the house: `sarif.py` parses SARIF 2.1.0 for `enrich`, with severity mapping, location resolution and an `unresolved` list that names why a result could not be placed. The implemented gate channel reaches CI without presenting imported findings as ASK discoveries. **Remaining:** source-level exports for commands that own a finding population, with a round-trip assertion over their locations and non-coverage. A result that arrived through `enrich` stays attributed to the tool that found it and is never re-emitted as ASK's own: the enrichment is the reachability, not the detection (`NC-001`, `NC-002`). |
684
- | `S-29` | **The remediation record becomes a public, generated page** | Twenty rows closed and field-verified in twenty-four hours, a mechanism in source per row, two rejected with their measurement and their price. It lives in `docs/DEFECT-LEDGER.md`, which is shipped inside the wheel and nowhere else. The commercial argument is exact and is the memo's best: the first objection to a single-maintainer proprietary product is *"what if it disappears"*, and the hardest answer is not an SLA promise but the product's own numbers | A **generated projection**, never the raw file `P-14`: rows open and closed per version, median days to closure, declined rows with their reason, derived from the ledger plus `build_commit` so it cannot drift from what shipped. Redaction is part of the acceptance criterion, not a follow-up: no absolute maintainer paths, no third-party evaluation subjects named as audited. Assertion over the generator, not over the output |
685
- | `S-30` | **The token bill becomes a measured number, and `--since` carries the budget** | Two halves of one thesis the memo states correctly: the customer's real cost is the agent's context bill, not the licence. The stateful half it proposes (a session that remembers what the agent was given) is **refused** it makes the answer depend on what the agent claims it saw, which breaks the determinism this product sells. The stateless half is already almost built: `--since`, `delta`, `regress`, content-addressed answers and the declared `--compact` / `--agent` ceilings | (a) `--since <ref>` composed with a token budget on the existing bounded views, so an agent supplies the sha it holds and gets only what changed inside a stated ceiling, with `non_coverage` for what the budget cut. (b) A reproducible harness in the repository that runs one real agent task with and without ASK and publishes tokens per resolved task under the honest-benchmark rule: what did **not** work is reported first, and no figure is published that a reader cannot re-run |
688
+ | `S-27` | **The licence axis cannot charge the buyer the product is being built for** ⭐ — `P-13` | `is_large_repo()` counts Java files **per repository path** against `_FREE_REPO_JAVA_FILE_LIMIT = 500`, while `auth workspace` aggregates the fleet. The opt-in `--enforce` pilot now applies the existing Pro gate to that aggregate without changing per-repository behavior or billing code. | Measurement and pilot gate shipped. Full activation remains conditional on named-buyer validation; no default user is charged or blocked. |
689
+ | `S-28` | **SARIF out — the findings reach the tab the developer already reads** — **closed with source-level migration export:** `pack gate`, `spring-audit`, `verify` and `migrate-check` emit SARIF 2.1.0 through dedicated ASK-owned renderers. Source findings carry their own locations; contract and gate decisions remain locationless where no source span exists. | The output channel is now available for the ASK-owned finding populations, with provenance and non-coverage preserved. Imported SARIF remains input to `enrich` and is never re-emitted as ASK discovery. |
690
+ | `S-29` | **The remediation record becomes a public, generated page** **closed:** `remediation-report` publishes the redacted projection of the shipped ledger with counts, distributions, provenance and closure coverage. Private narrative and paths stay excluded; the output is explicitly a trust artifact, not an SLA or security verdict. | `ask remediation-report` is the generated public projection; its tests assert redaction, provenance and consistency with the ledger. |
691
+ | `S-30` | **The token bill becomes a measured number, and `--since` carries the budget** | **Shipped:** `repo-ir --budget-tokens N` composes with `--since`, and `scripts/context_cost_harness.py` measures a declared task with and without ASK. It publishes bytes/tokens, build and tree state, output hashes and a delta only when both commands resolve and the operator declares `--comparable`; otherwise it records `not_comparable` without a commercial figure. The stateful session proposal remains refused because it would make answers depend on what the agent claims to have seen, breaking determinism. | Closed for the stateless scope: budgeted bounded view plus reproducible two-command harness. No agent quality claim is published by default; comparable task definitions and their rerunnable artifacts remain the operator's evidence. |
686
692
 
687
693
  **One anti-goal recorded here so it is refused once.** No rule DSL and no third-party rule
688
694
  plugins for the architecture contracts of `S-23`'s neighbourhood. The memo cites *"grep grew
@@ -5,7 +5,10 @@
5
5
  > `pack assessment` and `pack gate`, and make evidence and safe change the
6
6
  > product surface. This roadmap must not introduce a competing product thesis.
7
7
 
8
- > **CURRENT UPDATE — release `5.9.1`, following the external `5.9.0` reconciliation (`AUD-608`).**
8
+ > **CURRENT UPDATE — release `5.9.2`, following the external `5.9.0` reconciliation (`AUD-608`).**
9
+ > The commercial increment adds stateless context budgets, a reproducible context-cost harness,
10
+ > source-level migration SARIF and an opt-in workspace entitlement pilot. Advisory behaviour remains
11
+ > the default; named-buyer validation is still required before broad enforcement.
9
12
  > Three defects confirmed in the shipped release are closed: `cve` now
10
13
  > discloses its static inventory (`fe1f624`), `pr-risk --since` returns a
11
14
  > structured error for unreadable base context (`b479465`), and
@@ -180,6 +180,11 @@ vulnerability is exploitable; and `not_observed` is explicitly not a statement
180
180
  of safety, because reflection, SPI loading and container wiring reach code no
181
181
  source edge names.
182
182
 
183
+ An operator may also pass `--vex` with local, exact advisory/package decisions.
184
+ ASK publishes those decisions as `accepted_by_vex` while preserving its own
185
+ reachability verdict; an expired or absent VEX statement is not treated as a
186
+ negative.
187
+
183
188
  ## Implementation order
184
189
 
185
190
  The implementation route is shipped through five bounded steps. The status is
@@ -46,13 +46,13 @@ CLI commands — impact, endpoints, spring-audit, explain, … each a pro
46
46
  The key idea: the extraction is **content-addressed**. Commands reuse the parse cache and,
47
47
  where their analysed scope matches, the shared Canonical IR; `ask cache model` names what a
48
48
  warm buys for each command rather than implying that every projection costs the same. In
49
- 5.9.1, `validation` enters through that shared CIR and `data-exposure` reuses one semantic
49
+ 5.9.2, `validation` enters through that shared CIR and `data-exposure` reuses one semantic
50
50
  model across all declared label seeds. (The extraction and consumption contract is fixed in
51
51
  the architecture ADRs 0001–0004 under `docs/architecture/`.)
52
52
 
53
53
  The current external pack audit intake is tracked in
54
54
  [`AUDIT-2026-08-26-EXTERNAL-5.8.28-PACK.md`](AUDIT-2026-08-26-EXTERNAL-5.8.28-PACK.md);
55
- the two pack fixes are included in release 5.9.1, with release-artifact verification
55
+ the two pack fixes are included in release 5.9.2, with release-artifact verification
56
56
  remaining for detached execution and pack evidence.
57
57
 
58
58
  ---
@@ -171,6 +171,7 @@ human. They project the same semantic model into agent-ready context:
171
171
  |---------|---------|
172
172
  | `ask prepare-context <task>` | Task-shaped context bundle (`onboard`, `review-pr`, `fix-bug`, `refactor`, `generate-tests`) sized for an LLM prompt. |
173
173
  | `ask repo-ir` | The low-level symbol IR itself — the raw semantic representation, for tools that want the graph, not a report. |
174
+ | `ask repo-ir --budget-tokens N` | Stateless context budget for the inline IR. Composes with `--since`; returns the full view when it fits, otherwise the summary and explicit `non_coverage` for omitted graph fields. |
174
175
  | `ask --agent` | Agent-optimized output envelope for any command. |
175
176
  | `ask --compact` | A bounded subset (status, stacks, entry points, key dependencies) for cheap orientation. See `ask --help` for the current output budget. |
176
177
  | `ask mcp` | Runs ASK as an MCP server so an agent (Claude Desktop / Cursor) calls it as a tool. |
@@ -179,6 +180,20 @@ Rule of thumb: **developer-facing** commands (`impact`, `spring-audit`, `endpoin
179
180
  `validation`) answer a question you read; **agent-facing** commands (`prepare-context`,
180
181
  `repo-ir`, `--agent`, `--compact`) assemble context another model will consume.
181
182
 
183
+ `repo-ir --budget-tokens N` is intentionally stateless: `--since <ref>` narrows the
184
+ semantic change set and `--budget-tokens N` bounds the serialized inline answer. If
185
+ the graph does not fit, ASK returns the existing summary view and publishes
186
+ `token_budget.coverage: non_coverage` with the omitted fields. A budget that cannot
187
+ fit even that summary is refused rather than silently truncating JSON. The budget
188
+ applies to stdout; use `--output FILE` for an unbounded artifact.
189
+
190
+ For a rerunnable context-cost comparison, use
191
+ `python3 scripts/context_cost_harness.py` with `--with-ask` and `--without-ask`
192
+ command templates. Templates are executed without a shell and may use `{repo}`
193
+ and `{since}`. The report records both outputs, but only computes a token delta
194
+ when both commands exit successfully and `--comparable` is explicit; otherwise
195
+ the result is `not_comparable` and the process exits non-zero.
196
+
182
197
  **Honest state of `prepare-context` (measured in the field, 3 300-file repo):**
183
198
 
184
199
  | Task | State |
@@ -206,7 +221,7 @@ pipx install sourcecode # isolated install, no venv needed
206
221
 
207
222
  # Verify
208
223
  ask version
209
- # ask 5.9.1
224
+ # ask 5.9.2
210
225
  ```
211
226
 
212
227
  Requires Python 3.9+.
@@ -251,7 +266,7 @@ estimate scaled by file count would be wrong in the direction that costs you a s
251
266
  and an anchor printed without its release goes on recommending a nightly job for a command
252
267
  that has come to finish in seconds (C3-97).
253
268
 
254
- 48 commands and seven command groups exist. Four of them carry most of the measured
269
+ 50 commands and seven command groups exist. Four of them carry most of the measured
255
270
  value in field use, and they are the ones to learn first:
256
271
 
257
272
  | Start with | Because |
@@ -605,6 +620,25 @@ ask audit-report . --profile prod --format markdown
605
620
  ask audit-report . --sign-key audit.key -o audit-report.json
606
621
  ```
607
622
 
623
+ Add a technical ENS evidence mapping to the signed bundle. The mapping is not
624
+ a certification: controls that ASK cannot observe are explicitly marked
625
+ `missing_evidence`. Owners, expiry dates and exceptions can be supplied in a
626
+ JSON metadata file.
627
+
628
+ ```bash
629
+ ask audit-report . --pack ens --sign-key audit.key --pack-metadata controls.json -o ens-report.json
630
+ ```
631
+
632
+ ### `ask audit-verify` *(supported)*
633
+
634
+ Verify a signed `audit-report` locally without re-running the analysis. The
635
+ command recomputes the canonical JSON payload and HMAC-SHA256, returning
636
+ `valid: true` with exit code 0 or `valid: false` with exit code 1.
637
+
638
+ ```bash
639
+ ask audit-verify audit-report.json --sign-key audit.key
640
+ ```
641
+
608
642
  `--sign-key` signs the canonical JSON payload with HMAC-SHA256 using a local key file and
609
643
  publishes `payload_sha256`, `key_id` and `signature`. This is integrity evidence for the
610
644
  bundle, not a public PKI or compliance certification.
@@ -1114,6 +1148,7 @@ ask baseline capture . --ref v1.4.0 # freeze the measured fingerprint
1114
1148
  ask baseline capture . --auto # the same, safe to run on every push
1115
1149
  ask trend . # read the series (same as `baseline trend`)
1116
1150
  ask baseline diff . # the tree against the newest captured point
1151
+ ask baseline attest . # emit a bounded evidence attestation
1117
1152
  ```
1118
1153
 
1119
1154
  Both readers take **either** a repository path or a directory of baselines: `ask trend .`
@@ -1140,6 +1175,19 @@ passes `--dir` and writes them elsewhere.
1140
1175
  `trend` reports movement — totals over time and per-hotspot fan-in tracks. It labels nothing
1141
1176
  "improving" or "degrading"; that reading is yours.
1142
1177
 
1178
+ `baseline attest` is the read-only packaging seam for an auditor or CI artifact. It reads
1179
+ the stored architecture or findings series (`--kind findings`) and publishes its capture
1180
+ boundaries, latest commit, comparability and explicit limits as `baseline-attestation-v1`.
1181
+ It is evidence continuity, not a legal or regulatory compliance verdict, and it returns
1182
+ `status: no_history` instead of manufacturing a clean zero when no capture exists.
1183
+
1184
+ For a multi-repository buyer, `ask auth workspace <repo>...` previews the aggregate Java
1185
+ population that a workspace-sized entitlement would see. The preview is advisory only: it
1186
+ does not change the current per-repository gate or charge the workspace.
1187
+ For a named-buyer pilot, add `--enforce`: crossing the aggregate threshold then requires
1188
+ the existing Pro entitlement and exits with the standard license-required contract; below
1189
+ the threshold it passes. This flag is opt-in and does not change per-repository gates.
1190
+
1143
1191
  ---
1144
1192
 
1145
1193
  ## The gate commands
@@ -1297,15 +1345,15 @@ explaining. The rest do one thing; `ask <command> --help` is the whole story.
1297
1345
 
1298
1346
  | Command | Tier | What it does |
1299
1347
  |---|---|---|
1300
- | `ask migrate-check` | core | Spring Boot 2→3 readiness plus Java LTS/licensing inventory: blockers, effort range, target JDK evidence and explicit licensing-review signals. Full reference: [migrate-check.md](migrate-check.md) |
1348
+ | `ask migrate-check` | core | Spring Boot 2→3 readiness plus Java LTS/licensing inventory: blockers, effort range, target JDK evidence and explicit licensing-review signals. Supports `--format sarif` for located ASK-owned findings. Full reference: [migrate-check.md](migrate-check.md) |
1301
1349
  | `ask drift` | supported | What changed in the effective access — since the last capture (`--capture` records; the default compares) or between two profile sets (`--against`). One arithmetic for both axes. Separates `newly_unmatched` from `newly_matched`, and a `removed` route is NOT reported as having become safe. |
1302
1350
  | `ask watch` | supported | Warm the index once, then answer what each save affected — one JSON line per tick. `--once` is the pre-commit shape; `--ticks`/`--for` bound the loop. A file added since the warm is reported `unresolved`, never `unreachable`, and a failed analysis is an `error` tick rather than an empty change list. |
1303
1351
  | `ask pr-risk` | supported | One verdict for one diff — does this change make things worse? Joins `pr-impact` reach, endpoint access, the shared risk model and CODEOWNERS. `--since` differences route inventories so `new_endpoints` is a fact rather than a guess. An unresolved changed file caps the verdict at `UNKNOWN`, which fails every gate. |
1304
1352
  | `ask remediate` | supported | One loop from finding to verified change: audit → recipe → apply in a dedicated worktree → `verify-edit`. Dry by default; `--write` applies. Publishes `mechanisable` against `manual_remainder` with the reason each family cannot be rewritten, and reports `unverified` — never `applied` — when the result could not be checked. |
1305
- | `ask cve` | supported | Cross the dependency inventory against a **local** OSV advisory feed (`--feed`; no network is taken), then report whether a route can reach the vulnerable package: `reachable`, `imported_not_exposed`, `not_observed` or `unknown`. `not_observed` is not a statement of safety, and nothing here answers "not reachable". |
1353
+ | `ask cve` | supported | Cross the dependency inventory against a **local** OSV advisory feed (`--feed`; no network is taken), then report whether a route can reach the vulnerable package: `reachable`, `imported_not_exposed`, `not_observed` or `unknown`. `--vex` imports exact local decisions as `accepted_by_vex` without changing reachability. `not_observed` is not a statement of safety, and nothing here answers "not reachable". |
1306
1354
  | `ask explain <Class>` | supported | Human-readable architectural summary for one class (text by design, not JSON) |
1307
1355
  | `ask export` | supported | Tool-agnostic views for downstream tooling: `--c4`, `--module-graph`, `--by-directory`, `--integrations`. `--c4 --render mermaid\|svg` draws the same model instead of emitting it — presentation over the existing payload, with the node cap written on the diagram. |
1308
- | `ask repo-ir` | supported | Deterministic symbol-level IR for the whole repository |
1356
+ | `ask repo-ir` | supported | Deterministic symbol-level IR for the whole repository; `--since REF --budget-tokens N` bounds the inline agent context without silently truncating JSON |
1309
1357
  | `ask cold-start` | supported | Repository Intelligence Snapshot bootstrap context, returned from the persisted RIS |
1310
1358
  | `ask baseline … --kind findings` | supported | The defect population as a persisted series, in the same store as the architectural baseline: `capture` records it, `diff` reports new/resolved/persisting against the last capture, and `trend` says how long each still-open defect has been open. `first_seen` is the earliest STORED capture — not the day it was introduced. |
1311
1359
  | `ask prepare-context <task>` | supported | Task-shaped context: `onboard`, `delta`, `fix-bug`, `generate-tests`. See [Typical workflows](#typical-workflows) |
@@ -1314,9 +1362,11 @@ explaining. The rest do one thing; `ask <command> --help` is the whole story.
1314
1362
  | `ask rename-class` | supported | Word-boundary Java rename across the repository |
1315
1363
  | `ask schema <name>` | supported | Print a published JSON Schema for this tool's output |
1316
1364
  | `ask self-audit` | supported | Check the SHIPPED build's own coherence — cache model, format contract, schema registry and output affordances. Declares explicitly that the semantic engine does not apply to this product's own source (ASK analyses Java; this build is Python), rather than reporting zeros. `ask selftest` is the different question: the defect ledger run against a real repository. |
1365
+ | `ask auth workspace <repo>...` | supported | Aggregate workspace entitlement preview. `--enforce` opts into the named-buyer pilot that reuses the existing Pro gate when the organization-sized threshold is crossed; advisory mode remains the default and the CLI does not bill. |
1366
+ | `ask remediation-report` | supported | Redacted public projection of the shipped remediation ledger: unique row counts, status/severity distribution, build provenance and closure coverage; omits private narrative and paths. It is a trust artifact, not an SLA or security verdict. |
1317
1367
  | `ask archetype` | experimental | Evidence-based architectural archetype across four dimensions |
1318
1368
  | `ask retrieve` | parked | Typed knowledge queries over the model — kept working, no longer developed. Symbol-oriented queries accept `--target/-t`; `--module/-m`, `--subsystem/-s` and `--endpoint/-e` remain compatible domain aliases. |
1319
- | `ask baseline capture\|diff\|trend` | supported | Versioned architectural metrics over time; see [`ask trend`](#ask-trend-dir--how-the-architecture-moved) |
1369
+ | `ask baseline capture\|diff\|trend\|attest` | supported | Versioned architectural metrics over time plus a bounded read-only evidence attestation; see [`ask trend`](#ask-trend-dir--how-the-architecture-moved) |
1320
1370
  | `ask cache status\|warm\|model\|clear\|freshness` | supported | Cache inspection; `ask cache model` states what a warm buys each command |
1321
1371
  | `ask config` · `ask version` · `ask activate` · `ask auth` · `ask telemetry` · `ask mcp` | supported | Configuration, version, licence, authentication, telemetry (on by default), MCP integration |
1322
1372
 
@@ -1770,7 +1820,7 @@ Allowed formats per command (the first is the default):
1770
1820
  | `impact-chain` | `json`, `yaml` | `json` |
1771
1821
  | `spring-audit` | `json`, `yaml`, `github-comment`, `github-actions` | `json` |
1772
1822
  | `prepare-context` | `json`, `github-comment` | `json` |
1773
- | `migrate-check` | `json`, `text`, `github-actions` | `json` |
1823
+ | `migrate-check` | `json`, `text`, `github-actions`, `sarif` | `json` |
1774
1824
  | `explain` | `text`, `json` | `text` |
1775
1825
  | `pr-impact` | `json`, `text`, `github-actions` | `json` |
1776
1826
  | `verify` | `json`, `yaml`, `github-actions` | `json` |
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "sourcecode"
7
- version = "5.9.1"
7
+ version = "5.9.2"
8
8
  description = "Persistent structural context and ultra-fast repeated analysis for AI coding agents"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.9"