sourcecode 5.8.23__tar.gz → 5.8.25__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

Files changed (417) hide show
  1. sourcecode-5.8.25/.github/workflows/windows-battery.yml +41 -0
  2. {sourcecode-5.8.23 → sourcecode-5.8.25}/CHANGELOG.md +66 -0
  3. {sourcecode-5.8.23 → sourcecode-5.8.25}/PKG-INFO +4 -4
  4. {sourcecode-5.8.23 → sourcecode-5.8.25}/README.md +3 -3
  5. sourcecode-5.8.25/docs/AUDIT-2026-08-23-5.8.24.md +251 -0
  6. sourcecode-5.8.25/docs/AUDIT-2026-08-23-COMMERCIAL.md +195 -0
  7. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/CACHE.md +17 -7
  8. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/DEFECT-LEDGER.md +512 -38
  9. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/DEVELOPMENT-ROADMAP.md +285 -3
  10. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/EXECUTION-PLAN-12MO.md +101 -6
  11. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/EXECUTIVE-ROADMAP.md +128 -2
  12. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/MANUAL-USUARIO.md +8 -0
  13. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/PRODUCT-ROUTE.md +48 -2
  14. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/USER_GUIDE.md +16 -7
  15. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/architecture/semantic-ir-roadmap.md +32 -9
  16. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/perf/REGRESSION-GATE.md +1 -2
  17. {sourcecode-5.8.23 → sourcecode-5.8.25}/pyproject.toml +1 -1
  18. {sourcecode-5.8.23 → sourcecode-5.8.25}/scripts/perf_harness.py +5 -0
  19. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/__init__.py +1 -1
  20. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/analysis_budget.py +26 -0
  21. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/audit_report.py +8 -1
  22. sourcecode-5.8.25/src/sourcecode/build_stamp.py +185 -0
  23. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/cache.py +67 -1
  24. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/cache_model.py +224 -6
  25. sourcecode-5.8.25/src/sourcecode/cache_observation.py +148 -0
  26. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/cli.py +538 -108
  27. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/context_cache.py +11 -0
  28. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/data_exposure.py +16 -0
  29. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/envelope.py +17 -2
  30. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/execution_plan.py +7 -3
  31. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/field_deprecations.py +48 -3
  32. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/migrate_check.py +204 -4
  33. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/output_bounds.py +11 -0
  34. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/output_ceiling.py +203 -6
  35. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/pack_manifest.py +39 -0
  36. sourcecode-5.8.25/src/sourcecode/packs.py +906 -0
  37. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/perf.py +24 -2
  38. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/phased_run.py +84 -0
  39. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/product_info.py +43 -1
  40. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/readonly.py +19 -0
  41. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/regress.py +43 -1
  42. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/release_info.py +1 -1
  43. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/rename_refactor.py +63 -0
  44. sourcecode-5.8.25/src/sourcecode/resource_budget.py +205 -0
  45. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/schema_registry.py +23 -0
  46. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/timeline_cache.py +24 -4
  47. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/validation_surface.py +9 -0
  48. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/verify_edit.py +25 -2
  49. sourcecode-5.8.23/src/sourcecode/build_stamp.py +0 -105
  50. sourcecode-5.8.23/src/sourcecode/packs.py +0 -386
  51. sourcecode-5.8.23/src/sourcecode/resource_budget.py +0 -77
  52. {sourcecode-5.8.23 → sourcecode-5.8.25}/.github/workflows/build-windows.yml +0 -0
  53. {sourcecode-5.8.23 → sourcecode-5.8.25}/.github/workflows/perf-gate.yml +0 -0
  54. {sourcecode-5.8.23 → sourcecode-5.8.25}/.gitignore +0 -0
  55. {sourcecode-5.8.23 → sourcecode-5.8.25}/.ruff.toml +0 -0
  56. {sourcecode-5.8.23 → sourcecode-5.8.25}/CLAUDE.md +0 -0
  57. {sourcecode-5.8.23 → sourcecode-5.8.25}/CONTRIBUTING.md +0 -0
  58. {sourcecode-5.8.23 → sourcecode-5.8.25}/LICENSE +0 -0
  59. {sourcecode-5.8.23 → sourcecode-5.8.25}/NOTICE +0 -0
  60. {sourcecode-5.8.23 → sourcecode-5.8.25}/SECURITY.md +0 -0
  61. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/AUDIT-2026-08-22-5.8.22.md +0 -0
  62. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/AUDIT-TESTING-CORPUS-2026-08-22.md +0 -0
  63. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/COMMERCIAL-OFFER.md +0 -0
  64. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/CUSTOMER-VALIDATION.md +0 -0
  65. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/DEMO-5MIN.md +0 -0
  66. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/MODERNIZATION.md +0 -0
  67. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/PRODUCT_AUDIT.md +0 -0
  68. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/PRODUCT_IDENTITY.md +0 -0
  69. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/PRODUCT_TIERS.md +0 -0
  70. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/RC1-CHECKLIST.md +0 -0
  71. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/RELEASE-CHECKLIST.md +0 -0
  72. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/architecture/CATALOG-retrieval-intents.md +0 -0
  73. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/architecture/DESIGN-assessment-deployment-evidence.md +0 -0
  74. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/architecture/DESIGN-assessment-report.md +0 -0
  75. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/architecture/DESIGN-build-closure-provenance.md +0 -0
  76. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/architecture/DESIGN-knowledge-provider-integration.md +0 -0
  77. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/architecture/DESIGN-p5.3b-statement-surface.md +0 -0
  78. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/architecture/DESIGN-p5.5-span-index.md +0 -0
  79. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/architecture/DESIGN-p6-semantic-impact-engine.md +0 -0
  80. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/architecture/DESIGN-p6-semantic-integration-engine.md +0 -0
  81. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/architecture/DESIGN-p7-semantic-services.md +0 -0
  82. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/architecture/DESIGN-pack-gate-ci.md +0 -0
  83. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/architecture/DESIGN-pack-manifest.md +0 -0
  84. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/architecture/DESIGN-pack-mcp-api.md +0 -0
  85. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/architecture/DESIGN-robustness-security-inference.md +0 -0
  86. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/architecture/DESIGN-semantic-retrieval.md +0 -0
  87. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/architecture/EPV-p6-class-typeref.md +0 -0
  88. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/architecture/REPORT-p6-flow-analyzer-comparison.md +0 -0
  89. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/architecture/REPORT-p6-integration-detector-comparison.md +0 -0
  90. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/architecture/REPORT-p8-flow-analyzer-migration.md +0 -0
  91. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/architecture/REPORT-p9-integration-detector-migration.md +0 -0
  92. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/architecture/adr/0001-semantic-ir.md +0 -0
  93. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/architecture/adr/0002-source-evidence-boundary.md +0 -0
  94. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/architecture/adr/0003-architectural-characterization.md +0 -0
  95. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/architecture/adr/0004-semantic-retrieval.md +0 -0
  96. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/architecture/adr/0005-evidence-reconciliation.md +0 -0
  97. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/architecture/adr/0006-performance-harness.md +0 -0
  98. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/architecture/adr/0007-composition-semantics.md +0 -0
  99. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/architecture/adr/0008-answer-coherence.md +0 -0
  100. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/architecture/consumer-disposition-inventory.md +0 -0
  101. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/architecture/overview.md +0 -0
  102. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/architecture/product-architecture-review.md +0 -0
  103. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/architecture/product-strategy-layering.md +0 -0
  104. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/architecture/semantic-ir-consumer-matrix.md +0 -0
  105. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/baseline-ci.yml +0 -0
  106. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/commercial-pipeline-audit.md +0 -0
  107. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/contracts-ci.yml +0 -0
  108. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/contracts.md +0 -0
  109. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/eval/2026-06-15-petclinic-rest-issue11-vets-pagination.md +0 -0
  110. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/eval/2026-06-15-petclinic-rest-issue147-validation.md +0 -0
  111. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/eval/2026-06-15-petclinic-rest-workflow.md +0 -0
  112. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/eval/2026-06-15-phase18-openapi-surface.md +0 -0
  113. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/eval/2026-06-15-phase20-validation-surface.md +0 -0
  114. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/eval/2026-06-16-broadleaf-checkout-impact-fieldtest.md +0 -0
  115. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/eval/2026-06-16-petclinic-rest-issue11-weakness2-closed.md +0 -0
  116. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/eval/2026-06-16-spring-petclinic-issue2333-dead-vets.md +0 -0
  117. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/licensing-schema.md +0 -0
  118. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/migrate-check.md +0 -0
  119. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/pack-gate-github-actions.yml +0 -0
  120. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/pack-gate-gitlab.yml +0 -0
  121. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/perf/README.md +0 -0
  122. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/perf/baselines/2.5.15/SUMMARY.md +0 -0
  123. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/perf/baselines/2.5.15/alfresco__ask__cold.json +0 -0
  124. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/perf/baselines/2.5.15/alfresco__ask__warm.json +0 -0
  125. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/perf/baselines/2.5.15/broadleaf__ask__cold.json +0 -0
  126. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/perf/baselines/2.5.15/broadleaf__ask__warm.json +0 -0
  127. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/perf/baselines/2.5.15/eureka__ask__cold.json +0 -0
  128. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/perf/baselines/2.5.15/eureka__ask__warm.json +0 -0
  129. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/perf/baselines/2.5.15/jenkins__ask__cold.json +0 -0
  130. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/perf/baselines/2.5.15/jenkins__ask__warm.json +0 -0
  131. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/perf/baselines/2.5.15/jobrunr__ask__cold.json +0 -0
  132. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/perf/baselines/2.5.15/jobrunr__ask__warm.json +0 -0
  133. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/perf/baselines/2.5.15/keycloak__ask__cold.json +0 -0
  134. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/perf/baselines/2.5.15/keycloak__ask__warm.json +0 -0
  135. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/perf/baselines/2.5.15/neo4j__ask__cold.json +0 -0
  136. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/perf/baselines/2.5.15/neo4j__ask__warm.json +0 -0
  137. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/perf/baselines/2.5.15/ofbiz__ask__cold.json +0 -0
  138. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/perf/baselines/2.5.15/ofbiz__ask__warm.json +0 -0
  139. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/perf/baselines/2.5.15/openmrs__ask__cold.json +0 -0
  140. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/perf/baselines/2.5.15/openmrs__ask__warm.json +0 -0
  141. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/perf/baselines/2.5.15/petclinic__ask__cold.json +0 -0
  142. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/perf/baselines/2.5.15/petclinic__ask__warm.json +0 -0
  143. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/perf/baselines/2.5.16/SUMMARY.md +0 -0
  144. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/perf/baselines/2.5.16/alfresco__ask__cold.json +0 -0
  145. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/perf/baselines/2.5.16/alfresco__ask__warm.json +0 -0
  146. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/perf/baselines/2.5.16/broadleaf__ask__cold.json +0 -0
  147. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/perf/baselines/2.5.16/broadleaf__ask__warm.json +0 -0
  148. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/perf/baselines/2.5.16/eureka__ask__cold.json +0 -0
  149. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/perf/baselines/2.5.16/eureka__ask__warm.json +0 -0
  150. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/perf/baselines/2.5.16/jenkins__ask__cold.json +0 -0
  151. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/perf/baselines/2.5.16/jenkins__ask__warm.json +0 -0
  152. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/perf/baselines/2.5.16/jobrunr__ask__cold.json +0 -0
  153. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/perf/baselines/2.5.16/jobrunr__ask__warm.json +0 -0
  154. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/perf/baselines/2.5.16/keycloak__ask__cold.json +0 -0
  155. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/perf/baselines/2.5.16/keycloak__ask__warm.json +0 -0
  156. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/perf/baselines/2.5.16/neo4j__ask__cold.json +0 -0
  157. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/perf/baselines/2.5.16/neo4j__ask__warm.json +0 -0
  158. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/perf/baselines/2.5.16/ofbiz__ask__cold.json +0 -0
  159. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/perf/baselines/2.5.16/ofbiz__ask__warm.json +0 -0
  160. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/perf/baselines/2.5.16/openmrs__ask__cold.json +0 -0
  161. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/perf/baselines/2.5.16/openmrs__ask__warm.json +0 -0
  162. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/perf/baselines/2.5.16/petclinic__ask__cold.json +0 -0
  163. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/perf/baselines/2.5.16/petclinic__ask__warm.json +0 -0
  164. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/perf/baselines/gate-latest/README.md +0 -0
  165. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/perf/baselines/gate-latest/broadleaf__ask__warm.json +0 -0
  166. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/perf/baselines/gate-latest/broadleaf__endpoints__warm.json +0 -0
  167. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/perf/baselines/gate-latest/broadleaf__migrate-check__warm.json +0 -0
  168. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/perf/baselines/gate-latest/broadleaf__posture__warm.json +0 -0
  169. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/perf/baselines/gate-latest/broadleaf__spring-audit__warm.json +0 -0
  170. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/perf/baselines/gate-latest/broadleaf__validation__warm.json +0 -0
  171. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/perf/baselines/reference-best/README.md +0 -0
  172. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/perf/corpus-testing-2026-08-22.md +0 -0
  173. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/posture.md +0 -0
  174. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/privacy.md +0 -0
  175. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/pro-experience-audit.md +0 -0
  176. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/schema.md +0 -0
  177. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/spec/envelope-v1.md +0 -0
  178. {sourcecode-5.8.23 → sourcecode-5.8.25}/docs/spring-audit-ci.yml +0 -0
  179. {sourcecode-5.8.23 → sourcecode-5.8.25}/hatch_build.py +0 -0
  180. {sourcecode-5.8.23 → sourcecode-5.8.25}/scripts/compare_integration_engines.py +0 -0
  181. {sourcecode-5.8.23 → sourcecode-5.8.25}/scripts/customer_smoke_test.sh +0 -0
  182. {sourcecode-5.8.23 → sourcecode-5.8.25}/scripts/generate_jdk_exports.py +0 -0
  183. {sourcecode-5.8.23 → sourcecode-5.8.25}/scripts/perf_gate.py +0 -0
  184. {sourcecode-5.8.23 → sourcecode-5.8.25}/scripts/sync_gate_anchors.py +0 -0
  185. {sourcecode-5.8.23 → sourcecode-5.8.25}/scripts/test_fast.sh +0 -0
  186. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/adaptive_scanner.py +0 -0
  187. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/answer_bounds.py +0 -0
  188. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/archetype.py +0 -0
  189. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/architectural_baseline.py +0 -0
  190. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/architectural_delta.py +0 -0
  191. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/architecture_analyzer.py +0 -0
  192. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/architecture_summary.py +0 -0
  193. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/ast_extractor.py +0 -0
  194. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/audit_clusters.py +0 -0
  195. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/audit_recipe.py +0 -0
  196. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/audit_since.py +0 -0
  197. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/baseline_autocapture.py +0 -0
  198. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/breaking_changes.py +0 -0
  199. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/build_modules.py +0 -0
  200. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/bundled_docs.py +0 -0
  201. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/call_surface.py +0 -0
  202. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/caller_metrics.py +0 -0
  203. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/caller_reach.py +0 -0
  204. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/canonical_ir.py +0 -0
  205. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/chain_rules.py +0 -0
  206. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/change_plan.py +0 -0
  207. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/ci_output.py +0 -0
  208. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/cir_graphs.py +0 -0
  209. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/classifier.py +0 -0
  210. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/client_calls.py +0 -0
  211. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/code_notes_analyzer.py +0 -0
  212. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/compare.py +0 -0
  213. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/confidence_analyzer.py +0 -0
  214. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/constraint_diff.py +0 -0
  215. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/consumer_join.py +0 -0
  216. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/container_wiring.py +0 -0
  217. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/context_graph.py +0 -0
  218. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/context_scorer.py +0 -0
  219. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/context_summarizer.py +0 -0
  220. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/contract_diff.py +0 -0
  221. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/contract_init.py +0 -0
  222. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/contract_model.py +0 -0
  223. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/contract_pipeline.py +0 -0
  224. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/coverage_parser.py +0 -0
  225. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/data_labels.py +0 -0
  226. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/declarations.py +0 -0
  227. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/defect_classes/__init__.py +0 -0
  228. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/defect_classes/registry.json +0 -0
  229. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/defect_identity.py +0 -0
  230. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/degradation.py +0 -0
  231. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/dependency_analyzer.py +0 -0
  232. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/deployment_prefix.py +0 -0
  233. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/detach.py +0 -0
  234. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/detectors/__init__.py +0 -0
  235. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/detectors/base.py +0 -0
  236. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/detectors/csproj_parser.py +0 -0
  237. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/detectors/dart.py +0 -0
  238. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/detectors/dotnet.py +0 -0
  239. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/detectors/elixir.py +0 -0
  240. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/detectors/go.py +0 -0
  241. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/detectors/heuristic.py +0 -0
  242. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/detectors/hybrid.py +0 -0
  243. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/detectors/java.py +0 -0
  244. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/detectors/jvm_ext.py +0 -0
  245. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/detectors/nodejs.py +0 -0
  246. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/detectors/parsers.py +0 -0
  247. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/detectors/php.py +0 -0
  248. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/detectors/project.py +0 -0
  249. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/detectors/python.py +0 -0
  250. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/detectors/ruby.py +0 -0
  251. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/detectors/rust.py +0 -0
  252. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/detectors/systems.py +0 -0
  253. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/detectors/terraform.py +0 -0
  254. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/detectors/tooling.py +0 -0
  255. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/doc_analyzer.py +0 -0
  256. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/dynamic_argument_surface.py +0 -0
  257. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/empty_reach.py +0 -0
  258. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/endpoint_disposition.py +0 -0
  259. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/endpoint_literals.py +0 -0
  260. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/endpoint_metrics.py +0 -0
  261. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/entrypoint_classifier.py +0 -0
  262. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/env_analyzer.py +0 -0
  263. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/environment_resolution.py +0 -0
  264. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/error_schema.py +0 -0
  265. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/evidence_provider.py +0 -0
  266. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/explain.py +0 -0
  267. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/explain_endpoint.py +0 -0
  268. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/facts/__init__.py +0 -0
  269. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/facts/registry.json +0 -0
  270. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/file_chunker.py +0 -0
  271. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/file_classifier.py +0 -0
  272. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/filter_surface.py +0 -0
  273. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/format_contract.py +0 -0
  274. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/fqn_utils.py +0 -0
  275. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/functional_routes.py +0 -0
  276. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/gate_anchors.py +0 -0
  277. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/git_analyzer.py +0 -0
  278. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/git_checkout.py +0 -0
  279. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/github_diff.py +0 -0
  280. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/graph_analyzer.py +0 -0
  281. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/graph_evidence.py +0 -0
  282. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/hibernate_strat.py +0 -0
  283. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/identity_fallback.py +0 -0
  284. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/integration_coordinates.py +0 -0
  285. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/jdk_exports.py +0 -0
  286. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/license.py +0 -0
  287. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/manifest_cache.py +0 -0
  288. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/mcp/__init__.py +0 -0
  289. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/mcp/dependency_import.py +0 -0
  290. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/mcp/onboarding/__init__.py +0 -0
  291. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/mcp/onboarding/applier.py +0 -0
  292. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/mcp/onboarding/backup.py +0 -0
  293. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/mcp/onboarding/detector.py +0 -0
  294. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/mcp/onboarding/planner.py +0 -0
  295. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/mcp/orchestrator.py +0 -0
  296. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/mcp/registry.py +0 -0
  297. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/mcp/runner.py +0 -0
  298. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/mcp/server.py +0 -0
  299. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/mcp_nudge.py +0 -0
  300. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/metrics_analyzer.py +0 -0
  301. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/migration_apply.py +0 -0
  302. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/migration_blast.py +0 -0
  303. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/non_coverage.py +0 -0
  304. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/openapi_surface.py +0 -0
  305. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/openrewrite_recipe.py +0 -0
  306. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/output_budget.py +0 -0
  307. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/output_encoding.py +0 -0
  308. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/output_sink.py +0 -0
  309. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/parallel.py +0 -0
  310. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/parse_cache.py +0 -0
  311. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/partial_contract.py +0 -0
  312. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/path_admission.py +0 -0
  313. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/path_filters.py +0 -0
  314. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/pipe_contract.py +0 -0
  315. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/posture.py +0 -0
  316. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/pr_comment_renderer.py +0 -0
  317. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/pr_impact.py +0 -0
  318. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/prepare_context.py +0 -0
  319. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/progress.py +0 -0
  320. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/provenance.py +0 -0
  321. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/ranking_engine.py +0 -0
  322. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/readiness_timeline.py +0 -0
  323. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/reconciliation.py +0 -0
  324. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/redactor.py +0 -0
  325. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/reference_facts.py +0 -0
  326. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/relevance_scorer.py +0 -0
  327. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/remediation_diff.py +0 -0
  328. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/remedies.py +0 -0
  329. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/repo_classifier.py +0 -0
  330. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/repository_ir.py +0 -0
  331. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/retrieval/__init__.py +0 -0
  332. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/retrieval/context.py +0 -0
  333. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/retrieval/errors.py +0 -0
  334. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/retrieval/executor.py +0 -0
  335. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/retrieval/planner.py +0 -0
  336. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/retrieval/query.py +0 -0
  337. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/retrieval/request.py +0 -0
  338. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/retrieval/resolution.py +0 -0
  339. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/retrieval/result.py +0 -0
  340. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/retrieval/retriever.py +0 -0
  341. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/retrieval/runtime.py +0 -0
  342. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/retrieval/steps.py +0 -0
  343. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/retrieval/steps_endpoint.py +0 -0
  344. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/retrieval/steps_graph.py +0 -0
  345. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/retrieval/steps_impact.py +0 -0
  346. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/retrieval/steps_intf.py +0 -0
  347. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/retrieval/steps_struct.py +0 -0
  348. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/retrieval/steps_txsec.py +0 -0
  349. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/ris.py +0 -0
  350. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/risk.py +0 -0
  351. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/risk_model.py +0 -0
  352. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/rule_catalog.py +0 -0
  353. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/rule_pass.py +0 -0
  354. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/runs.py +0 -0
  355. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/runtime_classifier.py +0 -0
  356. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/sarif.py +0 -0
  357. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/scanner.py +0 -0
  358. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/schema.py +0 -0
  359. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/schema_producers.py +0 -0
  360. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/schemas/core-analysis-v1.schema.json +0 -0
  361. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/schemas/endpoints-v1.schema.json +0 -0
  362. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/schemas/envelope-v1.schema.json +0 -0
  363. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/schemas/pr-impact-v1.schema.json +0 -0
  364. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/schemas/verify-edit-v1.schema.json +0 -0
  365. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/schemas/verify-v1.schema.json +0 -0
  366. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/security_chain.py +0 -0
  367. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/security_config.py +0 -0
  368. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/security_config_scan.py +0 -0
  369. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/security_posture.py +0 -0
  370. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/selection_contract.py +0 -0
  371. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/selftest.py +0 -0
  372. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/semantic_analyzer.py +0 -0
  373. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/semantic_impact_engine.py +0 -0
  374. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/semantic_integration_engine.py +0 -0
  375. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/semantic_services.py +0 -0
  376. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/serializer.py +0 -0
  377. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/servlet_surface.py +0 -0
  378. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/source_text.py +0 -0
  379. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/spring_event_topology.py +0 -0
  380. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/spring_findings.py +0 -0
  381. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/spring_impact.py +0 -0
  382. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/spring_model.py +0 -0
  383. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/spring_profiles.py +0 -0
  384. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/spring_properties.py +0 -0
  385. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/spring_security_audit.py +0 -0
  386. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/spring_semantic.py +0 -0
  387. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/spring_tx_analyzer.py +0 -0
  388. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/sql_taint.py +0 -0
  389. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/summarizer.py +0 -0
  390. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/target_admission.py +0 -0
  391. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/telemetry/__init__.py +0 -0
  392. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/telemetry/config.py +0 -0
  393. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/telemetry/consent.py +0 -0
  394. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/telemetry/events.py +0 -0
  395. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/telemetry/filters.py +0 -0
  396. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/telemetry/transport.py +0 -0
  397. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/test_gap_ranking.py +0 -0
  398. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/test_sources.py +0 -0
  399. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/text_input.py +0 -0
  400. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/timeline.py +0 -0
  401. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/token_estimate.py +0 -0
  402. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/tree_utils.py +0 -0
  403. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/type_usage_surface.py +0 -0
  404. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/validation_inference.py +0 -0
  405. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/verify_repo.py +0 -0
  406. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/verify_rules.py +0 -0
  407. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/version_check.py +0 -0
  408. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/waivers.py +0 -0
  409. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/wired_surface.py +0 -0
  410. {sourcecode-5.8.23 → sourcecode-5.8.25}/src/sourcecode/workspace.py +0 -0
  411. {sourcecode-5.8.23 → sourcecode-5.8.25}/supabase/functions/README.md +0 -0
  412. {sourcecode-5.8.23 → sourcecode-5.8.25}/supabase/functions/get-license/index.ts +0 -0
  413. {sourcecode-5.8.23 → sourcecode-5.8.25}/supabase/functions/lemonsqueezy-webhook/index.ts +0 -0
  414. {sourcecode-5.8.23 → sourcecode-5.8.25}/supabase/functions/telemetry/index.ts +0 -0
  415. {sourcecode-5.8.23 → sourcecode-5.8.25}/supabase/sql/license_event_ordering.sql +0 -0
  416. {sourcecode-5.8.23 → sourcecode-5.8.25}/supabase/sql/licensing_schema.sql +0 -0
  417. {sourcecode-5.8.23 → sourcecode-5.8.25}/supabase/sql/telemetry_events.sql +0 -0
@@ -0,0 +1,41 @@
1
+ name: Windows battery
2
+
3
+ # AUD-601-X01 / S-10. Five defect witnesses have come from Windows and not one
4
+ # has been reproduced here, because the platform lived in a report and not in the
5
+ # battery: `envelope_status: degraded` on 13 of 13 payloads, `peak_rss_mb: 0.0`
6
+ # on four loads, a 457.6 s figure held rather than closed. This job is the
7
+ # reproduction those rows have been waiting for — it runs the same suite on the
8
+ # platform that produces them.
9
+
10
+ on:
11
+ push:
12
+ branches: ["**"]
13
+ pull_request:
14
+ workflow_dispatch:
15
+
16
+ jobs:
17
+ battery:
18
+ runs-on: windows-latest
19
+ steps:
20
+ - uses: actions/checkout@v4
21
+
22
+ - uses: actions/setup-python@v5
23
+ with:
24
+ python-version: "3.11"
25
+
26
+ - name: Install
27
+ run: |
28
+ python -m pip install --upgrade pip
29
+ pip install -e .
30
+ pip install pytest pytest-xdist
31
+
32
+ - name: Suite
33
+ run: pytest
34
+
35
+ # Named separately so a Windows-only failure is legible in the job list
36
+ # rather than one dot in nine thousand.
37
+ - name: The envelope names its command on every entry path
38
+ run: pytest tests/test_the_envelope_names_its_command_on_every_entry_path_aud601_x01.py -v
39
+
40
+ - name: A footprint sample is a number or a stated null, never a zero
41
+ run: pytest tests/test_resource_budget_d10.py -v
@@ -1,5 +1,71 @@
1
1
  # Changelog
2
2
 
3
+ ## [5.8.25] — 2026-08-23
4
+
5
+ *Version and documentation synchronization release. The audited `5.8.24` tree is
6
+ unchanged; the current package identity and user-facing documentation now report
7
+ `5.8.25`. Verification: `12,700 passed, 40 skipped` with writable cache locations.*
8
+
9
+ ## [5.8.24] — 2026-08-22
10
+
11
+ *The thirteenth audit-pass queue is closed entire: all six rows as separate
12
+ commits, the regression first, with the full suite green at 12 329 tests. Three
13
+ of the reported mechanisms are wider than reported and are corrected against
14
+ measurement; one defect was found by the battery rather than by either.*
15
+
16
+ ### Fixed — the regression the pass led with
17
+
18
+ - **`cache warm` warms every root view (`AUD-600-R01`)** — the warm built the
19
+ compact view only, so the first `--agent` call after an explicit warm paid a
20
+ full analysis: measured on `mall` (524 Java files) `--agent` 7.59 s → 0.34 s
21
+ (×22) and the raw contract view 3.20 s → 0.33 s (×9.7), against `--compact`
22
+ flat at 0.34 s. The field measured ×49.2 at ~3 000 files. Each view turns a
23
+ different set of analysers on and therefore has its own L1 core;
24
+ `cache_model.ROOT_VIEWS` is now the one authority the warm iterates and
25
+ `cache model` publishes a row per view. `--views` warms a subset, and a view
26
+ left cold is named rather than discovered by its first call.
27
+
28
+ ### Fixed — the new pack surface
29
+
30
+ - **The gate composes `verify-edit` (`AUD-600-B01`)** — a pack named *Change
31
+ Safety Gate* did not compose the change-safety command, so a working tree
32
+ that had just gained `GET /internal/dump-config` returning `System.getenv(key)`
33
+ answered `NO_CHANGES` / exit 0. It now answers `UNVERIFIED` / exit 2 with the
34
+ route and its `access_policy`. The general half is the rule: every pack
35
+ publishes a `non_coverage` block, in its payload and in `pack list`, and the
36
+ battery asserts it over the axis and rule catalogues.
37
+ - **`--compact` bounds the assessment pack (`AUD-600-B02`)** — the flag was
38
+ forwarded to the children and nothing else. It now substitutes each
39
+ component's own decision summary for its body: `mall` 608 K → 42 K estimated
40
+ tokens, `thingsboard` 8.5 K, both under the ceiling. A refusal may not deny a
41
+ variant the command declares, so `--format markdown` is derived as the
42
+ bounded rendering it is.
43
+ - **The report keeps the figures the pack carries (`AUD-600-B03`)** — three
44
+ cells read `unknown` while the figure sat in a component payload the same
45
+ pack had written. One catalogue, `MARKDOWN_FIGURES`, read with the same
46
+ reader the bounded projection uses; every remaining `unknown` names what it
47
+ looked for.
48
+ - **A write refusal is decided from `argv` (`AUD-600-D01`)** — `--output-dir`
49
+ inside a read-only tree cost 47.9 s before refusing. The destination is now
50
+ decided before any component runs and the run is served without its artefacts,
51
+ the shape `verify --init --no-write` established. Nothing is created inside
52
+ the analysed tree and every refusal is still announced with its path and type.
53
+
54
+ ### Added
55
+
56
+ - **`ask schema packs-v1` (`AUD-600-D02`)** — what each pack composes, what it
57
+ does not, its verdict vocabulary, its exit codes and the aggregation rule that
58
+ produced the verdict, generated from the pack declarations. The rule was
59
+ inferable from one run and published nowhere.
60
+ - **Per-component timing in the pack manifest** — `duration_ms` per component
61
+ and a `timing` rollup naming the slowest one, so a 47 s gate can be attributed
62
+ from outside. A clock is never an answer: `timing` is excluded from
63
+ `content_id`, or two runs of an unchanged tree would disagree.
64
+ - **The fourth exit code for packs** — when every unverified component was cut
65
+ short by its budget the pack leaves with `75` and names them in
66
+ `components_cut_short`. A mixed run keeps the stronger `2` and the verdict
67
+ word never moves.
68
+
3
69
  ## [5.8.23] — 2026-08-22
4
70
 
5
71
  *The external corpus follow-up is closed: pack output is durable by default,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sourcecode
3
- Version: 5.8.23
3
+ Version: 5.8.25
4
4
  Summary: Persistent structural context and ultra-fast repeated analysis for AI coding agents
5
5
  Project-URL: Homepage, https://github.com/HarounDominique/sourcecode
6
6
  Project-URL: Repository, https://github.com/HarounDominique/sourcecode
@@ -58,7 +58,7 @@ Description-Content-Type: text/markdown
58
58
  > question. All analysis is local and deterministic; see [Privacy](#configuration--privacy)
59
59
  > before inspecting a repository whose telemetry policy you need to control.
60
60
 
61
- ![Version](https://img.shields.io/badge/version-5.8.23-blue)
61
+ ![Version](https://img.shields.io/badge/version-5.8.25-blue)
62
62
  ![Python](https://img.shields.io/badge/python-3.9%2B-green)
63
63
 
64
64
  Copyright (c) 2026 Dominique Haroun. All rights reserved. ASK Engine 5.7.0 and
@@ -176,7 +176,7 @@ set `ASK_MAX_RSS_MB=<megabytes>`; if the process exceeds it, ASK refuses the
176
176
  answer with `MEMORY_TOO_LARGE`, including the observed peak and limit. Leave it
177
177
  unset, or set it to `0`, to disable the ceiling explicitly.
178
178
 
179
- **Current performance status.** Release 5.8.23 retains the shared Canonical IR
179
+ **Current performance status.** Release 5.8.25 retains the shared Canonical IR
180
180
  path used by `validation` and now passes that same CIR into labelled `data-exposure`
181
181
  runs; the no-label path remains parse-free. The one-model-per-declared-label path is
182
182
  also retained. These are implementation properties, not duration promises:
@@ -210,7 +210,7 @@ brew tap haroundominique/sourcecode && brew install sourcecode
210
210
  # pip / pipx
211
211
  pipx install sourcecode # or: pip install sourcecode
212
212
 
213
- ask version # ask 5.8.23 — and, on a build that has aged,
213
+ ask version # ask 5.8.25 — and, on a build that has aged,
214
214
  # how many releases have probably shipped since
215
215
  ```
216
216
 
@@ -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.8.23-blue)
13
+ ![Version](https://img.shields.io/badge/version-5.8.25-blue)
14
14
  ![Python](https://img.shields.io/badge/python-3.9%2B-green)
15
15
 
16
16
  Copyright (c) 2026 Dominique Haroun. All rights reserved. ASK Engine 5.7.0 and
@@ -128,7 +128,7 @@ set `ASK_MAX_RSS_MB=<megabytes>`; if the process exceeds it, ASK refuses the
128
128
  answer with `MEMORY_TOO_LARGE`, including the observed peak and limit. Leave it
129
129
  unset, or set it to `0`, to disable the ceiling explicitly.
130
130
 
131
- **Current performance status.** Release 5.8.23 retains the shared Canonical IR
131
+ **Current performance status.** Release 5.8.25 retains the shared Canonical IR
132
132
  path used by `validation` and now passes that same CIR into labelled `data-exposure`
133
133
  runs; the no-label path remains parse-free. The one-model-per-declared-label path is
134
134
  also retained. These are implementation properties, not duration promises:
@@ -162,7 +162,7 @@ brew tap haroundominique/sourcecode && brew install sourcecode
162
162
  # pip / pipx
163
163
  pipx install sourcecode # or: pip install sourcecode
164
164
 
165
- ask version # ask 5.8.23 — and, on a build that has aged,
165
+ ask version # ask 5.8.25 — and, on a build that has aged,
166
166
  # how many releases have probably shipped since
167
167
  ```
168
168
 
@@ -0,0 +1,251 @@
1
+ # ASK Engine 5.8.24: auditoría de regresión, dos rondas
2
+
3
+ **Fecha:** 2026-08-23
4
+ **Artefacto auditado:** release `5.8.24`, `build_commit`
5
+ `61b9c12b0e354cda157038bc8be6e19384a42368`
6
+ **Sujetos:** banco de 16 repositorios Java/Spring sobre Windows 11 Pro (ronda A, ~145
7
+ invocaciones) · MSAS / `banyan-v2`, HEAD `3dde0376`, 3 342 ficheros Java (ronda B, octava
8
+ ronda sobre el mismo árbol bit a bit, ~55 invocaciones, `ASK_READONLY=1` y techo explícito
9
+ en todas, 0 tracebacks, 0 escrituras)
10
+ **Registro relacionado:** [`DEFECT-LEDGER.md`](DEFECT-LEDGER.md), *Fourteenth Audit Pass* y
11
+ filas `AUD-601-*`
12
+
13
+ ## Resultado ejecutivo
14
+
15
+ | Ronda | Nota | Anterior | Veredicto del auditor |
16
+ |---|---:|---:|---|
17
+ | A — banco de 16 repos | `8,7/10` | 8,3 | Adoptar |
18
+ | B — MSAS | `8,88/10` | 8,84 | Comprar y actualizar, con una reserva operativa |
19
+
20
+ Ronda B marca **su propio eje de rendimiento como provisional** y nombra el confound. Ronda A
21
+ **retracta una fila propia** tras cuatro informes. Ambas cosas cuentan a favor del método y
22
+ están recogidas abajo.
23
+
24
+ ## 1. Lo primero: el sujeto es verificable
25
+
26
+ Las dos rondas leen `build_commit 61b9c12b0e35…` y el mismo
27
+ `version.provenance.closure_coverage` — **107 filas cerradas, 88 `present`, 19 `uncited`, 0
28
+ `absent`, 0 `unresolved`** — y este árbol lo reproduce exacto. Es `AUD-597-X01` y
29
+ `AUD-598-X01` cobrando juntos, y cambia una conclusión que se arrastraba dos rondas:
30
+
31
+ > En `5.8.22` y `5.8.23` la ronda B concluyó *«el fix no llegó al artefacto»*. Ahora el
32
+ > artefacto declara que sí llegó, el bloque del help demostrablemente cambió, y las dos
33
+ > líneas rotas siguen ahí. La lectura correcta pasa a ser: **el fix está y no cubre estos dos
34
+ > casos.**
35
+
36
+ El tercer estado `uncited` (19 de 107) distingue *no rastreado* de *rastreado y ausente* en
37
+ lugar de halagar el total. Es exactamente lo que `AUD-598-X01` declaró como su límite 2.
38
+
39
+ ## 2. Cerrado y verificado desde fuera
40
+
41
+ | Fila | Qué era | Medido en `5.8.24` |
42
+ |---|---|---|
43
+ | `AUD-600-R01` | `cache warm` no calentaba la vista `--agent` | **Cerrada sin residuo.** Mismo protocolo (`cache clear -y` → `cache warm` → 1.ª → 2.ª): `struts` (~3 000 ficheros) **40 911 → 688 ms**, ×59 de mejora, 2.ª a 674 ms (ratio 1,0 donde era ×49,2); `mall` 12 487 → 665 ms; `spring-petclinic` 1 615 → 683 ms |
44
+ | `AUD-600-B01` | `pack gate` no componía `verify-edit` | **Cerrada.** `commands: ['verify','verify-edit','posture','pr-impact']`. Con una ruta nueva `GET /internal/dump-config` devolviendo `System.getenv(key)`: `verdict: UNVERIFIED`, `exit_code: 2`, proceso rc 2 |
45
+ | `AUD-600-B02` | `pack assessment` sin variante acotada (rechazaba con `OUTPUT_TOO_LARGE`) | **Cerrada.** `--compact` → rc 0, **35 619 B ≈ 8,9 K tokens** contra 1 901 108 B: **×53**, con margen bajo el techo |
46
+ | `S-20` · `S-22` | dos sugerencias de diseño de la ronda anterior | **Enviadas y verificadas por ambas rondas**: `non_coverage` por pack con ids propios (`NC-PACK-001`, `NC-PACK-003`) y el registro `packs-v1` con la regla de agregación publicada (*«BLOCK wins over UNVERIFIED, and UNVERIFIED over PASS»*), cuyo `basis` dice *«Generated from the pack declarations in `packs.py` … Nothing here is maintained by hand beside the code it describes»* |
47
+
48
+ **No tomadas, y las dos rondas lo dicen sin que se les pregunte:** el bloque `intersections`
49
+ (`S-23`) y `--format sarif` (`S-28`). `--format sarif` rechaza con `INVALID_USAGE` listando
50
+ los cuatro válidos, así que no hay ambigüedad. Es la tercera confirmación independiente de
51
+ la primera y la segunda de la segunda.
52
+
53
+ ## 3. La cola nueva, con las correcciones de mecanismo
54
+
55
+ Siete filas, `AUD-601-*`. **Tres de los mecanismos reportados se corrigen al reproducir**, y
56
+ una fila sube de severidad por una mitad que nadie reportó.
57
+
58
+ ### `AUD-601-M01` — el estado de caché no es un input que un auditor pueda establecer · **P1 de método**
59
+
60
+ La ronda A **retracta `B-27` / `C3-128`** tras cuatro informes. *«`timeline` es la única orden
61
+ con forma de puerta por encima de 120 s y sin techo posible»*, publicada a 198 s, 163,9 s,
62
+ 75,2 s y 161,6 s, es un artefacto de caché. Su propio control, mismo comando, misma sesión:
63
+
64
+ | Estado | `timeline --since HEAD~3` |
65
+ |---|---:|
66
+ | 1.ª vez sobre ese rango de commits | 161 641 ms |
67
+ | Repetición inmediata | 547 ms |
68
+ | 2.ª y 3.ª seguidas | 509 ms · 505 ms |
69
+ | Tras `cache clear ./spring-security -y` | 512 ms |
70
+
71
+ La capa es **por commit muestreado**, así que un `cache clear` del repositorio no la
72
+ invalida — y el producto lo declara por escrito en `ask cache model`
73
+ (*«timeline · nothing (repeat cached) · [timeline-samples]»*). El coste atribuido cuatro
74
+ rondas al comando es el precio de sembrar una capa que la herramienta documenta como sembrada
75
+ una vez.
76
+
77
+ **Cuarto hallazgo falso que el estado de caché produce en ese banco en seis rondas** (×10,4 en
78
+ `5.8.16`, ×2,42 y ×1,39 en `5.8.18`, ×1,93 en `5.8.20`, y éste). Dos cifras más quedan sin
79
+ atribuir esta ronda por la misma razón: `B-21` (`posture ./thingsboard` 59,7 s intercalado
80
+ contra 4,9 / 4,3 s aislado) y `migrate-check ./spring-security` (×1,59, **publicado como no
81
+ atribuible** y no como regresión, con la serie de seis rondas 6,02 → 11,60 → 11,30 → 10,66 →
82
+ 6,81 → 10,82 s y tres pasadas controladas a 10 365 / 10 400 / 10 825 ms).
83
+
84
+ ⚠ **Una mitad de la fila ya está respondida y el informe no la vio:** `cache clear --global`
85
+ vacía los almacenes compartidos de parseo y CIR (`cli.py:18213`). Que `--all` los preserve es
86
+ comportamiento declarado, no el defecto. Lo que sobrevive es el presupuesto: **559,95 MB
87
+ sobre 512**, y es real.
88
+
89
+ ### `AUD-601-R01` — `peak_rss_mb: 0.0` · **P1** (el informe la clasificó P2)
90
+
91
+ Síntoma reportado: `_meta.memory.peak_rss_mb: 0.0` en cuatro cargas que abarcan 49 → 3 000
92
+ ficheros, incluida la vista de agente, contra un control independiente por `tasklist` de
93
+ ~1,4 GB sobre `thingsboard`.
94
+
95
+ Reproducido en fuente, y es **peor de lo reportado, por dos vías**:
96
+
97
+ 1. El cero **no es un descuido**. `resource_budget.peak_rss_mb()` devuelve `0.0` cuando el
98
+ módulo `resource` no existe, con el comentario *«the zero value explicitly means the
99
+ platform did not expose a sample»* — la falsedad confiada escrita como decisión, en el eje
100
+ que este producto existe para rechazar.
101
+ 2. **Mitad no reportada:** `resource_budget.exceeded()` sólo rehúsa cuando `peak > ceiling`.
102
+ Con `peak` clavado en `0.0`, **`ASK_MAX_RSS_MB` no puede dispararse nunca y
103
+ `MEMORY_TOO_LARGE` es inalcanzable en Windows** — la plataforma declarada — mientras el
104
+ help promete lo contrario (`cli.py:805`). Es una puerta que no puede fallar, la misma forma
105
+ que `AUD-597` ya rechazó una vez.
106
+
107
+ Contraste medido en este host: `peak_rss_mb: 54.69` en `posture ./spring-petclinic`. La rama
108
+ de plataforma es la falla entera.
109
+
110
+ **Aceptación:** `peak_rss_mb: null` con `peak_rss_basis` donde la plataforma no lo expone, y
111
+ medición real donde sí — el criterio del propio informe, que es el correcto. Y la mitad que es
112
+ P1: donde la muestra sea `null`, `exceeded()` debe **rehusar responder** en vez de devolver
113
+ `None`, y `MEMORY_TOO_LARGE` debe declararse no disponible en vez de quedar mudo.
114
+
115
+ ### `AUD-601-B01` — el advisory de presupuesto está en el comando que no puede aplicarlo · **P2**
116
+
117
+ La ronda A reproduce `N-02` por quinta vez (`ASK_MAX_ANALYSIS_SECONDS=1e9` y `=1_000` → rc 0,
118
+ 0 bytes de stderr, sin advisory) y lo lee como la fila que `AUD-598-B04` rechazó. Medido aquí,
119
+ **el informe mira la superficie equivocada y debajo hay un defecto real**:
120
+
121
+ - `budget_binds` **funciona** tal como se cerró: `migrate-check` publica *«1e+09s is more than
122
+ 100x the 11.3s this product has measured for `migrate-check`, so no run of it reaches that
123
+ deadline»*, con `measured_anchor_seconds: 11.3`.
124
+ - Pero `_budget_disclosure()` tiene **exactamente un call site** (`cli.py:14437`) y es ese
125
+ comando, cuyo scope es `advisory_only`.
126
+ - Los tres miembros de `phased_run.BUDGET_RUNNER_COMMANDS` — `spring-audit`, `risk`,
127
+ `audit-report`, los únicos donde un plazo puede parar algo — **no publican ningún bloque
128
+ `analysis_budget`**: medido sobre `spring-audit ./spring-petclinic` con el presupuesto
129
+ puesto, no aparece ninguna clave que contenga *budget* en todo el payload.
130
+
131
+ Quien pone un plazo en un comando que lo aplica no se entera de nada; quien lo pone en el
132
+ comando que lo ignora recibe el advisory completo. Es la clase más repetida de este ledger —
133
+ un arreglo correcto que paró en un call site — y la población que debe es
134
+ `BUDGET_RUNNER_COMMANDS ∪ {migrate-check}`, leída del registro.
135
+
136
+ ### `AUD-601-B02` — el modelo de futilidad no describe la bandera que juzga · **P3**
137
+
138
+ La ronda B abre `ASK-PACK-004`: `pack assessment .` rehúsa con *«No flag this command declares
139
+ can bring this answer under the ceiling»* mientras `--compact` lleva la misma respuesta a
140
+ ~8 800 tokens estimados — *«un agente que lea el hint nunca probará `--compact`»*.
141
+
142
+ Reproducido aquí forzando el techo
143
+ (`ASK_MAX_OUTPUT_TOKENS=2000 ask pack assessment ./spring-petclinic`), y el mecanismo lo
144
+ publica el propio rechazo: `bounded_floor_tokens: 18201`, con `bounded_floor_basis` =
145
+ *«this payload with every list emptied — the smallest answer any list-bounding flag can
146
+ produce»*, y `hint_basis.declared_flags: ["--compact"]` impreso al lado de la frase que dice
147
+ que ninguna bandera declarada ayuda.
148
+
149
+ **El suelo modela truncado de listas, y `--compact` sobre un pack no es un truncado: es una
150
+ sustitución** — reemplaza el cuerpo de cada componente por el resumen de decisión de ese
151
+ componente (`S-21` / `AUD-600-B02`, tal como se envió). El hint es honesto contra un modelo
152
+ que no describe la superficie. Nota para quien lo tome: `bounding_is_futile` **no tiene call
153
+ site de producción** (sólo `output_ceiling.py` y un test), así que este hint llega por la rama
154
+ `nothing_smaller`, no por la medida que construyó `AUD-598-B02`.
155
+
156
+ ### `AUD-601-X01` — el envelope se declara averiado en campo y aquí no reproduce · **P3, en espera**
157
+
158
+ La ronda B mide `_meta.envelope_status: "degraded"`,
159
+ `envelope_status_reason: "the running command could not be named"` y `command: "unknown"` en
160
+ **13 de 13 payloads**, y lo gradúa moderado precisamente porque el campo se autodeclara en vez
161
+ de fallar en silencio — que es la observabilidad que ese mismo auditor pidió.
162
+
163
+ Medido en este árbol al **mismo `build_commit`**, por cuatro caminos de entrada — `run_cli.py`;
164
+ `python -c "from sourcecode.cli import main_entry"` (el camino que usa `packs.py:555`); el
165
+ script instalado `ask`; y cada uno bajo `ASK_READONLY=1` y con presupuesto explícito —
166
+ `command` resuelve a `posture` siempre, `envelope_status` está ausente y `peak_rss_mb` es real.
167
+ `_active_command_context()` devuelve `""` sólo donde Click no tiene contexto actual en el
168
+ momento de emitir, y nada de aquí puede nombrar el entorno que lo produce.
169
+
170
+ **Se sostiene con la medición en ambas direcciones en vez de cerrarse**, igual que se sostuvo
171
+ la cifra de 457,6 s de `ASK-17` en Windows. Se ata a `S-10` (runner de Windows en CI), que
172
+ pasa a tener **cinco** testigos de defecto y cero reproducciones. Ése es el arreglo.
173
+
174
+ ### `AUD-601-D01` y `AUD-601-D02` — declaración, quinta ronda
175
+
176
+ `AUD-601-D01`: *«Runs now»* sigue con `posture . --diff dev:prod` y `endpoints .` sin bandera
177
+ acotada; sólo `migrate-check . --compact` la lleva. Pero **el bloque sí cambió** — `risk .` se
178
+ movió a una categoría nueva *«Too big for this session»* — así que el generador ya consulta
179
+ coste y no cubre esas dos líneas. Lo mismo para `ASK-UX-002` (`56a4bf7`, `present`) con el
180
+ payload sin mover un byte: sin bandera / `--compact` / `--limit 20` dan los tres exactamente
181
+ 71 483 tokens / 285 935 B. La frase que cierra `ASK-UX-002` **ya existe en el producto**: el
182
+ hint honesto de techo *«the weight is not in the lists they bound»* se envió para packs y no
183
+ se aplicó a `posture --diff`.
184
+
185
+ `AUD-601-D02`: `validation` gana `schema_version: validation-v1`; la identidad de repositorio
186
+ sigue ausente en `posture`, `validation` y `data-exposure`, y **`data-exposure` es
187
+ byte-idéntico entre `mall` y `struts`** — dos repositorios, una respuesta, y nada dentro que
188
+ nombre a ninguno. Es la forma de negativa idéntica de `B-14` y la razón de que las dos filas
189
+ viajen juntas.
190
+
191
+ ## 4. Regresiones
192
+
193
+ **De contenido: ninguna, en las dos rondas.** Ronda A: 17 comprobaciones intactas (poblaciones
194
+ de rutas de `halo` 158/173 y control `mall` 246/246, `route_surface_changed`, `confidence_level`
195
+ sobre 0 findings, separadores POSIX, presupuestos inválidos a exit 2, `selftest` 12 filas / 0
196
+ error, la guarda de escritura cubriendo `pack`). Ronda B: cero deriva por **octava** ronda
197
+ (`endpoints` 3763 / 725, censo 3763-3872-1120, `repo_id 7fced5c877cacfc5`; `spring-audit`
198
+ 373 / 94 / 43 003 símbolos), y el determinismo **mejoró**: `spring-audit --min-severity high`
199
+ byte-idéntico a 156 902 B en dos corridas donde antes oscilaba ±1–3 B por relojes,
200
+ `endpoints --compact` 14 702 B ×3 incluido `--no-cache`, `posture` 144 742 B ×5, y el
201
+ `content_id` de `posture` idéntico en cinco corridas (`124b61d1bf3f9d84`).
202
+
203
+ **De rendimiento: las dos rondas se contradicen, y no se declara regresión.**
204
+
205
+ | | Ronda A (banco, protocolo con `cache warm` explícito, intercalado ×4, mediana, primera descartada) | Ronda B (MSAS) |
206
+ |---|---|---|
207
+ | Lectura | **8 de 9 anclas mejoran 4–17 %**, y las seis que subieron en `5.8.23` vuelven todas a su banda o por debajo. `ask --help` a 1,74 s, bajo el ×1,25 de vigilancia | `posture` +55 %, `spring-audit` ×2,1, `migrate-check` ×2,2, `selftest` +45 %, `compare` +39 %, `export --c4` peor — y `ask . --compact` **mejor 1,3×** (94,6 → 74,9 s), `validation` 1,5×, `verify --init` 1,3× |
208
+ | Estado | firme | **provisional, declarado por su autor** |
209
+
210
+ La ronda B nombra su propio confound: su primera invocación de la sesión costó **94,9 s contra
211
+ 8,9 s** en la segunda corrida, así que la sesión arrancó fría, y su almacén de parseo bajó de
212
+ 28 106 a 22 491 entradas. Ninguna ronda se descarta y no se abre fila de regresión: los dos
213
+ protocolos difieren exactamente en la variable de la que trata `AUD-601-M01`.
214
+
215
+ **Lo que sí es señal limpia** es `S-22` cobrando: `pack gate --compact` pasó de 45,6 s a
216
+ 127,9 s y `manifest.timing` lo atribuye sin cronómetro externo —
217
+
218
+ ```
219
+ verify 566 ms
220
+ verify-edit 2854 ms <- componente NUEVO
221
+ posture 99539 ms <- 78 % del coste
222
+ pr-impact 24175 ms
223
+ sum_of_component_ms = 127134 slowest_component = "posture"
224
+ ```
225
+
226
+ La hipótesis de que el gate se ralentizó por componer un cuarto comando **queda refutada por
227
+ los datos del propio producto**: `verify-edit` cuesta 2,9 s. El coste es `posture` en forma
228
+ comparativa, 99,5 s frente a 8–9 s en forma plana. Igual con `pack assessment` a 471 s: `risk`
229
+ son 401 012 ms (85 %) y sale `PARTIAL` porque agotó el techo de 400 s que el auditor le puso.
230
+ Es la primera ronda en que un coste compuesto se atribuye sin instrumentación externa.
231
+
232
+ Detalle que merece quedar escrito: publicar `duration_ms` metió un reloj en la respuesta y rompió
233
+ el `content_id`; lo detectó su propio test (`test_two_runs_of_an_unchanged_tree_agree`) y
234
+ `timing` se unió a `_CLOCK_KEYS`.
235
+
236
+ ## 5. Movimiento en filas largas — no re-derivar
237
+
238
+ | Fila | Antes | Ahora |
239
+ |---|---|---|
240
+ | `B-11` / `AUD-598-B03` anclas de coste | 19 anclas, 17 en `5.1.0` | **16 en `5.1.0`, 1 regenerada en `5.8.23`** — primer movimiento en diez informes, consistente con que la fila cerrara la mitad de falsabilidad y deba las 16 cifras de campo |
241
+ | `B-13` identidad | `validation` sin `schema_version` | `schema_version: validation-v1`; identidad de repositorio aún ausente en tres payloads |
242
+ | `N-06` / `AUD-597-D03` | `source_file: ""` | `null` — el string vacío confiado desaparece y la ausencia se declara como ausencia. El fichero sigue sin poblarse, que es la mitad que la fila publicó como debida |
243
+ | `ASK-GATE-001` | — | **parcial, sin cambio**: `spring-audit` / `risk --ci` → 75; `migrate-check --ci` y `migrate-apply --ci` → rc 2 `No such option`. Coherente con la mitad que `AUD-597` rechazó con precio (una puerta que no puede fallar) |
244
+
245
+ ## 6. Reserva operativa publicable
246
+
247
+ Es de la ronda B y se apoya en cifras del propio producto, no en un cronómetro:
248
+
249
+ > Si el coste importa en tu pipeline, mide `spring-audit` y `migrate-check` en tu propio árbol
250
+ > antes de mover el techo de CI. Y `posture` en forma comparativa cuesta 99,5 s — dato del
251
+ > propio producto — así que `pack gate` en cada push necesita presupuesto o `--detach`.
@@ -0,0 +1,195 @@
1
+ # ASK Engine — auditoría comercial y de nicho, 2026-08-23
2
+
3
+ **Fecha:** 2026-08-23
4
+ **Artefacto auditado:** árbol `fix/aud600-queue`, `__version__` `5.8.24`, HEAD `61b9c12`
5
+ **Origen:** tercer memo estratégico externo, escrito desde seis rondas de auditoría sobre
6
+ el binario (no sobre la web). A diferencia de los dos memos de 2026-08-21, éste no audita
7
+ defectos: audita **posicionamiento, unidad de venta y techo de precio**.
8
+ **Auditoría de defectos del mismo día:**
9
+ [`AUDIT-2026-08-23-5.8.24.md`](AUDIT-2026-08-23-5.8.24.md) — dos rondas técnicas sobre el
10
+ mismo `build_commit`. Confirma desde el campo dos cosas que este memo también toca: `B-30`
11
+ (los 20 contratos derivados son de un solo tipo, cuarta ronda) y que `--format sarif` no
12
+ existe todavía, y **contradice al memo en una**: `pack gate` publica ya el coste por
13
+ componente, así que la composición no es opaca.
14
+ **Registros relacionados:** [`EXECUTION-PLAN-12MO.md`](EXECUTION-PLAN-12MO.md) (autoridad
15
+ sobre estrategia), [`DEVELOPMENT-ROADMAP.md`](DEVELOPMENT-ROADMAP.md) → *Product-strategy
16
+ queue* (mecanismo y orden de ataque), [`DEFECT-LEDGER.md`](DEFECT-LEDGER.md) clase `P`.
17
+
18
+ ## Alcance y método
19
+
20
+ El memo se depuró fila a fila contra el árbol antes de aceptarse, que es el mismo
21
+ procedimiento que los dos memos anteriores. Lo que sigue separa tres cosas que el memo
22
+ mezcla: **hechos que no se sostienen en HEAD**, **propuestas aceptadas** y **propuestas
23
+ rechazadas con motivo**. Ninguna cifra de esta página se recuerda; todas se leyeron del
24
+ árbol el 2026-08-23.
25
+
26
+ ## 1. Correcciones de hecho
27
+
28
+ Seis afirmaciones del memo cambian de estado al medirse. Tres de ellas **cambian la
29
+ prioridad de la propuesta que sostienen**, que es la razón de poner esta sección primero.
30
+
31
+ | Afirmación del memo | Estado medido en HEAD |
32
+ |---|---|
33
+ | «la caché de parseo no sostiene 16 repositorios → **la caché es el roadmap**» | Capacidad **sí**, rendimiento **no**. `ASK-17` ya cerró con medición controlada: el sweep LRU cuesta **~3 %**, no el 66 % que se le atribuyó, y esa cifra ya fue retractada con número. La ley medida es **~20 KB de store por fichero Java** → ~500 MB por repositorio de 24 000 ficheros. Es un problema de **dimensionado y planificación de flota**, no de motor. La propuesta sobrevive; su precondición declarada, no |
34
+ | «`cache clear --all` no reduce el almacén compartido» | Cierto, y **por diseño declarado**. Existe `--global` (`cli.py:18213`), que sí vacía los almacenes compartidos de parseo y CIR, y el propio help dice por qué son dos banderas distintas. El memo no vio la bandera |
35
+ | «los payloads ya están en memoria dentro de `pack`, así que la intersección es gratis» | **Falso**. `packs.py:555` lanza cada componente en un `subprocess` (`sys.executable -c …`). Pero la conclusión **mejora**: los artefactos quedan en disco indexados por `manifest.components`, así que la intersección es un *join sobre respuestas ya publicadas* — más barato de construir, y **no rompe «una autoridad por hecho»**, que es lo que sí haría recalcularla en un proceso compartido |
36
+ | «`verify --init` sólo sabe derivar `forbid_finding`; los 20 contratos son de un solo tipo» | Mecanismo equivocado. `verify_rules._KINDS` son **tres** (`forbidden_edge`, `require_endpoint_security`, `forbid_finding`) y `contract_init` deriva las tres, con su motivo escrito en el docstring del módulo. El 20/20 observado es el efecto de los umbrales (`MIN_EDGE_POPULATION=5`, `MAX_EDGE_RULES=5`, `MIN_ENDPOINTS_PER_PREFIX=3`) más el auto-descarte de reglas violadas en el árbol del que se derivan. **El síntoma es real y la causa no es la que se reporta**: la derivación degenera en silencio y no dice por qué |
37
+ | «las anclas de coste llevan diez informes en 5.1.0» | **Medio cerrado tras `5.8.24`** (`c63cb24`, `AUD-598-B03`): cada ancla publica ya su **sujeto** y su **build**, y donde la cifra precede al sello el commit va como `unrecorded` en vez de inventarse. Quedan las 16 cifras de campo sin re-medir, que es la mitad que sigue abierta |
38
+ | «el ledger es un activo que se vuelve pasivo si miente una vez» | El mecanismo ya envió: `CLOSURE_PROVENANCE` (`AUD-598-X01`) está en el árbol y **cazó su primer caso**. Los dos límites que declara — ancestría ≠ efecto, y una fila no rastreada es incontradecible — siguen siendo los límites correctos |
39
+
40
+ **Y el hallazgo que sostiene el resto:** la clave de join **existe**.
41
+ `CanonicalEndpoint.make_id` (`canonical_ir.py:480`) produce un identificador de endpoint
42
+ estable, y `posture`, `risk`, `pr_impact`, `spring_impact` y `data_exposure` lo cargan
43
+ todas. Eso convierte la propuesta de intersecciones de investigación en trabajo acotado.
44
+
45
+ ## 2. Veredicto por propuesta
46
+
47
+ | Propuesta del memo | Veredicto | Destino |
48
+ |---|---|---|
49
+ | Bloque `intersections` | **CONSTRUIR YA** | `S-23`, ya abierta desde la 13.ª pasada — el memo la confirma desde fuera y por segunda vez |
50
+ | SARIF de **salida** | **CONSTRUIR YA** | `S-28` (nueva) |
51
+ | Página pública del ledger, **proyectada** | **CONSTRUIR YA** | `S-29` (nueva) — nunca el `.md` crudo, ver §4 |
52
+ | `--since` + `--budget` sobre las vistas existentes | **CONSTRUIR YA** | `S-30` (nueva), como la mitad sin estado de su idea |
53
+ | `ask fleet <manifest.yml>` | **CONSTRUIR DESPUÉS** (trimestre) | `S-18` ya existe (*de repositorio a organización*); la precondición declarada por el memo es la equivocada |
54
+ | Contratos de arquitectura estilo ArchUnit | **CONSTRUIR DESPUÉS, recortado** | Dos tipos de regla nuevos, no un producto (§3) |
55
+ | Deriva arquitectónica en el tiempo | **RELATO, NO CÓDIGO** | `baseline`, `trend` y `regress` ya existen. Falta la diapositiva, no el comando |
56
+ | Medir «tokens por tarea de agente, con y sin ASK» | **CONSTRUIR YA, con condiciones** | `S-30`; bajo la regla de benchmarks honestos y con arnés reproducible en el repo |
57
+ | `ask context --since <sha> --budget N` con sesión de agente | **RECHAZADA la forma, aceptado el diagnóstico** | §5 de `EXECUTION-PLAN-12MO.md` |
58
+ | Canal `stable` mensual junto a `latest` | **APLAZADA** | Precondición incumplida: no hay **ni un tag** |
59
+ | Escrow de código / cláusula de liberación | **RECHAZADA hoy** | §5 de `EXECUTION-PLAN-12MO.md` |
60
+ | Canal indirecto de consultoras para `assessment` | **RECHAZADA como construcción** | La versión barata ya existe (`--format markdown`) |
61
+ | «la caché es el roadmap» | **RECHAZADA** | Refutada con medición (§1) |
62
+ | «no pasar de cuatro packs» | **ACEPTADA** | Coincide con `S-26`, que ya fija el tope en cuatro |
63
+
64
+ ## 3. Detalle de las tres que importan
65
+
66
+ ### `intersections` — la única que ningún competidor copia
67
+
68
+ No como comando nuevo: como **bloque derivado dentro del payload del pack**, calculado por
69
+ join sobre `manifest.components`. Tres reglas que la mantienen honesta y que son las mismas
70
+ que ya rigen los packs:
71
+
72
+ - nunca afirma más de lo que afirmaron sus componentes;
73
+ - publica `non_coverage` diciendo **qué eje no pudo unirse y por qué** — un endpoint que
74
+ `posture` ve y `pr-impact` no es una intersección que no se puede computar, no una
75
+ intersección vacía;
76
+ - **tres o cuatro intersecciones nombradas**, nunca un lenguaje de consulta. Un lenguaje de
77
+ consulta devuelve al cliente a su `jq` con más pasos intermedios.
78
+
79
+ El argumento comercial del memo se acepta entero y es el mejor de los tres memos recibidos:
80
+ un listado de hallazgos es un *commodity* y se compara por número; una intersección de
81
+ cuatro autoridades es una **conclusión**, y las conclusiones no se comparan por número.
82
+
83
+ ### Contratos de arquitectura — dos reglas, no un producto
84
+
85
+ De los cinco contratos que propone el memo, dos valen, uno vale y va primero, y dos no:
86
+
87
+ | Contrato propuesto | Veredicto |
88
+ |---|---|
89
+ | `max_unauthenticated_routes: 17` | **Sí, y primero.** Es un trinquete, cuesta casi nada sobre el censo que `--init` ya calcula, y es el único de la lista que se vende solo |
90
+ | `layer_may_not_call(controller → repository)` | **Sí.** Es lo que un usuario de ArchUnit escribe a mano y lo que necesita el grafo resuelto que sólo este build tiene |
91
+ | `module_may_not_depend_on(billing → shipping)` | **Sí**, mismo argumento |
92
+ | `no_new_unauthenticated_route` | Es el trinquete anterior con otro nombre |
93
+ | `no_transactional_outside(service)` | El modelo tx existe, pero es el que menos comprador nombrado tiene. Va detrás |
94
+
95
+ **Y no se construye un DSL de reglas ni un ecosistema de plugins.** El memo cita «grep
96
+ creció por las reglas de la comunidad» como virtud a imitar; para este producto es la
97
+ trampa: reglas de terceros rompen «una autoridad por hecho», que es el diferencial entero.
98
+
99
+ El censo que `--init` ya imprime y no usa (`contract_init.py:425`, *«Endpoints seen: 19 ·
100
+ types seen: 41»*) es exactamente el insumo del trinquete. Ahí el memo acierta de pleno.
101
+
102
+ ### `fleet` — la lectura comercial es correcta, la precondición no
103
+
104
+ El instinto es correcto y el argumento de precio también: el comprador real de Java/Spring
105
+ tiene 40 microservicios, no un monolito, y la pregunta que hace — *«¿cuántas rutas sin
106
+ autenticar tiene mi organización, y cuáles cambiaron esta semana?»* — hoy no tiene comando.
107
+ Pasar de precio por desarrollador a licencia de sitio es la diferencia entre una suscripción
108
+ y un contrato anual.
109
+
110
+ Lo que no es cierto es que la precondición sea reescribir la caché. Las precondiciones
111
+ reales son tres, y ninguna es de motor:
112
+
113
+ 1. identidad por repositorio y contrato de *rollup* — la misma forma que `pack` ya tiene;
114
+ 2. `non_coverage` **por repositorio**, porque una flota donde un repositorio no se pudo
115
+ analizar y el total no lo dice es exactamente la falsedad confiada que este producto
116
+ existe para no cometer;
117
+ 3. un documento de dimensionado con la ley ya medida (~500 MB de store por repositorio de
118
+ 24 000 ficheros) y la cobertura por repositorio que `cache status` publica desde `5.8.5`.
119
+
120
+ `fleet` es orquestación sobre N subprocesos. Es la misma forma que `pack`, un nivel arriba —
121
+ que es justo lo que el memo dice, con la precondición cambiada.
122
+
123
+ ## 4. Lo que el memo no vio
124
+
125
+ Cinco puntos. El primero es, en mi lectura, más grave que cualquier cosa de su propia lista.
126
+
127
+ **1 · El eje de licencia contradice al comprador que el memo identifica correctamente.**
128
+ `is_large_repo()` cuenta ficheros Java **por repositorio** contra
129
+ `_FREE_REPO_JAVA_FILE_LIMIT = 500` (`license.py:121`, `:521`). Una organización de 40
130
+ microservicios de 300 ficheros cada uno **paga cero**: ningún repositorio cruza el umbral,
131
+ y el único eje de automatización que existe es la cuota de `delta`. El comprador que el memo
132
+ describe bien — el que tiene flota y necesita defendibilidad — **no es cobrable hoy**. Es el
133
+ mayor defecto comercial del producto y no está en el informe. `fleet` no es sólo el techo del
134
+ precio: es el **suelo**. Filas `P-13` en el ledger y `S-27` en la cola.
135
+
136
+ **2 · No hay tags, y por eso su riesgo de cadencia está mal ordenado.** El problema no es
137
+ publicar cuatro veces al día; es que ninguna de esas publicaciones tiene identidad en git.
138
+ Un canal `stable` mensual sobre un repositorio sin un solo tag no resuelve nada: fija una
139
+ versión que nadie puede nombrar. `build_commit` ya envía dentro del wheel (`AUD-597-X01`,
140
+ `354338b`); el tag no. Se arregla el tag **antes** de inventar canales.
141
+
142
+ **3 · Riesgo de publicar el ledger que el memo no evaluó.** `docs/DEFECT-LEDGER.md` lleva
143
+ rutas absolutas de la máquina del mantenedor, nombres de repositorios de terceros usados
144
+ como sujetos de evaluación, y autocrítica a un nivel de detalle que un comprador puede leer
145
+ como inestabilidad en vez de como rigor. Publicar el crudo filtra e insinúa que esos
146
+ proyectos fueron auditados. Lo que se publica es una **proyección generada**: filas abiertas
147
+ y cerradas por versión, mediana de días hasta el cierre, y las declinadas con su motivo.
148
+ Cifras, no prosa. Fila `P-14`.
149
+
150
+ **4 · `enrich` debe ser gratis para siempre.** El memo acierta en que es la mejor cuña del
151
+ catálogo: convierte a un competidor en entrada, no sustituye nada y hace que la herramienta
152
+ que el cliente ya paga valga más. Una cuña de pago no es una cuña. Hoy está en
153
+ `experimental` porque ninguna ronda de campo lo ha ejercido de extremo a extremo — eso es
154
+ una fila de validación, no una razón para cobrarlo.
155
+
156
+ **5 · La superficie de 41 comandos de primer nivel no es un problema de ingeniería.** La
157
+ queja del memo (*«`enrich` es la orden nº 40 de una lista»*) se disuelve documentando la
158
+ jerarquía que ya existe: **los packs son el producto, los comandos son el SDK**. No hace
159
+ falta retirar nada; hace falta decir cuál de las dos superficies se compra.
160
+
161
+ ## 5. Lo que el memo acierta y conviene no diluir
162
+
163
+ Dos cosas, y ambas se aceptan sin recorte.
164
+
165
+ **El nicho está mejor descrito en este memo que en la documentación propia.** «Contabilidad
166
+ epistémica sobre un grafo de Spring» nombra lo que el producto hace mejor que nadie y ya
167
+ ejecuta: unidad, población, base, techo y no-cobertura en cada cifra. Y define al comprador
168
+ mejor que la segmentación actual: no es quien quiere más hallazgos — ése compra Snyk — sino
169
+ **quien tiene que defender una decisión ante alguien**. Los cuatro compradores que enumera
170
+ (arquitecto justificando una migración, lead aprobando un PR de riesgo, consultor entregando
171
+ una auditoría, agente que no puede inventar) pagan por defendibilidad, no por cobertura.
172
+
173
+ **La velocidad de remediación medida es material comercial y hoy vive en un `.md`.** Veinte
174
+ filas cerradas y verificadas en campo en veinticuatro horas, con mecanismo en fuente por
175
+ fila y dos rechazadas con su medición y su precio. La objeción número uno a un producto
176
+ propietario de un solo autor es *«¿y si desaparece?»*, y la respuesta más dura no es una
177
+ promesa de SLA: son las cifras del propio historial. Convierte el mayor riesgo percibido en
178
+ la prueba más fuerte — con la redacción de §4.3.
179
+
180
+ ## 6. Orden de ejecución
181
+
182
+ Difiere del que propone el memo en el segundo puesto, y la diferencia es la corrección de §1.
183
+
184
+ 1. **`intersections`** (`S-23`) — coincide con el memo. Es la semana mejor invertida y lo
185
+ único de la lista que ningún competidor puede copiar sin reconstruir el IR.
186
+ 2. **Eje de licencia (`S-27`) y `fleet` (`S-18`)** — no «la caché». Es a la vez el techo y el
187
+ suelo del precio, y hoy el comprador correcto sale gratis.
188
+ 3. **Tag de release** (horas) → **SARIF de salida** (`S-28`) y **página del ledger generada**
189
+ (`S-29`) en el mismo incremento. Ambos baratos, ambos atacan objeciones de compra
190
+ distintas.
191
+
192
+ Y la cuarta que el memo pone aparte — medir tokens por tarea de agente con y sin ASK — se
193
+ acepta con una condición: arnés reproducible en el repositorio y la regla de benchmarks
194
+ honestos aplicada, mirando «qué no funcionó» antes de enseñar nada. Un número sobre agentes
195
+ que no se puede reproducir se vuelve en contra en la primera demo.