sourcecode 4.11.0__tar.gz → 4.12.0__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 (227) hide show
  1. {sourcecode-4.11.0 → sourcecode-4.12.0}/CHANGELOG.md +62 -0
  2. {sourcecode-4.11.0 → sourcecode-4.12.0}/PKG-INFO +3 -3
  3. {sourcecode-4.11.0 → sourcecode-4.12.0}/README.md +2 -2
  4. {sourcecode-4.11.0 → sourcecode-4.12.0}/pyproject.toml +1 -1
  5. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/__init__.py +1 -1
  6. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/architectural_baseline.py +45 -2
  7. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/cache_model.py +30 -15
  8. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/cli.py +225 -27
  9. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/container_wiring.py +21 -0
  10. sourcecode-4.12.0/src/sourcecode/mcp/dependency_import.py +87 -0
  11. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/mcp/registry.py +6 -1
  12. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/mcp/server.py +20 -2
  13. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/parse_cache.py +166 -7
  14. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/phased_run.py +61 -10
  15. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/progress.py +17 -0
  16. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/readiness_timeline.py +10 -1
  17. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/release_info.py +1 -1
  18. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/repository_ir.py +20 -2
  19. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/retrieval/steps_impact.py +5 -2
  20. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/risk.py +120 -38
  21. sourcecode-4.12.0/src/sourcecode/rule_pass.py +112 -0
  22. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/spring_impact.py +29 -3
  23. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/spring_security_audit.py +49 -2
  24. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/spring_tx_analyzer.py +34 -2
  25. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/verify_repo.py +59 -9
  26. sourcecode-4.11.0/src/sourcecode/cache.tmp_new +0 -772
  27. {sourcecode-4.11.0 → sourcecode-4.12.0}/.github/workflows/build-windows.yml +0 -0
  28. {sourcecode-4.11.0 → sourcecode-4.12.0}/.gitignore +0 -0
  29. {sourcecode-4.11.0 → sourcecode-4.12.0}/.ruff.toml +0 -0
  30. {sourcecode-4.11.0 → sourcecode-4.12.0}/CLAUDE.md +0 -0
  31. {sourcecode-4.11.0 → sourcecode-4.12.0}/CONTRIBUTING.md +0 -0
  32. {sourcecode-4.11.0 → sourcecode-4.12.0}/LICENSE +0 -0
  33. {sourcecode-4.11.0 → sourcecode-4.12.0}/SECURITY.md +0 -0
  34. {sourcecode-4.11.0 → sourcecode-4.12.0}/raw +0 -0
  35. {sourcecode-4.11.0 → sourcecode-4.12.0}/scripts/compare_integration_engines.py +0 -0
  36. {sourcecode-4.11.0 → sourcecode-4.12.0}/scripts/customer_smoke_test.sh +0 -0
  37. {sourcecode-4.11.0 → sourcecode-4.12.0}/scripts/generate_jdk_exports.py +0 -0
  38. {sourcecode-4.11.0 → sourcecode-4.12.0}/scripts/perf_harness.py +0 -0
  39. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/adaptive_scanner.py +0 -0
  40. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/archetype.py +0 -0
  41. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/architectural_delta.py +0 -0
  42. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/architecture_analyzer.py +0 -0
  43. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/architecture_summary.py +0 -0
  44. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/ast_extractor.py +0 -0
  45. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/audit_report.py +0 -0
  46. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/baseline_autocapture.py +0 -0
  47. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/cache.py +0 -0
  48. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/call_surface.py +0 -0
  49. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/caller_metrics.py +0 -0
  50. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/caller_reach.py +0 -0
  51. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/canonical_ir.py +0 -0
  52. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/chain_rules.py +0 -0
  53. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/change_plan.py +0 -0
  54. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/cir_graphs.py +0 -0
  55. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/classifier.py +0 -0
  56. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/client_calls.py +0 -0
  57. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/code_notes_analyzer.py +0 -0
  58. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/compare.py +0 -0
  59. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/confidence_analyzer.py +0 -0
  60. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/constraint_diff.py +0 -0
  61. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/context_cache.py +0 -0
  62. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/context_graph.py +0 -0
  63. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/context_scorer.py +0 -0
  64. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/context_summarizer.py +0 -0
  65. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/contract_diff.py +0 -0
  66. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/contract_init.py +0 -0
  67. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/contract_model.py +0 -0
  68. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/contract_pipeline.py +0 -0
  69. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/coverage_parser.py +0 -0
  70. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/data_exposure.py +0 -0
  71. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/data_labels.py +0 -0
  72. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/defect_identity.py +0 -0
  73. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/degradation.py +0 -0
  74. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/dependency_analyzer.py +0 -0
  75. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/deployment_prefix.py +0 -0
  76. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/detach.py +0 -0
  77. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/detectors/__init__.py +0 -0
  78. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/detectors/base.py +0 -0
  79. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/detectors/csproj_parser.py +0 -0
  80. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/detectors/dart.py +0 -0
  81. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/detectors/dotnet.py +0 -0
  82. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/detectors/elixir.py +0 -0
  83. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/detectors/go.py +0 -0
  84. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/detectors/heuristic.py +0 -0
  85. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/detectors/hybrid.py +0 -0
  86. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/detectors/java.py +0 -0
  87. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/detectors/jvm_ext.py +0 -0
  88. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/detectors/nodejs.py +0 -0
  89. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/detectors/parsers.py +0 -0
  90. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/detectors/php.py +0 -0
  91. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/detectors/project.py +0 -0
  92. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/detectors/python.py +0 -0
  93. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/detectors/ruby.py +0 -0
  94. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/detectors/rust.py +0 -0
  95. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/detectors/systems.py +0 -0
  96. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/detectors/terraform.py +0 -0
  97. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/detectors/tooling.py +0 -0
  98. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/doc_analyzer.py +0 -0
  99. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/dynamic_argument_surface.py +0 -0
  100. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/endpoint_literals.py +0 -0
  101. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/endpoint_metrics.py +0 -0
  102. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/entrypoint_classifier.py +0 -0
  103. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/env_analyzer.py +0 -0
  104. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/envelope.py +0 -0
  105. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/environment_resolution.py +0 -0
  106. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/error_schema.py +0 -0
  107. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/evidence_provider.py +0 -0
  108. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/execution_plan.py +0 -0
  109. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/explain.py +0 -0
  110. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/facts/__init__.py +0 -0
  111. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/facts/registry.json +0 -0
  112. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/file_chunker.py +0 -0
  113. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/file_classifier.py +0 -0
  114. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/filter_surface.py +0 -0
  115. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/format_contract.py +0 -0
  116. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/fqn_utils.py +0 -0
  117. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/git_analyzer.py +0 -0
  118. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/git_checkout.py +0 -0
  119. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/graph_analyzer.py +0 -0
  120. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/graph_evidence.py +0 -0
  121. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/hibernate_strat.py +0 -0
  122. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/identity_fallback.py +0 -0
  123. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/integration_coordinates.py +0 -0
  124. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/jdk_exports.py +0 -0
  125. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/license.py +0 -0
  126. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/mcp/__init__.py +0 -0
  127. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/mcp/onboarding/__init__.py +0 -0
  128. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/mcp/onboarding/applier.py +0 -0
  129. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/mcp/onboarding/backup.py +0 -0
  130. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/mcp/onboarding/detector.py +0 -0
  131. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/mcp/onboarding/planner.py +0 -0
  132. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/mcp/orchestrator.py +0 -0
  133. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/mcp/runner.py +0 -0
  134. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/mcp_nudge.py +0 -0
  135. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/metrics_analyzer.py +0 -0
  136. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/migrate_check.py +0 -0
  137. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/migration_blast.py +0 -0
  138. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/non_coverage.py +0 -0
  139. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/openapi_surface.py +0 -0
  140. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/openrewrite_recipe.py +0 -0
  141. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/output_budget.py +0 -0
  142. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/output_encoding.py +0 -0
  143. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/path_admission.py +0 -0
  144. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/path_filters.py +0 -0
  145. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/perf.py +0 -0
  146. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/pipe_contract.py +0 -0
  147. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/posture.py +0 -0
  148. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/pr_comment_renderer.py +0 -0
  149. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/pr_impact.py +0 -0
  150. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/prepare_context.py +0 -0
  151. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/provenance.py +0 -0
  152. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/ranking_engine.py +0 -0
  153. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/reconciliation.py +0 -0
  154. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/redactor.py +0 -0
  155. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/reference_facts.py +0 -0
  156. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/relevance_scorer.py +0 -0
  157. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/remedies.py +0 -0
  158. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/rename_refactor.py +0 -0
  159. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/repo_classifier.py +0 -0
  160. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/retrieval/__init__.py +0 -0
  161. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/retrieval/context.py +0 -0
  162. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/retrieval/errors.py +0 -0
  163. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/retrieval/executor.py +0 -0
  164. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/retrieval/planner.py +0 -0
  165. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/retrieval/query.py +0 -0
  166. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/retrieval/request.py +0 -0
  167. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/retrieval/resolution.py +0 -0
  168. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/retrieval/result.py +0 -0
  169. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/retrieval/retriever.py +0 -0
  170. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/retrieval/runtime.py +0 -0
  171. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/retrieval/steps.py +0 -0
  172. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/retrieval/steps_endpoint.py +0 -0
  173. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/retrieval/steps_graph.py +0 -0
  174. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/retrieval/steps_intf.py +0 -0
  175. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/retrieval/steps_struct.py +0 -0
  176. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/retrieval/steps_txsec.py +0 -0
  177. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/ris.py +0 -0
  178. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/rule_catalog.py +0 -0
  179. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/runs.py +0 -0
  180. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/runtime_classifier.py +0 -0
  181. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/sarif.py +0 -0
  182. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/scanner.py +0 -0
  183. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/schema.py +0 -0
  184. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/schemas/envelope-v1.schema.json +0 -0
  185. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/security_config.py +0 -0
  186. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/security_config_scan.py +0 -0
  187. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/security_posture.py +0 -0
  188. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/semantic_analyzer.py +0 -0
  189. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/semantic_impact_engine.py +0 -0
  190. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/semantic_integration_engine.py +0 -0
  191. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/semantic_services.py +0 -0
  192. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/serializer.py +0 -0
  193. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/servlet_surface.py +0 -0
  194. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/source_text.py +0 -0
  195. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/spring_event_topology.py +0 -0
  196. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/spring_findings.py +0 -0
  197. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/spring_model.py +0 -0
  198. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/spring_profiles.py +0 -0
  199. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/spring_properties.py +0 -0
  200. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/spring_semantic.py +0 -0
  201. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/summarizer.py +0 -0
  202. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/target_admission.py +0 -0
  203. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/telemetry/__init__.py +0 -0
  204. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/telemetry/config.py +0 -0
  205. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/telemetry/consent.py +0 -0
  206. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/telemetry/events.py +0 -0
  207. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/telemetry/filters.py +0 -0
  208. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/telemetry/transport.py +0 -0
  209. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/test_gap_ranking.py +0 -0
  210. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/test_sources.py +0 -0
  211. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/text_input.py +0 -0
  212. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/token_estimate.py +0 -0
  213. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/tree_utils.py +0 -0
  214. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/type_usage_surface.py +0 -0
  215. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/validation_inference.py +0 -0
  216. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/validation_surface.py +0 -0
  217. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/verify_edit.py +0 -0
  218. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/verify_rules.py +0 -0
  219. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/version_check.py +0 -0
  220. {sourcecode-4.11.0 → sourcecode-4.12.0}/src/sourcecode/workspace.py +0 -0
  221. {sourcecode-4.11.0 → sourcecode-4.12.0}/supabase/functions/README.md +0 -0
  222. {sourcecode-4.11.0 → sourcecode-4.12.0}/supabase/functions/get-license/index.ts +0 -0
  223. {sourcecode-4.11.0 → sourcecode-4.12.0}/supabase/functions/lemonsqueezy-webhook/index.ts +0 -0
  224. {sourcecode-4.11.0 → sourcecode-4.12.0}/supabase/functions/telemetry/index.ts +0 -0
  225. {sourcecode-4.11.0 → sourcecode-4.12.0}/supabase/sql/license_event_ordering.sql +0 -0
  226. {sourcecode-4.11.0 → sourcecode-4.12.0}/supabase/sql/licensing_schema.sql +0 -0
  227. {sourcecode-4.11.0 → sourcecode-4.12.0}/supabase/sql/telemetry_events.sql +0 -0
@@ -2,6 +2,68 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [4.12.0] — 2026-08-08
6
+
7
+ **Field evaluation #16 — the third round on the same repository and commit, and the
8
+ first A/B/C of three of our own releases (4.10.6 → 4.10.7 → 4.11.0, 7,0 → 7,0 →
9
+ 6,5).** The three value axes did not move: correctness 9,5, unique value 9,0,
10
+ epistemic honesty 10, with `endpoints.json`, `servlets.json` and `validation.json`
11
+ **byte-identical across all three builds**. What fell is engineering, and the
12
+ sentence is about us: *"no es que haya regresiones — es que no hay nada que las
13
+ detecte."* Nine rows close here, one commit each.
14
+
15
+ **Behaviour changes to read before upgrading a pipeline:**
16
+
17
+ - **`risk_score` and `risk_score_raw` are `null`, not `0.0`, when the container
18
+ invokes the queried component** (`@Configuration`, `@Aspect`, a registered
19
+ filter). The band already said `high` for these while the number said `0.0` — the
20
+ worst possible value for the most critical symbol in a system, from the same
21
+ object. `risk_score_basis` says why and names the surfaces that do measure such a
22
+ component. Affects `impact-chain`, `impact`, `plan` and `compare`; a consumer
23
+ reading the field with a `0.0` default now sees `null`.
24
+ - **`ASK_MAX_ANALYSIS_SECONDS` actually stops a `spring-audit` rule pass.** It was
25
+ only ever checked between the three phases, and the last one holds ~85 % of the
26
+ time, so a 420 s budget produced a 2 351 s run and no `partial` anywhere. A cut
27
+ run now publishes `metadata.rules_not_run`, a `PARTIAL:` limitation, and
28
+ `_partial.phases_stopped_inside`. `metadata.rules_run` is present on every run.
29
+ - **`migrate-check` no longer creates `<scope>/.ask/` unless you pass `--snapshot`.**
30
+ A read-only run left a git-ignored directory in the audited repository — invisible
31
+ to `git status`, visible only to `git status --ignored`.
32
+ - **`verify` gains `--allow-unverified`** (exit 0 while the verdict stays
33
+ `unverified`) and publishes `unverified_reason`: `no_contracts_declared` or
34
+ `gate_could_not_run`. Exit codes are unchanged; the remedy is now the first reason.
35
+ - **The parse cache retires generations.** Entries live under the producing
36
+ analyzer's fingerprint, and a run purges the generations that can never be read
37
+ again — the field measured +142,53 MB per release, three copies of one repository,
38
+ 427,59 MB after three runs. `cache status` publishes the composition.
39
+
40
+ **Also in this release:**
41
+
42
+ - The rule pass reports the family it is on, counted against the total, and names
43
+ the two stages that have no population (`spring-audit` and `risk`). The ETA is
44
+ withheld there on purpose: rule families are not comparable units.
45
+ - `risk` checkpoints — after the audit and every 25 composed rows — with the partial
46
+ file built by the same assembler as the answer, so it is the same document over
47
+ fewer rows.
48
+ - The budget message stops quoting a class constant in the grammar of a
49
+ measurement. It carries this command's measured anchors and the size of the
50
+ repository in hand, and says plainly that no projection is offered. Anchors
51
+ recalibrated: `spring-audit` 408 s → 2 351 s at 3 342 files, `endpoints` 4,2 → 5,0,
52
+ `migrate-check --compact` 26,7 and `posture` 38,0 (both previously recorded as not
53
+ finishing), `risk` 3 232.
54
+ - The MCP stack's incomplete-model warning no longer reaches stderr, and the models
55
+ it complains about are rebuilt rather than only muted.
56
+ - A 772-line temp file (`cache.tmp_new`) was shipping inside the wheel; removed, and
57
+ the package contents are now asserted by allow-list.
58
+
59
+ **Measured and not fixed, deliberately:** the block performance regression the
60
+ evaluation reports (seven commands 2–3,4× slower on a minor) **does not reproduce
61
+ here** — the A/B of 4.10.7 against 4.11.0 on a 2 985-file repository lands within
62
+ 1 % on six commands, with `posture --resolve-environments` byte-identical, and
63
+ `risk` could not be A/B'd because the *4.10.7* side alone passed 61 minutes. Its
64
+ cost is structural, not new. The numbers are in the ledger; the row waits on a
65
+ Windows runner rather than on a guess.
66
+
5
67
  ## [4.11.0] — 2026-08-07
6
68
 
7
69
  **The queue behind Tier D: five ledger rows, and three batteries that were red in
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sourcecode
3
- Version: 4.11.0
3
+ Version: 4.12.0
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-4.11.0-blue)
45
+ ![Version](https://img.shields.io/badge/version-4.12.0-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`**
@@ -108,7 +108,7 @@ brew tap haroundominique/sourcecode && brew install sourcecode
108
108
  # pip / pipx
109
109
  pipx install sourcecode # or: pip install sourcecode
110
110
 
111
- ask version # ask 4.11.0 — and, on a build that has aged,
111
+ ask version # ask 4.12.0 — and, on a build that has aged,
112
112
  # how many releases have probably shipped since
113
113
  ```
114
114
 
@@ -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-4.11.0-blue)
7
+ ![Version](https://img.shields.io/badge/version-4.12.0-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`**
@@ -70,7 +70,7 @@ brew tap haroundominique/sourcecode && brew install sourcecode
70
70
  # pip / pipx
71
71
  pipx install sourcecode # or: pip install sourcecode
72
72
 
73
- ask version # ask 4.11.0 — and, on a build that has aged,
73
+ ask version # ask 4.12.0 — and, on a build that has aged,
74
74
  # how many releases have probably shipped since
75
75
  ```
76
76
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "sourcecode"
7
- version = "4.11.0"
7
+ version = "4.12.0"
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__ = "4.11.0"
7
+ __version__ = "4.12.0"
@@ -30,6 +30,7 @@ the perf baselines do.
30
30
  from __future__ import annotations
31
31
 
32
32
  import json
33
+ import os
33
34
  import subprocess
34
35
  from datetime import datetime, timezone
35
36
  from pathlib import Path
@@ -365,21 +366,40 @@ def _baseline_filename(baseline: dict) -> str:
365
366
  #: a 14 587-entry structural inventory of the code. A self-confined
366
367
  #: `.ask/.gitignore` is the honest form: it never touches the user's own
367
368
  #: `.gitignore`, and it stops applying the moment they delete the directory.
369
+ #: C3-74 corrected the last line. It used to read *"Delete this file to version
370
+ #: them deliberately"*, and deleting it is the one action that would commit a
371
+ #: baseline carrying `env.hostname_hash`, `cpu` and `cores` — an invitation to do
372
+ #: the thing the file exists to prevent. It now states the consequence instead.
368
373
  _ASK_DIR_GITIGNORE = (
369
374
  "# Written by `ask` the first time it created this directory.\n"
370
375
  "# These are local analysis artefacts: a structural inventory of your code\n"
371
376
  "# and, if you asked for it, the machine that measured it. Nothing here\n"
372
- "# belongs in a commit. Delete this file to version them deliberately.\n"
377
+ "# belongs in a commit.\n"
378
+ "#\n"
379
+ "# Removing this file makes everything here committable, including any\n"
380
+ "# recorded machine fingerprint (`--record-env`: hostname hash, CPU, cores).\n"
381
+ "# Version these deliberately only if you intend to publish that.\n"
373
382
  "*\n"
374
383
  )
375
384
 
376
385
 
377
- def protect_ask_dir(out_dir: Path) -> None:
386
+ def protect_ask_dir(out_dir: Path, *, announce: bool = True) -> None:
378
387
  """Give a freshly created `.ask/` its own `.gitignore` (C3-68).
379
388
 
380
389
  Best-effort and never overwriting: a user who edited it decided something,
381
390
  and a tool that re-imposes its default on every run is worse than one that
382
391
  never wrote it.
392
+
393
+ **Call this where the write happens, never where the path is computed.** This
394
+ function *creates* the directory in order to protect it, so calling it
395
+ speculatively is a write — which is how `migrate-check` came to leave a
396
+ `.ask/.gitignore` inside a repository it had only read (C3-74).
397
+
398
+ `announce` puts one line on stderr the first time the directory is created,
399
+ with its path. A side effect inside somebody else's repository is exactly what
400
+ I-8 says must be declared, and this one hides from the check an auditor makes:
401
+ `git status --porcelain` is clean because the ignore file ignores itself, and
402
+ only `--ignored` reveals `!! <scope>/.ask/`.
383
403
  """
384
404
  try:
385
405
  ask_dir = Path(out_dir)
@@ -391,12 +411,35 @@ def protect_ask_dir(out_dir: Path) -> None:
391
411
  return
392
412
  marker = ask_dir / ".gitignore"
393
413
  if not marker.exists():
414
+ created = not ask_dir.exists()
394
415
  ask_dir.mkdir(parents=True, exist_ok=True)
395
416
  marker.write_text(_ASK_DIR_GITIGNORE, encoding="utf-8")
417
+ if announce and created:
418
+ _announce_ask_dir(ask_dir)
396
419
  except OSError:
397
420
  return
398
421
 
399
422
 
423
+ def _announce_ask_dir(ask_dir: Path) -> None:
424
+ """One line, on stderr, naming what was created and how to move it (C3-74)."""
425
+ import sys
426
+
427
+ try:
428
+ # No flag is named here on purpose: the commands that write under `.ask/`
429
+ # spell the override differently (`baseline capture --dir`,
430
+ # `migrate-check --history-dir`), and a message that names the wrong one
431
+ # is the class of defect this ledger is about.
432
+ sys.stderr.write(
433
+ f"[ask] created {ask_dir}{os.sep} for this run's local artefacts — "
434
+ f"git-ignored by its own .gitignore, so `git status` will not show it "
435
+ f"(`git status --ignored` will). The command's directory option takes a "
436
+ f"path outside the repository if you want them elsewhere.\n"
437
+ )
438
+ sys.stderr.flush()
439
+ except Exception:
440
+ pass
441
+
442
+
400
443
  def write_baseline(baseline: dict, out_dir: Path) -> Path:
401
444
  """Write `baseline` as deterministic JSON under `out_dir`; return the file path."""
402
445
  out_dir.mkdir(parents=True, exist_ok=True)
@@ -75,10 +75,17 @@ class CommandCache:
75
75
  warm_seconds: "Optional[float]" = None
76
76
  #: The other measured point: this command on the field repository
77
77
  #: (3 342 Java files, Windows 11 / PowerShell 5.1 / pipx, cold), from field
78
- #: evaluations #13 and #14. Seconds where a run finished; `field_blocked`
78
+ #: evaluations #13, #14 and #16. Seconds where a run finished; `field_blocked`
79
79
  #: where it did not — the harness promoted the process and the session died,
80
80
  #: which is a measurement of a different kind and is never written as a
81
81
  #: duration. Rows with neither were not attempted there.
82
+ #:
83
+ #: C3-72: where two evaluations of the same command at this size disagree, the
84
+ #: figure here is the **most recent** one, because it describes the build a
85
+ #: reader is about to run — and the previous figure is kept in the comment
86
+ #: beside it rather than dropped, since a cost that moved by 5,8× between two
87
+ #: releases (spring-audit, 408 s in #13 against 2 351 s in #16) is itself the
88
+ #: measurement C3-76 exists for.
82
89
  field_seconds: "Optional[float]" = None
83
90
  field_blocked: bool = False
84
91
 
@@ -93,19 +100,26 @@ REFERENCE_REPOSITORY = (
93
100
  REFERENCE_JAVA_FILES = 2000
94
101
 
95
102
  #: The other end of the measured range, and the reason this module publishes a
96
- #: *class* rather than a projected duration (C4-19). Field evaluation #13, on
103
+ #: *class* rather than a projected duration (C4-19). Field evaluation #16, on
97
104
  #: Windows 11 / PowerShell 5.1 / pipx / Python 3.10: `spring-audit` on a
98
- #: 3 342-file repository ran **408 s** — 46× the 8.8 s the same command takes on
99
- #: the 2 000-file reference. Cost does not scale with file count in any way this
100
- #: product has measured, so a projected "~15 s on your repository" would be a
101
- #: confident falsehood of exactly the kind the ledger exists to prevent. What can
102
- #: be said honestly is the class, the two measured anchors, and how to run it.
105
+ #: 3 342-file repository ran **2 351 s** — 267× the 8.8 s the same command takes
106
+ #: on the 2 000-file reference, for a repository 1,7× the size. Cost does not
107
+ #: scale with file count in any way this product has measured, so a projected
108
+ #: "~15 s on your repository" would be a confident falsehood of exactly the kind
109
+ #: the ledger exists to prevent. What can be said honestly is the class, the two
110
+ #: measured anchors, and how to run it.
111
+ #:
112
+ #: C3-72 replaced evaluation #13's 408 s with #16's 2 351 s here: the same command
113
+ #: on the same repository at the same commit, measured three releases later
114
+ #: (2 557 s in 4.10.6, 2 398 s in 4.10.7, 2 351 s in 4.11.0). The older figure was
115
+ #: the one a budget message quoted as "~600s" for three releases while the
116
+ #: measurement stood four times higher.
103
117
  FIELD_ANCHOR = (
104
- "field evaluation #13: spring-audit on 3 342 Java files took 408 s "
105
- "(Windows, pipx, cold) against 8.8 s on the 2 000-file reference"
118
+ "field evaluation #16: spring-audit on 3 342 Java files took 2 351 s "
119
+ "(Windows, pipx, warm cache) against 8.8 s on the 2 000-file reference"
106
120
  )
107
121
  FIELD_ANCHOR_JAVA_FILES = 3342
108
- FIELD_ANCHOR_SECONDS = 408.0
122
+ FIELD_ANCHOR_SECONDS = 2351.4
109
123
 
110
124
 
111
125
  #: Every layer keys on `cache.worktree_signature` — the exact tree state (C1-9).
@@ -176,14 +190,15 @@ COMMANDS: tuple[CommandCache, ...] = (
176
190
  "Resolves the conditional bean graph on every run, over the shared CIR a warm "
177
191
  "builds — the parse it used to repeat for itself. `--diff` compares two profile "
178
192
  "sets over that one IR, so the second side costs the resolution only.",
179
- "10.1 s → 1.6 s", analysis_class="repo-wide", cold_seconds=10.1, warm_seconds=1.6, field_blocked=True),
193
+ "10.1 s → 1.6 s", analysis_class="repo-wide", cold_seconds=10.1, warm_seconds=1.6, field_seconds=38.0),
180
194
  CommandCache("risk", ("cir", "parse"), "shared", False,
181
195
  "Composes what the audit, impact-chain and the posture already answer, so it "
182
196
  "pays each of their costs once over the shared CIR a warm builds — one parse "
183
197
  "for the whole composition, and the reachability query is cached per symbol "
184
198
  "within the run.",
185
199
  "not measured on the battery yet — the composition is bounded by the "
186
- "`spring-audit` + `impact-chain` costs listed here, not by new analysis", analysis_class="deep"),
200
+ "`spring-audit` + `impact-chain` costs listed here, not by new analysis",
201
+ analysis_class="deep", field_seconds=3232.2),
187
202
  CommandCache("enrich", ("cir", "parse"), "shared", False,
188
203
  "Runs the same composition as `risk` over the repository, then joins a SARIF "
189
204
  "log to it. Reading the log is negligible; everything a warm helps with is the "
@@ -213,14 +228,14 @@ COMMANDS: tuple[CommandCache, ...] = (
213
228
  "Recomputes the endpoint surface on every run, over a parse a warm has already "
214
229
  "paid for. Until 3.7.0 the extractor parsed every file itself instead of reading "
215
230
  "the shared parse cache, and a warm measurably bought it nothing (C3-6).",
216
- "3.3 s → 1.4 s (re-measured on 3.7.0; was 2.8 s → 2.9 s)", analysis_class="repo-wide", cold_seconds=3.3, warm_seconds=1.4, field_seconds=4.2),
231
+ "3.3 s → 1.4 s (re-measured on 3.7.0; was 2.8 s → 2.9 s)", analysis_class="repo-wide", cold_seconds=3.3, warm_seconds=1.4, field_seconds=5.0),
217
232
  CommandCache("spring-audit", ("ris", "parse"), "shared", False,
218
233
  "Recomputes every run, but over a parse a warm has already paid for.",
219
- "8.8 s → 3.7 s", analysis_class="repo-wide", cold_seconds=8.8, warm_seconds=3.7, field_seconds=408.0),
234
+ "8.8 s → 3.7 s", analysis_class="repo-wide", cold_seconds=8.8, warm_seconds=3.7, field_seconds=2351.4),
220
235
  CommandCache("migrate-check", ("cir",), "none", False,
221
236
  "Computes its own inventory and shares nothing a warm builds. Only `--blast-radius` "
222
237
  "reuses the shared CIR.",
223
- "4.8 s → 4.8 s", analysis_class="repo-wide", cold_seconds=4.8, warm_seconds=4.8, field_blocked=True),
238
+ "4.8 s → 4.8 s", analysis_class="repo-wide", cold_seconds=4.8, warm_seconds=4.8, field_seconds=26.7),
224
239
  CommandCache("impact-chain", ("cir", "parse"), "shared", False,
225
240
  "The CIR is the expensive half — this is where a warm pays most.",
226
241
  "9.9 s → 1.7 s", analysis_class="core", cold_seconds=9.9, warm_seconds=1.7),