sourcecode 4.17.0__tar.gz → 5.0.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.17.0 → sourcecode-5.0.0}/.github/workflows/perf-gate.yml +6 -1
  2. {sourcecode-4.17.0 → sourcecode-5.0.0}/CHANGELOG.md +121 -0
  3. {sourcecode-4.17.0 → sourcecode-5.0.0}/PKG-INFO +5 -5
  4. {sourcecode-4.17.0 → sourcecode-5.0.0}/README.md +4 -4
  5. {sourcecode-4.17.0 → sourcecode-5.0.0}/pyproject.toml +1 -1
  6. {sourcecode-4.17.0 → sourcecode-5.0.0}/scripts/perf_gate.py +19 -0
  7. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/__init__.py +1 -1
  8. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/cache_model.py +199 -37
  9. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/cli.py +38 -17
  10. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/context_cache.py +94 -7
  11. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/detach.py +7 -3
  12. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/execution_plan.py +36 -19
  13. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/identity_fallback.py +6 -12
  14. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/perf.py +4 -2
  15. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/phased_run.py +10 -8
  16. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/posture.py +9 -14
  17. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/release_info.py +1 -1
  18. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/risk.py +29 -6
  19. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/security_config_scan.py +4 -8
  20. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/source_text.py +65 -0
  21. {sourcecode-4.17.0 → sourcecode-5.0.0}/.github/workflows/build-windows.yml +0 -0
  22. {sourcecode-4.17.0 → sourcecode-5.0.0}/.gitignore +0 -0
  23. {sourcecode-4.17.0 → sourcecode-5.0.0}/.ruff.toml +0 -0
  24. {sourcecode-4.17.0 → sourcecode-5.0.0}/CLAUDE.md +0 -0
  25. {sourcecode-4.17.0 → sourcecode-5.0.0}/CONTRIBUTING.md +0 -0
  26. {sourcecode-4.17.0 → sourcecode-5.0.0}/LICENSE +0 -0
  27. {sourcecode-4.17.0 → sourcecode-5.0.0}/SECURITY.md +0 -0
  28. {sourcecode-4.17.0 → sourcecode-5.0.0}/raw +0 -0
  29. {sourcecode-4.17.0 → sourcecode-5.0.0}/scripts/compare_integration_engines.py +0 -0
  30. {sourcecode-4.17.0 → sourcecode-5.0.0}/scripts/customer_smoke_test.sh +0 -0
  31. {sourcecode-4.17.0 → sourcecode-5.0.0}/scripts/generate_jdk_exports.py +0 -0
  32. {sourcecode-4.17.0 → sourcecode-5.0.0}/scripts/perf_harness.py +0 -0
  33. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/adaptive_scanner.py +0 -0
  34. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/archetype.py +0 -0
  35. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/architectural_baseline.py +0 -0
  36. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/architectural_delta.py +0 -0
  37. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/architecture_analyzer.py +0 -0
  38. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/architecture_summary.py +0 -0
  39. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/ast_extractor.py +0 -0
  40. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/audit_report.py +0 -0
  41. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/baseline_autocapture.py +0 -0
  42. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/cache.py +0 -0
  43. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/call_surface.py +0 -0
  44. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/caller_metrics.py +0 -0
  45. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/caller_reach.py +0 -0
  46. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/canonical_ir.py +0 -0
  47. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/chain_rules.py +0 -0
  48. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/change_plan.py +0 -0
  49. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/cir_graphs.py +0 -0
  50. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/classifier.py +0 -0
  51. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/client_calls.py +0 -0
  52. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/code_notes_analyzer.py +0 -0
  53. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/compare.py +0 -0
  54. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/confidence_analyzer.py +0 -0
  55. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/constraint_diff.py +0 -0
  56. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/container_wiring.py +0 -0
  57. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/context_graph.py +0 -0
  58. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/context_scorer.py +0 -0
  59. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/context_summarizer.py +0 -0
  60. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/contract_diff.py +0 -0
  61. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/contract_init.py +0 -0
  62. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/contract_model.py +0 -0
  63. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/contract_pipeline.py +0 -0
  64. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/coverage_parser.py +0 -0
  65. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/data_exposure.py +0 -0
  66. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/data_labels.py +0 -0
  67. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/declarations.py +0 -0
  68. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/defect_identity.py +0 -0
  69. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/degradation.py +0 -0
  70. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/dependency_analyzer.py +0 -0
  71. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/deployment_prefix.py +0 -0
  72. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/detectors/__init__.py +0 -0
  73. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/detectors/base.py +0 -0
  74. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/detectors/csproj_parser.py +0 -0
  75. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/detectors/dart.py +0 -0
  76. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/detectors/dotnet.py +0 -0
  77. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/detectors/elixir.py +0 -0
  78. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/detectors/go.py +0 -0
  79. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/detectors/heuristic.py +0 -0
  80. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/detectors/hybrid.py +0 -0
  81. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/detectors/java.py +0 -0
  82. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/detectors/jvm_ext.py +0 -0
  83. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/detectors/nodejs.py +0 -0
  84. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/detectors/parsers.py +0 -0
  85. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/detectors/php.py +0 -0
  86. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/detectors/project.py +0 -0
  87. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/detectors/python.py +0 -0
  88. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/detectors/ruby.py +0 -0
  89. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/detectors/rust.py +0 -0
  90. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/detectors/systems.py +0 -0
  91. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/detectors/terraform.py +0 -0
  92. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/detectors/tooling.py +0 -0
  93. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/doc_analyzer.py +0 -0
  94. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/dynamic_argument_surface.py +0 -0
  95. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/endpoint_literals.py +0 -0
  96. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/endpoint_metrics.py +0 -0
  97. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/entrypoint_classifier.py +0 -0
  98. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/env_analyzer.py +0 -0
  99. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/envelope.py +0 -0
  100. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/environment_resolution.py +0 -0
  101. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/error_schema.py +0 -0
  102. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/evidence_provider.py +0 -0
  103. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/explain.py +0 -0
  104. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/facts/__init__.py +0 -0
  105. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/facts/registry.json +0 -0
  106. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/file_chunker.py +0 -0
  107. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/file_classifier.py +0 -0
  108. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/filter_surface.py +0 -0
  109. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/format_contract.py +0 -0
  110. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/fqn_utils.py +0 -0
  111. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/git_analyzer.py +0 -0
  112. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/git_checkout.py +0 -0
  113. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/graph_analyzer.py +0 -0
  114. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/graph_evidence.py +0 -0
  115. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/hibernate_strat.py +0 -0
  116. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/integration_coordinates.py +0 -0
  117. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/jdk_exports.py +0 -0
  118. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/license.py +0 -0
  119. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/mcp/__init__.py +0 -0
  120. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/mcp/dependency_import.py +0 -0
  121. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/mcp/onboarding/__init__.py +0 -0
  122. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/mcp/onboarding/applier.py +0 -0
  123. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/mcp/onboarding/backup.py +0 -0
  124. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/mcp/onboarding/detector.py +0 -0
  125. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/mcp/onboarding/planner.py +0 -0
  126. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/mcp/orchestrator.py +0 -0
  127. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/mcp/registry.py +0 -0
  128. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/mcp/runner.py +0 -0
  129. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/mcp/server.py +0 -0
  130. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/mcp_nudge.py +0 -0
  131. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/metrics_analyzer.py +0 -0
  132. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/migrate_check.py +0 -0
  133. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/migration_blast.py +0 -0
  134. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/non_coverage.py +0 -0
  135. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/openapi_surface.py +0 -0
  136. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/openrewrite_recipe.py +0 -0
  137. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/output_budget.py +0 -0
  138. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/output_encoding.py +0 -0
  139. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/parallel.py +0 -0
  140. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/parse_cache.py +0 -0
  141. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/partial_contract.py +0 -0
  142. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/path_admission.py +0 -0
  143. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/path_filters.py +0 -0
  144. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/pipe_contract.py +0 -0
  145. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/pr_comment_renderer.py +0 -0
  146. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/pr_impact.py +0 -0
  147. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/prepare_context.py +0 -0
  148. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/progress.py +0 -0
  149. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/provenance.py +0 -0
  150. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/ranking_engine.py +0 -0
  151. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/readiness_timeline.py +0 -0
  152. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/readonly.py +0 -0
  153. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/reconciliation.py +0 -0
  154. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/redactor.py +0 -0
  155. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/reference_facts.py +0 -0
  156. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/relevance_scorer.py +0 -0
  157. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/remedies.py +0 -0
  158. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/rename_refactor.py +0 -0
  159. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/repo_classifier.py +0 -0
  160. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/repository_ir.py +0 -0
  161. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/retrieval/__init__.py +0 -0
  162. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/retrieval/context.py +0 -0
  163. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/retrieval/errors.py +0 -0
  164. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/retrieval/executor.py +0 -0
  165. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/retrieval/planner.py +0 -0
  166. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/retrieval/query.py +0 -0
  167. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/retrieval/request.py +0 -0
  168. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/retrieval/resolution.py +0 -0
  169. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/retrieval/result.py +0 -0
  170. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/retrieval/retriever.py +0 -0
  171. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/retrieval/runtime.py +0 -0
  172. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/retrieval/steps.py +0 -0
  173. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/retrieval/steps_endpoint.py +0 -0
  174. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/retrieval/steps_graph.py +0 -0
  175. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/retrieval/steps_impact.py +0 -0
  176. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/retrieval/steps_intf.py +0 -0
  177. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/retrieval/steps_struct.py +0 -0
  178. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/retrieval/steps_txsec.py +0 -0
  179. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/ris.py +0 -0
  180. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/rule_catalog.py +0 -0
  181. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/rule_pass.py +0 -0
  182. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/runs.py +0 -0
  183. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/runtime_classifier.py +0 -0
  184. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/sarif.py +0 -0
  185. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/scanner.py +0 -0
  186. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/schema.py +0 -0
  187. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/schemas/envelope-v1.schema.json +0 -0
  188. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/security_config.py +0 -0
  189. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/security_posture.py +0 -0
  190. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/semantic_analyzer.py +0 -0
  191. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/semantic_impact_engine.py +0 -0
  192. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/semantic_integration_engine.py +0 -0
  193. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/semantic_services.py +0 -0
  194. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/serializer.py +0 -0
  195. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/servlet_surface.py +0 -0
  196. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/spring_event_topology.py +0 -0
  197. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/spring_findings.py +0 -0
  198. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/spring_impact.py +0 -0
  199. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/spring_model.py +0 -0
  200. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/spring_profiles.py +0 -0
  201. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/spring_properties.py +0 -0
  202. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/spring_security_audit.py +0 -0
  203. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/spring_semantic.py +0 -0
  204. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/spring_tx_analyzer.py +0 -0
  205. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/summarizer.py +0 -0
  206. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/target_admission.py +0 -0
  207. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/telemetry/__init__.py +0 -0
  208. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/telemetry/config.py +0 -0
  209. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/telemetry/consent.py +0 -0
  210. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/telemetry/events.py +0 -0
  211. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/telemetry/filters.py +0 -0
  212. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/telemetry/transport.py +0 -0
  213. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/test_gap_ranking.py +0 -0
  214. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/test_sources.py +0 -0
  215. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/text_input.py +0 -0
  216. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/token_estimate.py +0 -0
  217. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/tree_utils.py +0 -0
  218. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/type_usage_surface.py +0 -0
  219. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/validation_inference.py +0 -0
  220. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/validation_surface.py +0 -0
  221. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/verify_edit.py +0 -0
  222. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/verify_repo.py +0 -0
  223. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/verify_rules.py +0 -0
  224. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/version_check.py +0 -0
  225. {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/workspace.py +0 -0
  226. {sourcecode-4.17.0 → sourcecode-5.0.0}/supabase/functions/README.md +0 -0
  227. {sourcecode-4.17.0 → sourcecode-5.0.0}/supabase/functions/get-license/index.ts +0 -0
  228. {sourcecode-4.17.0 → sourcecode-5.0.0}/supabase/functions/lemonsqueezy-webhook/index.ts +0 -0
  229. {sourcecode-4.17.0 → sourcecode-5.0.0}/supabase/functions/telemetry/index.ts +0 -0
  230. {sourcecode-4.17.0 → sourcecode-5.0.0}/supabase/sql/license_event_ordering.sql +0 -0
  231. {sourcecode-4.17.0 → sourcecode-5.0.0}/supabase/sql/licensing_schema.sql +0 -0
  232. {sourcecode-4.17.0 → sourcecode-5.0.0}/supabase/sql/telemetry_events.sql +0 -0
@@ -59,14 +59,18 @@ jobs:
59
59
  python3 scripts/perf_gate.py --print-config | tee gate-config.json
60
60
  echo "repo_url=$(python3 -c "import json;print(json.load(open('gate-config.json'))['repository_url'])")" >> "$GITHUB_OUTPUT"
61
61
  echo "repo=$(python3 -c "import json;print(json.load(open('gate-config.json'))['repository'])")" >> "$GITHUB_OUTPUT"
62
+ echo "fleet_subdir=$(python3 -c "import json;print(json.load(open('gate-config.json'))['fleet_subdir'])")" >> "$GITHUB_OUTPUT"
62
63
  echo "mode=$(python3 -c "import json;print(json.load(open('gate-config.json'))['mode'])")" >> "$GITHUB_OUTPUT"
63
64
  echo "runs=$(python3 -c "import json;print(json.load(open('gate-config.json'))['min_runs'])")" >> "$GITHUB_OUTPUT"
64
65
  echo "commands=$(python3 -c "import json;print(' '.join(repr(c) for c in json.load(open('gate-config.json'))['commands']))")" >> "$GITHUB_OUTPUT"
65
66
 
66
67
  - name: Clone the gate repository
68
+ # Into the directory the harness resolves the gate repository to, which
69
+ # `--print-config` publishes. Naming it here instead cost three nightlies
70
+ # that measured nothing.
67
71
  run: |
68
72
  mkdir -p fleet
69
- git clone --depth 1 "${{ steps.cfg.outputs.repo_url }}" "fleet/${{ steps.cfg.outputs.repo }}"
73
+ git clone --depth 1 "${{ steps.cfg.outputs.repo_url }}" "fleet/${{ steps.cfg.outputs.fleet_subdir }}"
70
74
 
71
75
  - name: Measure
72
76
  env:
@@ -84,6 +88,7 @@ jobs:
84
88
  run: |
85
89
  python3 scripts/perf_gate.py \
86
90
  --baseline "$BASELINE_DIR" \
91
+ --require-baseline \
87
92
  --current perf-run \
88
93
  --report perf-run/gate.json \
89
94
  --table perf-run/RELEASE-TABLE.md
@@ -2,6 +2,127 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [5.0.0] — 2026-08-11
6
+
7
+ **The engine got 280× faster in 4.18.0 and every number the product quoted about
8
+ its own cost still described the build before it.** This release changes no
9
+ analysis: it makes what ASK says about itself true again, and makes the way it
10
+ went stale impossible to repeat silently. Field evaluation #22 — eighth
11
+ measurement of the same 3 342-file repository at the same commit — scored the
12
+ build **9,2/10** and named this as the one place the product states something
13
+ false with confidence.
14
+
15
+ **Why a major.** No API breaks. What changes is an answer thousands of readers
16
+ act on: commands that were published as *"not a foreground run here — `--output
17
+ <file> --detach`, or a nightly job"* are now published as foreground work, and
18
+ the operational advice in `--help`, `cache model`, the budget warning and the
19
+ remedies moves with them. A recommendation that reverses is a contract change
20
+ whatever the surface, so it is versioned like one.
21
+
22
+ **Fixed in this release:**
23
+
24
+ - **The cost anchors described a build that no longer exists (C3-97).** `spring-audit`'s
25
+ field anchor was **2 351 s**, measured on 4.11.0; the same command, on the same
26
+ repository at the same commit, takes **8,4 s** on 4.18.0 — the two
27
+ catastrophic-backtracking patterns behind that figure were deleted in C3-95 and
28
+ C3-96. Four surfaces read the anchors and none could tell they were old:
29
+ `execution_plan`'s `here:` verdict, the budget warning, the `cache model`
30
+ header, and the front page. The product therefore recommended a nightly job for
31
+ an eight-second command, and an operator sizing `ASK_MAX_ANALYSIS_SECONDS` from
32
+ it would set the budget ~280× too high. Anchors refreshed from evaluation #22
33
+ (`spring-audit` 2 351 → 8,4 s · `risk` 3 232 → 73,3 s · `posture` 38 → 8,0 s ·
34
+ `migrate-check` 26,7 → 10,2 s · `endpoints` 5,0 → 3,8 s), first anchors recorded
35
+ for `impact-chain` 5,5 s, `validation` 17,4 s, `pr-impact` 12,5 s, `impact`
36
+ 7,7 s and `explain` 4,4 s — and `modernize`, carried as *did not finish* since
37
+ 4.10.4, is a measurement again at **9,1 s**.
38
+ - **And they cannot go stale silently again.** Every field figure now carries
39
+ `field_measured_version`, the build it was taken on. A figure from an earlier
40
+ release is still published — a measurement at that size beats silence — but it
41
+ arrives labelled *"measured on 4.10.4, not re-measured on 5.0.0"* wherever it is
42
+ read, and `ask cache model --json` publishes `field_currency` naming every row
43
+ in that state. This is the mechanism `REFERENCE_MEASURED_VERSION` already gave
44
+ the reference figures; the field anchors, which are the ones that decide how a
45
+ command is offered, had none.
46
+ - **The front page paraphrased the table instead of deriving it (CL-21).** *"Repo-wide/deep
47
+ compositions can take minutes … use deep jobs nightly"* was written in `cli`
48
+ beside the model it described, so it aged separately from the anchors it
49
+ paraphrased. It is generated from `cache_model.cost_sentence()` now: refreshing
50
+ a measurement refreshes the prose, and a battery asserts the front page contains
51
+ exactly what the model generates.
52
+ - **The performance gate had no baseline to compare against (C3-98).** F-AP shipped
53
+ the detector in 4.13.0 and it has run nightly since, self-testing that a
54
+ synthetic 3× regression would fail — against `docs/perf/baselines/gate-latest`,
55
+ a directory that was never created. Every run ended in the gate refusing to
56
+ report green (*"a gate that cannot be red is not evidence"*), which is why eight
57
+ consecutive field evaluations found no evidence that any benchmark gates a
58
+ release. The baseline is committed: six cells on BroadleafCommerce, warm, five
59
+ runs each, captured on the runner at 4.18.0, with provenance and a refresh
60
+ procedure beside them. First real comparison passed with `regressions: []`, and
61
+ the observed runner noise floor — ±5 %, widest on the shortest cell — is
62
+ published next to the 20 % threshold it has to be read against.
63
+ - **The gate's exclusion list quoted a deleted cost (C3-99).** `risk` was excluded
64
+ because it took *54 minutes* on the gate repository. Since C3-96 it takes
65
+ **68 s** there. The reason now says so, and names the only thing still keeping
66
+ it out: no baseline cell exists for it yet.
67
+ - **Stale cost claims elsewhere in the documentation.** README (the proof table's
68
+ caveat and the problem statement), `USER_GUIDE` (the "Start here" framing and
69
+ the spinner paragraph), `docs/CACHE.md` (regenerated), `docs/perf/REGRESSION-GATE.md`
70
+ §3, and the module docstrings of `execution_plan`, `phased_run` and `detach`,
71
+ where a 408 s / 2 351 s cost was narrated in the present tense.
72
+
73
+ **Deliberately not in this release:** the `chunk-file -c` remap. The guide says the
74
+ short form moves from `--chunk` to `--copy` "at the next major"; this major
75
+ changes no invocation, and breaking a working command line as a side effect of a
76
+ documentation-truth release would be the wrong trade. It waits for a major that
77
+ changes the command surface on purpose.
78
+
79
+ **Not changed:** any analysis, any payload, any schema. Every rule, every count and
80
+ every verdict this build produces is byte-identical to 4.18.0's.
81
+
82
+ ## [4.18.0] — 2026-08-10
83
+
84
+ **A field battery over the test repositories, run against 4.17.0 and aimed first
85
+ at where the time goes.** Three defects, all found by measuring rather than by
86
+ reading: one answer that was silently about the wrong repository, and two scans
87
+ that could not finish. `risk` on BroadleafCommerce (2 985 files) did not return in
88
+ twenty minutes and now returns a complete answer in **68 s**.
89
+
90
+ **Fixed in this release:**
91
+
92
+ - **A run bounded to a subdirectory answered for the whole repository (C3-94).**
93
+ The shared Java parse was keyed on the worktree alone, so a run over a
94
+ subdirectory stored its subset under the repository-wide key and the next
95
+ repository-wide command read it. Measured on openmrs-core: `explain WebUtil
96
+ <repo>/web` left a **42-file / 382-symbol** CIR where the repository has 861 and
97
+ 11 605, and `impact-chain` then answered from it — reporting 861 files beside
98
+ 382 symbols, and dropping from `confidence: high` to `low` with no input change.
99
+ The analysed set is now part of the key; a repository-wide run owns the shared
100
+ entry and a bounded run keys on its own, so bounded runs are **cached** instead
101
+ of being exempt. The rule lived in one call site and four others wrote the key
102
+ unguarded; it now lives in the cache, behind one door.
103
+ - **Naming the enclosing type backtracked exponentially (C3-95).** Two scanners
104
+ carried the same ambiguous pattern — a whitespace branch inside a starred group,
105
+ followed by another starred whitespace group. Measured: **13 ms** for 200 leading
106
+ spaces on one line, 1,17 s for 800, **10,1 s for 1 600**. Now linear: 0,06 ms at
107
+ 1 600 and 0,76 ms at 20 000. `scan_security_configuration` on BroadleafCommerce
108
+ **3,34 s → 1,53 s**, same findings.
109
+ - **`risk` could not finish, inside a regex no budget can interrupt (C3-96).**
110
+ `_java_methods` runs a method pattern over every source, and that pattern let the
111
+ same whitespace be consumed in three places at once. A catastrophic match runs in
112
+ CPython's C regex engine, which never returns to the interpreter — so the
113
+ deadline C3-87 installed is not read, and neither is a Ctrl-C. Rewritten so every
114
+ separator is consumed once, with the matches asserted **identical** over 1 771
115
+ files: eureka **142,35 s → 2,10 s**, jobrunr 29,38 s → 1,75 s, openmrs-core
116
+ 35,25 s → 11,11 s, and `risk` on BroadleafCommerce **>20 min (killed) → 68 s**,
117
+ 15 of 15 defects composed.
118
+
119
+ **Not claimed by this release:** routing `spring-audit` and `risk` onto the shared
120
+ parse is a correctness change, not a measured speed-up — the per-file parse cache
121
+ already absorbed most of it, and the A/B on openmrs-core and BroadleafCommerce
122
+ came out inside the noise. The residual cost of the method scan is polynomial, not
123
+ linear, and `migrate-check` and `endpoints` still gain nothing from a warm; both
124
+ are open in `.planning/ROADMAP-FIELD-BATTERY-2026-08-10.md`.
125
+
5
126
  ## [4.17.0] — 2026-08-10
6
127
 
7
128
  **The Part 1 queues of field evaluations #20 and #21, and the first three
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sourcecode
3
- Version: 4.17.0
3
+ Version: 5.0.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.17.0-blue)
45
+ ![Version](https://img.shields.io/badge/version-5.0.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`**
@@ -54,7 +54,7 @@ Description-Content-Type: text/markdown
54
54
 
55
55
  ## The problem
56
56
 
57
- Every time an AI coding agent starts a new session, it has to re-parse the repository from scratch. On small and mid-sized repos that cost is seconds; on large Java/Spring monoliths, repo-wide semantic composition can be minutes. Multiply that by dozens of agent turns per hour, and repo context acquisition becomes a real bottleneck — not just latency, but tokens, compute, and iteration velocity.
57
+ Every time an AI coding agent starts a new session, it has to re-parse the repository from scratch. On a large Java/Spring monolith that is thousands of files of parsing per turn, repeated for every question asked about the same unchanged tree. Multiply it by dozens of agent turns per hour, and repo context acquisition becomes a real bottleneck — not just latency, but tokens, compute, and iteration velocity.
58
58
 
59
59
  ASK Engine solves this with a persistent structural cache keyed on file content hashes. After the first scan, later invocations reuse pre-built context whenever their command can consume the warmed layers. The repo doesn't change? The cache doesn't expire.
60
60
 
@@ -69,7 +69,7 @@ ASK Engine solves this with a persistent structural cache keyed on file content
69
69
  | Keycloak | 7,885 Java files | 10.5s | 0.6s | **~17x** |
70
70
  | BroadleafCommerce | 2,985 Java files | 2.7s | 0.3s | **~9x** |
71
71
 
72
- These numbers are cache-layer benchmarks, not a promise for every command. Per-symbol queries and compact context benefit most. Inventory commands scale with file count. Repo-wide/deep compositions such as `risk`, `audit-report` and large `spring-audit` runs can take minutes on multi-thousand-endpoint repositories and belong in a supervised or nightly job unless CI sets an explicit budget.
72
+ These numbers are cache-layer benchmarks, not a promise for every command. Per-symbol queries and compact context benefit most, and inventory commands scale with file count. What a repository-wide analysis costs tracks the build more than the file count: on one 3,342-file monolith, at one commit, `spring-audit` measured 2,351s on 4.11.0 and **8.4s on 4.18.0** with a byte-identical payload — so ASK publishes measured anchors and the release each was taken on, and never projects a duration for your repository. `ask cache model` prints both anchors per command, and `risk` — the one composition still measured in the tens of seconds at that size — is the one to give a budget or a detached run.
73
73
 
74
74
  With the right command class, ASK Engine becomes **constant infrastructure** inside agent loops — call the fast/context surfaces before edits and reserve deep compositions for the points where their evidence is worth the runtime.
75
75
 
@@ -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.17.0 — and, on a build that has aged,
129
+ ask version # ask 5.0.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.17.0-blue)
7
+ ![Version](https://img.shields.io/badge/version-5.0.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`**
@@ -16,7 +16,7 @@
16
16
 
17
17
  ## The problem
18
18
 
19
- Every time an AI coding agent starts a new session, it has to re-parse the repository from scratch. On small and mid-sized repos that cost is seconds; on large Java/Spring monoliths, repo-wide semantic composition can be minutes. Multiply that by dozens of agent turns per hour, and repo context acquisition becomes a real bottleneck — not just latency, but tokens, compute, and iteration velocity.
19
+ Every time an AI coding agent starts a new session, it has to re-parse the repository from scratch. On a large Java/Spring monolith that is thousands of files of parsing per turn, repeated for every question asked about the same unchanged tree. Multiply it by dozens of agent turns per hour, and repo context acquisition becomes a real bottleneck — not just latency, but tokens, compute, and iteration velocity.
20
20
 
21
21
  ASK Engine solves this with a persistent structural cache keyed on file content hashes. After the first scan, later invocations reuse pre-built context whenever their command can consume the warmed layers. The repo doesn't change? The cache doesn't expire.
22
22
 
@@ -31,7 +31,7 @@ ASK Engine solves this with a persistent structural cache keyed on file content
31
31
  | Keycloak | 7,885 Java files | 10.5s | 0.6s | **~17x** |
32
32
  | BroadleafCommerce | 2,985 Java files | 2.7s | 0.3s | **~9x** |
33
33
 
34
- These numbers are cache-layer benchmarks, not a promise for every command. Per-symbol queries and compact context benefit most. Inventory commands scale with file count. Repo-wide/deep compositions such as `risk`, `audit-report` and large `spring-audit` runs can take minutes on multi-thousand-endpoint repositories and belong in a supervised or nightly job unless CI sets an explicit budget.
34
+ These numbers are cache-layer benchmarks, not a promise for every command. Per-symbol queries and compact context benefit most, and inventory commands scale with file count. What a repository-wide analysis costs tracks the build more than the file count: on one 3,342-file monolith, at one commit, `spring-audit` measured 2,351s on 4.11.0 and **8.4s on 4.18.0** with a byte-identical payload — so ASK publishes measured anchors and the release each was taken on, and never projects a duration for your repository. `ask cache model` prints both anchors per command, and `risk` — the one composition still measured in the tens of seconds at that size — is the one to give a budget or a detached run.
35
35
 
36
36
  With the right command class, ASK Engine becomes **constant infrastructure** inside agent loops — call the fast/context surfaces before edits and reserve deep compositions for the points where their evidence is worth the runtime.
37
37
 
@@ -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.17.0 — and, on a build that has aged,
91
+ ask version # ask 5.0.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.17.0"
7
+ version = "5.0.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"
@@ -33,7 +33,13 @@ import sys
33
33
  from pathlib import Path
34
34
 
35
35
  sys.path.insert(0, str(Path(__file__).resolve().parent.parent / "src"))
36
+ sys.path.insert(0, str(Path(__file__).resolve().parent))
36
37
  from sourcecode import perf # noqa: E402
38
+ # The directory a repository is checked out under is the harness's fact, not a
39
+ # second one this script or a workflow may restate: CI cloned the gate repo into
40
+ # `fleet/broadleaf` while the harness looked for `fleet/BroadleafCommerce`, so
41
+ # every nightly measured zero cells. `--print-config` now publishes the one name.
42
+ from perf_harness import FLEET # noqa: E402
37
43
 
38
44
 
39
45
  def load_cells(directory: Path) -> dict[str, dict]:
@@ -98,6 +104,8 @@ def _print_config() -> int:
98
104
  "threshold": perf.RELEASE_GATE_THRESHOLD,
99
105
  "repository": perf.RELEASE_GATE_REPO,
100
106
  "repository_url": perf.RELEASE_GATE_REPO_URL,
107
+ # Where the harness will look for that checkout, under the fleet root.
108
+ "fleet_subdir": FLEET.get(perf.RELEASE_GATE_REPO, perf.RELEASE_GATE_REPO),
101
109
  "repository_scale": perf.RELEASE_GATE_REPO_SCALE,
102
110
  "mode": perf.RELEASE_GATE_MODE,
103
111
  "min_runs": perf.RELEASE_GATE_MIN_RUNS,
@@ -122,6 +130,11 @@ def main() -> int:
122
130
  ap.add_argument("--allow-incomparable", action="store_true",
123
131
  help="Do not fail cells whose env/host differ. Off by default: "
124
132
  "an incomparable cell is an unmeasured one.")
133
+ ap.add_argument("--require-baseline", action="store_true",
134
+ help="Fail when the baseline holds no cells. A run with nothing "
135
+ "to compare against records every cell as `new` and passes; "
136
+ "that is a recording, not a gate, and CI must not read it "
137
+ "as one.")
125
138
  ap.add_argument("--report", type=Path, help="Write the perf-gate-v1 report here.")
126
139
  ap.add_argument("--table", type=Path, help="Write the release-notes markdown table here.")
127
140
  ap.add_argument("--self-test", action="store_true",
@@ -143,6 +156,12 @@ def main() -> int:
143
156
  f"which the gate reads as a failure, not a pass.", file=sys.stderr)
144
157
  return 1
145
158
  baseline = load_cells(args.baseline) if args.baseline else {}
159
+ if args.require_baseline and not baseline:
160
+ where = args.baseline if args.baseline else "<no --baseline given>"
161
+ print(f"no baseline cells in {where} — every cell would be recorded as "
162
+ f"`new` and the run would pass without comparing anything. A gate "
163
+ f"that cannot be red is not evidence.", file=sys.stderr)
164
+ return 1
146
165
 
147
166
  report = perf.gate_report(
148
167
  baseline, current,
@@ -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.17.0"
7
+ __version__ = "5.0.0"