sourcecode 4.10.6__tar.gz → 4.11.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.10.6 → sourcecode-4.11.0}/CHANGELOG.md +198 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/PKG-INFO +26 -7
- {sourcecode-4.10.6 → sourcecode-4.11.0}/README.md +25 -6
- {sourcecode-4.10.6 → sourcecode-4.11.0}/pyproject.toml +1 -1
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/__init__.py +1 -1
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/cache.py +8 -3
- sourcecode-4.11.0/src/sourcecode/cache.tmp_new +772 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/cache_model.py +170 -46
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/canonical_ir.py +10 -3
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/change_plan.py +8 -3
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/cli.py +863 -220
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/context_cache.py +9 -3
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/context_graph.py +8 -3
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/data_exposure.py +10 -1
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/detach.py +27 -1
- sourcecode-4.11.0/src/sourcecode/execution_plan.py +428 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/format_contract.py +48 -6
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/non_coverage.py +90 -2
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/posture.py +3 -3
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/progress.py +124 -4
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/remedies.py +37 -5
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/repository_ir.py +42 -4
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/rule_catalog.py +5 -1
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/security_posture.py +1 -1
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/serializer.py +13 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/verify_repo.py +2 -2
- {sourcecode-4.10.6 → sourcecode-4.11.0}/.github/workflows/build-windows.yml +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/.gitignore +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/.ruff.toml +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/CLAUDE.md +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/CONTRIBUTING.md +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/LICENSE +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/SECURITY.md +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/raw +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/scripts/compare_integration_engines.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/scripts/customer_smoke_test.sh +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/scripts/generate_jdk_exports.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/scripts/perf_harness.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/adaptive_scanner.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/archetype.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/architectural_baseline.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/architectural_delta.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/architecture_analyzer.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/architecture_summary.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/ast_extractor.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/audit_report.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/baseline_autocapture.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/call_surface.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/caller_metrics.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/caller_reach.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/chain_rules.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/cir_graphs.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/classifier.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/client_calls.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/code_notes_analyzer.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/compare.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/confidence_analyzer.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/constraint_diff.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/container_wiring.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/context_scorer.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/context_summarizer.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/contract_diff.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/contract_init.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/contract_model.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/contract_pipeline.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/coverage_parser.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/data_labels.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/defect_identity.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/degradation.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/dependency_analyzer.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/deployment_prefix.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/detectors/__init__.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/detectors/base.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/detectors/csproj_parser.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/detectors/dart.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/detectors/dotnet.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/detectors/elixir.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/detectors/go.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/detectors/heuristic.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/detectors/hybrid.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/detectors/java.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/detectors/jvm_ext.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/detectors/nodejs.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/detectors/parsers.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/detectors/php.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/detectors/project.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/detectors/python.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/detectors/ruby.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/detectors/rust.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/detectors/systems.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/detectors/terraform.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/detectors/tooling.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/doc_analyzer.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/dynamic_argument_surface.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/endpoint_literals.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/endpoint_metrics.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/entrypoint_classifier.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/env_analyzer.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/envelope.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/environment_resolution.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/error_schema.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/evidence_provider.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/explain.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/facts/__init__.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/facts/registry.json +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/file_chunker.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/file_classifier.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/filter_surface.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/fqn_utils.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/git_analyzer.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/git_checkout.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/graph_analyzer.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/graph_evidence.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/hibernate_strat.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/identity_fallback.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/integration_coordinates.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/jdk_exports.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/license.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/mcp/__init__.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/mcp/onboarding/__init__.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/mcp/onboarding/applier.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/mcp/onboarding/backup.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/mcp/onboarding/detector.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/mcp/onboarding/planner.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/mcp/orchestrator.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/mcp/registry.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/mcp/runner.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/mcp/server.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/mcp_nudge.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/metrics_analyzer.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/migrate_check.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/migration_blast.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/openapi_surface.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/openrewrite_recipe.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/output_budget.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/output_encoding.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/parse_cache.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/path_admission.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/path_filters.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/perf.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/phased_run.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/pipe_contract.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/pr_comment_renderer.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/pr_impact.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/prepare_context.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/provenance.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/ranking_engine.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/readiness_timeline.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/reconciliation.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/redactor.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/reference_facts.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/release_info.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/relevance_scorer.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/rename_refactor.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/repo_classifier.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/retrieval/__init__.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/retrieval/context.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/retrieval/errors.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/retrieval/executor.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/retrieval/planner.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/retrieval/query.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/retrieval/request.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/retrieval/resolution.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/retrieval/result.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/retrieval/retriever.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/retrieval/runtime.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/retrieval/steps.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/retrieval/steps_endpoint.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/retrieval/steps_graph.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/retrieval/steps_impact.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/retrieval/steps_intf.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/retrieval/steps_struct.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/retrieval/steps_txsec.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/ris.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/risk.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/runs.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/runtime_classifier.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/sarif.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/scanner.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/schema.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/schemas/envelope-v1.schema.json +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/security_config.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/security_config_scan.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/semantic_analyzer.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/semantic_impact_engine.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/semantic_integration_engine.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/semantic_services.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/servlet_surface.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/source_text.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/spring_event_topology.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/spring_findings.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/spring_impact.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/spring_model.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/spring_profiles.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/spring_properties.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/spring_security_audit.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/spring_semantic.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/spring_tx_analyzer.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/summarizer.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/target_admission.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/telemetry/__init__.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/telemetry/config.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/telemetry/consent.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/telemetry/events.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/telemetry/filters.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/telemetry/transport.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/test_gap_ranking.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/test_sources.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/text_input.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/token_estimate.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/tree_utils.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/type_usage_surface.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/validation_inference.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/validation_surface.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/verify_edit.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/verify_rules.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/version_check.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/src/sourcecode/workspace.py +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/supabase/functions/README.md +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/supabase/functions/get-license/index.ts +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/supabase/functions/lemonsqueezy-webhook/index.ts +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/supabase/functions/telemetry/index.ts +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/supabase/sql/license_event_ordering.sql +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/supabase/sql/licensing_schema.sql +0 -0
- {sourcecode-4.10.6 → sourcecode-4.11.0}/supabase/sql/telemetry_events.sql +0 -0
|
@@ -2,6 +2,204 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## [4.11.0] — 2026-08-07
|
|
6
|
+
|
|
7
|
+
**The queue behind Tier D: five ledger rows, and three batteries that were red in
|
|
8
|
+
the release before this one.** C3-59 · C3-56 (second half) · C3-52 · C3-60 (second
|
|
9
|
+
half) · CL-15 close here, one commit each. Two of them were bigger than the row
|
|
10
|
+
said, and both in the same direction — a flag that parses and does not check, a
|
|
11
|
+
message that promises output nobody writes:
|
|
12
|
+
|
|
13
|
+
- **`--format` was published by eleven commands that validated nothing**, so
|
|
14
|
+
`ask risk . --format bogus` answered with JSON as if the value had counted
|
|
15
|
+
(C3-59);
|
|
16
|
+
- **`--detach` told the operator "progress and errors go to `log`"** and the log
|
|
17
|
+
held one line, because a detached worker has no terminal and the heartbeat
|
|
18
|
+
switched itself off exactly where it is the only way to tell work from a hang
|
|
19
|
+
(C3-52).
|
|
20
|
+
|
|
21
|
+
⚠ **Behaviour changes to read before upgrading a pipeline:**
|
|
22
|
+
|
|
23
|
+
- **An unsupported `--format` now exits 2** with the values that are valid, on
|
|
24
|
+
the eleven commands that used to accept anything and answer JSON. A script
|
|
25
|
+
passing a value that was never supported fails where it used to appear to work.
|
|
26
|
+
- **`--format/-f` is accepted after 34 more commands**, including the 29
|
|
27
|
+
`retrieve` intents, `modernize`, `schema`, `onboard` and `fix-bug`.
|
|
28
|
+
- **`ask config <path>` refuses a path that does not exist** (exit 1, the standard
|
|
29
|
+
envelope) instead of reporting "nothing is declared" about it.
|
|
30
|
+
- **A detached run writes heartbeat lines into its own log** unless `--progress`
|
|
31
|
+
or `ASK_PROGRESS` says otherwise. Nothing changes for a foreground, piped or CI
|
|
32
|
+
run that does not ask.
|
|
33
|
+
|
|
34
|
+
Three tests were **already red in 4.10.7** — each a battery that derives its
|
|
35
|
+
population from the CLI, so C4-17's and C4-20's own changes tripped them — and
|
|
36
|
+
they are fixed here. One of the three was not a test defect: it found `ask config`
|
|
37
|
+
answering about a repository that does not exist.
|
|
38
|
+
|
|
39
|
+
### Changed
|
|
40
|
+
|
|
41
|
+
- **The `spring-audit` security section says what it is before it says what it
|
|
42
|
+
found** (CL-15). A field evaluation found the repository's critical SQL
|
|
43
|
+
injection by hand and ASK did not report it — correctly and by declaration
|
|
44
|
+
(NC-001: no dataflow) — but the section is announced as a *security surface*,
|
|
45
|
+
which invites reading it as a defect finder. The surface now states, from one
|
|
46
|
+
table rendered into both `--help` and the payload, that it reads the security
|
|
47
|
+
**configuration and exposure** (declared chain rules, open endpoints, disabled
|
|
48
|
+
controls, bypassable gates, each with file and line), that it is **not** a
|
|
49
|
+
vulnerability scanner, and where it is strongest: given a defect somebody else
|
|
50
|
+
found, `ask impact` and `ask risk` quantify what it reaches. The rule-family
|
|
51
|
+
label follows (`security surface` → `security configuration and exposure`). No
|
|
52
|
+
rule and no finding changed — this was always a naming defect.
|
|
53
|
+
|
|
54
|
+
### Fixed
|
|
55
|
+
|
|
56
|
+
- **`ask config <path>` refuses a repository nobody could read** instead of
|
|
57
|
+
reporting on it (C4-21 follow-up). The command gained a repository argument in
|
|
58
|
+
4.10.7 without the admission gate every other path-taking command uses, so
|
|
59
|
+
`ask config /nonexistent` answered *"Declaration: none at
|
|
60
|
+
/nonexistent/sourcecode.config.json"* with exit 0 — and *"nothing is declared
|
|
61
|
+
here"* is indistinguishable from *"nobody could look"*, which is the reading
|
|
62
|
+
ADR-0008 exists to prevent.
|
|
63
|
+
|
|
64
|
+
- **`ask cache model` states which repository its figures were measured on, and
|
|
65
|
+
what that means for yours** (C3-60, second half). It published `verify-edit` as
|
|
66
|
+
*14,6 s → 9,6 s → 5,6 s* and called it *"built for the edit loop"* while the
|
|
67
|
+
same command had not answered at 495 s on the field repository — both
|
|
68
|
+
measurements, one printed. The command now measures the scope it is run in
|
|
69
|
+
(same authority as `--help` and the remedies), says whether the published
|
|
70
|
+
figures transfer to it, and gives each command a `here:` line saying how it can
|
|
71
|
+
be run on *this* repository. No figure changed and nothing is projected: an
|
|
72
|
+
unmeasurable scope gets the reference figures unqualified, as before.
|
|
73
|
+
|
|
74
|
+
- **`--progress off | stderr | file:<path>` on every command that can make you
|
|
75
|
+
wait** (C3-52). The heartbeat existed and the watcher model everybody uses
|
|
76
|
+
could not see it: a supervisor reading the standard streams got nothing for
|
|
77
|
+
703 seconds unless it knew to set `ASK_PROGRESS=1` or to poll the run record —
|
|
78
|
+
knowledge that appeared in no `--help` and in no payload. The choice is now
|
|
79
|
+
published on the command being typed (62 commands, population from the
|
|
80
|
+
registry), `ASK_PROGRESS` still sets the same thing in the environment, and an
|
|
81
|
+
unrecognised value is refused with exit 2 rather than silently falling back to
|
|
82
|
+
the default. Nothing changes for a piped or CI run that does not ask.
|
|
83
|
+
- **A detached run's log carries the progress its own envelope promises**
|
|
84
|
+
(C3-52). `--detach` printed *"Progress and errors go to `log`"* and the log
|
|
85
|
+
held one line, because a detached worker has no terminal and the heartbeat
|
|
86
|
+
disabled itself exactly where it is the only way to tell work from a hang. A
|
|
87
|
+
detached run now enables the heartbeat into its own log unless `--progress` or
|
|
88
|
+
`ASK_PROGRESS` says otherwise; no shell reads those bytes, so the PowerShell
|
|
89
|
+
`$?` problem (C3-66) cannot be reached from a detached run.
|
|
90
|
+
|
|
91
|
+
- **The progress heartbeat carries a denominator and an ETA** (C3-56, second
|
|
92
|
+
half). `phase=auditing 3342 Java files elapsed=6.8m` said the run was alive and
|
|
93
|
+
nothing about whether it was worth waiting for; the field's only way to tell
|
|
94
|
+
work from a hang was reading the worker's CPU time. The line now reads
|
|
95
|
+
`phase=auditing 2766 Java files stage=parsing 1458/2766 files elapsed=2.0s
|
|
96
|
+
eta=1.8s eta_covers=parsing`, with the counts coming from the loops that read
|
|
97
|
+
the files rather than from the spinner. The ETA **names what it covers**
|
|
98
|
+
(nothing here knows the cost of the stages after the counted one), is withheld
|
|
99
|
+
until it can be measured, and is dropped when the phase changes rather than
|
|
100
|
+
freezing at `2766/2766`. A run with no heartbeat enabled is not asked to count.
|
|
101
|
+
|
|
102
|
+
- **`-f` means `--format` on every command that publishes it, and every command
|
|
103
|
+
that answers with a payload document publishes it** (C3-59). `-f json` was
|
|
104
|
+
accepted by `endpoints` and `spring-audit` and refused by `modernize`, whose
|
|
105
|
+
error called `-f` a global flag *"as `ask -f <path>`"* — so the message taught
|
|
106
|
+
the collision it was meant to remove. The population is now the C4-17 rule one
|
|
107
|
+
level along (a payload command publishes `--format/-f`; a command that answers
|
|
108
|
+
in lines is exempt on the record in `cli.COMMANDS_WITHOUT_FORMAT`), and 34
|
|
109
|
+
commands gained the flag: `modernize`, `archetype`, `cold-start`, `schema`,
|
|
110
|
+
`onboard`, `fix-bug` and the 29 `retrieve` intents. One conversion in the emit
|
|
111
|
+
seam serves all of them, on the *stamped* document, so a YAML answer carries
|
|
112
|
+
the same `_meta` as the JSON one.
|
|
113
|
+
- **An unsupported `--format` is refused instead of silently ignored** (C3-59).
|
|
114
|
+
Eleven commands published the flag and validated nothing — `ask risk .
|
|
115
|
+
--format bogus` answered with JSON as if the value had counted. Validation
|
|
116
|
+
moved into the shared option factory, keyed off the command being run, so a
|
|
117
|
+
command cannot publish the flag and skip the check;
|
|
118
|
+
`sourcecode.format_contract.FORMAT_REGISTRY` is the one authority for what
|
|
119
|
+
each command accepts, and an invalid value exits 2 with the values that are
|
|
120
|
+
valid. `rename-class` keeps `-f` for `--from` (on the record in
|
|
121
|
+
`COMMANDS_WITHOUT_FORMAT_SHORTHAND`); its long `--format` is unchanged.
|
|
122
|
+
|
|
123
|
+
## [4.10.7] — 2026-08-07
|
|
124
|
+
|
|
125
|
+
**Tier D, and with it the M13 bug queue.** Five ledger rows close (C4-17 · C4-18 ·
|
|
126
|
+
C4-19 · C4-20 · C4-21), one commit each, all of them discoverability: none was
|
|
127
|
+
publishing a false claim, and together they are the ergonomics score two field
|
|
128
|
+
evaluations put at 5/10. What remains of the queue is a *measurement*, not a fix —
|
|
129
|
+
the C3-53 re-run on Windows under an agent harness, which is written the same way
|
|
130
|
+
in the ledger and in the 4.10.6 entry below.
|
|
131
|
+
|
|
132
|
+
⚠ **Three behaviour changes to read before upgrading a pipeline:**
|
|
133
|
+
|
|
134
|
+
- **`ask cache status --json` renames `cores` to `cached_cores`.** It always
|
|
135
|
+
counted cached core entries; `cores` is what a captured baseline calls the
|
|
136
|
+
machine's CPU count (C4-18).
|
|
137
|
+
- **`--output/-o` is now accepted after every command that publishes `--copy`**,
|
|
138
|
+
including eleven that refused it. On those the answer goes to the file and
|
|
139
|
+
stdout carries one `Written to <path>` line (C4-17).
|
|
140
|
+
- **`--detach` accepts every repository-wide and deep command**, not the six that
|
|
141
|
+
happened to be listed in a hand-kept table. `posture`, `modernize`, `repo-ir`
|
|
142
|
+
and `verify-edit` — four of the commands the field could not run in a session —
|
|
143
|
+
could not be detached before this release (C4-19).
|
|
144
|
+
|
|
145
|
+
### Fixed
|
|
146
|
+
|
|
147
|
+
- **`ask --help` orders its front page by what will run on the repository being
|
|
148
|
+
read** (C4-19). *Start here* was, on the field repository, exactly the set of
|
|
149
|
+
commands that could not run there — four of five unrunnable in one evaluation,
|
|
150
|
+
three of five killing the session in the next. The help now measures the scope
|
|
151
|
+
(a capped tree walk plus two stat calls, paid only when help is what was asked
|
|
152
|
+
for) and groups the entries into **Runs now**, **Warm the cache first** and
|
|
153
|
+
**Too big for this session — `--output <file> --detach`**. What it deliberately
|
|
154
|
+
does not do is project a duration: `spring-audit` is 8.8 s on the 2 000-file
|
|
155
|
+
reference and was measured at 408 s on 3 342 files, so a scaled estimate would
|
|
156
|
+
be a confident falsehood; the class and the measured anchors are published
|
|
157
|
+
instead, and a command measured fast at field size (`endpoints`, 4.2 s) stays
|
|
158
|
+
on the fast list whatever its class. `--detach` accepts every repository-wide
|
|
159
|
+
and deep command now, not the six that happened to be in a hand-kept table:
|
|
160
|
+
`posture`, `modernize`, `repo-ir` and `verify-edit` were on the field's blocked
|
|
161
|
+
list and could not be detached.
|
|
162
|
+
- **A remedy is checked against the repository it is printed on** (C4-20).
|
|
163
|
+
`plan` pointed an unresolved symbol at `ask repo-ir`, and `onboard` named
|
|
164
|
+
`ask posture --profile <set>` as the authority — both correct, and neither
|
|
165
|
+
finished in an interactive session on the repository whose answer named them.
|
|
166
|
+
Every remedy block (`posture`, `data-exposure`, `verify`, the security-surface
|
|
167
|
+
limitation, the unresolved-target message) now carries `how_to_run_here` when
|
|
168
|
+
there is something to say: run it detached, or warm the cache first. Nothing is
|
|
169
|
+
added where the command runs in the foreground, and nothing is guessed where
|
|
170
|
+
the scope is unknown.
|
|
171
|
+
- **`--output/-o` works after every command that produces an answer** (C4-17).
|
|
172
|
+
It was a per-command decision, and the decisions disagreed: `endpoints`,
|
|
173
|
+
`validation` and `data-exposure` accepted it after the command, `baseline
|
|
174
|
+
capture` refused it — while its own siblings `baseline diff` and `baseline
|
|
175
|
+
trend` accepted it — and the refusal's hint blamed the placement rather than
|
|
176
|
+
the gap. The rule is now one line with its population taken from the CLI
|
|
177
|
+
registry: **a command that publishes `--copy` publishes `--output`**. Eleven
|
|
178
|
+
commands gained it (`version`, `baseline capture`, `cache status/warm/model/
|
|
179
|
+
freshness/context-stats`, `auth status`, `mcp status`, `mcp list-tools`,
|
|
180
|
+
`telemetry status`); on those the answer goes to the file and stdout carries
|
|
181
|
+
only `Written to <path>`. The hint for a genuinely global flag typed after a
|
|
182
|
+
subcommand was corrected with it: it said *"it goes before the command"*, which
|
|
183
|
+
is a placement that does nothing, since the root analysis is skipped as soon as
|
|
184
|
+
a subcommand is invoked.
|
|
185
|
+
- **`ask config` lists the repository's own declaration** (C4-21). `data-exposure`
|
|
186
|
+
answers `answered: false` until `sourcecode.config.json` declares which types
|
|
187
|
+
and fields are sensitive — the right refusal, since a label is a judgement
|
|
188
|
+
about a domain and is never inferred — but nothing afterwards said whether the
|
|
189
|
+
file had been picked up, so the last step of the cold start was a guess.
|
|
190
|
+
`ask config [path]` now resolves that file and reports its path, the labels
|
|
191
|
+
read from it, the custom security annotations, and any declaration that could
|
|
192
|
+
not be used; when it is absent, the path it looked at and the answer that
|
|
193
|
+
absence produces. The `data-exposure` refusal points at it (`declare.confirm`).
|
|
194
|
+
- **`cache status` no longer calls a cache count `Cores:`** (C4-18). The line
|
|
195
|
+
counted `core-*.json.gz` entries under the field name a captured baseline uses
|
|
196
|
+
for the machine's CPU count (`env: {cores: 20}` on the same machine, same
|
|
197
|
+
scope, minutes apart), and it sat beside `Views: 0 / CAS blobs: 0`, so
|
|
198
|
+
`Cores: 0` read as *the cache is empty* rather than *no core entries yet*. The
|
|
199
|
+
text line is `Cached cores: N entries` and the JSON key is `cached_cores`.
|
|
200
|
+
**Behaviour change for consumers of `ask cache status --json`: the `cores` key
|
|
201
|
+
is gone, replaced by `cached_cores`** — one fact, one name.
|
|
202
|
+
|
|
5
203
|
## [4.10.6] — 2026-08-07
|
|
6
204
|
|
|
7
205
|
The M13 sanitation queue, tiers A through C plus the claims tier: **eighteen ledger
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sourcecode
|
|
3
|
-
Version: 4.
|
|
3
|
+
Version: 4.11.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`**
|
|
@@ -73,8 +73,10 @@ These numbers are cache-layer benchmarks, not a promise for every command. Per-s
|
|
|
73
73
|
|
|
74
74
|
With the right command class, ASK Engine becomes **constant infrastructure** inside agent loops — call the fast/context surfaces before edits and reserve deep compositions for the points where their evidence is worth the runtime.
|
|
75
75
|
|
|
76
|
-
**Large-repo controls.**
|
|
77
|
-
|
|
76
|
+
**Large-repo controls.** Pass `--progress stderr` (or `--progress file:run.log`)
|
|
77
|
+
for line heartbeats in a non-TTY supervised run — with the file being read so
|
|
78
|
+
far and an ETA for the stage being measured. `ASK_PROGRESS` sets the same thing
|
|
79
|
+
in the environment. Long repo-wide/deep runs also write durable records under
|
|
78
80
|
`~/.sourcecode/runs/<repo-hash>/` by default, not inside the audited repository;
|
|
79
81
|
set `ASK_RUNS_IN_REPO=1` only when repo-local `.ask/runs` records are intentional.
|
|
80
82
|
Set `ASK_MAX_ANALYSIS_SECONDS=<seconds>` to fail before starting a repo-wide/deep
|
|
@@ -106,7 +108,7 @@ brew tap haroundominique/sourcecode && brew install sourcecode
|
|
|
106
108
|
# pip / pipx
|
|
107
109
|
pipx install sourcecode # or: pip install sourcecode
|
|
108
110
|
|
|
109
|
-
ask version # ask 4.
|
|
111
|
+
ask version # ask 4.11.0 — and, on a build that has aged,
|
|
110
112
|
# how many releases have probably shipped since
|
|
111
113
|
```
|
|
112
114
|
|
|
@@ -322,7 +324,7 @@ from it.
|
|
|
322
324
|
| `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 |
|
|
323
325
|
| `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 |
|
|
324
326
|
| `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 |
|
|
325
|
-
| `spring-audit` | core | transactional anomalies + security
|
|
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 |
|
|
326
328
|
| `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 |
|
|
327
329
|
| `impact` / `impact-chain` | core | blast radius of a change, to the endpoints it reaches | target the **interface**, not the `Impl` |
|
|
328
330
|
| `pr-impact` | core | the same, scoped to a PR diff | gating command: `--fail-on`, exit codes |
|
|
@@ -359,7 +361,21 @@ Honest limits worth knowing before you rely on it:
|
|
|
359
361
|
- Architecture classification is tuned for Spring MVC layered apps; SPI/plugin models (e.g. Quarkus extensions) may be misclassified. JAX-RS subresource-locator endpoint recall is ~65%.
|
|
360
362
|
- Self-invocation `@Transactional` bypass (same-class call skipping the proxy) is not detected.
|
|
361
363
|
|
|
362
|
-
### What the security
|
|
364
|
+
### What the security section is, and what it does not answer
|
|
365
|
+
|
|
366
|
+
**What it reads:** the security *configuration and exposure* of a repository — which
|
|
367
|
+
rules the request chain declares, which endpoints they leave open, which controls are
|
|
368
|
+
present but disabled, and which custom gates can be bypassed, each with the file and
|
|
369
|
+
line that says so.
|
|
370
|
+
|
|
371
|
+
**What it is not:** a vulnerability scanner. No value flows through a program here, so
|
|
372
|
+
an injection, a deserialization sink or a logic flaw inside a method body is not looked
|
|
373
|
+
for, and its absence from the report is not evidence (NC-001, below).
|
|
374
|
+
|
|
375
|
+
**Where it is strongest:** given a defect somebody else found — a scanner finding, a
|
|
376
|
+
line from a review — `ask impact <symbol>` and `ask risk` quantify what it reaches: the
|
|
377
|
+
endpoints, the transactional boundaries and the modules downstream of it, with the
|
|
378
|
+
confidence of each hop. That is the question a taint scanner does not answer.
|
|
363
379
|
|
|
364
380
|
Published because a product that states its limits is not compared on breadth — it is
|
|
365
381
|
compared on depth. Each row is emitted in the payload too (`non_coverage`), so an agent
|
|
@@ -467,6 +483,9 @@ Full breakdown: [docs/PRODUCT_TIERS.md](docs/PRODUCT_TIERS.md).
|
|
|
467
483
|
|
|
468
484
|
```bash
|
|
469
485
|
ask config # version, config file path, telemetry status
|
|
486
|
+
ask config /repo # + the repository's own sourcecode.config.json:
|
|
487
|
+
# data labels, custom security annotations,
|
|
488
|
+
# and any declaration that could not be used
|
|
470
489
|
ask telemetry enable # anonymous telemetry is OFF by default (opt-in)
|
|
471
490
|
```
|
|
472
491
|
|
|
@@ -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`**
|
|
@@ -35,8 +35,10 @@ These numbers are cache-layer benchmarks, not a promise for every command. Per-s
|
|
|
35
35
|
|
|
36
36
|
With the right command class, ASK Engine becomes **constant infrastructure** inside agent loops — call the fast/context surfaces before edits and reserve deep compositions for the points where their evidence is worth the runtime.
|
|
37
37
|
|
|
38
|
-
**Large-repo controls.**
|
|
39
|
-
|
|
38
|
+
**Large-repo controls.** Pass `--progress stderr` (or `--progress file:run.log`)
|
|
39
|
+
for line heartbeats in a non-TTY supervised run — with the file being read so
|
|
40
|
+
far and an ETA for the stage being measured. `ASK_PROGRESS` sets the same thing
|
|
41
|
+
in the environment. Long repo-wide/deep runs also write durable records under
|
|
40
42
|
`~/.sourcecode/runs/<repo-hash>/` by default, not inside the audited repository;
|
|
41
43
|
set `ASK_RUNS_IN_REPO=1` only when repo-local `.ask/runs` records are intentional.
|
|
42
44
|
Set `ASK_MAX_ANALYSIS_SECONDS=<seconds>` to fail before starting a repo-wide/deep
|
|
@@ -68,7 +70,7 @@ brew tap haroundominique/sourcecode && brew install sourcecode
|
|
|
68
70
|
# pip / pipx
|
|
69
71
|
pipx install sourcecode # or: pip install sourcecode
|
|
70
72
|
|
|
71
|
-
ask version # ask 4.
|
|
73
|
+
ask version # ask 4.11.0 — and, on a build that has aged,
|
|
72
74
|
# how many releases have probably shipped since
|
|
73
75
|
```
|
|
74
76
|
|
|
@@ -284,7 +286,7 @@ from it.
|
|
|
284
286
|
| `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 |
|
|
285
287
|
| `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 |
|
|
286
288
|
| `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 |
|
|
287
|
-
| `spring-audit` | core | transactional anomalies + security
|
|
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 |
|
|
288
290
|
| `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 |
|
|
289
291
|
| `impact` / `impact-chain` | core | blast radius of a change, to the endpoints it reaches | target the **interface**, not the `Impl` |
|
|
290
292
|
| `pr-impact` | core | the same, scoped to a PR diff | gating command: `--fail-on`, exit codes |
|
|
@@ -321,7 +323,21 @@ Honest limits worth knowing before you rely on it:
|
|
|
321
323
|
- Architecture classification is tuned for Spring MVC layered apps; SPI/plugin models (e.g. Quarkus extensions) may be misclassified. JAX-RS subresource-locator endpoint recall is ~65%.
|
|
322
324
|
- Self-invocation `@Transactional` bypass (same-class call skipping the proxy) is not detected.
|
|
323
325
|
|
|
324
|
-
### What the security
|
|
326
|
+
### What the security section is, and what it does not answer
|
|
327
|
+
|
|
328
|
+
**What it reads:** the security *configuration and exposure* of a repository — which
|
|
329
|
+
rules the request chain declares, which endpoints they leave open, which controls are
|
|
330
|
+
present but disabled, and which custom gates can be bypassed, each with the file and
|
|
331
|
+
line that says so.
|
|
332
|
+
|
|
333
|
+
**What it is not:** a vulnerability scanner. No value flows through a program here, so
|
|
334
|
+
an injection, a deserialization sink or a logic flaw inside a method body is not looked
|
|
335
|
+
for, and its absence from the report is not evidence (NC-001, below).
|
|
336
|
+
|
|
337
|
+
**Where it is strongest:** given a defect somebody else found — a scanner finding, a
|
|
338
|
+
line from a review — `ask impact <symbol>` and `ask risk` quantify what it reaches: the
|
|
339
|
+
endpoints, the transactional boundaries and the modules downstream of it, with the
|
|
340
|
+
confidence of each hop. That is the question a taint scanner does not answer.
|
|
325
341
|
|
|
326
342
|
Published because a product that states its limits is not compared on breadth — it is
|
|
327
343
|
compared on depth. Each row is emitted in the payload too (`non_coverage`), so an agent
|
|
@@ -429,6 +445,9 @@ Full breakdown: [docs/PRODUCT_TIERS.md](docs/PRODUCT_TIERS.md).
|
|
|
429
445
|
|
|
430
446
|
```bash
|
|
431
447
|
ask config # version, config file path, telemetry status
|
|
448
|
+
ask config /repo # + the repository's own sourcecode.config.json:
|
|
449
|
+
# data labels, custom security annotations,
|
|
450
|
+
# and any declaration that could not be used
|
|
432
451
|
ask telemetry enable # anonymous telemetry is OFF by default (opt-in)
|
|
433
452
|
```
|
|
434
453
|
|
|
@@ -336,10 +336,15 @@ def cache_dir(repo_root: Path) -> Path:
|
|
|
336
336
|
def status(repo_root: Path) -> dict[str, Any]:
|
|
337
337
|
"""Return a stats dict describing the current cache state for *repo_root*.
|
|
338
338
|
|
|
339
|
-
Keys: ``cache_dir``, ``
|
|
339
|
+
Keys: ``cache_dir``, ``cached_cores``, ``views``, ``cas_blobs``,
|
|
340
340
|
``total_size_bytes``, ``total_size_mb``, ``ris_exists``, ``ris_git_head``,
|
|
341
341
|
``ris_last_updated_at``, ``ris_is_stale``, ``current_git_head``.
|
|
342
342
|
|
|
343
|
+
``cached_cores`` counts ``core-*.json.gz`` entries in this cache. It was
|
|
344
|
+
named ``cores`` until 4.10.7, which is the field name a captured baseline
|
|
345
|
+
uses for the machine's CPU count (``env.cores``) — two different facts under
|
|
346
|
+
one name, on the same machine, minutes apart (C4-18).
|
|
347
|
+
|
|
343
348
|
Note: ``snapshots`` is a legacy v1 field — always 0 in v2 (kept for
|
|
344
349
|
backward compatibility; v2 writes ``core-*`` and ``view-*`` files only).
|
|
345
350
|
"""
|
|
@@ -377,7 +382,7 @@ def status(repo_root: Path) -> dict[str, Any]:
|
|
|
377
382
|
if not cache_d.exists():
|
|
378
383
|
return {
|
|
379
384
|
"cache_dir": str(cache_d),
|
|
380
|
-
"
|
|
385
|
+
"cached_cores": 0, "snapshots": 0, "views": 0, "cas_blobs": 0,
|
|
381
386
|
"total_size_bytes": 0, "total_size_mb": 0.0,
|
|
382
387
|
"current_git_head": current_head,
|
|
383
388
|
"stores": _store_breakdown(repo_root, 0),
|
|
@@ -391,7 +396,7 @@ def status(repo_root: Path) -> dict[str, Any]:
|
|
|
391
396
|
total_bytes = sum(f.stat().st_size for f in all_files if f.exists())
|
|
392
397
|
return {
|
|
393
398
|
"cache_dir": str(cache_d),
|
|
394
|
-
"
|
|
399
|
+
"cached_cores": len(cores),
|
|
395
400
|
"snapshots": len(snapshots),
|
|
396
401
|
"views": len(views),
|
|
397
402
|
"cas_blobs": len(cas_blobs),
|