sourcecode 5.5.0__tar.gz → 5.5.1__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 (356) hide show
  1. {sourcecode-5.5.0 → sourcecode-5.5.1}/CHANGELOG.md +20 -0
  2. {sourcecode-5.5.0 → sourcecode-5.5.1}/PKG-INFO +3 -3
  3. {sourcecode-5.5.0 → sourcecode-5.5.1}/README.md +2 -2
  4. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/USER_GUIDE.md +1 -1
  5. {sourcecode-5.5.0 → sourcecode-5.5.1}/pyproject.toml +1 -1
  6. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/__init__.py +1 -1
  7. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/cli.py +51 -6
  8. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/reference_facts.py +13 -1
  9. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/release_info.py +1 -1
  10. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/repository_ir.py +49 -10
  11. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/validation_surface.py +7 -11
  12. {sourcecode-5.5.0 → sourcecode-5.5.1}/.github/workflows/build-windows.yml +0 -0
  13. {sourcecode-5.5.0 → sourcecode-5.5.1}/.github/workflows/perf-gate.yml +0 -0
  14. {sourcecode-5.5.0 → sourcecode-5.5.1}/.gitignore +0 -0
  15. {sourcecode-5.5.0 → sourcecode-5.5.1}/.ruff.toml +0 -0
  16. {sourcecode-5.5.0 → sourcecode-5.5.1}/CLAUDE.md +0 -0
  17. {sourcecode-5.5.0 → sourcecode-5.5.1}/CONTRIBUTING.md +0 -0
  18. {sourcecode-5.5.0 → sourcecode-5.5.1}/LICENSE +0 -0
  19. {sourcecode-5.5.0 → sourcecode-5.5.1}/SECURITY.md +0 -0
  20. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/CACHE.md +0 -0
  21. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/COMMERCIAL-OFFER.md +0 -0
  22. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/CUSTOMER-VALIDATION.md +0 -0
  23. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/DEFECT-LEDGER.md +0 -0
  24. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/DEMO-5MIN.md +0 -0
  25. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/DEVELOPMENT-ROADMAP.md +0 -0
  26. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/EXECUTION-PLAN-12MO.md +0 -0
  27. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/EXECUTIVE-ROADMAP.md +0 -0
  28. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/MANUAL-USUARIO.md +0 -0
  29. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/MODERNIZATION.md +0 -0
  30. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/PRODUCT_AUDIT.md +0 -0
  31. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/PRODUCT_IDENTITY.md +0 -0
  32. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/PRODUCT_TIERS.md +0 -0
  33. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/RC1-CHECKLIST.md +0 -0
  34. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/RELEASE-CHECKLIST.md +0 -0
  35. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/architecture/CATALOG-retrieval-intents.md +0 -0
  36. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/architecture/DESIGN-knowledge-provider-integration.md +0 -0
  37. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/architecture/DESIGN-p5.3b-statement-surface.md +0 -0
  38. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/architecture/DESIGN-p5.5-span-index.md +0 -0
  39. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/architecture/DESIGN-p6-semantic-impact-engine.md +0 -0
  40. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/architecture/DESIGN-p6-semantic-integration-engine.md +0 -0
  41. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/architecture/DESIGN-p7-semantic-services.md +0 -0
  42. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/architecture/DESIGN-robustness-security-inference.md +0 -0
  43. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/architecture/DESIGN-semantic-retrieval.md +0 -0
  44. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/architecture/EPV-p6-class-typeref.md +0 -0
  45. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/architecture/REPORT-p6-flow-analyzer-comparison.md +0 -0
  46. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/architecture/REPORT-p6-integration-detector-comparison.md +0 -0
  47. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/architecture/REPORT-p8-flow-analyzer-migration.md +0 -0
  48. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/architecture/REPORT-p9-integration-detector-migration.md +0 -0
  49. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/architecture/adr/0001-semantic-ir.md +0 -0
  50. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/architecture/adr/0002-source-evidence-boundary.md +0 -0
  51. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/architecture/adr/0003-architectural-characterization.md +0 -0
  52. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/architecture/adr/0004-semantic-retrieval.md +0 -0
  53. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/architecture/adr/0005-evidence-reconciliation.md +0 -0
  54. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/architecture/adr/0006-performance-harness.md +0 -0
  55. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/architecture/adr/0007-composition-semantics.md +0 -0
  56. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/architecture/adr/0008-answer-coherence.md +0 -0
  57. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/architecture/consumer-disposition-inventory.md +0 -0
  58. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/architecture/overview.md +0 -0
  59. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/architecture/product-architecture-review.md +0 -0
  60. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/architecture/product-strategy-layering.md +0 -0
  61. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/architecture/semantic-ir-consumer-matrix.md +0 -0
  62. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/architecture/semantic-ir-roadmap.md +0 -0
  63. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/baseline-ci.yml +0 -0
  64. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/commercial-pipeline-audit.md +0 -0
  65. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/contracts-ci.yml +0 -0
  66. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/contracts.md +0 -0
  67. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/eval/2026-06-15-petclinic-rest-issue11-vets-pagination.md +0 -0
  68. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/eval/2026-06-15-petclinic-rest-issue147-validation.md +0 -0
  69. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/eval/2026-06-15-petclinic-rest-workflow.md +0 -0
  70. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/eval/2026-06-15-phase18-openapi-surface.md +0 -0
  71. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/eval/2026-06-15-phase20-validation-surface.md +0 -0
  72. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/eval/2026-06-16-broadleaf-checkout-impact-fieldtest.md +0 -0
  73. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/eval/2026-06-16-petclinic-rest-issue11-weakness2-closed.md +0 -0
  74. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/eval/2026-06-16-spring-petclinic-issue2333-dead-vets.md +0 -0
  75. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/licensing-schema.md +0 -0
  76. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/migrate-check.md +0 -0
  77. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/perf/README.md +0 -0
  78. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/perf/REGRESSION-GATE.md +0 -0
  79. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/perf/baselines/2.5.15/SUMMARY.md +0 -0
  80. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/perf/baselines/2.5.15/alfresco__ask__cold.json +0 -0
  81. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/perf/baselines/2.5.15/alfresco__ask__warm.json +0 -0
  82. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/perf/baselines/2.5.15/broadleaf__ask__cold.json +0 -0
  83. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/perf/baselines/2.5.15/broadleaf__ask__warm.json +0 -0
  84. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/perf/baselines/2.5.15/eureka__ask__cold.json +0 -0
  85. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/perf/baselines/2.5.15/eureka__ask__warm.json +0 -0
  86. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/perf/baselines/2.5.15/jenkins__ask__cold.json +0 -0
  87. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/perf/baselines/2.5.15/jenkins__ask__warm.json +0 -0
  88. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/perf/baselines/2.5.15/jobrunr__ask__cold.json +0 -0
  89. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/perf/baselines/2.5.15/jobrunr__ask__warm.json +0 -0
  90. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/perf/baselines/2.5.15/keycloak__ask__cold.json +0 -0
  91. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/perf/baselines/2.5.15/keycloak__ask__warm.json +0 -0
  92. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/perf/baselines/2.5.15/neo4j__ask__cold.json +0 -0
  93. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/perf/baselines/2.5.15/neo4j__ask__warm.json +0 -0
  94. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/perf/baselines/2.5.15/ofbiz__ask__cold.json +0 -0
  95. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/perf/baselines/2.5.15/ofbiz__ask__warm.json +0 -0
  96. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/perf/baselines/2.5.15/openmrs__ask__cold.json +0 -0
  97. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/perf/baselines/2.5.15/openmrs__ask__warm.json +0 -0
  98. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/perf/baselines/2.5.15/petclinic__ask__cold.json +0 -0
  99. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/perf/baselines/2.5.15/petclinic__ask__warm.json +0 -0
  100. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/perf/baselines/2.5.16/SUMMARY.md +0 -0
  101. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/perf/baselines/2.5.16/alfresco__ask__cold.json +0 -0
  102. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/perf/baselines/2.5.16/alfresco__ask__warm.json +0 -0
  103. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/perf/baselines/2.5.16/broadleaf__ask__cold.json +0 -0
  104. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/perf/baselines/2.5.16/broadleaf__ask__warm.json +0 -0
  105. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/perf/baselines/2.5.16/eureka__ask__cold.json +0 -0
  106. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/perf/baselines/2.5.16/eureka__ask__warm.json +0 -0
  107. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/perf/baselines/2.5.16/jenkins__ask__cold.json +0 -0
  108. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/perf/baselines/2.5.16/jenkins__ask__warm.json +0 -0
  109. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/perf/baselines/2.5.16/jobrunr__ask__cold.json +0 -0
  110. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/perf/baselines/2.5.16/jobrunr__ask__warm.json +0 -0
  111. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/perf/baselines/2.5.16/keycloak__ask__cold.json +0 -0
  112. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/perf/baselines/2.5.16/keycloak__ask__warm.json +0 -0
  113. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/perf/baselines/2.5.16/neo4j__ask__cold.json +0 -0
  114. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/perf/baselines/2.5.16/neo4j__ask__warm.json +0 -0
  115. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/perf/baselines/2.5.16/ofbiz__ask__cold.json +0 -0
  116. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/perf/baselines/2.5.16/ofbiz__ask__warm.json +0 -0
  117. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/perf/baselines/2.5.16/openmrs__ask__cold.json +0 -0
  118. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/perf/baselines/2.5.16/openmrs__ask__warm.json +0 -0
  119. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/perf/baselines/2.5.16/petclinic__ask__cold.json +0 -0
  120. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/perf/baselines/2.5.16/petclinic__ask__warm.json +0 -0
  121. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/perf/baselines/gate-latest/README.md +0 -0
  122. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/perf/baselines/gate-latest/broadleaf__ask__warm.json +0 -0
  123. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/perf/baselines/gate-latest/broadleaf__endpoints__warm.json +0 -0
  124. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/perf/baselines/gate-latest/broadleaf__migrate-check__warm.json +0 -0
  125. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/perf/baselines/gate-latest/broadleaf__posture__warm.json +0 -0
  126. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/perf/baselines/gate-latest/broadleaf__spring-audit__warm.json +0 -0
  127. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/perf/baselines/gate-latest/broadleaf__validation__warm.json +0 -0
  128. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/perf/baselines/reference-best/README.md +0 -0
  129. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/posture.md +0 -0
  130. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/privacy.md +0 -0
  131. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/pro-experience-audit.md +0 -0
  132. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/schema.md +0 -0
  133. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/spec/envelope-v1.md +0 -0
  134. {sourcecode-5.5.0 → sourcecode-5.5.1}/docs/spring-audit-ci.yml +0 -0
  135. {sourcecode-5.5.0 → sourcecode-5.5.1}/raw +0 -0
  136. {sourcecode-5.5.0 → sourcecode-5.5.1}/scripts/compare_integration_engines.py +0 -0
  137. {sourcecode-5.5.0 → sourcecode-5.5.1}/scripts/customer_smoke_test.sh +0 -0
  138. {sourcecode-5.5.0 → sourcecode-5.5.1}/scripts/generate_jdk_exports.py +0 -0
  139. {sourcecode-5.5.0 → sourcecode-5.5.1}/scripts/perf_gate.py +0 -0
  140. {sourcecode-5.5.0 → sourcecode-5.5.1}/scripts/perf_harness.py +0 -0
  141. {sourcecode-5.5.0 → sourcecode-5.5.1}/scripts/sync_gate_anchors.py +0 -0
  142. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/adaptive_scanner.py +0 -0
  143. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/archetype.py +0 -0
  144. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/architectural_baseline.py +0 -0
  145. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/architectural_delta.py +0 -0
  146. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/architecture_analyzer.py +0 -0
  147. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/architecture_summary.py +0 -0
  148. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/ast_extractor.py +0 -0
  149. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/audit_report.py +0 -0
  150. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/baseline_autocapture.py +0 -0
  151. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/bundled_docs.py +0 -0
  152. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/cache.py +0 -0
  153. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/cache_model.py +0 -0
  154. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/call_surface.py +0 -0
  155. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/caller_metrics.py +0 -0
  156. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/caller_reach.py +0 -0
  157. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/canonical_ir.py +0 -0
  158. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/chain_rules.py +0 -0
  159. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/change_plan.py +0 -0
  160. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/cir_graphs.py +0 -0
  161. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/classifier.py +0 -0
  162. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/client_calls.py +0 -0
  163. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/code_notes_analyzer.py +0 -0
  164. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/compare.py +0 -0
  165. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/confidence_analyzer.py +0 -0
  166. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/constraint_diff.py +0 -0
  167. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/consumer_join.py +0 -0
  168. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/container_wiring.py +0 -0
  169. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/context_cache.py +0 -0
  170. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/context_graph.py +0 -0
  171. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/context_scorer.py +0 -0
  172. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/context_summarizer.py +0 -0
  173. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/contract_diff.py +0 -0
  174. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/contract_init.py +0 -0
  175. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/contract_model.py +0 -0
  176. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/contract_pipeline.py +0 -0
  177. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/coverage_parser.py +0 -0
  178. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/data_exposure.py +0 -0
  179. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/data_labels.py +0 -0
  180. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/declarations.py +0 -0
  181. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/defect_identity.py +0 -0
  182. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/degradation.py +0 -0
  183. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/dependency_analyzer.py +0 -0
  184. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/deployment_prefix.py +0 -0
  185. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/detach.py +0 -0
  186. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/detectors/__init__.py +0 -0
  187. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/detectors/base.py +0 -0
  188. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/detectors/csproj_parser.py +0 -0
  189. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/detectors/dart.py +0 -0
  190. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/detectors/dotnet.py +0 -0
  191. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/detectors/elixir.py +0 -0
  192. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/detectors/go.py +0 -0
  193. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/detectors/heuristic.py +0 -0
  194. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/detectors/hybrid.py +0 -0
  195. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/detectors/java.py +0 -0
  196. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/detectors/jvm_ext.py +0 -0
  197. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/detectors/nodejs.py +0 -0
  198. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/detectors/parsers.py +0 -0
  199. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/detectors/php.py +0 -0
  200. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/detectors/project.py +0 -0
  201. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/detectors/python.py +0 -0
  202. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/detectors/ruby.py +0 -0
  203. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/detectors/rust.py +0 -0
  204. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/detectors/systems.py +0 -0
  205. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/detectors/terraform.py +0 -0
  206. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/detectors/tooling.py +0 -0
  207. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/doc_analyzer.py +0 -0
  208. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/dynamic_argument_surface.py +0 -0
  209. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/endpoint_literals.py +0 -0
  210. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/endpoint_metrics.py +0 -0
  211. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/entrypoint_classifier.py +0 -0
  212. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/env_analyzer.py +0 -0
  213. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/envelope.py +0 -0
  214. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/environment_resolution.py +0 -0
  215. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/error_schema.py +0 -0
  216. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/evidence_provider.py +0 -0
  217. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/execution_plan.py +0 -0
  218. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/explain.py +0 -0
  219. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/facts/__init__.py +0 -0
  220. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/facts/registry.json +0 -0
  221. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/file_chunker.py +0 -0
  222. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/file_classifier.py +0 -0
  223. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/filter_surface.py +0 -0
  224. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/format_contract.py +0 -0
  225. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/fqn_utils.py +0 -0
  226. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/gate_anchors.py +0 -0
  227. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/git_analyzer.py +0 -0
  228. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/git_checkout.py +0 -0
  229. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/graph_analyzer.py +0 -0
  230. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/graph_evidence.py +0 -0
  231. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/hibernate_strat.py +0 -0
  232. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/identity_fallback.py +0 -0
  233. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/integration_coordinates.py +0 -0
  234. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/jdk_exports.py +0 -0
  235. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/license.py +0 -0
  236. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/mcp/__init__.py +0 -0
  237. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/mcp/dependency_import.py +0 -0
  238. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/mcp/onboarding/__init__.py +0 -0
  239. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/mcp/onboarding/applier.py +0 -0
  240. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/mcp/onboarding/backup.py +0 -0
  241. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/mcp/onboarding/detector.py +0 -0
  242. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/mcp/onboarding/planner.py +0 -0
  243. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/mcp/orchestrator.py +0 -0
  244. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/mcp/registry.py +0 -0
  245. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/mcp/runner.py +0 -0
  246. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/mcp/server.py +0 -0
  247. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/mcp_nudge.py +0 -0
  248. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/metrics_analyzer.py +0 -0
  249. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/migrate_check.py +0 -0
  250. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/migration_blast.py +0 -0
  251. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/non_coverage.py +0 -0
  252. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/openapi_surface.py +0 -0
  253. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/openrewrite_recipe.py +0 -0
  254. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/output_budget.py +0 -0
  255. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/output_encoding.py +0 -0
  256. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/parallel.py +0 -0
  257. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/parse_cache.py +0 -0
  258. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/partial_contract.py +0 -0
  259. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/path_admission.py +0 -0
  260. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/path_filters.py +0 -0
  261. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/perf.py +0 -0
  262. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/phased_run.py +0 -0
  263. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/pipe_contract.py +0 -0
  264. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/posture.py +0 -0
  265. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/pr_comment_renderer.py +0 -0
  266. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/pr_impact.py +0 -0
  267. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/prepare_context.py +0 -0
  268. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/progress.py +0 -0
  269. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/provenance.py +0 -0
  270. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/ranking_engine.py +0 -0
  271. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/readiness_timeline.py +0 -0
  272. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/readonly.py +0 -0
  273. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/reconciliation.py +0 -0
  274. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/redactor.py +0 -0
  275. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/relevance_scorer.py +0 -0
  276. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/remedies.py +0 -0
  277. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/rename_refactor.py +0 -0
  278. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/repo_classifier.py +0 -0
  279. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/retrieval/__init__.py +0 -0
  280. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/retrieval/context.py +0 -0
  281. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/retrieval/errors.py +0 -0
  282. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/retrieval/executor.py +0 -0
  283. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/retrieval/planner.py +0 -0
  284. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/retrieval/query.py +0 -0
  285. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/retrieval/request.py +0 -0
  286. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/retrieval/resolution.py +0 -0
  287. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/retrieval/result.py +0 -0
  288. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/retrieval/retriever.py +0 -0
  289. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/retrieval/runtime.py +0 -0
  290. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/retrieval/steps.py +0 -0
  291. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/retrieval/steps_endpoint.py +0 -0
  292. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/retrieval/steps_graph.py +0 -0
  293. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/retrieval/steps_impact.py +0 -0
  294. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/retrieval/steps_intf.py +0 -0
  295. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/retrieval/steps_struct.py +0 -0
  296. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/retrieval/steps_txsec.py +0 -0
  297. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/ris.py +0 -0
  298. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/risk.py +0 -0
  299. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/rule_catalog.py +0 -0
  300. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/rule_pass.py +0 -0
  301. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/runs.py +0 -0
  302. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/runtime_classifier.py +0 -0
  303. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/sarif.py +0 -0
  304. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/scanner.py +0 -0
  305. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/schema.py +0 -0
  306. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/schemas/envelope-v1.schema.json +0 -0
  307. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/security_chain.py +0 -0
  308. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/security_config.py +0 -0
  309. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/security_config_scan.py +0 -0
  310. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/security_posture.py +0 -0
  311. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/semantic_analyzer.py +0 -0
  312. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/semantic_impact_engine.py +0 -0
  313. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/semantic_integration_engine.py +0 -0
  314. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/semantic_services.py +0 -0
  315. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/serializer.py +0 -0
  316. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/servlet_surface.py +0 -0
  317. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/source_text.py +0 -0
  318. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/spring_event_topology.py +0 -0
  319. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/spring_findings.py +0 -0
  320. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/spring_impact.py +0 -0
  321. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/spring_model.py +0 -0
  322. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/spring_profiles.py +0 -0
  323. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/spring_properties.py +0 -0
  324. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/spring_security_audit.py +0 -0
  325. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/spring_semantic.py +0 -0
  326. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/spring_tx_analyzer.py +0 -0
  327. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/sql_taint.py +0 -0
  328. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/summarizer.py +0 -0
  329. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/target_admission.py +0 -0
  330. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/telemetry/__init__.py +0 -0
  331. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/telemetry/config.py +0 -0
  332. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/telemetry/consent.py +0 -0
  333. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/telemetry/events.py +0 -0
  334. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/telemetry/filters.py +0 -0
  335. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/telemetry/transport.py +0 -0
  336. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/test_gap_ranking.py +0 -0
  337. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/test_sources.py +0 -0
  338. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/text_input.py +0 -0
  339. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/timeline.py +0 -0
  340. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/token_estimate.py +0 -0
  341. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/tree_utils.py +0 -0
  342. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/type_usage_surface.py +0 -0
  343. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/validation_inference.py +0 -0
  344. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/verify_edit.py +0 -0
  345. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/verify_repo.py +0 -0
  346. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/verify_rules.py +0 -0
  347. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/version_check.py +0 -0
  348. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/waivers.py +0 -0
  349. {sourcecode-5.5.0 → sourcecode-5.5.1}/src/sourcecode/workspace.py +0 -0
  350. {sourcecode-5.5.0 → sourcecode-5.5.1}/supabase/functions/README.md +0 -0
  351. {sourcecode-5.5.0 → sourcecode-5.5.1}/supabase/functions/get-license/index.ts +0 -0
  352. {sourcecode-5.5.0 → sourcecode-5.5.1}/supabase/functions/lemonsqueezy-webhook/index.ts +0 -0
  353. {sourcecode-5.5.0 → sourcecode-5.5.1}/supabase/functions/telemetry/index.ts +0 -0
  354. {sourcecode-5.5.0 → sourcecode-5.5.1}/supabase/sql/license_event_ordering.sql +0 -0
  355. {sourcecode-5.5.0 → sourcecode-5.5.1}/supabase/sql/licensing_schema.sql +0 -0
  356. {sourcecode-5.5.0 → sourcecode-5.5.1}/supabase/sql/telemetry_events.sql +0 -0
@@ -2,6 +2,26 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [5.5.1] — 2026-08-13
6
+
7
+ **External audit corrections and command execution performance.**
8
+
9
+ ### Fixed
10
+ - **Impact callers** now expand accessor and interface frontiers consistently,
11
+ with caller symbols remaining a refinement of caller classes.
12
+ - **Endpoint and validation contracts** now expose test-surface policy, reuse
13
+ servlet declarations, and require real `Validator`/`setValidator` evidence.
14
+ - **Modernization references** now recognize nested types used by their
15
+ enclosing class.
16
+ - **Spring audit output** is bounded by default while explicit full output
17
+ remains available through `--output` and `--compact`.
18
+ - **Repeated command execution** reuses the cached analysis context and reports
19
+ independent cache-layer states for context, parse, snapshot, and RIS.
20
+
21
+ ### Documentation
22
+ - Closed the 2026-08-13 external audit backlog in the roadmap with fix hashes
23
+ and regression coverage.
24
+
5
25
  ## [5.5.0] — 2026-08-12
6
26
 
7
27
  **Audit backlog resolved and performance signals made explicit.**
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sourcecode
3
- Version: 5.5.0
3
+ Version: 5.5.1
4
4
  Summary: Persistent structural context and ultra-fast repeated analysis for AI coding agents
5
5
  License-File: LICENSE
6
6
  Keywords: agents,ai,codebase,context,developer-tools,llm
@@ -42,7 +42,7 @@ Description-Content-Type: text/markdown
42
42
 
43
43
  **Context · Impact · Migration · Architecture · Review — everything from one structural model.**
44
44
 
45
- ![Version](https://img.shields.io/badge/version-5.5.0-blue)
45
+ ![Version](https://img.shields.io/badge/version-5.5.1-blue)
46
46
  ![Python](https://img.shields.io/badge/python-3.9%2B-green)
47
47
 
48
48
  > **ASK Engine** is the product. The CLI command is **`ask`**. The legacy **`sourcecode`**
@@ -126,7 +126,7 @@ brew tap haroundominique/sourcecode && brew install sourcecode
126
126
  # pip / pipx
127
127
  pipx install sourcecode # or: pip install sourcecode
128
128
 
129
- ask version # ask 5.5.0 — and, on a build that has aged,
129
+ ask version # ask 5.5.1 — and, on a build that has aged,
130
130
  # how many releases have probably shipped since
131
131
  ```
132
132
 
@@ -4,7 +4,7 @@
4
4
 
5
5
  **Context · Impact · Migration · Architecture · Review — everything from one structural model.**
6
6
 
7
- ![Version](https://img.shields.io/badge/version-5.5.0-blue)
7
+ ![Version](https://img.shields.io/badge/version-5.5.1-blue)
8
8
  ![Python](https://img.shields.io/badge/python-3.9%2B-green)
9
9
 
10
10
  > **ASK Engine** is the product. The CLI command is **`ask`**. The legacy **`sourcecode`**
@@ -88,7 +88,7 @@ brew tap haroundominique/sourcecode && brew install sourcecode
88
88
  # pip / pipx
89
89
  pipx install sourcecode # or: pip install sourcecode
90
90
 
91
- ask version # ask 5.5.0 — and, on a build that has aged,
91
+ ask version # ask 5.5.1 — and, on a build that has aged,
92
92
  # how many releases have probably shipped since
93
93
  ```
94
94
 
@@ -136,7 +136,7 @@ pipx install sourcecode # isolated install, no venv needed
136
136
 
137
137
  # Verify
138
138
  ask version
139
- # ask 5.5.0
139
+ # ask 5.5.1
140
140
  ```
141
141
 
142
142
  Requires Python 3.9+.
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "sourcecode"
7
- version = "5.5.0"
7
+ version = "5.5.1"
8
8
  description = "Persistent structural context and ultra-fast repeated analysis for AI coding agents"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.9"
@@ -4,4 +4,4 @@ ASK Engine is the product. ``ask`` is the canonical CLI command; ``sourcecode``
4
4
  the legacy compatibility alias and the Python/PyPI package name. See
5
5
  docs/PRODUCT_IDENTITY.md (normative)."""
6
6
 
7
- __version__ = "5.5.0"
7
+ __version__ = "5.5.1"
@@ -3457,6 +3457,9 @@ def main(
3457
3457
  _core_hash = ""
3458
3458
  _core_flags_str = ""
3459
3459
  _view_flags_str = ""
3460
+ # Reuse the freshness decision for cache metadata; otherwise the root
3461
+ # command repeats a full Git status walk after the analysis completes.
3462
+ _tree_is_dirty: Optional[bool] = None
3460
3463
 
3461
3464
  if not no_cache:
3462
3465
  try:
@@ -3506,6 +3509,8 @@ def main(
3506
3509
  Path(_git_root_str) if _git_root_str else target,
3507
3510
  scope=target,
3508
3511
  )
3512
+ if _tree_sig and _git_sha:
3513
+ _tree_is_dirty = _tree_sig != _git_sha
3509
3514
  if _tree_sig:
3510
3515
  _core_key = f"{_tree_sig}-{_core_h}"
3511
3516
  else:
@@ -3821,7 +3826,11 @@ def main(
3821
3826
  if format == "json":
3822
3827
  try:
3823
3828
  from sourcecode.ris import _has_uncommitted_changes as _huc
3824
- _uncommitted = _huc(target)
3829
+ _uncommitted = (
3830
+ _tree_is_dirty
3831
+ if _tree_is_dirty is not None
3832
+ else _huc(target)
3833
+ )
3825
3834
  except Exception:
3826
3835
  _uncommitted = False
3827
3836
  _data_scope = "COMPACT" if compact else ("AGENT" if agent else "FULL")
@@ -4717,7 +4726,11 @@ def main(
4717
4726
  if format == "json":
4718
4727
  try:
4719
4728
  from sourcecode.ris import _has_uncommitted_changes as _huc_fresh
4720
- _uncommitted_fresh = _huc_fresh(target)
4729
+ _uncommitted_fresh = (
4730
+ _tree_is_dirty
4731
+ if _tree_is_dirty is not None
4732
+ else _huc_fresh(target)
4733
+ )
4721
4734
  # _huc_fresh uses --untracked-files=no — it misses repos where all
4722
4735
  # files are untracked (no staged/unstaged changes to tracked files).
4723
4736
  # Promote to True when _allowed_changed_files contains untracked files.
@@ -6503,6 +6516,10 @@ def endpoints_cmd(
6503
6516
  "the endpoint count, and the endpoint total is carried across as one "
6504
6517
  "number rather than 3 500 rows.",
6505
6518
  ),
6519
+ include_tests: bool = typer.Option(
6520
+ False, "--include-tests",
6521
+ help="Include endpoints from test source and test-fixture modules; excluded by default.",
6522
+ ),
6506
6523
  client_usage: bool = typer.Option(
6507
6524
  False, "--client-usage",
6508
6525
  help="Join the routes against the HTTP calls written in the TypeScript/"
@@ -6563,7 +6580,7 @@ def endpoints_cmd(
6563
6580
  _prog = Progress()
6564
6581
  _prog.start("scanning endpoints")
6565
6582
  try:
6566
- data = _extract_java_endpoints(target)
6583
+ data = _extract_java_endpoints(target, include_tests=include_tests)
6567
6584
  finally:
6568
6585
  _prog.finish()
6569
6586
 
@@ -8989,9 +9006,26 @@ def spring_audit_cmd(
8989
9006
  # 9,53 s on a 1 303-file repository) and it is the same parse the other
8990
9007
  # knowledge commands share, so it is fetched rather than rebuilt — which
8991
9008
  # is what makes a warm worth anything here (cold == warm before C3-94).
8992
- cir = _ctxcache.shared_cir(
8993
- target, file_list, progress=_work_sink(_prog)
9009
+ _repo_root = _ctxcache.repo_root_of(target)
9010
+ cir, _cir_lookup = _ctxcache.get_or_build_cir(
9011
+ _repo_root, target, file_list, progress=_work_sink(_prog)
8994
9012
  )
9013
+ _cache_state = {
9014
+ "context": "warm" if _cir_lookup.hit else "cold",
9015
+ "parse": "warm" if _cir_lookup.hit else "cold",
9016
+ }
9017
+ try:
9018
+ from sourcecode import cache as _cache_state_mod
9019
+ _cache_status = _cache_state_mod.status(target)
9020
+ _cache_state["snapshot"] = (
9021
+ "warm" if _cache_status.get("cached_cores") else "cold"
9022
+ )
9023
+ _cache_state["ris"] = (
9024
+ "warm" if _cache_status.get("ris_exists") else "cold"
9025
+ )
9026
+ except Exception:
9027
+ _cache_state["snapshot"] = "unknown"
9028
+ _cache_state["ris"] = "unknown"
8995
9029
  # C3-85: the stretch between the last `linking` tick and the first rule
8996
9030
  # tick reports nothing, and what stays on the line is `n/n` — a counter
8997
9031
  # that finished, reading as a stage still running. Measured on keycloak
@@ -9142,7 +9176,18 @@ def spring_audit_cmd(
9142
9176
  "phase that never ran is not evidence there is none."
9143
9177
  )
9144
9178
 
9145
- data = combined.to_compact_dict() if compact else combined.to_dict()
9179
+ _bounded_default = (
9180
+ not compact and output_path is None and format == "json" and not table
9181
+ )
9182
+ data = (
9183
+ combined.to_compact_dict()
9184
+ if compact or _bounded_default
9185
+ else combined.to_dict()
9186
+ )
9187
+ if _bounded_default:
9188
+ data.pop("mode", None)
9189
+ data["default_output"] = "bounded"
9190
+ data.setdefault("metadata", {})["cache_layers"] = _cache_state
9146
9191
  if _stopped_early:
9147
9192
  # C3-87: the block is composed by `PhasedRun.status`, which is the
9148
9193
  # authority `risk` is now bound to as well — one vocabulary for
@@ -223,6 +223,18 @@ def _scan_repository(
223
223
  for fqn in by_qualified[hit]:
224
224
  if fqn not in nested_hits and nested[fqn][1] != rel:
225
225
  nested_hits[fqn] = rel
226
+ # Nested types are often used unqualified by their enclosing
227
+ # class (`private Operation operation` or `Map<String, DATATYPE>`).
228
+ # The declaration is not a reference; a second occurrence is.
229
+ for fqn, (qualified, owner_file) in nested.items():
230
+ if owner_file != rel or fqn in nested_hits:
231
+ continue
232
+ nested_name = qualified.rsplit(".", 1)[-1]
233
+ unqualified = re.findall(
234
+ rf"(?<!\.)\b{re.escape(nested_name)}\b", text
235
+ )
236
+ if len(unqualified) > 1:
237
+ nested_hits[fqn] = rel
226
238
  scan_java = len(nested_hits) < len(nested)
227
239
  if not scan_config and not scan_java:
228
240
  return config_hits, nested_hits, literal_hits
@@ -311,7 +323,7 @@ def analyze_type_references(nodes: "list[dict]", root: Path) -> ReferenceFacts:
311
323
  entries.append(TypeReference(
312
324
  status=REFERENCED,
313
325
  basis=(
314
- f"named as a qualified nested type in {nested_hits[fqn]}"
326
+ f"referenced by its enclosing source in {nested_hits[fqn]}"
315
327
  if fqn in nested_hits
316
328
  else f"referenced by a class literal in {literal_refs[fqn]}"
317
329
  ),
@@ -27,7 +27,7 @@ from typing import Any, Optional
27
27
  #: The date `__version__` was released, from that version's CHANGELOG entry.
28
28
  #: `tests/test_release_info.py` fails the build if the two disagree, so this is
29
29
  #: a copy of a fact rather than a second authority for it.
30
- RELEASE_DATE = "2026-08-12"
30
+ RELEASE_DATE = "2026-08-13"
31
31
 
32
32
  #: Releases per day, measured over the 30 releases before this one (the same
33
33
  #: computation the test re-runs against the CHANGELOG). Stable across window
@@ -6362,10 +6362,13 @@ def is_test_source_file(rel_path: str) -> bool:
6362
6362
  # Convenience: find Java files in a repo
6363
6363
  # ---------------------------------------------------------------------------
6364
6364
 
6365
- def extract_java_endpoints(root: Path) -> "dict[str, Any]":
6365
+ def extract_java_endpoints(
6366
+ root: Path, *, include_tests: bool = False
6367
+ ) -> "dict[str, Any]":
6366
6368
  """Extract REST endpoint surface from Java source files.
6367
6369
 
6368
6370
  Canonical endpoint extractor — uses IR symbol extraction + _build_route_surface().
6371
+ Test-fixture modules remain auditable by default and can be included explicitly.
6369
6372
  Security extraction delegated to _route_security_from_sym (single source of truth);
6370
6373
  results stored in route["security_annotations"] by _build_route_surface.
6371
6374
 
@@ -6674,7 +6677,8 @@ def extract_java_endpoints(root: Path) -> "dict[str, Any]":
6674
6677
  # counted with, the real API surface — but they are preserved in their own bucket
6675
6678
  # so nothing is silently dropped and the exclusion is auditable.
6676
6679
  _test_util_endpoints = [e for e in endpoints if e.get("scope") == "test_util"]
6677
- endpoints = [e for e in endpoints if e.get("scope") != "test_util"]
6680
+ if not include_tests:
6681
+ endpoints = [e for e in endpoints if e.get("scope") != "test_util"]
6678
6682
 
6679
6683
  # "no_security_signal" = no recognized security annotation at method OR class level.
6680
6684
  # Note: repos may use framework-level security (e.g. Keycloak itself) with no
@@ -6898,7 +6902,7 @@ def extract_java_endpoints(root: Path) -> "dict[str, Any]":
6898
6902
  pass
6899
6903
  # Surface test-fixture endpoints excluded from the production surface above.
6900
6904
  # Reported separately (not hidden) so the exclusion is transparent and auditable.
6901
- if _test_util_endpoints:
6905
+ if _test_util_endpoints and not include_tests:
6902
6906
  result["test_util_endpoints"] = _test_util_endpoints
6903
6907
  result["test_util_excluded"] = len(_test_util_endpoints)
6904
6908
  result.setdefault("notes", []).append(
@@ -6906,6 +6910,8 @@ def extract_java_endpoints(root: Path) -> "dict[str, Any]":
6906
6910
  f"module(s) under src/main were excluded from the production surface "
6907
6911
  f"(see test_util_endpoints)."
6908
6912
  )
6913
+ elif _test_util_endpoints:
6914
+ result["test_util_included"] = len(_test_util_endpoints)
6909
6915
  # Surface incomplete-endpoint warnings (interface-defined controllers) only when
6910
6916
  # present, to keep output backward-compatible for the common case.
6911
6917
  if endpoint_warnings:
@@ -6964,6 +6970,17 @@ def extract_java_endpoints(root: Path) -> "dict[str, Any]":
6964
6970
  if any(r.get("framework") == "jax_rs" for r in routes):
6965
6971
  _nonspring.pop("jax_rs", None)
6966
6972
 
6973
+ # Servlet mappings are a URL declaration population, not a count of
6974
+ # HttpServlet classes. Reuse the servlet extractor so `endpoints` and
6975
+ # `endpoints --servlets` publish the same authoritative census.
6976
+ try:
6977
+ from sourcecode.servlet_surface import build_servlet_surface
6978
+
6979
+ _nonspring["servlets"] = int(
6980
+ build_servlet_surface(root).get("declarations", 0)
6981
+ )
6982
+ except Exception:
6983
+ pass
6967
6984
  _nonspring_total = sum(_nonspring.values())
6968
6985
  if _nonspring_total:
6969
6986
  _frameworks = [k for k, v in _nonspring.items() if v]
@@ -7264,6 +7281,23 @@ def compute_blast_radius(
7264
7281
  # class-level node traversable at all (C1-16), and rebuilding it per node
7265
7282
  # would make the walk quadratic in the graph.
7266
7283
  _rg_index = _class_method_index(reverse_graph)
7284
+
7285
+ def _walk_callers(_node: str) -> list[str]:
7286
+ """Expand method frontiers through their owning class as well.
7287
+
7288
+ Service-locator accessors enter the frontier as ``Class#accessor`` while
7289
+ callers of the class are indexed under its method keys. Keeping the
7290
+ exact lookup preserves method-level reach; adding the enclosing class
7291
+ lookup prevents that frontier from becoming a false terminal node.
7292
+ """
7293
+ candidates = list(_all_callers_from_rg(
7294
+ _node, reverse_graph, _rg_index, _impl_graph
7295
+ ))
7296
+ if "#" in _node:
7297
+ candidates.extend(_all_callers_from_rg(
7298
+ _enclosing_class(_node), reverse_graph, _rg_index, _impl_graph
7299
+ ))
7300
+ return list(dict.fromkeys(candidates))
7267
7301
  # Callers inject the interface, not the implementation, so a walk that does not
7268
7302
  # know the implements relation stops one hop short of every DI consumer. Without
7269
7303
  # it this traversal reached 200 classes and **no controller at all** for
@@ -7298,14 +7332,14 @@ def compute_blast_radius(
7298
7332
  _expanded.add(_sym)
7299
7333
  matched_fqns = _expanded
7300
7334
  for seed in matched_fqns:
7301
- _seed_callers = _all_callers_from_rg(seed, reverse_graph, _rg_index, _impl_graph)
7335
+ _seed_callers = _walk_callers(seed)
7302
7336
  if len(_seed_callers) > _HUB_CALLER_THRESHOLD and max_depth > 1:
7303
7337
  _effective_depth = 1
7304
7338
  _hub_class_guard = True
7305
7339
  break
7306
7340
 
7307
7341
  for seed in matched_fqns:
7308
- callers = _all_callers_from_rg(seed, reverse_graph, _rg_index, _impl_graph)
7342
+ callers = _walk_callers(seed)
7309
7343
  for c in callers:
7310
7344
  if c not in all_affected:
7311
7345
  all_affected[c] = 1
@@ -7391,7 +7425,7 @@ def compute_blast_radius(
7391
7425
  node, depth = queue.pop(0)
7392
7426
  if depth >= _effective_depth:
7393
7427
  continue
7394
- for caller in _all_callers_from_rg(node, reverse_graph, _rg_index, _impl_graph):
7428
+ for caller in _walk_callers(node):
7395
7429
  if caller not in visited:
7396
7430
  visited.add(caller)
7397
7431
  all_affected[caller] = depth + 1
@@ -7414,7 +7448,7 @@ def compute_blast_radius(
7414
7448
  _snode, _sdepth = _sample_queue.pop(0)
7415
7449
  if _sdepth >= _HUB_SAMPLE_DEPTH:
7416
7450
  continue
7417
- for _scaller in _all_callers_from_rg(_snode, reverse_graph, _rg_index, _impl_graph):
7451
+ for _scaller in _walk_callers(_snode):
7418
7452
  if _scaller not in _sample_visited:
7419
7453
  _sample_visited.add(_scaller)
7420
7454
  all_affected[_scaller] = _sdepth + 1
@@ -7615,7 +7649,12 @@ def compute_blast_radius(
7615
7649
  _direct_caller_classes = sorted(
7616
7650
  caller_classes(direct_callers, exclude=matched_fqns)
7617
7651
  )
7618
- n_direct_symbols = len(direct_callers)
7652
+ _direct_class_set = set(_direct_caller_classes)
7653
+ _direct_caller_symbols = sorted(
7654
+ symbol for symbol in direct_callers
7655
+ if _enclosing_class(symbol) in _direct_class_set
7656
+ )
7657
+ n_direct_symbols = len(_direct_caller_symbols)
7619
7658
  n_direct_classes = len(_direct_caller_classes)
7620
7659
  n_direct = n_direct_symbols
7621
7660
  n_indirect = len(indirect_callers)
@@ -7827,8 +7866,8 @@ def compute_blast_radius(
7827
7866
  else _direct_caller_classes[:_direct_cap]
7828
7867
  ),
7829
7868
  "direct_caller_symbols": (
7830
- sorted(direct_callers) if _direct_cap is None
7831
- else sorted(direct_callers)[:_direct_cap]
7869
+ _direct_caller_symbols if _direct_cap is None
7870
+ else _direct_caller_symbols[:_direct_cap]
7832
7871
  ),
7833
7872
  "indirect_callers": _indirect_summary,
7834
7873
  "container_wired": [w.to_dict() for w in _container_wired],
@@ -484,18 +484,15 @@ def _programmatic_validation_signals(graph: "ContextGraph") -> "list[str]":
484
484
  if _is_excluded(t.source_file):
485
485
  continue
486
486
  sig = (t.signature or "")
487
- if "org.springframework.validation.Validator" not in sig:
487
+ if (
488
+ "org.springframework.validation.Validator" not in sig
489
+ and not re.search(r"\bimplements\s+Validator\b", sig)
490
+ ):
488
491
  continue
489
492
  if "ConstraintValidator" in sig:
490
493
  continue
491
494
  evidence.append(f"{t.fqn} implements org.springframework.validation.Validator")
492
495
 
493
- for m in graph.symbols(kind="method"):
494
- if _is_excluded(m.source_file):
495
- continue
496
- if m.has_annotation("InitBinder"):
497
- evidence.append(f"{m.fqn} is annotated with @InitBinder")
498
-
499
496
  if evidence:
500
497
  return sorted(dict.fromkeys(evidence))
501
498
 
@@ -627,6 +624,7 @@ def build_validation_surface(
627
624
  "detected": True,
628
625
  "evidence": programmatic_evidence,
629
626
  }
627
+ result["programmatic_validation_gaps"] = []
630
628
  spec_path = endpoints_data.get("openapi_spec")
631
629
  if spec_path:
632
630
  result["openapi_spec"] = spec_path
@@ -717,7 +715,7 @@ def build_validation_surface(
717
715
  "outside the declared-constraint surface this command models."
718
716
  ).strip()
719
717
  if not result.get("gaps"):
720
- result["gaps"] = [
718
+ result["programmatic_validation_gaps"] = [
721
719
  {
722
720
  "method": "",
723
721
  "path": "",
@@ -727,7 +725,6 @@ def build_validation_surface(
727
725
  "confidence": "Likely",
728
726
  }
729
727
  ]
730
- result["summary"]["gaps"] = 1
731
728
 
732
729
  _reconcile_with_code_axis(result, graph, root)
733
730
  if programmatic_evidence:
@@ -740,7 +737,7 @@ def build_validation_surface(
740
737
  if programmatic_note.strip() not in note:
741
738
  result["note"] = (note + programmatic_note).strip()
742
739
  if not result.get("gaps"):
743
- result["gaps"] = [
740
+ result["programmatic_validation_gaps"] = [
744
741
  {
745
742
  "method": "",
746
743
  "path": "",
@@ -750,7 +747,6 @@ def build_validation_surface(
750
747
  "confidence": "Likely",
751
748
  }
752
749
  ]
753
- result["summary"]["gaps"] = 1
754
750
  return result
755
751
 
756
752
 
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes