sourcecode 5.8.20__tar.gz → 5.8.22__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 (399) hide show
  1. {sourcecode-5.8.20 → sourcecode-5.8.22}/.gitignore +2 -0
  2. {sourcecode-5.8.20 → sourcecode-5.8.22}/CHANGELOG.md +96 -0
  3. {sourcecode-5.8.20 → sourcecode-5.8.22}/CONTRIBUTING.md +12 -0
  4. {sourcecode-5.8.20 → sourcecode-5.8.22}/PKG-INFO +31 -6
  5. {sourcecode-5.8.20 → sourcecode-5.8.22}/README.md +26 -4
  6. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/CACHE.md +1 -0
  7. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/COMMERCIAL-OFFER.md +6 -0
  8. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/DEFECT-LEDGER.md +428 -8
  9. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/DEVELOPMENT-ROADMAP.md +262 -134
  10. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/EXECUTION-PLAN-12MO.md +58 -22
  11. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/EXECUTIVE-ROADMAP.md +284 -1
  12. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/MANUAL-USUARIO.md +25 -1
  13. sourcecode-5.8.22/docs/PRODUCT-ROUTE.md +94 -0
  14. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/PRODUCT_TIERS.md +14 -0
  15. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/USER_GUIDE.md +22 -2
  16. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/spec/envelope-v1.md +2 -0
  17. {sourcecode-5.8.20 → sourcecode-5.8.22}/pyproject.toml +15 -2
  18. sourcecode-5.8.22/scripts/test_fast.sh +15 -0
  19. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/__init__.py +1 -1
  20. sourcecode-5.8.22/src/sourcecode/analysis_budget.py +66 -0
  21. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/audit_report.py +18 -0
  22. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/baseline_autocapture.py +18 -1
  23. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/cache_model.py +7 -2
  24. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/canonical_ir.py +41 -5
  25. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/cli.py +1213 -124
  26. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/compare.py +3 -0
  27. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/defect_classes/__init__.py +19 -0
  28. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/defect_classes/registry.json +4 -5
  29. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/envelope.py +81 -0
  30. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/error_schema.py +24 -0
  31. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/explain_endpoint.py +7 -0
  32. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/format_contract.py +3 -0
  33. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/migrate_check.py +211 -114
  34. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/non_coverage.py +45 -4
  35. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/output_bounds.py +104 -1
  36. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/output_ceiling.py +65 -4
  37. sourcecode-5.8.22/src/sourcecode/packs.py +155 -0
  38. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/partial_contract.py +21 -0
  39. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/path_filters.py +67 -4
  40. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/perf.py +92 -2
  41. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/phased_run.py +28 -0
  42. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/posture.py +35 -6
  43. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/prepare_context.py +91 -12
  44. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/release_info.py +1 -1
  45. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/rename_refactor.py +26 -8
  46. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/repository_ir.py +239 -24
  47. sourcecode-5.8.22/src/sourcecode/resource_budget.py +77 -0
  48. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/risk.py +167 -12
  49. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/schema_registry.py +12 -0
  50. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/schemas/endpoints-v1.schema.json +15 -0
  51. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/schemas/envelope-v1.schema.json +10 -0
  52. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/selftest.py +260 -27
  53. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/serializer.py +66 -6
  54. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/spring_findings.py +32 -8
  55. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/spring_model.py +53 -3
  56. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/spring_security_audit.py +23 -11
  57. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/summarizer.py +148 -9
  58. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/validation_surface.py +8 -0
  59. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/verify_edit.py +242 -37
  60. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/verify_repo.py +22 -2
  61. sourcecode-5.8.20/src/sourcecode/analysis_budget.py +0 -27
  62. {sourcecode-5.8.20 → sourcecode-5.8.22}/.github/workflows/build-windows.yml +0 -0
  63. {sourcecode-5.8.20 → sourcecode-5.8.22}/.github/workflows/perf-gate.yml +0 -0
  64. {sourcecode-5.8.20 → sourcecode-5.8.22}/.ruff.toml +0 -0
  65. {sourcecode-5.8.20 → sourcecode-5.8.22}/CLAUDE.md +0 -0
  66. {sourcecode-5.8.20 → sourcecode-5.8.22}/LICENSE +0 -0
  67. {sourcecode-5.8.20 → sourcecode-5.8.22}/NOTICE +0 -0
  68. {sourcecode-5.8.20 → sourcecode-5.8.22}/SECURITY.md +0 -0
  69. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/CUSTOMER-VALIDATION.md +0 -0
  70. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/DEMO-5MIN.md +0 -0
  71. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/MODERNIZATION.md +0 -0
  72. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/PRODUCT_AUDIT.md +0 -0
  73. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/PRODUCT_IDENTITY.md +0 -0
  74. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/RC1-CHECKLIST.md +0 -0
  75. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/RELEASE-CHECKLIST.md +0 -0
  76. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/architecture/CATALOG-retrieval-intents.md +0 -0
  77. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/architecture/DESIGN-knowledge-provider-integration.md +0 -0
  78. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/architecture/DESIGN-p5.3b-statement-surface.md +0 -0
  79. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/architecture/DESIGN-p5.5-span-index.md +0 -0
  80. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/architecture/DESIGN-p6-semantic-impact-engine.md +0 -0
  81. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/architecture/DESIGN-p6-semantic-integration-engine.md +0 -0
  82. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/architecture/DESIGN-p7-semantic-services.md +0 -0
  83. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/architecture/DESIGN-robustness-security-inference.md +0 -0
  84. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/architecture/DESIGN-semantic-retrieval.md +0 -0
  85. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/architecture/EPV-p6-class-typeref.md +0 -0
  86. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/architecture/REPORT-p6-flow-analyzer-comparison.md +0 -0
  87. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/architecture/REPORT-p6-integration-detector-comparison.md +0 -0
  88. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/architecture/REPORT-p8-flow-analyzer-migration.md +0 -0
  89. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/architecture/REPORT-p9-integration-detector-migration.md +0 -0
  90. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/architecture/adr/0001-semantic-ir.md +0 -0
  91. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/architecture/adr/0002-source-evidence-boundary.md +0 -0
  92. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/architecture/adr/0003-architectural-characterization.md +0 -0
  93. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/architecture/adr/0004-semantic-retrieval.md +0 -0
  94. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/architecture/adr/0005-evidence-reconciliation.md +0 -0
  95. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/architecture/adr/0006-performance-harness.md +0 -0
  96. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/architecture/adr/0007-composition-semantics.md +0 -0
  97. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/architecture/adr/0008-answer-coherence.md +0 -0
  98. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/architecture/consumer-disposition-inventory.md +0 -0
  99. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/architecture/overview.md +0 -0
  100. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/architecture/product-architecture-review.md +0 -0
  101. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/architecture/product-strategy-layering.md +0 -0
  102. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/architecture/semantic-ir-consumer-matrix.md +0 -0
  103. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/architecture/semantic-ir-roadmap.md +0 -0
  104. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/baseline-ci.yml +0 -0
  105. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/commercial-pipeline-audit.md +0 -0
  106. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/contracts-ci.yml +0 -0
  107. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/contracts.md +0 -0
  108. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/eval/2026-06-15-petclinic-rest-issue11-vets-pagination.md +0 -0
  109. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/eval/2026-06-15-petclinic-rest-issue147-validation.md +0 -0
  110. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/eval/2026-06-15-petclinic-rest-workflow.md +0 -0
  111. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/eval/2026-06-15-phase18-openapi-surface.md +0 -0
  112. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/eval/2026-06-15-phase20-validation-surface.md +0 -0
  113. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/eval/2026-06-16-broadleaf-checkout-impact-fieldtest.md +0 -0
  114. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/eval/2026-06-16-petclinic-rest-issue11-weakness2-closed.md +0 -0
  115. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/eval/2026-06-16-spring-petclinic-issue2333-dead-vets.md +0 -0
  116. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/licensing-schema.md +0 -0
  117. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/migrate-check.md +0 -0
  118. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/perf/README.md +0 -0
  119. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/perf/REGRESSION-GATE.md +0 -0
  120. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/perf/baselines/2.5.15/SUMMARY.md +0 -0
  121. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/perf/baselines/2.5.15/alfresco__ask__cold.json +0 -0
  122. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/perf/baselines/2.5.15/alfresco__ask__warm.json +0 -0
  123. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/perf/baselines/2.5.15/broadleaf__ask__cold.json +0 -0
  124. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/perf/baselines/2.5.15/broadleaf__ask__warm.json +0 -0
  125. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/perf/baselines/2.5.15/eureka__ask__cold.json +0 -0
  126. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/perf/baselines/2.5.15/eureka__ask__warm.json +0 -0
  127. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/perf/baselines/2.5.15/jenkins__ask__cold.json +0 -0
  128. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/perf/baselines/2.5.15/jenkins__ask__warm.json +0 -0
  129. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/perf/baselines/2.5.15/jobrunr__ask__cold.json +0 -0
  130. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/perf/baselines/2.5.15/jobrunr__ask__warm.json +0 -0
  131. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/perf/baselines/2.5.15/keycloak__ask__cold.json +0 -0
  132. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/perf/baselines/2.5.15/keycloak__ask__warm.json +0 -0
  133. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/perf/baselines/2.5.15/neo4j__ask__cold.json +0 -0
  134. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/perf/baselines/2.5.15/neo4j__ask__warm.json +0 -0
  135. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/perf/baselines/2.5.15/ofbiz__ask__cold.json +0 -0
  136. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/perf/baselines/2.5.15/ofbiz__ask__warm.json +0 -0
  137. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/perf/baselines/2.5.15/openmrs__ask__cold.json +0 -0
  138. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/perf/baselines/2.5.15/openmrs__ask__warm.json +0 -0
  139. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/perf/baselines/2.5.15/petclinic__ask__cold.json +0 -0
  140. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/perf/baselines/2.5.15/petclinic__ask__warm.json +0 -0
  141. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/perf/baselines/2.5.16/SUMMARY.md +0 -0
  142. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/perf/baselines/2.5.16/alfresco__ask__cold.json +0 -0
  143. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/perf/baselines/2.5.16/alfresco__ask__warm.json +0 -0
  144. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/perf/baselines/2.5.16/broadleaf__ask__cold.json +0 -0
  145. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/perf/baselines/2.5.16/broadleaf__ask__warm.json +0 -0
  146. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/perf/baselines/2.5.16/eureka__ask__cold.json +0 -0
  147. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/perf/baselines/2.5.16/eureka__ask__warm.json +0 -0
  148. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/perf/baselines/2.5.16/jenkins__ask__cold.json +0 -0
  149. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/perf/baselines/2.5.16/jenkins__ask__warm.json +0 -0
  150. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/perf/baselines/2.5.16/jobrunr__ask__cold.json +0 -0
  151. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/perf/baselines/2.5.16/jobrunr__ask__warm.json +0 -0
  152. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/perf/baselines/2.5.16/keycloak__ask__cold.json +0 -0
  153. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/perf/baselines/2.5.16/keycloak__ask__warm.json +0 -0
  154. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/perf/baselines/2.5.16/neo4j__ask__cold.json +0 -0
  155. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/perf/baselines/2.5.16/neo4j__ask__warm.json +0 -0
  156. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/perf/baselines/2.5.16/ofbiz__ask__cold.json +0 -0
  157. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/perf/baselines/2.5.16/ofbiz__ask__warm.json +0 -0
  158. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/perf/baselines/2.5.16/openmrs__ask__cold.json +0 -0
  159. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/perf/baselines/2.5.16/openmrs__ask__warm.json +0 -0
  160. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/perf/baselines/2.5.16/petclinic__ask__cold.json +0 -0
  161. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/perf/baselines/2.5.16/petclinic__ask__warm.json +0 -0
  162. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/perf/baselines/gate-latest/README.md +0 -0
  163. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/perf/baselines/gate-latest/broadleaf__ask__warm.json +0 -0
  164. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/perf/baselines/gate-latest/broadleaf__endpoints__warm.json +0 -0
  165. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/perf/baselines/gate-latest/broadleaf__migrate-check__warm.json +0 -0
  166. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/perf/baselines/gate-latest/broadleaf__posture__warm.json +0 -0
  167. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/perf/baselines/gate-latest/broadleaf__spring-audit__warm.json +0 -0
  168. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/perf/baselines/gate-latest/broadleaf__validation__warm.json +0 -0
  169. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/perf/baselines/reference-best/README.md +0 -0
  170. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/posture.md +0 -0
  171. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/privacy.md +0 -0
  172. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/pro-experience-audit.md +0 -0
  173. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/schema.md +0 -0
  174. {sourcecode-5.8.20 → sourcecode-5.8.22}/docs/spring-audit-ci.yml +0 -0
  175. {sourcecode-5.8.20 → sourcecode-5.8.22}/hatch_build.py +0 -0
  176. {sourcecode-5.8.20 → sourcecode-5.8.22}/scripts/compare_integration_engines.py +0 -0
  177. {sourcecode-5.8.20 → sourcecode-5.8.22}/scripts/customer_smoke_test.sh +0 -0
  178. {sourcecode-5.8.20 → sourcecode-5.8.22}/scripts/generate_jdk_exports.py +0 -0
  179. {sourcecode-5.8.20 → sourcecode-5.8.22}/scripts/perf_gate.py +0 -0
  180. {sourcecode-5.8.20 → sourcecode-5.8.22}/scripts/perf_harness.py +0 -0
  181. {sourcecode-5.8.20 → sourcecode-5.8.22}/scripts/sync_gate_anchors.py +0 -0
  182. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/adaptive_scanner.py +0 -0
  183. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/answer_bounds.py +0 -0
  184. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/archetype.py +0 -0
  185. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/architectural_baseline.py +0 -0
  186. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/architectural_delta.py +0 -0
  187. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/architecture_analyzer.py +0 -0
  188. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/architecture_summary.py +0 -0
  189. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/ast_extractor.py +0 -0
  190. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/audit_clusters.py +0 -0
  191. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/audit_recipe.py +0 -0
  192. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/audit_since.py +0 -0
  193. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/breaking_changes.py +0 -0
  194. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/build_modules.py +0 -0
  195. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/build_stamp.py +0 -0
  196. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/bundled_docs.py +0 -0
  197. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/cache.py +0 -0
  198. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/call_surface.py +0 -0
  199. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/caller_metrics.py +0 -0
  200. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/caller_reach.py +0 -0
  201. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/chain_rules.py +0 -0
  202. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/change_plan.py +0 -0
  203. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/ci_output.py +0 -0
  204. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/cir_graphs.py +0 -0
  205. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/classifier.py +0 -0
  206. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/client_calls.py +0 -0
  207. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/code_notes_analyzer.py +0 -0
  208. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/confidence_analyzer.py +0 -0
  209. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/constraint_diff.py +0 -0
  210. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/consumer_join.py +0 -0
  211. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/container_wiring.py +0 -0
  212. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/context_cache.py +0 -0
  213. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/context_graph.py +0 -0
  214. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/context_scorer.py +0 -0
  215. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/context_summarizer.py +0 -0
  216. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/contract_diff.py +0 -0
  217. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/contract_init.py +0 -0
  218. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/contract_model.py +0 -0
  219. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/contract_pipeline.py +0 -0
  220. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/coverage_parser.py +0 -0
  221. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/data_exposure.py +0 -0
  222. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/data_labels.py +0 -0
  223. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/declarations.py +0 -0
  224. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/defect_identity.py +0 -0
  225. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/degradation.py +0 -0
  226. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/dependency_analyzer.py +0 -0
  227. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/deployment_prefix.py +0 -0
  228. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/detach.py +0 -0
  229. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/detectors/__init__.py +0 -0
  230. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/detectors/base.py +0 -0
  231. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/detectors/csproj_parser.py +0 -0
  232. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/detectors/dart.py +0 -0
  233. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/detectors/dotnet.py +0 -0
  234. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/detectors/elixir.py +0 -0
  235. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/detectors/go.py +0 -0
  236. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/detectors/heuristic.py +0 -0
  237. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/detectors/hybrid.py +0 -0
  238. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/detectors/java.py +0 -0
  239. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/detectors/jvm_ext.py +0 -0
  240. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/detectors/nodejs.py +0 -0
  241. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/detectors/parsers.py +0 -0
  242. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/detectors/php.py +0 -0
  243. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/detectors/project.py +0 -0
  244. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/detectors/python.py +0 -0
  245. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/detectors/ruby.py +0 -0
  246. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/detectors/rust.py +0 -0
  247. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/detectors/systems.py +0 -0
  248. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/detectors/terraform.py +0 -0
  249. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/detectors/tooling.py +0 -0
  250. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/doc_analyzer.py +0 -0
  251. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/dynamic_argument_surface.py +0 -0
  252. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/empty_reach.py +0 -0
  253. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/endpoint_disposition.py +0 -0
  254. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/endpoint_literals.py +0 -0
  255. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/endpoint_metrics.py +0 -0
  256. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/entrypoint_classifier.py +0 -0
  257. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/env_analyzer.py +0 -0
  258. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/environment_resolution.py +0 -0
  259. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/evidence_provider.py +0 -0
  260. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/execution_plan.py +0 -0
  261. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/explain.py +0 -0
  262. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/facts/__init__.py +0 -0
  263. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/facts/registry.json +0 -0
  264. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/field_deprecations.py +0 -0
  265. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/file_chunker.py +0 -0
  266. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/file_classifier.py +0 -0
  267. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/filter_surface.py +0 -0
  268. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/fqn_utils.py +0 -0
  269. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/functional_routes.py +0 -0
  270. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/gate_anchors.py +0 -0
  271. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/git_analyzer.py +0 -0
  272. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/git_checkout.py +0 -0
  273. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/github_diff.py +0 -0
  274. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/graph_analyzer.py +0 -0
  275. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/graph_evidence.py +0 -0
  276. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/hibernate_strat.py +0 -0
  277. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/identity_fallback.py +0 -0
  278. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/integration_coordinates.py +0 -0
  279. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/jdk_exports.py +0 -0
  280. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/license.py +0 -0
  281. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/manifest_cache.py +0 -0
  282. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/mcp/__init__.py +0 -0
  283. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/mcp/dependency_import.py +0 -0
  284. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/mcp/onboarding/__init__.py +0 -0
  285. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/mcp/onboarding/applier.py +0 -0
  286. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/mcp/onboarding/backup.py +0 -0
  287. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/mcp/onboarding/detector.py +0 -0
  288. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/mcp/onboarding/planner.py +0 -0
  289. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/mcp/orchestrator.py +0 -0
  290. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/mcp/registry.py +0 -0
  291. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/mcp/runner.py +0 -0
  292. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/mcp/server.py +0 -0
  293. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/mcp_nudge.py +0 -0
  294. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/metrics_analyzer.py +0 -0
  295. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/migration_apply.py +0 -0
  296. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/migration_blast.py +0 -0
  297. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/openapi_surface.py +0 -0
  298. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/openrewrite_recipe.py +0 -0
  299. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/output_budget.py +0 -0
  300. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/output_encoding.py +0 -0
  301. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/output_sink.py +0 -0
  302. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/parallel.py +0 -0
  303. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/parse_cache.py +0 -0
  304. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/path_admission.py +0 -0
  305. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/pipe_contract.py +0 -0
  306. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/pr_comment_renderer.py +0 -0
  307. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/pr_impact.py +0 -0
  308. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/product_info.py +0 -0
  309. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/progress.py +0 -0
  310. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/provenance.py +0 -0
  311. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/ranking_engine.py +0 -0
  312. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/readiness_timeline.py +0 -0
  313. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/readonly.py +0 -0
  314. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/reconciliation.py +0 -0
  315. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/redactor.py +0 -0
  316. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/reference_facts.py +0 -0
  317. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/regress.py +0 -0
  318. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/relevance_scorer.py +0 -0
  319. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/remediation_diff.py +0 -0
  320. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/remedies.py +0 -0
  321. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/repo_classifier.py +0 -0
  322. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/retrieval/__init__.py +0 -0
  323. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/retrieval/context.py +0 -0
  324. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/retrieval/errors.py +0 -0
  325. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/retrieval/executor.py +0 -0
  326. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/retrieval/planner.py +0 -0
  327. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/retrieval/query.py +0 -0
  328. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/retrieval/request.py +0 -0
  329. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/retrieval/resolution.py +0 -0
  330. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/retrieval/result.py +0 -0
  331. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/retrieval/retriever.py +0 -0
  332. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/retrieval/runtime.py +0 -0
  333. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/retrieval/steps.py +0 -0
  334. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/retrieval/steps_endpoint.py +0 -0
  335. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/retrieval/steps_graph.py +0 -0
  336. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/retrieval/steps_impact.py +0 -0
  337. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/retrieval/steps_intf.py +0 -0
  338. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/retrieval/steps_struct.py +0 -0
  339. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/retrieval/steps_txsec.py +0 -0
  340. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/ris.py +0 -0
  341. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/risk_model.py +0 -0
  342. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/rule_catalog.py +0 -0
  343. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/rule_pass.py +0 -0
  344. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/runs.py +0 -0
  345. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/runtime_classifier.py +0 -0
  346. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/sarif.py +0 -0
  347. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/scanner.py +0 -0
  348. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/schema.py +0 -0
  349. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/schema_producers.py +0 -0
  350. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/schemas/core-analysis-v1.schema.json +0 -0
  351. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/schemas/pr-impact-v1.schema.json +0 -0
  352. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/schemas/verify-edit-v1.schema.json +0 -0
  353. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/schemas/verify-v1.schema.json +0 -0
  354. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/security_chain.py +0 -0
  355. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/security_config.py +0 -0
  356. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/security_config_scan.py +0 -0
  357. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/security_posture.py +0 -0
  358. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/selection_contract.py +0 -0
  359. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/semantic_analyzer.py +0 -0
  360. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/semantic_impact_engine.py +0 -0
  361. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/semantic_integration_engine.py +0 -0
  362. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/semantic_services.py +0 -0
  363. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/servlet_surface.py +0 -0
  364. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/source_text.py +0 -0
  365. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/spring_event_topology.py +0 -0
  366. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/spring_impact.py +0 -0
  367. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/spring_profiles.py +0 -0
  368. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/spring_properties.py +0 -0
  369. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/spring_semantic.py +0 -0
  370. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/spring_tx_analyzer.py +0 -0
  371. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/sql_taint.py +0 -0
  372. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/target_admission.py +0 -0
  373. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/telemetry/__init__.py +0 -0
  374. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/telemetry/config.py +0 -0
  375. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/telemetry/consent.py +0 -0
  376. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/telemetry/events.py +0 -0
  377. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/telemetry/filters.py +0 -0
  378. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/telemetry/transport.py +0 -0
  379. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/test_gap_ranking.py +0 -0
  380. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/test_sources.py +0 -0
  381. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/text_input.py +0 -0
  382. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/timeline.py +0 -0
  383. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/timeline_cache.py +0 -0
  384. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/token_estimate.py +0 -0
  385. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/tree_utils.py +0 -0
  386. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/type_usage_surface.py +0 -0
  387. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/validation_inference.py +0 -0
  388. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/verify_rules.py +0 -0
  389. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/version_check.py +0 -0
  390. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/waivers.py +0 -0
  391. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/wired_surface.py +0 -0
  392. {sourcecode-5.8.20 → sourcecode-5.8.22}/src/sourcecode/workspace.py +0 -0
  393. {sourcecode-5.8.20 → sourcecode-5.8.22}/supabase/functions/README.md +0 -0
  394. {sourcecode-5.8.20 → sourcecode-5.8.22}/supabase/functions/get-license/index.ts +0 -0
  395. {sourcecode-5.8.20 → sourcecode-5.8.22}/supabase/functions/lemonsqueezy-webhook/index.ts +0 -0
  396. {sourcecode-5.8.20 → sourcecode-5.8.22}/supabase/functions/telemetry/index.ts +0 -0
  397. {sourcecode-5.8.20 → sourcecode-5.8.22}/supabase/sql/license_event_ordering.sql +0 -0
  398. {sourcecode-5.8.20 → sourcecode-5.8.22}/supabase/sql/licensing_schema.sql +0 -0
  399. {sourcecode-5.8.20 → sourcecode-5.8.22}/supabase/sql/telemetry_events.sql +0 -0
@@ -12,6 +12,8 @@ build/
12
12
  .mypy_cache/
13
13
  .ruff_cache/
14
14
  .pytest_cache/
15
+ .testmondata
16
+ .testmondata-*
15
17
  src/*.egg-info/
16
18
 
17
19
  # Editor / IDE
@@ -1,5 +1,101 @@
1
1
  # Changelog
2
2
 
3
+ ## [5.8.22] — 2026-08-22
4
+
5
+ *The eleventh audit-pass queue is closed entire: all fourteen open rows shipped
6
+ as separate commits, regressions first, with the full suite green at 12 176
7
+ tests. Four reported mechanisms are corrected against measurement and one half
8
+ of one row is refused with its price on the record.*
9
+
10
+ ### Fixed — the two regressions the pass led with
11
+
12
+ - **Root help (`AUD-597-R01`)** — `ask --help` went to 177.4 s in the field
13
+ because the page is *recursive* through the Typer→Click conversion: one
14
+ `--help` rebuilt the whole command tree 249 times. The tree is built once per
15
+ process. Measured here: **13.3 s → 0.45 s**.
16
+ - **Self-check encoding and exit (`AUD-597-R02`)** — `selftest` decoded its
17
+ children with the host locale, so on a `cp1252` host three checks died with
18
+ tracebacks and the command still exited 0. Children are read as UTF-8, an
19
+ unreadable stream is no longer a traceback, and `summary.error > 0` exits 75.
20
+ The battery now asserts its own exit contract as a ledger row.
21
+
22
+ ### Fixed — bounding, identity and determinism
23
+
24
+ - **Bounded is never larger (`AUD-597-R03`)** — `--compact` could grow a payload,
25
+ because a cut's disclosure outweighed the rows it replaced. The trade is
26
+ measured at each cut; a bounded answer is never the larger one, asserted over
27
+ the whole bounded-flag population. `--limit N` is still answered literally.
28
+ - **Build provenance (`AUD-597-X01`)** — the generated commit stamp is declared a
29
+ wheel artifact, so an installed build can name the tree it came from. Proved
30
+ from the built wheel, not from a checkout.
31
+ - **Front page (`AUD-597-A01`)** — every recommended line carries the bounding
32
+ flag its own command declares, typed with a value where the flag needs one, and
33
+ the comment column is padded after the substitution.
34
+ - **Smaller answers (`AUD-597-A02`)** — the output ceiling learns that a smaller
35
+ answer can be a *mode*, so `export --c4` offers its three sections; and
36
+ `rename-class --dry-run` prints its plan without the diffs, so the most
37
+ destructive command in the product can be previewed.
38
+ - **Bean population (`AUD-597-A03`)** — a class's stereotype was picked out of a
39
+ Python set, so the bean population moved with the per-process hash seed. The
40
+ choice takes a declared rank; every Spring stereotype outranks every JPA one.
41
+
42
+ ### Fixed — contracts, grammar and disclosure
43
+
44
+ - **Ledger coherence (`AUD-597-A04`)** — a row declared closed in this document's
45
+ own prose can no longer ship reading `open`, and a closure declaration must
46
+ name its rows unambiguously.
47
+ - **Analysis budget (`AUD-597-D01`)** — the help names the commands the budget
48
+ *stops* and the commands it only *advises*, instead of calling all eight a
49
+ deadline. The gating flags are asserted over the population that can gate.
50
+ - **Mutually exclusive hints (`AUD-597-D02`)** — `delta` and `contract-diff` no
51
+ longer answer "not both" with a hint containing both.
52
+ - **Partial timings (`AUD-597-D04`)** — a phase the run declares complete is
53
+ charged for its own duration, so `unaccounted_pct` on a partial answer means
54
+ what it means on a full one.
55
+ - **Option suggestions (`AUD-597-D05`)** — suggestions come from this product's
56
+ guarded matcher rather than the parser's, and the guard measures a real edit
57
+ distance; where nothing is plausible, the hint names what the command takes.
58
+ - **One repository grammar (`AUD-597-D06`)** — `--path`, `--repo` and `--dir` are
59
+ accepted everywhere as aliases for the positional repository argument, with no
60
+ payload change and without overriding a command that declares one already.
61
+ - **Query sink scope (`AUD-597-D07`)** — the vocabulary states that it composes an
62
+ existing finding and does not originate one, so an absent row is not published
63
+ as safety.
64
+ - **Exit-code contract (`AUD-596-D11`, residual)** — the rule that closed that row
65
+ shipped without the batteries that assert it, leaving 23 tests red against the
66
+ build that fixed them. `error_schema.EXIT_CODE_FOR` publishes the table.
67
+
68
+ ## [5.8.21] — 2026-08-22
69
+
70
+ *The tenth audit-pass queue is closed: seven remaining P3 fixes shipped as
71
+ separate commits, with the release documentation synchronized to the shipped
72
+ contracts.*
73
+
74
+ ### Fixed — answer contracts and operational safety
75
+
76
+ - **Repository identity (`AUD-596-D01`)** — the common response envelope now
77
+ publishes `repo_id` and `git_head` for repository-scoped JSON answers.
78
+ - **Validation figures (`AUD-596-D03`)** — route constraint figures publish their
79
+ unit and counted population instead of relying on ambiguous field names.
80
+ - **Compare candidates (`AUD-596-D08`)** — directory candidates are rejected
81
+ before model construction, and comparison results publish resolved counts.
82
+ - **Grammar errors (`AUD-596-D11`)** — invalid command usage is now
83
+ `INVALID_USAGE`; semantic input failures remain `INVALID_INPUT`.
84
+ - **Actionable hints (`AUD-596-D12`)** — rename, endpoint explanation and
85
+ regression inputs validate their shapes and provide next steps that can work.
86
+ - **Schema pinning (`AUD-596-D14`)** — ambiguous identifiers such as `1.0`
87
+ publish `pinnable: false` and the canonical names to pin instead.
88
+ - **Peak memory (`AUD-596-D10`)** — JSON answers publish `_meta.memory` with
89
+ peak RSS, and costly analyses enforce `ASK_MAX_RSS_MB` with a structured
90
+ `MEMORY_TOO_LARGE` refusal. Unset or `0` leaves the ceiling disabled.
91
+
92
+ ### Documentation
93
+
94
+ - Updated the README, English and Spanish user guides, release metadata and
95
+ roadmap status to 5.8.21.
96
+ - The generated `ask --help` remains the authority for command options and
97
+ now reports the installed 5.8.21 version.
98
+
3
99
  ## [5.8.20] — 2026-08-21
4
100
 
5
101
  *`C1-36` is closed on all four remedies. The row was opened by two field
@@ -48,6 +48,18 @@ ask . prepare-context explain
48
48
  pytest tests/
49
49
  ```
50
50
 
51
+ For the normal edit loop, use the incremental runner. The first run builds a
52
+ local dependency map; later runs execute only tests affected by changed code:
53
+
54
+ ```bash
55
+ scripts/test_fast.sh
56
+ ```
57
+
58
+ Pass normal pytest arguments through when needed, for example
59
+ `scripts/test_fast.sh tests/test_cli.py -x`. Run `pytest tests/` before merging
60
+ or when changing shared infrastructure, because the incremental selection is a
61
+ feedback optimization and the full suite remains the final regression gate.
62
+
51
63
  Run a single file:
52
64
  ```bash
53
65
  pytest tests/test_detector_nodejs.py -v
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sourcecode
3
- Version: 5.8.20
3
+ Version: 5.8.22
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
@@ -36,8 +36,11 @@ Provides-Extra: dev
36
36
  Requires-Dist: jsonschema>=4.18; extra == 'dev'
37
37
  Requires-Dist: mcp<2,>=1.2; extra == 'dev'
38
38
  Requires-Dist: mypy>=1.10; extra == 'dev'
39
+ Requires-Dist: pytest-testmon<2.2,>=2.1.4; (python_version < '3.10') and extra == 'dev'
40
+ Requires-Dist: pytest-testmon>=2.2; (python_version >= '3.10') and extra == 'dev'
39
41
  Requires-Dist: pytest-xdist>=3.8; extra == 'dev'
40
- Requires-Dist: pytest>=8; extra == 'dev'
42
+ Requires-Dist: pytest<9,>=8; (python_version < '3.10') and extra == 'dev'
43
+ Requires-Dist: pytest>=8; (python_version >= '3.10') and extra == 'dev'
41
44
  Requires-Dist: ruff>=0.15; extra == 'dev'
42
45
  Provides-Extra: mcp
43
46
  Requires-Dist: mcp<2,>=1.2; extra == 'mcp'
@@ -55,7 +58,7 @@ Description-Content-Type: text/markdown
55
58
  > question. All analysis is local and deterministic; see [Privacy](#configuration--privacy)
56
59
  > before inspecting a repository whose telemetry policy you need to control.
57
60
 
58
- ![Version](https://img.shields.io/badge/version-5.8.20-blue)
61
+ ![Version](https://img.shields.io/badge/version-5.8.22-blue)
59
62
  ![Python](https://img.shields.io/badge/python-3.9%2B-green)
60
63
 
61
64
  Copyright (c) 2026 Dominique Haroun. All rights reserved. ASK Engine 5.7.0 and
@@ -75,6 +78,20 @@ Every time an AI coding agent starts a new session, it has to re-parse the repos
75
78
 
76
79
  ASK Engine solves this with a persistent structural cache keyed on file content hashes. After the first scan, later invocations reuse pre-built context whenever their command can consume the warmed layers. The repo doesn't change? The cache doesn't expire.
77
80
 
81
+ ## Product route: individual commands and packs
82
+
83
+ ASK Engine keeps individual commands for precise, scriptable questions and adds
84
+ workflow-shaped packs for users who want one consumable result:
85
+
86
+ ```bash
87
+ ask pack assessment . --profile prod --output-dir .ask/packs/assessment
88
+ ask pack gate . --since origin/main --output-dir .ask/packs/gate
89
+ ```
90
+
91
+ The [Product Route](docs/PRODUCT-ROUTE.md) is normative: ASK focuses on
92
+ deterministic evidence for Java/Spring modernization and safe change. Packs
93
+ compose existing commands; they do not hide or replace them.
94
+
78
95
  **The cache is not a performance optimization. It is what makes ASK Engine usable as infrastructure rather than a one-off tool.**
79
96
 
80
97
  ---
@@ -125,7 +142,13 @@ stops at 1 408 files and ends at 5.1s. Commands outside that phase-runner set
125
142
  must not be gated on this variable; their budget applicability remains visible in
126
143
  the [defect ledger](docs/DEFECT-LEDGER.md).
127
144
 
128
- **Current performance status.** Release 5.8.20 retains the shared Canonical IR
145
+ **Memory is measurable and bounded.** Repository-scoped JSON answers publish
146
+ `_meta.memory.peak_rss_mb` and the configured ceiling. For a supervised deep run,
147
+ set `ASK_MAX_RSS_MB=<megabytes>`; if the process exceeds it, ASK refuses the
148
+ answer with `MEMORY_TOO_LARGE`, including the observed peak and limit. Leave it
149
+ unset, or set it to `0`, to disable the ceiling explicitly.
150
+
151
+ **Current performance status.** Release 5.8.22 retains the shared Canonical IR
129
152
  path used by `validation` and now passes that same CIR into labelled `data-exposure`
130
153
  runs; the no-label path remains parse-free. The one-model-per-declared-label path is
131
154
  also retained. These are implementation properties, not duration promises:
@@ -159,7 +182,7 @@ brew tap haroundominique/sourcecode && brew install sourcecode
159
182
  # pip / pipx
160
183
  pipx install sourcecode # or: pip install sourcecode
161
184
 
162
- ask version # ask 5.8.20 — and, on a build that has aged,
185
+ ask version # ask 5.8.22 — and, on a build that has aged,
163
186
  # how many releases have probably shipped since
164
187
  ```
165
188
 
@@ -480,7 +503,7 @@ reading JSON sees the same boundary a buyer reads here.
480
503
 
481
504
  | Not covered | Why | What answers it |
482
505
  |---|---|---|
483
- | **General request-input-to-sink taint analysis.** | `ask risk` includes two bounded slices for annotated HTTP parameters and positional calls in repository Java sources: known query sinks, and MyBatis statements that splice a value into their SQL. Anything broader needs value flow through a program, which is a different analysis with a different failure mode: an unsound one produces confident findings that are wrong, and every claim here is meant to be checkable against the line that produced it. | A dataflow scanner (Semgrep, CodeQL) for complete taint. What this product adds on top is reachability and, for the two bounded slices, whether an annotated HTTP input reaches a known concatenated query sink or a spliced SQL statement — the latter with a three-state verdict that says `undecidable` rather than clearing a route it could not follow. |
506
+ | **General request-input-to-sink taint analysis.** | `ask risk` includes two bounded slices for annotated HTTP parameters and positional calls in repository Java sources: known query sinks, and MyBatis statements that splice a value into their SQL. “Known” is a published list — `risk` prints it as `query_sink_vocabulary`, with the calls it deliberately leaves out and why — so a concatenation into a call outside that list is not a miss to be discovered, it is a stated boundary. Anything broader needs value flow through a program, which is a different analysis with a different failure mode: an unsound one produces confident findings that are wrong, and every claim here is meant to be checkable against the line that produced it. | A dataflow scanner (Semgrep, CodeQL) for complete taint. What this product adds on top is reachability and, for the two bounded slices, whether an annotated HTTP input reaches a known concatenated query sink or a spliced SQL statement — the latter with a three-state verdict that says `undecidable` rather than clearing a route it could not follow. |
484
507
  | **Secrets outside Java, Spring configuration and the deployment descriptors — a Helm value, a CI variable file, a shell script.** | The file population this analyzer reads is the Java source, the Spring configuration convention and the descriptors it already parses to resolve an environment. A secret elsewhere is not missed by a weak rule; it is outside the set of files anything here opens. Narrowed by CL-10: a credential stored in `web.xml` or a Spring XML context IS reported (SEC-007), because those files were already being read. | A dedicated secret scanner over the whole tree (gitleaks, trufflehog). |
485
508
  | **Filter-chain order and per-filter URL patterns — the presence of a custom filter is structural only.** | Which filter runs first is decided by bean ordering this analyzer does not resolve. Where two active configurations both match a request, the answer published is `undecided` rather than a guess. | `ask posture --profile <set>` states per endpoint what the readable rules decide and what they leave undecided. |
486
509
  | **Known vulnerabilities in dependencies — no CVE database, no version advisory matching.** | Enriching a vulnerability feed is a different product with a different update cadence; a stale embedded database is worse than no database, because it reads as a clean bill of health. | A dependency scanner (Trivy, OWASP Dependency-Check). `impact-chain` then answers which of its findings anything actually reaches. |
@@ -640,6 +663,8 @@ Matching endpoints report `policy: "custom"` and drop out of the `no_security_si
640
663
 
641
664
  ## Documentation
642
665
 
666
+ - [Product Route](docs/PRODUCT-ROUTE.md) — individual commands, packs, evidence contract and boundaries
667
+
643
668
  | Doc | What it covers |
644
669
  |-----|----------------|
645
670
  | [USER_GUIDE.md](docs/USER_GUIDE.md) | Full command reference, flags, output schema, workflows |
@@ -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.20-blue)
13
+ ![Version](https://img.shields.io/badge/version-5.8.22-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
@@ -30,6 +30,20 @@ Every time an AI coding agent starts a new session, it has to re-parse the repos
30
30
 
31
31
  ASK Engine solves this with a persistent structural cache keyed on file content hashes. After the first scan, later invocations reuse pre-built context whenever their command can consume the warmed layers. The repo doesn't change? The cache doesn't expire.
32
32
 
33
+ ## Product route: individual commands and packs
34
+
35
+ ASK Engine keeps individual commands for precise, scriptable questions and adds
36
+ workflow-shaped packs for users who want one consumable result:
37
+
38
+ ```bash
39
+ ask pack assessment . --profile prod --output-dir .ask/packs/assessment
40
+ ask pack gate . --since origin/main --output-dir .ask/packs/gate
41
+ ```
42
+
43
+ The [Product Route](docs/PRODUCT-ROUTE.md) is normative: ASK focuses on
44
+ deterministic evidence for Java/Spring modernization and safe change. Packs
45
+ compose existing commands; they do not hide or replace them.
46
+
33
47
  **The cache is not a performance optimization. It is what makes ASK Engine usable as infrastructure rather than a one-off tool.**
34
48
 
35
49
  ---
@@ -80,7 +94,13 @@ stops at 1 408 files and ends at 5.1s. Commands outside that phase-runner set
80
94
  must not be gated on this variable; their budget applicability remains visible in
81
95
  the [defect ledger](docs/DEFECT-LEDGER.md).
82
96
 
83
- **Current performance status.** Release 5.8.20 retains the shared Canonical IR
97
+ **Memory is measurable and bounded.** Repository-scoped JSON answers publish
98
+ `_meta.memory.peak_rss_mb` and the configured ceiling. For a supervised deep run,
99
+ set `ASK_MAX_RSS_MB=<megabytes>`; if the process exceeds it, ASK refuses the
100
+ answer with `MEMORY_TOO_LARGE`, including the observed peak and limit. Leave it
101
+ unset, or set it to `0`, to disable the ceiling explicitly.
102
+
103
+ **Current performance status.** Release 5.8.22 retains the shared Canonical IR
84
104
  path used by `validation` and now passes that same CIR into labelled `data-exposure`
85
105
  runs; the no-label path remains parse-free. The one-model-per-declared-label path is
86
106
  also retained. These are implementation properties, not duration promises:
@@ -114,7 +134,7 @@ brew tap haroundominique/sourcecode && brew install sourcecode
114
134
  # pip / pipx
115
135
  pipx install sourcecode # or: pip install sourcecode
116
136
 
117
- ask version # ask 5.8.20 — and, on a build that has aged,
137
+ ask version # ask 5.8.22 — and, on a build that has aged,
118
138
  # how many releases have probably shipped since
119
139
  ```
120
140
 
@@ -435,7 +455,7 @@ reading JSON sees the same boundary a buyer reads here.
435
455
 
436
456
  | Not covered | Why | What answers it |
437
457
  |---|---|---|
438
- | **General request-input-to-sink taint analysis.** | `ask risk` includes two bounded slices for annotated HTTP parameters and positional calls in repository Java sources: known query sinks, and MyBatis statements that splice a value into their SQL. Anything broader needs value flow through a program, which is a different analysis with a different failure mode: an unsound one produces confident findings that are wrong, and every claim here is meant to be checkable against the line that produced it. | A dataflow scanner (Semgrep, CodeQL) for complete taint. What this product adds on top is reachability and, for the two bounded slices, whether an annotated HTTP input reaches a known concatenated query sink or a spliced SQL statement — the latter with a three-state verdict that says `undecidable` rather than clearing a route it could not follow. |
458
+ | **General request-input-to-sink taint analysis.** | `ask risk` includes two bounded slices for annotated HTTP parameters and positional calls in repository Java sources: known query sinks, and MyBatis statements that splice a value into their SQL. “Known” is a published list — `risk` prints it as `query_sink_vocabulary`, with the calls it deliberately leaves out and why — so a concatenation into a call outside that list is not a miss to be discovered, it is a stated boundary. Anything broader needs value flow through a program, which is a different analysis with a different failure mode: an unsound one produces confident findings that are wrong, and every claim here is meant to be checkable against the line that produced it. | A dataflow scanner (Semgrep, CodeQL) for complete taint. What this product adds on top is reachability and, for the two bounded slices, whether an annotated HTTP input reaches a known concatenated query sink or a spliced SQL statement — the latter with a three-state verdict that says `undecidable` rather than clearing a route it could not follow. |
439
459
  | **Secrets outside Java, Spring configuration and the deployment descriptors — a Helm value, a CI variable file, a shell script.** | The file population this analyzer reads is the Java source, the Spring configuration convention and the descriptors it already parses to resolve an environment. A secret elsewhere is not missed by a weak rule; it is outside the set of files anything here opens. Narrowed by CL-10: a credential stored in `web.xml` or a Spring XML context IS reported (SEC-007), because those files were already being read. | A dedicated secret scanner over the whole tree (gitleaks, trufflehog). |
440
460
  | **Filter-chain order and per-filter URL patterns — the presence of a custom filter is structural only.** | Which filter runs first is decided by bean ordering this analyzer does not resolve. Where two active configurations both match a request, the answer published is `undecided` rather than a guess. | `ask posture --profile <set>` states per endpoint what the readable rules decide and what they leave undecided. |
441
461
  | **Known vulnerabilities in dependencies — no CVE database, no version advisory matching.** | Enriching a vulnerability feed is a different product with a different update cadence; a stale embedded database is worse than no database, because it reads as a clean bill of health. | A dependency scanner (Trivy, OWASP Dependency-Check). `impact-chain` then answers which of its findings anything actually reaches. |
@@ -595,6 +615,8 @@ Matching endpoints report `policy: "custom"` and drop out of the `no_security_si
595
615
 
596
616
  ## Documentation
597
617
 
618
+ - [Product Route](docs/PRODUCT-ROUTE.md) — individual commands, packs, evidence contract and boundaries
619
+
598
620
  | Doc | What it covers |
599
621
  |-----|----------------|
600
622
  | [USER_GUIDE.md](docs/USER_GUIDE.md) | Full command reference, flags, output schema, workflows |
@@ -141,6 +141,7 @@ The second anchor is the field one, and it carries its own build for the same re
141
141
  | `mcp` | the shared work | not timed | yes | `snapshot`, `ris`, `cir`, `parse` | Serves the same commands over MCP, with the same layers. |
142
142
  | `schema` | nothing | not timed | no | — | Prints registries; reads no repository. |
143
143
  | `telemetry` | nothing | not timed | no | — | Not an analysis. |
144
+ | `pack` | the shared work | not timed | no | `cir`, `parse` | Composes existing analyses; the pack adds no separate parser. |
144
145
  | `version` | nothing | not timed | no | — | Not an analysis. |
145
146
  <!-- END GENERATED -->
146
147
 
@@ -11,6 +11,12 @@ and [`MODERNIZATION.md`](MODERNIZATION.md) (the flagship product narrative). CLI
11
11
  > deterministically, with the source to prove it. Free on normal repos; Pro when the
12
12
  > work gets enterprise-scale or automated.**
13
13
 
14
+ The commercial route is delivered through two packs while preserving every
15
+ individual command: `ask pack assessment` for modernization and risk discovery,
16
+ and `ask pack gate` for recurring change safety in CI. See
17
+ [`PRODUCT-ROUTE.md`](PRODUCT-ROUTE.md) for the normative scope and evidence
18
+ contract.
19
+
14
20
  The gating axis is **size + automation**, never capability. Nothing is crippled on Free;
15
21
  you pay exactly when the tool is replacing the most engineering time — a monolith above
16
22
  **500 Java source files**, or CI/CD automation. **€19/mo · €190/yr, per developer.**