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

|
|
46
46
|

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

|
|
8
8
|

|
|
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.
|
|
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
|
|
|
@@ -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(
|
|
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
|
-
|
|
69
|
-
|
|
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
|
|
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
|
"",
|