sourcecode 5.5.1__tar.gz → 5.5.2__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 (357) hide show
  1. {sourcecode-5.5.1 → sourcecode-5.5.2}/CHANGELOG.md +20 -0
  2. {sourcecode-5.5.1 → sourcecode-5.5.2}/PKG-INFO +3 -3
  3. {sourcecode-5.5.1 → sourcecode-5.5.2}/README.md +2 -2
  4. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/USER_GUIDE.md +1 -1
  5. {sourcecode-5.5.1 → sourcecode-5.5.2}/pyproject.toml +1 -1
  6. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/__init__.py +1 -1
  7. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/cli.py +22 -0
  8. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/dependency_analyzer.py +15 -1
  9. sourcecode-5.5.2/src/sourcecode/manifest_cache.py +62 -0
  10. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/migrate_check.py +20 -0
  11. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/repository_ir.py +50 -2
  12. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/risk.py +25 -0
  13. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/servlet_surface.py +10 -3
  14. {sourcecode-5.5.1 → sourcecode-5.5.2}/.github/workflows/build-windows.yml +0 -0
  15. {sourcecode-5.5.1 → sourcecode-5.5.2}/.github/workflows/perf-gate.yml +0 -0
  16. {sourcecode-5.5.1 → sourcecode-5.5.2}/.gitignore +0 -0
  17. {sourcecode-5.5.1 → sourcecode-5.5.2}/.ruff.toml +0 -0
  18. {sourcecode-5.5.1 → sourcecode-5.5.2}/CLAUDE.md +0 -0
  19. {sourcecode-5.5.1 → sourcecode-5.5.2}/CONTRIBUTING.md +0 -0
  20. {sourcecode-5.5.1 → sourcecode-5.5.2}/LICENSE +0 -0
  21. {sourcecode-5.5.1 → sourcecode-5.5.2}/SECURITY.md +0 -0
  22. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/CACHE.md +0 -0
  23. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/COMMERCIAL-OFFER.md +0 -0
  24. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/CUSTOMER-VALIDATION.md +0 -0
  25. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/DEFECT-LEDGER.md +0 -0
  26. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/DEMO-5MIN.md +0 -0
  27. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/DEVELOPMENT-ROADMAP.md +0 -0
  28. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/EXECUTION-PLAN-12MO.md +0 -0
  29. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/EXECUTIVE-ROADMAP.md +0 -0
  30. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/MANUAL-USUARIO.md +0 -0
  31. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/MODERNIZATION.md +0 -0
  32. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/PRODUCT_AUDIT.md +0 -0
  33. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/PRODUCT_IDENTITY.md +0 -0
  34. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/PRODUCT_TIERS.md +0 -0
  35. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/RC1-CHECKLIST.md +0 -0
  36. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/RELEASE-CHECKLIST.md +0 -0
  37. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/CATALOG-retrieval-intents.md +0 -0
  38. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/DESIGN-knowledge-provider-integration.md +0 -0
  39. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/DESIGN-p5.3b-statement-surface.md +0 -0
  40. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/DESIGN-p5.5-span-index.md +0 -0
  41. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/DESIGN-p6-semantic-impact-engine.md +0 -0
  42. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/DESIGN-p6-semantic-integration-engine.md +0 -0
  43. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/DESIGN-p7-semantic-services.md +0 -0
  44. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/DESIGN-robustness-security-inference.md +0 -0
  45. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/DESIGN-semantic-retrieval.md +0 -0
  46. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/EPV-p6-class-typeref.md +0 -0
  47. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/REPORT-p6-flow-analyzer-comparison.md +0 -0
  48. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/REPORT-p6-integration-detector-comparison.md +0 -0
  49. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/REPORT-p8-flow-analyzer-migration.md +0 -0
  50. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/REPORT-p9-integration-detector-migration.md +0 -0
  51. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/adr/0001-semantic-ir.md +0 -0
  52. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/adr/0002-source-evidence-boundary.md +0 -0
  53. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/adr/0003-architectural-characterization.md +0 -0
  54. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/adr/0004-semantic-retrieval.md +0 -0
  55. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/adr/0005-evidence-reconciliation.md +0 -0
  56. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/adr/0006-performance-harness.md +0 -0
  57. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/adr/0007-composition-semantics.md +0 -0
  58. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/adr/0008-answer-coherence.md +0 -0
  59. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/consumer-disposition-inventory.md +0 -0
  60. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/overview.md +0 -0
  61. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/product-architecture-review.md +0 -0
  62. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/product-strategy-layering.md +0 -0
  63. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/semantic-ir-consumer-matrix.md +0 -0
  64. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/semantic-ir-roadmap.md +0 -0
  65. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/baseline-ci.yml +0 -0
  66. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/commercial-pipeline-audit.md +0 -0
  67. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/contracts-ci.yml +0 -0
  68. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/contracts.md +0 -0
  69. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/eval/2026-06-15-petclinic-rest-issue11-vets-pagination.md +0 -0
  70. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/eval/2026-06-15-petclinic-rest-issue147-validation.md +0 -0
  71. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/eval/2026-06-15-petclinic-rest-workflow.md +0 -0
  72. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/eval/2026-06-15-phase18-openapi-surface.md +0 -0
  73. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/eval/2026-06-15-phase20-validation-surface.md +0 -0
  74. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/eval/2026-06-16-broadleaf-checkout-impact-fieldtest.md +0 -0
  75. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/eval/2026-06-16-petclinic-rest-issue11-weakness2-closed.md +0 -0
  76. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/eval/2026-06-16-spring-petclinic-issue2333-dead-vets.md +0 -0
  77. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/licensing-schema.md +0 -0
  78. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/migrate-check.md +0 -0
  79. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/README.md +0 -0
  80. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/REGRESSION-GATE.md +0 -0
  81. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/SUMMARY.md +0 -0
  82. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/alfresco__ask__cold.json +0 -0
  83. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/alfresco__ask__warm.json +0 -0
  84. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/broadleaf__ask__cold.json +0 -0
  85. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/broadleaf__ask__warm.json +0 -0
  86. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/eureka__ask__cold.json +0 -0
  87. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/eureka__ask__warm.json +0 -0
  88. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/jenkins__ask__cold.json +0 -0
  89. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/jenkins__ask__warm.json +0 -0
  90. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/jobrunr__ask__cold.json +0 -0
  91. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/jobrunr__ask__warm.json +0 -0
  92. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/keycloak__ask__cold.json +0 -0
  93. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/keycloak__ask__warm.json +0 -0
  94. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/neo4j__ask__cold.json +0 -0
  95. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/neo4j__ask__warm.json +0 -0
  96. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/ofbiz__ask__cold.json +0 -0
  97. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/ofbiz__ask__warm.json +0 -0
  98. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/openmrs__ask__cold.json +0 -0
  99. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/openmrs__ask__warm.json +0 -0
  100. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/petclinic__ask__cold.json +0 -0
  101. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/petclinic__ask__warm.json +0 -0
  102. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/SUMMARY.md +0 -0
  103. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/alfresco__ask__cold.json +0 -0
  104. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/alfresco__ask__warm.json +0 -0
  105. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/broadleaf__ask__cold.json +0 -0
  106. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/broadleaf__ask__warm.json +0 -0
  107. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/eureka__ask__cold.json +0 -0
  108. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/eureka__ask__warm.json +0 -0
  109. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/jenkins__ask__cold.json +0 -0
  110. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/jenkins__ask__warm.json +0 -0
  111. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/jobrunr__ask__cold.json +0 -0
  112. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/jobrunr__ask__warm.json +0 -0
  113. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/keycloak__ask__cold.json +0 -0
  114. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/keycloak__ask__warm.json +0 -0
  115. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/neo4j__ask__cold.json +0 -0
  116. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/neo4j__ask__warm.json +0 -0
  117. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/ofbiz__ask__cold.json +0 -0
  118. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/ofbiz__ask__warm.json +0 -0
  119. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/openmrs__ask__cold.json +0 -0
  120. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/openmrs__ask__warm.json +0 -0
  121. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/petclinic__ask__cold.json +0 -0
  122. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/petclinic__ask__warm.json +0 -0
  123. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/gate-latest/README.md +0 -0
  124. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/gate-latest/broadleaf__ask__warm.json +0 -0
  125. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/gate-latest/broadleaf__endpoints__warm.json +0 -0
  126. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/gate-latest/broadleaf__migrate-check__warm.json +0 -0
  127. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/gate-latest/broadleaf__posture__warm.json +0 -0
  128. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/gate-latest/broadleaf__spring-audit__warm.json +0 -0
  129. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/gate-latest/broadleaf__validation__warm.json +0 -0
  130. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/reference-best/README.md +0 -0
  131. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/posture.md +0 -0
  132. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/privacy.md +0 -0
  133. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/pro-experience-audit.md +0 -0
  134. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/schema.md +0 -0
  135. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/spec/envelope-v1.md +0 -0
  136. {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/spring-audit-ci.yml +0 -0
  137. {sourcecode-5.5.1 → sourcecode-5.5.2}/raw +0 -0
  138. {sourcecode-5.5.1 → sourcecode-5.5.2}/scripts/compare_integration_engines.py +0 -0
  139. {sourcecode-5.5.1 → sourcecode-5.5.2}/scripts/customer_smoke_test.sh +0 -0
  140. {sourcecode-5.5.1 → sourcecode-5.5.2}/scripts/generate_jdk_exports.py +0 -0
  141. {sourcecode-5.5.1 → sourcecode-5.5.2}/scripts/perf_gate.py +0 -0
  142. {sourcecode-5.5.1 → sourcecode-5.5.2}/scripts/perf_harness.py +0 -0
  143. {sourcecode-5.5.1 → sourcecode-5.5.2}/scripts/sync_gate_anchors.py +0 -0
  144. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/adaptive_scanner.py +0 -0
  145. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/archetype.py +0 -0
  146. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/architectural_baseline.py +0 -0
  147. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/architectural_delta.py +0 -0
  148. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/architecture_analyzer.py +0 -0
  149. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/architecture_summary.py +0 -0
  150. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/ast_extractor.py +0 -0
  151. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/audit_report.py +0 -0
  152. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/baseline_autocapture.py +0 -0
  153. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/bundled_docs.py +0 -0
  154. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/cache.py +0 -0
  155. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/cache_model.py +0 -0
  156. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/call_surface.py +0 -0
  157. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/caller_metrics.py +0 -0
  158. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/caller_reach.py +0 -0
  159. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/canonical_ir.py +0 -0
  160. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/chain_rules.py +0 -0
  161. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/change_plan.py +0 -0
  162. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/cir_graphs.py +0 -0
  163. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/classifier.py +0 -0
  164. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/client_calls.py +0 -0
  165. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/code_notes_analyzer.py +0 -0
  166. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/compare.py +0 -0
  167. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/confidence_analyzer.py +0 -0
  168. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/constraint_diff.py +0 -0
  169. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/consumer_join.py +0 -0
  170. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/container_wiring.py +0 -0
  171. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/context_cache.py +0 -0
  172. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/context_graph.py +0 -0
  173. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/context_scorer.py +0 -0
  174. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/context_summarizer.py +0 -0
  175. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/contract_diff.py +0 -0
  176. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/contract_init.py +0 -0
  177. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/contract_model.py +0 -0
  178. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/contract_pipeline.py +0 -0
  179. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/coverage_parser.py +0 -0
  180. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/data_exposure.py +0 -0
  181. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/data_labels.py +0 -0
  182. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/declarations.py +0 -0
  183. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/defect_identity.py +0 -0
  184. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/degradation.py +0 -0
  185. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/deployment_prefix.py +0 -0
  186. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/detach.py +0 -0
  187. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/detectors/__init__.py +0 -0
  188. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/detectors/base.py +0 -0
  189. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/detectors/csproj_parser.py +0 -0
  190. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/detectors/dart.py +0 -0
  191. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/detectors/dotnet.py +0 -0
  192. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/detectors/elixir.py +0 -0
  193. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/detectors/go.py +0 -0
  194. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/detectors/heuristic.py +0 -0
  195. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/detectors/hybrid.py +0 -0
  196. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/detectors/java.py +0 -0
  197. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/detectors/jvm_ext.py +0 -0
  198. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/detectors/nodejs.py +0 -0
  199. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/detectors/parsers.py +0 -0
  200. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/detectors/php.py +0 -0
  201. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/detectors/project.py +0 -0
  202. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/detectors/python.py +0 -0
  203. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/detectors/ruby.py +0 -0
  204. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/detectors/rust.py +0 -0
  205. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/detectors/systems.py +0 -0
  206. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/detectors/terraform.py +0 -0
  207. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/detectors/tooling.py +0 -0
  208. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/doc_analyzer.py +0 -0
  209. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/dynamic_argument_surface.py +0 -0
  210. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/endpoint_literals.py +0 -0
  211. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/endpoint_metrics.py +0 -0
  212. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/entrypoint_classifier.py +0 -0
  213. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/env_analyzer.py +0 -0
  214. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/envelope.py +0 -0
  215. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/environment_resolution.py +0 -0
  216. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/error_schema.py +0 -0
  217. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/evidence_provider.py +0 -0
  218. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/execution_plan.py +0 -0
  219. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/explain.py +0 -0
  220. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/facts/__init__.py +0 -0
  221. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/facts/registry.json +0 -0
  222. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/file_chunker.py +0 -0
  223. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/file_classifier.py +0 -0
  224. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/filter_surface.py +0 -0
  225. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/format_contract.py +0 -0
  226. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/fqn_utils.py +0 -0
  227. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/gate_anchors.py +0 -0
  228. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/git_analyzer.py +0 -0
  229. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/git_checkout.py +0 -0
  230. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/graph_analyzer.py +0 -0
  231. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/graph_evidence.py +0 -0
  232. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/hibernate_strat.py +0 -0
  233. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/identity_fallback.py +0 -0
  234. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/integration_coordinates.py +0 -0
  235. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/jdk_exports.py +0 -0
  236. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/license.py +0 -0
  237. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/mcp/__init__.py +0 -0
  238. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/mcp/dependency_import.py +0 -0
  239. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/mcp/onboarding/__init__.py +0 -0
  240. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/mcp/onboarding/applier.py +0 -0
  241. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/mcp/onboarding/backup.py +0 -0
  242. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/mcp/onboarding/detector.py +0 -0
  243. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/mcp/onboarding/planner.py +0 -0
  244. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/mcp/orchestrator.py +0 -0
  245. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/mcp/registry.py +0 -0
  246. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/mcp/runner.py +0 -0
  247. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/mcp/server.py +0 -0
  248. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/mcp_nudge.py +0 -0
  249. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/metrics_analyzer.py +0 -0
  250. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/migration_blast.py +0 -0
  251. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/non_coverage.py +0 -0
  252. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/openapi_surface.py +0 -0
  253. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/openrewrite_recipe.py +0 -0
  254. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/output_budget.py +0 -0
  255. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/output_encoding.py +0 -0
  256. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/parallel.py +0 -0
  257. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/parse_cache.py +0 -0
  258. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/partial_contract.py +0 -0
  259. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/path_admission.py +0 -0
  260. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/path_filters.py +0 -0
  261. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/perf.py +0 -0
  262. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/phased_run.py +0 -0
  263. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/pipe_contract.py +0 -0
  264. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/posture.py +0 -0
  265. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/pr_comment_renderer.py +0 -0
  266. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/pr_impact.py +0 -0
  267. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/prepare_context.py +0 -0
  268. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/progress.py +0 -0
  269. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/provenance.py +0 -0
  270. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/ranking_engine.py +0 -0
  271. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/readiness_timeline.py +0 -0
  272. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/readonly.py +0 -0
  273. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/reconciliation.py +0 -0
  274. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/redactor.py +0 -0
  275. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/reference_facts.py +0 -0
  276. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/release_info.py +0 -0
  277. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/relevance_scorer.py +0 -0
  278. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/remedies.py +0 -0
  279. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/rename_refactor.py +0 -0
  280. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/repo_classifier.py +0 -0
  281. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/retrieval/__init__.py +0 -0
  282. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/retrieval/context.py +0 -0
  283. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/retrieval/errors.py +0 -0
  284. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/retrieval/executor.py +0 -0
  285. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/retrieval/planner.py +0 -0
  286. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/retrieval/query.py +0 -0
  287. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/retrieval/request.py +0 -0
  288. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/retrieval/resolution.py +0 -0
  289. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/retrieval/result.py +0 -0
  290. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/retrieval/retriever.py +0 -0
  291. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/retrieval/runtime.py +0 -0
  292. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/retrieval/steps.py +0 -0
  293. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/retrieval/steps_endpoint.py +0 -0
  294. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/retrieval/steps_graph.py +0 -0
  295. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/retrieval/steps_impact.py +0 -0
  296. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/retrieval/steps_intf.py +0 -0
  297. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/retrieval/steps_struct.py +0 -0
  298. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/retrieval/steps_txsec.py +0 -0
  299. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/ris.py +0 -0
  300. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/rule_catalog.py +0 -0
  301. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/rule_pass.py +0 -0
  302. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/runs.py +0 -0
  303. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/runtime_classifier.py +0 -0
  304. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/sarif.py +0 -0
  305. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/scanner.py +0 -0
  306. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/schema.py +0 -0
  307. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/schemas/envelope-v1.schema.json +0 -0
  308. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/security_chain.py +0 -0
  309. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/security_config.py +0 -0
  310. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/security_config_scan.py +0 -0
  311. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/security_posture.py +0 -0
  312. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/semantic_analyzer.py +0 -0
  313. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/semantic_impact_engine.py +0 -0
  314. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/semantic_integration_engine.py +0 -0
  315. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/semantic_services.py +0 -0
  316. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/serializer.py +0 -0
  317. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/source_text.py +0 -0
  318. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/spring_event_topology.py +0 -0
  319. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/spring_findings.py +0 -0
  320. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/spring_impact.py +0 -0
  321. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/spring_model.py +0 -0
  322. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/spring_profiles.py +0 -0
  323. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/spring_properties.py +0 -0
  324. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/spring_security_audit.py +0 -0
  325. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/spring_semantic.py +0 -0
  326. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/spring_tx_analyzer.py +0 -0
  327. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/sql_taint.py +0 -0
  328. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/summarizer.py +0 -0
  329. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/target_admission.py +0 -0
  330. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/telemetry/__init__.py +0 -0
  331. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/telemetry/config.py +0 -0
  332. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/telemetry/consent.py +0 -0
  333. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/telemetry/events.py +0 -0
  334. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/telemetry/filters.py +0 -0
  335. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/telemetry/transport.py +0 -0
  336. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/test_gap_ranking.py +0 -0
  337. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/test_sources.py +0 -0
  338. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/text_input.py +0 -0
  339. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/timeline.py +0 -0
  340. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/token_estimate.py +0 -0
  341. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/tree_utils.py +0 -0
  342. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/type_usage_surface.py +0 -0
  343. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/validation_inference.py +0 -0
  344. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/validation_surface.py +0 -0
  345. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/verify_edit.py +0 -0
  346. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/verify_repo.py +0 -0
  347. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/verify_rules.py +0 -0
  348. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/version_check.py +0 -0
  349. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/waivers.py +0 -0
  350. {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/workspace.py +0 -0
  351. {sourcecode-5.5.1 → sourcecode-5.5.2}/supabase/functions/README.md +0 -0
  352. {sourcecode-5.5.1 → sourcecode-5.5.2}/supabase/functions/get-license/index.ts +0 -0
  353. {sourcecode-5.5.1 → sourcecode-5.5.2}/supabase/functions/lemonsqueezy-webhook/index.ts +0 -0
  354. {sourcecode-5.5.1 → sourcecode-5.5.2}/supabase/functions/telemetry/index.ts +0 -0
  355. {sourcecode-5.5.1 → sourcecode-5.5.2}/supabase/sql/license_event_ordering.sql +0 -0
  356. {sourcecode-5.5.1 → sourcecode-5.5.2}/supabase/sql/licensing_schema.sql +0 -0
  357. {sourcecode-5.5.1 → sourcecode-5.5.2}/supabase/sql/telemetry_events.sql +0 -0
@@ -2,6 +2,26 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [5.5.2] — 2026-08-13
6
+
7
+ **Follow-up audit corrections and performance visibility.**
8
+
9
+ ### Fixed
10
+ - `endpoints --include-tests` now admits test-suite `src/main` sources while
11
+ preserving the production default and its exclusion evidence.
12
+ - `impact` publishes caller provenance and a hub-excluded reach axis instead of
13
+ presenting service-locator expansion as an undifferentiated repository total.
14
+ - Servlet populations use one unique URL-pattern authority with reconciled
15
+ declaration counts.
16
+ - Manifest dependency analysis is content-addressed and root output publishes
17
+ timing layers, including manifest cost.
18
+ - `risk` stdout and `migrate-check --compact` deduplicate invariant rule prose;
19
+ full reports remain available through `-o`.
20
+
21
+ ### Documentation
22
+ - Consolidated the two follow-up audits in the roadmap without duplicating the
23
+ already resolved 5.5.0 defect entries.
24
+
5
25
  ## [5.5.1] — 2026-08-13
6
26
 
7
27
  **External audit corrections and command execution performance.**
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sourcecode
3
- Version: 5.5.1
3
+ Version: 5.5.2
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.1-blue)
45
+ ![Version](https://img.shields.io/badge/version-5.5.2-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.1 — and, on a build that has aged,
129
+ ask version # ask 5.5.2 — 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.1-blue)
7
+ ![Version](https://img.shields.io/badge/version-5.5.2-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.1 — and, on a build that has aged,
91
+ ask version # ask 5.5.2 — 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.1
139
+ # ask 5.5.2
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.1"
7
+ version = "5.5.2"
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.1"
7
+ __version__ = "5.5.2"
@@ -3125,6 +3125,7 @@ def main(
3125
3125
  raise typer.Exit()
3126
3126
 
3127
3127
  _t0 = time.monotonic()
3128
+ _root_timing: dict[str, float] = {}
3128
3129
  no_tree: bool = False # set True by --agent; --no-tree flag removed
3129
3130
 
3130
3131
  # Validate new flag choices
@@ -3947,6 +3948,7 @@ def main(
3947
3948
  if _advisory:
3948
3949
  typer.echo(_advisory, err=True)
3949
3950
 
3951
+ _manifest_t0 = time.perf_counter()
3950
3952
  _perf_detection = perf.start()
3951
3953
  detector = ProjectDetector(build_default_detectors())
3952
3954
  workspace_analysis = WorkspaceAnalyzer().analyze(target, manifests)
@@ -4007,6 +4009,7 @@ def main(
4007
4009
  root_dependencies, root_summary = dependency_analyzer.analyze(target)
4008
4010
  dependency_records.extend(root_dependencies)
4009
4011
  dependency_summaries.append(root_summary)
4012
+ _root_timing["manifests_ms"] = round((time.perf_counter() - _manifest_t0) * 1000, 2)
4010
4013
  module_graphs = []
4011
4014
  if graph_analyzer is not None:
4012
4015
  root_graph_tree = (
@@ -4652,6 +4655,13 @@ def main(
4652
4655
  )
4653
4656
 
4654
4657
  perf.stop("analysis", _perf_analysis)
4658
+ # Root timings are deliberately a small diagnostic envelope. They make cold
4659
+ # manifest cost visible even when the optional perf recorder is disabled.
4660
+ _root_timing.setdefault("context_ms", round((time.monotonic() - _t0) * 1000, 2))
4661
+ _root_timing.setdefault("parse_ms", 0.0)
4662
+ _root_timing.setdefault("cir_ms", 0.0)
4663
+ _root_timing.setdefault("ris_ms", 0.0)
4664
+ _root_timing.setdefault("snapshot_ms", 0.0)
4655
4665
  # 4. Serialize
4656
4666
  _progress.update("serializing output")
4657
4667
  _perf_serialize = perf.start()
@@ -4697,8 +4707,16 @@ def main(
4697
4707
  raw_dict = standard_view(sm, include_tree=tree and not no_tree)
4698
4708
  if not no_redact:
4699
4709
  raw_dict = redact_dict(raw_dict)
4710
+ data = raw_dict
4700
4711
  content = _serialize_dict(raw_dict, format)
4701
4712
 
4713
+ if isinstance(data, dict):
4714
+ data.setdefault("_meta", {})["timing_ms"] = {
4715
+ **_root_timing,
4716
+ "total_ms": round((time.monotonic() - _t0) * 1000, 2),
4717
+ }
4718
+ content = _serialize_dict(data, format)
4719
+
4702
4720
  perf.stop("serialize", _perf_serialize)
4703
4721
  perf.flush_recorder()
4704
4722
 
@@ -9221,6 +9239,7 @@ def spring_audit_cmd(
9221
9239
  elif format == "github-comment":
9222
9240
  output = _render_spring_audit_github_comment(combined, min_severity)
9223
9241
  else:
9242
+ data = combined.to_compact_dict() if compact else combined.to_dict()
9224
9243
  output = _serialize_dict(data, format)
9225
9244
 
9226
9245
  # F-AV: our own readers ask for the count under either spelling — the break
@@ -9808,6 +9827,9 @@ def risk_cmd(
9808
9827
  data, rule_filter=rule_filter, band_filter=band_filter, top_n=top_n
9809
9828
  )
9810
9829
  else:
9830
+ if output_path is None:
9831
+ from sourcecode.risk import compact_risk_output
9832
+ data = compact_risk_output(data)
9811
9833
  output = _serialize_dict(data, format)
9812
9834
  _emit_command_output(
9813
9835
  output,
@@ -162,6 +162,15 @@ class DependencyAnalyzer:
162
162
  *,
163
163
  workspace: str | None = None,
164
164
  ) -> tuple[list[DependencyRecord], DependencySummary]:
165
+ from sourcecode import manifest_cache
166
+
167
+ cached = manifest_cache.load(root)
168
+ if cached is not None:
169
+ records, summary = cached
170
+ if workspace is not None:
171
+ records = [replace(record, workspace=workspace) for record in records]
172
+ summary = replace(summary, dependencies=records)
173
+ return records, summary
165
174
  records: list[DependencyRecord] = []
166
175
  limitations: list[str] = []
167
176
 
@@ -185,7 +194,12 @@ class DependencyAnalyzer:
185
194
  replace(r, role=_infer_role(r.name, r.ecosystem, r.scope))
186
195
  for r in deduped
187
196
  ]
188
- return deduped, self._build_summary(deduped, limitations)
197
+ summary = self._build_summary(deduped, limitations)
198
+ manifest_cache.save(root, deduped, summary)
199
+ if workspace is not None:
200
+ deduped = [replace(record, workspace=workspace) for record in deduped]
201
+ summary = replace(summary, dependencies=deduped)
202
+ return deduped, summary
189
203
 
190
204
  def merge_summaries(self, summaries: Iterable[DependencySummary]) -> DependencySummary:
191
205
  result = DependencySummary(requested=True)
@@ -0,0 +1,62 @@
1
+ """Content-addressed cache for manifest dependency analysis."""
2
+ from __future__ import annotations
3
+
4
+ import hashlib
5
+ import json
6
+ import os
7
+ from dataclasses import asdict
8
+ from pathlib import Path
9
+
10
+ from sourcecode.schema import DependencyRecord, DependencySummary
11
+
12
+
13
+ def _base() -> Path:
14
+ configured = os.environ.get("SOURCECODE_CACHE_DIR", "")
15
+ return Path(configured) if configured else Path.home() / ".sourcecode" / "cache"
16
+
17
+
18
+ def _key(root: Path) -> str:
19
+ digest = hashlib.sha256()
20
+ analyzer = Path(__file__).with_name("dependency_analyzer.py")
21
+ digest.update(analyzer.read_bytes())
22
+ names = {
23
+ "pom.xml", "build.gradle", "build.gradle.kts", "package.json",
24
+ "package-lock.json", "pyproject.toml", "Cargo.toml", "go.mod",
25
+ "composer.json", "Gemfile",
26
+ }
27
+ paths: set[Path] = set()
28
+ for name in names:
29
+ paths.update(root.rglob(name))
30
+ for path in sorted(paths):
31
+ if not path.is_file():
32
+ continue
33
+ try:
34
+ digest.update(path.relative_to(root).as_posix().encode())
35
+ digest.update(path.read_bytes())
36
+ except OSError:
37
+ continue
38
+ return digest.hexdigest()
39
+
40
+
41
+ def load(root: Path) -> tuple[list[DependencyRecord], DependencySummary] | None:
42
+ try:
43
+ path = _base() / "manifest-cache-v1" / f"{_key(root)}.json"
44
+ data = json.loads(path.read_text(encoding="utf-8"))
45
+ records = [DependencyRecord(**row) for row in data["records"]]
46
+ summary = DependencySummary(**data["summary"])
47
+ summary.dependencies = records
48
+ return records, summary
49
+ except (OSError, ValueError, KeyError, TypeError):
50
+ return None
51
+
52
+
53
+ def save(root: Path, records: list[DependencyRecord], summary: DependencySummary) -> None:
54
+ try:
55
+ path = _base() / "manifest-cache-v1" / f"{_key(root)}.json"
56
+ path.parent.mkdir(parents=True, exist_ok=True)
57
+ payload = {"records": [asdict(row) for row in records], "summary": asdict(summary)}
58
+ tmp = path.with_suffix(".tmp")
59
+ tmp.write_text(json.dumps(payload, sort_keys=True), encoding="utf-8")
60
+ tmp.replace(path)
61
+ except OSError:
62
+ return
@@ -2375,6 +2375,26 @@ class MigrationReport:
2375
2375
  compact, "findings", top_n,
2376
2376
  key=lambda f: SEVERITY_ORDER.get(f.get("severity"), 3),
2377
2377
  )
2378
+ # Keep invariant rule prose once; each finding carries only location and
2379
+ # rule identity. Full prose remains available in the non-compact report.
2380
+ _rule_catalog: dict[str, dict] = {}
2381
+ _lean_findings: list[dict] = []
2382
+ for _finding in compact.get("findings", []):
2383
+ _rule_id = _finding.get("rule_id", "unknown")
2384
+ _rule_catalog.setdefault(_rule_id, {
2385
+ "title": _finding.get("title", ""),
2386
+ "explanation": _finding.get("explanation", ""),
2387
+ "fix_hint": _finding.get("fix_hint", ""),
2388
+ })
2389
+ _lean_findings.append({
2390
+ key: _finding[key]
2391
+ for key in (
2392
+ "id", "rule_id", "severity", "source_file", "first_line",
2393
+ "migration_target", "imports_found", "code_context",
2394
+ ) if key in _finding
2395
+ })
2396
+ compact["rule_catalog"] = _rule_catalog
2397
+ compact["findings"] = _lean_findings
2378
2398
  hib = full.get("hibernate")
2379
2399
  if isinstance(hib, dict):
2380
2400
  h = dict(hib)
@@ -6411,7 +6411,7 @@ def extract_java_endpoints(
6411
6411
 
6412
6412
  java_files = sorted(
6413
6413
  p for p in root.rglob("*.java")
6414
- if not is_test_source_file(_rel(p))
6414
+ if (include_tests or not is_test_source_file(_rel(p)))
6415
6415
  and "target/" not in str(p).replace("\\", "/")
6416
6416
  and not any(f in str(p).replace("\\", "/") for f in _CLIENT_PATH_FRAGMENTS)
6417
6417
  )
@@ -7419,16 +7419,22 @@ def compute_blast_radius(
7419
7419
 
7420
7420
  # BFS for indirect callers
7421
7421
  indirect_callers: list[str] = []
7422
+ _indirect_parent: dict[str, str] = {}
7423
+ _hub_frontier_nodes: set[str] = set()
7422
7424
  visited: set[str] = set(matched_fqns) | set(direct_callers)
7423
7425
 
7424
7426
  while queue:
7425
7427
  node, depth = queue.pop(0)
7426
7428
  if depth >= _effective_depth:
7427
7429
  continue
7428
- for caller in _walk_callers(node):
7430
+ _node_callers = _walk_callers(node)
7431
+ if len(_node_callers) > _HUB_CALLER_THRESHOLD:
7432
+ _hub_frontier_nodes.add(node)
7433
+ for caller in _node_callers:
7429
7434
  if caller not in visited:
7430
7435
  visited.add(caller)
7431
7436
  all_affected[caller] = depth + 1
7437
+ _indirect_parent[caller] = node
7432
7438
  indirect_callers.append(caller)
7433
7439
  queue.append((caller, depth + 1))
7434
7440
 
@@ -7658,6 +7664,29 @@ def compute_blast_radius(
7658
7664
  n_direct_classes = len(_direct_caller_classes)
7659
7665
  n_direct = n_direct_symbols
7660
7666
  n_indirect = len(indirect_callers)
7667
+
7668
+ # The complete reverse walk is useful as a measured upper reach, but a
7669
+ # service-locator hub can make it collapse to "the whole repository". Publish
7670
+ # a second, conservative axis that stops at hub frontiers instead of forcing
7671
+ # consumers to guess from a flat list of symbols.
7672
+ _without_hubs: list[str] = []
7673
+ _without_hubs_seen = set(matched_fqns) | set(direct_callers)
7674
+ _without_hubs_queue: list[tuple[str, int]] = [
7675
+ (c, 1) for c in direct_callers
7676
+ ]
7677
+ while _without_hubs_queue:
7678
+ _node, _depth = _without_hubs_queue.pop(0)
7679
+ if _depth >= _effective_depth:
7680
+ continue
7681
+ _next = _walk_callers(_node)
7682
+ if len(_next) > _HUB_CALLER_THRESHOLD:
7683
+ continue
7684
+ for _caller in _next:
7685
+ if _caller not in _without_hubs_seen:
7686
+ _without_hubs_seen.add(_caller)
7687
+ _without_hubs.append(_caller)
7688
+ _without_hubs_queue.append((_caller, _depth + 1))
7689
+
7661
7690
  n_ep = len(endpoints_affected)
7662
7691
  n_txn = len(txn_nodes)
7663
7692
  n_mappers = len(mappers_affected)
@@ -7824,6 +7853,20 @@ def compute_blast_radius(
7824
7853
  _indirect_summary = (
7825
7854
  _indirect_ordered if _indirect_cap is None else _indirect_ordered[:_indirect_cap]
7826
7855
  )
7856
+ def _via_hub(_node: str) -> bool:
7857
+ _seen_path: set[str] = set()
7858
+ _cursor = _node
7859
+ while _cursor in _indirect_parent and _cursor not in _seen_path:
7860
+ _seen_path.add(_cursor)
7861
+ _cursor = _indirect_parent[_cursor]
7862
+ if _cursor in _hub_frontier_nodes:
7863
+ return True
7864
+ return False
7865
+
7866
+ _indirect_details = [
7867
+ {"fqn": _node, "depth": all_affected.get(_node), "via_hub": _via_hub(_node)}
7868
+ for _node in _indirect_summary
7869
+ ]
7827
7870
 
7828
7871
  out: dict = {
7829
7872
  "target": target,
@@ -7870,6 +7913,7 @@ def compute_blast_radius(
7870
7913
  else _direct_caller_symbols[:_direct_cap]
7871
7914
  ),
7872
7915
  "indirect_callers": _indirect_summary,
7916
+ "indirect_caller_details": _indirect_details,
7873
7917
  "container_wired": [w.to_dict() for w in _container_wired],
7874
7918
  "endpoints_affected": endpoints_affected,
7875
7919
  "mappers_affected": mappers_affected,
@@ -7889,6 +7933,10 @@ def compute_blast_radius(
7889
7933
  "indirect_caller_count": n_indirect,
7890
7934
  "indirect_callers_computed": not _bfs_truncated or _indirect_sampled,
7891
7935
  "indirect_callers_sampled": _indirect_sampled,
7936
+ "indirect_caller_count_unit": "reference symbols (methods or classes)",
7937
+ "indirect_callers_without_hubs_count": len(_without_hubs),
7938
+ "indirect_callers_without_hubs_unit": "reference symbols (hub frontiers excluded)",
7939
+ "hub_frontier_count": len(_hub_frontier_nodes),
7892
7940
  "endpoints_affected_count": n_ep,
7893
7941
  # C1-37: four figures called "endpoints" at one commit (3 364 /
7894
7942
  # 3 382 / 3 382 / 3 574). Each one now says which population it
@@ -47,6 +47,31 @@ if TYPE_CHECKING:
47
47
 
48
48
  RISK_SCHEMA = "risk-v1"
49
49
 
50
+
51
+ def compact_risk_output(data: dict) -> dict:
52
+ """Project stdout to stable rule prose plus small per-defect evidence."""
53
+ compact = dict(data)
54
+ rows = data.get("risks") or []
55
+ rules: dict[str, dict] = {}
56
+ lean: list[dict] = []
57
+ for row in rows:
58
+ rule_ids = row.get("rule_ids") or [row.get("rule_id", "unknown")]
59
+ for rule_id in rule_ids:
60
+ rules.setdefault(rule_id, {
61
+ "title": row.get("title", ""),
62
+ "statement": row.get("statement", ""),
63
+ })
64
+ lean.append({
65
+ key: row[key] for key in (
66
+ "defect_id", "symbol", "source_file", "first_line", "band",
67
+ "score", "rule_ids", "factors",
68
+ ) if key in row
69
+ })
70
+ compact["rules"] = rules
71
+ compact["risks"] = lean
72
+ compact["default_output"] = "bounded"
73
+ return compact
74
+
50
75
  #: The composition, in one place. The payload publishes it, `--help` renders it and
51
76
  #: the battery holds both to it: a hand-copied model line in the help screen went on
52
77
  #: advertising four factors for as long as it took someone to read it, which is the
@@ -168,9 +168,16 @@ def build_servlet_surface(root: Path, *, limit: Optional[int] = None) -> dict:
168
168
  elif path.suffix == ".java":
169
169
  mappings.extend(_from_registration_beans(path, relative))
170
170
 
171
- # One URL pattern declared twice is two declarations of one reachable path; the
172
- # census counts patterns, the rows keep every declaration.
173
- patterns = sorted({m.url_pattern for m in mappings})
171
+ # A URL pattern is the observable HTTP surface. Multiple descriptors can
172
+ # repeat it, but publishing every duplicate made `declarations` disagree with
173
+ # the pattern census and with endpoint-side reconciliation. Keep the first
174
+ # deterministic declaration as provenance and expose one row per reachable
175
+ # pattern.
176
+ _unique: dict[str, ServletMapping] = {}
177
+ for mapping in sorted(mappings, key=lambda m: (m.url_pattern, m.source_file, m.source)):
178
+ _unique.setdefault(mapping.url_pattern, mapping)
179
+ mappings = list(_unique.values())
180
+ patterns = sorted(_unique)
174
181
  by_source: "dict[str, int]" = {}
175
182
  for mapping in mappings:
176
183
  by_source[mapping.source] = by_source.get(mapping.source, 0) + 1
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