sourcecode 5.8.21__tar.gz → 5.8.22__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-5.8.21 → sourcecode-5.8.22}/CHANGELOG.md +65 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/PKG-INFO +20 -4
- {sourcecode-5.8.21 → sourcecode-5.8.22}/README.md +19 -3
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/CACHE.md +1 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/COMMERCIAL-OFFER.md +6 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/DEFECT-LEDGER.md +210 -16
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/DEVELOPMENT-ROADMAP.md +175 -123
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/EXECUTION-PLAN-12MO.md +17 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/EXECUTIVE-ROADMAP.md +94 -2
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/MANUAL-USUARIO.md +16 -0
- sourcecode-5.8.22/docs/PRODUCT-ROUTE.md +94 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/PRODUCT_TIERS.md +14 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/USER_GUIDE.md +15 -2
- {sourcecode-5.8.21 → sourcecode-5.8.22}/pyproject.toml +10 -1
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/__init__.py +1 -1
- sourcecode-5.8.22/src/sourcecode/analysis_budget.py +66 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/cache_model.py +7 -2
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/cli.py +587 -48
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/error_schema.py +19 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/format_contract.py +3 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/non_coverage.py +14 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/output_bounds.py +91 -1
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/output_ceiling.py +65 -4
- sourcecode-5.8.22/src/sourcecode/packs.py +155 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/perf.py +38 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/risk.py +28 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/schema_registry.py +6 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/selftest.py +81 -3
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/spring_model.py +53 -3
- sourcecode-5.8.21/src/sourcecode/analysis_budget.py +0 -27
- {sourcecode-5.8.21 → sourcecode-5.8.22}/.github/workflows/build-windows.yml +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/.github/workflows/perf-gate.yml +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/.gitignore +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/.ruff.toml +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/CLAUDE.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/CONTRIBUTING.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/LICENSE +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/NOTICE +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/SECURITY.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/CUSTOMER-VALIDATION.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/DEMO-5MIN.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/MODERNIZATION.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/PRODUCT_AUDIT.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/PRODUCT_IDENTITY.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/RC1-CHECKLIST.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/RELEASE-CHECKLIST.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/architecture/CATALOG-retrieval-intents.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/architecture/DESIGN-knowledge-provider-integration.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/architecture/DESIGN-p5.3b-statement-surface.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/architecture/DESIGN-p5.5-span-index.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/architecture/DESIGN-p6-semantic-impact-engine.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/architecture/DESIGN-p6-semantic-integration-engine.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/architecture/DESIGN-p7-semantic-services.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/architecture/DESIGN-robustness-security-inference.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/architecture/DESIGN-semantic-retrieval.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/architecture/EPV-p6-class-typeref.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/architecture/REPORT-p6-flow-analyzer-comparison.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/architecture/REPORT-p6-integration-detector-comparison.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/architecture/REPORT-p8-flow-analyzer-migration.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/architecture/REPORT-p9-integration-detector-migration.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/architecture/adr/0001-semantic-ir.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/architecture/adr/0002-source-evidence-boundary.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/architecture/adr/0003-architectural-characterization.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/architecture/adr/0004-semantic-retrieval.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/architecture/adr/0005-evidence-reconciliation.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/architecture/adr/0006-performance-harness.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/architecture/adr/0007-composition-semantics.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/architecture/adr/0008-answer-coherence.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/architecture/consumer-disposition-inventory.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/architecture/overview.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/architecture/product-architecture-review.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/architecture/product-strategy-layering.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/architecture/semantic-ir-consumer-matrix.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/architecture/semantic-ir-roadmap.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/baseline-ci.yml +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/commercial-pipeline-audit.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/contracts-ci.yml +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/contracts.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/eval/2026-06-15-petclinic-rest-issue11-vets-pagination.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/eval/2026-06-15-petclinic-rest-issue147-validation.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/eval/2026-06-15-petclinic-rest-workflow.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/eval/2026-06-15-phase18-openapi-surface.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/eval/2026-06-15-phase20-validation-surface.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/eval/2026-06-16-broadleaf-checkout-impact-fieldtest.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/eval/2026-06-16-petclinic-rest-issue11-weakness2-closed.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/eval/2026-06-16-spring-petclinic-issue2333-dead-vets.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/licensing-schema.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/migrate-check.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/perf/README.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/perf/REGRESSION-GATE.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/perf/baselines/2.5.15/SUMMARY.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/perf/baselines/2.5.15/alfresco__ask__cold.json +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/perf/baselines/2.5.15/alfresco__ask__warm.json +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/perf/baselines/2.5.15/broadleaf__ask__cold.json +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/perf/baselines/2.5.15/broadleaf__ask__warm.json +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/perf/baselines/2.5.15/eureka__ask__cold.json +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/perf/baselines/2.5.15/eureka__ask__warm.json +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/perf/baselines/2.5.15/jenkins__ask__cold.json +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/perf/baselines/2.5.15/jenkins__ask__warm.json +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/perf/baselines/2.5.15/jobrunr__ask__cold.json +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/perf/baselines/2.5.15/jobrunr__ask__warm.json +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/perf/baselines/2.5.15/keycloak__ask__cold.json +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/perf/baselines/2.5.15/keycloak__ask__warm.json +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/perf/baselines/2.5.15/neo4j__ask__cold.json +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/perf/baselines/2.5.15/neo4j__ask__warm.json +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/perf/baselines/2.5.15/ofbiz__ask__cold.json +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/perf/baselines/2.5.15/ofbiz__ask__warm.json +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/perf/baselines/2.5.15/openmrs__ask__cold.json +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/perf/baselines/2.5.15/openmrs__ask__warm.json +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/perf/baselines/2.5.15/petclinic__ask__cold.json +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/perf/baselines/2.5.15/petclinic__ask__warm.json +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/perf/baselines/2.5.16/SUMMARY.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/perf/baselines/2.5.16/alfresco__ask__cold.json +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/perf/baselines/2.5.16/alfresco__ask__warm.json +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/perf/baselines/2.5.16/broadleaf__ask__cold.json +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/perf/baselines/2.5.16/broadleaf__ask__warm.json +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/perf/baselines/2.5.16/eureka__ask__cold.json +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/perf/baselines/2.5.16/eureka__ask__warm.json +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/perf/baselines/2.5.16/jenkins__ask__cold.json +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/perf/baselines/2.5.16/jenkins__ask__warm.json +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/perf/baselines/2.5.16/jobrunr__ask__cold.json +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/perf/baselines/2.5.16/jobrunr__ask__warm.json +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/perf/baselines/2.5.16/keycloak__ask__cold.json +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/perf/baselines/2.5.16/keycloak__ask__warm.json +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/perf/baselines/2.5.16/neo4j__ask__cold.json +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/perf/baselines/2.5.16/neo4j__ask__warm.json +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/perf/baselines/2.5.16/ofbiz__ask__cold.json +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/perf/baselines/2.5.16/ofbiz__ask__warm.json +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/perf/baselines/2.5.16/openmrs__ask__cold.json +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/perf/baselines/2.5.16/openmrs__ask__warm.json +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/perf/baselines/2.5.16/petclinic__ask__cold.json +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/perf/baselines/2.5.16/petclinic__ask__warm.json +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/perf/baselines/gate-latest/README.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/perf/baselines/gate-latest/broadleaf__ask__warm.json +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/perf/baselines/gate-latest/broadleaf__endpoints__warm.json +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/perf/baselines/gate-latest/broadleaf__migrate-check__warm.json +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/perf/baselines/gate-latest/broadleaf__posture__warm.json +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/perf/baselines/gate-latest/broadleaf__spring-audit__warm.json +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/perf/baselines/gate-latest/broadleaf__validation__warm.json +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/perf/baselines/reference-best/README.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/posture.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/privacy.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/pro-experience-audit.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/schema.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/spec/envelope-v1.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/docs/spring-audit-ci.yml +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/hatch_build.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/scripts/compare_integration_engines.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/scripts/customer_smoke_test.sh +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/scripts/generate_jdk_exports.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/scripts/perf_gate.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/scripts/perf_harness.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/scripts/sync_gate_anchors.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/scripts/test_fast.sh +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/adaptive_scanner.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/answer_bounds.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/archetype.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/architectural_baseline.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/architectural_delta.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/architecture_analyzer.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/architecture_summary.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/ast_extractor.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/audit_clusters.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/audit_recipe.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/audit_report.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/audit_since.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/baseline_autocapture.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/breaking_changes.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/build_modules.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/build_stamp.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/bundled_docs.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/cache.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/call_surface.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/caller_metrics.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/caller_reach.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/canonical_ir.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/chain_rules.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/change_plan.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/ci_output.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/cir_graphs.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/classifier.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/client_calls.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/code_notes_analyzer.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/compare.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/confidence_analyzer.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/constraint_diff.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/consumer_join.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/container_wiring.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/context_cache.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/context_graph.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/context_scorer.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/context_summarizer.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/contract_diff.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/contract_init.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/contract_model.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/contract_pipeline.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/coverage_parser.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/data_exposure.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/data_labels.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/declarations.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/defect_classes/__init__.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/defect_classes/registry.json +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/defect_identity.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/degradation.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/dependency_analyzer.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/deployment_prefix.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/detach.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/detectors/__init__.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/detectors/base.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/detectors/csproj_parser.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/detectors/dart.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/detectors/dotnet.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/detectors/elixir.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/detectors/go.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/detectors/heuristic.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/detectors/hybrid.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/detectors/java.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/detectors/jvm_ext.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/detectors/nodejs.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/detectors/parsers.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/detectors/php.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/detectors/project.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/detectors/python.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/detectors/ruby.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/detectors/rust.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/detectors/systems.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/detectors/terraform.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/detectors/tooling.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/doc_analyzer.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/dynamic_argument_surface.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/empty_reach.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/endpoint_disposition.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/endpoint_literals.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/endpoint_metrics.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/entrypoint_classifier.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/env_analyzer.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/envelope.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/environment_resolution.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/evidence_provider.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/execution_plan.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/explain.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/explain_endpoint.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/facts/__init__.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/facts/registry.json +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/field_deprecations.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/file_chunker.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/file_classifier.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/filter_surface.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/fqn_utils.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/functional_routes.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/gate_anchors.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/git_analyzer.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/git_checkout.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/github_diff.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/graph_analyzer.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/graph_evidence.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/hibernate_strat.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/identity_fallback.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/integration_coordinates.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/jdk_exports.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/license.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/manifest_cache.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/mcp/__init__.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/mcp/dependency_import.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/mcp/onboarding/__init__.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/mcp/onboarding/applier.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/mcp/onboarding/backup.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/mcp/onboarding/detector.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/mcp/onboarding/planner.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/mcp/orchestrator.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/mcp/registry.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/mcp/runner.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/mcp/server.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/mcp_nudge.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/metrics_analyzer.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/migrate_check.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/migration_apply.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/migration_blast.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/openapi_surface.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/openrewrite_recipe.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/output_budget.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/output_encoding.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/output_sink.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/parallel.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/parse_cache.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/partial_contract.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/path_admission.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/path_filters.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/phased_run.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/pipe_contract.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/posture.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/pr_comment_renderer.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/pr_impact.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/prepare_context.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/product_info.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/progress.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/provenance.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/ranking_engine.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/readiness_timeline.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/readonly.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/reconciliation.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/redactor.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/reference_facts.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/regress.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/release_info.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/relevance_scorer.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/remediation_diff.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/remedies.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/rename_refactor.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/repo_classifier.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/repository_ir.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/resource_budget.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/retrieval/__init__.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/retrieval/context.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/retrieval/errors.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/retrieval/executor.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/retrieval/planner.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/retrieval/query.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/retrieval/request.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/retrieval/resolution.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/retrieval/result.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/retrieval/retriever.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/retrieval/runtime.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/retrieval/steps.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/retrieval/steps_endpoint.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/retrieval/steps_graph.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/retrieval/steps_impact.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/retrieval/steps_intf.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/retrieval/steps_struct.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/retrieval/steps_txsec.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/ris.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/risk_model.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/rule_catalog.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/rule_pass.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/runs.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/runtime_classifier.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/sarif.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/scanner.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/schema.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/schema_producers.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/schemas/core-analysis-v1.schema.json +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/schemas/endpoints-v1.schema.json +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/schemas/envelope-v1.schema.json +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/schemas/pr-impact-v1.schema.json +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/schemas/verify-edit-v1.schema.json +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/schemas/verify-v1.schema.json +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/security_chain.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/security_config.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/security_config_scan.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/security_posture.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/selection_contract.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/semantic_analyzer.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/semantic_impact_engine.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/semantic_integration_engine.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/semantic_services.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/serializer.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/servlet_surface.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/source_text.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/spring_event_topology.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/spring_findings.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/spring_impact.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/spring_profiles.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/spring_properties.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/spring_security_audit.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/spring_semantic.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/spring_tx_analyzer.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/sql_taint.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/summarizer.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/target_admission.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/telemetry/__init__.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/telemetry/config.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/telemetry/consent.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/telemetry/events.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/telemetry/filters.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/telemetry/transport.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/test_gap_ranking.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/test_sources.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/text_input.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/timeline.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/timeline_cache.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/token_estimate.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/tree_utils.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/type_usage_surface.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/validation_inference.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/validation_surface.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/verify_edit.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/verify_repo.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/verify_rules.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/version_check.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/waivers.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/wired_surface.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/src/sourcecode/workspace.py +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/supabase/functions/README.md +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/supabase/functions/get-license/index.ts +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/supabase/functions/lemonsqueezy-webhook/index.ts +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/supabase/functions/telemetry/index.ts +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/supabase/sql/license_event_ordering.sql +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/supabase/sql/licensing_schema.sql +0 -0
- {sourcecode-5.8.21 → sourcecode-5.8.22}/supabase/sql/telemetry_events.sql +0 -0
|
@@ -1,5 +1,70 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [5.8.22] — 2026-08-22
|
|
4
|
+
|
|
5
|
+
*The eleventh audit-pass queue is closed entire: all fourteen open rows shipped
|
|
6
|
+
as separate commits, regressions first, with the full suite green at 12 176
|
|
7
|
+
tests. Four reported mechanisms are corrected against measurement and one half
|
|
8
|
+
of one row is refused with its price on the record.*
|
|
9
|
+
|
|
10
|
+
### Fixed — the two regressions the pass led with
|
|
11
|
+
|
|
12
|
+
- **Root help (`AUD-597-R01`)** — `ask --help` went to 177.4 s in the field
|
|
13
|
+
because the page is *recursive* through the Typer→Click conversion: one
|
|
14
|
+
`--help` rebuilt the whole command tree 249 times. The tree is built once per
|
|
15
|
+
process. Measured here: **13.3 s → 0.45 s**.
|
|
16
|
+
- **Self-check encoding and exit (`AUD-597-R02`)** — `selftest` decoded its
|
|
17
|
+
children with the host locale, so on a `cp1252` host three checks died with
|
|
18
|
+
tracebacks and the command still exited 0. Children are read as UTF-8, an
|
|
19
|
+
unreadable stream is no longer a traceback, and `summary.error > 0` exits 75.
|
|
20
|
+
The battery now asserts its own exit contract as a ledger row.
|
|
21
|
+
|
|
22
|
+
### Fixed — bounding, identity and determinism
|
|
23
|
+
|
|
24
|
+
- **Bounded is never larger (`AUD-597-R03`)** — `--compact` could grow a payload,
|
|
25
|
+
because a cut's disclosure outweighed the rows it replaced. The trade is
|
|
26
|
+
measured at each cut; a bounded answer is never the larger one, asserted over
|
|
27
|
+
the whole bounded-flag population. `--limit N` is still answered literally.
|
|
28
|
+
- **Build provenance (`AUD-597-X01`)** — the generated commit stamp is declared a
|
|
29
|
+
wheel artifact, so an installed build can name the tree it came from. Proved
|
|
30
|
+
from the built wheel, not from a checkout.
|
|
31
|
+
- **Front page (`AUD-597-A01`)** — every recommended line carries the bounding
|
|
32
|
+
flag its own command declares, typed with a value where the flag needs one, and
|
|
33
|
+
the comment column is padded after the substitution.
|
|
34
|
+
- **Smaller answers (`AUD-597-A02`)** — the output ceiling learns that a smaller
|
|
35
|
+
answer can be a *mode*, so `export --c4` offers its three sections; and
|
|
36
|
+
`rename-class --dry-run` prints its plan without the diffs, so the most
|
|
37
|
+
destructive command in the product can be previewed.
|
|
38
|
+
- **Bean population (`AUD-597-A03`)** — a class's stereotype was picked out of a
|
|
39
|
+
Python set, so the bean population moved with the per-process hash seed. The
|
|
40
|
+
choice takes a declared rank; every Spring stereotype outranks every JPA one.
|
|
41
|
+
|
|
42
|
+
### Fixed — contracts, grammar and disclosure
|
|
43
|
+
|
|
44
|
+
- **Ledger coherence (`AUD-597-A04`)** — a row declared closed in this document's
|
|
45
|
+
own prose can no longer ship reading `open`, and a closure declaration must
|
|
46
|
+
name its rows unambiguously.
|
|
47
|
+
- **Analysis budget (`AUD-597-D01`)** — the help names the commands the budget
|
|
48
|
+
*stops* and the commands it only *advises*, instead of calling all eight a
|
|
49
|
+
deadline. The gating flags are asserted over the population that can gate.
|
|
50
|
+
- **Mutually exclusive hints (`AUD-597-D02`)** — `delta` and `contract-diff` no
|
|
51
|
+
longer answer "not both" with a hint containing both.
|
|
52
|
+
- **Partial timings (`AUD-597-D04`)** — a phase the run declares complete is
|
|
53
|
+
charged for its own duration, so `unaccounted_pct` on a partial answer means
|
|
54
|
+
what it means on a full one.
|
|
55
|
+
- **Option suggestions (`AUD-597-D05`)** — suggestions come from this product's
|
|
56
|
+
guarded matcher rather than the parser's, and the guard measures a real edit
|
|
57
|
+
distance; where nothing is plausible, the hint names what the command takes.
|
|
58
|
+
- **One repository grammar (`AUD-597-D06`)** — `--path`, `--repo` and `--dir` are
|
|
59
|
+
accepted everywhere as aliases for the positional repository argument, with no
|
|
60
|
+
payload change and without overriding a command that declares one already.
|
|
61
|
+
- **Query sink scope (`AUD-597-D07`)** — the vocabulary states that it composes an
|
|
62
|
+
existing finding and does not originate one, so an absent row is not published
|
|
63
|
+
as safety.
|
|
64
|
+
- **Exit-code contract (`AUD-596-D11`, residual)** — the rule that closed that row
|
|
65
|
+
shipped without the batteries that assert it, leaving 23 tests red against the
|
|
66
|
+
build that fixed them. `error_schema.EXIT_CODE_FOR` publishes the table.
|
|
67
|
+
|
|
3
68
|
## [5.8.21] — 2026-08-22
|
|
4
69
|
|
|
5
70
|
*The tenth audit-pass queue is closed: seven remaining P3 fixes shipped as
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sourcecode
|
|
3
|
-
Version: 5.8.
|
|
3
|
+
Version: 5.8.22
|
|
4
4
|
Summary: Persistent structural context and ultra-fast repeated analysis for AI coding agents
|
|
5
5
|
Project-URL: Homepage, https://github.com/HarounDominique/sourcecode
|
|
6
6
|
Project-URL: Repository, https://github.com/HarounDominique/sourcecode
|
|
@@ -58,7 +58,7 @@ Description-Content-Type: text/markdown
|
|
|
58
58
|
> question. All analysis is local and deterministic; see [Privacy](#configuration--privacy)
|
|
59
59
|
> before inspecting a repository whose telemetry policy you need to control.
|
|
60
60
|
|
|
61
|
-

|
|
62
62
|

|
|
63
63
|
|
|
64
64
|
Copyright (c) 2026 Dominique Haroun. All rights reserved. ASK Engine 5.7.0 and
|
|
@@ -78,6 +78,20 @@ Every time an AI coding agent starts a new session, it has to re-parse the repos
|
|
|
78
78
|
|
|
79
79
|
ASK Engine solves this with a persistent structural cache keyed on file content hashes. After the first scan, later invocations reuse pre-built context whenever their command can consume the warmed layers. The repo doesn't change? The cache doesn't expire.
|
|
80
80
|
|
|
81
|
+
## Product route: individual commands and packs
|
|
82
|
+
|
|
83
|
+
ASK Engine keeps individual commands for precise, scriptable questions and adds
|
|
84
|
+
workflow-shaped packs for users who want one consumable result:
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
ask pack assessment . --profile prod --output-dir .ask/packs/assessment
|
|
88
|
+
ask pack gate . --since origin/main --output-dir .ask/packs/gate
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
The [Product Route](docs/PRODUCT-ROUTE.md) is normative: ASK focuses on
|
|
92
|
+
deterministic evidence for Java/Spring modernization and safe change. Packs
|
|
93
|
+
compose existing commands; they do not hide or replace them.
|
|
94
|
+
|
|
81
95
|
**The cache is not a performance optimization. It is what makes ASK Engine usable as infrastructure rather than a one-off tool.**
|
|
82
96
|
|
|
83
97
|
---
|
|
@@ -134,7 +148,7 @@ set `ASK_MAX_RSS_MB=<megabytes>`; if the process exceeds it, ASK refuses the
|
|
|
134
148
|
answer with `MEMORY_TOO_LARGE`, including the observed peak and limit. Leave it
|
|
135
149
|
unset, or set it to `0`, to disable the ceiling explicitly.
|
|
136
150
|
|
|
137
|
-
**Current performance status.** Release 5.8.
|
|
151
|
+
**Current performance status.** Release 5.8.22 retains the shared Canonical IR
|
|
138
152
|
path used by `validation` and now passes that same CIR into labelled `data-exposure`
|
|
139
153
|
runs; the no-label path remains parse-free. The one-model-per-declared-label path is
|
|
140
154
|
also retained. These are implementation properties, not duration promises:
|
|
@@ -168,7 +182,7 @@ brew tap haroundominique/sourcecode && brew install sourcecode
|
|
|
168
182
|
# pip / pipx
|
|
169
183
|
pipx install sourcecode # or: pip install sourcecode
|
|
170
184
|
|
|
171
|
-
ask version # ask 5.8.
|
|
185
|
+
ask version # ask 5.8.22 — and, on a build that has aged,
|
|
172
186
|
# how many releases have probably shipped since
|
|
173
187
|
```
|
|
174
188
|
|
|
@@ -649,6 +663,8 @@ Matching endpoints report `policy: "custom"` and drop out of the `no_security_si
|
|
|
649
663
|
|
|
650
664
|
## Documentation
|
|
651
665
|
|
|
666
|
+
- [Product Route](docs/PRODUCT-ROUTE.md) — individual commands, packs, evidence contract and boundaries
|
|
667
|
+
|
|
652
668
|
| Doc | What it covers |
|
|
653
669
|
|-----|----------------|
|
|
654
670
|
| [USER_GUIDE.md](docs/USER_GUIDE.md) | Full command reference, flags, output schema, workflows |
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
> question. All analysis is local and deterministic; see [Privacy](#configuration--privacy)
|
|
11
11
|
> before inspecting a repository whose telemetry policy you need to control.
|
|
12
12
|
|
|
13
|
-

|
|
14
14
|

|
|
15
15
|
|
|
16
16
|
Copyright (c) 2026 Dominique Haroun. All rights reserved. ASK Engine 5.7.0 and
|
|
@@ -30,6 +30,20 @@ Every time an AI coding agent starts a new session, it has to re-parse the repos
|
|
|
30
30
|
|
|
31
31
|
ASK Engine solves this with a persistent structural cache keyed on file content hashes. After the first scan, later invocations reuse pre-built context whenever their command can consume the warmed layers. The repo doesn't change? The cache doesn't expire.
|
|
32
32
|
|
|
33
|
+
## Product route: individual commands and packs
|
|
34
|
+
|
|
35
|
+
ASK Engine keeps individual commands for precise, scriptable questions and adds
|
|
36
|
+
workflow-shaped packs for users who want one consumable result:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
ask pack assessment . --profile prod --output-dir .ask/packs/assessment
|
|
40
|
+
ask pack gate . --since origin/main --output-dir .ask/packs/gate
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
The [Product Route](docs/PRODUCT-ROUTE.md) is normative: ASK focuses on
|
|
44
|
+
deterministic evidence for Java/Spring modernization and safe change. Packs
|
|
45
|
+
compose existing commands; they do not hide or replace them.
|
|
46
|
+
|
|
33
47
|
**The cache is not a performance optimization. It is what makes ASK Engine usable as infrastructure rather than a one-off tool.**
|
|
34
48
|
|
|
35
49
|
---
|
|
@@ -86,7 +100,7 @@ set `ASK_MAX_RSS_MB=<megabytes>`; if the process exceeds it, ASK refuses the
|
|
|
86
100
|
answer with `MEMORY_TOO_LARGE`, including the observed peak and limit. Leave it
|
|
87
101
|
unset, or set it to `0`, to disable the ceiling explicitly.
|
|
88
102
|
|
|
89
|
-
**Current performance status.** Release 5.8.
|
|
103
|
+
**Current performance status.** Release 5.8.22 retains the shared Canonical IR
|
|
90
104
|
path used by `validation` and now passes that same CIR into labelled `data-exposure`
|
|
91
105
|
runs; the no-label path remains parse-free. The one-model-per-declared-label path is
|
|
92
106
|
also retained. These are implementation properties, not duration promises:
|
|
@@ -120,7 +134,7 @@ brew tap haroundominique/sourcecode && brew install sourcecode
|
|
|
120
134
|
# pip / pipx
|
|
121
135
|
pipx install sourcecode # or: pip install sourcecode
|
|
122
136
|
|
|
123
|
-
ask version # ask 5.8.
|
|
137
|
+
ask version # ask 5.8.22 — and, on a build that has aged,
|
|
124
138
|
# how many releases have probably shipped since
|
|
125
139
|
```
|
|
126
140
|
|
|
@@ -601,6 +615,8 @@ Matching endpoints report `policy: "custom"` and drop out of the `no_security_si
|
|
|
601
615
|
|
|
602
616
|
## Documentation
|
|
603
617
|
|
|
618
|
+
- [Product Route](docs/PRODUCT-ROUTE.md) — individual commands, packs, evidence contract and boundaries
|
|
619
|
+
|
|
604
620
|
| Doc | What it covers |
|
|
605
621
|
|-----|----------------|
|
|
606
622
|
| [USER_GUIDE.md](docs/USER_GUIDE.md) | Full command reference, flags, output schema, workflows |
|
|
@@ -141,6 +141,7 @@ The second anchor is the field one, and it carries its own build for the same re
|
|
|
141
141
|
| `mcp` | the shared work | not timed | yes | `snapshot`, `ris`, `cir`, `parse` | Serves the same commands over MCP, with the same layers. |
|
|
142
142
|
| `schema` | nothing | not timed | no | — | Prints registries; reads no repository. |
|
|
143
143
|
| `telemetry` | nothing | not timed | no | — | Not an analysis. |
|
|
144
|
+
| `pack` | the shared work | not timed | no | `cir`, `parse` | Composes existing analyses; the pack adds no separate parser. |
|
|
144
145
|
| `version` | nothing | not timed | no | — | Not an analysis. |
|
|
145
146
|
<!-- END GENERATED -->
|
|
146
147
|
|
|
@@ -11,6 +11,12 @@ and [`MODERNIZATION.md`](MODERNIZATION.md) (the flagship product narrative). CLI
|
|
|
11
11
|
> deterministically, with the source to prove it. Free on normal repos; Pro when the
|
|
12
12
|
> work gets enterprise-scale or automated.**
|
|
13
13
|
|
|
14
|
+
The commercial route is delivered through two packs while preserving every
|
|
15
|
+
individual command: `ask pack assessment` for modernization and risk discovery,
|
|
16
|
+
and `ask pack gate` for recurring change safety in CI. See
|
|
17
|
+
[`PRODUCT-ROUTE.md`](PRODUCT-ROUTE.md) for the normative scope and evidence
|
|
18
|
+
contract.
|
|
19
|
+
|
|
14
20
|
The gating axis is **size + automation**, never capability. Nothing is crippled on Free;
|
|
15
21
|
you pay exactly when the tool is replacing the most engineering time — a monolith above
|
|
16
22
|
**500 Java source files**, or CI/CD automation. **€19/mo · €190/yr, per developer.**
|
|
@@ -16,7 +16,73 @@ The facts these rows are keyed to are published: `ask schema facts-v1` prints th
|
|
|
16
16
|
|
|
17
17
|
## Current Synchronization
|
|
18
18
|
|
|
19
|
-
**Latest attached audits — audit of release `5.8.
|
|
19
|
+
**Latest attached audits — audit of release `5.8.21`, 2026-08-22, two independent rounds,
|
|
20
|
+
and the first pass whose queue is led by regressions the previous queue's own fixes
|
|
21
|
+
introduced.** Round A (MSAS, `banyan-v2` @ `3dde0376`, the same subject bit for bit for the
|
|
22
|
+
fifth consecutive round — 107 invocations, 43 commands) scores **7.77/10** against 8.17 on
|
|
23
|
+
the same seven-axis rubric. Round B (the 16-repository bank, ~120 invocations, targeted
|
|
24
|
+
verification rather than a blind sweep) scores **8.6/10** against 8.0 and its verdict is
|
|
25
|
+
**adopt**: it closes **20 of its 30 rows** verified from outside, inside 24 hours. Both
|
|
26
|
+
numbers are right, because they measure different things — Round B measured what the tenth
|
|
27
|
+
pass closed, Round A measured what the closing broke. **The analysis is again not what
|
|
28
|
+
fell**: zero content drift on the monolith for the fifth consecutive round (3 763 endpoints,
|
|
29
|
+
census 3763/3872/1120, 373 findings / 94 defects / 43 003 symbols, all identical), 7 of 7
|
|
30
|
+
controls exact in the bank, zero unauthorised writes over 17 trees.
|
|
31
|
+
|
|
32
|
+
**Three rows lead the queue and two of them are regressions.** `AUD-597-R01`: `ask --help`
|
|
33
|
+
went from **0.6 s to 177.4 s** — ×295, and 45.6 s in a directory with no Java in it —
|
|
34
|
+
localised here to **248 rebuilds of the Click command tree in one process**, not to imports
|
|
35
|
+
and not to the repository census. `AUD-597-R02`: `selftest` decodes its children's UTF-8
|
|
36
|
+
with the host locale, so on Windows three of eleven rows die with tracebacks and the command
|
|
37
|
+
**exits 0** — a CI gate reads it as green. `AUD-597-X01` is the precondition that makes the
|
|
38
|
+
rest of this pass unfalsifiable: `build_commit` reads `unrecorded` for the seventh
|
|
39
|
+
consecutive report, the release carries no tag, and the field's *"`_meta` absent from 18 of
|
|
40
|
+
18 payloads"* **does not reproduce at HEAD** — the envelope stamps `content_id` and `memory`
|
|
41
|
+
on 3 of 3 measured — so *"the fix does not work"* and *"the artefact predates the fix"*
|
|
42
|
+
cannot be told apart from outside. Details, with the measurements, in the eleventh-pass
|
|
43
|
+
section below.
|
|
44
|
+
|
|
45
|
+
**Queue status after 5.8.22: the eleventh pass is closed entire — all fourteen rows, one
|
|
46
|
+
commit each, regressions first.** `AUD-597-R01` · `AUD-597-R02` · `AUD-597-R03` ·
|
|
47
|
+
`AUD-597-X01` · `AUD-597-A01` · `AUD-597-A02` · `AUD-597-A03` · `AUD-597-A04` ·
|
|
48
|
+
`AUD-597-D01` · `AUD-597-D02` · `AUD-597-D04` · `AUD-597-D05` · `AUD-597-D06` ·
|
|
49
|
+
`AUD-597-D07` are closed; `AUD-597-D03` was already closed by `e132458`. Suite **12 176
|
|
50
|
+
passed, 36 skipped, 0 failed**, with no regression at any step.
|
|
51
|
+
|
|
52
|
+
**Four reported mechanisms are corrected against measurement, and one is refuted outright.**
|
|
53
|
+
`AUD-597-R01` is **not** the memoisation key: the root help is *recursive* through the
|
|
54
|
+
Typer→Click conversion, so one `--help` entered the wrapper 249 times and no `lru_cache`
|
|
55
|
+
keyed on anything could have helped — it records on return and the re-entry precedes the
|
|
56
|
+
first return. `AUD-597-R03`'s proposed remedy was already in force (`declare_cap` returns
|
|
57
|
+
early on an uncut list); the mechanism is that the ~640 B disclosure outweighed the rows it
|
|
58
|
+
replaced. `AUD-597-A03` is **not the pool**: `next(iter(ann_set & _BEAN_ANNOTATIONS))` picks
|
|
59
|
+
out of a set of strings, so the bean population moved with the **per-process hash seed** —
|
|
60
|
+
`PYTHONHASHSEED=0` dropped a bean that seeds 1-7 kept — which is membership rather than
|
|
61
|
+
order, and is why `endpoints` was byte-identical beside it under `--no-cache --jobs 2`. And
|
|
62
|
+
two thirds of `AUD-597-A01`'s field reading **does not reproduce at HEAD**: `endpoints .`
|
|
63
|
+
and `spring-audit .` both carry `--compact` here; only `risk .` did not.
|
|
64
|
+
|
|
65
|
+
**One half is refused with its price, and one claim is withdrawn.** `AUD-597-D01` does not
|
|
66
|
+
give `migrate-check` and `migrate-apply` a `--ci`: they are `advisory_only`, the run always
|
|
67
|
+
completes, so a completeness gate on them can only ever exit 0 — a gate that cannot fail,
|
|
68
|
+
published as a gate, which is `AUD-596-X01`'s own shape turned around. The help stops
|
|
69
|
+
calling the variable a deadline on them instead. And `AUD-597-A04` withdraws a claim of this
|
|
70
|
+
ledger's own: `AUD-596-D12` was listed as verified closed from outside beside `AUD-596-D11`
|
|
71
|
+
and `AUD-596-D03`, and it is not — its cell reading `open` was right, and its residue is
|
|
72
|
+
`AUD-597-D02`.
|
|
73
|
+
|
|
74
|
+
**Two defects were found by the work rather than by the report.** `AUD-597-D05`'s guard
|
|
75
|
+
measured a Hamming count and not an edit distance, so `--compct` against `--compact` scored
|
|
76
|
+
3 and the one-character typo it exists for was being discarded while Click's own unguarded
|
|
77
|
+
suggester answered `--path` with `--depth`; and `AUD-597-D06`'s slot arithmetic read option
|
|
78
|
+
arity from `_OPTIONS_WITH_VALUE`, a partial hand list, so `--limit 2`'s value counted as a
|
|
79
|
+
positional and made an empty slot look full. **A residual of `AUD-596-D11` is closed with
|
|
80
|
+
them**: that row shipped its correct rule — grammar (Click/Typer) = 2, semantics = 1 —
|
|
81
|
+
without the batteries that assert it, so **23 tests had been red since 2026-08-22** against
|
|
82
|
+
the binary that fixed them. `error_schema.EXIT_CODE_FOR` is the table the row asked for, and
|
|
83
|
+
the assertions read the code and the exit status from it together.
|
|
84
|
+
|
|
85
|
+
**Previous attached audits — audit of release `5.8.20`, 2026-08-21, two independent rounds,
|
|
20
86
|
and the first pass since the sixth to open a `P1`.** Round A (MSAS, `banyan-v2` @
|
|
21
87
|
`3dde0376`, 3 342 Java files — the same subject bit for bit for the fourth consecutive
|
|
22
88
|
round — 44 commands, 110 invocations) scores **8.17/10 under a new seven-axis rubric that
|
|
@@ -52,7 +118,7 @@ not a release, and the absolute figures differ from the report's by ~3x on *ever
|
|
|
52
118
|
which is a machine. What the row asked for as its own precondition did ship: `migrate-check`
|
|
53
119
|
now publishes per-phase `timings` accounting for 99.4 % of its clock, so the next such claim
|
|
54
120
|
is checkable from the payload instead of from a stopwatch. `B24` closes with it on the same
|
|
55
|
-
call site. `AUD-596-B01` and `AUD-596-A01` closed in full, and `A01` turned out to be
|
|
121
|
+
call site. `AUD-596-B01` and `AUD-596-A01` closed in full, and `AUD-596-A01` turned out to be
|
|
56
122
|
**inflation and not only drift** — 683 published where 668 beans exist. `AUD-596-B02` closed
|
|
57
123
|
the figure that carried the severity (0 → 173) and **deliberately did not take** the half
|
|
58
124
|
that would have collapsed the remaining 158/173 delta: measured, that change costs
|
|
@@ -62,7 +128,8 @@ claim (`validation` 198) is corrected against source: it is a different populati
|
|
|
62
128
|
payload already names. Details, with the numbers, in each row below.
|
|
63
129
|
|
|
64
130
|
**Second batch after 5.8.21: the eleven `P2` rows and four of the fourteen `P3`s are
|
|
65
|
-
closed, one commit each — fifteen rows, `B16` · `B03` · `B10` ·
|
|
131
|
+
closed, one commit each — fifteen rows, `AUD-596-B16` · `AUD-596-B03` · `AUD-596-B10` ·
|
|
132
|
+
`AUD-596-A03` · `AUD-596-X01` · `AUD-596-B06` ·
|
|
66
133
|
`B07` · `A02` · `A04` · `X02` · `B09` · `D05` · `D07` · `D13` · `D02` — with the suite at
|
|
67
134
|
**11 410 passed, 22 skipped, 0 failed** and no regression at any step.** Three closures
|
|
68
135
|
carry a **refusal with its price** rather than a half-made change: `X02` does not serve a
|
|
@@ -85,10 +152,18 @@ is not an invalid budget (`B03`), `stack_fit` is *absent* rather than `null` (`D
|
|
|
85
152
|
(`B09`). `B07` is the only closure verified across a **37-repository corpus**: 5 project
|
|
86
153
|
summaries changed, all from junk to the project's own description, 32 unchanged.
|
|
87
154
|
|
|
88
|
-
**No D rows remain open.** `D01`, `D03`, `D08`,
|
|
89
|
-
closed on 2026-08-22 by the fix commits
|
|
90
|
-
|
|
91
|
-
|
|
155
|
+
**No D rows of the tenth pass remain open.** `AUD-596-D01`, `AUD-596-D03`, `AUD-596-D08`,
|
|
156
|
+
`AUD-596-D10`, `AUD-596-D11` and `AUD-596-D14` were closed on 2026-08-22 by the fix commits
|
|
157
|
+
recorded in their rows. `AUD-596-D04`, `AUD-596-D06` and `AUD-596-D09` were already closed
|
|
158
|
+
by commits `040f027`, `784cd83` and `fd3d63f`. `AUD-596-D12` is the exception and carries
|
|
159
|
+
forward: face (1) closed by `e132458`, the both-arguments hint survived it, and that residue
|
|
160
|
+
is `AUD-597-D02`. The third face of `AUD-596-X02` and the rule half of `AUD-596-B09` remain
|
|
161
|
+
refused above with their measurements rather than left silent.
|
|
162
|
+
|
|
163
|
+
Every id in this paragraph is spelled pass-qualified on purpose: `D01` matches three passes
|
|
164
|
+
and `D04` matches three, so the short form is a claim no reader and no assertion can check
|
|
165
|
+
against a cell. That is `AUD-597-A04`, and the rule is enforced from
|
|
166
|
+
`tests/test_ledger_row_status_matches_its_section_x04.py`.
|
|
92
167
|
|
|
93
168
|
**Two reported mechanisms are corrected before filing, and half of one row is refuted.**
|
|
94
169
|
`migrate-check` does not *"appear in the budget authority and implement nothing"*: two tiers
|
|
@@ -170,9 +245,14 @@ itself rather than merely under-declaring.
|
|
|
170
245
|
**Release status:** entries marked “pending `5.8.14`” in their historical wording are
|
|
171
246
|
shipped in `5.8.14`; the correction battery fixes listed above are included in `5.8.15`.
|
|
172
247
|
|
|
173
|
-
**Current release:** `5.8.
|
|
174
|
-
|
|
175
|
-
|
|
248
|
+
**Current release:** `5.8.21` closes the whole tenth-pass queue — thirty rows over two
|
|
249
|
+
batches, one commit per row, suite green at every step (11 410 passed, 22 skipped) — and is
|
|
250
|
+
the release the eleventh pass audits. Its own queue is the eleventh-pass section below, and
|
|
251
|
+
**it is not released**: the release commit `bcb9e4d` sits on `fix/p01-no-confident-zero`
|
|
252
|
+
with no `v5.8.21` tag and no merge to `master`, which is half of `AUD-597-X01`. `5.8.19`
|
|
253
|
+
before it closed the whole ninth-pass queue with the suite green end to end — 11 008
|
|
254
|
+
passing, and the pre-existing `B29` failure the release before it shipped with is gone.
|
|
255
|
+
`5.8.18` before it closed the eighth-pass queue. `5.8.17` before it carried the seventh-pass queue;
|
|
176
256
|
`5.8.16` before that carried two post-audit
|
|
177
257
|
corrections: compact cold-start identity is preserved for `no_ris`, and manifest-cache keys
|
|
178
258
|
include Python requirements files. The testing-repository hygiene exercise changed no
|
|
@@ -195,6 +275,120 @@ with neither parseable stdout nor its requested artifact) or `BUG-6`
|
|
|
195
275
|
queue position. `BUG-1` and `BUG-5` gain witnesses on public OSS repositories, recorded
|
|
196
276
|
under their own rows rather than as new ones.
|
|
197
277
|
|
|
278
|
+
### Eleventh Audit Pass: `5.8.21` findings / MSAS (round A) + 16-repository bank (round B) / 2026-08-22
|
|
279
|
+
|
|
280
|
+
**Open queue.** Ordered as the correction order is: the two regressions first, then the
|
|
281
|
+
precondition that makes every other verdict in this pass unfalsifiable, then the residuals
|
|
282
|
+
of a fix that stopped at its first instance, then declaration. Round A's ids are `ASK-*`,
|
|
283
|
+
Round B's are `N-*`; where both rounds found one defect the row carries both, and a finding
|
|
284
|
+
that is a new witness for a row this ledger already holds is named in *Mapped, not new*
|
|
285
|
+
below rather than filed twice.
|
|
286
|
+
|
|
287
|
+
**Scores.** Round A: **7.77/10** against 8.17, same seven-axis rubric, same subject bit for
|
|
288
|
+
bit for the fifth consecutive round (107 invocations, 43 commands). Round B: **8.6/10**
|
|
289
|
+
against 8.0, same rubric, same 16-repository bank (~120 invocations), and its verdict is
|
|
290
|
+
**adopt** — it closes 20 of its 30 rows verified from outside in 24 hours. The two numbers
|
|
291
|
+
move in opposite directions and both are right: Round B measured *what the queue closed*,
|
|
292
|
+
Round A measured *what the closing broke*. **The analysis is not what fell.** Round A
|
|
293
|
+
records zero content drift for the fifth consecutive round — 3 763 endpoints, 725
|
|
294
|
+
`no_security_signal`, census 3763/3872/1120, `repo_id 7fced5c877cacfc5`, 373 findings / 94
|
|
295
|
+
defects / 43 003 symbols, all identical — and Round B verifies 7 of 7 controls exact,
|
|
296
|
+
including `population_total mall` = 519 against `find`. What fell is everything around the
|
|
297
|
+
analysis, and it has one shape: **every new regression is in code that was touched to close
|
|
298
|
+
a row from the tenth pass.**
|
|
299
|
+
|
|
300
|
+
**The pass's own headline is corrected here, and the correction is the most important thing
|
|
301
|
+
in this section.** Round A reports `_meta` absent from **18 of 18** payloads and reads that
|
|
302
|
+
as a fix wired to nothing (`ASK-META-001`). Measured at HEAD on three of the named payloads
|
|
303
|
+
— `endpoints --compact`, `posture`, root `--compact` — **`_meta` is present with
|
|
304
|
+
`content_id`, `content_id_basis`, `memory`, `repo_id`, `git_head`, `scope` and
|
|
305
|
+
`answer_bounds`**, so the seam is wired and the hypothesised silent bail-out is not what the
|
|
306
|
+
field saw. What the field saw is consistent with an **artefact older than the commits that
|
|
307
|
+
wired it** (`f6ae10e` … `493e796`, all ancestors of the release commit `bcb9e4d`). Nobody can
|
|
308
|
+
tell those two apart from outside, because `build_commit` reads `unrecorded` for the seventh
|
|
309
|
+
consecutive report — which is why `AUD-597-X01` leads the P1s rather than sitting in the P3
|
|
310
|
+
hygiene block where six passes have left it.
|
|
311
|
+
|
|
312
|
+
**What the queue does not contain.** Zero unauthorised writes across 17 trees, verified with
|
|
313
|
+
`git status --ignored --short` before and after in both rounds; zero content regressions in
|
|
314
|
+
either round; the refusal of the confident zero holds on four commands for the fifth round
|
|
315
|
+
(`risk_level: "UNKNOWN"`, `answered: false`, `risk_score: null`, `counts_are_floor: true`);
|
|
316
|
+
`spring-audit --ci`, `risk --ci` and `audit-report --ci` verified returning **75** on a cut
|
|
317
|
+
run, which is `AUD-596-X01` closed from outside. The single traceback file in 107
|
|
318
|
+
invocations is `AUD-597-R02`, and it is the first in five rounds.
|
|
319
|
+
|
|
320
|
+
| ID | Severity | Current status | Required direction |
|
|
321
|
+
| --- | --- | --- | --- |
|
|
322
|
+
| `AUD-597-R01` / `ASK-PERF-001` | **P1 — regression, and it is the first command an evaluator runs** | **closed 2026-08-22 (`6910054`).** Reproduced here at 13.3 s and **the mechanism is not the memoisation key: the root help is recursive through the Typer→Click conversion.** `get_command(app)` runs the preprocessing wrapper, which composes the root help, which asks `_bounded_invocation` for each front-page line's flag, which asks for `get_command(app)` again — one `--help` entered the wrapper **249 times**. The `lru_cache` could not have helped whatever it keyed on: it records a result on return and the re-entry happens before the first call returns. The conversion is a property of the program, so it is paid once per process and every consumer is handed the same object; what stays per invocation is the help text and the `[Pro]` badges, re-applied from the parameter help Typer declared rather than appended to the live string, so a process that acquires a licence mid-run loses the badge exactly as before. A re-entrancy flag stops the composition composing a second page under itself. `reproduced_on`: this repository, 52 Java files — **13.3 s → 0.45 s**, one conversion per page, 249 → 1. The absolute assertion ships: `ask --help` under 2 s through a real process, in an empty tree and in one with Java in it, plus the mechanism itself. MSAS not re-measured — closed against this checkout and the fixture tree. *Original note:* **open.** `ask --help` went from **0.6 s to 177.4 s** on MSAS (measured twice, 168.4 s under load and 177.4 s without) and **45.6 s in a directory with no `.java` in it**, ×295. `ask endpoints --help` stays at 0.5 s, so it is the root page alone. **Reproduced and localised at HEAD, and the mechanism is not the one the report hypothesised**: 13.7 s wall in this repository (52 Java files), of which imports are **0.18 s** (`-X importtime`), so it is not module loading. `cProfile`: `_bounded_invocation` (`cli.py:489`) is entered **248 times** and `_start_here_block` (`cli.py:535`) 245, and each call runs `typer.main.get_command(app)` — **21 965 `get_command_from_info`, 77 841 `get_params_from_function`, 546 117 forward-ref evaluations, 26.3 s of the 27.8 s under profile**. The `functools.lru_cache` on `_bounded_invocation` keys on the *invocation string*, so it memoises nothing across the five distinct lines the front page renders, and the tree is rebuilt per line. This is the same non-memoised `get_command(app)` that took the test suite from 125 s to over 900 s, now on the product's front door. | Build the Click tree **once per process** and hand it to every consumer that needs a parameter list — `_bounded_invocation`, `_start_here_block` and `output_ceiling._leaf_from_argv` all want the same object. The regression assertion is absolute, not relative, and belongs in the release battery: `ask --help` under **2 s** in a repository with no Java in it, and under 2 s on the fixture tree. |
|
|
323
|
+
| `AUD-597-R02` / `ASK-ENC-001` | **P1 — regression, Windows, and it makes a CI gate green over three unrun rows** | **closed 2026-08-22 (`ce6dac1`).** All three parts. (1) `encoding="utf-8", errors="replace"` at the `subprocess.run` the row names. (2) A stream that is not a string reads as no document, never as a `TypeError`. (3) `summary.error > 0` exits **75** — the code the product already reserves for *"the gate did not finish"* — while a `fail` stays an answer and stays 0. The self-referential row ships as `AUD-597-R02` in `selftest.ROWS`: it drives `selftest --rows B6` and reads both halves, no row in `error` and an exit code that agrees with the summary; one named child row is what stops the recursion. Not re-measured on Windows — closed against the mechanism and a fixture that reproduces the decode end to end. *Original note:* **open.** `selftest .` returns **rc=0** with **3 of 11 rows in `error`**, 2 458 B of stderr and **three Python tracebacks** — the first tracebacks in five rounds, against *"0 tracebacks"* as a measured property of the four before it. `UnicodeDecodeError: 'charmap' codec can't decode byte 0x9d in position 148984`. **Confirmed in source**: `selftest.py:96-97` runs `subprocess.run(argv, capture_output=True, text=True, timeout=…)` with **no `encoding=`**, so the child's UTF-8 output is decoded with `locale.getpreferredencoding()` — `cp1252` on the audit host. The reader thread dies, `capture_output` leaves the stream `None`, and `json.loads(None)` at `:103` raises the `TypeError` the row publishes as `observed`. Exactly the three repository-wide rows fail, because only their payloads reach the failing offset — and they are the identity and contract rows (`AUD-590-B01`, `B6`, `ASK-16`). Every ASK note carries an em dash, so the mechanism is deterministic by construction. | Three parts, and the first is one line. (1) `encoding="utf-8", errors="replace"` at `selftest.py:96-97`. (2) `stream is None` produces a `fail` naming the cause, never an `error` carrying a `TypeError` — a row that could not be evaluated is not a row that passed. (3) **`summary.error > 0` must not exit 0**; the product already reserves `75` for *"could not run"* and this is that case. Add the self-referential row the report asks for: a `selftest` row asserting `summary.error == 0`. |
|
|
324
|
+
| `AUD-597-X01` / `ASK-BUILD-001` + `ASK-META-001` / `B-12` | **P1 — the precondition, seventh consecutive report, and this pass is what it costs** | **closed 2026-08-22 (`354338b`).** The reader, the writer and the hook were all already in the tree; the wheel shipped without the file. Hatchling selects a wheel's contents through the VCS ignore rules and `src/sourcecode/_build_commit.py` is in `.gitignore` — correctly, it is generated — and nothing had reconciled the two facts. `artifacts` in the wheel target is the declaration for exactly that. `reproduced_on`: a wheel built from this checkout — **stamp ABSENT → `sourcecode/_build_commit.py`, `BUILD_COMMIT = 'c57e50b…'`**. The assertion is made against the artefact, which is the lesson of seven reports: the previous battery asserted the writer and the reader's precedence, both were true, and the wheel was still empty. It now builds the wheel and reads inside it — the module is present, the value is a 40-character object name, it is the HEAD the build ran against, and an install of that wheel reports it with `ASK_BUILD_COMMIT` cleared. **Still outstanding and not a code change: the release carries no tag and is not merged to `master`.** *Original note:* **open.** `build_commit: "unrecorded"`. The reader ships (`product_info.py:26-48`), the writer ships as importable code (`build_stamp.py`), and `<pkg>/_build_commit.py` — the only one of the three sources that can work inside an installed wheel — is not in the package. **This round is the bill.** Four rows were declared `closed 5.8.21` with a commit hash and two of them reproduce in the field; `_meta` is absent from 18 of 18 field payloads and **present at HEAD on 3 of 3 measured**; the release commit `bcb9e4d` is on `origin/fix/p01-no-confident-zero` and there is **no `v5.8.21` tag** (the newest tag is `v5.8.2`) and no merge to `master`. Nobody outside — and nobody inside — can say which tree the audited artefact was built from, so *"the fix does not work"* and *"the binary does not carry the fix"* are indistinguishable, in both directions. | Stamp the commit at build time and prove it from the built wheel, not from the checkout: a post-packaging smoke test that installs the wheel and imports `sourcecode._build_commit`, asserting `BUILD_COMMIT != "unrecorded"`. Until it exists, **no row may be filed `closed` with a commit hash** — the hash is a claim about an artefact nobody can identify. Tag the release, and publish the tag with it. |
|
|
325
|
+
| `AUD-597-R03` / `ASK-UX-002` | **P2 — regression, and it is monotone in the wrong direction for an agent** | **closed 2026-08-22 (`c57e50b`).** **One report claim corrected against source**: the proposed remedy — emit a `*_cap` block only when `omitted > 0` — was already in force, `declare_cap` returns early on an uncut list, so that was not the mechanism. The mechanism is the disclosure: each cut declares itself with the registered `cap_effect` prose, ~640 B of it, so five cuts over five short lists bought back less than the five disclosures cost. `reproduced_on`: smallest reproduction here, **195 B → 2 103 B**. The trade is now measured at each cut — a list is emptied when the rows removed weigh more than the disclosure that replaces them — and `--compact` asks for the smallest honest answer, so where cutting cannot make the answer smaller, not cutting it *is* the smaller answer. Where a cut is declined the payload says so, paid out of what the accepted cuts saved, so the sentence can never take the answer back over the unbounded one. `--limit N` never takes this trade: a caller who names a number asked for a shape. The invariant ships over the whole bounded-flag population read off the registry — every shape × both vocabularies × four bounds, plus `compact_document`. *Original note:* **open.** On the repository where the row was reported, `--compact` now makes the answer **larger**: `posture . --diff dev:prod` estimates 284 464 B, and the same command with `--compact` estimates **287 454 B** (+2 990 B, +0.9 %), both refusing with `OUTPUT_TOO_LARGE`, 2/2 byte-identical estimates per form. In 5.8.20 the flag was a no-op there (284 464 B both ways), so the fix that closed `AUD-596-X02` face (2) turned a no-op into a cost. The mechanism is the disclosure: widening `POSTURE_BOUNDED_LISTS` to `undecided`, `no_rule_matched` and three `chains/*_files` lists brought their `*_cap` blocks with them, and on a repository whose large population is **not** in those lists the disclosure is paid and the trim is never earned. The closing measurement was taken on thingsboard (38 775 → 31 701 B) and the reporting repository was not re-measured — the same failure as `AUD-597-A04`. | Two parts, both already doctrine here. (1) Emit a `*_cap` block only when `omitted > 0`; `interface_mediated_callers_cap` already returns `null` below its threshold, so the pattern exists and is not being applied uniformly. (2) Add the monotonicity invariant to the `ASK-10` battery over the **whole** bounded-flag population, not over `posture`: *a bounded payload is never larger than the unbounded one it replaces*. It is one assertion and it would have caught this before release. |
|
|
326
|
+
| `AUD-597-A01` / `ASK-UX-001` + `N-01` | **P2 — a declared closure the field contradicts, and it is a new class** | **closed 2026-08-22 (`f8cf061`).** **Two thirds of the field reading does not reproduce at HEAD**: `endpoints .` and `spring-audit .` both carry `--compact` here, measured — that they did not in the field is `AUD-597-X01`, not this row. What does reproduce is `risk .`, and the cause is the narrowing: `_bounded_invocation` appended one literal. The value is typed rather than the flag skipped — `output_ceiling` publishes each flag *as typed* beside the vocabulary it already owns, so a count flag arrives with a first-look count and the line stays pasteable. `reproduced_on`: `risk .` → `risk . --limit 20`, and the comment column is padded from the longest line actually rendered, so `--compact# effective access` is gone. A command declaring nothing bounding no longer sits under *"Runs now"* at all. Asserted as a population: every line carries its own command's flag, every line parses through the parser it is recommended to, no line under *"Runs now"* is unable to bound itself. *Original note:* **open, and half of it landed.** `AUD-596-X02` face (1) is filed `closed 5.8.21 (f6ebf50)` naming two lines it would fix. **Measured at HEAD**: `posture . --diff dev:prod --compact` and `migrate-check . --compact` carry their flag, so the mechanism is real — and **`endpoints .`, `spring-audit .` and `risk .` are still recommended unbounded** under *"Runs now"*, on a page whose own next sentence claims *"each line above carries the flag its command declares"*. `endpoints .` refuses at ~612 K estimated tokens on MSAS. In the field neither line carried a flag, which is `AUD-597-X01` again. **A second defect is visible in the same block at HEAD**: the comment column is not aligned on the line the fix lengthened — `posture . --diff dev:prod --compact# effective access, two profile sets`, with no space before the `#`. | `_bounded_invocation` returns the invocation unchanged when the only bounding flag it finds is not `--compact`, and `endpoints`/`spring-audit`/`risk` are exactly that case. Take the flag each command **declares** — the same intersection the refusal offers — rather than the one literal the function special-cases, and if a command declares none, the line does not belong under *"Runs now"*: move it to the budgeted block with its ceiling. Pad the comment column after the substitution, not before. Assert over the front page as a population: **every line under "Runs now" runs**, on the largest fixture available. |
|
|
327
|
+
| `AUD-597-A02` / `ASK-UX-008` + `ASK-DOC-002` | **P2 — the most destructive command in the product cannot be previewed** | **closed 2026-08-22 (`9d47a4c`).** One authority, two consumers, as the row asks. `_BOUNDING_FLAGS` was a vocabulary of *flags*; `_BOUNDING_MODES` sits beside it and is intersected with the command's declared options the same way, so nothing branches on a command name. `reproduced_on`: `export . --c4` now offers `--by-directory`, `--module-graph`, `--integrations` instead of the sentence reserved for a command that declares nothing smaller — which is still printed where it is true. `rename-class` gets the `--summary-only` its sibling `repo-ir` already has: the weight of a dry run is entirely in the per-file diffs, the plan is the file list, so a dry run prints the plan and declares the diffs omitted, `--full-plan` puts them back inline, `--output` takes the whole audit. The smaller view names exactly the files the full one does — asserted, because a preview that is not the plan is worse than no preview. *Original note:* **open.** `rename-class … --dry-run` on MSAS refuses with `OUTPUT_TOO_LARGE`: **2 427 925 estimated tokens, 9 711 702 B**, `hint_basis: {"declared_flags": [], "context_found": false}`, and a hint that reads *"No smaller inline variant is available with the current flags"*. 2/2, both argument forms. The root help lists `rename-class` as the command that rewrites sources without `--dry-run`, so the only safe way to inspect it is the one that cannot print. `export . --c4` is the same defect in the same authority: 385 794 tokens, `declared_flags: []`, the same *"no smaller variant"* sentence — **while `export .` itself advertises `--by-directory` / `--module-graph` / `--integrations`**. Confirmed in source: `output_ceiling._BOUNDING_FLAGS` is a seven-entry **flag** vocabulary (`--compact`, `--summary-only`, `--limit`, `--top-n`, `--min-severity`, `--max-nodes`, `--max-edges`), and a command whose smaller answer is a **mode** rather than a flag is invisible to it. | One authority, two consumers. Teach the ceiling that a command can declare a smaller *mode*, so `export`'s three sections reach `declared_flags` and *"no smaller inline variant"* is only ever printed when the basis says `none`. Then give `rename-class` the `--summary-only` its sibling `repo-ir` already has (25 386 K tokens → 73 783 B): file count, occurrence count, file list without bodies — and make `--dry-run` use it by default, with the full plan behind `--output`. |
|
|
328
|
+
| `AUD-597-A03` / `ASK-DET-001` | **P2 — a `P1` filed closed that reproduces 5/5 on the repository that reported it** | **closed 2026-08-22 (`4c7622a`).** **The row's hypothesis is refuted with a measurement: it is not the pool.** `BeanGraph.build` chose a class's stereotype with `next(iter(ann_set & _BEAN_ANNOTATIONS))` — a pick out of a set of *strings*, whose iteration order changes with the per-process hash seed. A class annotated `@Entity` and `@Component` resolved to `entity` in some processes and `component` in others, and `spring_beans()` excludes the JPA stereotypes, so the bean left the population on the run where the seed went the other way. `reproduced_on`: `PYTHONHASHSEED=0` → `['com.x.Plain']`, seeds 1-7 → `['com.x.Mixed', 'com.x.Plain']`. Membership, not order, which is why `AUD-596-A01` ordering the population at close could not reach it — and it explains what the row could not: `endpoints` is byte-identical including under `--no-cache --jobs 2` because nothing on that path picks out of a set, and the worker count never entered into it. The three picks take a declared rank now: every Spring stereotype outranks every JPA one, and within Spring the more specific wins. Asserted in new interpreters — eight seeds over the container, six over the whole `posture` payload. MSAS not re-measured; closed against the mechanism, which is seed-dependent rather than repository-dependent. *Original note:* **open.** `posture . summary.population_total` alternates between **1908 and 1904** over five sequential runs on an unchanged tree, warm cache, same `tree_state` — 3/5 give 1908, 2/5 give 1904, with `conditional_beans` fixed at 5 and active/inactive/unresolved fixed at 3/2/0, and **all five payloads weigh exactly 143 271 B**. `AUD-596-A01` is filed `closed 5.8.21 (fa508b4)` on a real and correctly diagnosed defect — node duplication, 683 published where 668 beans exist — measured after on shenyu and halo. **Inflation and membership are two defects.** Ordering the population at close removes duplicates; it does not make the same set arrive. That `endpoints` is byte-identical across runs, including under `--no-cache --jobs 2`, places it in the Spring container build rather than in the route index or in the pool at large. | Make the **set** deterministic, not only its order: collect bean definitions into a map keyed by `(fqn, file, line)` fed by every worker, and do not close the population until the pool is drained. Assert that the worker count does not change the set (`--jobs 1 2 4 8 19`), and assert it **on MSAS-shaped input** — six runs, one value. The row was reported there; per `AUD-597-A04` it cannot close anywhere else. |
|
|
329
|
+
| `AUD-597-A04` / `ASK-LEDGER-001` | **P2 — the ledger is the product's strongest commercial argument and it is currently wrong in both directions** | **closed 2026-08-22 (`46fb870`).** The seven cells were corrected in place with the entry. The durable half is the widened assertion, and it needed widening twice over: `AUD-594-X04` reads only the preamble of a section *headed* "closed in X" while the declaration lives in *Current Synchronization*, and it matches ids literally while the prose writes `D01` where the cell carries `AUD-596-D01`. Two assertions now: a row named in a closure-declaring sentence anywhere in this document does not read `open`; and a closure declaration names its rows unambiguously, because `D01` matches three passes and `A03` four. `reproduced_on`: both fired on the live ledger. Four declarations corrected — three short ids spelled pass-qualified, and one claim **withdrawn as an overclaim**: `AUD-596-D12` was listed as verified closed from outside beside `D11` and `D03` and is not, its cell reading `open` was right, and its residue is `AUD-597-D02`. *Original note:* **open, and the shipped copy is corrected in this repository as part of this entry.** The 5.8.21 ledger marks `open` two rows that its own binary closed (`D03`, `D11`) and `closed` two that reproduce (`A01`, `X02`). Verified here and worse than reported: **six** rows — `D01`, `D03`, `D08`, `D11`, `D12`, `D14` — still read `open` while their fix commits (`f6ae10e`, `8c46967`, `b396c6a`, `f4b4f77`, `e132458`, `10f2827`) are ancestors of the release commit, and the section preamble already claimed them closed; `D10` cited `10f2827`, which is `D14`'s commit, and its own are `dabcc95` + `493e796`. All seven cells are corrected in place. `AUD-594-X04` is the same class in the pessimistic direction and its assertion only polices sections headed *"closed in X"*, which this one is not. | The durable half is the **closure criterion**, and it is the root cause shared by `AUD-597-R03`, `AUD-597-A01`, `AUD-597-A03` and `ASK-META-001`: four fixes correct in their own frame, verified against a fixture or another repository, none re-measured where the defect was reported. A row carries `reproduced_on` — the original repro command and its post-fix output — or it closes as *"closed against fixture / another repository; original witness not re-measured"*, which is honest and sufficient. Widen the `X04` assertion so a row whose preamble declares it closed cannot ship reading `open`, whatever the section heading says. |
|
|
330
|
+
| `AUD-597-D01` / `B-04` | **P3 — the asymmetry `AUD-596-X01` closed for two of three** | **closed 2026-08-22 (`1094e6a`), and half of it is refused with its price.** The missing flag is the second step: the help told the reader `migrate-check` has a deadline. Every surface rendered the eight-command population as *"deadline for …"* and three of them have one. `migrate-check` and `migrate-apply` are `advisory_only` — the run always completes — so a completeness gate on them can only ever exit 0 and `--allow-partial` would name a state that cannot occur: shipping them is `AUD-596-X01`'s own shape turned around, a gate that cannot fail published as a gate. Making them gate for real means making them phase runners, which is `B24`'s first acceptance half. What ships: `analysis_budget.budget_tiers()` splits the population with `phased_run.budget_scope()` — the function that has answered this since `b62d840` — so the help reads *"deadline for spring-audit, risk, audit-report — advisory only (the run completes) for …"*, and neither tier can be named without the other. The gating flags are asserted over `BUDGET_RUNNER_COMMANDS`: every member declares both, nothing outside it declares `--allow-partial`, and the flag is spelled once in `cli.py`. *Original note:* **open.** `ASK_MAX_ANALYSIS_SECONDS=1 migrate-check . --ci` → **rc=2**, `INVALID_USAGE: No such option: --ci (Possible options: --copy, --dir)`; without the flag, 20 770 ms against a 1 s budget, rc=0, no `_partial`. `spring-audit`, `risk` and `audit-report` all return 75 now, so the pattern is proven and shared — and the root help enumerates **eight** commands bounded by the variable, of which `migrate-check` and `migrate-apply` still cannot fail a pipeline over an incomplete inventory. | The flags come from the shared factory (`AUD-596-X01` already built it) applied over the canonical tuple, not command by command — three facts, three decorators is how this row was born. Parameterise the assertion over `analysis_budget.BUDGETED_ANALYSIS_COMMANDS`, never over a list kept by hand. |
|
|
331
|
+
| `AUD-597-D02` / `ASK-DOC-001` | **P3 — one call site, and it is confirmed live at HEAD** | **closed 2026-08-22 (`ecb1bb7`).** Two rejections are two messages. The one that says *"pass both halves"* offers the ref form whole; the one that says *"not both"* names one, and the one it names is the one the caller is closer to having typed — both refs are present by construction at that branch, so the checkouts decide: two of them is a complete checkout invocation with refs added, one is a ref invocation with a stray positional. Each form is rendered from the command's own usage line, so a command added to `_two_states` later inherits both and the two cannot drift. `reproduced_on`: `ask delta <base> <head> --base-ref <ref> --head-ref <ref> [--repo <path>]` → `ask delta <base> <head>` for the duplicate-checkout form, `ask delta --base-ref <ref> --head-ref <ref> [--repo <path>]` for the stray-positional one. The property is asserted as the property rather than as three cases: no hint this call site can produce carries a token from both columns. *Original note:* **open.** `delta` rejects refs and checkouts together with *"Refs and checkouts name the same two states two different ways. Pass two checkouts, or two refs with `--repo`, not both."* and then prints, verbatim at HEAD: `"hint": "ask delta <base> <head> --base-ref <ref> --head-ref <ref> [--repo <path>]"` — **the exact combination it just refused**, concatenated. `AUD-596-D12` face (1) was closed by `e132458` and this face survived it: the no-argument hint was fixed, the both-arguments hint was not. `contract-diff` shares the call site. | Two rejections are two messages. The hint after *"not both"* names **one** of the two forms, and the one it names is the one the caller is closer to having typed. The regression assertion goes over both error paths of both commands, and the property is checkable in one line: **no hint may contain the token pair the message just declared mutually exclusive**. |
|
|
332
|
+
| `AUD-597-D03` / `N-06` | **P3 — a confident empty string in the axis this product just built to refuse them** | **closed 2026-08-22 (`e132458`).** Every item of the new `route_surface_changed` axis publishes `method`, `path`, `handler_symbol`, `access_policy` and **`"source_file": ""`** — an empty string, not an absence. Confirmed in source at `verify_edit.py:738`: `str(getattr(ep, "source_file", "") or "")`. In the same release `endpoints[]` publishes `source_file` and `declaration_line` for every route (`AUD-596-D06`, closed), so the anchor exists and the axis that declares `cir.endpoints` as its authority does not read it. | Fill it from `cir.endpoints`, which the axis already names as its authority; where the model genuinely has no anchor, **omit the key** or publish `null` with a basis. `""` is this ledger's own *"never a confident falsehood"* rule broken in the newest code in the product. |
|
|
333
|
+
| `AUD-597-D04` / `N-05` | **P3 — a declaration gap, in the block that exists to be honest about the clock** | **closed 2026-08-22 (`e51c087`).** `risk` times fine-grained walks inside its two coarse phases, so a run cut before any walk starts times nothing at all. A phase in `phases_completed` has a duration by construction: `PhaseTimings.close_phase(name)` records it at the boundary where the phase ends, and records only the part the walks did not already claim, so `measured_ms` can neither double-count nor exceed the wall clock. `audit` closes whether or not a checkpoint is being written; `compose` closes at every checkpoint and accumulates, since it is one phase. `reproduced_on`: `ASK_MAX_ANALYSIS_SECONDS=5 risk ./spring-security` — **`phases {}` / measured 0 / unaccounted 100.0 % → `phases {audit: 9019.88, compose: 16.34}` / measured 9036.22 / unaccounted 0.0 %**, and a complete run keeps its walk-level split (365.26 measured against 365.29 wall). *Original note:* **open.** `ASK_MAX_ANALYSIS_SECONDS=5 risk ./spring-security` publishes `_partial.phases_completed: ["audit"]` beside `timings.phases: {}`, `measured_ms: 0`, `unaccounted_pct: 100.0`. `wall_ms` is honest now (`AUD-596-B10`, closed and verified from outside: 40 798 ms external against `wall_ms` 39 929), so what remains is that a phase declared complete is attributed nowhere, which makes 100 % unaccounted **structural in every partial** rather than a measurement. Round B credits the new `how_to_read` naming the five walks a cut run skipped. | A phase in `phases_completed` has a duration by construction — record it where the phase ends, not where the run does. `unaccounted_pct` on a partial then means what it means on a full run, which is the only reason to publish it. |
|
|
334
|
+
| `AUD-597-D05` / `N-04`, fourth appearance of `C4-27` | **P3 — the fix exists in the sibling command and did not travel** | **closed 2026-08-22 (`9cccc15`), and there were two mechanisms, wrong in opposite directions.** The suggestion in the *message* is **Click's**, computed inside `NoSuchOption` with its own cutoff, so this product's guard never got to decide; the message carries the refusal now and the hint carries the candidate, asserted over every command that declares a long option. And the guard measured `sum(a != b for a, b in zip(...)) + abs(len diff)` — a Hamming count, not an edit distance — so a single deletion shifted every later character and `--compct` against `--compact` scored 3: the one-character typo the guard exists for was being thrown away. Levenshtein now. The semantic guard is stated as the property that makes a suggestion plausible: at most two edits **and** at most half the name — a correction that rewrites half of a short word has proposed a different one. `reproduced_on`: `plan … --path .` → no correction and *"`ask plan` takes: --copy, --depth, --format, --output, --progress"*; `--compct` → `--compact`; `--lmit` → `--limit`. `scope: "root"` stays attached to the misplaced-global-flag hint alone. *Original note:* **open.** `plan OwnerController ./spring-petclinic --path .` → `INVALID_USAGE: No such option: --path (Possible options: --depth)`, under the generic hint *"Check the command syntax, option name, and argument shape, then try again"*. Edit distance 3 over 6 characters and no semantic relation: the suggester is proposing a flag that answers a different question. `explain-endpoint --method` received the hint carrying the command's real signature in the same release, so the mechanism shipped and reached one of the two. | Suggest from the command's own declared parameters with a **semantic** guard, not from edit distance alone — a suggestion that is not a plausible answer to what the caller asked is worse than no suggestion. Fourth appearance; close it over the population of commands that emit `Possible options`, not over `plan`. |
|
|
335
|
+
| `AUD-597-D06` / `ASK-CLI-001` | **P3 — the only finding of its round with no row at all, in either direction** | **closed 2026-08-22 (`178aa6d`).** All three spellings are accepted everywhere and nothing acquires three new options: an alias a command does not declare is read before the parser as the repository it names and handed to the positional slot that was going to receive it. No payload changes, and the root help declares the grammar. Two guards, both the row's own counterexamples: an alias a command *does* declare keeps its meaning (`delta --repo`), and an alias never fills a slot already named (`plan Thing . --path .` is a duplicate to refuse). **One defect found while building it**: option arity was read from `_OPTIONS_WITH_VALUE`, a partial hand list, so `--limit 2`'s value counted as a supplied positional and made an empty slot look full — `risk --dir <repo> --limit 2` was refused while `risk --dir <repo>` worked. Arity comes off the command's own parameters now. Asserted over the registry population: 40+ commands × 3 aliases. *Original note:* **open.** Three conventions name one concept across commands of one tier: `--path` (`compare`, `fix-bug`), a positional (`delta`, `contract-diff`), `--repo` (the ref forms). `plan … --path .` and `fix-bug … --path .` both exit 2. The messages improved to `INVALID_USAGE` with `Possible options`; the grammar did not. `grep ASK-CLI-001` over the shipped ledger returns nothing — it is neither open nor closed, it was never read, which is its own process defect. | Accept all three spellings as aliases everywhere (backward compatible, no payload changes) and declare the canonical one in `--help`. The assertion is derivable from the registry: **every command that takes a repository declares the same option name for it**. |
|
|
336
|
+
| `AUD-597-D07` / `N-03` | **P3 — one sentence, and it is a scope claim rather than a defect of analysis** | **closed 2026-08-22 (`9245e35`).** The wording gap, as filed — not a re-opening. The block says it itself: it does not originate a finding, and an absent row is not a claim that the call is safe. It points at where discovery lives through `non_coverage.instead_of("NC-001")`, read from that authority rather than copied beside it, because two copies of *"use Semgrep or CodeQL"* is the shape this ledger keeps closing. The list, its stated exclusions and the shape-not-the-name rule are unchanged, and `update`/`execute` stay declined — asserted, so the decision cannot be quietly reversed in either direction. *Original note:* **open.** `risk`'s `query_sink_vocabulary` reads as the list of sinks the tool watches. What it does is narrower and correct: given a finding that already exists, it says whether the argument arrived concatenated. `AUD-596-B09` closed the false claim and declined the discovery rule with its price on the record; this is the residue of that decision, and it is a wording gap, not a re-opening. | Say in the block that the vocabulary **composes an existing finding and does not originate one**, and point at the `instead` field that already names Semgrep/CodeQL. The alternative — letting an admitted call originate a row — is the rule `B09` declined, and it does not become cheaper by being filed twice. |
|
|
337
|
+
|
|
338
|
+
**Mapped, not new.** `B-11` (cost anchors reading *"on 5.1.0"* in a 5.8.21 build, eighth
|
|
339
|
+
report) is `BUG-5`/`D-09` and stays there. `B-26` (`cache_layers` says `warm` over states
|
|
340
|
+
whose cost differs by large factors, third false regression in three rounds) is
|
|
341
|
+
`AUD-595-B01`. `B-13`/`B-14` are `AUD-596-D01`, closed by `f6ae10e` after the audited
|
|
342
|
+
artefact was built — the field reading is `AUD-597-X01`, not a second identity row. `B-21`
|
|
343
|
+
(pay-then-refuse) is the third face of `AUD-596-X02`, refused with its measurement. `B-22`
|
|
344
|
+
is `AUD-596-D08`, closed by `b396c6a`. `ASK-UX-005`, `ASK-UX-006`, `ASK-UX-007` and
|
|
345
|
+
`ASK-AGT-001` are `AUD-596-D11`, `AUD-596-D12` and `AUD-596-D03`. `AUD-596-D11` and
|
|
346
|
+
`AUD-596-D03` were verified closed from outside by Round A itself against ledger cells that
|
|
347
|
+
read `open`, and those cells are corrected in `AUD-597-A04`. `AUD-596-D12` is **not** among
|
|
348
|
+
them and its cell is right: face (1) closed by `e132458`, the both-arguments hint survived
|
|
349
|
+
it, and that residue is filed as `AUD-597-D02` — the row carries forward.
|
|
350
|
+
|
|
351
|
+
**Corrected against measurement in this repository — do not re-derive.**
|
|
352
|
+
|
|
353
|
+
- **`ASK-META-001`'s mechanism is refuted at HEAD.** `_stamp_envelope` (`cli.py:1667-1697`)
|
|
354
|
+
does have two silent exits, and neither fires on the measured commands: `endpoints
|
|
355
|
+
--compact`, `posture` and root `--compact` all publish `_meta` with `content_id`,
|
|
356
|
+
`content_id_basis` and `memory`. The observability half of the report's recommendation
|
|
357
|
+
stands on its own merit — a stamp that fails should say so — but it is not the cause of
|
|
358
|
+
the field reading, and the cause cannot be established without `AUD-597-X01`.
|
|
359
|
+
- **`N-02` is not a defect.** `ASK_MAX_ANALYSIS_SECONDS=1e9` is a **valid** budget:
|
|
360
|
+
`_parse_analysis_budget_env()` parses with `float()`, not `int()`, refuses non-numbers,
|
|
361
|
+
non-finite values and values `<= 0`, and accepts `1e9` exactly as it accepts
|
|
362
|
+
`1000000000`. The silence the round observed is a budget so large it is never reached,
|
|
363
|
+
which is the variable working. The correction is already in the function's own docstring
|
|
364
|
+
from `AUD-596-B03`; this is its second re-derivation and it is recorded here to stop a
|
|
365
|
+
third.
|
|
366
|
+
- **`AUD-597-R01` is not import cost.** The report's hypothesis — that computing the
|
|
367
|
+
bounding-flag intersection forces every command module to import — is measurable and
|
|
368
|
+
wrong: imports total 0.18 s. It is 248 rebuilds of the Click tree in one process.
|
|
369
|
+
- **The `×2–×3.7` block in Round A's performance table is not a regression** and the round
|
|
370
|
+
says so: the version bump retired 28 106 parse-cache entries, and the product now
|
|
371
|
+
discloses exactly that (*"written by another build and can never be read again"*).
|
|
372
|
+
`ask --help` is excluded from that reading because it parses nothing — 45.6 s in a
|
|
373
|
+
directory with no Java in it.
|
|
374
|
+
- **Round B's `×1.93` on `migrate-check` stays retracted**, by its own re-measurement
|
|
375
|
+
(0.97×) and ours (ratio 1.00). The residual 3.2× absolute difference between hosts is a
|
|
376
|
+
machine, and `AUD-597-X01` is what would settle it per measurement.
|
|
377
|
+
|
|
378
|
+
**The pattern this pass adds to the record, and it is the sharpest evidence yet for a rule
|
|
379
|
+
this ledger already has.** Round B states it in both directions: where a row closed as a
|
|
380
|
+
**parametric sweep over an existing catalogue** — `canonical_ir.route_is_semantically_modeled()`
|
|
381
|
+
replacing a whitelist, `cir.endpoints` as the single authority of the new axis,
|
|
382
|
+
`_parse_analysis_budget_env()` as the single authority over the variable — the closure held
|
|
383
|
+
under field verification. Where a row closed **line by line**, the residue is in this queue:
|
|
384
|
+
`--compact` reached `posture` and `migrate-check` and not `endpoints`, `spring-audit` or
|
|
385
|
+
`risk` (`A01`); the signature hint reached `explain-endpoint` and not `plan` (`D05`); the
|
|
386
|
+
route anchor reached `endpoints[]` and not the axis that reads it (`D03`); `--ci` reached
|
|
387
|
+
three of eight budgeted commands (`D01`). And the new class this pass opens is the mirror of
|
|
388
|
+
`AUD-594-X04`: **a row filed `closed` whose declared mechanism the field cannot find.** Nineteen
|
|
389
|
+
of twenty closures survived outside verification; the cost of the twentieth is that a buyer
|
|
390
|
+
now has to check the ones that did.
|
|
391
|
+
|
|
198
392
|
### Tenth Audit Pass: `5.8.20` findings / MSAS (round A) + 16-repository bank (round B) / 2026-08-21
|
|
199
393
|
|
|
200
394
|
**Open queue.** Ordered as the correction order is: the regression first, then the two rows
|
|
@@ -241,20 +435,20 @@ round A. `posture` is the exception, and it is `AUD-596-A01`.
|
|
|
241
435
|
| `AUD-596-B16` / `B-16` | **P2 — cheap, and it is this product's own doctrine** | **closed 5.8.21 (`1507f69`).** The derivation set is empty and the minimum of an empty set is undefined, not maximal: `finalize()` answers `unknown` and the basis names which empty case happened — no finding of any severity, or N findings none of which are high/critical. The two read differently to anyone deciding whether to trust the report, and the old sentence described neither. The cut-run cap three blocks below still wins, because *"this run was cut short"* is the more specific reason. The test that pinned `high` pinned the defect; it now pins the contract. Regression `tests/test_confidence_over_empty_set_b16.py`, 6 tests. *Original note:* **open.** `spring-audit` on `struts` and `spring-petclinic` (both `spring_detected: true`, `total_findings: 0`, every severity 0) publishes `confidence_level: "high"` with `confidence_basis: "Derived from the confidence of the high/critical findings in this report."` — derived from an empty set. Source: `spring_findings.py:226-229`, `if not high_findings: conf_level = "high"`. **Three lines below it the same function gets the identical question right** for a cut run (`C2-31`: a number describing how much to trust an answer must not go up when the answer shrinks) and caps at `low` with a basis that says which case happened. | `unknown`, or `high` with a basis that says *no high/critical findings to derive from* — the `selftest` rule (*never pass, because a green run over nothing is how a defect gets closed twice*) applied to the field where it is computed. |
|
|
242
436
|
| `AUD-596-A03` / `ASK-C1-001` | **P2 — class C1** | **closed 5.8.21 (`bffa3a6`).** Two authorities, one fact — and the fuller of the two rules is now the authority. `path_filters.changes_an_answer` holds the whole admission question (tool-state directory, pruned directory, inert suffix); `verify-edit`'s `_can_move_a_verdict` is the caller that kept its name rather than the copy that kept the knowledge, and `dirty_exclusion_reason` asks it too, so the working-set census every surface publishes gains two reasons it could not give: `inert-artefact` and `pruned-directory`. `freshness` publishes what it could not say: `stale_reason` in words for each of the four states, `disregarded_changes`, and `working_set_basis` — the sentence that lets a reader check the split against their own `git status`. Measured on a fixture: a `REPORT.md` and a `.claude/settings.json` leave the snapshot **FRESH** with two paths named as disregarded; one changed `.java` beside them is **STALE** with *"1 uncommitted path(s) the analysis reads differ from HEAD"*; the count both commands publish is the same number. Regression `tests/test_one_admission_rule_for_a_changed_path_a03.py`, 25 tests. *Original note:* **open.** Same tree, same session, two authorities, opposite verdicts. `cache freshness .` → `STALE`, with `Current HEAD == RIS HEAD == 3dde0376`, `Delta: 0 commit(s) behind`, `Uncommitted: True`. `verify-edit .` → `pass`, *"no file that any axis reads differs from HEAD. 2 path(s) do differ and none is source, wiring or a descriptor this command analyses"*, `disregarded_changes: [".claude/settings.json", "ASK-AUDIT-5.8.18.md"]`. The invalidation `cache model` documents is *"any change to the analysed files"*, and these are not analysed files. One of the two already knows how to filter. **Cost of believing the wrong one:** a rebuild of 170.8 s (root) or 31.6 s (`posture`) because an uncommitted `.md` is in the tree; on a runner with `.claude/`, `.idea/` or a report checked out, `freshness` says `STALE` permanently. | Reuse the `verify-edit` admission filter and publish a `stale_reason`, separating `STALE` (analysed files changed) from `FRESH` (N non-analysed paths differ). |
|
|
243
437
|
| `AUD-596-A04` / `ASK-UX-003` + `ASK-UX-004` | **P2** | **closed 5.8.21 (`f0aac3c`), both halves.** (1) `--no-write` and `--dry-run` ask this command for the same thing — derive the artefact, write nothing — so the pair is honoured rather than refused, decided before the analysis starts, and the substitution is announced where the answer is (`write_mode`: requested / served_as / basis) rather than only on stderr; the payload names `would_write`. (2) `--dry-run` is scoped to the command instead of to `--init`: it reaches `--capture-baseline`, which computes the violations, writes nothing and publishes what it would have recorded and where. `COMMANDS_THAT_WRITE` had two rows for `verify` and only the first mentioned the guard; both name `--dry-run` now, and `tests/test_no_write_mode.py` resolves every flag either row cites against the command's own parameters. None of the four no-write invocations can return `rc=1` any more — the code that means *violations blocked* — and that is asserted per invocation. Regression `tests/test_verify_write_guards_a04.py`, 11 tests. *Original note:* **open.** Two write-guard defects on `verify`, one of cost and one of scope. (1) `verify . --init --no-write` spends **110.5 s to return 0 bytes and `rc=1`**, where `--init --dry-run` does the equivalent work in 52.9 s and returns 15 481 B. The refusal's own hint promises *"the same answer is produced with the artefact"* and this invocation produced no answer; the incompatibility is decidable in `argv` at t=0; and `rc=1` collides with the contract `verify --help` publishes (*0 = pass, 1 = violations blocked, 2 = unverified*), so a pipeline reads *"there are violations"* when what happened was a refusal to write. (2) `verify . --dry-run --capture-baseline` **attempts the write** — only `ASK_READONLY=1` stopped it, and the refusal names `.ask/contracts-baseline.json`. `--dry-run` is documented as scoped to `--init`, so the scope is declared, but the combination is not rejected and the name carries a universal expectation. Aggravating: `.ask/` installs its own `.gitignore` with `*`, so a plain `git status` cannot show the result. | Validate at `argv`: treat `--no-write + --init` as `--dry-run` (print what would be written, `rc=0`), or refuse in argument validation at ~0 s cost with an exit code outside `verify`'s 0/1/2 contract — 75 already means *the gate could not run*. Make `--dry-run` global to the command, or reject the `--capture-baseline` combination naming its real scope. |
|
|
244
|
-
| `AUD-596-D01` / `B-13` + `B-14` | **P3 — highest leverage of the P3s** | **
|
|
438
|
+
| `AUD-596-D01` / `B-13` + `B-14` | **P3 — highest leverage of the P3s** | **closed 2026-08-22 (`f6ae10e`).** Repository identity is published by 4 of 28 payloads and spelled six ways. `repo_id`: `spring-audit` (+`scope`, +`git_head`), `endpoints` (+`scope`), `cold-start` (+`git_head`), `migrate-check` (+`git_head`). Other spellings: `repository` (`audit-report`), `head_sha` (`verify`, `verify-edit`), `path` (`modernize`), `target`+`scope` (`plan`), `generated_from` (`archetype`). **None at all**: `posture`, `risk`, `validation`, `onboard`, `prepare-context`, `fix-bug`, `review-pr`, `timeline`, `impact-chain`, `selftest` — 12 of 23 JSON payloads, starting with the first command the help recommends. Second axis: `schema_version` absent from 7 of 23, and `plan` spells it `schema`. `B-14` is the same row seen from one command: `data-exposure`'s refusal is **byte-identical across `mall`, `struts` and `spring-petclinic`** (md5 `2e4074cdf763c3c91a2f400f024ca37c`, 2 812 B) — an excellent refusal that never says what it is about. | One identity block injected by the envelope, not by each call site — which is exactly what `AUD-595-A07` fixed for `endpoints` alone, and why it reappears here. Catalogue assertion over the payload-producing commands. |
|
|
245
439
|
| `AUD-596-D02` / `B-08`, residual of `AUD-594-N04` | **P3** | **closed 5.8.21 (`e7f73c3`).** The comparison is against every block this view carries at any depth, so a block that moved is reported in `relocated_blocks` with the path it is at here, and `omitted_blocks` keeps only what is genuinely absent; the other direction is asked the same way. `_key_paths` is bounded to two levels on purpose — a block is a section of the answer, not every key inside one, and walking to the leaves would make `sibling_view` compare field names and call a value a block. Measured on the row's own subject, `ask ./mall --agent`: **15 omitted → 10**, with the five over-declared blocks named beside the parent they moved under. Regression `tests/test_a_relocated_block_is_not_an_omitted_one_d02.py`, 7 tests. *Original note:* **open.** `ask ./mall --agent` names 15 blocks in `sibling_view.omitted_blocks` and **5 of them are in the same payload**, nested: `/project/language_version`, `/project/deployment`, `/signals/code_notes`, `/signals/mybatis`, `/signals/spring_profiles` — a 33 % over-declaration. The basis says the list is *"computed from both view constructors over the same analysis"*, and it is: over **top-level keys**, while the agent view regroups several blocks under `project` and `signals`. An agent that trusts it re-invokes `--compact` for data it already holds. | Compare over flattened key paths, or rename to `omitted_top_level_keys` and add a regrouping note naming each moved block's new parent. |
|
|
246
|
-
| `AUD-596-D03` / `ASK-AGT-001` | **P3** | **
|
|
440
|
+
| `AUD-596-D03` / `ASK-AGT-001` | **P3** | **closed 2026-08-22 (`8c46967`).** `validation.summary.endpoints_with_body: 0` beside `body_endpoints_in_code: 1255` on MSAS. Not a false statement — the disambiguation travels in the payload (`endpoints_with_body_basis` calls it a legacy alias for *routes with a declared constraint surface*, `axis_note` explains the gap, and Round A verified the finding by hand: 840 `@RequestBody`, 0 `@Valid`, 0 `javax/jakarta.validation`, 0 `ConstraintValidator`) — and Round B reads `C1-49` as closed for that reason. The residue is the shape: it is the **first key of the summary**, its name states the opposite of what it counts, and it carries `_basis` but no `_unit`. The criterion `AUD-594-X03` closed under is *every catalogued figure emits `*_unit` and `*_population`*, and its sweep walks `FAN_IN_FIGURES` only, so this family is outside the population that would have caught it. | Give the legacy key its `_unit` and `_population` from the same catalogue, and extend the `AUD-594-X03` sweep from `FAN_IN_FIGURES` to every published-figure catalogue. |
|
|
247
441
|
| `AUD-596-D04` / `B-18` | **P3** | **closed 2026-08-22 (`040f027`).** The original Boot 2→3 framing defect is fixed: a detected Boot major ≥ 3 makes the boot3 dimension inapplicable, clears its scores, recomputes `headline_blocker` and publishes the coverage explanation. The Boot 3→4 path remains a separate roadmap item. |
|
|
248
442
|
| `AUD-596-D05` / `B-19` | **P3 — Windows** | **closed 5.8.21 (`fd2bf68`).** Three tree walks in `migrate_check` built the directory part with `str(Path)` — the operating system's separator — and then joined the file name with a literal `/`. `_posix_rel` is the convention every other module in this engine already writes at that seam, named, in the one module that had three copies of the bug instead of the fix. The catalogue assertion the row asked for ships with it: over a real `migrate-check` payload, **no path-valued field anywhere in the document holds a backslash**, and the three call sites are held to the helper rather than to review. Regression `tests/test_no_path_field_carries_a_backslash_d05.py`, 4 tests. *Original note:* **open.** Separators mixed **inside one string**: `migrate-check ./jhipster-sample-app` emits `"source_file": "src\\main\\webapp\\WEB-INF/web.xml"` while every other finding in the same payload uses `/`. It breaks string comparison against git paths, against `verify-edit.changed_files` and against `pr-impact --files`, which is how these payloads are joined in a pipeline. | Path fields normalised to POSIX and relative to the analysed root. Assertion over the payload catalogue: no path field contains a backslash. |
|
|
249
443
|
| `AUD-596-D06` / `B-20` | **P3 — third appearance** | **closed 2026-08-22 (`784cd83`).** `endpoints` now publishes `source_file` and `declaration_line` for each route, including the registration site for functional routes, with provenance where the path is not a literal. |
|
|
250
444
|
| `AUD-596-D07` / `B-17`, half refuted | **P3** | **closed 5.8.21 (`c3ff822`) on its surviving half.** A value that names no profile is refused where it is parsed, with the `INVALID_INPUT` envelope and the exit 2 any flag gets, and the refusal names the flag it came from — including *which side* of `--diff a:b` was empty. **A second flattening the row did not have**: `posture` reached the parser through `if profile`, which is false for the very empty string this row is about, so the value never got as far as `_profile_set`. The empty set can no longer reach a consumer from the CLI, so the docstring stops claiming a distinction downstream drops; the old sentence stays quoted as history beside the measurement of why it failed. Regression `tests/test_an_empty_profile_is_not_no_profile_d07.py`, 15 tests. *Original note:* **open on its surviving half.** `--profile ""` is silently identical to passing no flag: byte-identical payload, `profiles_requested: []`. `_profile_set` (`cli.py:1397-1408`) documents the distinction it is there to keep — *"None and the empty set are different answers: no profile set was named, versus a named set that is empty"* — and every consumer then writes `sorted(profiles or set())`, which flattens the second back into the first. **Refuted half, measured against source:** the report's *"an undeclared profile is computed without a note"* is not the case — `posture.py:1394-1396` publishes `profiles_not_declared: ["NOPE"]` with the reason that a profile no artefact mentions is almost always a typo. Do not re-derive it. | Empty string ⇒ `INVALID_INPUT`. Keep the parser's distinction downstream or delete it from the docstring; one of the two, not both. |
|
|
251
|
-
| `AUD-596-D08` / `B-22`, class residual of `AUD-591-A06` | **P3** | **
|
|
445
|
+
| `AUD-596-D08` / `B-22`, class residual of `AUD-591-A06` | **P3** | **closed 2026-08-22 (`b396c6a`).** `compare ./spring-petclinic ./spring-framework-petclinic --path .` costs **80 541 ms** to answer `resolution: "not_a_candidate", resolved: false` — *"names a directory, not a change candidate"*, a verdict decidable from the string. The cost tracks `--path`, not the rejection: 5 755 ms with `--path ./mall`, 700 ms with `--path ./spring-petclinic`. Second half: 0 of 2 candidates resolved still exits 0, with the warning only on stderr. | Validate candidate shape before building the model — the same fix `AUD-591-A06` applied at the other call site. `resolved_count: 0` ⇒ non-zero exit or a top-level field, not a stderr line. |
|
|
252
446
|
| `AUD-596-D09` / `B-23`, surviving half of `B26` | **P3** | **closed 2026-08-22 (`fd3d63f`).** `onboard` now labels the population as `non_test_java_sources`, matching the Java-specific count and the taxonomy already used by the advisory and `--progress`. |
|
|
253
|
-
| `AUD-596-D10` / `B-29` | **P3 — scale** | **closed 2026-08-22 (`
|
|
254
|
-
| `AUD-596-D11` / `ASK-UX-005` | **P3 — exit-code contract** | **
|
|
447
|
+
| `AUD-596-D10` / `B-29` | **P3 — scale** | **closed 2026-08-22 (`dabcc95`, `493e796`).** Every JSON response publishes `_meta.memory` with `unit`, `peak_rss_mb` and the configured ceiling. Costly analyses enforce `ASK_MAX_RSS_MB` after the measured run and refuse with `MEMORY_TOO_LARGE`, peak and limit in the same structured error shape as the output ceiling. `0`/unset leaves the limit disabled. | Peak RSS **1.4 GB** in one invocation (`endpoints ./thingsboard`, 3 714 Java files), sampled every 10 s: 693 → 861 → 1 021 → 1 400 MB. |
|
|
448
|
+
| `AUD-596-D11` / `ASK-UX-005` | **P3 — exit-code contract** | **closed 2026-08-22 (`f4b4f77`).** `INVALID_INPUT` exits **1 or 2 depending on which layer caught it**, and the payload cannot tell them apart: `endpoints ./no-such-dir-xyz` → 1, `impact NoSuchClassZZZ .` → 1, `impact-chain … --depth 0` → 2, `endpoints . --jobs 0` → 2, `endpoints . --format bogusfmt` → 2, all five with `"code": "INVALID_INPUT"`. The real rule is *grammar (Click/Typer) = 2, semantics = 1*, and `verify --help` has already spent 2 on *"unverified (no contracts declared, contracts unreadable, or the repository could not be analysed — never a silent pass)"* — so a mistyped flag in a CI `verify` is indistinguishable from *"we have not adopted contracts yet"*. | A distinct code for the grammar class (e.g. `INVALID_USAGE`) so the payload and the exit code are derivable from each other, and the table published in `ask schema`. |
|
|
255
449
|
| `AUD-596-D12` — six hints that send the reader back to the error | **P3 — one patch** | **open.** All six are in-product text that names the wrong next step, and each is one call site. (1) `delta` / `contract-diff` reject *"refs and checkouts name the same two states two different ways"* and then print a hint that concatenates the two alternatives without a separator — `ask delta <base> <head> --base-ref <ref> --head-ref <ref>` — which is exactly the rejected combination; the same command's other branch separates them with ` \| `, so the convention exists (`ASK-DOC-001`). (2) `export . --c4` refuses with *"No smaller inline variant is available with the current flags"* while `export .` with no mode lists three smaller sections (`--by-directory`, `--module-graph`, `--integrations`); `hint_basis.declared_flags` is empty, so the generator is reading flags rather than the command's own modes (`ASK-DOC-002`). (3) `rename-class --from m3informatica.saint.services.CommonService` is rejected as *"must be a Java class name (PascalCase)"* — the FQN the rest of the product recommends and that `impact`'s own candidate list prints — with the two generic strings of the whole run (`hint: "Inspect the command input and retry."`, `expected: "A valid command result."`), where ~20 other typed errors state the accepted shape (`ASK-UX-006`). (4) `regress . HEAD` reports `[Errno 13] Permission denied: '.'` — the only untranslated OS exception of the run — when the real fact is that `.` is a directory and not a JSON payload (`ASK-UX-007`). (5) `explain-endpoint --method GET` answers *"Check the input value, path, or flag and try again"* while the signature `{route} [path]` is known (`B-25`). (6) `explain-endpoint "FOO /owners"` reports an invalid HTTP verb as an absent route, the same sentence a legitimately missing route gets (`B-24`). | One usage constructor per command, fed by the command's own signature and modes; `regress` checks `is_dir()` before `open()`; an out-of-set verb gets its own error naming the admitted verbs. `C4-27` (fuzzy suggestion pointing at an unrelated flag) reproduces in the same family and is not re-filed. |
|
|
256
450
|
| `AUD-596-D13` / `B-28` | **P3** | **closed 5.8.21 (`1014c72`).** Both cases answer now, from the one authority, on all three publishers (`spring-audit`, `posture`, `risk`). The modelled case is deliberately short — there are no axes to enumerate, because none of them is reporting an absence of model — and states that the Spring-shaped axes measure here, so an absence they report is an absence of control. Omitting it was a deliberate saving (CL-19 wanted the modelled payload byte-identical) and the consumer paid for it: a missing key cannot be told apart from a build that does not publish the field, so *"your stack is modelled"* and *"this version is too old to say"* read the same. **One correction to the row**: the field is not `null` in the payload, it is *absent* — `null` is what a reader sees through `payload.get("stack_fit")`, which is the same defect from the consumer's side and is why the row is right. *Original note:* **open.** `spring-audit.stack_fit` is `null` on every repository where Spring is detected (`spring-petclinic`, `mall`, `struts`), and populated only where it is not (`tutorials/algorithms-modules`), where its text is exemplary (*"read every one of their answers as unknown, not as none"*). `ask schema schemas-v1` lists `spring-audit` as the producer of `stack-fit-v1`, so a consumer is told the sub-schema exists and gets `null` from the case it was written for. | If the block is informational only where Spring is absent, say so: `{spring_detected: true, statement: "…"}` instead of `null`. |
|
|
257
|
-
| `AUD-596-D14` / `B-15`, narrow half of `B20` | **P3 — declared, with a window** | **
|
|
451
|
+
| `AUD-596-D14` / `B-15`, narrow half of `B20` | **P3 — declared, with a window** | **closed 2026-08-22 (`10f2827`), and half of it was a decision rather than a defect.** `ask schema schemas-v1`: 47 identifiers, `non_conforming: 13`, `ambiguous_identifiers: 1`. The ambiguous one is `1.0`, spelled by **seven** schemas (`core-analysis-v1`, `impact-chain-v1`, `pr-impact-v1`, `migration-blast-v1`, `spring-impact-v1`, `event-topology-v1`, `test-gap-ranking-v1`), so pinning `schema_version == "1.0"` admits seven incompatible payloads. The window half is already declared: `pending_renames_window = {announced_in: "5.8.5", takes_effect_in: "6.0.0", change_id: "BC-002"}` with *"pin the canonical name to be unaffected by the rename"*. | Disambiguate `1.0` before `6.0.0`, or declare in the registry that the identifier is not pinnable and say what to pin instead. |
|
|
258
452
|
|
|
259
453
|
**Mapped, not new — witnesses on rows this ledger already holds. Do not file twice.**
|
|
260
454
|
|