sourcecode 5.5.0__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.0 → sourcecode-5.5.2}/CHANGELOG.md +40 -0
  2. {sourcecode-5.5.0 → sourcecode-5.5.2}/PKG-INFO +3 -3
  3. {sourcecode-5.5.0 → sourcecode-5.5.2}/README.md +2 -2
  4. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/USER_GUIDE.md +1 -1
  5. {sourcecode-5.5.0 → sourcecode-5.5.2}/pyproject.toml +1 -1
  6. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/__init__.py +1 -1
  7. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/cli.py +73 -6
  8. {sourcecode-5.5.0 → 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.0 → sourcecode-5.5.2}/src/sourcecode/migrate_check.py +20 -0
  11. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/reference_facts.py +13 -1
  12. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/release_info.py +1 -1
  13. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/repository_ir.py +98 -11
  14. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/risk.py +25 -0
  15. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/servlet_surface.py +10 -3
  16. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/validation_surface.py +7 -11
  17. {sourcecode-5.5.0 → sourcecode-5.5.2}/.github/workflows/build-windows.yml +0 -0
  18. {sourcecode-5.5.0 → sourcecode-5.5.2}/.github/workflows/perf-gate.yml +0 -0
  19. {sourcecode-5.5.0 → sourcecode-5.5.2}/.gitignore +0 -0
  20. {sourcecode-5.5.0 → sourcecode-5.5.2}/.ruff.toml +0 -0
  21. {sourcecode-5.5.0 → sourcecode-5.5.2}/CLAUDE.md +0 -0
  22. {sourcecode-5.5.0 → sourcecode-5.5.2}/CONTRIBUTING.md +0 -0
  23. {sourcecode-5.5.0 → sourcecode-5.5.2}/LICENSE +0 -0
  24. {sourcecode-5.5.0 → sourcecode-5.5.2}/SECURITY.md +0 -0
  25. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/CACHE.md +0 -0
  26. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/COMMERCIAL-OFFER.md +0 -0
  27. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/CUSTOMER-VALIDATION.md +0 -0
  28. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/DEFECT-LEDGER.md +0 -0
  29. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/DEMO-5MIN.md +0 -0
  30. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/DEVELOPMENT-ROADMAP.md +0 -0
  31. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/EXECUTION-PLAN-12MO.md +0 -0
  32. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/EXECUTIVE-ROADMAP.md +0 -0
  33. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/MANUAL-USUARIO.md +0 -0
  34. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/MODERNIZATION.md +0 -0
  35. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/PRODUCT_AUDIT.md +0 -0
  36. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/PRODUCT_IDENTITY.md +0 -0
  37. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/PRODUCT_TIERS.md +0 -0
  38. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/RC1-CHECKLIST.md +0 -0
  39. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/RELEASE-CHECKLIST.md +0 -0
  40. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/architecture/CATALOG-retrieval-intents.md +0 -0
  41. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/architecture/DESIGN-knowledge-provider-integration.md +0 -0
  42. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/architecture/DESIGN-p5.3b-statement-surface.md +0 -0
  43. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/architecture/DESIGN-p5.5-span-index.md +0 -0
  44. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/architecture/DESIGN-p6-semantic-impact-engine.md +0 -0
  45. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/architecture/DESIGN-p6-semantic-integration-engine.md +0 -0
  46. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/architecture/DESIGN-p7-semantic-services.md +0 -0
  47. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/architecture/DESIGN-robustness-security-inference.md +0 -0
  48. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/architecture/DESIGN-semantic-retrieval.md +0 -0
  49. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/architecture/EPV-p6-class-typeref.md +0 -0
  50. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/architecture/REPORT-p6-flow-analyzer-comparison.md +0 -0
  51. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/architecture/REPORT-p6-integration-detector-comparison.md +0 -0
  52. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/architecture/REPORT-p8-flow-analyzer-migration.md +0 -0
  53. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/architecture/REPORT-p9-integration-detector-migration.md +0 -0
  54. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/architecture/adr/0001-semantic-ir.md +0 -0
  55. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/architecture/adr/0002-source-evidence-boundary.md +0 -0
  56. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/architecture/adr/0003-architectural-characterization.md +0 -0
  57. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/architecture/adr/0004-semantic-retrieval.md +0 -0
  58. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/architecture/adr/0005-evidence-reconciliation.md +0 -0
  59. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/architecture/adr/0006-performance-harness.md +0 -0
  60. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/architecture/adr/0007-composition-semantics.md +0 -0
  61. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/architecture/adr/0008-answer-coherence.md +0 -0
  62. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/architecture/consumer-disposition-inventory.md +0 -0
  63. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/architecture/overview.md +0 -0
  64. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/architecture/product-architecture-review.md +0 -0
  65. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/architecture/product-strategy-layering.md +0 -0
  66. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/architecture/semantic-ir-consumer-matrix.md +0 -0
  67. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/architecture/semantic-ir-roadmap.md +0 -0
  68. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/baseline-ci.yml +0 -0
  69. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/commercial-pipeline-audit.md +0 -0
  70. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/contracts-ci.yml +0 -0
  71. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/contracts.md +0 -0
  72. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/eval/2026-06-15-petclinic-rest-issue11-vets-pagination.md +0 -0
  73. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/eval/2026-06-15-petclinic-rest-issue147-validation.md +0 -0
  74. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/eval/2026-06-15-petclinic-rest-workflow.md +0 -0
  75. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/eval/2026-06-15-phase18-openapi-surface.md +0 -0
  76. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/eval/2026-06-15-phase20-validation-surface.md +0 -0
  77. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/eval/2026-06-16-broadleaf-checkout-impact-fieldtest.md +0 -0
  78. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/eval/2026-06-16-petclinic-rest-issue11-weakness2-closed.md +0 -0
  79. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/eval/2026-06-16-spring-petclinic-issue2333-dead-vets.md +0 -0
  80. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/licensing-schema.md +0 -0
  81. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/migrate-check.md +0 -0
  82. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/README.md +0 -0
  83. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/REGRESSION-GATE.md +0 -0
  84. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/SUMMARY.md +0 -0
  85. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/alfresco__ask__cold.json +0 -0
  86. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/alfresco__ask__warm.json +0 -0
  87. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/broadleaf__ask__cold.json +0 -0
  88. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/broadleaf__ask__warm.json +0 -0
  89. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/eureka__ask__cold.json +0 -0
  90. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/eureka__ask__warm.json +0 -0
  91. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/jenkins__ask__cold.json +0 -0
  92. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/jenkins__ask__warm.json +0 -0
  93. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/jobrunr__ask__cold.json +0 -0
  94. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/jobrunr__ask__warm.json +0 -0
  95. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/keycloak__ask__cold.json +0 -0
  96. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/keycloak__ask__warm.json +0 -0
  97. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/neo4j__ask__cold.json +0 -0
  98. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/neo4j__ask__warm.json +0 -0
  99. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/ofbiz__ask__cold.json +0 -0
  100. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/ofbiz__ask__warm.json +0 -0
  101. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/openmrs__ask__cold.json +0 -0
  102. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/openmrs__ask__warm.json +0 -0
  103. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/petclinic__ask__cold.json +0 -0
  104. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/petclinic__ask__warm.json +0 -0
  105. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/SUMMARY.md +0 -0
  106. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/alfresco__ask__cold.json +0 -0
  107. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/alfresco__ask__warm.json +0 -0
  108. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/broadleaf__ask__cold.json +0 -0
  109. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/broadleaf__ask__warm.json +0 -0
  110. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/eureka__ask__cold.json +0 -0
  111. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/eureka__ask__warm.json +0 -0
  112. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/jenkins__ask__cold.json +0 -0
  113. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/jenkins__ask__warm.json +0 -0
  114. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/jobrunr__ask__cold.json +0 -0
  115. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/jobrunr__ask__warm.json +0 -0
  116. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/keycloak__ask__cold.json +0 -0
  117. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/keycloak__ask__warm.json +0 -0
  118. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/neo4j__ask__cold.json +0 -0
  119. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/neo4j__ask__warm.json +0 -0
  120. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/ofbiz__ask__cold.json +0 -0
  121. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/ofbiz__ask__warm.json +0 -0
  122. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/openmrs__ask__cold.json +0 -0
  123. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/openmrs__ask__warm.json +0 -0
  124. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/petclinic__ask__cold.json +0 -0
  125. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/petclinic__ask__warm.json +0 -0
  126. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/gate-latest/README.md +0 -0
  127. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/gate-latest/broadleaf__ask__warm.json +0 -0
  128. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/gate-latest/broadleaf__endpoints__warm.json +0 -0
  129. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/gate-latest/broadleaf__migrate-check__warm.json +0 -0
  130. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/gate-latest/broadleaf__posture__warm.json +0 -0
  131. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/gate-latest/broadleaf__spring-audit__warm.json +0 -0
  132. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/gate-latest/broadleaf__validation__warm.json +0 -0
  133. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/reference-best/README.md +0 -0
  134. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/posture.md +0 -0
  135. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/privacy.md +0 -0
  136. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/pro-experience-audit.md +0 -0
  137. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/schema.md +0 -0
  138. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/spec/envelope-v1.md +0 -0
  139. {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/spring-audit-ci.yml +0 -0
  140. {sourcecode-5.5.0 → sourcecode-5.5.2}/raw +0 -0
  141. {sourcecode-5.5.0 → sourcecode-5.5.2}/scripts/compare_integration_engines.py +0 -0
  142. {sourcecode-5.5.0 → sourcecode-5.5.2}/scripts/customer_smoke_test.sh +0 -0
  143. {sourcecode-5.5.0 → sourcecode-5.5.2}/scripts/generate_jdk_exports.py +0 -0
  144. {sourcecode-5.5.0 → sourcecode-5.5.2}/scripts/perf_gate.py +0 -0
  145. {sourcecode-5.5.0 → sourcecode-5.5.2}/scripts/perf_harness.py +0 -0
  146. {sourcecode-5.5.0 → sourcecode-5.5.2}/scripts/sync_gate_anchors.py +0 -0
  147. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/adaptive_scanner.py +0 -0
  148. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/archetype.py +0 -0
  149. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/architectural_baseline.py +0 -0
  150. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/architectural_delta.py +0 -0
  151. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/architecture_analyzer.py +0 -0
  152. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/architecture_summary.py +0 -0
  153. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/ast_extractor.py +0 -0
  154. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/audit_report.py +0 -0
  155. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/baseline_autocapture.py +0 -0
  156. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/bundled_docs.py +0 -0
  157. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/cache.py +0 -0
  158. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/cache_model.py +0 -0
  159. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/call_surface.py +0 -0
  160. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/caller_metrics.py +0 -0
  161. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/caller_reach.py +0 -0
  162. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/canonical_ir.py +0 -0
  163. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/chain_rules.py +0 -0
  164. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/change_plan.py +0 -0
  165. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/cir_graphs.py +0 -0
  166. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/classifier.py +0 -0
  167. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/client_calls.py +0 -0
  168. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/code_notes_analyzer.py +0 -0
  169. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/compare.py +0 -0
  170. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/confidence_analyzer.py +0 -0
  171. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/constraint_diff.py +0 -0
  172. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/consumer_join.py +0 -0
  173. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/container_wiring.py +0 -0
  174. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/context_cache.py +0 -0
  175. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/context_graph.py +0 -0
  176. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/context_scorer.py +0 -0
  177. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/context_summarizer.py +0 -0
  178. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/contract_diff.py +0 -0
  179. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/contract_init.py +0 -0
  180. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/contract_model.py +0 -0
  181. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/contract_pipeline.py +0 -0
  182. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/coverage_parser.py +0 -0
  183. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/data_exposure.py +0 -0
  184. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/data_labels.py +0 -0
  185. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/declarations.py +0 -0
  186. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/defect_identity.py +0 -0
  187. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/degradation.py +0 -0
  188. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/deployment_prefix.py +0 -0
  189. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/detach.py +0 -0
  190. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/detectors/__init__.py +0 -0
  191. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/detectors/base.py +0 -0
  192. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/detectors/csproj_parser.py +0 -0
  193. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/detectors/dart.py +0 -0
  194. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/detectors/dotnet.py +0 -0
  195. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/detectors/elixir.py +0 -0
  196. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/detectors/go.py +0 -0
  197. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/detectors/heuristic.py +0 -0
  198. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/detectors/hybrid.py +0 -0
  199. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/detectors/java.py +0 -0
  200. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/detectors/jvm_ext.py +0 -0
  201. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/detectors/nodejs.py +0 -0
  202. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/detectors/parsers.py +0 -0
  203. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/detectors/php.py +0 -0
  204. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/detectors/project.py +0 -0
  205. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/detectors/python.py +0 -0
  206. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/detectors/ruby.py +0 -0
  207. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/detectors/rust.py +0 -0
  208. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/detectors/systems.py +0 -0
  209. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/detectors/terraform.py +0 -0
  210. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/detectors/tooling.py +0 -0
  211. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/doc_analyzer.py +0 -0
  212. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/dynamic_argument_surface.py +0 -0
  213. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/endpoint_literals.py +0 -0
  214. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/endpoint_metrics.py +0 -0
  215. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/entrypoint_classifier.py +0 -0
  216. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/env_analyzer.py +0 -0
  217. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/envelope.py +0 -0
  218. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/environment_resolution.py +0 -0
  219. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/error_schema.py +0 -0
  220. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/evidence_provider.py +0 -0
  221. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/execution_plan.py +0 -0
  222. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/explain.py +0 -0
  223. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/facts/__init__.py +0 -0
  224. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/facts/registry.json +0 -0
  225. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/file_chunker.py +0 -0
  226. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/file_classifier.py +0 -0
  227. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/filter_surface.py +0 -0
  228. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/format_contract.py +0 -0
  229. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/fqn_utils.py +0 -0
  230. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/gate_anchors.py +0 -0
  231. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/git_analyzer.py +0 -0
  232. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/git_checkout.py +0 -0
  233. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/graph_analyzer.py +0 -0
  234. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/graph_evidence.py +0 -0
  235. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/hibernate_strat.py +0 -0
  236. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/identity_fallback.py +0 -0
  237. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/integration_coordinates.py +0 -0
  238. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/jdk_exports.py +0 -0
  239. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/license.py +0 -0
  240. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/mcp/__init__.py +0 -0
  241. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/mcp/dependency_import.py +0 -0
  242. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/mcp/onboarding/__init__.py +0 -0
  243. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/mcp/onboarding/applier.py +0 -0
  244. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/mcp/onboarding/backup.py +0 -0
  245. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/mcp/onboarding/detector.py +0 -0
  246. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/mcp/onboarding/planner.py +0 -0
  247. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/mcp/orchestrator.py +0 -0
  248. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/mcp/registry.py +0 -0
  249. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/mcp/runner.py +0 -0
  250. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/mcp/server.py +0 -0
  251. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/mcp_nudge.py +0 -0
  252. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/metrics_analyzer.py +0 -0
  253. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/migration_blast.py +0 -0
  254. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/non_coverage.py +0 -0
  255. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/openapi_surface.py +0 -0
  256. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/openrewrite_recipe.py +0 -0
  257. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/output_budget.py +0 -0
  258. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/output_encoding.py +0 -0
  259. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/parallel.py +0 -0
  260. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/parse_cache.py +0 -0
  261. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/partial_contract.py +0 -0
  262. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/path_admission.py +0 -0
  263. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/path_filters.py +0 -0
  264. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/perf.py +0 -0
  265. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/phased_run.py +0 -0
  266. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/pipe_contract.py +0 -0
  267. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/posture.py +0 -0
  268. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/pr_comment_renderer.py +0 -0
  269. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/pr_impact.py +0 -0
  270. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/prepare_context.py +0 -0
  271. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/progress.py +0 -0
  272. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/provenance.py +0 -0
  273. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/ranking_engine.py +0 -0
  274. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/readiness_timeline.py +0 -0
  275. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/readonly.py +0 -0
  276. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/reconciliation.py +0 -0
  277. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/redactor.py +0 -0
  278. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/relevance_scorer.py +0 -0
  279. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/remedies.py +0 -0
  280. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/rename_refactor.py +0 -0
  281. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/repo_classifier.py +0 -0
  282. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/retrieval/__init__.py +0 -0
  283. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/retrieval/context.py +0 -0
  284. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/retrieval/errors.py +0 -0
  285. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/retrieval/executor.py +0 -0
  286. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/retrieval/planner.py +0 -0
  287. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/retrieval/query.py +0 -0
  288. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/retrieval/request.py +0 -0
  289. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/retrieval/resolution.py +0 -0
  290. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/retrieval/result.py +0 -0
  291. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/retrieval/retriever.py +0 -0
  292. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/retrieval/runtime.py +0 -0
  293. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/retrieval/steps.py +0 -0
  294. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/retrieval/steps_endpoint.py +0 -0
  295. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/retrieval/steps_graph.py +0 -0
  296. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/retrieval/steps_impact.py +0 -0
  297. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/retrieval/steps_intf.py +0 -0
  298. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/retrieval/steps_struct.py +0 -0
  299. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/retrieval/steps_txsec.py +0 -0
  300. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/ris.py +0 -0
  301. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/rule_catalog.py +0 -0
  302. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/rule_pass.py +0 -0
  303. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/runs.py +0 -0
  304. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/runtime_classifier.py +0 -0
  305. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/sarif.py +0 -0
  306. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/scanner.py +0 -0
  307. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/schema.py +0 -0
  308. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/schemas/envelope-v1.schema.json +0 -0
  309. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/security_chain.py +0 -0
  310. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/security_config.py +0 -0
  311. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/security_config_scan.py +0 -0
  312. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/security_posture.py +0 -0
  313. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/semantic_analyzer.py +0 -0
  314. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/semantic_impact_engine.py +0 -0
  315. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/semantic_integration_engine.py +0 -0
  316. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/semantic_services.py +0 -0
  317. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/serializer.py +0 -0
  318. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/source_text.py +0 -0
  319. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/spring_event_topology.py +0 -0
  320. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/spring_findings.py +0 -0
  321. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/spring_impact.py +0 -0
  322. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/spring_model.py +0 -0
  323. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/spring_profiles.py +0 -0
  324. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/spring_properties.py +0 -0
  325. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/spring_security_audit.py +0 -0
  326. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/spring_semantic.py +0 -0
  327. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/spring_tx_analyzer.py +0 -0
  328. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/sql_taint.py +0 -0
  329. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/summarizer.py +0 -0
  330. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/target_admission.py +0 -0
  331. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/telemetry/__init__.py +0 -0
  332. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/telemetry/config.py +0 -0
  333. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/telemetry/consent.py +0 -0
  334. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/telemetry/events.py +0 -0
  335. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/telemetry/filters.py +0 -0
  336. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/telemetry/transport.py +0 -0
  337. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/test_gap_ranking.py +0 -0
  338. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/test_sources.py +0 -0
  339. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/text_input.py +0 -0
  340. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/timeline.py +0 -0
  341. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/token_estimate.py +0 -0
  342. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/tree_utils.py +0 -0
  343. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/type_usage_surface.py +0 -0
  344. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/validation_inference.py +0 -0
  345. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/verify_edit.py +0 -0
  346. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/verify_repo.py +0 -0
  347. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/verify_rules.py +0 -0
  348. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/version_check.py +0 -0
  349. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/waivers.py +0 -0
  350. {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/workspace.py +0 -0
  351. {sourcecode-5.5.0 → sourcecode-5.5.2}/supabase/functions/README.md +0 -0
  352. {sourcecode-5.5.0 → sourcecode-5.5.2}/supabase/functions/get-license/index.ts +0 -0
  353. {sourcecode-5.5.0 → sourcecode-5.5.2}/supabase/functions/lemonsqueezy-webhook/index.ts +0 -0
  354. {sourcecode-5.5.0 → sourcecode-5.5.2}/supabase/functions/telemetry/index.ts +0 -0
  355. {sourcecode-5.5.0 → sourcecode-5.5.2}/supabase/sql/license_event_ordering.sql +0 -0
  356. {sourcecode-5.5.0 → sourcecode-5.5.2}/supabase/sql/licensing_schema.sql +0 -0
  357. {sourcecode-5.5.0 → sourcecode-5.5.2}/supabase/sql/telemetry_events.sql +0 -0
@@ -2,6 +2,46 @@
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
+
25
+ ## [5.5.1] — 2026-08-13
26
+
27
+ **External audit corrections and command execution performance.**
28
+
29
+ ### Fixed
30
+ - **Impact callers** now expand accessor and interface frontiers consistently,
31
+ with caller symbols remaining a refinement of caller classes.
32
+ - **Endpoint and validation contracts** now expose test-surface policy, reuse
33
+ servlet declarations, and require real `Validator`/`setValidator` evidence.
34
+ - **Modernization references** now recognize nested types used by their
35
+ enclosing class.
36
+ - **Spring audit output** is bounded by default while explicit full output
37
+ remains available through `--output` and `--compact`.
38
+ - **Repeated command execution** reuses the cached analysis context and reports
39
+ independent cache-layer states for context, parse, snapshot, and RIS.
40
+
41
+ ### Documentation
42
+ - Closed the 2026-08-13 external audit backlog in the roadmap with fix hashes
43
+ and regression coverage.
44
+
5
45
  ## [5.5.0] — 2026-08-12
6
46
 
7
47
  **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.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.0-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.0 — 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.0-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.0 — 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.0
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.0"
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.0"
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
@@ -3457,6 +3458,9 @@ def main(
3457
3458
  _core_hash = ""
3458
3459
  _core_flags_str = ""
3459
3460
  _view_flags_str = ""
3461
+ # Reuse the freshness decision for cache metadata; otherwise the root
3462
+ # command repeats a full Git status walk after the analysis completes.
3463
+ _tree_is_dirty: Optional[bool] = None
3460
3464
 
3461
3465
  if not no_cache:
3462
3466
  try:
@@ -3506,6 +3510,8 @@ def main(
3506
3510
  Path(_git_root_str) if _git_root_str else target,
3507
3511
  scope=target,
3508
3512
  )
3513
+ if _tree_sig and _git_sha:
3514
+ _tree_is_dirty = _tree_sig != _git_sha
3509
3515
  if _tree_sig:
3510
3516
  _core_key = f"{_tree_sig}-{_core_h}"
3511
3517
  else:
@@ -3821,7 +3827,11 @@ def main(
3821
3827
  if format == "json":
3822
3828
  try:
3823
3829
  from sourcecode.ris import _has_uncommitted_changes as _huc
3824
- _uncommitted = _huc(target)
3830
+ _uncommitted = (
3831
+ _tree_is_dirty
3832
+ if _tree_is_dirty is not None
3833
+ else _huc(target)
3834
+ )
3825
3835
  except Exception:
3826
3836
  _uncommitted = False
3827
3837
  _data_scope = "COMPACT" if compact else ("AGENT" if agent else "FULL")
@@ -3938,6 +3948,7 @@ def main(
3938
3948
  if _advisory:
3939
3949
  typer.echo(_advisory, err=True)
3940
3950
 
3951
+ _manifest_t0 = time.perf_counter()
3941
3952
  _perf_detection = perf.start()
3942
3953
  detector = ProjectDetector(build_default_detectors())
3943
3954
  workspace_analysis = WorkspaceAnalyzer().analyze(target, manifests)
@@ -3998,6 +4009,7 @@ def main(
3998
4009
  root_dependencies, root_summary = dependency_analyzer.analyze(target)
3999
4010
  dependency_records.extend(root_dependencies)
4000
4011
  dependency_summaries.append(root_summary)
4012
+ _root_timing["manifests_ms"] = round((time.perf_counter() - _manifest_t0) * 1000, 2)
4001
4013
  module_graphs = []
4002
4014
  if graph_analyzer is not None:
4003
4015
  root_graph_tree = (
@@ -4643,6 +4655,13 @@ def main(
4643
4655
  )
4644
4656
 
4645
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)
4646
4665
  # 4. Serialize
4647
4666
  _progress.update("serializing output")
4648
4667
  _perf_serialize = perf.start()
@@ -4688,8 +4707,16 @@ def main(
4688
4707
  raw_dict = standard_view(sm, include_tree=tree and not no_tree)
4689
4708
  if not no_redact:
4690
4709
  raw_dict = redact_dict(raw_dict)
4710
+ data = raw_dict
4691
4711
  content = _serialize_dict(raw_dict, format)
4692
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
+
4693
4720
  perf.stop("serialize", _perf_serialize)
4694
4721
  perf.flush_recorder()
4695
4722
 
@@ -4717,7 +4744,11 @@ def main(
4717
4744
  if format == "json":
4718
4745
  try:
4719
4746
  from sourcecode.ris import _has_uncommitted_changes as _huc_fresh
4720
- _uncommitted_fresh = _huc_fresh(target)
4747
+ _uncommitted_fresh = (
4748
+ _tree_is_dirty
4749
+ if _tree_is_dirty is not None
4750
+ else _huc_fresh(target)
4751
+ )
4721
4752
  # _huc_fresh uses --untracked-files=no — it misses repos where all
4722
4753
  # files are untracked (no staged/unstaged changes to tracked files).
4723
4754
  # Promote to True when _allowed_changed_files contains untracked files.
@@ -6503,6 +6534,10 @@ def endpoints_cmd(
6503
6534
  "the endpoint count, and the endpoint total is carried across as one "
6504
6535
  "number rather than 3 500 rows.",
6505
6536
  ),
6537
+ include_tests: bool = typer.Option(
6538
+ False, "--include-tests",
6539
+ help="Include endpoints from test source and test-fixture modules; excluded by default.",
6540
+ ),
6506
6541
  client_usage: bool = typer.Option(
6507
6542
  False, "--client-usage",
6508
6543
  help="Join the routes against the HTTP calls written in the TypeScript/"
@@ -6563,7 +6598,7 @@ def endpoints_cmd(
6563
6598
  _prog = Progress()
6564
6599
  _prog.start("scanning endpoints")
6565
6600
  try:
6566
- data = _extract_java_endpoints(target)
6601
+ data = _extract_java_endpoints(target, include_tests=include_tests)
6567
6602
  finally:
6568
6603
  _prog.finish()
6569
6604
 
@@ -8989,9 +9024,26 @@ def spring_audit_cmd(
8989
9024
  # 9,53 s on a 1 303-file repository) and it is the same parse the other
8990
9025
  # knowledge commands share, so it is fetched rather than rebuilt — which
8991
9026
  # 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)
9027
+ _repo_root = _ctxcache.repo_root_of(target)
9028
+ cir, _cir_lookup = _ctxcache.get_or_build_cir(
9029
+ _repo_root, target, file_list, progress=_work_sink(_prog)
8994
9030
  )
9031
+ _cache_state = {
9032
+ "context": "warm" if _cir_lookup.hit else "cold",
9033
+ "parse": "warm" if _cir_lookup.hit else "cold",
9034
+ }
9035
+ try:
9036
+ from sourcecode import cache as _cache_state_mod
9037
+ _cache_status = _cache_state_mod.status(target)
9038
+ _cache_state["snapshot"] = (
9039
+ "warm" if _cache_status.get("cached_cores") else "cold"
9040
+ )
9041
+ _cache_state["ris"] = (
9042
+ "warm" if _cache_status.get("ris_exists") else "cold"
9043
+ )
9044
+ except Exception:
9045
+ _cache_state["snapshot"] = "unknown"
9046
+ _cache_state["ris"] = "unknown"
8995
9047
  # C3-85: the stretch between the last `linking` tick and the first rule
8996
9048
  # tick reports nothing, and what stays on the line is `n/n` — a counter
8997
9049
  # that finished, reading as a stage still running. Measured on keycloak
@@ -9142,7 +9194,18 @@ def spring_audit_cmd(
9142
9194
  "phase that never ran is not evidence there is none."
9143
9195
  )
9144
9196
 
9145
- data = combined.to_compact_dict() if compact else combined.to_dict()
9197
+ _bounded_default = (
9198
+ not compact and output_path is None and format == "json" and not table
9199
+ )
9200
+ data = (
9201
+ combined.to_compact_dict()
9202
+ if compact or _bounded_default
9203
+ else combined.to_dict()
9204
+ )
9205
+ if _bounded_default:
9206
+ data.pop("mode", None)
9207
+ data["default_output"] = "bounded"
9208
+ data.setdefault("metadata", {})["cache_layers"] = _cache_state
9146
9209
  if _stopped_early:
9147
9210
  # C3-87: the block is composed by `PhasedRun.status`, which is the
9148
9211
  # authority `risk` is now bound to as well — one vocabulary for
@@ -9176,6 +9239,7 @@ def spring_audit_cmd(
9176
9239
  elif format == "github-comment":
9177
9240
  output = _render_spring_audit_github_comment(combined, min_severity)
9178
9241
  else:
9242
+ data = combined.to_compact_dict() if compact else combined.to_dict()
9179
9243
  output = _serialize_dict(data, format)
9180
9244
 
9181
9245
  # F-AV: our own readers ask for the count under either spelling — the break
@@ -9763,6 +9827,9 @@ def risk_cmd(
9763
9827
  data, rule_filter=rule_filter, band_filter=band_filter, top_n=top_n
9764
9828
  )
9765
9829
  else:
9830
+ if output_path is None:
9831
+ from sourcecode.risk import compact_risk_output
9832
+ data = compact_risk_output(data)
9766
9833
  output = _serialize_dict(data, format)
9767
9834
  _emit_command_output(
9768
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)
@@ -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