sourcecode 5.9.24__tar.gz → 5.9.25__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 (466) hide show
  1. {sourcecode-5.9.24 → sourcecode-5.9.25}/CHANGELOG.md +33 -3
  2. {sourcecode-5.9.24 → sourcecode-5.9.25}/PKG-INFO +16 -12
  3. {sourcecode-5.9.24 → sourcecode-5.9.25}/README.md +15 -11
  4. sourcecode-5.9.25/docs/AUDIT-2026-09-01-ALTERNATIVE-5.9.23.md +72 -0
  5. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/DEFECT-LEDGER.md +27 -14
  6. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/DEVELOPMENT-ROADMAP.md +20 -0
  7. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/USER_GUIDE.md +1 -1
  8. {sourcecode-5.9.24 → sourcecode-5.9.25}/pyproject.toml +1 -1
  9. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/__init__.py +1 -1
  10. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/answer_bounds.py +6 -0
  11. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/cli.py +41 -3
  12. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/envelope.py +4 -1
  13. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/migrate_check.py +9 -0
  14. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/rule_pass.py +9 -0
  15. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/security_posture.py +30 -4
  16. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/selftest.py +20 -0
  17. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/spring_security_audit.py +31 -5
  18. {sourcecode-5.9.24 → sourcecode-5.9.25}/.github/workflows/build-windows.yml +0 -0
  19. {sourcecode-5.9.24 → sourcecode-5.9.25}/.github/workflows/perf-gate.yml +0 -0
  20. {sourcecode-5.9.24 → sourcecode-5.9.25}/.github/workflows/windows-battery.yml +0 -0
  21. {sourcecode-5.9.24 → sourcecode-5.9.25}/.github/workflows/windows-regression.yml +0 -0
  22. {sourcecode-5.9.24 → sourcecode-5.9.25}/.gitignore +0 -0
  23. {sourcecode-5.9.24 → sourcecode-5.9.25}/.ruff.toml +0 -0
  24. {sourcecode-5.9.24 → sourcecode-5.9.25}/CLAUDE.md +0 -0
  25. {sourcecode-5.9.24 → sourcecode-5.9.25}/CODE_OF_CONDUCT.md +0 -0
  26. {sourcecode-5.9.24 → sourcecode-5.9.25}/CONTRIBUTING.md +0 -0
  27. {sourcecode-5.9.24 → sourcecode-5.9.25}/LICENSE +0 -0
  28. {sourcecode-5.9.24 → sourcecode-5.9.25}/NOTICE +0 -0
  29. {sourcecode-5.9.24 → sourcecode-5.9.25}/SECURITY.md +0 -0
  30. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/AUDIT-2026-08-22-5.8.22.md +0 -0
  31. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/AUDIT-2026-08-23-5.8.24.md +0 -0
  32. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/AUDIT-2026-08-23-COMMERCIAL.md +0 -0
  33. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/AUDIT-2026-08-23-CORPUS-AMPLIADO.md +0 -0
  34. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/AUDIT-2026-08-23-EXTERNAL-5.8.25.md +0 -0
  35. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/AUDIT-2026-08-23-EXTERNAL-5.8.26.md +0 -0
  36. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/AUDIT-2026-08-23-THINGSBOARD-FINDINGS.md +0 -0
  37. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/AUDIT-2026-08-26-EXTERNAL-5.8.26.md +0 -0
  38. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/AUDIT-2026-08-26-EXTERNAL-5.8.27.md +0 -0
  39. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/AUDIT-2026-08-26-EXTERNAL-5.8.28-PACK.md +0 -0
  40. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/AUDIT-2026-08-26-EXTERNAL-5.8.28.md +0 -0
  41. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/AUDIT-2026-08-26-EXTERNAL-5.8.31.md +0 -0
  42. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/AUDIT-2026-08-26-EXTERNAL-5.8.32.md +0 -0
  43. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/AUDIT-2026-08-26-EXTERNAL-5.9.0.md +0 -0
  44. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/AUDIT-2026-08-26-MONETIZATION.md +0 -0
  45. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/AUDIT-2026-08-27-EXTERNAL-5.9.2.md +0 -0
  46. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/AUDIT-2026-08-27-EXTERNAL-5.9.3.md +0 -0
  47. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/AUDIT-2026-08-28-EXTERNAL-5.9.10.md +0 -0
  48. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/AUDIT-2026-08-31-EXTERNAL-5.9.16.md +0 -0
  49. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/AUDIT-2026-08-31-EXTERNAL-5.9.17.md +0 -0
  50. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/AUDIT-2026-08-31-REMEDIATION-5.9.18.md +0 -0
  51. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/AUDIT-2026-09-01-EXTERNAL-5.9.22.md +0 -0
  52. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/AUDIT-2026-09-01-EXTERNAL-5.9.23.md +0 -0
  53. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/AUDIT-TESTING-CORPUS-2026-08-22.md +0 -0
  54. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/CACHE.md +0 -0
  55. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/COMMERCIAL-OFFER.md +0 -0
  56. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/CUSTOMER-VALIDATION.md +0 -0
  57. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/DEMO-5MIN.md +0 -0
  58. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/DOCUMENTATION-HYGIENE-2026-08-23.md +0 -0
  59. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/EXECUTION-PLAN-12MO.md +0 -0
  60. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/EXECUTIVE-ROADMAP.md +0 -0
  61. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/MANUAL-USUARIO.md +0 -0
  62. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/MODERNIZATION.md +0 -0
  63. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/PRODUCT-ROUTE.md +0 -0
  64. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/PRODUCT_AUDIT.md +0 -0
  65. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/PRODUCT_IDENTITY.md +0 -0
  66. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/PRODUCT_TIERS.md +0 -0
  67. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/RC1-CHECKLIST.md +0 -0
  68. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/RD-JVM-ASK-TRIAGE-2026-08-31.md +0 -0
  69. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/RELEASE-CHECKLIST.md +0 -0
  70. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/RELEASE-VERIFICATION.md +0 -0
  71. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/STRATEGY-2026-08-26-AGENT-CONTEXT.md +0 -0
  72. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/architecture/CATALOG-retrieval-intents.md +0 -0
  73. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/architecture/DESIGN-assessment-deployment-evidence.md +0 -0
  74. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/architecture/DESIGN-assessment-report.md +0 -0
  75. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/architecture/DESIGN-build-closure-provenance.md +0 -0
  76. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/architecture/DESIGN-knowledge-provider-integration.md +0 -0
  77. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/architecture/DESIGN-p5.3b-statement-surface.md +0 -0
  78. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/architecture/DESIGN-p5.5-span-index.md +0 -0
  79. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/architecture/DESIGN-p6-semantic-impact-engine.md +0 -0
  80. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/architecture/DESIGN-p6-semantic-integration-engine.md +0 -0
  81. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/architecture/DESIGN-p7-semantic-services.md +0 -0
  82. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/architecture/DESIGN-pack-gate-ci.md +0 -0
  83. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/architecture/DESIGN-pack-manifest.md +0 -0
  84. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/architecture/DESIGN-pack-mcp-api.md +0 -0
  85. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/architecture/DESIGN-robustness-security-inference.md +0 -0
  86. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/architecture/DESIGN-semantic-retrieval.md +0 -0
  87. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/architecture/EPV-p6-class-typeref.md +0 -0
  88. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/architecture/REPORT-p6-flow-analyzer-comparison.md +0 -0
  89. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/architecture/REPORT-p6-integration-detector-comparison.md +0 -0
  90. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/architecture/REPORT-p8-flow-analyzer-migration.md +0 -0
  91. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/architecture/REPORT-p9-integration-detector-migration.md +0 -0
  92. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/architecture/adr/0001-semantic-ir.md +0 -0
  93. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/architecture/adr/0002-source-evidence-boundary.md +0 -0
  94. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/architecture/adr/0003-architectural-characterization.md +0 -0
  95. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/architecture/adr/0004-semantic-retrieval.md +0 -0
  96. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/architecture/adr/0005-evidence-reconciliation.md +0 -0
  97. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/architecture/adr/0006-performance-harness.md +0 -0
  98. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/architecture/adr/0007-composition-semantics.md +0 -0
  99. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/architecture/adr/0008-answer-coherence.md +0 -0
  100. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/architecture/consumer-disposition-inventory.md +0 -0
  101. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/architecture/overview.md +0 -0
  102. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/architecture/product-architecture-review.md +0 -0
  103. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/architecture/product-strategy-layering.md +0 -0
  104. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/architecture/semantic-ir-consumer-matrix.md +0 -0
  105. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/architecture/semantic-ir-roadmap.md +0 -0
  106. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/baseline-ci.yml +0 -0
  107. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/commercial-pipeline-audit.md +0 -0
  108. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/contracts-ci.yml +0 -0
  109. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/contracts.md +0 -0
  110. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/eval/2026-06-15-petclinic-rest-issue11-vets-pagination.md +0 -0
  111. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/eval/2026-06-15-petclinic-rest-issue147-validation.md +0 -0
  112. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/eval/2026-06-15-petclinic-rest-workflow.md +0 -0
  113. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/eval/2026-06-15-phase18-openapi-surface.md +0 -0
  114. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/eval/2026-06-15-phase20-validation-surface.md +0 -0
  115. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/eval/2026-06-16-broadleaf-checkout-impact-fieldtest.md +0 -0
  116. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/eval/2026-06-16-petclinic-rest-issue11-weakness2-closed.md +0 -0
  117. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/eval/2026-06-16-spring-petclinic-issue2333-dead-vets.md +0 -0
  118. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/licensing-schema.md +0 -0
  119. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/migrate-check.md +0 -0
  120. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/pack-gate-github-actions.yml +0 -0
  121. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/pack-gate-gitlab.yml +0 -0
  122. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/perf/README.md +0 -0
  123. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/perf/REGRESSION-GATE.md +0 -0
  124. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/perf/baselines/2.5.15/SUMMARY.md +0 -0
  125. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/perf/baselines/2.5.15/alfresco__ask__cold.json +0 -0
  126. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/perf/baselines/2.5.15/alfresco__ask__warm.json +0 -0
  127. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/perf/baselines/2.5.15/broadleaf__ask__cold.json +0 -0
  128. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/perf/baselines/2.5.15/broadleaf__ask__warm.json +0 -0
  129. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/perf/baselines/2.5.15/eureka__ask__cold.json +0 -0
  130. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/perf/baselines/2.5.15/eureka__ask__warm.json +0 -0
  131. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/perf/baselines/2.5.15/jenkins__ask__cold.json +0 -0
  132. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/perf/baselines/2.5.15/jenkins__ask__warm.json +0 -0
  133. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/perf/baselines/2.5.15/jobrunr__ask__cold.json +0 -0
  134. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/perf/baselines/2.5.15/jobrunr__ask__warm.json +0 -0
  135. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/perf/baselines/2.5.15/keycloak__ask__cold.json +0 -0
  136. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/perf/baselines/2.5.15/keycloak__ask__warm.json +0 -0
  137. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/perf/baselines/2.5.15/neo4j__ask__cold.json +0 -0
  138. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/perf/baselines/2.5.15/neo4j__ask__warm.json +0 -0
  139. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/perf/baselines/2.5.15/ofbiz__ask__cold.json +0 -0
  140. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/perf/baselines/2.5.15/ofbiz__ask__warm.json +0 -0
  141. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/perf/baselines/2.5.15/openmrs__ask__cold.json +0 -0
  142. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/perf/baselines/2.5.15/openmrs__ask__warm.json +0 -0
  143. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/perf/baselines/2.5.15/petclinic__ask__cold.json +0 -0
  144. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/perf/baselines/2.5.15/petclinic__ask__warm.json +0 -0
  145. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/perf/baselines/2.5.16/SUMMARY.md +0 -0
  146. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/perf/baselines/2.5.16/alfresco__ask__cold.json +0 -0
  147. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/perf/baselines/2.5.16/alfresco__ask__warm.json +0 -0
  148. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/perf/baselines/2.5.16/broadleaf__ask__cold.json +0 -0
  149. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/perf/baselines/2.5.16/broadleaf__ask__warm.json +0 -0
  150. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/perf/baselines/2.5.16/eureka__ask__cold.json +0 -0
  151. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/perf/baselines/2.5.16/eureka__ask__warm.json +0 -0
  152. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/perf/baselines/2.5.16/jenkins__ask__cold.json +0 -0
  153. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/perf/baselines/2.5.16/jenkins__ask__warm.json +0 -0
  154. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/perf/baselines/2.5.16/jobrunr__ask__cold.json +0 -0
  155. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/perf/baselines/2.5.16/jobrunr__ask__warm.json +0 -0
  156. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/perf/baselines/2.5.16/keycloak__ask__cold.json +0 -0
  157. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/perf/baselines/2.5.16/keycloak__ask__warm.json +0 -0
  158. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/perf/baselines/2.5.16/neo4j__ask__cold.json +0 -0
  159. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/perf/baselines/2.5.16/neo4j__ask__warm.json +0 -0
  160. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/perf/baselines/2.5.16/ofbiz__ask__cold.json +0 -0
  161. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/perf/baselines/2.5.16/ofbiz__ask__warm.json +0 -0
  162. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/perf/baselines/2.5.16/openmrs__ask__cold.json +0 -0
  163. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/perf/baselines/2.5.16/openmrs__ask__warm.json +0 -0
  164. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/perf/baselines/2.5.16/petclinic__ask__cold.json +0 -0
  165. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/perf/baselines/2.5.16/petclinic__ask__warm.json +0 -0
  166. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/perf/baselines/5.9.22/petclinic__ask__cold.json +0 -0
  167. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/perf/baselines/5.9.22/petclinic__ask__warm.json +0 -0
  168. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/perf/baselines/gate-latest/README.md +0 -0
  169. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/perf/baselines/gate-latest/broadleaf__ask__warm.json +0 -0
  170. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/perf/baselines/gate-latest/broadleaf__endpoints__warm.json +0 -0
  171. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/perf/baselines/gate-latest/broadleaf__migrate-check__warm.json +0 -0
  172. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/perf/baselines/gate-latest/broadleaf__posture__warm.json +0 -0
  173. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/perf/baselines/gate-latest/broadleaf__spring-audit__warm.json +0 -0
  174. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/perf/baselines/gate-latest/broadleaf__validation__warm.json +0 -0
  175. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/perf/baselines/reference-best/README.md +0 -0
  176. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/perf/corpus-testing-2026-08-22.md +0 -0
  177. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/posture.md +0 -0
  178. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/privacy.md +0 -0
  179. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/pro-experience-audit.md +0 -0
  180. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/schema.md +0 -0
  181. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/spec/envelope-v1.md +0 -0
  182. {sourcecode-5.9.24 → sourcecode-5.9.25}/docs/spring-audit-ci.yml +0 -0
  183. {sourcecode-5.9.24 → sourcecode-5.9.25}/hatch_build.py +0 -0
  184. {sourcecode-5.9.24 → sourcecode-5.9.25}/scripts/compare_integration_engines.py +0 -0
  185. {sourcecode-5.9.24 → sourcecode-5.9.25}/scripts/context_cost_harness.py +0 -0
  186. {sourcecode-5.9.24 → sourcecode-5.9.25}/scripts/customer_smoke_test.sh +0 -0
  187. {sourcecode-5.9.24 → sourcecode-5.9.25}/scripts/generate_jdk_exports.py +0 -0
  188. {sourcecode-5.9.24 → sourcecode-5.9.25}/scripts/perf_gate.py +0 -0
  189. {sourcecode-5.9.24 → sourcecode-5.9.25}/scripts/perf_harness.py +0 -0
  190. {sourcecode-5.9.24 → sourcecode-5.9.25}/scripts/sync_gate_anchors.py +0 -0
  191. {sourcecode-5.9.24 → sourcecode-5.9.25}/scripts/test_fast.sh +0 -0
  192. {sourcecode-5.9.24 → sourcecode-5.9.25}/scripts/windows_reliability_matrix.py +0 -0
  193. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/__main__.py +0 -0
  194. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/access_drift.py +0 -0
  195. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/adaptive_scanner.py +0 -0
  196. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/analysis_budget.py +0 -0
  197. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/archetype.py +0 -0
  198. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/architectural_baseline.py +0 -0
  199. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/architectural_delta.py +0 -0
  200. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/architecture_analyzer.py +0 -0
  201. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/architecture_summary.py +0 -0
  202. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/ast_extractor.py +0 -0
  203. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/audit_clusters.py +0 -0
  204. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/audit_recipe.py +0 -0
  205. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/audit_report.py +0 -0
  206. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/audit_since.py +0 -0
  207. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/audit_verify.py +0 -0
  208. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/baseline_attestation.py +0 -0
  209. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/baseline_autocapture.py +0 -0
  210. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/breaking_changes.py +0 -0
  211. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/build_modules.py +0 -0
  212. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/build_stamp.py +0 -0
  213. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/bundled_docs.py +0 -0
  214. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/c4_render.py +0 -0
  215. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/cache.py +0 -0
  216. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/cache_model.py +0 -0
  217. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/cache_observation.py +0 -0
  218. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/call_surface.py +0 -0
  219. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/caller_metrics.py +0 -0
  220. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/caller_reach.py +0 -0
  221. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/canonical_ir.py +0 -0
  222. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/chain_rules.py +0 -0
  223. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/change_plan.py +0 -0
  224. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/ci_output.py +0 -0
  225. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/cir_graphs.py +0 -0
  226. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/classifier.py +0 -0
  227. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/click_runtime.py +0 -0
  228. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/client_calls.py +0 -0
  229. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/code_notes_analyzer.py +0 -0
  230. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/compare.py +0 -0
  231. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/confidence_analyzer.py +0 -0
  232. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/constraint_diff.py +0 -0
  233. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/consumer_join.py +0 -0
  234. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/container_wiring.py +0 -0
  235. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/context_cache.py +0 -0
  236. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/context_graph.py +0 -0
  237. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/context_scorer.py +0 -0
  238. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/context_summarizer.py +0 -0
  239. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/contract_diff.py +0 -0
  240. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/contract_init.py +0 -0
  241. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/contract_model.py +0 -0
  242. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/contract_pipeline.py +0 -0
  243. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/coverage_parser.py +0 -0
  244. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/cve_feed.py +0 -0
  245. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/cve_reachability.py +0 -0
  246. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/data_exposure.py +0 -0
  247. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/data_labels.py +0 -0
  248. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/declarations.py +0 -0
  249. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/defect_classes/__init__.py +0 -0
  250. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/defect_classes/registry.json +0 -0
  251. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/defect_identity.py +0 -0
  252. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/degradation.py +0 -0
  253. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/dependency_analyzer.py +0 -0
  254. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/deployment_prefix.py +0 -0
  255. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/detach.py +0 -0
  256. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/detectors/__init__.py +0 -0
  257. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/detectors/base.py +0 -0
  258. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/detectors/csproj_parser.py +0 -0
  259. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/detectors/dart.py +0 -0
  260. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/detectors/dotnet.py +0 -0
  261. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/detectors/elixir.py +0 -0
  262. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/detectors/go.py +0 -0
  263. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/detectors/heuristic.py +0 -0
  264. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/detectors/hybrid.py +0 -0
  265. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/detectors/java.py +0 -0
  266. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/detectors/jvm_ext.py +0 -0
  267. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/detectors/nodejs.py +0 -0
  268. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/detectors/parsers.py +0 -0
  269. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/detectors/php.py +0 -0
  270. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/detectors/project.py +0 -0
  271. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/detectors/python.py +0 -0
  272. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/detectors/ruby.py +0 -0
  273. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/detectors/rust.py +0 -0
  274. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/detectors/systems.py +0 -0
  275. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/detectors/terraform.py +0 -0
  276. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/detectors/tooling.py +0 -0
  277. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/doc_analyzer.py +0 -0
  278. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/dynamic_argument_surface.py +0 -0
  279. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/empty_reach.py +0 -0
  280. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/endpoint_disposition.py +0 -0
  281. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/endpoint_literals.py +0 -0
  282. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/endpoint_metrics.py +0 -0
  283. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/entrypoint_classifier.py +0 -0
  284. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/env_analyzer.py +0 -0
  285. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/environment_resolution.py +0 -0
  286. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/error_schema.py +0 -0
  287. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/evidence_provider.py +0 -0
  288. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/execution_plan.py +0 -0
  289. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/explain.py +0 -0
  290. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/explain_endpoint.py +0 -0
  291. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/facts/__init__.py +0 -0
  292. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/facts/registry.json +0 -0
  293. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/field_deprecations.py +0 -0
  294. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/file_chunker.py +0 -0
  295. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/file_classifier.py +0 -0
  296. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/filter_surface.py +0 -0
  297. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/findings_baseline.py +0 -0
  298. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/format_contract.py +0 -0
  299. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/fqn_utils.py +0 -0
  300. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/functional_routes.py +0 -0
  301. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/gate_anchors.py +0 -0
  302. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/git_analyzer.py +0 -0
  303. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/git_checkout.py +0 -0
  304. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/github_diff.py +0 -0
  305. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/graph_analyzer.py +0 -0
  306. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/graph_evidence.py +0 -0
  307. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/hibernate_strat.py +0 -0
  308. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/identity_fallback.py +0 -0
  309. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/integration_coordinates.py +0 -0
  310. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/intent_router.py +0 -0
  311. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/jdk_exports.py +0 -0
  312. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/jvm_inventory.py +0 -0
  313. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/license.py +0 -0
  314. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/manifest_cache.py +0 -0
  315. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/mcp/__init__.py +0 -0
  316. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/mcp/dependency_import.py +0 -0
  317. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/mcp/onboarding/__init__.py +0 -0
  318. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/mcp/onboarding/applier.py +0 -0
  319. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/mcp/onboarding/backup.py +0 -0
  320. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/mcp/onboarding/detector.py +0 -0
  321. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/mcp/onboarding/planner.py +0 -0
  322. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/mcp/orchestrator.py +0 -0
  323. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/mcp/registry.py +0 -0
  324. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/mcp/runner.py +0 -0
  325. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/mcp/server.py +0 -0
  326. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/mcp_nudge.py +0 -0
  327. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/metrics_analyzer.py +0 -0
  328. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/migration_apply.py +0 -0
  329. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/migration_blast.py +0 -0
  330. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/non_coverage.py +0 -0
  331. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/openapi_surface.py +0 -0
  332. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/openrewrite_recipe.py +0 -0
  333. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/output_bounds.py +0 -0
  334. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/output_budget.py +0 -0
  335. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/output_ceiling.py +0 -0
  336. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/output_encoding.py +0 -0
  337. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/output_sink.py +0 -0
  338. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/pack_manifest.py +0 -0
  339. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/packs.py +0 -0
  340. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/parallel.py +0 -0
  341. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/parse_cache.py +0 -0
  342. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/partial_contract.py +0 -0
  343. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/path_admission.py +0 -0
  344. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/path_display.py +0 -0
  345. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/path_filters.py +0 -0
  346. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/perf.py +0 -0
  347. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/phased_run.py +0 -0
  348. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/pipe_contract.py +0 -0
  349. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/posture.py +0 -0
  350. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/pr_comment_renderer.py +0 -0
  351. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/pr_impact.py +0 -0
  352. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/pr_risk.py +0 -0
  353. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/prepare_context.py +0 -0
  354. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/product_info.py +0 -0
  355. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/progress.py +0 -0
  356. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/provenance.py +0 -0
  357. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/ranking_engine.py +0 -0
  358. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/readiness_timeline.py +0 -0
  359. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/readonly.py +0 -0
  360. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/reconciliation.py +0 -0
  361. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/redactor.py +0 -0
  362. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/reference_facts.py +0 -0
  363. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/regress.py +0 -0
  364. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/regulatory_pack.py +0 -0
  365. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/release_info.py +0 -0
  366. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/relevance_scorer.py +0 -0
  367. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/remediation_diff.py +0 -0
  368. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/remediation_flow.py +0 -0
  369. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/remediation_report.py +0 -0
  370. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/remedies.py +0 -0
  371. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/rename_refactor.py +0 -0
  372. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/repo_classifier.py +0 -0
  373. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/repository_ir.py +0 -0
  374. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/resource_budget.py +0 -0
  375. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/retrieval/__init__.py +0 -0
  376. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/retrieval/context.py +0 -0
  377. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/retrieval/errors.py +0 -0
  378. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/retrieval/executor.py +0 -0
  379. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/retrieval/planner.py +0 -0
  380. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/retrieval/query.py +0 -0
  381. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/retrieval/request.py +0 -0
  382. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/retrieval/resolution.py +0 -0
  383. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/retrieval/result.py +0 -0
  384. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/retrieval/retriever.py +0 -0
  385. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/retrieval/runtime.py +0 -0
  386. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/retrieval/steps.py +0 -0
  387. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/retrieval/steps_endpoint.py +0 -0
  388. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/retrieval/steps_graph.py +0 -0
  389. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/retrieval/steps_impact.py +0 -0
  390. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/retrieval/steps_intf.py +0 -0
  391. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/retrieval/steps_struct.py +0 -0
  392. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/retrieval/steps_txsec.py +0 -0
  393. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/ris.py +0 -0
  394. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/risk.py +0 -0
  395. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/risk_model.py +0 -0
  396. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/rule_catalog.py +0 -0
  397. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/runs.py +0 -0
  398. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/runtime_classifier.py +0 -0
  399. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/sarif.py +0 -0
  400. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/sarif_emit.py +0 -0
  401. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/scanner.py +0 -0
  402. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/schema.py +0 -0
  403. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/schema_producers.py +0 -0
  404. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/schema_registry.py +0 -0
  405. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/schemas/core-analysis-v1.schema.json +0 -0
  406. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/schemas/cve-reachability-v1.schema.json +0 -0
  407. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/schemas/endpoints-v1.schema.json +0 -0
  408. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/schemas/envelope-v1.schema.json +0 -0
  409. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/schemas/pr-impact-v1.schema.json +0 -0
  410. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/schemas/verify-edit-v1.schema.json +0 -0
  411. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/schemas/verify-v1.schema.json +0 -0
  412. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/security_chain.py +0 -0
  413. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/security_config.py +0 -0
  414. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/security_config_scan.py +0 -0
  415. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/selection_contract.py +0 -0
  416. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/self_audit.py +0 -0
  417. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/semantic_analyzer.py +0 -0
  418. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/semantic_impact_engine.py +0 -0
  419. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/semantic_integration_engine.py +0 -0
  420. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/semantic_services.py +0 -0
  421. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/serializer.py +0 -0
  422. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/servlet_surface.py +0 -0
  423. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/source_text.py +0 -0
  424. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/spring_event_topology.py +0 -0
  425. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/spring_findings.py +0 -0
  426. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/spring_impact.py +0 -0
  427. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/spring_model.py +0 -0
  428. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/spring_profiles.py +0 -0
  429. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/spring_properties.py +0 -0
  430. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/spring_semantic.py +0 -0
  431. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/spring_tx_analyzer.py +0 -0
  432. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/sql_taint.py +0 -0
  433. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/summarizer.py +0 -0
  434. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/target_admission.py +0 -0
  435. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/telemetry/__init__.py +0 -0
  436. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/telemetry/config.py +0 -0
  437. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/telemetry/consent.py +0 -0
  438. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/telemetry/events.py +0 -0
  439. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/telemetry/filters.py +0 -0
  440. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/telemetry/transport.py +0 -0
  441. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/test_gap_ranking.py +0 -0
  442. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/test_sources.py +0 -0
  443. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/text_input.py +0 -0
  444. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/timeline.py +0 -0
  445. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/timeline_cache.py +0 -0
  446. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/token_estimate.py +0 -0
  447. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/tree_utils.py +0 -0
  448. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/type_usage_surface.py +0 -0
  449. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/validation_inference.py +0 -0
  450. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/validation_surface.py +0 -0
  451. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/verify_edit.py +0 -0
  452. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/verify_repo.py +0 -0
  453. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/verify_rules.py +0 -0
  454. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/version_check.py +0 -0
  455. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/vex.py +0 -0
  456. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/waivers.py +0 -0
  457. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/watch_loop.py +0 -0
  458. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/wired_surface.py +0 -0
  459. {sourcecode-5.9.24 → sourcecode-5.9.25}/src/sourcecode/workspace.py +0 -0
  460. {sourcecode-5.9.24 → sourcecode-5.9.25}/supabase/functions/README.md +0 -0
  461. {sourcecode-5.9.24 → sourcecode-5.9.25}/supabase/functions/get-license/index.ts +0 -0
  462. {sourcecode-5.9.24 → sourcecode-5.9.25}/supabase/functions/lemonsqueezy-webhook/index.ts +0 -0
  463. {sourcecode-5.9.24 → sourcecode-5.9.25}/supabase/functions/telemetry/index.ts +0 -0
  464. {sourcecode-5.9.24 → sourcecode-5.9.25}/supabase/sql/license_event_ordering.sql +0 -0
  465. {sourcecode-5.9.24 → sourcecode-5.9.25}/supabase/sql/licensing_schema.sql +0 -0
  466. {sourcecode-5.9.24 → sourcecode-5.9.25}/supabase/sql/telemetry_events.sql +0 -0
@@ -1,5 +1,29 @@
1
1
  # Changelog
2
2
 
3
+ ## [5.9.25] — 2026-09-01
4
+
5
+ *Reliability remediation from the alternative 5.9.23 audit.*
6
+
7
+ ### Fixed
8
+
9
+ - Hardened audit-family answer delivery: a successful exit now requires stdout
10
+ or a verified requested output artifact.
11
+ - Propagated deadline cuts through security posture, with omitted stages and
12
+ partial coverage disclosed in the result.
13
+ - Removed nested execution clocks from deterministic content identity.
14
+ - Reconciled compact migration findings with their full detected population.
15
+ - Made failed, unrun, unknown and task-gap self-checks invalidate envelope
16
+ completeness instead of reporting `complete: true`.
17
+ - Published the effective `prepare-context` stdout budget and full-artifact
18
+ path in every task response.
19
+
20
+ ### Known Limitations
21
+
22
+ - The security-rules/remediation performance regression (`ALT-03`, `ALT-07`)
23
+ still requires reproduction and bisection on the affected large Windows tree.
24
+ - Native-Windows repetition remains required to close the original silent
25
+ success report conclusively.
26
+
3
27
  ## [5.9.24] — 2026-09-01
4
28
 
5
29
  *Follow-up correction batch after the external 5.9.23 audit.*
@@ -17,9 +41,15 @@
17
41
 
18
42
  ### Known Limitations
19
43
 
20
- - The external 5.9.23 audit measured rare zero-byte successful answers from
21
- `risk` and Markdown `audit-report`. This remains a P0 CI blocker: validate
22
- output bytes until `EMPTY_ANSWER` is enforced globally.
44
+ - An alternative Windows audit of the 5.9.23 build measured a systemic silent
45
+ success regression across `spring-audit`, `verify`, `risk`, Markdown
46
+ `audit-report`, `migrate-check`, and `migrate-apply`: 55 of 84 observed runs
47
+ exited `0` with zero output, plus eight timeouts. This supersedes the earlier
48
+ characterization as rare. Do not use the audit-command family for unattended
49
+ CI until the global non-empty-answer and output-promise invariants are proven.
50
+ - `ASK_MAX_ANALYSIS_SECONDS` did not produce a partial result on the affected
51
+ paths, and could be ignored by `spring-audit`; it is not a safe recovery path
52
+ for this release.
23
53
  - `--agent` can reject large repositories after expensive post-hoc RSS sampling,
24
54
  and nested workspaces can make root help unacceptably slow. The prioritized
25
55
  remediation queue is maintained in the defect ledger.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sourcecode
3
- Version: 5.9.24
3
+ Version: 5.9.25
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.24-blue)
62
+ ![Version](https://img.shields.io/badge/version-5.9.25-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
@@ -212,15 +212,19 @@ exit 75 (`--allow-partial` accepts one deliberately). The long-run progress
212
212
  message names the phase it is in and whether that phase has changed, so a slow run
213
213
  is distinguishable from a blocked one.
214
214
 
215
- **External audit boundary (2026-09-01).** The latest Windows audit rates the
216
- large-repository experience at **6.9/10** and reports open P0/P1 issues: empty
217
- successful Markdown `audit-report`, silent `risk` termination, multi-gigabyte
218
- deep-agent RSS, incomplete parse/coverage disclosure and oversized compact
219
- surfaces. The 5.9.23 audit found a CI-blocking empty-output regression that
220
- remains open in 5.9.24; do not use `risk` or Markdown `audit-report` as
221
- unattended gates until it is fixed. Findings are tracked in the [external audit](docs/AUDIT-2026-09-01-EXTERNAL-5.9.23.md)
222
- and [defect ledger](docs/DEFECT-LEDGER.md); they are not closed by the existing
223
- engineering-host measurements.
215
+ **External audit boundary (2026-09-01).** An alternative native-Windows audit
216
+ rates the 5.9.23 audit-command family **4.9/10**, versus 6.6 for 5.9.22. It
217
+ measured 55 zero-byte `exit 0` answers and eight timeouts in 84 runs across
218
+ `spring-audit`, `verify`, `risk`, Markdown `audit-report`, `migrate-check`, and
219
+ `migrate-apply`. The release must not be used to gate unattended CI through
220
+ those commands, nor should `ASK_MAX_ANALYSIS_SECONDS` be relied on as a recovery
221
+ path, until native repetition proves the global output and partial-result
222
+ invariants. The unaffected lightweight CI commands are useful evidence, but do
223
+ not close this release-wide reliability failure. Findings are tracked in the
224
+ [alternative audit](docs/AUDIT-2026-09-01-ALTERNATIVE-5.9.23.md), the earlier
225
+ [external audit](docs/AUDIT-2026-09-01-EXTERNAL-5.9.23.md), and the
226
+ [defect ledger](docs/DEFECT-LEDGER.md); engineering-host measurements cannot
227
+ close native-Windows observations.
224
228
 
225
229
  The current external audit still records two open availability limits, and they
226
230
  are held open deliberately: `audit-report --format markdown` under contention, and
@@ -286,7 +290,7 @@ brew tap haroundominique/sourcecode && brew install sourcecode
286
290
  # pip / pipx
287
291
  pipx install sourcecode # or: pip install sourcecode
288
292
 
289
- ask version # ask 5.9.22 — and, on a build that has aged,
293
+ ask version # ask 5.9.25 — and, on a build that has aged,
290
294
  # how many releases have probably shipped since
291
295
  ```
292
296
 
@@ -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.24-blue)
13
+ ![Version](https://img.shields.io/badge/version-5.9.25-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
@@ -163,15 +163,19 @@ exit 75 (`--allow-partial` accepts one deliberately). The long-run progress
163
163
  message names the phase it is in and whether that phase has changed, so a slow run
164
164
  is distinguishable from a blocked one.
165
165
 
166
- **External audit boundary (2026-09-01).** The latest Windows audit rates the
167
- large-repository experience at **6.9/10** and reports open P0/P1 issues: empty
168
- successful Markdown `audit-report`, silent `risk` termination, multi-gigabyte
169
- deep-agent RSS, incomplete parse/coverage disclosure and oversized compact
170
- surfaces. The 5.9.23 audit found a CI-blocking empty-output regression that
171
- remains open in 5.9.24; do not use `risk` or Markdown `audit-report` as
172
- unattended gates until it is fixed. Findings are tracked in the [external audit](docs/AUDIT-2026-09-01-EXTERNAL-5.9.23.md)
173
- and [defect ledger](docs/DEFECT-LEDGER.md); they are not closed by the existing
174
- engineering-host measurements.
166
+ **External audit boundary (2026-09-01).** An alternative native-Windows audit
167
+ rates the 5.9.23 audit-command family **4.9/10**, versus 6.6 for 5.9.22. It
168
+ measured 55 zero-byte `exit 0` answers and eight timeouts in 84 runs across
169
+ `spring-audit`, `verify`, `risk`, Markdown `audit-report`, `migrate-check`, and
170
+ `migrate-apply`. The release must not be used to gate unattended CI through
171
+ those commands, nor should `ASK_MAX_ANALYSIS_SECONDS` be relied on as a recovery
172
+ path, until native repetition proves the global output and partial-result
173
+ invariants. The unaffected lightweight CI commands are useful evidence, but do
174
+ not close this release-wide reliability failure. Findings are tracked in the
175
+ [alternative audit](docs/AUDIT-2026-09-01-ALTERNATIVE-5.9.23.md), the earlier
176
+ [external audit](docs/AUDIT-2026-09-01-EXTERNAL-5.9.23.md), and the
177
+ [defect ledger](docs/DEFECT-LEDGER.md); engineering-host measurements cannot
178
+ close native-Windows observations.
175
179
 
176
180
  The current external audit still records two open availability limits, and they
177
181
  are held open deliberately: `audit-report --format markdown` under contention, and
@@ -237,7 +241,7 @@ brew tap haroundominique/sourcecode && brew install sourcecode
237
241
  # pip / pipx
238
242
  pipx install sourcecode # or: pip install sourcecode
239
243
 
240
- ask version # ask 5.9.22 — and, on a build that has aged,
244
+ ask version # ask 5.9.25 — and, on a build that has aged,
241
245
  # how many releases have probably shipped since
242
246
  ```
243
247
 
@@ -0,0 +1,72 @@
1
+ # Alternative External Audit - 5.9.23
2
+
3
+ ## Scope And Verdict
4
+
5
+ This native-Windows audit evaluated the 5.9.23 build on a dirty 3,342-Java-file
6
+ repository under Python 3.10. It rates the release **4.9/10**, down from 6.6 for
7
+ 5.9.22. Analysis precision remains strong and several context paths are faster,
8
+ but the audit-command family is not reliable enough for unattended CI.
9
+
10
+ This is an external measurement. It is evidence of a release-blocking failure,
11
+ not proof of a single root cause. Engineering-host results do not close it.
12
+
13
+ ## Execution Matrix
14
+
15
+ | Invocation | Runs | Answers | Empty `exit 0` | Timeouts |
16
+ |---|---:|---:|---:|---:|
17
+ | `spring-audit . --compact` | 17 | 0 | 14 | 3 |
18
+ | `verify .` | 17 | 0 | 16 | 1 |
19
+ | `risk . --limit 20` | 13 | 0 | 11 | 2 |
20
+ | `audit-report . --format markdown` | 7 | 0 | 5 | 2 |
21
+ | `migrate-check . --compact` | 12 | 7 | 5 | 0 |
22
+ | `migrate-apply .` | 17 | 14 | 3 | 0 |
23
+ | `verify . --init --dry-run` | 1 | 0 | 1 | 0 |
24
+ | **Total** | **84** | **21** | **55** | **8** |
25
+
26
+ The observed failures were serialized, foreground runs. Clearing cache, varying
27
+ `ASK_JOBS` and `--jobs`, changing output format, using `--no-cache`, and using
28
+ `--output` did not make the main audit failure reliable. `endpoints --output`
29
+ did create its artifact, showing that the output invariant exists on a separate
30
+ path but does not cover the affected family.
31
+
32
+ ## Release Blockers
33
+
34
+ 1. `ALT-01`: No command may return `exit 0` with zero stdout unless a requested
35
+ output artifact was created and verified. A failed worker or absent phase
36
+ result is not an empty finding set and must return structured non-zero failure.
37
+ 2. `ALT-02`: Applicable `ASK_MAX_ANALYSIS_SECONDS` deadlines must publish a
38
+ partial answer with `complete:false`; `risk` and `audit-report` returned empty
39
+ success, while `spring-audit` exceeded the external 200-second kill.
40
+ 3. `ALT-03`: The security-rules phase is the primary investigation target.
41
+ Security retrieve queries timed out, `remediate` stalled in auditing, and the
42
+ known small subtree completed while the 3,342-file root did not. This is a
43
+ bisection hypothesis, not a confirmed causal claim.
44
+
45
+ Closure requires at least 30 native repetitions for every affected command, with
46
+ byte counts, exit code, timeout status, and requested output-file existence.
47
+
48
+ ## Additional Regressions
49
+
50
+ - `impact-chain` content IDs changed every execution because clock fields under
51
+ `metadata` were hashed. All execution clocks must be excluded independent of
52
+ their nesting location.
53
+ - `migrate-check` exposed incompatible findings totals: `summary.total_findings`
54
+ was 1,526 while `findings_cap.total` was 593, without an exclusion contract.
55
+ - `selftest` emitted `complete:true` and no gaps despite one fail and one error.
56
+ - `remediate` stalled beyond 400 seconds in `auditing for repairable findings`.
57
+ - `prepare-context review-pr` emitted roughly 30K tokens without a compact mode
58
+ or omission contract.
59
+ - Existing argument hints and retrieve-anchor discoverability remain ergonomic
60
+ follow-ups, not release blockers.
61
+
62
+ ## Preserved Evidence
63
+
64
+ - Endpoint analysis remained exact: 3,763 endpoints with matching paths and
65
+ double-base-path expansion.
66
+ - `migrate-check --compact` improved from 86.8 KB to 36.7 KB and publishes cap
67
+ contracts; the nested-cap aggregation correction in 5.9.24 remains valid.
68
+ - Several deterministic payloads were byte-identical between releases, and the
69
+ lightweight CI paths `pr-risk`, `verify-edit`, and `pr-impact` were reliable.
70
+
71
+ These controls must remain in the regression battery while the P0 recovery work
72
+ proceeds; they do not compensate for silent audit-family failures.
@@ -14,23 +14,36 @@ Status values: `open` · `in-progress` · `closed <version>` · `by-design` (wit
14
14
  The facts these rows are keyed to are published: `ask schema facts-v1` prints the registry
15
15
  (authority, definition, consumers, parity test) that the release battery enforces.
16
16
 
17
- ## Current Synchronization — External Audit `5.9.23`, carried into `5.9.24` (2026-09-01)
18
-
19
- **Release gate: do not use 5.9.24 as a CI decision gate for these surfaces.** The audit measured
20
- three `rc=0`, zero-byte answers across `risk` and Markdown `audit-report`.
21
- The trigger is not yet established; warm-cache and contention hypotheses were
22
- explicitly tested and did not reproduce it. A global non-empty-output invariant
23
- is therefore the P0 containment work, not a claim that the root cause is known.
24
-
25
- Priority order is: `NEW-01` empty successful output; `REG-02` default agent
26
- memory rejection and post-hoc RSS enforcement; `BUG-01` undeclared parse loss;
27
- `REG-03` warm-path slowdown; `NEW-02` overloaded endpoint anchors; then
28
- workspace-help/selftest/plan and output-contract regressions. Full evidence:
29
- [`AUDIT-2026-09-01-EXTERNAL-5.9.23.md`](AUDIT-2026-09-01-EXTERNAL-5.9.23.md).
17
+ ## Current Synchronization — Alternative External Audit `5.9.23`, carried into `5.9.25` (2026-09-01)
18
+
19
+ **Release gate: do not use 5.9.25 to gate unattended CI through the audit-command
20
+ family.** A native-Windows alternative audit of the 5.9.23 build measured 55
21
+ `rc=0`, zero-byte answers and eight timeouts in 84 runs. The failures include
22
+ `spring-audit`, `verify`, `risk`, Markdown `audit-report`, `migrate-check`, and
23
+ `migrate-apply`; the prior 3/47 observation was materially incomplete. The
24
+ cause remains unproven. A security-rules phase is a supported hypothesis, not a
25
+ closure claim. `exit 0` is valid only for a non-empty stdout answer or a verified
26
+ `--output` artifact; a missing phase result must be structured failure, never an
27
+ empty finding set.
28
+
29
+ Priority order is: `ALT-01` silent success and unkept output promises;
30
+ `ALT-02` budget/partial-result failure; `ALT-03` security-rules phase bisection;
31
+ `ALT-04` content-id instability; `ALT-05` contradictory migration totals;
32
+ `ALT-06` false-complete selftest; then remediation, context bounds and CLI
33
+ ergonomics. Full evidence: [`AUDIT-2026-09-01-ALTERNATIVE-5.9.23.md`](AUDIT-2026-09-01-ALTERNATIVE-5.9.23.md)
34
+ and [`AUDIT-2026-09-01-EXTERNAL-5.9.23.md`](AUDIT-2026-09-01-EXTERNAL-5.9.23.md).
30
35
 
31
36
  | ID | Severity | Status | Evidence and required closure |
32
37
  |---|---:|---|---|
33
- | `NEW-01` | Critical maximum | **open, P0 / CI blocker** | `risk` and Markdown `audit-report` can exit `0` with zero bytes on stdout and stderr. The measured rate was 3/47 byte-counted runs; root cause is unknown. Enforce `EMPTY_ANSWER` globally and add byte-counted background-process coverage. |
38
+ | `ALT-01` | Critical maximum | **fixed, pending native-Windows repetition** | `a7ad44b` hardens the required-answer and output-artifact guards: `exit 0` now requires delivered stdout or a verified requested artifact. Native 30-run repetition remains the release closure evidence. |
39
+ | `ALT-02` | Critical maximum | **fixed, bounded-phase follow-up** | `aab1e8b` propagates deadline checks into security posture and publishes omitted stages and partial coverage. A small-repository budget can still finish its coarse earlier phases before the deadline is observed; `ALT-03` owns reducing that phase granularity. |
40
+ | `ALT-03` | High | **open, investigation** | The security-rules phase is the common evidence-backed suspect: all affected audit flows consume security findings, security `retrieve` queries timed out, and `remediate` stalled in the same phase. Bisect the known working small subtree against the 3,342-file root; do not assert causality before reproducing it. |
41
+ | `ALT-04` | High | **fixed** | `36e3893` excludes every nested `*_time_ms` execution clock from `content_id`; parametric tests retain semantic-field sensitivity. |
42
+ | `ALT-05` | High | **fixed** | `b12c8f1` publishes `population_total` and `excluded_before_cap` beside the compact findings cap, reconciling it with the summary population. |
43
+ | `ALT-06` | High | **fixed** | `6d0889e` publishes structured limitations for failed, unrun and unknown ledger rows; `5620864` also makes generic task `gaps` invalidate envelope completeness. |
44
+ | `ALT-07` | Medium | **open** | `remediate` regressed from a 23.6-second answer to hangs beyond 400 seconds in `auditing for repairable findings`; it shares the `ALT-03` investigation until separated by evidence. |
45
+ | `ALT-08` | Medium | **fixed** | `15d77d2` publishes the effective per-task stdout budget and the full-artifact path; bounded output remains skipped only for explicit `--output` artifacts. |
46
+ | `NEW-01` | Critical maximum | **superseded by ALT-01** | The earlier 3/47 `risk` and Markdown `audit-report` observation undercounted the native-Windows audit-family failure. |
34
47
  | `REG-02` | Critical | **open, regression** | The 1,536 MB default `--agent` ceiling rejects valid large repositories only after spending minutes; it is not published in successful default-agent metadata. Bound projection during construction, sample RSS periodically, and publish the effective ceiling. |
35
48
  | `REG-03` | High | **open, regression** | Warm `spring-audit` was measured 2.1–3.8x slower despite a fully reused CIR. Attribute the warm pass before claiming cache benefit. |
36
49
  | `REG-01` | High | **open, regression** | Root `ask --help` took 83–86 seconds in a workspace with nested repositories. Help must not perform unbounded repository/profile analysis. |
@@ -1,5 +1,25 @@
1
1
  # ASK — Development Roadmap
2
2
 
3
+ ### Alternative Audit Intake — release 5.9.23 reliability regression
4
+
5
+ An alternative native-Windows audit found the audit-command family unreliable:
6
+ 55 zero-byte `exit 0` answers and eight timeouts in 84 executions. `spring-audit`
7
+ and `verify` answered 0/34; `risk`, Markdown `audit-report`, `migrate-check`, and
8
+ `migrate-apply` also failed silently. This overrides the earlier characterization
9
+ as a rare output anomaly. No feature work should be treated as release-ready
10
+ until the following recovery sequence has native evidence.
11
+
12
+ | Priority | Required work and closure boundary |
13
+ |---|---|
14
+ | P0 | Enforce `exit 0 => non-empty stdout OR verified --output artifact` across the command registry. A missing auditing-phase result or worker failure must emit structured non-zero failure. Run at least 30 native repetitions per affected command. |
15
+ | P0 | Restore the budget contract: applicable `ASK_MAX_ANALYSIS_SECONDS` deadlines publish `partial:true` and `complete:false`; non-applicable commands disclose that fact. Verify `risk`, `audit-report`, and `spring-audit` natively. |
16
+ | P1 | Bisect the security-rules phase using the working small subtree and the 3,342-file failing root. It is a hypothesis supported by affected command overlap, not an established root cause. |
17
+ | P1 | Restore `content_id` stability by excluding `metadata.*_time_ms` execution clocks, and make selftest completion/gaps derive from failures and errors. |
18
+ | P1 | Reconcile `migrate-check` findings populations and bound `prepare-context review-pr`; then address remediation hangs and remaining CLI ergonomics. |
19
+
20
+ The full measurement matrix and non-regression controls are in
21
+ [`AUDIT-2026-09-01-ALTERNATIVE-5.9.23.md`](AUDIT-2026-09-01-ALTERNATIVE-5.9.23.md).
22
+
3
23
  ### Release 5.9.20 — JVM evidence inventory
4
24
 
5
25
  The accepted JVM R&D scope is implemented in `migrate-check`: local framework,
@@ -279,7 +279,7 @@ pipx install sourcecode # isolated install, no venv needed
279
279
 
280
280
  # Verify
281
281
  ask version
282
- # ask 5.9.19
282
+ # ask 5.9.25
283
283
  ```
284
284
 
285
285
  Requires Python 3.9+.
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "sourcecode"
7
- version = "5.9.24"
7
+ version = "5.9.25"
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"
@@ -4,4 +4,4 @@ ASK Engine is the product. ``ask`` is the canonical CLI command; ``sourcecode``
4
4
  the legacy compatibility alias and the Python/PyPI package name. See
5
5
  docs/PRODUCT_IDENTITY.md (normative)."""
6
6
 
7
- __version__ = "5.9.24"
7
+ __version__ = "5.9.25"
@@ -88,6 +88,12 @@ def _summarise(value: Any) -> Any:
88
88
 
89
89
  def _gaps(payload: "dict[str, Any]") -> "list[dict[str, Any]]":
90
90
  found: "list[dict[str, Any]]" = []
91
+ # `prepare-context` and related task answers publish their unanswered
92
+ # analysis as a top-level list, rather than under the route-specific
93
+ # `coverage` block. It is still a declared gap in the answer.
94
+ for gap in _as_list(payload.get("gaps")):
95
+ if gap:
96
+ found.append({"field": "gaps", "what": _summarise(gap)})
91
97
  coverage = payload.get("coverage")
92
98
  if isinstance(coverage, dict):
93
99
  for gap in _as_list(coverage.get("gaps")):
@@ -3000,6 +3000,19 @@ _OUTPUT_PROMISED: "Optional[str]" = None
3000
3000
  _OUTPUT_DELIVERED: bool = False
3001
3001
  _ANSWER_REQUIRED_BY: "Optional[str]" = None
3002
3002
 
3003
+ # ALT-01. These commands publish repository-analysis answers. A successful
3004
+ # process with neither stdout nor a verified output artifact is never valid.
3005
+ # Kept as one authority so the entry point can arm the guard before Click enters
3006
+ # a callback; a callback that returns early is the failure this protects.
3007
+ REQUIRED_ANSWER_COMMANDS: "frozenset[str]" = frozenset({
3008
+ "audit-report",
3009
+ "migrate-apply",
3010
+ "migrate-check",
3011
+ "risk",
3012
+ "spring-audit",
3013
+ "verify",
3014
+ })
3015
+
3003
3016
 
3004
3017
  def _record_output_promise(argv: "list[str]") -> None:
3005
3018
  """Note that this invocation asked for a file, before anything is parsed.
@@ -3047,6 +3060,16 @@ def _require_answer_delivery(command: str) -> None:
3047
3060
  _ANSWER_REQUIRED_BY = command
3048
3061
 
3049
3062
 
3063
+ def _require_answer_from_argv(argv: "list[str]") -> None:
3064
+ """Arm the process guard before an affected command callback can return."""
3065
+ if any(token in ("--help", "-h", "--version") for token in argv):
3066
+ return
3067
+ for token in argv:
3068
+ if token in REQUIRED_ANSWER_COMMANDS:
3069
+ _require_answer_delivery(token)
3070
+ return
3071
+
3072
+
3050
3073
  def _analysis_failed(command: str, phase: str, exc: Exception) -> NoReturn:
3051
3074
  """Fail a costly command with evidence instead of an empty successful exit.
3052
3075
 
@@ -3134,7 +3157,7 @@ def _unkept_output_promise() -> "Optional[str]":
3134
3157
  the run wrote it by some route this module does not know about, and a
3135
3158
  discard sink was never a promise of a file.
3136
3159
  """
3137
- if _OUTPUT_DELIVERED or not _OUTPUT_PROMISED:
3160
+ if not _OUTPUT_PROMISED:
3138
3161
  return None
3139
3162
  try:
3140
3163
  from sourcecode.output_sink import is_null_device
@@ -3143,7 +3166,9 @@ def _unkept_output_promise() -> "Optional[str]":
3143
3166
  if is_null_device(path) or (path.is_file() and path.stat().st_size > 0):
3144
3167
  return None
3145
3168
  except Exception:
3146
- return None
3169
+ # A destination that cannot be inspected cannot prove delivery. This is
3170
+ # a release gate, so uncertainty fails closed with the promised path.
3171
+ return _OUTPUT_PROMISED
3147
3172
  return _OUTPUT_PROMISED
3148
3173
 
3149
3174
 
@@ -8377,6 +8402,11 @@ def prepare_context_cmd(
8377
8402
 
8378
8403
  # P0-1: Apply output budget per task — safety net for large repos.
8379
8404
  _pc_budget = _prepare_context_budget(task)
8405
+ out["output_budget"] = {
8406
+ "stdout_max_bytes": _pc_budget,
8407
+ "applies_to": "stdout only",
8408
+ "full_output": "Use --output <file> to retain the complete artifact.",
8409
+ }
8380
8410
 
8381
8411
  # Size-gated preview: on enterprise-scale monoliths free users get a capped
8382
8412
  # preview (top-5 / lightweight) + upgrade note. Small/mid repos get the full
@@ -12718,6 +12748,7 @@ def spring_audit_cmd(
12718
12748
  _phases_cut: list[str] = []
12719
12749
  # C3-79: families the budget stopped *inside*, with how far each got.
12720
12750
  _rules_partial: list[dict] = []
12751
+ _projection_stages_cut: list[str] = []
12721
12752
  if scope in ("all", "tx"):
12722
12753
  if _run.exhausted():
12723
12754
  _stopped_early = _WHY_BUDGET
@@ -12762,7 +12793,11 @@ def spring_audit_cmd(
12762
12793
  getattr(_sec_watch, "partially_run", []) or []
12763
12794
  )
12764
12795
  _rules_partial.extend(_partial_families)
12765
- if _cut or _partial_families:
12796
+ _stage_cut = list(
12797
+ getattr(_sec_watch, "stages_not_run", []) or []
12798
+ )
12799
+ _projection_stages_cut.extend(_stage_cut)
12800
+ if _cut or _partial_families or _stage_cut:
12766
12801
  _stopped_early = _WHY_BUDGET
12767
12802
  _phases_cut.append("security_audit")
12768
12803
  else:
@@ -12952,6 +12987,7 @@ def spring_audit_cmd(
12952
12987
  rules_partially_run=_rules_partial,
12953
12988
  rules_not_run=_rules_cut,
12954
12989
  phases_stopped_inside=_phases_cut,
12990
+ composition_walks_not_run=_projection_stages_cut,
12955
12991
  )
12956
12992
  # AUD-595-A03: the declaration said what did not run and never
12957
12993
  # what the process would do about it. Same rule as the exits
@@ -14729,6 +14765,7 @@ def migrate_apply_cmd(
14729
14765
  and worktree. The resulting worktree is retained for review; ASK never commits
14730
14766
  or merges the generated changes.
14731
14767
  """
14768
+ _require_answer_delivery("migrate-apply")
14732
14769
  from sourcecode.migrate_check import run_migrate_check
14733
14770
  from sourcecode.openrewrite_recipe import build_plan
14734
14771
  from sourcecode.repository_ir import find_java_files
@@ -21572,6 +21609,7 @@ def main_entry() -> None:
21572
21609
  # parser is about to read, so the guard at the end covers every command —
21573
21610
  # including one that returns before it reaches its emit seam.
21574
21611
  _record_output_promise(sys.argv[1:])
21612
+ _require_answer_from_argv(sys.argv[1:])
21575
21613
  # ASK-09: give the output ceiling a way to resolve the running command that
21576
21614
  # does not go through Click's thread-local context. Registered as a provider,
21577
21615
  # so the Typer→Click conversion is only paid by a run that is actually over
@@ -295,7 +295,10 @@ def _stable_projection(value: "Any", volatile: "frozenset[str]") -> "Any":
295
295
  return {
296
296
  key: _stable_projection(value[key], volatile)
297
297
  for key in sorted(value)
298
- if key not in volatile
298
+ # Execution producers consistently publish elapsed clocks as
299
+ # `*_time_ms`, including command-specific names that cannot be
300
+ # exhaustively catalogued. Match the convention at every depth.
301
+ if key not in volatile and not key.endswith("_time_ms")
299
302
  }
300
303
  if isinstance(value, (list, tuple)):
301
304
  return [_stable_projection(item, volatile) for item in value]
@@ -2618,6 +2618,15 @@ class MigrationReport:
2618
2618
  compact, "findings", top_n,
2619
2619
  key=lambda f: SEVERITY_ORDER.get(f.get("severity"), 3),
2620
2620
  )
2621
+ findings_cap = compact.get("findings_cap")
2622
+ if isinstance(findings_cap, dict):
2623
+ # `summary.total_findings` covers all detected findings, whereas the
2624
+ # display population may exclude advisory hygiene by default.
2625
+ # Publish both counts at the cap boundary so consumers need not
2626
+ # infer the relationship from a separate floor block.
2627
+ population_total = int(full.get("summary", {}).get("total_findings", 0))
2628
+ findings_cap["population_total"] = population_total
2629
+ findings_cap["excluded_before_cap"] = population_total - findings_cap["total"]
2621
2630
  # Keep invariant rule prose once; each finding carries only location and
2622
2631
  # rule identity. Full prose remains available in the non-compact report.
2623
2632
  _rule_catalog: dict[str, dict] = {}
@@ -104,6 +104,9 @@ class RulePassProgress:
104
104
  #: Families the budget cut *in flight*, with how far each one reached (C3-79).
105
105
  #: A family in here is in neither of the two lists above, and deliberately so.
106
106
  partially_run: "list[dict]" = field(default_factory=list)
107
+ #: Non-rule projection stages omitted after the deadline. Separate from rule
108
+ #: ids so coverage arithmetic never treats a projection as a rule family.
109
+ stages_not_run: "list[str]" = field(default_factory=list)
107
110
  #: How often `tick` reads the clock: once per this many units. A budget is a
108
111
  #: wall-clock bound, not a per-file one, and reading the clock 3 342 times to
109
112
  #: honour a 420-second deadline is cost with no resolution to show for it.
@@ -124,6 +127,12 @@ class RulePassProgress:
124
127
  if rule_id not in self.not_run:
125
128
  self.not_run.append(rule_id)
126
129
 
130
+ def record_stages_not_run(self, stages: "list[str]") -> None:
131
+ """Publish post-rule work skipped after the same deadline."""
132
+ for stage in stages:
133
+ if stage not in self.stages_not_run:
134
+ self.stages_not_run.append(stage)
135
+
127
136
  def step(self, label: str) -> None:
128
137
  """Announce an uncounted stage inside the pass.
129
138
 
@@ -819,6 +819,7 @@ def infer_security_posture(
819
819
  root: Optional[Path] = None,
820
820
  coverage_threshold: float = _DEFAULT_COVERAGE,
821
821
  filter_surface: Optional[Any] = None,
822
+ stop_when: Optional[Any] = None,
822
823
  ) -> SecurityPostureResult:
823
824
  """Infer the repo's endpoint security posture (P1-A).
824
825
 
@@ -849,7 +850,9 @@ def infer_security_posture(
849
850
  str(root) if root is not None else None,
850
851
  coverage_threshold,
851
852
  )
852
- _memoizable = filter_surface is None and _memo_key[0]
853
+ # A deadline-bound projection can be partial and is run-specific. It must
854
+ # never be served or retained as a complete posture in a later invocation.
855
+ _memoizable = filter_surface is None and _memo_key[0] and stop_when is None
853
856
  if _memoizable and _memo_key in _POSTURE_MEMO:
854
857
  return _POSTURE_MEMO[_memo_key]
855
858
 
@@ -919,6 +922,14 @@ def infer_security_posture(
919
922
  except Exception:
920
923
  degraded_identity = []
921
924
 
925
+ def _budget_spent() -> bool:
926
+ if stop_when is None:
927
+ return False
928
+ try:
929
+ return bool(stop_when())
930
+ except Exception:
931
+ return False
932
+
922
933
  # (4) per-endpoint classification
923
934
  handler_ann = _handler_annotation_index(cir)
924
935
  verdicts: list[dict] = []
@@ -934,7 +945,13 @@ def infer_security_posture(
934
945
  n_gated = 0 # carries the detected custom gate
935
946
  n_standard_only = 0 # no custom gate, but a standard guard of its own
936
947
 
937
- for ep in cir.endpoints:
948
+ _budget_cut = _budget_spent()
949
+ for _endpoint_index, ep in enumerate(cir.endpoints, start=1):
950
+ if _budget_cut or (
951
+ _endpoint_index % 64 == 0 and _budget_spent()
952
+ ):
953
+ _budget_cut = True
954
+ break
938
955
  policy = ep.security.policy if ep.security is not None else "none_detected"
939
956
  anns = handler_ann.get(ep.handler_symbol, set())
940
957
  carries_gate = bool(anns & admitted_gate_names)
@@ -1021,11 +1038,20 @@ def infer_security_posture(
1021
1038
  "This surface assumes the profile set it was run under — "
1022
1039
  + _profile_remedy.sentence(),
1023
1040
  ]
1041
+ if _budget_cut:
1042
+ population = dict(population)
1043
+ population["endpoints_evaluated"] = len(verdicts)
1044
+ population["analysis_complete"] = False
1045
+ limitations.append(
1046
+ "PARTIAL: the analysis budget stopped endpoint security-posture "
1047
+ f"classification after {len(verdicts)} of {len(cir.endpoints)} "
1048
+ "endpoints. Unlisted endpoints are unmeasured, never unprotected."
1049
+ )
1024
1050
  operational_hints: list[str] = []
1025
1051
  _how_to_run = _profile_remedy.to_dict(root).get("how_to_run_here")
1026
1052
  if isinstance(_how_to_run, str) and _how_to_run:
1027
1053
  operational_hints.append(_how_to_run)
1028
- if has_custom_gate:
1054
+ if has_custom_gate and not _budget_cut:
1029
1055
  limitations.append(
1030
1056
  "A custom authorization mechanism was inferred — endpoints not carrying "
1031
1057
  "it are reported 'coverage_unknown', never 'unsecured'."
@@ -1046,7 +1072,7 @@ def infer_security_posture(
1046
1072
  # a centralized filter (if present) MAY still cover them — its per-URL patterns are
1047
1073
  # not reconstructed in this increment, so the verdict is review, never "unsecured".
1048
1074
  gate_coverage: Optional[dict] = None
1049
- if has_custom_gate:
1075
+ if has_custom_gate and not _budget_cut:
1050
1076
  # Reconstruct declarative servlet filter patterns (extractor; best-effort) and
1051
1077
  # cross each escaping handler against them. A match => the handler MAY be filter-
1052
1078
  # covered (still review — pattern presence is not proof of enforcement); no match
@@ -954,6 +954,25 @@ def run_selftest(
954
954
  counts = {status: 0 for status in (PASS, FAIL, NOT_APPLICABLE, ERROR)}
955
955
  for result in results:
956
956
  counts[result["status"]] = counts.get(result["status"], 0) + 1
957
+ limitations: list[dict[str, Any]] = []
958
+ if counts[ERROR]:
959
+ limitations.append({
960
+ "id": "selftest_rows_not_run",
961
+ "reason": f"{counts[ERROR]} ledger row(s) could not run",
962
+ "count": counts[ERROR],
963
+ })
964
+ if counts[FAIL]:
965
+ limitations.append({
966
+ "id": "selftest_rows_failed",
967
+ "reason": f"{counts[FAIL]} ledger assertion(s) did not hold",
968
+ "count": counts[FAIL],
969
+ })
970
+ if unknown:
971
+ limitations.append({
972
+ "id": "selftest_unknown_rows",
973
+ "reason": "requested ledger rows do not exist",
974
+ "rows": unknown,
975
+ })
957
976
  return {
958
977
  "schema_version": SCHEMA_VERSION,
959
978
  "subject": subject.as_payload(),
@@ -963,6 +982,7 @@ def run_selftest(
963
982
  **counts,
964
983
  "unknown_rows": unknown,
965
984
  },
985
+ **({"limitations": limitations} if limitations else {}),
966
986
  "basis": (
967
987
  "Each row is the acceptance criterion its ledger entry publishes, run "
968
988
  "against this repository through the entry point named above. A row "