sourcecode 4.14.0__tar.gz → 4.16.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.14.0 → sourcecode-4.16.0}/CHANGELOG.md +224 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/PKG-INFO +51 -11
- {sourcecode-4.14.0 → sourcecode-4.16.0}/README.md +50 -10
- {sourcecode-4.14.0 → sourcecode-4.16.0}/pyproject.toml +1 -1
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/__init__.py +1 -1
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/cli.py +73 -37
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/phased_run.py +88 -2
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/progress.py +27 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/release_info.py +1 -1
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/repository_ir.py +12 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/risk.py +136 -3
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/rule_pass.py +59 -6
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/security_config_scan.py +20 -8
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/spring_security_audit.py +16 -6
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/spring_tx_analyzer.py +12 -6
- {sourcecode-4.14.0 → sourcecode-4.16.0}/.github/workflows/build-windows.yml +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/.github/workflows/perf-gate.yml +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/.gitignore +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/.ruff.toml +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/CLAUDE.md +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/CONTRIBUTING.md +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/LICENSE +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/SECURITY.md +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/raw +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/scripts/compare_integration_engines.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/scripts/customer_smoke_test.sh +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/scripts/generate_jdk_exports.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/scripts/perf_gate.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/scripts/perf_harness.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/adaptive_scanner.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/archetype.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/architectural_baseline.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/architectural_delta.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/architecture_analyzer.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/architecture_summary.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/ast_extractor.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/audit_report.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/baseline_autocapture.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/cache.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/cache_model.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/call_surface.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/caller_metrics.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/caller_reach.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/canonical_ir.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/chain_rules.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/change_plan.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/cir_graphs.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/classifier.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/client_calls.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/code_notes_analyzer.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/compare.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/confidence_analyzer.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/constraint_diff.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/container_wiring.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/context_cache.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/context_graph.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/context_scorer.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/context_summarizer.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/contract_diff.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/contract_init.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/contract_model.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/contract_pipeline.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/coverage_parser.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/data_exposure.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/data_labels.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/defect_identity.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/degradation.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/dependency_analyzer.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/deployment_prefix.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/detach.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/detectors/__init__.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/detectors/base.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/detectors/csproj_parser.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/detectors/dart.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/detectors/dotnet.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/detectors/elixir.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/detectors/go.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/detectors/heuristic.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/detectors/hybrid.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/detectors/java.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/detectors/jvm_ext.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/detectors/nodejs.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/detectors/parsers.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/detectors/php.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/detectors/project.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/detectors/python.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/detectors/ruby.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/detectors/rust.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/detectors/systems.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/detectors/terraform.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/detectors/tooling.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/doc_analyzer.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/dynamic_argument_surface.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/endpoint_literals.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/endpoint_metrics.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/entrypoint_classifier.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/env_analyzer.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/envelope.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/environment_resolution.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/error_schema.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/evidence_provider.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/execution_plan.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/explain.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/facts/__init__.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/facts/registry.json +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/file_chunker.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/file_classifier.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/filter_surface.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/format_contract.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/fqn_utils.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/git_analyzer.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/git_checkout.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/graph_analyzer.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/graph_evidence.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/hibernate_strat.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/identity_fallback.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/integration_coordinates.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/jdk_exports.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/license.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/mcp/__init__.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/mcp/dependency_import.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/mcp/onboarding/__init__.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/mcp/onboarding/applier.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/mcp/onboarding/backup.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/mcp/onboarding/detector.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/mcp/onboarding/planner.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/mcp/orchestrator.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/mcp/registry.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/mcp/runner.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/mcp/server.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/mcp_nudge.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/metrics_analyzer.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/migrate_check.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/migration_blast.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/non_coverage.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/openapi_surface.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/openrewrite_recipe.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/output_budget.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/output_encoding.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/parallel.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/parse_cache.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/path_admission.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/path_filters.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/perf.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/pipe_contract.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/posture.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/pr_comment_renderer.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/pr_impact.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/prepare_context.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/provenance.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/ranking_engine.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/readiness_timeline.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/readonly.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/reconciliation.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/redactor.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/reference_facts.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/relevance_scorer.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/remedies.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/rename_refactor.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/repo_classifier.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/retrieval/__init__.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/retrieval/context.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/retrieval/errors.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/retrieval/executor.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/retrieval/planner.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/retrieval/query.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/retrieval/request.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/retrieval/resolution.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/retrieval/result.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/retrieval/retriever.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/retrieval/runtime.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/retrieval/steps.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/retrieval/steps_endpoint.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/retrieval/steps_graph.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/retrieval/steps_impact.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/retrieval/steps_intf.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/retrieval/steps_struct.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/retrieval/steps_txsec.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/ris.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/rule_catalog.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/runs.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/runtime_classifier.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/sarif.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/scanner.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/schema.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/schemas/envelope-v1.schema.json +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/security_config.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/security_posture.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/semantic_analyzer.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/semantic_impact_engine.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/semantic_integration_engine.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/semantic_services.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/serializer.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/servlet_surface.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/source_text.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/spring_event_topology.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/spring_findings.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/spring_impact.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/spring_model.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/spring_profiles.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/spring_properties.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/spring_semantic.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/summarizer.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/target_admission.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/telemetry/__init__.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/telemetry/config.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/telemetry/consent.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/telemetry/events.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/telemetry/filters.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/telemetry/transport.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/test_gap_ranking.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/test_sources.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/text_input.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/token_estimate.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/tree_utils.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/type_usage_surface.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/validation_inference.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/validation_surface.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/verify_edit.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/verify_repo.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/verify_rules.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/version_check.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/src/sourcecode/workspace.py +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/supabase/functions/README.md +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/supabase/functions/get-license/index.ts +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/supabase/functions/lemonsqueezy-webhook/index.ts +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/supabase/functions/telemetry/index.ts +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/supabase/sql/license_event_ordering.sql +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/supabase/sql/licensing_schema.sql +0 -0
- {sourcecode-4.14.0 → sourcecode-4.16.0}/supabase/sql/telemetry_events.sql +0 -0
|
@@ -2,6 +2,230 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## [4.16.0] — 2026-08-10
|
|
6
|
+
|
|
7
|
+
**The Part 1 queue of field evaluation #19 — three rows, one commit each — and
|
|
8
|
+
the round where reading the field's *numbers* against our source found more than
|
|
9
|
+
reading its *conclusions* did.** The sixth measurement of the same repository at
|
|
10
|
+
the same commit scored **8,2/10**, the highest of the series: *"4.15.0 es la
|
|
11
|
+
mejor versión medida."* It verified both of the previous release's rows from the
|
|
12
|
+
outside (C3-81's `stage_stopped_in`, C3-83's budget provenance), determinism held
|
|
13
|
+
a **sixth** consecutive build across five version jumps, and five commands got
|
|
14
|
+
much faster (`validation` −57 %, `posture --diff` −54 %).
|
|
15
|
+
|
|
16
|
+
Two of the three complaints it left open turned out not to be what was filed.
|
|
17
|
+
|
|
18
|
+
**Fixed in this release:**
|
|
19
|
+
|
|
20
|
+
- **`risk` declares a budget and never asks whether it is spent (C3-87).** The
|
|
21
|
+
field filed `risk` at 2 842 s under a 420 s budget as a +41 % performance
|
|
22
|
+
regression. It is a consumer left unbound. C3-71 and C3-79 made the deadline
|
|
23
|
+
reach inside the rule pass and bound exactly one: `spring-audit` passes
|
|
24
|
+
`stop_when=_run.exhausted` at both of its call sites, while `risk` built the
|
|
25
|
+
same `PhasedRun`, with the same `budget_seconds` and the same `budget_source`,
|
|
26
|
+
and then constructed its observers with **no `stop_when` at all** — so
|
|
27
|
+
`should_stop()` answered `False` for the life of the run and the budget could
|
|
28
|
+
only be observed on the boundary between two phases. Their own two numbers
|
|
29
|
+
prove it on one machine under one budget: `spring-audit` **1,94×** over, `risk`
|
|
30
|
+
**6,8×** over. Reproduced here on keycloak (5 486 files) with a 5 s budget —
|
|
31
|
+
`spring-audit` stops at 9,9 s with `_partial` published; `risk` was still
|
|
32
|
+
running at **10 minutes, 120×**, and had to be killed. Both rule passes and the
|
|
33
|
+
composition join now ask, each on the unit it iterates. A cut run publishes the
|
|
34
|
+
floor marks **where the numbers are** (`partial`, `counts_are_floor`,
|
|
35
|
+
`counts_basis` — C2-31's rule applied to the second consumer), names the join's
|
|
36
|
+
own cut (`composition_stopped_after`), and says PARTIAL on the terminal. A
|
|
37
|
+
complete run gains no field. The three rule-pass keys of `_partial` move into
|
|
38
|
+
`PhasedRun.status`: for four releases there was one caller, so "the caller" and
|
|
39
|
+
"the authority" were the same object by accident, and a second consumer would
|
|
40
|
+
otherwise have duplicated thirty lines of composition or invented a second
|
|
41
|
+
vocabulary for one fact. **The battery asserts an absence**, because the defect
|
|
42
|
+
was one — a missing argument at a call site is invisible in the payload of the
|
|
43
|
+
command that omits it, so it reads `cli.py` and fails on any
|
|
44
|
+
`_rule_pass_progress(...)` built without `stop_when`. A third consumer cannot
|
|
45
|
+
be added unbound.
|
|
46
|
+
|
|
47
|
+
- **A stage of an audit either counts its population or names itself (C3-85).**
|
|
48
|
+
Six rounds of field reports read the 14,5-minute silence as a dead emitter,
|
|
49
|
+
proposing that the timer be re-armed. Measured through the real seam, the
|
|
50
|
+
emitter is alive and correct: a per-unit tick loop produced **5 evenly spaced
|
|
51
|
+
lines over 5,4 s at a 1 s interval**. What is silent is the work no counter
|
|
52
|
+
covers — instrumented on keycloak, **8,2 s of a 24 s warm run, 34 %**, between
|
|
53
|
+
the last `linking` tick and the first rule tick, with `linking 5486/5486`
|
|
54
|
+
frozen on screen throughout; 2,7 s more inside `GATE-001`; 24,7 s on a cold run
|
|
55
|
+
after `parsing 50/5486`. Named, not counted: the IR build's tail (`assembling
|
|
56
|
+
the IR`, `recovering spec-declared routes`, `scanning XML security
|
|
57
|
+
configuration`), the semantic-model build, the whole-tree walk *inside* the
|
|
58
|
+
configuration family (through `FamilyBudget.stage`, so the line says which
|
|
59
|
+
family it belongs to), the rule pass's dedup-and-order tail, and each of the
|
|
60
|
+
five repository-wide walks `risk` makes before it composes. A single walk has
|
|
61
|
+
no population, and inventing a denominator for it is the fabrication C3-56
|
|
62
|
+
refused. The assertion is the invariant rather than the symptom: a build may
|
|
63
|
+
not end on a completed counter, because everything after it runs under a line
|
|
64
|
+
that reads as still running.
|
|
65
|
+
|
|
66
|
+
- **A count that has stopped moving says so, and stops estimating (C3-86).** The
|
|
67
|
+
field's line — `3340/3342 java files eta=0.5s` — was written **fourteen
|
|
68
|
+
minutes** after the counter last advanced, and both of its halves are claims
|
|
69
|
+
the run cannot support: it asserts the stage is 99,9 % done *now*, and the ETA
|
|
70
|
+
divides the remaining units by a rate measured over a window in which nothing
|
|
71
|
+
happened, so the longer the stall lasted the more imminent the finish looked. A
|
|
72
|
+
line whose counted state has not advanced for a whole interval now publishes
|
|
73
|
+
`unchanged_for=<duration>` and withholds the estimate — the rule
|
|
74
|
+
`_eta_seconds` already applies to a stage too young to extrapolate from. The
|
|
75
|
+
count itself is still printed: it is true, and it is what a reader wants; what
|
|
76
|
+
is withheld is the assertion that it is current. The staleness clock is
|
|
77
|
+
deliberately not the stage clock — a long, healthy, advancing stage must not be
|
|
78
|
+
marked frozen, and both directions are asserted. An uncounted stage is never
|
|
79
|
+
called stale: it never claimed a denominator.
|
|
80
|
+
|
|
81
|
+
**Measured and not reproduced:** the report's third proposed fix — *"corregir la
|
|
82
|
+
documentación del flag `--jobs`"* — is already shipped. `JOBS_OPTION_HELP` in
|
|
83
|
+
this build reads *"It does NOT parallelise the rule pass, which is where a
|
|
84
|
+
repository-wide audit spends most of its time, and on a warm cache there is
|
|
85
|
+
nothing left to parse, so raising it buys nothing there."* The report quotes a
|
|
86
|
+
truncated earlier string. Recorded on CL-18 so it is not re-opened, which is the
|
|
87
|
+
CL-17 precedent.
|
|
88
|
+
|
|
89
|
+
**Deliberately not in this release**, and each for a stated reason: **F-AT**
|
|
90
|
+
(parallel rule evaluation — the field's single priority, *"lo único que separa
|
|
91
|
+
este producto de un 9"*: a capability, and it does not start before this queue
|
|
92
|
+
finishes), **F-AV** (a distinct exit code for a partial answer, or renaming
|
|
93
|
+
`total_defects` to `total_defects_floor` when `partial` is true — a published
|
|
94
|
+
contract change, never a side effect of a correction), **F-AU** (reusing the
|
|
95
|
+
cached audit in the compositions), and **C3-76/F-AW** (the cross-version `risk`
|
|
96
|
+
variance: macOS measures both sides flat for the second consecutive A/B, and a
|
|
97
|
+
regression that reproduces on one platform cannot be bisected from the platform
|
|
98
|
+
where it does not).
|
|
99
|
+
|
|
100
|
+
**What C3-87 does not close, stated plainly: the wall time.** After the fix,
|
|
101
|
+
`risk` on BroadleafCommerce (2 985 files) still runs past ten minutes under a 3 s
|
|
102
|
+
budget, because the cost is not in the passes that now ask. That is **C3-88**,
|
|
103
|
+
and it is open with a measurement rather than a hypothesis — the stage-by-stage
|
|
104
|
+
profile was started and cancelled before it attributed the time, so the row says
|
|
105
|
+
so instead of guessing.
|
|
106
|
+
|
|
107
|
+
Suite **7 833** (7 813 before), 20 new assertions, zero failures.
|
|
108
|
+
|
|
109
|
+
## [4.15.0] — 2026-08-10
|
|
110
|
+
|
|
111
|
+
**The Part 1 queue of Amendment O — the four rows field evaluation #18 opened,
|
|
112
|
+
one commit each, plus one row closed by measurement.** The fifth measurement of
|
|
113
|
+
the same repository at the same commit scored **8,0/10**, the highest of the
|
|
114
|
+
series, and it is the first round where **performance moves**: `spring-audit`
|
|
115
|
+
2 377,9 → **816,0 s** (40 minutes to 13,6), the whole fast path under 16 s, and
|
|
116
|
+
the budget overshoot 5,66× → **1,94×**. It verified five of the previous
|
|
117
|
+
release's fixes from the outside. Every row it opened is a **residue of a fix
|
|
118
|
+
that landed**, which is what a fifth round on one subject produces.
|
|
119
|
+
|
|
120
|
+
**Fixed in this release:**
|
|
121
|
+
|
|
122
|
+
- **The heartbeat reports every unit; the clock still reads once per batch
|
|
123
|
+
(C3-82).** The field watched `1856/3342 java files` at 10,0 s, then **13,6
|
|
124
|
+
minutes with no line at all**, then `3328/3342`. C3-80 made the work emit
|
|
125
|
+
in-band and C3-73 gave the line its vocabulary, so the content was right —
|
|
126
|
+
what was wrong is that the only path to the emitter is
|
|
127
|
+
`RulePassProgress.tick()`, which returned early on a `done % sample_every`
|
|
128
|
+
remainder. A report falling between two boundaries 64 units apart is never
|
|
129
|
+
produced, so a stretch of expensive units is invisible for as long as it
|
|
130
|
+
lasts. One number was doing two jobs: the sampling constant belongs to the
|
|
131
|
+
**deadline** (a wall-clock budget buys no resolution from being asked 3 342
|
|
132
|
+
times instead of 52 — that is what took the overshoot to 1,94×) and not to the
|
|
133
|
+
**counter**, because `Progress` already throttles emission on an interval.
|
|
134
|
+
Asserted both ways: a thousand cheap units print at most one line, five units
|
|
135
|
+
that each outlast the interval print five.
|
|
136
|
+
- **A cut rule family names the stage it stopped in, and no stage claims a
|
|
137
|
+
population it did not finish (C3-81).** `rules_partially_run` published
|
|
138
|
+
`units_done: 3342, units_total: 3342` — a complete population, in a list
|
|
139
|
+
meaning *"this family did not finish"* — while `DEAD-001` returned 248
|
|
140
|
+
findings against 254 on the complete run. The `SEC-004` group walks four
|
|
141
|
+
populations in sequence (Java sources, configuration files, deployment
|
|
142
|
+
descriptors, MyBatis mappers) and the entry recorded whichever one held the
|
|
143
|
+
deadline; and the counter reported the unit it was *about to* process, so a
|
|
144
|
+
walk stopped at its own last file published a finished population. Every walk
|
|
145
|
+
now ticks with what it has **finished** and names itself, the entry carries
|
|
146
|
+
`stage_stopped_in` and a `units_basis` stating that the two numbers count the
|
|
147
|
+
stage rather than the family, and the `PARTIAL:` sentence carries the same
|
|
148
|
+
fact as the payload.
|
|
149
|
+
- **An inherited analysis budget says so, on the terminal and in the payload
|
|
150
|
+
(C3-83).** The same build answers 395 findings / 98 defects with no budget and
|
|
151
|
+
267 / 11 with `ASK_MAX_ANALYSIS_SECONDS=420`. The truncation is declared
|
|
152
|
+
impeccably — `_partial`, `summary.partial`, `counts_are_floor`, a confidence
|
|
153
|
+
capped at `low` — and the variable is inherited from a shell or a CI runner,
|
|
154
|
+
so whoever reads `total_defects: 11` is routinely not whoever set the limit.
|
|
155
|
+
The budget now carries its origin verbatim from where it is read to where it
|
|
156
|
+
is published: the measured under-floor warning gains a line naming the
|
|
157
|
+
variable and its value, a budget **over** the floor prints a single provenance
|
|
158
|
+
line saying what a cut run publishes and how to get a complete audit, and
|
|
159
|
+
`_partial` carries `budget_source` beside `budget_seconds`. A value that does
|
|
160
|
+
not parse is not a budget and invents no source. The distinct exit code for a
|
|
161
|
+
partial answer and any renaming of a truncated total remain a published-contract
|
|
162
|
+
change (F-AV), deliberately not done here.
|
|
163
|
+
|
|
164
|
+
**Claims corrected:**
|
|
165
|
+
|
|
166
|
+
- **`--jobs` states which phase it does not cover (C3-84 / CL-18).** The
|
|
167
|
+
evaluation sampled the process and corrected four rounds of its own reporting:
|
|
168
|
+
parallelism exists and covers the phase that is not the cost — `threads=4` for
|
|
169
|
+
the first seconds (parsing), then `threads=1` with CPU/wall **0,97** for the
|
|
170
|
+
remaining ~99 % (the rule pass over a built IR), and on a warm cache there is
|
|
171
|
+
nothing left to parse at all. The help was true about what the flag does and
|
|
172
|
+
silent about what it does not, which is the half that decides whether setting
|
|
173
|
+
it is worth anything. `JOBS_OPTION_HELP` — the one string every command
|
|
174
|
+
declares the flag with — now says both; the README and the user guide are
|
|
175
|
+
qualifications of that claim rather than three versions of it; F-AQ's promise
|
|
176
|
+
(byte-identical at any value) is untouched. Making the rule pass itself
|
|
177
|
+
parallel is F-AT.
|
|
178
|
+
|
|
179
|
+
**Measured, not assumed:**
|
|
180
|
+
|
|
181
|
+
- **The three commands the field reports as regressed are flat here, for the
|
|
182
|
+
second consecutive A/B (C3-76c).** A/B/C of 4.10.7, 4.12.0 and HEAD on
|
|
183
|
+
BroadleafCommerce, each side with its own `HOME` and both cache roots, each
|
|
184
|
+
command warmed and then timed in isolation: `validation` 5,72 / 5,68 / 5,68 s,
|
|
185
|
+
`endpoints` 1,49 / 1,48 / 1,48 s, `posture --diff` 2,87 / 2,86 / 2,85 s. The
|
|
186
|
+
field measures the same three at 14,0 → 35,8 → 41,8 s, 3,5 → 4,2 → 4,7 s and
|
|
187
|
+
10,5 → 27,6 → 32,8 s. A regression that reproduces on one platform and not the
|
|
188
|
+
other cannot be bisected from the platform where both sides are equal; the
|
|
189
|
+
row's only open item is the Windows runner (F-AW).
|
|
190
|
+
|
|
191
|
+
**Documentation:**
|
|
192
|
+
|
|
193
|
+
The front-page catch-up written after 4.14.0 ships here too — no code, no
|
|
194
|
+
`--help`, no output changed by it:
|
|
195
|
+
|
|
196
|
+
- **README stated a budget rule the product stopped following in 4.10.6.**
|
|
197
|
+
`ASK_MAX_ANALYSIS_SECONDS` was described as failing a repo-wide/deep command
|
|
198
|
+
before it starts when the value is below the class floor; C3-55 made the floor
|
|
199
|
+
advice and the budget honoured, and C3-79 moved the cut inside the rule family.
|
|
200
|
+
The paragraph now says what the code does: below the floor it warns and runs,
|
|
201
|
+
a cut publishes `rules_partially_run` / `rules_not_run` / `_partial`, and the
|
|
202
|
+
answer marks itself with `summary.partial`, `counts_are_floor`, `counts_basis`
|
|
203
|
+
and a `confidence_level` capped at `low` (C2-31).
|
|
204
|
+
- **`--no-write` / `ASK_READONLY=1` (F-AS, 4.13.0) reached the README**, beside
|
|
205
|
+
the third-party-audit note that is its audience. The list of what writes into a
|
|
206
|
+
repository is left to `ask --help`, which generates it from
|
|
207
|
+
`cli.COMMANDS_THAT_WRITE`, rather than copied into a second catalogue.
|
|
208
|
+
- **`--jobs` / `-j` / `ASK_JOBS` (F-AQ) and the in-band heartbeat (C3-80)** added
|
|
209
|
+
to the large-repo controls; `verify --allow-unverified` with its named
|
|
210
|
+
`unverified_reason` (C3-75) added to the gate-adoption note; the `spring-audit`
|
|
211
|
+
row now names the rule inventory fields (C1-42).
|
|
212
|
+
- **`docs/USER_GUIDE.md`**: the budget section still described a run stopping
|
|
213
|
+
*between phases* (4.12.0); it now describes the in-family cut. The flags table
|
|
214
|
+
gained the rows for `--jobs`, `--no-write` and `--progress`.
|
|
215
|
+
|
|
216
|
+
- `docs/DEFECT-LEDGER.md` — rows C3-81, C3-82, C3-83, C3-84, claim CL-18 and
|
|
217
|
+
measurement C3-76c, with the five rows 4.14.0 closed marked verified in the
|
|
218
|
+
field; `docs/DEVELOPMENT-ROADMAP.md` — the eval #18 phase update;
|
|
219
|
+
`.planning/ROADMAP-STRATEGIC-2026-07-28.md` — **Amendment O**, which
|
|
220
|
+
respecifies F-AT from the field's own analysis: the unit of parallelism is the
|
|
221
|
+
**file inside the per-file families**, the reduction is the
|
|
222
|
+
`(category, defect_kind, symbol)` identity `defect_identity` already
|
|
223
|
+
publishes, and graph-scope families stay in a serial tail.
|
|
224
|
+
|
|
225
|
+
**No behaviour changed for a complete run.** Answers stay byte-identical; what
|
|
226
|
+
moved is the heartbeat's cadence, the metadata of a truncated run, and what the
|
|
227
|
+
surface claims about `--jobs`.
|
|
228
|
+
|
|
5
229
|
## [4.14.0] — 2026-08-09
|
|
6
230
|
|
|
7
231
|
**The Part 1 queue of Amendment N — the four rows field evaluation #17 opened,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sourcecode
|
|
3
|
-
Version: 4.
|
|
3
|
+
Version: 4.16.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`**
|
|
@@ -76,13 +76,31 @@ With the right command class, ASK Engine becomes **constant infrastructure** ins
|
|
|
76
76
|
**Large-repo controls.** Pass `--progress stderr` (or `--progress file:run.log`)
|
|
77
77
|
for line heartbeats in a non-TTY supervised run — with the file being read so
|
|
78
78
|
far and an ETA for the stage being measured. `ASK_PROGRESS` sets the same thing
|
|
79
|
-
in the environment
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
79
|
+
in the environment, and the heartbeat is emitted by the analysis itself, not only
|
|
80
|
+
by a timer thread, so a CPU-bound stretch is never silent. `--jobs N` / `-j`
|
|
81
|
+
(env `ASK_JOBS`) sets the worker processes that parse files — default CPU count
|
|
82
|
+
− 1; parallelism only warms the content-addressed parse cache, so the answer is
|
|
83
|
+
byte-identical at any value. It does **not** parallelise the rule pass, which is
|
|
84
|
+
where a repository-wide audit spends most of its time, and a warm cache leaves it
|
|
85
|
+
nothing to parse — so raising it there buys nothing. Long repo-wide/deep runs also write durable records
|
|
86
|
+
under `~/.sourcecode/runs/<repo-hash>/` by default, not inside the audited
|
|
87
|
+
repository; set `ASK_RUNS_IN_REPO=1` only when repo-local `.ask/runs` records are
|
|
88
|
+
intentional. Use `ask audit-report --from-risk risk.json` to package an existing
|
|
89
|
+
risk run instead of recomputing it.
|
|
90
|
+
|
|
91
|
+
**A budget is honoured, never a veto.** `ASK_MAX_ANALYSIS_SECONDS=<seconds>`
|
|
92
|
+
bounds a repo-wide/deep command. A value below the class floor prints what that
|
|
93
|
+
class typically needs and **runs anyway** — refusing to answer is the opposite of
|
|
94
|
+
this product's doctrine. A run that spends its budget stops on the loop that is
|
|
95
|
+
spending the time, not only between phases: a rule family cut in flight is
|
|
96
|
+
published as `rules_partially_run` with how far it reached, families that never
|
|
97
|
+
started are named in `rules_not_run`, `_partial` names the phases that completed
|
|
98
|
+
and the ones that did not, and the findings measured before the cut are kept.
|
|
99
|
+
The answer marks itself where the numbers are — `summary.partial`,
|
|
100
|
+
`counts_are_floor`, `counts_basis` — and `confidence_level` is capped at `low`,
|
|
101
|
+
because the confidence of the findings that exist says nothing about the family
|
|
102
|
+
that did not run. Measured on BroadleafCommerce (2 766 Java files): a 4.5s budget
|
|
103
|
+
stops at 1 408 files and ends at 5.1s.
|
|
86
104
|
|
|
87
105
|
**What a warm actually covers.** `ask cache warm` runs the compact analysis: it rebuilds the
|
|
88
106
|
shared structural layers (L1/L2 + the Repository Intelligence Snapshot + the shared Canonical
|
|
@@ -108,7 +126,7 @@ brew tap haroundominique/sourcecode && brew install sourcecode
|
|
|
108
126
|
# pip / pipx
|
|
109
127
|
pipx install sourcecode # or: pip install sourcecode
|
|
110
128
|
|
|
111
|
-
ask version # ask 4.
|
|
129
|
+
ask version # ask 4.16.0 — and, on a build that has aged,
|
|
112
130
|
# how many releases have probably shipped since
|
|
113
131
|
```
|
|
114
132
|
|
|
@@ -204,6 +222,9 @@ ask verify /path/to/repo # then: only new violations block
|
|
|
204
222
|
> A repository that starts declaring contracts already violates them somewhere; `ask verify`
|
|
205
223
|
> is **baseline-relative by default** (`--fail-on new`) so the gate survives contact with
|
|
206
224
|
> reality instead of being switched off on day one.
|
|
225
|
+
> A pipeline wired before the contracts exist exits 2 (`unverified`, with
|
|
226
|
+
> `unverified_reason` naming which state it is); `--allow-unverified` exits 0 while the
|
|
227
|
+
> verdict stays `unverified` — the declared form of `|| true`, and violations still block.
|
|
207
228
|
> `ask baseline capture|diff|trend` is a different thing: versioned architectural metrics over
|
|
208
229
|
> time, for trend reporting rather than blocking.
|
|
209
230
|
|
|
@@ -324,7 +345,7 @@ from it.
|
|
|
324
345
|
| `migrate-recipe` | experimental | the migration report as the OpenRewrite recipe that applies it | only recipes a finding named; the manual remainder published beside them; writes nothing without `--write`, and never a runnable command for an empty recipe list |
|
|
325
346
|
| `data-exposure` | experimental | which routes can carry the data you labelled, and who reaches them | labels declared in `sourcecode.config.json` — never inferred from a name; `signature` and `call_reach` evidence published apart, field-level flow out of scope (NC-008). With nothing declared, `ask data-exposure /path/to/repo` answers `answered: false` and hands back the file, the key and an example to declare — it never reports zero exposed routes |
|
|
326
347
|
| `endpoints` | core | every REST endpoint, effective path, security policy, confidence | Spring MVC + JAX-RS (~65 % recall on JAX-RS sub-resource locators). `--compact` answers the exposure census without the rows; `--servlets` lists the servlet-mounted surface as its own population; `--client-usage` says which routes the TS/JS client in this repository actually calls |
|
|
327
|
-
| `spring-audit` | core | transactional anomalies + security configuration/exposure + validation gaps | `--ci`, `-f github-comment`; `--table --rule SEC-008 --top-n 20` for human-scale review |
|
|
348
|
+
| `spring-audit` | core | transactional anomalies + security configuration/exposure + validation gaps | `--ci`, `-f github-comment`; `--table --rule SEC-008 --top-n 20` for human-scale review. Every run inventories its own rules — `rules_run`, `rules_not_run`, `rules_partially_run`, `rules_run_count`/`rules_total` — so "all of them" is a fact, not an assumption |
|
|
328
349
|
| `migrate-check` | core | Boot 2→3 readiness + Java LTS/licensing inventory: located blockers, per-dimension score, effort, detected Java 8/11/17/21/25 evidence and explicit licensing-review signals | `--target-jdk 25` sets the target LTS route; `--blast-radius` orders the re-test plan; `--table --rule MIG-001 --band critical --top-n 20` for blocker triage |
|
|
329
350
|
| `impact` / `impact-chain` | core | blast radius of a change, to the endpoints it reaches | target the **interface**, not the `Impl` |
|
|
330
351
|
| `pr-impact` | core | the same, scoped to a PR diff | gating command: `--fail-on`, exit codes |
|
|
@@ -499,6 +520,25 @@ range, and errors: **no source code, paths, secrets, or output**. Turn it off ag
|
|
|
499
520
|
> default you must remember to disable is the wrong default for third-party code. An explicit
|
|
500
521
|
> choice you made before is unchanged.
|
|
501
522
|
|
|
523
|
+
**A question is not a write — `--no-write` / `ASK_READONLY=1`.** One contract over
|
|
524
|
+
every command: nothing is created inside the analysed repository, and a command
|
|
525
|
+
that cannot answer without writing says so instead of writing. A refusal is never
|
|
526
|
+
silent — each one names the path that was not created, on stderr. The scope is the
|
|
527
|
+
tree you pointed at; the shared caches under `~/.sourcecode` and an `--output` path
|
|
528
|
+
elsewhere on the machine are not refused, because refusing them would make the mode
|
|
529
|
+
unusable without making it safer.
|
|
530
|
+
|
|
531
|
+
Most commands read only, and the few that create anything inside the repository do
|
|
532
|
+
it under `.ask/` and only behind an explicit flag (`baseline`, `migrate-check
|
|
533
|
+
--history`, `verify --update-baseline`, `verify-edit --install-hook`, and `.ask/runs`
|
|
534
|
+
when `ASK_RUNS_IN_REPO=1`). `ask --help` prints that list in full, generated from the
|
|
535
|
+
one authority the battery checks — a write seam added without a row there fails the
|
|
536
|
+
suite.
|
|
537
|
+
|
|
538
|
+
```bash
|
|
539
|
+
ask spring-audit /path/to/client-repo --no-write -o audit.json
|
|
540
|
+
```
|
|
541
|
+
|
|
502
542
|
**Custom security annotations.** Teach `endpoints`, `spring-audit`, and `explain` about
|
|
503
543
|
project-specific authorization annotations via an optional `sourcecode.config.json` at the
|
|
504
544
|
repo root (otherwise they report `policy: "none_detected"`):
|
|
@@ -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`**
|
|
@@ -38,13 +38,31 @@ With the right command class, ASK Engine becomes **constant infrastructure** ins
|
|
|
38
38
|
**Large-repo controls.** Pass `--progress stderr` (or `--progress file:run.log`)
|
|
39
39
|
for line heartbeats in a non-TTY supervised run — with the file being read so
|
|
40
40
|
far and an ETA for the stage being measured. `ASK_PROGRESS` sets the same thing
|
|
41
|
-
in the environment
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
41
|
+
in the environment, and the heartbeat is emitted by the analysis itself, not only
|
|
42
|
+
by a timer thread, so a CPU-bound stretch is never silent. `--jobs N` / `-j`
|
|
43
|
+
(env `ASK_JOBS`) sets the worker processes that parse files — default CPU count
|
|
44
|
+
− 1; parallelism only warms the content-addressed parse cache, so the answer is
|
|
45
|
+
byte-identical at any value. It does **not** parallelise the rule pass, which is
|
|
46
|
+
where a repository-wide audit spends most of its time, and a warm cache leaves it
|
|
47
|
+
nothing to parse — so raising it there buys nothing. Long repo-wide/deep runs also write durable records
|
|
48
|
+
under `~/.sourcecode/runs/<repo-hash>/` by default, not inside the audited
|
|
49
|
+
repository; set `ASK_RUNS_IN_REPO=1` only when repo-local `.ask/runs` records are
|
|
50
|
+
intentional. Use `ask audit-report --from-risk risk.json` to package an existing
|
|
51
|
+
risk run instead of recomputing it.
|
|
52
|
+
|
|
53
|
+
**A budget is honoured, never a veto.** `ASK_MAX_ANALYSIS_SECONDS=<seconds>`
|
|
54
|
+
bounds a repo-wide/deep command. A value below the class floor prints what that
|
|
55
|
+
class typically needs and **runs anyway** — refusing to answer is the opposite of
|
|
56
|
+
this product's doctrine. A run that spends its budget stops on the loop that is
|
|
57
|
+
spending the time, not only between phases: a rule family cut in flight is
|
|
58
|
+
published as `rules_partially_run` with how far it reached, families that never
|
|
59
|
+
started are named in `rules_not_run`, `_partial` names the phases that completed
|
|
60
|
+
and the ones that did not, and the findings measured before the cut are kept.
|
|
61
|
+
The answer marks itself where the numbers are — `summary.partial`,
|
|
62
|
+
`counts_are_floor`, `counts_basis` — and `confidence_level` is capped at `low`,
|
|
63
|
+
because the confidence of the findings that exist says nothing about the family
|
|
64
|
+
that did not run. Measured on BroadleafCommerce (2 766 Java files): a 4.5s budget
|
|
65
|
+
stops at 1 408 files and ends at 5.1s.
|
|
48
66
|
|
|
49
67
|
**What a warm actually covers.** `ask cache warm` runs the compact analysis: it rebuilds the
|
|
50
68
|
shared structural layers (L1/L2 + the Repository Intelligence Snapshot + the shared Canonical
|
|
@@ -70,7 +88,7 @@ brew tap haroundominique/sourcecode && brew install sourcecode
|
|
|
70
88
|
# pip / pipx
|
|
71
89
|
pipx install sourcecode # or: pip install sourcecode
|
|
72
90
|
|
|
73
|
-
ask version # ask 4.
|
|
91
|
+
ask version # ask 4.16.0 — and, on a build that has aged,
|
|
74
92
|
# how many releases have probably shipped since
|
|
75
93
|
```
|
|
76
94
|
|
|
@@ -166,6 +184,9 @@ ask verify /path/to/repo # then: only new violations block
|
|
|
166
184
|
> A repository that starts declaring contracts already violates them somewhere; `ask verify`
|
|
167
185
|
> is **baseline-relative by default** (`--fail-on new`) so the gate survives contact with
|
|
168
186
|
> reality instead of being switched off on day one.
|
|
187
|
+
> A pipeline wired before the contracts exist exits 2 (`unverified`, with
|
|
188
|
+
> `unverified_reason` naming which state it is); `--allow-unverified` exits 0 while the
|
|
189
|
+
> verdict stays `unverified` — the declared form of `|| true`, and violations still block.
|
|
169
190
|
> `ask baseline capture|diff|trend` is a different thing: versioned architectural metrics over
|
|
170
191
|
> time, for trend reporting rather than blocking.
|
|
171
192
|
|
|
@@ -286,7 +307,7 @@ from it.
|
|
|
286
307
|
| `migrate-recipe` | experimental | the migration report as the OpenRewrite recipe that applies it | only recipes a finding named; the manual remainder published beside them; writes nothing without `--write`, and never a runnable command for an empty recipe list |
|
|
287
308
|
| `data-exposure` | experimental | which routes can carry the data you labelled, and who reaches them | labels declared in `sourcecode.config.json` — never inferred from a name; `signature` and `call_reach` evidence published apart, field-level flow out of scope (NC-008). With nothing declared, `ask data-exposure /path/to/repo` answers `answered: false` and hands back the file, the key and an example to declare — it never reports zero exposed routes |
|
|
288
309
|
| `endpoints` | core | every REST endpoint, effective path, security policy, confidence | Spring MVC + JAX-RS (~65 % recall on JAX-RS sub-resource locators). `--compact` answers the exposure census without the rows; `--servlets` lists the servlet-mounted surface as its own population; `--client-usage` says which routes the TS/JS client in this repository actually calls |
|
|
289
|
-
| `spring-audit` | core | transactional anomalies + security configuration/exposure + validation gaps | `--ci`, `-f github-comment`; `--table --rule SEC-008 --top-n 20` for human-scale review |
|
|
310
|
+
| `spring-audit` | core | transactional anomalies + security configuration/exposure + validation gaps | `--ci`, `-f github-comment`; `--table --rule SEC-008 --top-n 20` for human-scale review. Every run inventories its own rules — `rules_run`, `rules_not_run`, `rules_partially_run`, `rules_run_count`/`rules_total` — so "all of them" is a fact, not an assumption |
|
|
290
311
|
| `migrate-check` | core | Boot 2→3 readiness + Java LTS/licensing inventory: located blockers, per-dimension score, effort, detected Java 8/11/17/21/25 evidence and explicit licensing-review signals | `--target-jdk 25` sets the target LTS route; `--blast-radius` orders the re-test plan; `--table --rule MIG-001 --band critical --top-n 20` for blocker triage |
|
|
291
312
|
| `impact` / `impact-chain` | core | blast radius of a change, to the endpoints it reaches | target the **interface**, not the `Impl` |
|
|
292
313
|
| `pr-impact` | core | the same, scoped to a PR diff | gating command: `--fail-on`, exit codes |
|
|
@@ -461,6 +482,25 @@ range, and errors: **no source code, paths, secrets, or output**. Turn it off ag
|
|
|
461
482
|
> default you must remember to disable is the wrong default for third-party code. An explicit
|
|
462
483
|
> choice you made before is unchanged.
|
|
463
484
|
|
|
485
|
+
**A question is not a write — `--no-write` / `ASK_READONLY=1`.** One contract over
|
|
486
|
+
every command: nothing is created inside the analysed repository, and a command
|
|
487
|
+
that cannot answer without writing says so instead of writing. A refusal is never
|
|
488
|
+
silent — each one names the path that was not created, on stderr. The scope is the
|
|
489
|
+
tree you pointed at; the shared caches under `~/.sourcecode` and an `--output` path
|
|
490
|
+
elsewhere on the machine are not refused, because refusing them would make the mode
|
|
491
|
+
unusable without making it safer.
|
|
492
|
+
|
|
493
|
+
Most commands read only, and the few that create anything inside the repository do
|
|
494
|
+
it under `.ask/` and only behind an explicit flag (`baseline`, `migrate-check
|
|
495
|
+
--history`, `verify --update-baseline`, `verify-edit --install-hook`, and `.ask/runs`
|
|
496
|
+
when `ASK_RUNS_IN_REPO=1`). `ask --help` prints that list in full, generated from the
|
|
497
|
+
one authority the battery checks — a write seam added without a row there fails the
|
|
498
|
+
suite.
|
|
499
|
+
|
|
500
|
+
```bash
|
|
501
|
+
ask spring-audit /path/to/client-repo --no-write -o audit.json
|
|
502
|
+
```
|
|
503
|
+
|
|
464
504
|
**Custom security annotations.** Teach `endpoints`, `spring-audit`, and `explain` about
|
|
465
505
|
project-specific authorization annotations via an optional `sourcecode.config.json` at the
|
|
466
506
|
repo root (otherwise they report `policy: "none_detected"`):
|