sourcecode 5.9.28__tar.gz → 5.9.29__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 (474) hide show
  1. {sourcecode-5.9.28 → sourcecode-5.9.29}/CHANGELOG.md +77 -0
  2. {sourcecode-5.9.28 → sourcecode-5.9.29}/PKG-INFO +3 -3
  3. {sourcecode-5.9.28 → sourcecode-5.9.29}/README.md +2 -2
  4. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/AUDIT-2026-09-01-EXTERNAL-5.9.22.md +2 -2
  5. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/AUDIT-2026-09-02-ALTERNATIVE-5.9.27.md +3 -3
  6. sourcecode-5.9.29/docs/AUDIT-2026-09-02-ALTERNATIVE-5.9.28.md +174 -0
  7. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/DEFECT-LEDGER.md +104 -0
  8. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/DEVELOPMENT-ROADMAP.md +72 -0
  9. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/EXECUTIVE-ROADMAP.md +63 -0
  10. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/USER_GUIDE.md +1 -1
  11. {sourcecode-5.9.28 → sourcecode-5.9.29}/pyproject.toml +1 -1
  12. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/__init__.py +1 -1
  13. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/audit_recipe.py +6 -0
  14. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/cli.py +78 -3
  15. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/concurrency.py +37 -6
  16. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/dependency_analyzer.py +25 -0
  17. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/empty_answer_diagnostics.py +11 -0
  18. sourcecode-5.9.29/src/sourcecode/inflight.py +287 -0
  19. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/manifest_cache.py +11 -9
  20. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/progress.py +34 -0
  21. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/risk.py +99 -19
  22. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/rule_pass.py +18 -0
  23. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/spring_findings.py +8 -0
  24. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/spring_security_audit.py +15 -2
  25. {sourcecode-5.9.28 → sourcecode-5.9.29}/.github/workflows/build-windows.yml +0 -0
  26. {sourcecode-5.9.28 → sourcecode-5.9.29}/.github/workflows/perf-gate.yml +0 -0
  27. {sourcecode-5.9.28 → sourcecode-5.9.29}/.github/workflows/windows-battery.yml +0 -0
  28. {sourcecode-5.9.28 → sourcecode-5.9.29}/.github/workflows/windows-regression.yml +0 -0
  29. {sourcecode-5.9.28 → sourcecode-5.9.29}/.gitignore +0 -0
  30. {sourcecode-5.9.28 → sourcecode-5.9.29}/.ruff.toml +0 -0
  31. {sourcecode-5.9.28 → sourcecode-5.9.29}/CLAUDE.md +0 -0
  32. {sourcecode-5.9.28 → sourcecode-5.9.29}/CODE_OF_CONDUCT.md +0 -0
  33. {sourcecode-5.9.28 → sourcecode-5.9.29}/CONTRIBUTING.md +0 -0
  34. {sourcecode-5.9.28 → sourcecode-5.9.29}/LICENSE +0 -0
  35. {sourcecode-5.9.28 → sourcecode-5.9.29}/NOTICE +0 -0
  36. {sourcecode-5.9.28 → sourcecode-5.9.29}/SECURITY.md +0 -0
  37. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/AUDIT-2026-08-22-5.8.22.md +0 -0
  38. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/AUDIT-2026-08-23-5.8.24.md +0 -0
  39. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/AUDIT-2026-08-23-COMMERCIAL.md +0 -0
  40. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/AUDIT-2026-08-23-CORPUS-AMPLIADO.md +0 -0
  41. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/AUDIT-2026-08-23-EXTERNAL-5.8.25.md +0 -0
  42. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/AUDIT-2026-08-23-EXTERNAL-5.8.26.md +0 -0
  43. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/AUDIT-2026-08-23-THINGSBOARD-FINDINGS.md +0 -0
  44. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/AUDIT-2026-08-26-EXTERNAL-5.8.26.md +0 -0
  45. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/AUDIT-2026-08-26-EXTERNAL-5.8.27.md +0 -0
  46. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/AUDIT-2026-08-26-EXTERNAL-5.8.28-PACK.md +0 -0
  47. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/AUDIT-2026-08-26-EXTERNAL-5.8.28.md +0 -0
  48. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/AUDIT-2026-08-26-EXTERNAL-5.8.31.md +0 -0
  49. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/AUDIT-2026-08-26-EXTERNAL-5.8.32.md +0 -0
  50. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/AUDIT-2026-08-26-EXTERNAL-5.9.0.md +0 -0
  51. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/AUDIT-2026-08-26-MONETIZATION.md +0 -0
  52. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/AUDIT-2026-08-27-EXTERNAL-5.9.2.md +0 -0
  53. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/AUDIT-2026-08-27-EXTERNAL-5.9.3.md +0 -0
  54. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/AUDIT-2026-08-28-EXTERNAL-5.9.10.md +0 -0
  55. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/AUDIT-2026-08-31-EXTERNAL-5.9.16.md +0 -0
  56. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/AUDIT-2026-08-31-EXTERNAL-5.9.17.md +0 -0
  57. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/AUDIT-2026-08-31-REMEDIATION-5.9.18.md +0 -0
  58. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/AUDIT-2026-09-01-ALTERNATIVE-5.9.23.md +0 -0
  59. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/AUDIT-2026-09-01-EXTERNAL-5.9.23.md +0 -0
  60. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/AUDIT-2026-09-02-ALTERNATIVE-5.9.25.md +0 -0
  61. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/AUDIT-2026-09-02-EXTERNAL-5.9.25.md +0 -0
  62. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/AUDIT-2026-09-02-EXTERNAL-5.9.26.md +0 -0
  63. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/AUDIT-TESTING-CORPUS-2026-08-22.md +0 -0
  64. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/CACHE.md +0 -0
  65. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/COMMERCIAL-OFFER.md +0 -0
  66. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/CUSTOMER-VALIDATION.md +0 -0
  67. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/DEMO-5MIN.md +0 -0
  68. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/DOCUMENTATION-HYGIENE-2026-08-23.md +0 -0
  69. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/EXECUTION-PLAN-12MO.md +0 -0
  70. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/MANUAL-USUARIO.md +0 -0
  71. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/MODERNIZATION.md +0 -0
  72. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/PRODUCT-ROUTE.md +0 -0
  73. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/PRODUCT_AUDIT.md +0 -0
  74. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/PRODUCT_IDENTITY.md +0 -0
  75. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/PRODUCT_TIERS.md +0 -0
  76. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/RC1-CHECKLIST.md +0 -0
  77. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/RD-JVM-ASK-TRIAGE-2026-08-31.md +0 -0
  78. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/RELEASE-CHECKLIST.md +0 -0
  79. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/RELEASE-VERIFICATION.md +0 -0
  80. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/STRATEGY-2026-08-26-AGENT-CONTEXT.md +0 -0
  81. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/architecture/CATALOG-retrieval-intents.md +0 -0
  82. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/architecture/DESIGN-assessment-deployment-evidence.md +0 -0
  83. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/architecture/DESIGN-assessment-report.md +0 -0
  84. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/architecture/DESIGN-build-closure-provenance.md +0 -0
  85. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/architecture/DESIGN-knowledge-provider-integration.md +0 -0
  86. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/architecture/DESIGN-p5.3b-statement-surface.md +0 -0
  87. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/architecture/DESIGN-p5.5-span-index.md +0 -0
  88. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/architecture/DESIGN-p6-semantic-impact-engine.md +0 -0
  89. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/architecture/DESIGN-p6-semantic-integration-engine.md +0 -0
  90. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/architecture/DESIGN-p7-semantic-services.md +0 -0
  91. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/architecture/DESIGN-pack-gate-ci.md +0 -0
  92. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/architecture/DESIGN-pack-manifest.md +0 -0
  93. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/architecture/DESIGN-pack-mcp-api.md +0 -0
  94. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/architecture/DESIGN-robustness-security-inference.md +0 -0
  95. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/architecture/DESIGN-semantic-retrieval.md +0 -0
  96. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/architecture/EPV-p6-class-typeref.md +0 -0
  97. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/architecture/REPORT-p6-flow-analyzer-comparison.md +0 -0
  98. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/architecture/REPORT-p6-integration-detector-comparison.md +0 -0
  99. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/architecture/REPORT-p8-flow-analyzer-migration.md +0 -0
  100. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/architecture/REPORT-p9-integration-detector-migration.md +0 -0
  101. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/architecture/adr/0001-semantic-ir.md +0 -0
  102. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/architecture/adr/0002-source-evidence-boundary.md +0 -0
  103. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/architecture/adr/0003-architectural-characterization.md +0 -0
  104. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/architecture/adr/0004-semantic-retrieval.md +0 -0
  105. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/architecture/adr/0005-evidence-reconciliation.md +0 -0
  106. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/architecture/adr/0006-performance-harness.md +0 -0
  107. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/architecture/adr/0007-composition-semantics.md +0 -0
  108. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/architecture/adr/0008-answer-coherence.md +0 -0
  109. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/architecture/consumer-disposition-inventory.md +0 -0
  110. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/architecture/overview.md +0 -0
  111. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/architecture/product-architecture-review.md +0 -0
  112. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/architecture/product-strategy-layering.md +0 -0
  113. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/architecture/semantic-ir-consumer-matrix.md +0 -0
  114. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/architecture/semantic-ir-roadmap.md +0 -0
  115. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/baseline-ci.yml +0 -0
  116. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/commercial-pipeline-audit.md +0 -0
  117. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/contracts-ci.yml +0 -0
  118. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/contracts.md +0 -0
  119. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/eval/2026-06-15-petclinic-rest-issue11-vets-pagination.md +0 -0
  120. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/eval/2026-06-15-petclinic-rest-issue147-validation.md +0 -0
  121. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/eval/2026-06-15-petclinic-rest-workflow.md +0 -0
  122. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/eval/2026-06-15-phase18-openapi-surface.md +0 -0
  123. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/eval/2026-06-15-phase20-validation-surface.md +0 -0
  124. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/eval/2026-06-16-broadleaf-checkout-impact-fieldtest.md +0 -0
  125. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/eval/2026-06-16-petclinic-rest-issue11-weakness2-closed.md +0 -0
  126. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/eval/2026-06-16-spring-petclinic-issue2333-dead-vets.md +0 -0
  127. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/licensing-schema.md +0 -0
  128. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/migrate-check.md +0 -0
  129. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/pack-gate-github-actions.yml +0 -0
  130. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/pack-gate-gitlab.yml +0 -0
  131. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/perf/README.md +0 -0
  132. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/perf/REGRESSION-GATE.md +0 -0
  133. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/perf/baselines/2.5.15/SUMMARY.md +0 -0
  134. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/perf/baselines/2.5.15/alfresco__ask__cold.json +0 -0
  135. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/perf/baselines/2.5.15/alfresco__ask__warm.json +0 -0
  136. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/perf/baselines/2.5.15/broadleaf__ask__cold.json +0 -0
  137. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/perf/baselines/2.5.15/broadleaf__ask__warm.json +0 -0
  138. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/perf/baselines/2.5.15/eureka__ask__cold.json +0 -0
  139. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/perf/baselines/2.5.15/eureka__ask__warm.json +0 -0
  140. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/perf/baselines/2.5.15/jenkins__ask__cold.json +0 -0
  141. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/perf/baselines/2.5.15/jenkins__ask__warm.json +0 -0
  142. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/perf/baselines/2.5.15/jobrunr__ask__cold.json +0 -0
  143. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/perf/baselines/2.5.15/jobrunr__ask__warm.json +0 -0
  144. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/perf/baselines/2.5.15/keycloak__ask__cold.json +0 -0
  145. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/perf/baselines/2.5.15/keycloak__ask__warm.json +0 -0
  146. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/perf/baselines/2.5.15/neo4j__ask__cold.json +0 -0
  147. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/perf/baselines/2.5.15/neo4j__ask__warm.json +0 -0
  148. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/perf/baselines/2.5.15/ofbiz__ask__cold.json +0 -0
  149. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/perf/baselines/2.5.15/ofbiz__ask__warm.json +0 -0
  150. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/perf/baselines/2.5.15/openmrs__ask__cold.json +0 -0
  151. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/perf/baselines/2.5.15/openmrs__ask__warm.json +0 -0
  152. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/perf/baselines/2.5.15/petclinic__ask__cold.json +0 -0
  153. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/perf/baselines/2.5.15/petclinic__ask__warm.json +0 -0
  154. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/perf/baselines/2.5.16/SUMMARY.md +0 -0
  155. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/perf/baselines/2.5.16/alfresco__ask__cold.json +0 -0
  156. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/perf/baselines/2.5.16/alfresco__ask__warm.json +0 -0
  157. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/perf/baselines/2.5.16/broadleaf__ask__cold.json +0 -0
  158. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/perf/baselines/2.5.16/broadleaf__ask__warm.json +0 -0
  159. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/perf/baselines/2.5.16/eureka__ask__cold.json +0 -0
  160. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/perf/baselines/2.5.16/eureka__ask__warm.json +0 -0
  161. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/perf/baselines/2.5.16/jenkins__ask__cold.json +0 -0
  162. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/perf/baselines/2.5.16/jenkins__ask__warm.json +0 -0
  163. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/perf/baselines/2.5.16/jobrunr__ask__cold.json +0 -0
  164. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/perf/baselines/2.5.16/jobrunr__ask__warm.json +0 -0
  165. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/perf/baselines/2.5.16/keycloak__ask__cold.json +0 -0
  166. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/perf/baselines/2.5.16/keycloak__ask__warm.json +0 -0
  167. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/perf/baselines/2.5.16/neo4j__ask__cold.json +0 -0
  168. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/perf/baselines/2.5.16/neo4j__ask__warm.json +0 -0
  169. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/perf/baselines/2.5.16/ofbiz__ask__cold.json +0 -0
  170. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/perf/baselines/2.5.16/ofbiz__ask__warm.json +0 -0
  171. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/perf/baselines/2.5.16/openmrs__ask__cold.json +0 -0
  172. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/perf/baselines/2.5.16/openmrs__ask__warm.json +0 -0
  173. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/perf/baselines/2.5.16/petclinic__ask__cold.json +0 -0
  174. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/perf/baselines/2.5.16/petclinic__ask__warm.json +0 -0
  175. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/perf/baselines/5.9.22/petclinic__ask__cold.json +0 -0
  176. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/perf/baselines/5.9.22/petclinic__ask__warm.json +0 -0
  177. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/perf/baselines/gate-latest/README.md +0 -0
  178. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/perf/baselines/gate-latest/broadleaf__ask__warm.json +0 -0
  179. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/perf/baselines/gate-latest/broadleaf__endpoints__warm.json +0 -0
  180. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/perf/baselines/gate-latest/broadleaf__migrate-check__warm.json +0 -0
  181. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/perf/baselines/gate-latest/broadleaf__posture__warm.json +0 -0
  182. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/perf/baselines/gate-latest/broadleaf__spring-audit__warm.json +0 -0
  183. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/perf/baselines/gate-latest/broadleaf__validation__warm.json +0 -0
  184. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/perf/baselines/reference-best/README.md +0 -0
  185. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/perf/corpus-testing-2026-08-22.md +0 -0
  186. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/posture.md +0 -0
  187. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/privacy.md +0 -0
  188. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/pro-experience-audit.md +0 -0
  189. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/schema.md +0 -0
  190. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/spec/envelope-v1.md +0 -0
  191. {sourcecode-5.9.28 → sourcecode-5.9.29}/docs/spring-audit-ci.yml +0 -0
  192. {sourcecode-5.9.28 → sourcecode-5.9.29}/hatch_build.py +0 -0
  193. {sourcecode-5.9.28 → sourcecode-5.9.29}/scripts/compare_integration_engines.py +0 -0
  194. {sourcecode-5.9.28 → sourcecode-5.9.29}/scripts/context_cost_harness.py +0 -0
  195. {sourcecode-5.9.28 → sourcecode-5.9.29}/scripts/customer_smoke_test.sh +0 -0
  196. {sourcecode-5.9.28 → sourcecode-5.9.29}/scripts/generate_jdk_exports.py +0 -0
  197. {sourcecode-5.9.28 → sourcecode-5.9.29}/scripts/perf_gate.py +0 -0
  198. {sourcecode-5.9.28 → sourcecode-5.9.29}/scripts/perf_harness.py +0 -0
  199. {sourcecode-5.9.28 → sourcecode-5.9.29}/scripts/sync_gate_anchors.py +0 -0
  200. {sourcecode-5.9.28 → sourcecode-5.9.29}/scripts/test_fast.sh +0 -0
  201. {sourcecode-5.9.28 → sourcecode-5.9.29}/scripts/windows_reliability_matrix.py +0 -0
  202. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/__main__.py +0 -0
  203. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/access_drift.py +0 -0
  204. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/adaptive_scanner.py +0 -0
  205. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/analysis_budget.py +0 -0
  206. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/answer_bounds.py +0 -0
  207. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/archetype.py +0 -0
  208. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/architectural_baseline.py +0 -0
  209. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/architectural_delta.py +0 -0
  210. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/architecture_analyzer.py +0 -0
  211. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/architecture_summary.py +0 -0
  212. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/ast_extractor.py +0 -0
  213. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/audit_clusters.py +0 -0
  214. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/audit_report.py +0 -0
  215. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/audit_since.py +0 -0
  216. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/audit_verify.py +0 -0
  217. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/baseline_attestation.py +0 -0
  218. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/baseline_autocapture.py +0 -0
  219. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/breaking_changes.py +0 -0
  220. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/build_modules.py +0 -0
  221. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/build_stamp.py +0 -0
  222. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/bundled_docs.py +0 -0
  223. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/c4_render.py +0 -0
  224. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/cache.py +0 -0
  225. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/cache_model.py +0 -0
  226. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/cache_observation.py +0 -0
  227. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/call_surface.py +0 -0
  228. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/caller_metrics.py +0 -0
  229. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/caller_reach.py +0 -0
  230. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/canonical_ir.py +0 -0
  231. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/chain_rules.py +0 -0
  232. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/change_plan.py +0 -0
  233. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/ci_output.py +0 -0
  234. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/cir_graphs.py +0 -0
  235. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/classifier.py +0 -0
  236. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/click_runtime.py +0 -0
  237. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/client_calls.py +0 -0
  238. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/code_notes_analyzer.py +0 -0
  239. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/compare.py +0 -0
  240. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/confidence_analyzer.py +0 -0
  241. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/constraint_diff.py +0 -0
  242. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/consumer_join.py +0 -0
  243. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/container_wiring.py +0 -0
  244. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/context_cache.py +0 -0
  245. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/context_graph.py +0 -0
  246. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/context_scorer.py +0 -0
  247. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/context_summarizer.py +0 -0
  248. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/contract_diff.py +0 -0
  249. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/contract_init.py +0 -0
  250. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/contract_model.py +0 -0
  251. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/contract_pipeline.py +0 -0
  252. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/coverage_parser.py +0 -0
  253. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/cve_feed.py +0 -0
  254. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/cve_reachability.py +0 -0
  255. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/data_exposure.py +0 -0
  256. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/data_labels.py +0 -0
  257. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/declarations.py +0 -0
  258. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/defect_classes/__init__.py +0 -0
  259. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/defect_classes/registry.json +0 -0
  260. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/defect_identity.py +0 -0
  261. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/degradation.py +0 -0
  262. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/deployment_prefix.py +0 -0
  263. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/detach.py +0 -0
  264. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/detectors/__init__.py +0 -0
  265. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/detectors/base.py +0 -0
  266. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/detectors/csproj_parser.py +0 -0
  267. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/detectors/dart.py +0 -0
  268. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/detectors/dotnet.py +0 -0
  269. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/detectors/elixir.py +0 -0
  270. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/detectors/go.py +0 -0
  271. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/detectors/heuristic.py +0 -0
  272. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/detectors/hybrid.py +0 -0
  273. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/detectors/java.py +0 -0
  274. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/detectors/jvm_ext.py +0 -0
  275. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/detectors/nodejs.py +0 -0
  276. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/detectors/parsers.py +0 -0
  277. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/detectors/php.py +0 -0
  278. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/detectors/project.py +0 -0
  279. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/detectors/python.py +0 -0
  280. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/detectors/ruby.py +0 -0
  281. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/detectors/rust.py +0 -0
  282. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/detectors/systems.py +0 -0
  283. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/detectors/terraform.py +0 -0
  284. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/detectors/tooling.py +0 -0
  285. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/doc_analyzer.py +0 -0
  286. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/dynamic_argument_surface.py +0 -0
  287. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/empty_reach.py +0 -0
  288. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/endpoint_disposition.py +0 -0
  289. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/endpoint_literals.py +0 -0
  290. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/endpoint_metrics.py +0 -0
  291. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/entrypoint_classifier.py +0 -0
  292. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/env_analyzer.py +0 -0
  293. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/envelope.py +0 -0
  294. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/environment_resolution.py +0 -0
  295. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/error_schema.py +0 -0
  296. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/evidence_provider.py +0 -0
  297. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/execution_plan.py +0 -0
  298. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/explain.py +0 -0
  299. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/explain_endpoint.py +0 -0
  300. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/facts/__init__.py +0 -0
  301. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/facts/registry.json +0 -0
  302. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/field_deprecations.py +0 -0
  303. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/file_chunker.py +0 -0
  304. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/file_classifier.py +0 -0
  305. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/filter_surface.py +0 -0
  306. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/findings_baseline.py +0 -0
  307. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/format_contract.py +0 -0
  308. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/fqn_utils.py +0 -0
  309. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/functional_routes.py +0 -0
  310. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/gate_anchors.py +0 -0
  311. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/git_analyzer.py +0 -0
  312. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/git_checkout.py +0 -0
  313. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/github_diff.py +0 -0
  314. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/graph_analyzer.py +0 -0
  315. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/graph_evidence.py +0 -0
  316. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/hibernate_strat.py +0 -0
  317. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/identity_fallback.py +0 -0
  318. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/integration_coordinates.py +0 -0
  319. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/intent_router.py +0 -0
  320. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/jdk_exports.py +0 -0
  321. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/jvm_inventory.py +0 -0
  322. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/license.py +0 -0
  323. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/mcp/__init__.py +0 -0
  324. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/mcp/dependency_import.py +0 -0
  325. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/mcp/onboarding/__init__.py +0 -0
  326. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/mcp/onboarding/applier.py +0 -0
  327. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/mcp/onboarding/backup.py +0 -0
  328. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/mcp/onboarding/detector.py +0 -0
  329. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/mcp/onboarding/planner.py +0 -0
  330. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/mcp/orchestrator.py +0 -0
  331. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/mcp/registry.py +0 -0
  332. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/mcp/runner.py +0 -0
  333. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/mcp/server.py +0 -0
  334. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/mcp_nudge.py +0 -0
  335. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/metrics_analyzer.py +0 -0
  336. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/migrate_check.py +0 -0
  337. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/migration_apply.py +0 -0
  338. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/migration_blast.py +0 -0
  339. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/non_coverage.py +0 -0
  340. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/openapi_surface.py +0 -0
  341. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/openrewrite_recipe.py +0 -0
  342. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/output_bounds.py +0 -0
  343. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/output_budget.py +0 -0
  344. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/output_ceiling.py +0 -0
  345. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/output_encoding.py +0 -0
  346. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/output_sink.py +0 -0
  347. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/pack_manifest.py +0 -0
  348. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/packs.py +0 -0
  349. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/parallel.py +0 -0
  350. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/parse_cache.py +0 -0
  351. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/partial_contract.py +0 -0
  352. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/path_admission.py +0 -0
  353. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/path_display.py +0 -0
  354. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/path_filters.py +0 -0
  355. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/perf.py +0 -0
  356. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/phased_run.py +0 -0
  357. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/pipe_contract.py +0 -0
  358. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/posture.py +0 -0
  359. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/pr_comment_renderer.py +0 -0
  360. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/pr_impact.py +0 -0
  361. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/pr_risk.py +0 -0
  362. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/prepare_context.py +0 -0
  363. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/product_info.py +0 -0
  364. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/provenance.py +0 -0
  365. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/ranking_engine.py +0 -0
  366. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/readiness_timeline.py +0 -0
  367. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/readonly.py +0 -0
  368. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/reconciliation.py +0 -0
  369. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/redactor.py +0 -0
  370. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/reference_facts.py +0 -0
  371. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/regress.py +0 -0
  372. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/regulatory_pack.py +0 -0
  373. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/release_info.py +0 -0
  374. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/relevance_scorer.py +0 -0
  375. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/remediation_diff.py +0 -0
  376. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/remediation_flow.py +0 -0
  377. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/remediation_report.py +0 -0
  378. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/remedies.py +0 -0
  379. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/rename_refactor.py +0 -0
  380. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/repo_classifier.py +0 -0
  381. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/repository_ir.py +0 -0
  382. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/resource_budget.py +0 -0
  383. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/retrieval/__init__.py +0 -0
  384. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/retrieval/context.py +0 -0
  385. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/retrieval/errors.py +0 -0
  386. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/retrieval/executor.py +0 -0
  387. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/retrieval/planner.py +0 -0
  388. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/retrieval/query.py +0 -0
  389. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/retrieval/request.py +0 -0
  390. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/retrieval/resolution.py +0 -0
  391. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/retrieval/result.py +0 -0
  392. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/retrieval/retriever.py +0 -0
  393. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/retrieval/runtime.py +0 -0
  394. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/retrieval/steps.py +0 -0
  395. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/retrieval/steps_endpoint.py +0 -0
  396. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/retrieval/steps_graph.py +0 -0
  397. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/retrieval/steps_impact.py +0 -0
  398. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/retrieval/steps_intf.py +0 -0
  399. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/retrieval/steps_struct.py +0 -0
  400. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/retrieval/steps_txsec.py +0 -0
  401. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/ris.py +0 -0
  402. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/risk_model.py +0 -0
  403. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/rule_catalog.py +0 -0
  404. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/runs.py +0 -0
  405. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/runtime_classifier.py +0 -0
  406. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/sarif.py +0 -0
  407. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/sarif_emit.py +0 -0
  408. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/scanner.py +0 -0
  409. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/schema.py +0 -0
  410. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/schema_producers.py +0 -0
  411. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/schema_registry.py +0 -0
  412. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/schemas/core-analysis-v1.schema.json +0 -0
  413. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/schemas/cve-reachability-v1.schema.json +0 -0
  414. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/schemas/endpoints-v1.schema.json +0 -0
  415. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/schemas/envelope-v1.schema.json +0 -0
  416. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/schemas/pr-impact-v1.schema.json +0 -0
  417. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/schemas/verify-edit-v1.schema.json +0 -0
  418. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/schemas/verify-v1.schema.json +0 -0
  419. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/security_chain.py +0 -0
  420. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/security_config.py +0 -0
  421. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/security_config_scan.py +0 -0
  422. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/security_posture.py +0 -0
  423. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/selection_contract.py +0 -0
  424. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/self_audit.py +0 -0
  425. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/selftest.py +0 -0
  426. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/semantic_analyzer.py +0 -0
  427. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/semantic_impact_engine.py +0 -0
  428. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/semantic_integration_engine.py +0 -0
  429. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/semantic_services.py +0 -0
  430. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/serializer.py +0 -0
  431. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/servlet_surface.py +0 -0
  432. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/source_text.py +0 -0
  433. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/spring_event_topology.py +0 -0
  434. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/spring_impact.py +0 -0
  435. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/spring_model.py +0 -0
  436. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/spring_profiles.py +0 -0
  437. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/spring_properties.py +0 -0
  438. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/spring_semantic.py +0 -0
  439. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/spring_tx_analyzer.py +0 -0
  440. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/sql_taint.py +0 -0
  441. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/summarizer.py +0 -0
  442. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/target_admission.py +0 -0
  443. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/telemetry/__init__.py +0 -0
  444. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/telemetry/config.py +0 -0
  445. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/telemetry/consent.py +0 -0
  446. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/telemetry/events.py +0 -0
  447. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/telemetry/filters.py +0 -0
  448. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/telemetry/transport.py +0 -0
  449. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/test_gap_ranking.py +0 -0
  450. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/test_sources.py +0 -0
  451. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/text_input.py +0 -0
  452. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/timeline.py +0 -0
  453. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/timeline_cache.py +0 -0
  454. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/token_estimate.py +0 -0
  455. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/tree_utils.py +0 -0
  456. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/type_usage_surface.py +0 -0
  457. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/validation_inference.py +0 -0
  458. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/validation_surface.py +0 -0
  459. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/verify_edit.py +0 -0
  460. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/verify_repo.py +0 -0
  461. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/verify_rules.py +0 -0
  462. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/version_check.py +0 -0
  463. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/vex.py +0 -0
  464. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/waivers.py +0 -0
  465. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/watch_loop.py +0 -0
  466. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/wired_surface.py +0 -0
  467. {sourcecode-5.9.28 → sourcecode-5.9.29}/src/sourcecode/workspace.py +0 -0
  468. {sourcecode-5.9.28 → sourcecode-5.9.29}/supabase/functions/README.md +0 -0
  469. {sourcecode-5.9.28 → sourcecode-5.9.29}/supabase/functions/get-license/index.ts +0 -0
  470. {sourcecode-5.9.28 → sourcecode-5.9.29}/supabase/functions/lemonsqueezy-webhook/index.ts +0 -0
  471. {sourcecode-5.9.28 → sourcecode-5.9.29}/supabase/functions/telemetry/index.ts +0 -0
  472. {sourcecode-5.9.28 → sourcecode-5.9.29}/supabase/sql/license_event_ordering.sql +0 -0
  473. {sourcecode-5.9.28 → sourcecode-5.9.29}/supabase/sql/licensing_schema.sql +0 -0
  474. {sourcecode-5.9.28 → sourcecode-5.9.29}/supabase/sql/telemetry_events.sql +0 -0
@@ -1,5 +1,82 @@
1
1
  # Changelog
2
2
 
3
+ ## [5.9.29] — 2026-09-02
4
+
5
+ *The 5.9.28 field round's two P0s and its P1, plus the suite's first green run
6
+ in several releases. Where 5.9.28 answered a question about the worker pool,
7
+ this release answers the one about where a run stops when it stops.*
8
+
9
+ ### Added
10
+
11
+ - **An in-flight marker for runs that never finish (`R-01-INFLIGHT`).** The
12
+ field measured four `spring-audit` hangs and could say nothing about any of
13
+ them: every diagnostic this product had — the envelope, the forensic sidecar
14
+ — lives on a path a hung run never reaches. A marker is now written when a
15
+ hang-prone command starts, rewritten at each phase and stage change the
16
+ heartbeat already reports, and deleted on the way out. A run killed
17
+ externally leaves `inflight/<pid>.json` naming its argv, its start time, the
18
+ phase and the stage it stopped in. Abandoned markers are published by a
19
+ later run in `_meta.incomplete_runs`, because the run that stops cannot
20
+ report anything itself; each row states whether it is a measurement (the
21
+ process is gone) or an inference (no refresh, on a platform that cannot
22
+ probe liveness safely). Covers the audit family plus `onboard` and
23
+ `remediate`, the two commands the field reports hanging outside it.
24
+ `ASK_NO_INFLIGHT_MARKER=1` disables it.
25
+ - **`timings.rule_families`** — wall time per rule family, highest first, with
26
+ a basis stating that it ranks cost and not complexity. The phase split could
27
+ say `security_rules: 12,617 ms` and never which of six families spent it.
28
+
29
+ ### Fixed
30
+
31
+ - **The most expensive rule family is between 3 and 24 times faster, with a
32
+ byte-identical answer (P1).** `SEC-010` was 85 % of the rule phase and 35 %
33
+ of a whole audit; profiling found the walk under it re-reading every
34
+ remaining source, from disk, once per callee name it resolved — 96,399 reads
35
+ for 28 lookups. It indexes declarable names in the pass that already reads
36
+ each file once. Measured warm: `SEC-010` 10,830 → 3,246 ms on a 3,860-file
37
+ repository (audit 15.5 → 12.2 s) and 64,391 → 2,628 ms on an 878-file one
38
+ (audit 71.1 → 8.4 s), unchanged where a repository has no HTTP-input seeds.
39
+ `content_id` identical on all three.
40
+ - **That family reports while it runs, and a deadline can stop it inside.** It
41
+ owned the longest stretch of an audit and left one heartbeat line unchanged
42
+ for the whole of it, which from outside is what the field calls a hang. A
43
+ budget cut returns what it measured instead of surfacing as an analysis
44
+ error.
45
+ - **`manifest_cache` keyed its entries on a list that omitted every
46
+ lockfile.** Two repositories with identical manifests and different resolved
47
+ dependencies hashed the same, and the second was served the first's answer.
48
+ The key now reads the analyzer's own `INPUT_FILENAMES`, and a battery reads
49
+ that module's source and fails if it opens a file the set does not name.
50
+ - **`SpringAuditResult.merge()` dropped `spring_footprint`**, which switched
51
+ BUG-03's marginal-detection disclosure back off on every `--scope all` run —
52
+ the default.
53
+ - Machine-census leases are refreshed while a run is alive, so a killed run no
54
+ longer makes every later run on that machine halve its worker pool for an
55
+ hour; the lease directory is capped.
56
+
57
+ ### Changed
58
+
59
+ - The suite is green: 13,748 tests, 0 failures. It had carried twenty-one
60
+ standing reds for several releases, which is how a real regression becomes
61
+ indistinguishable from the background. Two were the product defects above;
62
+ the rest were assertions that had fallen behind the code they pin, each
63
+ fixed or opted out with the reason stated.
64
+
65
+ ### Known Limitations
66
+
67
+ - `ALT-01`/`ALT-03` remain open. The bisection the field asked for ran over two
68
+ corpora — 250 to 4,772 files on one, 9,195 on another — and found no size at
69
+ which `spring-audit` stops answering: 5.8 s to 39.6 s, sublinear, `rc=0`
70
+ throughout. File count alone is exonerated on this platform at up to 2.75x
71
+ the field repository's size. This release makes the stretch the failing runs
72
+ sat in several times shorter and, for the first time, visible while it
73
+ happens; it does not claim to have fixed the hang.
74
+ - The next field round should send `inflight/` and `entry-trace.jsonl`
75
+ together after a hang. A marker still stuck in `SEC-010` says the family is
76
+ not the cause; a marker in another stage moves the search there; no marker
77
+ at all keeps it upstream of `main_entry`.
78
+ - `BUG-02` and `BUG-12` still need the field's own large repository.
79
+
3
80
  ## [5.9.28] — 2026-09-02
4
81
 
5
82
  *Remediation batch on the 5.9.27 audit queue: nine rows, one commit each. The
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sourcecode
3
- Version: 5.9.28
3
+ Version: 5.9.29
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.28-blue)
62
+ ![Version](https://img.shields.io/badge/version-5.9.29-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
@@ -290,7 +290,7 @@ brew tap haroundominique/sourcecode && brew install sourcecode
290
290
  # pip / pipx
291
291
  pipx install sourcecode # or: pip install sourcecode
292
292
 
293
- ask version # ask 5.9.28 — and, on a build that has aged,
293
+ ask version # ask 5.9.29 — and, on a build that has aged,
294
294
  # how many releases have probably shipped since
295
295
  ```
296
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.28-blue)
13
+ ![Version](https://img.shields.io/badge/version-5.9.29-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
@@ -241,7 +241,7 @@ brew tap haroundominique/sourcecode && brew install sourcecode
241
241
  # pip / pipx
242
242
  pipx install sourcecode # or: pip install sourcecode
243
243
 
244
- ask version # ask 5.9.28 — and, on a build that has aged,
244
+ ask version # ask 5.9.29 — and, on a build that has aged,
245
245
  # how many releases have probably shipped since
246
246
  ```
247
247
 
@@ -12,7 +12,7 @@ a regression assertion exist.
12
12
 
13
13
  ## Executive Result
14
14
 
15
- The audit rates ASK Engine **6.6/10** on the large MSAS corpus and **7.5/10** on
15
+ The audit rates ASK Engine **6.6/10** on the large native-Windows corpus and **7.5/10** on
16
16
  the smaller nine-axis assessment. The measurements agree on the main risk:
17
17
  source analysis is accurate and unusually explicit about uncertainty, but large
18
18
  repository execution and several output contracts are not yet reliable enough
@@ -52,7 +52,7 @@ SQL-injection recall, memory, and inconsistent CLI contracts.
52
52
  ## Performance Evidence
53
53
 
54
54
  The audit measured `--agent` on ThingsBoard at **182.6 s / 2,088 MB RSS** and
55
- `spring-audit` at **164.2 s cold**. On the larger MSAS corpus it reports
55
+ `spring-audit` at **164.2 s cold**. On the larger native-Windows corpus it reports
56
56
  `ask . --agent` at **447 s**, `contract-diff` at **329 s**, `delta` at **187 s**,
57
57
  and `validation --compact` at **91 s**. Warm root compact analysis can be below
58
58
  one second; these are cold/deep-path costs.
@@ -2,7 +2,7 @@
2
2
 
3
3
  ## Scope And Verdict
4
4
 
5
- Native-Windows re-audit on the same MSAS repository (3,342 Java files) used
5
+ Native-Windows re-audit on the same audited repository (3,342 Java files) used
6
6
  in every prior round. Score **4.6/10**, the first uptick in four rounds (5.9.22
7
7
  6.6, 5.9.23 4.9, 5.9.25 4.3, 5.9.26 3.8). The uptick carries a large
8
8
  qualification discovered mid-session: this audit's own machine was shared
@@ -40,7 +40,7 @@ pass ... 0/35 ... 3.8/10"). This auditor states plainly that the first pass
40
40
  and its 7.4/10 score do not correspond to anything they ran or reported. Given
41
41
  the newly confirmed shared-machine contention, the likely explanation is that
42
42
  5.9.26's report mixed observations from two concurrent, independent audit
43
- sessions on the same machine (the MSAS/native-Windows lineage and a
43
+ sessions on the same machine (the native-Windows lineage and a
44
44
  multi-repository "testing/" corpus lineage matching the five OSS repos found
45
45
  in the trace this round) rather than one evaluator's two passes. Recorded as
46
46
  an open provenance question, not resolved either way — see
@@ -97,6 +97,6 @@ concurrent `ask` test harness during at least part of the observation window.
97
97
  Reliability figures in this round should be read as measured under
98
98
  uncontrolled, real contention, not as an isolated single-process baseline.
99
99
  The auditor's own recommendation: repeat `spring-audit . --compact` x3 on
100
- both a reference repo and MSAS in the same clean window, nothing else
100
+ both a reference repo and the audited repository in the same clean window, nothing else
101
101
  running, to separate "the repository" from "the shared machine" as the
102
102
  variable.
@@ -0,0 +1,174 @@
1
+ # Alternative External Audit - 5.9.28
2
+
3
+ *The audited repository is referred to neutrally throughout (3,342 Java files,
4
+ `repo_id 7fced5c877cacfc5`, dirty working tree) — it is the same subject as
5
+ every prior round in this lineage.*
6
+
7
+ ## Scope And Verdict
8
+
9
+ Native-Windows re-audit, sixth round in this lineage. Score **6.2/10** (5.9.22
10
+ 6.6, 5.9.23 4.9, 5.9.25 4.3, 5.9.26 3.8, 5.9.27 4.6, 5.9.28 6.2) — the first
11
+ substantial rise in five versions, and the first with a root cause identified
12
+ in code rather than a symptom patched. **No regression against 5.9.27 was
13
+ found.** Windows 11 Pro 10.0.26200, Python 3.10.0, pipx, `ask.EXE`, build
14
+ `adbbf9ca7652e2ad2dfdb2db911c12e1793dded5`.
15
+
16
+ | Axis | 5.9.27 | 5.9.28 | Basis |
17
+ |---|---:|---:|---|
18
+ | Analysis accuracy | 9.0 | 9.5 | Overload anchoring exact and cross-checked against the real source |
19
+ | Honesty of figures | 9.0 | 9.3 | `audit_time_ms` null instead of a false `0.0`; every cache store publishes its eviction contract |
20
+ | Diagnostic instrumentation | partial progress | real step, known limit | `_meta.concurrency` is precise and actionable — and absent from exactly the runs that fail |
21
+ | CLI ergonomics | 6.5 | 7.5 | Nested-workspace `selftest` refusal; `retrieve --target` explains and redirects |
22
+ | Audit-family reliability | 2/12 | 2/8, cause bounded | `migrate-check`/`migrate-apply` clean; `spring-audit` 0/4, `verify` 0/1, `risk` 0/1, `audit-report` 0/1 |
23
+ | Light-path performance | 6.5 | 6.5 | `impact-chain` 11.3 s, `review-pr` 29.4 s — within range under residual contention |
24
+
25
+ ## Priority Finding — The Hang Reproduces With Contention Ruled Down
26
+
27
+ The most important measurement of this round. The auditor isolated the
28
+ contention variable to its lowest observable level across six sessions, and
29
+ the failure persisted at 100%:
30
+
31
+ 1. `entry-trace.jsonl` was monitored for 120 s with nothing launched, waiting
32
+ for a quiet window.
33
+ 2. 100 s of total calm confirmed — no new lines.
34
+ 3. `timeout -k 5 150 ask spring-audit . --compact` launched into that window.
35
+ 4. Result: `rc=124`, 150,176 ms, **0 bytes of stdout**.
36
+ 5. The trace grew by two lines over the whole 150 s window: the auditor's own
37
+ invocation, and one light foreign invocation (`risk thingsboard --limit
38
+ 20`) — against the *dozens* of concurrent foreign invocations measured in
39
+ the 5.9.27 session.
40
+
41
+ Session total: **4/4 hangs** of `spring-audit . --compact`, the last of them
42
+ under the lowest contention load obtainable in six audits.
43
+
44
+ The 5.9.28 release note states: *"one hang was observed with nothing else
45
+ running, and that is unexplained."* This round supplies four repetitions of
46
+ that case rather than one, which turns "unexplained" into "unexplained and
47
+ reproducible" — a better-defined problem, still unsolved. Contention is a
48
+ real, now precisely measured factor; it is **not the sole cause**. Something
49
+ specific to this repository still breaks `spring-audit` on a near-idle
50
+ machine.
51
+
52
+ The auditor's recommendation: profile the `applying all rules over 3342 Java
53
+ files` phase (the one the stderr heartbeat names) against a growing subset of
54
+ the repository — 250, 500, 1,000, 2,000, 3,342 files — to find where the
55
+ behaviour changes from "answers" to "hangs indefinitely". If the command
56
+ exhausts memory or time deterministically on some code pattern in this tree,
57
+ contention would be worsening a failure that already exists in isolation
58
+ rather than causing one.
59
+
60
+ ## Instrumentation Gap — The Blind Spot `_meta.concurrency` Cannot Cover
61
+
62
+ `_meta.concurrency` is described as the best instrumentation to appear in six
63
+ sessions. On a successful `endpoints --output` run it read
64
+ `{"peer_invocations_at_start": 17, "worker_budget_shared": true, "jobs": 1,
65
+ "jobs_unshared": 4}` — exact, actionable, and enough for any consumer to tell
66
+ a contaminated timing from an isolated one without doing process archaeology.
67
+
68
+ It never appears on a hung or empty run: stderr across the four `spring-audit`
69
+ hangs contains zero mentions of `concurrency`, because those processes die
70
+ before assembling any payload. This is the same blind spot `R-01` identified
71
+ in the 5.9.26 round (the process does not reach the output guard); what has
72
+ changed is that we now know it *would* publish something useful if it got
73
+ there.
74
+
75
+ Concrete suggestion from the auditor: write an in-flight marker
76
+ (`inflight/<pid>.json` carrying `{argv, started_at, last_phase}`, updated at
77
+ each phase change the heartbeat already reports) when an audit-family command
78
+ starts, and delete it on completion. A process that hangs or dies leaves that
79
+ file orphaned — which is precisely the forensic evidence the next field
80
+ session needs, without depending on an external observer correlating
81
+ timestamps in a trace file shared with an unknown number of other processes.
82
+
83
+ ## Measured Reliability — Six Versions, Same Invocation, Same Repository
84
+
85
+ | Invocation | 5.9.23 | 5.9.25 | 5.9.26 | 5.9.27 | 5.9.28 |
86
+ |---|---:|---:|---:|---:|---|
87
+ | `spring-audit . --compact` | 0/24 | 0/18 | 0/8 | 0/5 | 0/4 (3 under verified-minimal contention) |
88
+ | `verify .` | 0/24 | 0/18 | 0/5 | 0/1 | 0/1 |
89
+ | `migrate-check . --compact` | 7/12 | 4/26 | 0/5 | 1/1 | 1/1 ✓ |
90
+ | `migrate-apply .` | 14/24 | 0/26 | 0/5 | 1/1 | 1/1 ✓ |
91
+ | `risk . --limit 20` | 0/13 | 0/7 | 0/4 | 0/1 | 0/1 |
92
+ | `audit-report . --format markdown` | 0/7 | 0/7 | 0/4 | 0/1 | 0/1 |
93
+
94
+ `migrate-check` and `migrate-apply` have now answered reliably in two
95
+ consecutive sessions (38–39 s, correct payloads) — a trend rather than luck.
96
+ The other four remain at zero.
97
+
98
+ ## Verified Fixes — Checked With The Auditor's Own Data
99
+
100
+ - **`NEW-02`/`BUG-05` (overload anchoring) — closed, cross-checked against the
101
+ real source.** `ask endpoints . --output`: the four endpoints of one
102
+ overloaded handler pair now publish `anchor_ambiguity: true`,
103
+ `overload_count: 2`, `anchor_candidate_lines: [134, 145]`, and those two
104
+ line numbers match the two real annotations the auditor had verified by hand
105
+ three sessions earlier. First defect tracked since the 5.9.22 round that is
106
+ genuinely resolved rather than "not reproduced this time".
107
+ - **`BUG-13` (nested-workspace `selftest`) — closed, verified against a
108
+ purpose-built fixture.** The auditor built a workspace holding two real
109
+ nested Git repositories: refusal in **373 ms**, `{"code": "INVALID_USAGE",
110
+ ..., "nested_repositories": 2}`, with `--allow-nested` documented. Against
111
+ 1/12 rows passing in 120 s before.
112
+ - **`BUG-16` (cache eviction contract) — closed.** `ask cache status` now
113
+ prints, per store, when and how entries are evicted — information absent for
114
+ four versions.
115
+ - **`ALT-25` (`impact-chain.audit_time_ms`) — closed.** `null` with
116
+ `findings_status: "not_computed"` and the rule stated, replacing the
117
+ misleading `0.0`.
118
+ - **`retrieve security-surface --target` — closed, high quality.** The refusal
119
+ now says the intent is repository-wide and names
120
+ `ask retrieve security-chain --target <symbol>`, after four sessions of
121
+ "No such option: --target".
122
+ - **`R-01`'s mechanism — confirmed real and quantified** (see above), with the
123
+ reservation that the disclosure cannot reach the failing runs.
124
+
125
+ ## Not Verified This Round
126
+
127
+ - **`ALT-08` — the auditor ran the wrong command and says so.**
128
+ `ask review-pr . --files -` (119,979 bytes, above the declared 100,000-byte
129
+ ceiling) carries no `_truncation_summary` at all: that field belongs to
130
+ `ask prepare-context review-pr`, a different command sharing the task name.
131
+ Neither claimed nor refuted; pending a repeat with the correct command.
132
+ - `BUG-22`/`REG-02` (`--agent` not relaunched), `BUG-10` (needs a repository
133
+ with the routing styles it detects, absent here), `ALT-07`, `ALT-10`,
134
+ `BUG-02`, `BUG-12`, `BUG-09`, `BUG-23`: not relaunched for time budget, no
135
+ regression signal against any of them.
136
+ - `ask --help`: 12.3 s cold, 2.9 s on immediate repetition. Still high on the
137
+ audit machine, consistent with residual contention rather than a defect in
138
+ the command.
139
+
140
+ ## Verified And Defect-Free In 5.9.28
141
+
142
+ `endpoints` (3,763, exact), `impact-chain` (37,445 bytes), `posture`,
143
+ `verify-edit`, `explain`, `impact`, `drift`, `trend`, `chunk-file`, `intent`,
144
+ `pr-risk`, `review-pr` (119,979 bytes, coherent), `migrate-check` (38,081
145
+ bytes), `migrate-apply` (10,142 bytes), `selftest` with an explicit path
146
+ (`rc=75`, 9,910 bytes) and with nesting detection (`rc=2`). `--jobs`
147
+ out-of-range rejection confirmed for the sixth consecutive session.
148
+
149
+ ## Commercial Position
150
+
151
+ The reliable subset grew for real this round — `migrate-check`,
152
+ `migrate-apply`, `endpoints`, `posture`, `impact-chain`, `pr-risk`,
153
+ `review-pr`, `selftest` with an explicit path, now with correct overload
154
+ anchors — and is valued at **18–20 €/dev/month**, up from prior rounds. The
155
+ central security-audit family (`spring-audit`, `verify`, `risk`,
156
+ `audit-report`) remains unusable on this repository for the sixth consecutive
157
+ version.
158
+
159
+ **Upgrade recommendation: yes, unconditionally** — no regression against
160
+ 5.9.27, and four corrections verified with the auditor's own data rather than
161
+ accepted on the changelog's word. For anyone who needs the audit family on
162
+ this repository specifically: still not the moment, but for the first time the
163
+ team has a concrete, reproducible lead instead of a diffuse symptom.
164
+
165
+ ## Attack Order Requested By The Auditor
166
+
167
+ 1. `R-01` — bisect the `applying all rules` phase over a growing file subset
168
+ (250 → 3,342) to find where the behaviour changes; the trigger may not be
169
+ purely concurrency.
170
+ 2. Extend `R-01`'s instrumentation to runs that never complete — the in-flight
171
+ marker above.
172
+ 3. `R-02` — repeat the `ALT-08` verification with `ask prepare-context
173
+ review-pr`.
174
+ 4. Remaining rows unchanged in priority from the 5.9.27 report.
@@ -14,6 +14,110 @@ 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 — Release `5.9.29`, hardening pass and a green suite (2026-09-02)
18
+
19
+ **The suite is green — 13 748 tests, 0 failures — for the first time in
20
+ several releases.** It had carried twenty-one standing reds, which is how a
21
+ real regression becomes indistinguishable from the background. Two of them
22
+ were product defects, not stale assertions.
23
+
24
+ | ID | Severity | Status | Evidence and required closure |
25
+ |---|---:|---|---|
26
+ | `manifest-cache-key` (new) | High | **fixed** | `manifest_cache` keyed its entries on a hand-kept copy of the manifest names that omitted **every lockfile** — `poetry.lock`, `Cargo.lock`, `Gemfile.lock`, `pnpm-lock.yaml`, `yarn.lock`, `composer.lock`, `uv.lock`, `Pipfile.lock`. Two repositories with identical manifests and different *resolved* dependencies hashed the same, so the second was served the first's answer: a stale result with nothing in it to say so. The key now reads `dependency_analyzer.INPUT_FILENAMES`, and a battery reads that module's own source and fails if it opens a file the declared set does not name. |
27
+ | `BUG-03` (merge half) | High | **fixed** | `SpringAuditResult.merge()` dropped `spring_footprint`, so the marginal-detection disclosure closed in 5.9.26 was switched back off on every `--scope all` run — the default. Fixing a producer and leaving a consumer unbound is the exact failure this ledger's maintenance rule exists for, found here by the battery that pins every dataclass field through the merge. |
28
+ | `R-01` (lease liveness) | — | **hardened before shipping** | A lease outlived its process by up to an hour, and the field's harness kills runs with `timeout` constantly — on Windows, where liveness cannot be probed, every later run would have believed it was sharing the machine with a corpse and halved its pool for the whole TTL. Live runs refresh the lease at each phase change; the TTL drops to 900 s, which only has to outlast the longest single phase; the directory is capped. |
29
+ | `R-01-INFLIGHT` (coverage) | — | **widened** | The marker covered the audit family only. `ALT-10` (`onboard`, 904 ms to a 200-second kill in one session) and `ALT-07` (`remediate`, 23,6 s to hangs past 400 s) are the field's other unexplained hangs, and a marker is the only evidence either row can leave behind. Both are covered now; `--help` and the light path still pay nothing. |
30
+ | Suite hygiene | — | **closed** | Nineteen further rows were assertions that had fallen behind: a missing import and a missing fixture parameter, a `--jobs` bound stated twice (one `JOBS_MAX` now feeds the range and the help), a budget block that gained a field, a deadline modelled as a count of consultations rather than a state of the run, a no-context emulation importing a Typer module this version does not ship, `SEC-010` declaring neither a repair recipe nor a reason it cannot be mechanised, and the budget-authority battery holding external audit records to a rule meant for documents that instruct. |
31
+
32
+ ## Current Synchronization — P1 closed: the expensive family, profiled and fixed (2026-09-02)
33
+
34
+ **The row asked for two things and both are done: `SEC-010` now reports while
35
+ it runs, and the walk underneath it is between 3 and 24 times faster with a
36
+ byte-identical answer.** Profiling `risk._http_input_query_sinks` on a
37
+ 3 860-file repository found the mechanism in one line of the profile: `get()`
38
+ re-read every remaining source, from disk, **once per callee name it
39
+ resolved** — 96 399 `_text_of` calls for 28 lookups, six seconds of pure I/O
40
+ inside an 18,3-second walk, with the parse it triggers accounting for the
41
+ rest.
42
+
43
+ | ID | Severity | Status | Evidence and required closure |
44
+ |---|---:|---|---|
45
+ | `SEC-010` cost | Medium | **fixed** | `seeds()` already reads every source once, so it now indexes, per file, the names that could be *declared* there. The predicate is unchanged where it matters — a Java declaration is never preceded by a dot, so `helper.lookup(` cannot declare `lookup`, while every file that could declare a name stays a candidate — which preserves the walk's own claim that reading fewer files cannot change the answer. Measured warm, serialized, `spring-audit --compact`: `SEC-010` 10 830 → 3 246 ms and the audit 15,5 → 12,2 s on a 3 860-file repository; **64 391 → 2 628 ms** and the audit **71,1 → 8,4 s** on an 878-file one where the family had been 90 % of the clock; unchanged on a repository with no HTTP-input seeds. `content_id` byte-identical on all three. |
46
+ | `SEC-010` silence | Medium | **fixed** | The family owned the most expensive stretch of an audit and reported nothing while it ran — one heartbeat line, unchanged, which from outside is exactly what the field calls a hang. It ticks through `FamilyBudget` now (`SEC-010: parsing callees 129/772 files`), which also makes the family that spends the most time the one a deadline can stop *inside*: a cut returns what it measured, and is recorded as a cut rather than surfacing as an analysis error. |
47
+ | `ALT-01` / `ALT-03` | Critical maximum | **open, one contributing factor removed** | The field's failing runs sat in `SEC-010` and this release makes that stretch several times shorter and, for the first time, visible while it happens. That is not a claim the hang is fixed: an 878-file repository spending 71 s on one family is a plausible contributor to a 150-second timeout, not a proven cause of one, and the field's own repository was never available here. What the next round can do that no previous one could: read `inflight/<pid>.json` after a hang and see whether the stage is still `SEC-010`. |
48
+
49
+ ## Current Synchronization — The two 5.9.28 P0s, worked (2026-09-02)
50
+
51
+ **The bisection ran, and its headline result is negative: there is no knee.**
52
+ `spring-audit --compact` over deterministic subsets of a 4 772-file repository
53
+ took 5,8 s (250 files), 6,0 s (500), 9,2 s (1 000), 10,4 s (2 000), 16,9 s
54
+ (3 342 — the field's own file count) and 24,1 s (4 772); a second corpus of
55
+ 9 195 files finished in 39,6 s. Sublinear per file, `rc=0` everywhere, no hang
56
+ at any size. **File count alone does not explain the field's failure on this
57
+ platform**, and the auditor's hypothesis — a costly loop that trips at a
58
+ certain size — is not reproducible here at up to 2,75× their repository.
59
+
60
+ What the bisection did find is where the time goes, and why the heartbeat
61
+ looks stuck: **one family dominates**. On the 4 772-file repository, `SEC-010`
62
+ measured **10 670 ms of a 30 099 ms run — 85 % of the rule phase** — and its
63
+ heartbeat line stops changing for the last 10,6 s of it. That is precisely the
64
+ shape the field reports as a hang, and `timings.phases` could say
65
+ `security_rules: 12 617 ms` while never naming which of the six families spent
66
+ it. `SEC-010` delegates to `risk._http_input_query_sinks`, already recorded as
67
+ the CLI's single most expensive walk on two corpora in the 5.8.5 round.
68
+
69
+ | ID | Severity | Status | Evidence and required closure |
70
+ |---|---:|---|---|
71
+ | `R-01-INFLIGHT` | Critical maximum | **shipped** | `inflight/<pid>.json` is written when an audit-family command starts, rewritten at each phase and stage change the heartbeat already reports, and deleted on the way out. A run killed externally leaves it behind carrying argv, start time, the phase, the stage (the rule family) and how long it had been in each. Abandoned markers are published by a later run in `_meta.incomplete_runs` and attached to the forensic snapshot when a guard fires — the run that stops cannot report anything itself. Each row states its basis: a dead pid is a measurement, an old timestamp is an inference, and Windows offers only the second. `ASK_NO_INFLIGHT_MARKER=1` disables it. Field closure: the next hang should leave a marker naming its stage. |
72
+ | `ALT-03` (bisection) | High | **measured, hypothesis not reproduced** | Six sizes on one corpus, three on a second, serialized on a quiet machine: no size at which the behaviour changes from *answers* to *hangs*. The remaining differences with the field are the platform (native Windows, four-worker cap), that repository's own content, and a dirty working tree. The bisection is not repeatable from outside without the repository, so the instruments below move the next attempt inside the product. |
73
+ | `ALT-03` (attribution) | High | **instrumented** | `timings.rule_families` publishes wall time per family, highest first, with a basis stating that it ranks cost and not complexity (the families are not comparable units). Two `perf_counter` reads per family. A family the budget cut stays absent and is named in `_partial.rules_not_run`, so a missing entry is never read as a free family. |
74
+ | `SEC-010` cost | Medium | **open, new, measured** | 85 % of the rule phase and 35 % of the whole audit on a 4 772-file repository; growth measured at roughly `n^1.2` between 1 553 and 3 860 analysed files (3,6 s → 10,6 s of unchanged heartbeat). Its own sub-progress is not reported, so a slow run and a stopped one look identical from outside for the whole stretch. Two separable pieces of work: report progress *inside* the family, and profile `risk._http_input_query_sinks`, which the 5.8.5 round already measured as this CLI's most expensive walk on two corpora. |
75
+
76
+ ## Current Synchronization — Alternative External Audit `5.9.28`, the hang reproduces on a near-idle machine (2026-09-02)
77
+
78
+ **First substantial score rise in five rounds (4.6 → 6.2/10), with no
79
+ regression found — and the sharpest evidence yet that contention was never the
80
+ whole story.** The auditor isolated the contention variable to its lowest
81
+ observable level in six sessions (120 s of monitoring, 100 s of confirmed calm
82
+ before launch, one light foreign invocation across the whole 150 s window,
83
+ against dozens in the 5.9.27 round) and `spring-audit . --compact` still hung
84
+ **4 of 4 times**, `rc=124`, 0 bytes. The 5.9.28 release note said "one hang was
85
+ observed with nothing else running, and that is unexplained"; this round turns
86
+ that into *unexplained and reproducible*, which is a better-defined problem and
87
+ still an open one. Full evidence:
88
+ [`AUDIT-2026-09-02-ALTERNATIVE-5.9.28.md`](AUDIT-2026-09-02-ALTERNATIVE-5.9.28.md).
89
+
90
+ **Five rows are confirmed closed with the auditor's own data, not on the
91
+ changelog's word:** `NEW-02`/`BUG-05` (cross-checked against the real source —
92
+ `anchor_candidate_lines: [134, 145]` matches two annotations the auditor had
93
+ verified by hand three sessions earlier, and it is the first defect tracked
94
+ since 5.9.22 that is genuinely resolved rather than "not reproduced this
95
+ time"), `BUG-13` (373 ms refusal against a purpose-built two-repository
96
+ workspace), `BUG-16`, `ALT-25`, and the `retrieve security-surface --target`
97
+ refusal. `_meta.concurrency` is described as the best instrumentation to appear
98
+ in six sessions.
99
+
100
+ | ID | Severity | Status | Evidence and required closure |
101
+ |---|---:|---|---|
102
+ | `R-01` (contention) | Critical maximum | **mechanism confirmed real and quantified; no longer sufficient as an explanation** | Measured on a successful run: `{"peer_invocations_at_start": 17, "worker_budget_shared": true, "jobs": 1, "jobs_unshared": 4}` — exact and actionable, and it settles from the outside what the 5.9.27 round could only infer from timestamps. But `spring-audit` hung 4/4 with third-party contention verified at its lowest in six sessions, so the division of the worker budget is a real fix for a real defect that is **not** the whole cause. Closure now needs the bisection below, not another contention measurement. |
103
+ | `R-01-INFLIGHT` (new) | Critical maximum | **open, instrumentation gap named precisely** | `_meta.concurrency` never appears on a hung or empty run — zero mentions of `concurrency` across the four hangs' stderr — because those processes die before assembling any payload. Same blind spot as the 5.9.26 `R-01` (the run does not reach the output guard), now with the knowledge that the disclosure would be useful if it got there. The auditor's proposal, adopted as the row's required work: write `inflight/<pid>.json` with `{argv, started_at, last_phase}` when an audit-family command starts, update it at each phase change the heartbeat already reports, delete it on completion. An orphaned file is the forensic record no external observer can reconstruct by correlating a shared trace. |
104
+ | `ALT-01` / `ALT-03` | Critical maximum | **open, now systematic and reproducible for this repository** | `spring-audit . --compact` 0/4 this round (0/5, 0/8, 0/18, 0/24 in the four before it); `verify` 0/1, `risk` 0/1, `audit-report` 0/1. The bisection the row has asked for since 5.9.25 now has a specific target: profile the `applying all rules over 3342 Java files` phase — the one the stderr heartbeat names — over a growing subset (250, 500, 1 000, 2 000, 3 342 files) and find where the behaviour changes from *answers* to *hangs indefinitely*. If it is deterministic on this tree, contention worsens a failure that already exists in isolation rather than causing one. |
105
+ | `NEW-02` / `BUG-05` | High | **closed 5.9.28, confirmed in the field** | `anchor_ambiguity: true`, `overload_count: 2`, `anchor_candidate_lines: [134, 145]`, cross-checked against the two real annotations on the overloaded handler pair. Correct, not merely present. |
106
+ | `BUG-13` | High | **closed 5.9.28, confirmed against an independent fixture** | Two real nested Git repositories, refusal in 373 ms with `nested_repositories: 2` and `--allow-nested` documented — against 1 of 12 rows passing in 120 s before. |
107
+ | `BUG-16` | High | **closed 5.9.28, confirmed** | `cache status` prints each store's eviction contract; the auditor notes the information had been absent for four versions. |
108
+ | `ALT-25` | Low | **closed 5.9.28, confirmed** | `audit_time_ms: null` with `findings_status: "not_computed"` and the rule stated beside it. |
109
+ | `retrieve security-surface --target` | Low | **closed 5.9.28, confirmed** | The refusal states the intent is repository-wide and names `ask retrieve security-chain --target <symbol>`. |
110
+ | `ALT-08` (arithmetic half) | Low | **fixed, field verification still owed** | Not verified this round and the auditor says so plainly: they exercised `ask review-pr`, which carries no `_truncation_summary` at all, instead of `ask prepare-context review-pr`, the command the field owns. Neither claimed nor refuted. Re-verify with the correct command before treating the field evidence as either way. |
111
+ | `migrate-check` / `migrate-apply` | — | **reliable two sessions running** | 1/1 and 1/1 again (38–39 s, correct payloads). Two consecutive clean sessions after 0/5 in 5.9.26 — a trend rather than luck, and the shape of what a fixed audit-family command should look like. |
112
+ | `ask --help` latency | Low | **open, still not a command-level defect** | 12.3 s cold, 2.9 s on immediate repetition on the audit machine, against 0.41–0.44 s on the engineering host. Consistent with residual contention; not reproduced as a defect of the command in either place. |
113
+ | `BUG-22`/`REG-02`, `BUG-10`, `ALT-07`, `ALT-10`, `BUG-02`, `BUG-12`, `BUG-09`, `BUG-23` | — | **open/unchanged, not relaunched** | Time budget, and no regression signal. `BUG-10` in particular cannot be exercised on this repository — it has none of the routing styles that fix detects. |
114
+
115
+ **No regression was found against 5.9.27, and the upgrade is recommended
116
+ unconditionally** — the first round in six where the auditor reports a net,
117
+ verified improvement with nothing new broken. The release gate is unchanged:
118
+ the audit-command family is still not usable for unattended CI on this
119
+ repository.
120
+
17
121
  ## Current Synchronization — Release `5.9.28`, nine rows closed on the 5.9.27 queue (2026-09-02)
18
122
 
19
123
  **`R-01`'s architectural question is answered in source, and the answer was
@@ -1,5 +1,77 @@
1
1
  # ASK — Development Roadmap
2
2
 
3
+ ### Release 5.9.29 — hardening pass, green suite
4
+
5
+ The suite is green (13 748 / 0) for the first time in several releases. Two of
6
+ the twenty-one standing reds were product defects — a cache key that omitted
7
+ every lockfile, and a merge that dropped the field BUG-03's fix depends on —
8
+ and the rest were assertions that had fallen behind the code they pin.
9
+
10
+ | Priority | Required work and closure boundary |
11
+ |---|---|
12
+ | P0 | Unchanged and now fully instrumented: ask the next field round for `inflight/` and `entry-trace.jsonl` after a hang. The marker covers `onboard` and `remediate` too, so `ALT-07` and `ALT-10` can finally leave evidence. |
13
+ | P1 | Keep the suite green. A red set that survives a release is what made this session's two real defects invisible for as long as they were; the value of the battery is the signal, and twenty-one permanent reds is no signal. |
14
+ | P2 | One order-dependent flake was observed once under `-n auto` and did not reproduce in two further full runs (`test_qualified_target_resolution_e17`). Recorded rather than chased — if it returns, it is a CliRunner/stream-capture interaction, not an analysis defect. |
15
+
16
+ ### P1 closed — the expensive rule family profiled, fixed and made visible
17
+
18
+ `SEC-010` was 85 % of the rule phase and reported nothing while it ran. Both
19
+ halves are closed. The profile named the mechanism immediately: the walk
20
+ re-read the whole remaining corpus, from disk, once per callee name — 96 399
21
+ reads for 28 lookups. It now indexes declarable names in the pass that already
22
+ reads every file once.
23
+
24
+ | Priority | Required work and closure boundary |
25
+ |---|---|
26
+ | P0 | Unchanged: get `inflight/` and `entry-trace.jsonl` from the next field round after a hang. With `SEC-010` several times cheaper *and* reporting counted progress, a marker still stuck in that stage says the family is not the cause; a marker in a different stage moves the search there; no marker at all keeps it upstream of `main_entry`. |
27
+ | P1 | **Closed.** `SEC-010` 10 830 → 3 246 ms on a 3 860-file repository and 64 391 → 2 628 ms on an 878-file one (audit 71,1 → 8,4 s), `content_id` byte-identical on three corpora. The family ticks through `FamilyBudget`, so its line now counts, and a deadline can stop it mid-walk instead of only between families. |
28
+ | P2 | The remaining cost in that walk is `_methods_in_text` over the files a name lookup admits — 11,4 s of the original 18,3 s profile, now the dominant term. Worth a look only if the field's next round still points here; the answer must stay byte-identical, which is the constraint that shaped this fix. |
29
+
30
+ ### The two 5.9.28 P0s, worked — bisection measured, in-flight marker shipped
31
+
32
+ Both P0s from the round below are done. `R-01-INFLIGHT` shipped: an
33
+ audit-family run now leaves `inflight/<pid>.json` naming its argv, phase,
34
+ stage and how long it had been in each, deleted on a normal exit, published by
35
+ a later run as `_meta.incomplete_runs`. The bisection ran over two corpora and
36
+ **did not reproduce the failure**: 5,8 s at 250 files rising sublinearly to
37
+ 24,1 s at 4 772, and 39,6 s at 9 195 files, `rc=0` throughout.
38
+
39
+ | Priority | Required work and closure boundary |
40
+ |---|---|
41
+ | P0 | The field's next hang is now supposed to leave a marker. Ask for `inflight/` and `entry-trace.jsonl` together in the next round: a marker naming `security rules (SEC-010)` would close the mechanism question that six sessions could not, and no marker at all would prove the process dies before `main_entry` returns, which is a different search entirely. |
42
+ | P1 | `SEC-010` is 85 % of the rule phase and 35 % of a 4 772-file audit, with no sub-progress of its own — a slow run and a stopped one are indistinguishable from outside for that whole stretch. Report progress inside the family (it walks a countable population), then profile `risk._http_input_query_sinks`, which the 5.8.5 round already measured as the CLI's most expensive walk on two corpora. Cost, not correctness: the answer must not move. |
43
+ | P2 | The bisection exonerated file count on this platform up to 2,75× the field's repository. The variables left are the platform (native Windows, four-worker cap), that repository's own content, and its dirty working tree. Do not spend another round re-measuring size; the marker moves the question inside the product. |
44
+
45
+ Method note, for repeatability: subsets were built deterministically (first N
46
+ `.java` files in sorted order plus every build manifest on their ancestor
47
+ paths), runs were serialized, and the heartbeat was redirected with
48
+ `ASK_PROGRESS=file:<path>` so a run that never answered would still say which
49
+ phase and stage it stopped in.
50
+
51
+ ### Alternative Audit Intake — release 5.9.28, the hang reproduces on a near-idle machine
52
+
53
+ Score 6.2/10 (4.6 in 5.9.27) — the first substantial rise in five rounds, with
54
+ **no regression found** and five rows confirmed closed against the auditor's
55
+ own data rather than the changelog's word. The round's decisive measurement is
56
+ negative, though: with third-party contention isolated to its lowest observable
57
+ level in six sessions (100 s of confirmed calm before launch; one light foreign
58
+ invocation across the whole 150 s window, against dozens the round before),
59
+ `spring-audit . --compact` still hung **4 of 4 times**, `rc=124`, 0 bytes. The
60
+ worker-budget division shipped in 5.9.28 fixed a real defect that is not the
61
+ whole cause.
62
+
63
+ | Priority | Required work and closure boundary |
64
+ |---|---|
65
+ | P0 | Bisect the `applying all rules over 3342 Java files` phase — the one the stderr heartbeat already names — over a growing subset of a large repository (250, 500, 1 000, 2 000, 3 342 files) and find the point where the behaviour changes from *answers* to *hangs indefinitely*. This is the bisection `ALT-03` has asked for since 5.9.25, now with the added constraint that the trigger is not purely concurrency: it reproduces on a near-idle machine. |
66
+ | P0 | `R-01-INFLIGHT`: extend the diagnostic to runs that never assemble a payload. `_meta.concurrency` is exact and actionable on successful runs (`peer_invocations_at_start: 17`, `jobs_unshared: 4` → `jobs: 1`) and absent from every hang — zero mentions across four of them. Write `inflight/<pid>.json` with `{argv, started_at, last_phase}` at the start of each audit-family command, update it at each phase change the heartbeat already reports, delete it on completion; an orphaned file is the forensic record an external observer cannot reconstruct from a shared trace. |
67
+ | P1 | `R-02`: re-verify `ALT-08` with `ask prepare-context review-pr`. The auditor exercised `ask review-pr`, which carries no `_truncation_summary` at all, and neither claims nor refutes the row. Add a battery assertion that pins which command owns the field, so the next round cannot spend a session on the wrong one. |
68
+ | P2 | `ask --help` measured 12.3 s cold and 2.9 s on immediate repetition on the audit machine, against 0.41–0.44 s on the engineering host. Consistent with residual contention in both readings; do not profile it as a command-level defect until a round measures it with `peer_invocations_at_start: 0`. |
69
+ | — | `migrate-check`/`migrate-apply` have answered reliably for two consecutive sessions (1/1 and 1/1, 38–39 s). Treat their path as the reference shape when bisecting the four commands that stay at zero. |
70
+
71
+ Full evidence, including the isolation methodology and the trace line counts,
72
+ is in
73
+ [`AUDIT-2026-09-02-ALTERNATIVE-5.9.28.md`](AUDIT-2026-09-02-ALTERNATIVE-5.9.28.md).
74
+
3
75
  ### Release 5.9.28 — remediation batch on the 5.9.27 queue, the pool question answered in source
4
76
 
5
77
  The P0 below it asked whether the shared worker pool tolerates concurrent
@@ -5,6 +5,69 @@
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
+ > **RELEASE 5.9.29 — the regression battery is fully green again, and it
9
+ > caught two real defects on the way.** The test suite had carried twenty-one
10
+ > permanent failures for several releases; a permanent failure is background
11
+ > noise, and background noise is where a genuine regression hides. Clearing it
12
+ > surfaced two product defects that had been invisible: a dependency cache
13
+ > that ignored lockfiles, so two projects with the same manifests and
14
+ > different resolved versions were given each other's answer, and a merge step
15
+ > that silently switched off a disclosure fixed three releases ago on the
16
+ > default code path. Both are fixed, both are pinned by assertions that fail
17
+ > if the vocabulary drifts again. The release also hardens what shipped in the
18
+ > last one against the customer's own machine, where runs are killed by
19
+ > timeouts constantly, and extends the new forensic record to the two further
20
+ > commands the customer reports hanging.
21
+
22
+ > **THE EXPENSIVE PART OF A SECURITY AUDIT IS NOW BETWEEN 3 AND 24 TIMES
23
+ > FASTER, WITH THE SAME ANSWER.** The rule that dominated audit time was
24
+ > re-reading the whole repository from disk once for every method name it had
25
+ > to resolve. It reads each file once now. On a mid-size customer-shaped
26
+ > repository the whole audit went from 71 seconds to 8; on a larger one, from
27
+ > 15.5 to 12.2. The answers are byte-identical on every repository tested —
28
+ > that was the constraint the work was done under, and it is checked rather
29
+ > than asserted. The same rule also reports progress while it runs for the
30
+ > first time, so the stretch that used to look like a hang now shows a moving
31
+ > count, and a time budget can stop inside it instead of only between rules.
32
+
33
+ > **BOTH 5.9.28 P0s WORKED — the product now records where a run stopped, and
34
+ > the bisection came back negative.** A run that is killed or hangs leaves a
35
+ > small file naming what it was doing and for how long, deleted the moment it
36
+ > finishes normally; the next successful run reports that an earlier one
37
+ > stopped without being able to say so. That closes, from the inside, the gap
38
+ > an external auditor has been filling by hand for three rounds. The bisection
39
+ > the same auditor asked for ran over two large repositories and found no size
40
+ > at which the audit stops answering — up to 2,75× the file count of the
41
+ > repository that fails in the field — which removes "the repository is simply
42
+ > too big" from the table and leaves the platform and that repository's own
43
+ > content as the open variables. It also produced the first hard attribution:
44
+ > a single rule family accounts for 85 % of the rule phase, and it is the one
45
+ > the failing runs were last seen in. The payload now names it, so the next
46
+ > field session reads that fact instead of inferring it.
47
+
48
+ > **5.9.28 RE-AUDIT — first substantial score rise in five rounds (4.6 →
49
+ > 6.2/10), no regression found, and the upgrade recommended without
50
+ > conditions.** Five corrections were verified by the auditor with their own
51
+ > data rather than accepted on the changelog's word: the overload-anchoring
52
+ > defect tracked since the first round of this lineage is genuinely closed
53
+ > (the published candidate lines match annotations they had verified by hand
54
+ > three sessions earlier), the nested-workspace refusal answers in 373 ms
55
+ > where the command used to degrade for two minutes, the cache eviction
56
+ > contract is published for the first time in four versions, a misleading zero
57
+ > became an honest null, and a four-round CLI complaint now explains itself and
58
+ > names the right command. The concurrency telemetry is called the best
59
+ > instrumentation to appear in six sessions.
60
+ >
61
+ > The round's decisive measurement is the negative one, and it changes where
62
+ > the remaining work sits: with contention isolated to its lowest observable
63
+ > level in six sessions, the audit family's core command still failed every
64
+ > time. Machine contention was a real defect and is fixed; it was not the
65
+ > whole cause. The reliable subset — migration checks, endpoints, posture,
66
+ > impact and the PR-review path — grew and is valued by the auditor at 18–20
67
+ > €/dev/month, while the security-audit family stays unusable on that
68
+ > repository for a sixth version. The release gate is unchanged. See
69
+ > [`AUDIT-2026-09-02-ALTERNATIVE-5.9.28.md`](AUDIT-2026-09-02-ALTERNATIVE-5.9.28.md).
70
+
8
71
  > **RELEASE 5.9.28 — the pool question is answered, and the answer was
9
72
  > "exclusive use".** The audit asked engineering a direct question
10
73
  > instead of reporting another symptom, and reading the source settled it: the
@@ -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.28
282
+ # ask 5.9.29
283
283
  ```
284
284
 
285
285
  Requires Python 3.9+.