sourcecode 4.15.0__tar.gz → 4.17.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 (232) hide show
  1. {sourcecode-4.15.0 → sourcecode-4.17.0}/CHANGELOG.md +173 -0
  2. {sourcecode-4.15.0 → sourcecode-4.17.0}/PKG-INFO +3 -3
  3. {sourcecode-4.15.0 → sourcecode-4.17.0}/README.md +2 -2
  4. {sourcecode-4.15.0 → sourcecode-4.17.0}/pyproject.toml +1 -1
  5. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/__init__.py +1 -1
  6. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/audit_report.py +48 -6
  7. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/cli.py +184 -54
  8. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/data_exposure.py +5 -1
  9. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/data_labels.py +10 -3
  10. sourcecode-4.17.0/src/sourcecode/declarations.py +81 -0
  11. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/mcp/orchestrator.py +3 -1
  12. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/non_coverage.py +86 -0
  13. sourcecode-4.17.0/src/sourcecode/partial_contract.py +81 -0
  14. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/phased_run.py +69 -2
  15. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/posture.py +11 -0
  16. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/progress.py +27 -0
  17. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/repository_ir.py +12 -0
  18. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/ris.py +4 -1
  19. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/risk.py +254 -14
  20. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/rule_pass.py +23 -1
  21. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/security_config.py +6 -5
  22. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/security_config_scan.py +5 -0
  23. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/security_posture.py +43 -3
  24. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/spring_findings.py +22 -0
  25. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/spring_model.py +22 -1
  26. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/spring_security_audit.py +123 -10
  27. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/spring_tx_analyzer.py +5 -1
  28. {sourcecode-4.15.0 → sourcecode-4.17.0}/.github/workflows/build-windows.yml +0 -0
  29. {sourcecode-4.15.0 → sourcecode-4.17.0}/.github/workflows/perf-gate.yml +0 -0
  30. {sourcecode-4.15.0 → sourcecode-4.17.0}/.gitignore +0 -0
  31. {sourcecode-4.15.0 → sourcecode-4.17.0}/.ruff.toml +0 -0
  32. {sourcecode-4.15.0 → sourcecode-4.17.0}/CLAUDE.md +0 -0
  33. {sourcecode-4.15.0 → sourcecode-4.17.0}/CONTRIBUTING.md +0 -0
  34. {sourcecode-4.15.0 → sourcecode-4.17.0}/LICENSE +0 -0
  35. {sourcecode-4.15.0 → sourcecode-4.17.0}/SECURITY.md +0 -0
  36. {sourcecode-4.15.0 → sourcecode-4.17.0}/raw +0 -0
  37. {sourcecode-4.15.0 → sourcecode-4.17.0}/scripts/compare_integration_engines.py +0 -0
  38. {sourcecode-4.15.0 → sourcecode-4.17.0}/scripts/customer_smoke_test.sh +0 -0
  39. {sourcecode-4.15.0 → sourcecode-4.17.0}/scripts/generate_jdk_exports.py +0 -0
  40. {sourcecode-4.15.0 → sourcecode-4.17.0}/scripts/perf_gate.py +0 -0
  41. {sourcecode-4.15.0 → sourcecode-4.17.0}/scripts/perf_harness.py +0 -0
  42. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/adaptive_scanner.py +0 -0
  43. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/archetype.py +0 -0
  44. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/architectural_baseline.py +0 -0
  45. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/architectural_delta.py +0 -0
  46. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/architecture_analyzer.py +0 -0
  47. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/architecture_summary.py +0 -0
  48. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/ast_extractor.py +0 -0
  49. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/baseline_autocapture.py +0 -0
  50. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/cache.py +0 -0
  51. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/cache_model.py +0 -0
  52. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/call_surface.py +0 -0
  53. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/caller_metrics.py +0 -0
  54. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/caller_reach.py +0 -0
  55. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/canonical_ir.py +0 -0
  56. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/chain_rules.py +0 -0
  57. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/change_plan.py +0 -0
  58. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/cir_graphs.py +0 -0
  59. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/classifier.py +0 -0
  60. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/client_calls.py +0 -0
  61. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/code_notes_analyzer.py +0 -0
  62. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/compare.py +0 -0
  63. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/confidence_analyzer.py +0 -0
  64. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/constraint_diff.py +0 -0
  65. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/container_wiring.py +0 -0
  66. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/context_cache.py +0 -0
  67. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/context_graph.py +0 -0
  68. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/context_scorer.py +0 -0
  69. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/context_summarizer.py +0 -0
  70. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/contract_diff.py +0 -0
  71. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/contract_init.py +0 -0
  72. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/contract_model.py +0 -0
  73. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/contract_pipeline.py +0 -0
  74. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/coverage_parser.py +0 -0
  75. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/defect_identity.py +0 -0
  76. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/degradation.py +0 -0
  77. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/dependency_analyzer.py +0 -0
  78. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/deployment_prefix.py +0 -0
  79. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/detach.py +0 -0
  80. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/detectors/__init__.py +0 -0
  81. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/detectors/base.py +0 -0
  82. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/detectors/csproj_parser.py +0 -0
  83. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/detectors/dart.py +0 -0
  84. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/detectors/dotnet.py +0 -0
  85. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/detectors/elixir.py +0 -0
  86. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/detectors/go.py +0 -0
  87. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/detectors/heuristic.py +0 -0
  88. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/detectors/hybrid.py +0 -0
  89. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/detectors/java.py +0 -0
  90. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/detectors/jvm_ext.py +0 -0
  91. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/detectors/nodejs.py +0 -0
  92. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/detectors/parsers.py +0 -0
  93. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/detectors/php.py +0 -0
  94. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/detectors/project.py +0 -0
  95. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/detectors/python.py +0 -0
  96. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/detectors/ruby.py +0 -0
  97. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/detectors/rust.py +0 -0
  98. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/detectors/systems.py +0 -0
  99. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/detectors/terraform.py +0 -0
  100. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/detectors/tooling.py +0 -0
  101. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/doc_analyzer.py +0 -0
  102. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/dynamic_argument_surface.py +0 -0
  103. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/endpoint_literals.py +0 -0
  104. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/endpoint_metrics.py +0 -0
  105. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/entrypoint_classifier.py +0 -0
  106. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/env_analyzer.py +0 -0
  107. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/envelope.py +0 -0
  108. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/environment_resolution.py +0 -0
  109. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/error_schema.py +0 -0
  110. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/evidence_provider.py +0 -0
  111. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/execution_plan.py +0 -0
  112. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/explain.py +0 -0
  113. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/facts/__init__.py +0 -0
  114. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/facts/registry.json +0 -0
  115. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/file_chunker.py +0 -0
  116. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/file_classifier.py +0 -0
  117. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/filter_surface.py +0 -0
  118. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/format_contract.py +0 -0
  119. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/fqn_utils.py +0 -0
  120. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/git_analyzer.py +0 -0
  121. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/git_checkout.py +0 -0
  122. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/graph_analyzer.py +0 -0
  123. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/graph_evidence.py +0 -0
  124. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/hibernate_strat.py +0 -0
  125. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/identity_fallback.py +0 -0
  126. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/integration_coordinates.py +0 -0
  127. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/jdk_exports.py +0 -0
  128. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/license.py +0 -0
  129. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/mcp/__init__.py +0 -0
  130. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/mcp/dependency_import.py +0 -0
  131. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/mcp/onboarding/__init__.py +0 -0
  132. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/mcp/onboarding/applier.py +0 -0
  133. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/mcp/onboarding/backup.py +0 -0
  134. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/mcp/onboarding/detector.py +0 -0
  135. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/mcp/onboarding/planner.py +0 -0
  136. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/mcp/registry.py +0 -0
  137. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/mcp/runner.py +0 -0
  138. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/mcp/server.py +0 -0
  139. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/mcp_nudge.py +0 -0
  140. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/metrics_analyzer.py +0 -0
  141. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/migrate_check.py +0 -0
  142. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/migration_blast.py +0 -0
  143. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/openapi_surface.py +0 -0
  144. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/openrewrite_recipe.py +0 -0
  145. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/output_budget.py +0 -0
  146. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/output_encoding.py +0 -0
  147. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/parallel.py +0 -0
  148. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/parse_cache.py +0 -0
  149. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/path_admission.py +0 -0
  150. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/path_filters.py +0 -0
  151. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/perf.py +0 -0
  152. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/pipe_contract.py +0 -0
  153. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/pr_comment_renderer.py +0 -0
  154. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/pr_impact.py +0 -0
  155. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/prepare_context.py +0 -0
  156. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/provenance.py +0 -0
  157. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/ranking_engine.py +0 -0
  158. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/readiness_timeline.py +0 -0
  159. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/readonly.py +0 -0
  160. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/reconciliation.py +0 -0
  161. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/redactor.py +0 -0
  162. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/reference_facts.py +0 -0
  163. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/release_info.py +0 -0
  164. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/relevance_scorer.py +0 -0
  165. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/remedies.py +0 -0
  166. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/rename_refactor.py +0 -0
  167. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/repo_classifier.py +0 -0
  168. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/retrieval/__init__.py +0 -0
  169. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/retrieval/context.py +0 -0
  170. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/retrieval/errors.py +0 -0
  171. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/retrieval/executor.py +0 -0
  172. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/retrieval/planner.py +0 -0
  173. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/retrieval/query.py +0 -0
  174. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/retrieval/request.py +0 -0
  175. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/retrieval/resolution.py +0 -0
  176. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/retrieval/result.py +0 -0
  177. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/retrieval/retriever.py +0 -0
  178. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/retrieval/runtime.py +0 -0
  179. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/retrieval/steps.py +0 -0
  180. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/retrieval/steps_endpoint.py +0 -0
  181. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/retrieval/steps_graph.py +0 -0
  182. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/retrieval/steps_impact.py +0 -0
  183. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/retrieval/steps_intf.py +0 -0
  184. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/retrieval/steps_struct.py +0 -0
  185. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/retrieval/steps_txsec.py +0 -0
  186. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/rule_catalog.py +0 -0
  187. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/runs.py +0 -0
  188. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/runtime_classifier.py +0 -0
  189. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/sarif.py +0 -0
  190. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/scanner.py +0 -0
  191. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/schema.py +0 -0
  192. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/schemas/envelope-v1.schema.json +0 -0
  193. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/semantic_analyzer.py +0 -0
  194. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/semantic_impact_engine.py +0 -0
  195. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/semantic_integration_engine.py +0 -0
  196. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/semantic_services.py +0 -0
  197. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/serializer.py +0 -0
  198. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/servlet_surface.py +0 -0
  199. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/source_text.py +0 -0
  200. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/spring_event_topology.py +0 -0
  201. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/spring_impact.py +0 -0
  202. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/spring_profiles.py +0 -0
  203. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/spring_properties.py +0 -0
  204. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/spring_semantic.py +0 -0
  205. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/summarizer.py +0 -0
  206. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/target_admission.py +0 -0
  207. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/telemetry/__init__.py +0 -0
  208. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/telemetry/config.py +0 -0
  209. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/telemetry/consent.py +0 -0
  210. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/telemetry/events.py +0 -0
  211. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/telemetry/filters.py +0 -0
  212. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/telemetry/transport.py +0 -0
  213. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/test_gap_ranking.py +0 -0
  214. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/test_sources.py +0 -0
  215. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/text_input.py +0 -0
  216. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/token_estimate.py +0 -0
  217. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/tree_utils.py +0 -0
  218. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/type_usage_surface.py +0 -0
  219. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/validation_inference.py +0 -0
  220. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/validation_surface.py +0 -0
  221. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/verify_edit.py +0 -0
  222. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/verify_repo.py +0 -0
  223. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/verify_rules.py +0 -0
  224. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/version_check.py +0 -0
  225. {sourcecode-4.15.0 → sourcecode-4.17.0}/src/sourcecode/workspace.py +0 -0
  226. {sourcecode-4.15.0 → sourcecode-4.17.0}/supabase/functions/README.md +0 -0
  227. {sourcecode-4.15.0 → sourcecode-4.17.0}/supabase/functions/get-license/index.ts +0 -0
  228. {sourcecode-4.15.0 → sourcecode-4.17.0}/supabase/functions/lemonsqueezy-webhook/index.ts +0 -0
  229. {sourcecode-4.15.0 → sourcecode-4.17.0}/supabase/functions/telemetry/index.ts +0 -0
  230. {sourcecode-4.15.0 → sourcecode-4.17.0}/supabase/sql/license_event_ordering.sql +0 -0
  231. {sourcecode-4.15.0 → sourcecode-4.17.0}/supabase/sql/licensing_schema.sql +0 -0
  232. {sourcecode-4.15.0 → sourcecode-4.17.0}/supabase/sql/telemetry_events.sql +0 -0
@@ -2,6 +2,179 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [4.17.0] — 2026-08-10
6
+
7
+ **The Part 1 queues of field evaluations #20 and #21, and the first three
8
+ capabilities behind them.** Eval #20 is the first audit of a repository this
9
+ product does not model — Keycloak, 8 204 Java files, Quarkus + JAX-RS,
10
+ `spring_detected: false` in all six audited modules, 47 invocations under
11
+ `ASK_READONLY=1` — and it split the product cleanly in two: every structural axis
12
+ worked alone, and the axes that guess produced 86 `high` findings with zero true
13
+ positives. Eval #21 is the seventh measurement of `saint-server`, and its
14
+ contribution is a partition rather than a defect.
15
+
16
+ **Fixed in this release:**
17
+
18
+ - **`audit-report` had no deadline at all (C3-89).** It composes the whole of
19
+ `risk` and did so with no `PhasedRun`, no `stop_when` and no checkpoint: the
20
+ field measured 2 265 s under `ASK_MAX_ANALYSIS_SECONDS=300`, killed by hand
21
+ with nothing to show. Bound to the same authority `risk` is bound to, and a cut
22
+ bundle declares it **before the signature covers it** — including when the cut
23
+ arrived through `--from-risk`.
24
+ - **`risk` was still not bounded, and now the walks ask (C3-88).** C3-85's naming
25
+ answered which one held the time on the first run: `reading HTTP-input query
26
+ sinks`, still on screen at 1,4 min under a 5 s budget. Every walk of the
27
+ composition now asks the deadline, a skipped walk degrades its axis to
28
+ `unknown` rather than shrinking a count, and the walk itself runs only when it
29
+ can change an answer. Measured: jobrunr 15,7 → **4,1 s** with an identical
30
+ payload; `keycloak/services` over ten minutes → **10,2 s under a 5 s budget**,
31
+ PARTIAL published.
32
+ - **A gate is one the repository declares (C3-90).** `@NoCache` and
33
+ `@APIResponses` were being read as Keycloak's authorization gates by coverage
34
+ and specificity alone. `spring-audit keycloak/services`: **86 findings, all
35
+ `high`, all false → 0**, with the hedged posture verdict untouched.
36
+ - **And a route is protected by one too (C3-93).** The same wide list decided the
37
+ per-endpoint verdict, which is the reassurance side and the worse one: **366 of
38
+ 593 endpoints `protected_custom`** on a caching hint. Now **0**.
39
+ - **A bypass claim needs something to bypass (C3-91).** Self-invocation and
40
+ private/final non-interception are properties of a proxy; where nothing
41
+ proxies, the two rules are silent, and where something does, the finding names
42
+ the enforcement model it assumed instead of asserting a framework.
43
+ - **A family says which of its walks the count belongs to (C3-92).** The name was
44
+ computed, used for `_partial`, and dropped on the way to the screen.
45
+ - **The answer says whether its axes model this repository (CL-19).** Six axes
46
+ returned the shape of an answer and none added them up; `stack_fit` does, from
47
+ the flag the payload already carries.
48
+ - **`ask schema <unknown>` lists everything the argument accepts (C4-22).**
49
+
50
+ **New in this release:**
51
+
52
+ - **`--config <path>` / `ASK_CONFIG` (F-AX).** The repository's declaration may
53
+ live outside the repository, so an auditor under `--no-write` can declare data
54
+ labels and custom security annotations without touching somebody else's tree —
55
+ the case eval #20 executed, and the one where four commands were unreachable by
56
+ construction.
57
+ - **The fit statement reaches `posture` and `risk` (F-AY)**, over one
58
+ `spring_detected` authority that replaced two independent computations.
59
+ - **A truncated answer breaks the consumer that did not ask (F-AV).** On a cut
60
+ run `total_defects` becomes `total_defects_floor`, and `--ci` exits **75** —
61
+ neither the pass, nor "found something", nor "refused". Asked for in three
62
+ consecutive rounds and deliberately kept out of three correction queues,
63
+ because it changes a published contract.
64
+
65
+ **Measured and not fixed:** eval #21 reports ten performance regressions on
66
+ 4.16.0. The 4.15.0 → 4.16.0 diff is 282 lines and contains **no analysis change**
67
+ — emission, budget binding and payload keys — and an A/B on BroadleafCommerce is
68
+ flat on the four worst-reported commands (`validation` 8,52 → 8,28 s, `endpoints`
69
+ 2,09 → 2,24 s, `migrate-check` 7,79 → 7,51 s, `posture --diff` 4,00 → 4,08 s).
70
+ Third consecutive in-house A/B to come back flat; the row (C3-76e) stays open on
71
+ the Windows runner, which is now the highest-value item on the capability list.
72
+
73
+
74
+ ## [4.16.0] — 2026-08-10
75
+
76
+ **The Part 1 queue of field evaluation #19 — three rows, one commit each — and
77
+ the round where reading the field's *numbers* against our source found more than
78
+ reading its *conclusions* did.** The sixth measurement of the same repository at
79
+ the same commit scored **8,2/10**, the highest of the series: *"4.15.0 es la
80
+ mejor versión medida."* It verified both of the previous release's rows from the
81
+ outside (C3-81's `stage_stopped_in`, C3-83's budget provenance), determinism held
82
+ a **sixth** consecutive build across five version jumps, and five commands got
83
+ much faster (`validation` −57 %, `posture --diff` −54 %).
84
+
85
+ Two of the three complaints it left open turned out not to be what was filed.
86
+
87
+ **Fixed in this release:**
88
+
89
+ - **`risk` declares a budget and never asks whether it is spent (C3-87).** The
90
+ field filed `risk` at 2 842 s under a 420 s budget as a +41 % performance
91
+ regression. It is a consumer left unbound. C3-71 and C3-79 made the deadline
92
+ reach inside the rule pass and bound exactly one: `spring-audit` passes
93
+ `stop_when=_run.exhausted` at both of its call sites, while `risk` built the
94
+ same `PhasedRun`, with the same `budget_seconds` and the same `budget_source`,
95
+ and then constructed its observers with **no `stop_when` at all** — so
96
+ `should_stop()` answered `False` for the life of the run and the budget could
97
+ only be observed on the boundary between two phases. Their own two numbers
98
+ prove it on one machine under one budget: `spring-audit` **1,94×** over, `risk`
99
+ **6,8×** over. Reproduced here on keycloak (5 486 files) with a 5 s budget —
100
+ `spring-audit` stops at 9,9 s with `_partial` published; `risk` was still
101
+ running at **10 minutes, 120×**, and had to be killed. Both rule passes and the
102
+ composition join now ask, each on the unit it iterates. A cut run publishes the
103
+ floor marks **where the numbers are** (`partial`, `counts_are_floor`,
104
+ `counts_basis` — C2-31's rule applied to the second consumer), names the join's
105
+ own cut (`composition_stopped_after`), and says PARTIAL on the terminal. A
106
+ complete run gains no field. The three rule-pass keys of `_partial` move into
107
+ `PhasedRun.status`: for four releases there was one caller, so "the caller" and
108
+ "the authority" were the same object by accident, and a second consumer would
109
+ otherwise have duplicated thirty lines of composition or invented a second
110
+ vocabulary for one fact. **The battery asserts an absence**, because the defect
111
+ was one — a missing argument at a call site is invisible in the payload of the
112
+ command that omits it, so it reads `cli.py` and fails on any
113
+ `_rule_pass_progress(...)` built without `stop_when`. A third consumer cannot
114
+ be added unbound.
115
+
116
+ - **A stage of an audit either counts its population or names itself (C3-85).**
117
+ Six rounds of field reports read the 14,5-minute silence as a dead emitter,
118
+ proposing that the timer be re-armed. Measured through the real seam, the
119
+ emitter is alive and correct: a per-unit tick loop produced **5 evenly spaced
120
+ lines over 5,4 s at a 1 s interval**. What is silent is the work no counter
121
+ covers — instrumented on keycloak, **8,2 s of a 24 s warm run, 34 %**, between
122
+ the last `linking` tick and the first rule tick, with `linking 5486/5486`
123
+ frozen on screen throughout; 2,7 s more inside `GATE-001`; 24,7 s on a cold run
124
+ after `parsing 50/5486`. Named, not counted: the IR build's tail (`assembling
125
+ the IR`, `recovering spec-declared routes`, `scanning XML security
126
+ configuration`), the semantic-model build, the whole-tree walk *inside* the
127
+ configuration family (through `FamilyBudget.stage`, so the line says which
128
+ family it belongs to), the rule pass's dedup-and-order tail, and each of the
129
+ five repository-wide walks `risk` makes before it composes. A single walk has
130
+ no population, and inventing a denominator for it is the fabrication C3-56
131
+ refused. The assertion is the invariant rather than the symptom: a build may
132
+ not end on a completed counter, because everything after it runs under a line
133
+ that reads as still running.
134
+
135
+ - **A count that has stopped moving says so, and stops estimating (C3-86).** The
136
+ field's line — `3340/3342 java files eta=0.5s` — was written **fourteen
137
+ minutes** after the counter last advanced, and both of its halves are claims
138
+ the run cannot support: it asserts the stage is 99,9 % done *now*, and the ETA
139
+ divides the remaining units by a rate measured over a window in which nothing
140
+ happened, so the longer the stall lasted the more imminent the finish looked. A
141
+ line whose counted state has not advanced for a whole interval now publishes
142
+ `unchanged_for=<duration>` and withholds the estimate — the rule
143
+ `_eta_seconds` already applies to a stage too young to extrapolate from. The
144
+ count itself is still printed: it is true, and it is what a reader wants; what
145
+ is withheld is the assertion that it is current. The staleness clock is
146
+ deliberately not the stage clock — a long, healthy, advancing stage must not be
147
+ marked frozen, and both directions are asserted. An uncounted stage is never
148
+ called stale: it never claimed a denominator.
149
+
150
+ **Measured and not reproduced:** the report's third proposed fix — *"corregir la
151
+ documentación del flag `--jobs`"* — is already shipped. `JOBS_OPTION_HELP` in
152
+ this build reads *"It does NOT parallelise the rule pass, which is where a
153
+ repository-wide audit spends most of its time, and on a warm cache there is
154
+ nothing left to parse, so raising it buys nothing there."* The report quotes a
155
+ truncated earlier string. Recorded on CL-18 so it is not re-opened, which is the
156
+ CL-17 precedent.
157
+
158
+ **Deliberately not in this release**, and each for a stated reason: **F-AT**
159
+ (parallel rule evaluation — the field's single priority, *"lo único que separa
160
+ este producto de un 9"*: a capability, and it does not start before this queue
161
+ finishes), **F-AV** (a distinct exit code for a partial answer, or renaming
162
+ `total_defects` to `total_defects_floor` when `partial` is true — a published
163
+ contract change, never a side effect of a correction), **F-AU** (reusing the
164
+ cached audit in the compositions), and **C3-76/F-AW** (the cross-version `risk`
165
+ variance: macOS measures both sides flat for the second consecutive A/B, and a
166
+ regression that reproduces on one platform cannot be bisected from the platform
167
+ where it does not).
168
+
169
+ **What C3-87 does not close, stated plainly: the wall time.** After the fix,
170
+ `risk` on BroadleafCommerce (2 985 files) still runs past ten minutes under a 3 s
171
+ budget, because the cost is not in the passes that now ask. That is **C3-88**,
172
+ and it is open with a measurement rather than a hypothesis — the stage-by-stage
173
+ profile was started and cancelled before it attributed the time, so the row says
174
+ so instead of guessing.
175
+
176
+ Suite **7 833** (7 813 before), 20 new assertions, zero failures.
177
+
5
178
  ## [4.15.0] — 2026-08-10
6
179
 
7
180
  **The Part 1 queue of Amendment O — the four rows field evaluation #18 opened,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sourcecode
3
- Version: 4.15.0
3
+ Version: 4.17.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.15.0-blue)
45
+ ![Version](https://img.shields.io/badge/version-4.17.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`**
@@ -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 4.15.0 — and, on a build that has aged,
129
+ ask version # ask 4.17.0 — 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-4.15.0-blue)
7
+ ![Version](https://img.shields.io/badge/version-4.17.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`**
@@ -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 4.15.0 — and, on a build that has aged,
91
+ ask version # ask 4.17.0 — and, on a build that has aged,
92
92
  # how many releases have probably shipped since
93
93
  ```
94
94
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "sourcecode"
7
- version = "4.15.0"
7
+ version = "4.17.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.15.0"
7
+ __version__ = "4.17.0"
@@ -12,9 +12,10 @@ import hmac
12
12
  import json
13
13
  from datetime import datetime, timezone
14
14
  from pathlib import Path
15
- from typing import Any, Optional
15
+ from typing import Any, Callable, Optional
16
16
 
17
17
  from sourcecode import __version__
18
+ from sourcecode.partial_contract import floor_counts, read_count
18
19
 
19
20
  AUDIT_REPORT_SCHEMA = "audit-report-v1"
20
21
 
@@ -40,14 +41,30 @@ def build_audit_report(
40
41
  sign_key: Optional[bytes] = None,
41
42
  risk_limit: int = 10,
42
43
  risk_payload: Optional[dict[str, Any]] = None,
44
+ progress: "Optional[Callable[..., Any]]" = None,
45
+ checkpoint: "Optional[Callable[[str, dict], None]]" = None,
46
+ partial_status: "Optional[Callable[..., dict]]" = None,
43
47
  ) -> dict[str, Any]:
44
- """Build the buyer-readable audit bundle from existing command payloads."""
48
+ """Build the buyer-readable audit bundle from existing command payloads.
49
+
50
+ C3-89. This command composes the whole of `risk`, and for four releases it did
51
+ so with none of the three arguments above — no observer carrying the deadline,
52
+ no checkpoint, no `partial_status` — while `cli` built no `PhasedRun` for it
53
+ either. The operator's budget therefore did not exist here at all: the field
54
+ measured **2 265 s under `ASK_MAX_ANALYSIS_SECONDS=300`** (7,55×), CPU-bound in
55
+ one worker, with no `partial` and no answer. C3-87 bound the second consumer of
56
+ that fact and moved the composition of the `_partial` keys into
57
+ `PhasedRun.status` so the third would get it by construction; this is the third.
58
+ """
45
59
  from sourcecode.posture import build_posture
46
60
 
47
61
  root = Path(root).resolve()
48
62
  if risk_payload is None:
49
63
  from sourcecode.risk import build_risk
50
- risk = build_risk(root, limit=risk_limit, min_band="low", profiles=profiles)
64
+ risk = build_risk(
65
+ root, limit=risk_limit, min_band="low", profiles=profiles,
66
+ progress=progress, checkpoint=checkpoint, partial_status=partial_status,
67
+ )
51
68
  risk_source = "computed"
52
69
  else:
53
70
  risk = risk_payload
@@ -65,8 +82,10 @@ def build_audit_report(
65
82
  "summary": {
66
83
  "risk_model": risk.get("model"),
67
84
  "risk_source": risk_source,
68
- "total_defects": risk.get("total_defects"),
69
- "total_findings": risk.get("total_findings"),
85
+ # F-AV: read under either spelling, and republished under the one
86
+ # the bundle's own `summary.partial` already qualifies.
87
+ "total_defects": read_count(risk, "total_defects"),
88
+ "total_findings": read_count(risk, "total_findings"),
70
89
  "risk_bands": risk.get("by_band", {}),
71
90
  "top_risks_shown": len(top_risks),
72
91
  "endpoint_access": access.get("summary", {}),
@@ -85,6 +104,28 @@ def build_audit_report(
85
104
  "non_coverage": (risk.get("non_coverage") or {}).get("items", []),
86
105
  },
87
106
  }
107
+ # C3-89. A bundle whose evidence was cut says so **before** it is signed, and
108
+ # says it where a reader of the summary sees it — a signature over a truncated
109
+ # payload that does not declare the truncation is the worst artifact this
110
+ # product can produce. The keys come from `risk` itself, whichever way it
111
+ # arrived: a `--from-risk` file that was cut carries its own `_partial`, and
112
+ # packaging it silently would launder a floor into a verdict (C2-31's rule).
113
+ if risk.get("partial"):
114
+ unsigned["summary"]["partial"] = True
115
+ floor_counts(unsigned["summary"], True) # F-AV, on the bundle too
116
+ unsigned["summary"]["counts_are_floor"] = True
117
+ unsigned["summary"]["counts_basis"] = (
118
+ "The risk evidence in this bundle was stopped by the analysis budget. "
119
+ "`total_defects` and `risk_bands` count what the families that ran "
120
+ "measured, and are a floor over the repository."
121
+ )
122
+ _risk_partial = risk.get("_partial")
123
+ if isinstance(_risk_partial, dict):
124
+ unsigned["_partial"] = dict(_risk_partial)
125
+ unsigned["_partial"]["command"] = "audit-report"
126
+ unsigned["_partial"]["cut_in"] = "risk"
127
+ if risk_source == "from-risk":
128
+ unsigned["_partial"]["cut_in"] = "the `--from-risk` payload"
88
129
  from sourcecode.provenance import build_evidence_manifest
89
130
  unsigned["evidence_manifest"] = build_evidence_manifest(
90
131
  unsigned,
@@ -117,7 +158,8 @@ def render_markdown(report: dict[str, Any]) -> str:
117
158
  f"- Repository: `{repo}`",
118
159
  f"- ASK version: `{(report.get('tool') or {}).get('version', '')}`",
119
160
  f"- Profile set: `{profile}`",
120
- f"- Total defects: `{summary.get('total_defects')}`",
161
+ f"- Total defects: `{read_count(summary, 'total_defects')}`"
162
+ + (" **(floor — this run was cut short)**" if summary.get("partial") else ""),
121
163
  f"- Risk bands: `{summary.get('risk_bands')}`",
122
164
  f"- Endpoint access: `{summary.get('endpoint_access')}`",
123
165
  "",