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.
- {sourcecode-4.17.0 → sourcecode-5.0.0}/.github/workflows/perf-gate.yml +6 -1
- {sourcecode-4.17.0 → sourcecode-5.0.0}/CHANGELOG.md +121 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/PKG-INFO +5 -5
- {sourcecode-4.17.0 → sourcecode-5.0.0}/README.md +4 -4
- {sourcecode-4.17.0 → sourcecode-5.0.0}/pyproject.toml +1 -1
- {sourcecode-4.17.0 → sourcecode-5.0.0}/scripts/perf_gate.py +19 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/__init__.py +1 -1
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/cache_model.py +199 -37
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/cli.py +38 -17
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/context_cache.py +94 -7
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/detach.py +7 -3
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/execution_plan.py +36 -19
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/identity_fallback.py +6 -12
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/perf.py +4 -2
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/phased_run.py +10 -8
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/posture.py +9 -14
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/release_info.py +1 -1
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/risk.py +29 -6
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/security_config_scan.py +4 -8
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/source_text.py +65 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/.github/workflows/build-windows.yml +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/.gitignore +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/.ruff.toml +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/CLAUDE.md +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/CONTRIBUTING.md +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/LICENSE +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/SECURITY.md +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/raw +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/scripts/compare_integration_engines.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/scripts/customer_smoke_test.sh +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/scripts/generate_jdk_exports.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/scripts/perf_harness.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/adaptive_scanner.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/archetype.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/architectural_baseline.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/architectural_delta.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/architecture_analyzer.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/architecture_summary.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/ast_extractor.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/audit_report.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/baseline_autocapture.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/cache.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/call_surface.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/caller_metrics.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/caller_reach.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/canonical_ir.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/chain_rules.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/change_plan.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/cir_graphs.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/classifier.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/client_calls.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/code_notes_analyzer.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/compare.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/confidence_analyzer.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/constraint_diff.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/container_wiring.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/context_graph.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/context_scorer.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/context_summarizer.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/contract_diff.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/contract_init.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/contract_model.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/contract_pipeline.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/coverage_parser.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/data_exposure.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/data_labels.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/declarations.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/defect_identity.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/degradation.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/dependency_analyzer.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/deployment_prefix.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/detectors/__init__.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/detectors/base.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/detectors/csproj_parser.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/detectors/dart.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/detectors/dotnet.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/detectors/elixir.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/detectors/go.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/detectors/heuristic.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/detectors/hybrid.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/detectors/java.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/detectors/jvm_ext.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/detectors/nodejs.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/detectors/parsers.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/detectors/php.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/detectors/project.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/detectors/python.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/detectors/ruby.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/detectors/rust.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/detectors/systems.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/detectors/terraform.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/detectors/tooling.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/doc_analyzer.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/dynamic_argument_surface.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/endpoint_literals.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/endpoint_metrics.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/entrypoint_classifier.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/env_analyzer.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/envelope.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/environment_resolution.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/error_schema.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/evidence_provider.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/explain.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/facts/__init__.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/facts/registry.json +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/file_chunker.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/file_classifier.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/filter_surface.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/format_contract.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/fqn_utils.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/git_analyzer.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/git_checkout.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/graph_analyzer.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/graph_evidence.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/hibernate_strat.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/integration_coordinates.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/jdk_exports.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/license.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/mcp/__init__.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/mcp/dependency_import.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/mcp/onboarding/__init__.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/mcp/onboarding/applier.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/mcp/onboarding/backup.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/mcp/onboarding/detector.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/mcp/onboarding/planner.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/mcp/orchestrator.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/mcp/registry.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/mcp/runner.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/mcp/server.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/mcp_nudge.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/metrics_analyzer.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/migrate_check.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/migration_blast.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/non_coverage.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/openapi_surface.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/openrewrite_recipe.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/output_budget.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/output_encoding.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/parallel.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/parse_cache.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/partial_contract.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/path_admission.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/path_filters.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/pipe_contract.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/pr_comment_renderer.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/pr_impact.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/prepare_context.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/progress.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/provenance.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/ranking_engine.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/readiness_timeline.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/readonly.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/reconciliation.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/redactor.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/reference_facts.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/relevance_scorer.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/remedies.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/rename_refactor.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/repo_classifier.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/repository_ir.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/retrieval/__init__.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/retrieval/context.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/retrieval/errors.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/retrieval/executor.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/retrieval/planner.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/retrieval/query.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/retrieval/request.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/retrieval/resolution.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/retrieval/result.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/retrieval/retriever.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/retrieval/runtime.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/retrieval/steps.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/retrieval/steps_endpoint.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/retrieval/steps_graph.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/retrieval/steps_impact.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/retrieval/steps_intf.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/retrieval/steps_struct.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/retrieval/steps_txsec.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/ris.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/rule_catalog.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/rule_pass.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/runs.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/runtime_classifier.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/sarif.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/scanner.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/schema.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/schemas/envelope-v1.schema.json +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/security_config.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/security_posture.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/semantic_analyzer.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/semantic_impact_engine.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/semantic_integration_engine.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/semantic_services.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/serializer.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/servlet_surface.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/spring_event_topology.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/spring_findings.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/spring_impact.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/spring_model.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/spring_profiles.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/spring_properties.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/spring_security_audit.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/spring_semantic.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/spring_tx_analyzer.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/summarizer.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/target_admission.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/telemetry/__init__.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/telemetry/config.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/telemetry/consent.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/telemetry/events.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/telemetry/filters.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/telemetry/transport.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/test_gap_ranking.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/test_sources.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/text_input.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/token_estimate.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/tree_utils.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/type_usage_surface.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/validation_inference.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/validation_surface.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/verify_edit.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/verify_repo.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/verify_rules.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/version_check.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/src/sourcecode/workspace.py +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/supabase/functions/README.md +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/supabase/functions/get-license/index.ts +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/supabase/functions/lemonsqueezy-webhook/index.ts +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/supabase/functions/telemetry/index.ts +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/supabase/sql/license_event_ordering.sql +0 -0
- {sourcecode-4.17.0 → sourcecode-5.0.0}/supabase/sql/licensing_schema.sql +0 -0
- {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.
|
|
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:
|
|
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
|
-

|
|
46
46
|

|
|
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
|
|
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
|
|
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
|
|
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
|
-

|
|
8
8
|

|
|
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
|
|
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
|
|
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
|
|
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
|
|
|
@@ -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,
|