sourcecode 5.9.22__tar.gz → 5.9.23__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.9.22 → sourcecode-5.9.23}/CHANGELOG.md +22 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/PKG-INFO +14 -6
- {sourcecode-5.9.22 → sourcecode-5.9.23}/README.md +13 -5
- sourcecode-5.9.23/docs/AUDIT-2026-09-01-EXTERNAL-5.9.22.md +71 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/DEFECT-LEDGER.md +26 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/PRODUCT_TIERS.md +1 -1
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/USER_GUIDE.md +8 -5
- {sourcecode-5.9.22 → sourcecode-5.9.23}/pyproject.toml +1 -1
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/__init__.py +1 -1
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/answer_bounds.py +10 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/canonical_ir.py +1 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/cli.py +100 -12
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/migrate_check.py +14 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/non_coverage.py +17 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/output_budget.py +18 -4
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/repository_ir.py +46 -1
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/resource_budget.py +10 -5
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/rule_catalog.py +1 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/spring_findings.py +4 -3
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/spring_security_audit.py +57 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/.github/workflows/build-windows.yml +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/.github/workflows/perf-gate.yml +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/.github/workflows/windows-battery.yml +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/.github/workflows/windows-regression.yml +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/.gitignore +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/.ruff.toml +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/CLAUDE.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/CODE_OF_CONDUCT.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/CONTRIBUTING.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/LICENSE +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/NOTICE +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/SECURITY.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/AUDIT-2026-08-22-5.8.22.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/AUDIT-2026-08-23-5.8.24.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/AUDIT-2026-08-23-COMMERCIAL.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/AUDIT-2026-08-23-CORPUS-AMPLIADO.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/AUDIT-2026-08-23-EXTERNAL-5.8.25.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/AUDIT-2026-08-23-EXTERNAL-5.8.26.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/AUDIT-2026-08-23-THINGSBOARD-FINDINGS.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/AUDIT-2026-08-26-EXTERNAL-5.8.26.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/AUDIT-2026-08-26-EXTERNAL-5.8.27.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/AUDIT-2026-08-26-EXTERNAL-5.8.28-PACK.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/AUDIT-2026-08-26-EXTERNAL-5.8.28.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/AUDIT-2026-08-26-EXTERNAL-5.8.31.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/AUDIT-2026-08-26-EXTERNAL-5.8.32.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/AUDIT-2026-08-26-EXTERNAL-5.9.0.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/AUDIT-2026-08-26-MONETIZATION.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/AUDIT-2026-08-27-EXTERNAL-5.9.2.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/AUDIT-2026-08-27-EXTERNAL-5.9.3.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/AUDIT-2026-08-28-EXTERNAL-5.9.10.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/AUDIT-2026-08-31-EXTERNAL-5.9.16.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/AUDIT-2026-08-31-EXTERNAL-5.9.17.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/AUDIT-2026-08-31-REMEDIATION-5.9.18.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/AUDIT-TESTING-CORPUS-2026-08-22.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/CACHE.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/COMMERCIAL-OFFER.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/CUSTOMER-VALIDATION.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/DEMO-5MIN.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/DEVELOPMENT-ROADMAP.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/DOCUMENTATION-HYGIENE-2026-08-23.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/EXECUTION-PLAN-12MO.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/EXECUTIVE-ROADMAP.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/MANUAL-USUARIO.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/MODERNIZATION.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/PRODUCT-ROUTE.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/PRODUCT_AUDIT.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/PRODUCT_IDENTITY.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/RC1-CHECKLIST.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/RD-JVM-ASK-TRIAGE-2026-08-31.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/RELEASE-CHECKLIST.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/RELEASE-VERIFICATION.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/STRATEGY-2026-08-26-AGENT-CONTEXT.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/architecture/CATALOG-retrieval-intents.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/architecture/DESIGN-assessment-deployment-evidence.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/architecture/DESIGN-assessment-report.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/architecture/DESIGN-build-closure-provenance.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/architecture/DESIGN-knowledge-provider-integration.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/architecture/DESIGN-p5.3b-statement-surface.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/architecture/DESIGN-p5.5-span-index.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/architecture/DESIGN-p6-semantic-impact-engine.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/architecture/DESIGN-p6-semantic-integration-engine.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/architecture/DESIGN-p7-semantic-services.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/architecture/DESIGN-pack-gate-ci.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/architecture/DESIGN-pack-manifest.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/architecture/DESIGN-pack-mcp-api.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/architecture/DESIGN-robustness-security-inference.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/architecture/DESIGN-semantic-retrieval.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/architecture/EPV-p6-class-typeref.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/architecture/REPORT-p6-flow-analyzer-comparison.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/architecture/REPORT-p6-integration-detector-comparison.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/architecture/REPORT-p8-flow-analyzer-migration.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/architecture/REPORT-p9-integration-detector-migration.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/architecture/adr/0001-semantic-ir.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/architecture/adr/0002-source-evidence-boundary.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/architecture/adr/0003-architectural-characterization.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/architecture/adr/0004-semantic-retrieval.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/architecture/adr/0005-evidence-reconciliation.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/architecture/adr/0006-performance-harness.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/architecture/adr/0007-composition-semantics.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/architecture/adr/0008-answer-coherence.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/architecture/consumer-disposition-inventory.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/architecture/overview.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/architecture/product-architecture-review.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/architecture/product-strategy-layering.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/architecture/semantic-ir-consumer-matrix.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/architecture/semantic-ir-roadmap.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/baseline-ci.yml +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/commercial-pipeline-audit.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/contracts-ci.yml +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/contracts.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/eval/2026-06-15-petclinic-rest-issue11-vets-pagination.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/eval/2026-06-15-petclinic-rest-issue147-validation.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/eval/2026-06-15-petclinic-rest-workflow.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/eval/2026-06-15-phase18-openapi-surface.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/eval/2026-06-15-phase20-validation-surface.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/eval/2026-06-16-broadleaf-checkout-impact-fieldtest.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/eval/2026-06-16-petclinic-rest-issue11-weakness2-closed.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/eval/2026-06-16-spring-petclinic-issue2333-dead-vets.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/licensing-schema.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/migrate-check.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/pack-gate-github-actions.yml +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/pack-gate-gitlab.yml +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/perf/README.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/perf/REGRESSION-GATE.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/perf/baselines/2.5.15/SUMMARY.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/perf/baselines/2.5.15/alfresco__ask__cold.json +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/perf/baselines/2.5.15/alfresco__ask__warm.json +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/perf/baselines/2.5.15/broadleaf__ask__cold.json +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/perf/baselines/2.5.15/broadleaf__ask__warm.json +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/perf/baselines/2.5.15/eureka__ask__cold.json +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/perf/baselines/2.5.15/eureka__ask__warm.json +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/perf/baselines/2.5.15/jenkins__ask__cold.json +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/perf/baselines/2.5.15/jenkins__ask__warm.json +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/perf/baselines/2.5.15/jobrunr__ask__cold.json +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/perf/baselines/2.5.15/jobrunr__ask__warm.json +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/perf/baselines/2.5.15/keycloak__ask__cold.json +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/perf/baselines/2.5.15/keycloak__ask__warm.json +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/perf/baselines/2.5.15/neo4j__ask__cold.json +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/perf/baselines/2.5.15/neo4j__ask__warm.json +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/perf/baselines/2.5.15/ofbiz__ask__cold.json +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/perf/baselines/2.5.15/ofbiz__ask__warm.json +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/perf/baselines/2.5.15/openmrs__ask__cold.json +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/perf/baselines/2.5.15/openmrs__ask__warm.json +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/perf/baselines/2.5.15/petclinic__ask__cold.json +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/perf/baselines/2.5.15/petclinic__ask__warm.json +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/perf/baselines/2.5.16/SUMMARY.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/perf/baselines/2.5.16/alfresco__ask__cold.json +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/perf/baselines/2.5.16/alfresco__ask__warm.json +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/perf/baselines/2.5.16/broadleaf__ask__cold.json +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/perf/baselines/2.5.16/broadleaf__ask__warm.json +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/perf/baselines/2.5.16/eureka__ask__cold.json +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/perf/baselines/2.5.16/eureka__ask__warm.json +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/perf/baselines/2.5.16/jenkins__ask__cold.json +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/perf/baselines/2.5.16/jenkins__ask__warm.json +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/perf/baselines/2.5.16/jobrunr__ask__cold.json +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/perf/baselines/2.5.16/jobrunr__ask__warm.json +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/perf/baselines/2.5.16/keycloak__ask__cold.json +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/perf/baselines/2.5.16/keycloak__ask__warm.json +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/perf/baselines/2.5.16/neo4j__ask__cold.json +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/perf/baselines/2.5.16/neo4j__ask__warm.json +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/perf/baselines/2.5.16/ofbiz__ask__cold.json +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/perf/baselines/2.5.16/ofbiz__ask__warm.json +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/perf/baselines/2.5.16/openmrs__ask__cold.json +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/perf/baselines/2.5.16/openmrs__ask__warm.json +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/perf/baselines/2.5.16/petclinic__ask__cold.json +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/perf/baselines/2.5.16/petclinic__ask__warm.json +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/perf/baselines/5.9.22/petclinic__ask__cold.json +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/perf/baselines/5.9.22/petclinic__ask__warm.json +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/perf/baselines/gate-latest/README.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/perf/baselines/gate-latest/broadleaf__ask__warm.json +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/perf/baselines/gate-latest/broadleaf__endpoints__warm.json +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/perf/baselines/gate-latest/broadleaf__migrate-check__warm.json +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/perf/baselines/gate-latest/broadleaf__posture__warm.json +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/perf/baselines/gate-latest/broadleaf__spring-audit__warm.json +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/perf/baselines/gate-latest/broadleaf__validation__warm.json +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/perf/baselines/reference-best/README.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/perf/corpus-testing-2026-08-22.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/posture.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/privacy.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/pro-experience-audit.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/schema.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/spec/envelope-v1.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/docs/spring-audit-ci.yml +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/hatch_build.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/scripts/compare_integration_engines.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/scripts/context_cost_harness.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/scripts/customer_smoke_test.sh +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/scripts/generate_jdk_exports.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/scripts/perf_gate.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/scripts/perf_harness.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/scripts/sync_gate_anchors.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/scripts/test_fast.sh +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/scripts/windows_reliability_matrix.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/__main__.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/access_drift.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/adaptive_scanner.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/analysis_budget.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/archetype.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/architectural_baseline.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/architectural_delta.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/architecture_analyzer.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/architecture_summary.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/ast_extractor.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/audit_clusters.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/audit_recipe.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/audit_report.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/audit_since.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/audit_verify.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/baseline_attestation.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/baseline_autocapture.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/breaking_changes.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/build_modules.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/build_stamp.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/bundled_docs.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/c4_render.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/cache.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/cache_model.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/cache_observation.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/call_surface.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/caller_metrics.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/caller_reach.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/chain_rules.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/change_plan.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/ci_output.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/cir_graphs.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/classifier.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/click_runtime.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/client_calls.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/code_notes_analyzer.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/compare.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/confidence_analyzer.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/constraint_diff.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/consumer_join.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/container_wiring.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/context_cache.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/context_graph.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/context_scorer.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/context_summarizer.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/contract_diff.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/contract_init.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/contract_model.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/contract_pipeline.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/coverage_parser.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/cve_feed.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/cve_reachability.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/data_exposure.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/data_labels.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/declarations.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/defect_classes/__init__.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/defect_classes/registry.json +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/defect_identity.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/degradation.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/dependency_analyzer.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/deployment_prefix.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/detach.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/detectors/__init__.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/detectors/base.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/detectors/csproj_parser.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/detectors/dart.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/detectors/dotnet.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/detectors/elixir.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/detectors/go.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/detectors/heuristic.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/detectors/hybrid.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/detectors/java.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/detectors/jvm_ext.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/detectors/nodejs.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/detectors/parsers.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/detectors/php.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/detectors/project.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/detectors/python.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/detectors/ruby.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/detectors/rust.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/detectors/systems.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/detectors/terraform.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/detectors/tooling.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/doc_analyzer.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/dynamic_argument_surface.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/empty_reach.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/endpoint_disposition.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/endpoint_literals.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/endpoint_metrics.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/entrypoint_classifier.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/env_analyzer.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/envelope.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/environment_resolution.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/error_schema.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/evidence_provider.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/execution_plan.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/explain.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/explain_endpoint.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/facts/__init__.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/facts/registry.json +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/field_deprecations.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/file_chunker.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/file_classifier.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/filter_surface.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/findings_baseline.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/format_contract.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/fqn_utils.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/functional_routes.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/gate_anchors.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/git_analyzer.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/git_checkout.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/github_diff.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/graph_analyzer.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/graph_evidence.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/hibernate_strat.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/identity_fallback.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/integration_coordinates.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/intent_router.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/jdk_exports.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/jvm_inventory.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/license.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/manifest_cache.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/mcp/__init__.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/mcp/dependency_import.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/mcp/onboarding/__init__.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/mcp/onboarding/applier.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/mcp/onboarding/backup.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/mcp/onboarding/detector.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/mcp/onboarding/planner.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/mcp/orchestrator.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/mcp/registry.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/mcp/runner.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/mcp/server.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/mcp_nudge.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/metrics_analyzer.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/migration_apply.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/migration_blast.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/openapi_surface.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/openrewrite_recipe.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/output_bounds.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/output_ceiling.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/output_encoding.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/output_sink.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/pack_manifest.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/packs.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/parallel.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/parse_cache.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/partial_contract.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/path_admission.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/path_display.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/path_filters.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/perf.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/phased_run.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/pipe_contract.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/posture.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/pr_comment_renderer.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/pr_impact.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/pr_risk.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/prepare_context.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/product_info.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/progress.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/provenance.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/ranking_engine.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/readiness_timeline.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/readonly.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/reconciliation.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/redactor.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/reference_facts.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/regress.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/regulatory_pack.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/release_info.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/relevance_scorer.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/remediation_diff.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/remediation_flow.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/remediation_report.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/remedies.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/rename_refactor.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/repo_classifier.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/retrieval/__init__.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/retrieval/context.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/retrieval/errors.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/retrieval/executor.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/retrieval/planner.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/retrieval/query.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/retrieval/request.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/retrieval/resolution.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/retrieval/result.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/retrieval/retriever.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/retrieval/runtime.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/retrieval/steps.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/retrieval/steps_endpoint.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/retrieval/steps_graph.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/retrieval/steps_impact.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/retrieval/steps_intf.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/retrieval/steps_struct.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/retrieval/steps_txsec.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/ris.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/risk.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/risk_model.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/rule_pass.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/runs.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/runtime_classifier.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/sarif.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/sarif_emit.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/scanner.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/schema.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/schema_producers.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/schema_registry.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/schemas/core-analysis-v1.schema.json +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/schemas/cve-reachability-v1.schema.json +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/schemas/endpoints-v1.schema.json +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/schemas/envelope-v1.schema.json +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/schemas/pr-impact-v1.schema.json +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/schemas/verify-edit-v1.schema.json +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/schemas/verify-v1.schema.json +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/security_chain.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/security_config.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/security_config_scan.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/security_posture.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/selection_contract.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/self_audit.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/selftest.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/semantic_analyzer.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/semantic_impact_engine.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/semantic_integration_engine.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/semantic_services.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/serializer.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/servlet_surface.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/source_text.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/spring_event_topology.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/spring_impact.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/spring_model.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/spring_profiles.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/spring_properties.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/spring_semantic.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/spring_tx_analyzer.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/sql_taint.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/summarizer.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/target_admission.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/telemetry/__init__.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/telemetry/config.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/telemetry/consent.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/telemetry/events.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/telemetry/filters.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/telemetry/transport.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/test_gap_ranking.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/test_sources.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/text_input.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/timeline.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/timeline_cache.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/token_estimate.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/tree_utils.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/type_usage_surface.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/validation_inference.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/validation_surface.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/verify_edit.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/verify_repo.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/verify_rules.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/version_check.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/vex.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/waivers.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/watch_loop.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/wired_surface.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/src/sourcecode/workspace.py +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/supabase/functions/README.md +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/supabase/functions/get-license/index.ts +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/supabase/functions/lemonsqueezy-webhook/index.ts +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/supabase/functions/telemetry/index.ts +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/supabase/sql/license_event_ordering.sql +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/supabase/sql/licensing_schema.sql +0 -0
- {sourcecode-5.9.22 → sourcecode-5.9.23}/supabase/sql/telemetry_events.sql +0 -0
|
@@ -1,5 +1,27 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [5.9.23] — 2026-09-01
|
|
4
|
+
|
|
5
|
+
*Regression hardening after the 5.9.22 audit and testing-repository battery.*
|
|
6
|
+
|
|
7
|
+
### Fixed
|
|
8
|
+
|
|
9
|
+
- `--compact` and `--agent` reserve envelope metadata before trimming, so their
|
|
10
|
+
published 30 KB and 40 KB stdout ceilings remain true after final rendering.
|
|
11
|
+
- `--agent` now has a 1,536 MB default RSS ceiling, reports context construction
|
|
12
|
+
accurately in progress output, and rejects Java repositories above 10,000 files
|
|
13
|
+
with `AGENT_SCOPE_TOO_LARGE` before an unbounded deep analysis can be killed.
|
|
14
|
+
- Agent mode no longer builds a module graph implicitly; callers can still request
|
|
15
|
+
it explicitly with `--graph-modules`.
|
|
16
|
+
|
|
17
|
+
### Documentation
|
|
18
|
+
|
|
19
|
+
- Added the Windows large-repository audit with measured P0/P1 regressions,
|
|
20
|
+
performance boundaries and explicit closure requirements.
|
|
21
|
+
- Synchronized the defect ledger and README so silent-success, incomplete
|
|
22
|
+
coverage, compact-output, cache-growth and deep-agent memory risks are visible
|
|
23
|
+
rather than implied closed by smaller-repository measurements.
|
|
24
|
+
|
|
3
25
|
## [5.9.22] — 2026-08-31
|
|
4
26
|
|
|
5
27
|
*Large-repository route projection performance.*
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sourcecode
|
|
3
|
-
Version: 5.9.
|
|
3
|
+
Version: 5.9.23
|
|
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
|
|
@@ -59,7 +59,7 @@ Description-Content-Type: text/markdown
|
|
|
59
59
|
> question. All analysis is local and deterministic; see [Privacy](#configuration--privacy)
|
|
60
60
|
> before inspecting a repository whose telemetry policy you need to control.
|
|
61
61
|
|
|
62
|
-

|
|
63
63
|

|
|
64
64
|
|
|
65
65
|
Copyright (c) 2026 Dominique Haroun. All rights reserved. ASK Engine 5.7.0 and
|
|
@@ -191,10 +191,10 @@ must not be gated on this variable; their budget applicability remains visible i
|
|
|
191
191
|
the [defect ledger](docs/DEFECT-LEDGER.md).
|
|
192
192
|
|
|
193
193
|
**Memory is measurable and bounded.** Repository-scoped JSON answers publish
|
|
194
|
-
`_meta.memory.peak_rss_mb` and the configured ceiling.
|
|
195
|
-
set `ASK_MAX_RSS_MB=<megabytes
|
|
196
|
-
|
|
197
|
-
|
|
194
|
+
`_meta.memory.peak_rss_mb` and the configured ceiling. `--agent` applies a
|
|
195
|
+
1,536 MB ceiling by default; set `ASK_MAX_RSS_MB=<megabytes>` to override it or
|
|
196
|
+
`ASK_MAX_RSS_MB=0` to disable it explicitly. If the process exceeds the ceiling,
|
|
197
|
+
ASK refuses the answer with `MEMORY_TOO_LARGE`, including the observed peak and limit.
|
|
198
198
|
|
|
199
199
|
**Current performance status.** Release 5.9.22 retains the shared Canonical IR
|
|
200
200
|
path used by `validation` and now passes that same CIR into labelled `data-exposure`
|
|
@@ -212,6 +212,14 @@ exit 75 (`--allow-partial` accepts one deliberately). The long-run progress
|
|
|
212
212
|
message names the phase it is in and whether that phase has changed, so a slow run
|
|
213
213
|
is distinguishable from a blocked one.
|
|
214
214
|
|
|
215
|
+
**External audit boundary (2026-09-01).** The latest Windows audit rates the
|
|
216
|
+
large-repository experience at **6.6/10** and reports open P0/P1 issues: empty
|
|
217
|
+
successful Markdown `audit-report`, silent `risk` termination, multi-gigabyte
|
|
218
|
+
deep-agent RSS, incomplete parse/coverage disclosure and oversized compact
|
|
219
|
+
surfaces. These findings are tracked in the [external audit](docs/AUDIT-2026-09-01-EXTERNAL-5.9.22.md)
|
|
220
|
+
and [defect ledger](docs/DEFECT-LEDGER.md); they are not closed by the existing
|
|
221
|
+
engineering-host measurements.
|
|
222
|
+
|
|
215
223
|
The current external audit still records two open availability limits, and they
|
|
216
224
|
are held open deliberately: `audit-report --format markdown` under contention, and
|
|
217
225
|
the root compact flow under strict timeouts on very large monorepos. Neither
|
|
@@ -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
|
|
@@ -142,10 +142,10 @@ must not be gated on this variable; their budget applicability remains visible i
|
|
|
142
142
|
the [defect ledger](docs/DEFECT-LEDGER.md).
|
|
143
143
|
|
|
144
144
|
**Memory is measurable and bounded.** Repository-scoped JSON answers publish
|
|
145
|
-
`_meta.memory.peak_rss_mb` and the configured ceiling.
|
|
146
|
-
set `ASK_MAX_RSS_MB=<megabytes
|
|
147
|
-
|
|
148
|
-
|
|
145
|
+
`_meta.memory.peak_rss_mb` and the configured ceiling. `--agent` applies a
|
|
146
|
+
1,536 MB ceiling by default; set `ASK_MAX_RSS_MB=<megabytes>` to override it or
|
|
147
|
+
`ASK_MAX_RSS_MB=0` to disable it explicitly. If the process exceeds the ceiling,
|
|
148
|
+
ASK refuses the answer with `MEMORY_TOO_LARGE`, including the observed peak and limit.
|
|
149
149
|
|
|
150
150
|
**Current performance status.** Release 5.9.22 retains the shared Canonical IR
|
|
151
151
|
path used by `validation` and now passes that same CIR into labelled `data-exposure`
|
|
@@ -163,6 +163,14 @@ exit 75 (`--allow-partial` accepts one deliberately). The long-run progress
|
|
|
163
163
|
message names the phase it is in and whether that phase has changed, so a slow run
|
|
164
164
|
is distinguishable from a blocked one.
|
|
165
165
|
|
|
166
|
+
**External audit boundary (2026-09-01).** The latest Windows audit rates the
|
|
167
|
+
large-repository experience at **6.6/10** and reports open P0/P1 issues: empty
|
|
168
|
+
successful Markdown `audit-report`, silent `risk` termination, multi-gigabyte
|
|
169
|
+
deep-agent RSS, incomplete parse/coverage disclosure and oversized compact
|
|
170
|
+
surfaces. These findings are tracked in the [external audit](docs/AUDIT-2026-09-01-EXTERNAL-5.9.22.md)
|
|
171
|
+
and [defect ledger](docs/DEFECT-LEDGER.md); they are not closed by the existing
|
|
172
|
+
engineering-host measurements.
|
|
173
|
+
|
|
166
174
|
The current external audit still records two open availability limits, and they
|
|
167
175
|
are held open deliberately: `audit-report --format markdown` under contention, and
|
|
168
176
|
the root compact flow under strict timeouts on very large monorepos. Neither
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# External Audit — ASK Engine 5.9.22
|
|
2
|
+
|
|
3
|
+
**Received:** 2026-09-01
|
|
4
|
+
**Audited build:** `5.9.22` (`64c8b3e429eadd7a12d34eb1e5eefa0c08e430e4`)
|
|
5
|
+
**Platform:** Windows 11, Python 3.10, Git Bash
|
|
6
|
+
**Corpus:** repositories under `laboratorioDePruebas/testing/`; the largest
|
|
7
|
+
reported target contains 3,342 Java files.
|
|
8
|
+
|
|
9
|
+
This document records external observations. An observation is not a closure:
|
|
10
|
+
the defect ledger remains authoritative until a fix, all affected consumers and
|
|
11
|
+
a regression assertion exist.
|
|
12
|
+
|
|
13
|
+
## Executive Result
|
|
14
|
+
|
|
15
|
+
The audit rates ASK Engine **6.6/10** on the large MSAS corpus and **7.5/10** on
|
|
16
|
+
the smaller nine-axis assessment. The measurements agree on the main risk:
|
|
17
|
+
source analysis is accurate and unusually explicit about uncertainty, but large
|
|
18
|
+
repository execution and several output contracts are not yet reliable enough
|
|
19
|
+
for interactive or unattended security use.
|
|
20
|
+
|
|
21
|
+
Strengths confirmed: endpoint extraction, effective access resolution,
|
|
22
|
+
determinism, structured input errors, cache warm-up and bounded CI-oriented
|
|
23
|
+
flows. The principal gaps are silent success, incomplete parse disclosure,
|
|
24
|
+
SQL-injection recall, memory, and inconsistent CLI contracts.
|
|
25
|
+
|
|
26
|
+
## Priority Findings
|
|
27
|
+
|
|
28
|
+
| ID | Priority | Status | Finding and closure requirement |
|
|
29
|
+
|---|---|---|---|
|
|
30
|
+
| `BUG-01` | P0 | Open | `audit-report --format markdown` reproduced with `rc=0` and empty stdout. Add a non-empty-answer invariant and full/partial renderer coverage. |
|
|
31
|
+
| `BUG-02` | P0 | Open | Large `risk` ended `rc=127` with no output or structured error. Add fail-fast resource/process handling and durable partial checkpoints. |
|
|
32
|
+
| `BUG-12` | P0 | Open | Deep `--agent` output construction reaches multi-gigabyte RSS before producing a small answer. Bound projection while building, not after materialization. |
|
|
33
|
+
| `BUG-03` | P1 | Open | `content_id` changes between cold and warm because cache state is hashed into the answer. Separate execution metadata from answer identity. |
|
|
34
|
+
| `BUG-04` | P1 | Open | `selftest` publishes `complete=true` with five error rows. Derive bounds from its actual result population. |
|
|
35
|
+
| `BUG-04b` | P1 | Open | `selftest` uses a fixed 120-second deadline not covered by the documented analysis budget. Make it configurable or refuse unscoped large runs. |
|
|
36
|
+
| `BUG-05` | P1 | Open | Overloaded endpoint handlers can receive the wrong declaration line. Resolve by mapping annotation or publish ambiguity. |
|
|
37
|
+
| `BUG-06` | P1 | Open | The `repo-ir --budget-tokens 12000` help example is below the measured minimum view (~20,367 tokens) on the audited corpus. |
|
|
38
|
+
| `BUG-07` | P1 | Open | `--compact` exceeds the published size expectation on `migrate-check` and `spring-audit`. Apply bounded projections with omission metadata. |
|
|
39
|
+
| `BUG-08` | P1 | Open | Root help claims universal `--path`, `--repo` and `--dir` aliases, but sampled commands reject them. Align implementation and help. |
|
|
40
|
+
| `BUG-09` | P2 | Open | Related diff commands disagree on `--base`, `--base-ref`, `--since`, `--repo` and `--path`. Accept compatible aliases or publish one vocabulary. |
|
|
41
|
+
| `BUG-10` | P1 | Open | Unsupported routing styles can produce `coverage.gaps=[]`. Publish detected-but-unmodeled routing gaps. |
|
|
42
|
+
| `BUG-11` | P1 | Open | Default `pack assessment` can fail on a small Spring repository. Use a bounded default or explicit full mode. |
|
|
43
|
+
| `BUG-13` | P1 | Open | Unscoped `selftest` starts over nested repositories after warning. Refuse and require an explicit repository path. |
|
|
44
|
+
| `BUG-15` | P2 | Open | Non-terminal help output contains visible markup/control text. Strip markup when stdout is not a TTY. |
|
|
45
|
+
| `BUG-16` | P1 | Open | Context-cache growth is not bounded or documented; about 1.5 GB was measured. Add a published budget, eviction policy and status. |
|
|
46
|
+
| `BUG-19` | P2 | Open | Unknown-command errors use plain text instead of the JSON error envelope. Normalize command admission errors. |
|
|
47
|
+
| `BUG-20` | P2 | Open | `--detach` can report the unresolved user path while writing to a resolved Windows path. Publish the actual absolute output path. |
|
|
48
|
+
| `BUG-21` | P2 | Open | `--jobs 999` is silently clipped. Publish the effective limit or reject out-of-range values. |
|
|
49
|
+
| `BUG-22` | P1 | Open | RSS ceilings are checked post-hoc; a 50 MB ceiling was reported only after ~768 MB. Add periodic in-flight sampling and orderly abort. |
|
|
50
|
+
| `BUG-23` | P2 / coverage | Open | Micronaut is detected but unsupported and its controllers are not modeled as endpoints. Add a scoped coverage contract. |
|
|
51
|
+
|
|
52
|
+
## Performance Evidence
|
|
53
|
+
|
|
54
|
+
The audit measured `--agent` on ThingsBoard at **182.6 s / 2,088 MB RSS** and
|
|
55
|
+
`spring-audit` at **164.2 s cold**. On the larger MSAS corpus it reports
|
|
56
|
+
`ask . --agent` at **447 s**, `contract-diff` at **329 s**, `delta` at **187 s**,
|
|
57
|
+
and `validation --compact` at **91 s**. Warm root compact analysis can be below
|
|
58
|
+
one second; these are cold/deep-path costs.
|
|
59
|
+
|
|
60
|
+
Until the P0/P1 rows close, do not market `risk`, full `audit-report` or full
|
|
61
|
+
`--agent` as interactive guarantees for 3,000+ Java-file repositories. The
|
|
62
|
+
target remains bounded interactive views below 20 s and peak RSS below 400 MB
|
|
63
|
+
on the reference large-repository tier.
|
|
64
|
+
|
|
65
|
+
## Required Closure Bar
|
|
66
|
+
|
|
67
|
+
Each P0/P1 row requires a focused regression test, output/exit-code assertions,
|
|
68
|
+
cold/warm/concurrent runs on the affected platform, and a ledger entry naming
|
|
69
|
+
the fix commit and remaining verification boundary. Documentation alone never
|
|
70
|
+
closes a defect.
|
|
71
|
+
|
|
@@ -14,6 +14,32 @@ Status values: `open` · `in-progress` · `closed <version>` · `by-design` (wit
|
|
|
14
14
|
The facts these rows are keyed to are published: `ask schema facts-v1` prints the registry
|
|
15
15
|
(authority, definition, consumers, parity test) that the release battery enforces.
|
|
16
16
|
|
|
17
|
+
## Current Synchronization — External Audit `5.9.22` (2026-09-01)
|
|
18
|
+
|
|
19
|
+
The external audit confirms strong precision, determinism and uncertainty
|
|
20
|
+
disclosure, but opens a P0/P1 cluster around silent success, incomplete
|
|
21
|
+
population disclosure, large-run memory and compact-output contracts. Full
|
|
22
|
+
evidence: [`AUDIT-2026-09-01-EXTERNAL-5.9.22.md`](AUDIT-2026-09-01-EXTERNAL-5.9.22.md).
|
|
23
|
+
|
|
24
|
+
| ID | Severity | Status | Evidence and required closure |
|
|
25
|
+
|---|---:|---|---|
|
|
26
|
+
| `BUG-01` | Critical maximum | **open, P0** | Full Markdown `audit-report` reproduced with `rc=0` and empty stdout. Add a global non-empty-answer invariant and renderer coverage. |
|
|
27
|
+
| `BUG-02` | Critical maximum | **open, P0** | Large `risk` ended `rc=127` with no output or structured failure. Add fail-fast resource/process handling and durable partial checkpoints. |
|
|
28
|
+
| `BUG-12` | Critical maximum | **open, P0** | Deep `--agent` output construction reaches multi-gigabyte RSS before a small answer. Bound projection while building. |
|
|
29
|
+
| `BUG-03` | High | **open, P1** | `content_id` changes between cold and warm because cache state is hashed into identity. Separate execution metadata from answer identity. |
|
|
30
|
+
| `BUG-04` | High | **open, P1** | `selftest` publishes `complete=true` with five error rows. Derive bounds from actual results. |
|
|
31
|
+
| `BUG-05` | High | **open, P1** | Overloaded endpoint handlers can receive the wrong declaration line. Resolve by mapping annotation or publish ambiguity. |
|
|
32
|
+
| `BUG-07` | High | **open, P1** | `--compact` remains oversized on `migrate-check` and `spring-audit`. Apply bounded projections with omission metadata. |
|
|
33
|
+
| `BUG-10` | High | **open, P1** | Unsupported routing styles can produce empty coverage gaps. Publish detected-but-unmodeled routing gaps. |
|
|
34
|
+
| `BUG-11` | High | **open, P1** | Default `pack assessment` can fail on a small Spring repository. Use a bounded default or explicit full mode. |
|
|
35
|
+
| `BUG-13` | High | **open, P1** | Unscoped `selftest` starts over nested repositories after warning. Refuse and require an explicit path. |
|
|
36
|
+
| `BUG-16` | High | **open, P1** | Context-cache growth has no published budget or eviction contract; about 1.5 GB was measured. |
|
|
37
|
+
| `BUG-22` | High | **open, P1** | RSS ceilings are checked post-hoc. Add periodic sampling and orderly abort. |
|
|
38
|
+
|
|
39
|
+
The remaining `BUG-04b`, `BUG-06`, `BUG-08`, `BUG-09`, `BUG-15`, `BUG-19`,
|
|
40
|
+
`BUG-20`, `BUG-21` and `BUG-23` findings are open P2/coverage follow-ups in
|
|
41
|
+
the audit document. None is closed by documentation alone.
|
|
42
|
+
|
|
17
43
|
## Current Synchronization — External Audit `AUD-621`
|
|
18
44
|
|
|
19
45
|
**Release `5.9.19` remediation.** The stderr-decoding fix for `AUD-621-PACK-STDERR` remains in code, and the distinct `pack gate --since` crash found by the post-remediation re-audit is corrected with a Python 3.9–3.11-compatible tar extraction path. `AUD-621-R` has a second Windows barrier at process-pool construction, complementing the sequential fallback. The broader findings remain open until their required native Windows evidence is recorded; `AUD-621-CONTEXT` and `AUD-621-WIN-PROC` are unchanged.
|
|
@@ -59,7 +59,7 @@ single-repo, offline.**
|
|
|
59
59
|
| **Modernization planning** | `ask modernize .` | Hotspots, callerless types (with `unknown` where a framework may dispatch), coupling tangles, refactor roadmap |
|
|
60
60
|
| **Git-churn ranking** | `--rank-by git-churn` | File volatility via git history |
|
|
61
61
|
| **No truncation limits** | `--full` | Full transactional boundaries, DTO mappers, large result sets |
|
|
62
|
-
| **Spring semantic audit** | `ask spring-audit .` | TX-001..006 anomalies + SEC-001..
|
|
62
|
+
| **Spring semantic audit** | `ask spring-audit .` | TX-001..006 anomalies + SEC-001..010 security surface; JAVA/SPRING only |
|
|
63
63
|
| **Impact chain + opt-in TX/SEC findings** | `ask impact-chain <symbol>` (`--with-findings` for audit findings) | Systemic blast radius with transaction boundary and security surfaces per hop |
|
|
64
64
|
| **Event topology** | `ask impact-chain <event> --type events` | Publisher → event → consumer graph; AFTER_COMMIT/BEFORE_COMMIT TX phase |
|
|
65
65
|
| RIS bootstrap context | `ask cold-start .` | Repository Intelligence Snapshot; instant return from persisted cache |
|
|
@@ -382,6 +382,9 @@ Output: detected stacks, entry points, dependencies, transactional boundaries (S
|
|
|
382
382
|
### `ask --agent`
|
|
383
383
|
|
|
384
384
|
More structured version of `--compact`. Designed for AI agent system prompt injection.
|
|
385
|
+
It is bounded to 40 KB on stdout and admits repositories up to 10,000 Java files;
|
|
386
|
+
larger repositories return `AGENT_SCOPE_TOO_LARGE` before expensive analysis. Use
|
|
387
|
+
`--compact` or narrow the path in that case.
|
|
385
388
|
|
|
386
389
|
```bash
|
|
387
390
|
ask /repo --agent --output context.json
|
|
@@ -528,7 +531,7 @@ disabled changes runtime behaviour nobody measured; a diff is how a person makes
|
|
|
528
531
|
call with the evidence in front of them.
|
|
529
532
|
|
|
530
533
|
**TX patterns (TX-001..TX-006):** proxy bypass, nested transactions, readOnly propagation, NOT_SUPPORTED in active TX, exception swallowing, self-invocation of a `@Transactional` sibling.
|
|
531
|
-
**SEC patterns (SEC-001..SEC-
|
|
534
|
+
**SEC patterns (SEC-001..SEC-010):** unsecured endpoints, CVE-2025-41248 `@PreAuthorize` inheritance bypass, `@Transactional` on controllers, passwords stored under a fast unsalted digest, CSRF disabled under session-bearing authentication, cookies created without the Secure attribute, credentials stored in a deployment descriptor, SQL built by MyBatis string interpolation, anonymous request-chain exceptions, and HTTP input reaching a concatenated known query sink through bounded positional in-repository calls. **DEAD-001** reports a security control that is present only in comments and therefore disabled.
|
|
532
535
|
**GATE patterns (GATE-001..GATE-004):** custom AOP/security-gate risks over the same custom-gate authority published in `security_posture`: proxy bypass (`private`/`final`/self-invocation), advice that appears to fail open, disabled or tautological annotation attributes, and fragile `args[0]`/reflection binding.
|
|
533
536
|
|
|
534
537
|
Each finding includes `severity`, `confidence`, `symbol`, `source_file`, `evidence`, `explanation`, and `fix_hint`. JAVA/SPRING ONLY.
|
|
@@ -1812,10 +1815,10 @@ stops at 1 408 files inside the `SEC-004` group and ends at 5.1s.
|
|
|
1812
1815
|
**Memory budget.** Repository-scoped JSON answers include `_meta.memory` with
|
|
1813
1816
|
`unit: "MB"`, the observed `peak_rss_mb`, the `peak_rss_basis` it was sampled
|
|
1814
1817
|
from, `configured_max_rss_mb`, and `ceiling_enforceable`. To bound long analyses
|
|
1815
|
-
on a CI or supervised runner, set `ASK_MAX_RSS_MB=<megabytes>`.
|
|
1816
|
-
ceiling produces exit code `1`
|
|
1817
|
-
|
|
1818
|
-
|
|
1818
|
+
on a CI or supervised runner, set `ASK_MAX_RSS_MB=<megabytes>`. `--agent` uses
|
|
1819
|
+
1,536 MB when the variable is unset. Exceeding the ceiling produces exit code `1`
|
|
1820
|
+
and a structured `MEMORY_TOO_LARGE` error with the peak and configured limit; no
|
|
1821
|
+
partial answer is published. Set the variable to `0` to disable this ceiling.
|
|
1819
1822
|
|
|
1820
1823
|
Where the platform exposes no footprint sample, `peak_rss_mb` is `null` and
|
|
1821
1824
|
`peak_rss_basis` says why — never `0`, which would read as a measured floor. A
|
|
@@ -99,6 +99,16 @@ def _gaps(payload: "dict[str, Any]") -> "list[dict[str, Any]]":
|
|
|
99
99
|
found.append({"field": "non_coverage", "what": _summarise(entry)})
|
|
100
100
|
elif non_coverage:
|
|
101
101
|
found.append({"field": "non_coverage", "what": _summarise(non_coverage)})
|
|
102
|
+
populations = [payload.get("population")]
|
|
103
|
+
metadata = payload.get("metadata")
|
|
104
|
+
if isinstance(metadata, dict):
|
|
105
|
+
populations.append(metadata.get("population"))
|
|
106
|
+
for population in populations:
|
|
107
|
+
if not isinstance(population, dict):
|
|
108
|
+
continue
|
|
109
|
+
for failure in _as_list(population.get("parse_failures")):
|
|
110
|
+
if failure:
|
|
111
|
+
found.append({"field": "population.parse_failures", "what": _summarise(failure)})
|
|
102
112
|
for prefix, block in _blocks(payload):
|
|
103
113
|
for field in _GAP_FIELDS:
|
|
104
114
|
value = block.get(field)
|
|
@@ -594,6 +594,7 @@ def ir_dict_to_canonical(
|
|
|
594
594
|
"edge_count": len(call_graph),
|
|
595
595
|
"subsystems": ir.get("subsystems") or [],
|
|
596
596
|
"analysis_gaps": ir.get("analysis_gaps") or [],
|
|
597
|
+
"population": ir.get("population") or {},
|
|
597
598
|
"spring_events": ir.get("spring_events") or {},
|
|
598
599
|
"score_basis": (ir.get("impact") or {}).get("score_basis", "none"),
|
|
599
600
|
"reverse_graph_size": len(ir.get("reverse_graph") or {}),
|
|
@@ -513,6 +513,28 @@ _START_HERE: "tuple[tuple[str, str], ...]" = (
|
|
|
513
513
|
)
|
|
514
514
|
|
|
515
515
|
|
|
516
|
+
def _start_here_entries(root: "Optional[Path]") -> "tuple[tuple[str, str], ...]":
|
|
517
|
+
"""Return pasteable first steps that the measured repository can accept."""
|
|
518
|
+
if root is None:
|
|
519
|
+
return _START_HERE
|
|
520
|
+
try:
|
|
521
|
+
from sourcecode.spring_profiles import profile_population
|
|
522
|
+
|
|
523
|
+
profiles = profile_population(root).names
|
|
524
|
+
except Exception:
|
|
525
|
+
# Help must remain available if a repository cannot be read.
|
|
526
|
+
return _START_HERE
|
|
527
|
+
if len(profiles) < 2:
|
|
528
|
+
# `posture --diff` rejects undeclared profile names. Do not publish an
|
|
529
|
+
# example that cannot run on this repository.
|
|
530
|
+
return tuple(entry for entry in _START_HERE if not entry[0].startswith("posture "))
|
|
531
|
+
diff = f"posture . --diff {profiles[0]}:{profiles[1]}"
|
|
532
|
+
return tuple(
|
|
533
|
+
(diff, answers) if invocation.startswith("posture ") else (invocation, answers)
|
|
534
|
+
for invocation, answers in _START_HERE
|
|
535
|
+
)
|
|
536
|
+
|
|
537
|
+
|
|
516
538
|
#: Resolved bounding flags, by invocation. Deliberately **not** an `lru_cache`:
|
|
517
539
|
#: only a resolution that found the command is stored. AUD-601-D01 — the front
|
|
518
540
|
#: page is composed while this module is still being imported, so the first
|
|
@@ -637,6 +659,8 @@ def _start_here_block(scope: "Optional[Any]" = None) -> str:
|
|
|
637
659
|
BUCKET_ORDER, BUCKET_TITLE, BUDGETED, DETACH, RUNS_NOW, UNKNOWN, plan,
|
|
638
660
|
)
|
|
639
661
|
|
|
662
|
+
root = getattr(scope, "root", None) if scope is not None else None
|
|
663
|
+
entries = _start_here_entries(root)
|
|
640
664
|
if scope is None or not scope.measured:
|
|
641
665
|
# AUD-601-D01. The ceiling is a property of the **command**, not of the
|
|
642
666
|
# repository, so the bounding flag must not depend on measuring one.
|
|
@@ -647,13 +671,13 @@ def _start_here_block(scope: "Optional[Any]" = None) -> str:
|
|
|
647
671
|
# the generator covers them, and this rendering never called it.
|
|
648
672
|
static = [
|
|
649
673
|
(_bounded_invocation(invocation), answers)
|
|
650
|
-
for invocation, answers in
|
|
674
|
+
for invocation, answers in entries
|
|
651
675
|
]
|
|
652
676
|
width = max([29] + [len(invocation) + 1 for invocation, _ in static])
|
|
653
677
|
lines = ["[bold]Start here — Java/Spring analysis:[/bold]"]
|
|
654
678
|
for invocation, answers in static:
|
|
655
679
|
lines.append(f" {invocation:<{width}}[dim]# {answers}[/dim]")
|
|
656
|
-
if any(bounded != raw for (bounded, _), (raw, _) in zip(static,
|
|
680
|
+
if any(bounded != raw for (bounded, _), (raw, _) in zip(static, entries)):
|
|
657
681
|
lines.append(
|
|
658
682
|
" [dim]Bounded for a first look: each line above carries the "
|
|
659
683
|
"flag its command declares against the output ceiling. Drop it, "
|
|
@@ -661,7 +685,7 @@ def _start_here_block(scope: "Optional[Any]" = None) -> str:
|
|
|
661
685
|
)
|
|
662
686
|
return "\n".join(lines)
|
|
663
687
|
|
|
664
|
-
answers = dict(
|
|
688
|
+
answers = dict(entries)
|
|
665
689
|
# AUD-596-X02: this block sold three commands under "Runs now" and two of
|
|
666
690
|
# them exited 1 here, both with `OUTPUT_TOO_LARGE` — `posture . --diff
|
|
667
691
|
# dev:prod` at ~71K estimated tokens over a 50K ceiling, and `endpoints .`
|
|
@@ -672,12 +696,12 @@ def _start_here_block(scope: "Optional[Any]" = None) -> str:
|
|
|
672
696
|
# it from an error.
|
|
673
697
|
bounded = {
|
|
674
698
|
invocation: _bounded_invocation(invocation)
|
|
675
|
-
for invocation, _ in
|
|
699
|
+
for invocation, _ in entries
|
|
676
700
|
}
|
|
677
701
|
for invocation, bounded_form in bounded.items():
|
|
678
702
|
if bounded_form != invocation:
|
|
679
703
|
answers[bounded_form] = answers[invocation]
|
|
680
|
-
grouped = plan([bounded[invocation] for invocation, _ in
|
|
704
|
+
grouped = plan([bounded[invocation] for invocation, _ in entries], scope)
|
|
681
705
|
|
|
682
706
|
# AUD-597-A01. The plan orders by *time* and the ceiling refuses by *size*,
|
|
683
707
|
# so a command that is seconds away from an answer it cannot print is not a
|
|
@@ -729,7 +753,7 @@ def _start_here_block(scope: "Optional[Any]" = None) -> str:
|
|
|
729
753
|
" [dim]…each of these answers into a file and survives the shell:"
|
|
730
754
|
" add --output <file> --detach[/dim]"
|
|
731
755
|
)
|
|
732
|
-
if any(bounded[invocation] != invocation for invocation, _ in
|
|
756
|
+
if any(bounded[invocation] != invocation for invocation, _ in entries):
|
|
733
757
|
lines.append(
|
|
734
758
|
" [dim]Bounded for a first look: each line above carries the flag "
|
|
735
759
|
"its command declares against the output ceiling. Drop it, or add "
|
|
@@ -888,12 +912,12 @@ scope matches; `ask cache model` says exactly what a warm buys per command.
|
|
|
888
912
|
data-exposure . [dim]# one semantic model is shared across declared label seeds[/dim]
|
|
889
913
|
repo-ir . --since main --budget-tokens 12000 [dim]# bounded agent context[/dim]
|
|
890
914
|
migrate-check . --format sarif -o migration.sarif [dim]# located migration findings[/dim]
|
|
891
|
-
[dim]
|
|
892
|
-
|
|
915
|
+
[dim]Repository paths are normally positional. Commands that publish --path, --repo
|
|
916
|
+
or --dir accept that documented spelling; use each command's --help for its grammar.[/dim]
|
|
893
917
|
|
|
894
918
|
ASK_MAX_ANALYSIS_SECONDS=N [dim]# deadline for {_budget_tiers_phrase()}[/dim]
|
|
895
919
|
[dim]Other commands do not consume this budget; use `--progress` or `--detach` where offered.[/dim]
|
|
896
|
-
ASK_MAX_RSS_MB=N [dim]# peak resident-memory ceiling
|
|
920
|
+
ASK_MAX_RSS_MB=N [dim]# peak resident-memory ceiling; --agent defaults to 1536 MB, 0 disables[/dim]
|
|
897
921
|
[dim]Repository JSON answers publish `_meta.memory.peak_rss_mb` with its basis; exceeding the ceiling
|
|
898
922
|
returns MEMORY_TOO_LARGE, and a platform that exposes no sample returns MEMORY_CEILING_UNAVAILABLE
|
|
899
923
|
rather than passing a ceiling nothing measured.[/dim]
|
|
@@ -1796,7 +1820,12 @@ def _apply_budget(
|
|
|
1796
1820
|
|
|
1797
1821
|
to_file = output_path is not None
|
|
1798
1822
|
return _trim(
|
|
1799
|
-
data,
|
|
1823
|
+
data,
|
|
1824
|
+
budget_bytes,
|
|
1825
|
+
label=label,
|
|
1826
|
+
skip=to_file,
|
|
1827
|
+
warn_stderr=not to_file,
|
|
1828
|
+
strict=(label in {"agent", "compact"}),
|
|
1800
1829
|
)
|
|
1801
1830
|
|
|
1802
1831
|
|
|
@@ -3140,6 +3169,18 @@ def _emit_command_output(
|
|
|
3140
3169
|
not about the encoding. A command that already serialized its own YAML passes
|
|
3141
3170
|
the default and is untouched: the conversion only fires on a JSON object.
|
|
3142
3171
|
"""
|
|
3172
|
+
# A completed analysis with no payload is never a successful answer. The
|
|
3173
|
+
# process-level guard also catches this for the production entry point, but
|
|
3174
|
+
# rejecting it here protects every direct Typer invocation and prevents an
|
|
3175
|
+
# empty file from being published as an artefact.
|
|
3176
|
+
if not content.strip():
|
|
3177
|
+
_emit_error_json(
|
|
3178
|
+
EXECUTION_FAILED_CODE,
|
|
3179
|
+
"The command finished without publishing an answer.",
|
|
3180
|
+
command=_ANSWER_REQUIRED_BY or "unknown",
|
|
3181
|
+
expected="a non-empty parseable answer or report",
|
|
3182
|
+
)
|
|
3183
|
+
raise typer.Exit(code=1)
|
|
3143
3184
|
if stamp_envelope:
|
|
3144
3185
|
content = _stamp_envelope(content)
|
|
3145
3186
|
if fmt == "yaml":
|
|
@@ -4906,6 +4947,24 @@ DOCS_DEPTH_CHOICES = ["module", "symbols", "full"]
|
|
|
4906
4947
|
_FREE_TIER_NODE_CAP: int = 50 # graph/semantic node cap — applies only to large repos on free tier
|
|
4907
4948
|
_JAVA_MIN_SCAN_DEPTH: int = 12 # Maven src/main/java/<pkg>/<module>/File depth floor
|
|
4908
4949
|
_LARGE_REPO_ADVISORY_FILES: int = 3000 # cold-scan advisory threshold (files); honest expectation-setting, not a speed claim
|
|
4950
|
+
_AGENT_JAVA_FILE_CAP: int = 10_000
|
|
4951
|
+
|
|
4952
|
+
|
|
4953
|
+
def _agent_scope_error(root: Path) -> "Optional[dict[str, Any]]":
|
|
4954
|
+
"""Refuse an agent run that cannot stay inside its memory contract."""
|
|
4955
|
+
try:
|
|
4956
|
+
java_files = sum(1 for _ in root.rglob("*.java"))
|
|
4957
|
+
except OSError:
|
|
4958
|
+
return None
|
|
4959
|
+
if java_files <= _AGENT_JAVA_FILE_CAP:
|
|
4960
|
+
return None
|
|
4961
|
+
return {
|
|
4962
|
+
"code": "AGENT_SCOPE_TOO_LARGE",
|
|
4963
|
+
"message": f"--agent is limited to {_AGENT_JAVA_FILE_CAP:,} Java files by default; this repository has {java_files:,}.",
|
|
4964
|
+
"hint": "Use --compact for the bounded summary, or narrow the repository path.",
|
|
4965
|
+
"java_files": java_files,
|
|
4966
|
+
"max_java_files": _AGENT_JAVA_FILE_CAP,
|
|
4967
|
+
}
|
|
4909
4968
|
|
|
4910
4969
|
#: What one Java file costs in serialized `repo-ir` output, measured across five
|
|
4911
4970
|
#: repositories (C3-18): spring-petclinic 30 files/318 KB (10.8 KB/file),
|
|
@@ -5769,7 +5828,14 @@ def main(
|
|
|
5769
5828
|
code_notes = True
|
|
5770
5829
|
no_tree = True # agents never need the raw file tree
|
|
5771
5830
|
architecture = True # agents need full architectural signal (M4)
|
|
5772
|
-
|
|
5831
|
+
# Module graphs are quadratic on large import populations and are not
|
|
5832
|
+
# required by agent_view. Keep them opt-in via --graph-modules.
|
|
5833
|
+
_agent_error = _agent_scope_error(target)
|
|
5834
|
+
if _agent_error is not None:
|
|
5835
|
+
_emit_error_json(
|
|
5836
|
+
_agent_error.pop("code"), _agent_error.pop("message"), **_agent_error
|
|
5837
|
+
)
|
|
5838
|
+
raise typer.Exit(code=2)
|
|
5773
5839
|
|
|
5774
5840
|
# --compact implicitly enables lightweight analysis passes so that
|
|
5775
5841
|
# dependency_summary, env_summary and code_notes_summary are never null.
|
|
@@ -6351,6 +6417,7 @@ def main(
|
|
|
6351
6417
|
"""Close a phase and stop the run if the operator's budget is spent."""
|
|
6352
6418
|
_root_run.completed.append(phase)
|
|
6353
6419
|
if not _root_run.exhausted():
|
|
6420
|
+
_root_memory_seam()
|
|
6354
6421
|
return
|
|
6355
6422
|
_progress.stop()
|
|
6356
6423
|
_block = _root_run.status(_WHY_BUDGET)
|
|
@@ -6362,6 +6429,26 @@ def main(
|
|
|
6362
6429
|
_emit_command_output(_serialize_dict(_block, format), output, copy)
|
|
6363
6430
|
raise typer.Exit(code=_exit)
|
|
6364
6431
|
|
|
6432
|
+
def _root_memory_seam() -> None:
|
|
6433
|
+
"""Enforce the agent's protective RSS ceiling at every root boundary."""
|
|
6434
|
+
if not agent:
|
|
6435
|
+
return
|
|
6436
|
+
from sourcecode import resource_budget
|
|
6437
|
+
|
|
6438
|
+
memory_error = resource_budget.exceeded(
|
|
6439
|
+
"ask --agent",
|
|
6440
|
+
default_ceiling_mb=resource_budget.DEFAULT_AGENT_RSS_CEILING_MB,
|
|
6441
|
+
)
|
|
6442
|
+
if memory_error is None:
|
|
6443
|
+
return
|
|
6444
|
+
_progress.stop()
|
|
6445
|
+
_emit_error_json(
|
|
6446
|
+
memory_error.pop("code"),
|
|
6447
|
+
memory_error.pop("message"),
|
|
6448
|
+
**memory_error,
|
|
6449
|
+
)
|
|
6450
|
+
raise typer.Exit(code=1)
|
|
6451
|
+
|
|
6365
6452
|
_perf_discovery = perf.start()
|
|
6366
6453
|
scanner = AdaptiveScanner(target, topology=_topology, base_depth=effective_depth,
|
|
6367
6454
|
extra_excludes=_extra_excludes)
|
|
@@ -7099,7 +7186,7 @@ def main(
|
|
|
7099
7186
|
_root_timing.setdefault("ris_ms", 0.0)
|
|
7100
7187
|
_root_timing.setdefault("snapshot_ms", 0.0)
|
|
7101
7188
|
# 4. Serialize
|
|
7102
|
-
_progress.update("serializing output")
|
|
7189
|
+
_progress.update("building bounded agent context" if agent else "serializing output")
|
|
7103
7190
|
_perf_serialize = perf.start()
|
|
7104
7191
|
if _is_contract_mode and not agent:
|
|
7105
7192
|
from sourcecode.serializer import contract_view as _contract_view
|
|
@@ -7156,6 +7243,7 @@ def main(
|
|
|
7156
7243
|
content = _serialize_dict(data, format)
|
|
7157
7244
|
|
|
7158
7245
|
perf.stop("serialize", _perf_serialize)
|
|
7246
|
+
_root_seam("serialize")
|
|
7159
7247
|
perf.flush_recorder()
|
|
7160
7248
|
|
|
7161
7249
|
# 5. Write output (CLI-04)
|
|
@@ -2673,6 +2673,20 @@ class MigrationReport:
|
|
|
2673
2673
|
for _col in ("evidence", "target_lts_blockers"):
|
|
2674
2674
|
_cap_into(_l, _col, top_n)
|
|
2675
2675
|
compact["java_lts_inventory"] = _l
|
|
2676
|
+
inventory = full.get("jvm_inventory")
|
|
2677
|
+
if isinstance(inventory, dict) and isinstance(inventory.get("frameworks"), dict):
|
|
2678
|
+
_inventory = dict(inventory)
|
|
2679
|
+
_frameworks: dict[str, dict] = {}
|
|
2680
|
+
for _name, _framework in inventory["frameworks"].items():
|
|
2681
|
+
if not isinstance(_framework, dict):
|
|
2682
|
+
_frameworks[_name] = _framework
|
|
2683
|
+
continue
|
|
2684
|
+
_bounded = dict(_framework)
|
|
2685
|
+
for _collection in ("declared", "observed"):
|
|
2686
|
+
_cap_into(_bounded, _collection, top_n)
|
|
2687
|
+
_frameworks[_name] = _bounded
|
|
2688
|
+
_inventory["frameworks"] = _frameworks
|
|
2689
|
+
compact["jvm_inventory"] = _inventory
|
|
2676
2690
|
return compact
|
|
2677
2691
|
|
|
2678
2692
|
def to_text(self, min_severity: str = "low") -> str:
|
|
@@ -487,6 +487,7 @@ _STACK_INDEPENDENT_AXES: "tuple[str, ...]" = (
|
|
|
487
487
|
def stack_fit(
|
|
488
488
|
spring_detected: bool,
|
|
489
489
|
security_frameworks: "tuple[str, ...] | list[str]" = (),
|
|
490
|
+
spring_footprint: "Optional[dict[str, int]]" = None,
|
|
490
491
|
) -> dict:
|
|
491
492
|
"""Whether this product's Spring-shaped axes model the repository. (CL-19)
|
|
492
493
|
|
|
@@ -553,6 +554,22 @@ def stack_fit(
|
|
|
553
554
|
"Spring Security result must not be read as public access."
|
|
554
555
|
),
|
|
555
556
|
}
|
|
557
|
+
footprint = spring_footprint or {}
|
|
558
|
+
beans = int(footprint.get("spring_beans") or 0)
|
|
559
|
+
java_files = int(footprint.get("java_files") or 0)
|
|
560
|
+
if spring_detected and java_files and beans / java_files < 0.1:
|
|
561
|
+
return {
|
|
562
|
+
"schema_version": STACK_FIT_SCHEMA,
|
|
563
|
+
"spring_detected": True,
|
|
564
|
+
"fit": "partial",
|
|
565
|
+
"spring_footprint": {"spring_beans": beans, "java_files": java_files},
|
|
566
|
+
"statement": (
|
|
567
|
+
"Spring is present but marginal in this scope, so Spring-shaped axes "
|
|
568
|
+
"model only the detected Spring population. Do not read their absence "
|
|
569
|
+
"of findings as coverage of the remaining repository."
|
|
570
|
+
),
|
|
571
|
+
"how_to_read": "Use Spring results for the detected Spring population only.",
|
|
572
|
+
}
|
|
556
573
|
if spring_detected:
|
|
557
574
|
return {
|
|
558
575
|
"schema_version": STACK_FIT_SCHEMA,
|