sourcecode 5.8.22__tar.gz → 5.8.24__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.22 → sourcecode-5.8.24}/CHANGELOG.md +78 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/PKG-INFO +32 -4
- {sourcecode-5.8.22 → sourcecode-5.8.24}/README.md +31 -3
- sourcecode-5.8.24/docs/AUDIT-2026-08-22-5.8.22.md +96 -0
- sourcecode-5.8.24/docs/AUDIT-TESTING-CORPUS-2026-08-22.md +228 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/CACHE.md +16 -6
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/COMMERCIAL-OFFER.md +4 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/DEFECT-LEDGER.md +399 -26
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/DEVELOPMENT-ROADMAP.md +130 -3
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/EXECUTIVE-ROADMAP.md +81 -2
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/MANUAL-USUARIO.md +34 -0
- sourcecode-5.8.24/docs/PRODUCT-ROUTE.md +162 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/USER_GUIDE.md +26 -3
- sourcecode-5.8.24/docs/architecture/DESIGN-assessment-deployment-evidence.md +29 -0
- sourcecode-5.8.24/docs/architecture/DESIGN-assessment-report.md +55 -0
- sourcecode-5.8.24/docs/architecture/DESIGN-build-closure-provenance.md +31 -0
- sourcecode-5.8.24/docs/architecture/DESIGN-pack-gate-ci.md +43 -0
- sourcecode-5.8.24/docs/architecture/DESIGN-pack-manifest.md +189 -0
- sourcecode-5.8.24/docs/architecture/DESIGN-pack-mcp-api.md +47 -0
- sourcecode-5.8.24/docs/pack-gate-github-actions.yml +31 -0
- sourcecode-5.8.24/docs/pack-gate-gitlab.yml +15 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/perf/REGRESSION-GATE.md +1 -2
- sourcecode-5.8.24/docs/perf/corpus-testing-2026-08-22.md +88 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/pyproject.toml +1 -1
- {sourcecode-5.8.22 → sourcecode-5.8.24}/scripts/perf_harness.py +5 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/__init__.py +1 -1
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/audit_report.py +8 -1
- sourcecode-5.8.24/src/sourcecode/build_stamp.py +185 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/cache_model.py +219 -5
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/ci_output.py +48 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/cli.py +492 -100
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/data_exposure.py +16 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/envelope.py +52 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/execution_plan.py +7 -3
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/field_deprecations.py +48 -3
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/format_contract.py +2 -2
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/mcp/server.py +160 -2
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/migrate_check.py +204 -4
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/output_bounds.py +11 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/output_ceiling.py +148 -6
- sourcecode-5.8.24/src/sourcecode/pack_manifest.py +464 -0
- sourcecode-5.8.24/src/sourcecode/packs.py +906 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/perf.py +24 -2
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/phased_run.py +84 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/product_info.py +43 -1
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/readonly.py +19 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/regress.py +5 -1
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/rename_refactor.py +63 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/schema_registry.py +35 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/validation_surface.py +9 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/verify_edit.py +25 -2
- sourcecode-5.8.22/docs/PRODUCT-ROUTE.md +0 -94
- sourcecode-5.8.22/src/sourcecode/build_stamp.py +0 -49
- sourcecode-5.8.22/src/sourcecode/packs.py +0 -155
- {sourcecode-5.8.22 → sourcecode-5.8.24}/.github/workflows/build-windows.yml +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/.github/workflows/perf-gate.yml +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/.gitignore +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/.ruff.toml +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/CLAUDE.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/CONTRIBUTING.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/LICENSE +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/NOTICE +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/SECURITY.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/CUSTOMER-VALIDATION.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/DEMO-5MIN.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/EXECUTION-PLAN-12MO.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/MODERNIZATION.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/PRODUCT_AUDIT.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/PRODUCT_IDENTITY.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/PRODUCT_TIERS.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/RC1-CHECKLIST.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/RELEASE-CHECKLIST.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/architecture/CATALOG-retrieval-intents.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/architecture/DESIGN-knowledge-provider-integration.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/architecture/DESIGN-p5.3b-statement-surface.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/architecture/DESIGN-p5.5-span-index.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/architecture/DESIGN-p6-semantic-impact-engine.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/architecture/DESIGN-p6-semantic-integration-engine.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/architecture/DESIGN-p7-semantic-services.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/architecture/DESIGN-robustness-security-inference.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/architecture/DESIGN-semantic-retrieval.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/architecture/EPV-p6-class-typeref.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/architecture/REPORT-p6-flow-analyzer-comparison.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/architecture/REPORT-p6-integration-detector-comparison.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/architecture/REPORT-p8-flow-analyzer-migration.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/architecture/REPORT-p9-integration-detector-migration.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/architecture/adr/0001-semantic-ir.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/architecture/adr/0002-source-evidence-boundary.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/architecture/adr/0003-architectural-characterization.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/architecture/adr/0004-semantic-retrieval.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/architecture/adr/0005-evidence-reconciliation.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/architecture/adr/0006-performance-harness.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/architecture/adr/0007-composition-semantics.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/architecture/adr/0008-answer-coherence.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/architecture/consumer-disposition-inventory.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/architecture/overview.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/architecture/product-architecture-review.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/architecture/product-strategy-layering.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/architecture/semantic-ir-consumer-matrix.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/architecture/semantic-ir-roadmap.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/baseline-ci.yml +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/commercial-pipeline-audit.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/contracts-ci.yml +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/contracts.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/eval/2026-06-15-petclinic-rest-issue11-vets-pagination.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/eval/2026-06-15-petclinic-rest-issue147-validation.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/eval/2026-06-15-petclinic-rest-workflow.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/eval/2026-06-15-phase18-openapi-surface.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/eval/2026-06-15-phase20-validation-surface.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/eval/2026-06-16-broadleaf-checkout-impact-fieldtest.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/eval/2026-06-16-petclinic-rest-issue11-weakness2-closed.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/eval/2026-06-16-spring-petclinic-issue2333-dead-vets.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/licensing-schema.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/migrate-check.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/perf/README.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/perf/baselines/2.5.15/SUMMARY.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/perf/baselines/2.5.15/alfresco__ask__cold.json +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/perf/baselines/2.5.15/alfresco__ask__warm.json +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/perf/baselines/2.5.15/broadleaf__ask__cold.json +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/perf/baselines/2.5.15/broadleaf__ask__warm.json +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/perf/baselines/2.5.15/eureka__ask__cold.json +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/perf/baselines/2.5.15/eureka__ask__warm.json +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/perf/baselines/2.5.15/jenkins__ask__cold.json +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/perf/baselines/2.5.15/jenkins__ask__warm.json +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/perf/baselines/2.5.15/jobrunr__ask__cold.json +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/perf/baselines/2.5.15/jobrunr__ask__warm.json +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/perf/baselines/2.5.15/keycloak__ask__cold.json +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/perf/baselines/2.5.15/keycloak__ask__warm.json +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/perf/baselines/2.5.15/neo4j__ask__cold.json +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/perf/baselines/2.5.15/neo4j__ask__warm.json +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/perf/baselines/2.5.15/ofbiz__ask__cold.json +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/perf/baselines/2.5.15/ofbiz__ask__warm.json +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/perf/baselines/2.5.15/openmrs__ask__cold.json +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/perf/baselines/2.5.15/openmrs__ask__warm.json +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/perf/baselines/2.5.15/petclinic__ask__cold.json +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/perf/baselines/2.5.15/petclinic__ask__warm.json +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/perf/baselines/2.5.16/SUMMARY.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/perf/baselines/2.5.16/alfresco__ask__cold.json +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/perf/baselines/2.5.16/alfresco__ask__warm.json +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/perf/baselines/2.5.16/broadleaf__ask__cold.json +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/perf/baselines/2.5.16/broadleaf__ask__warm.json +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/perf/baselines/2.5.16/eureka__ask__cold.json +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/perf/baselines/2.5.16/eureka__ask__warm.json +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/perf/baselines/2.5.16/jenkins__ask__cold.json +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/perf/baselines/2.5.16/jenkins__ask__warm.json +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/perf/baselines/2.5.16/jobrunr__ask__cold.json +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/perf/baselines/2.5.16/jobrunr__ask__warm.json +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/perf/baselines/2.5.16/keycloak__ask__cold.json +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/perf/baselines/2.5.16/keycloak__ask__warm.json +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/perf/baselines/2.5.16/neo4j__ask__cold.json +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/perf/baselines/2.5.16/neo4j__ask__warm.json +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/perf/baselines/2.5.16/ofbiz__ask__cold.json +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/perf/baselines/2.5.16/ofbiz__ask__warm.json +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/perf/baselines/2.5.16/openmrs__ask__cold.json +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/perf/baselines/2.5.16/openmrs__ask__warm.json +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/perf/baselines/2.5.16/petclinic__ask__cold.json +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/perf/baselines/2.5.16/petclinic__ask__warm.json +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/perf/baselines/gate-latest/README.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/perf/baselines/gate-latest/broadleaf__ask__warm.json +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/perf/baselines/gate-latest/broadleaf__endpoints__warm.json +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/perf/baselines/gate-latest/broadleaf__migrate-check__warm.json +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/perf/baselines/gate-latest/broadleaf__posture__warm.json +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/perf/baselines/gate-latest/broadleaf__spring-audit__warm.json +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/perf/baselines/gate-latest/broadleaf__validation__warm.json +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/perf/baselines/reference-best/README.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/posture.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/privacy.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/pro-experience-audit.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/schema.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/spec/envelope-v1.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/docs/spring-audit-ci.yml +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/hatch_build.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/scripts/compare_integration_engines.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/scripts/customer_smoke_test.sh +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/scripts/generate_jdk_exports.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/scripts/perf_gate.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/scripts/sync_gate_anchors.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/scripts/test_fast.sh +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/adaptive_scanner.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/analysis_budget.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/answer_bounds.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/archetype.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/architectural_baseline.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/architectural_delta.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/architecture_analyzer.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/architecture_summary.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/ast_extractor.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/audit_clusters.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/audit_recipe.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/audit_since.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/baseline_autocapture.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/breaking_changes.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/build_modules.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/bundled_docs.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/cache.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/call_surface.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/caller_metrics.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/caller_reach.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/canonical_ir.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/chain_rules.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/change_plan.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/cir_graphs.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/classifier.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/client_calls.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/code_notes_analyzer.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/compare.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/confidence_analyzer.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/constraint_diff.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/consumer_join.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/container_wiring.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/context_cache.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/context_graph.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/context_scorer.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/context_summarizer.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/contract_diff.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/contract_init.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/contract_model.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/contract_pipeline.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/coverage_parser.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/data_labels.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/declarations.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/defect_classes/__init__.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/defect_classes/registry.json +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/defect_identity.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/degradation.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/dependency_analyzer.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/deployment_prefix.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/detach.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/detectors/__init__.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/detectors/base.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/detectors/csproj_parser.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/detectors/dart.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/detectors/dotnet.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/detectors/elixir.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/detectors/go.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/detectors/heuristic.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/detectors/hybrid.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/detectors/java.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/detectors/jvm_ext.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/detectors/nodejs.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/detectors/parsers.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/detectors/php.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/detectors/project.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/detectors/python.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/detectors/ruby.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/detectors/rust.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/detectors/systems.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/detectors/terraform.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/detectors/tooling.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/doc_analyzer.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/dynamic_argument_surface.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/empty_reach.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/endpoint_disposition.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/endpoint_literals.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/endpoint_metrics.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/entrypoint_classifier.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/env_analyzer.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/environment_resolution.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/error_schema.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/evidence_provider.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/explain.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/explain_endpoint.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/facts/__init__.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/facts/registry.json +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/file_chunker.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/file_classifier.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/filter_surface.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/fqn_utils.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/functional_routes.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/gate_anchors.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/git_analyzer.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/git_checkout.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/github_diff.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/graph_analyzer.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/graph_evidence.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/hibernate_strat.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/identity_fallback.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/integration_coordinates.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/jdk_exports.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/license.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/manifest_cache.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/mcp/__init__.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/mcp/dependency_import.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/mcp/onboarding/__init__.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/mcp/onboarding/applier.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/mcp/onboarding/backup.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/mcp/onboarding/detector.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/mcp/onboarding/planner.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/mcp/orchestrator.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/mcp/registry.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/mcp/runner.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/mcp_nudge.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/metrics_analyzer.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/migration_apply.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/migration_blast.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/non_coverage.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/openapi_surface.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/openrewrite_recipe.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/output_budget.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/output_encoding.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/output_sink.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/parallel.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/parse_cache.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/partial_contract.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/path_admission.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/path_filters.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/pipe_contract.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/posture.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/pr_comment_renderer.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/pr_impact.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/prepare_context.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/progress.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/provenance.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/ranking_engine.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/readiness_timeline.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/reconciliation.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/redactor.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/reference_facts.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/release_info.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/relevance_scorer.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/remediation_diff.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/remedies.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/repo_classifier.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/repository_ir.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/resource_budget.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/retrieval/__init__.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/retrieval/context.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/retrieval/errors.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/retrieval/executor.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/retrieval/planner.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/retrieval/query.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/retrieval/request.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/retrieval/resolution.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/retrieval/result.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/retrieval/retriever.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/retrieval/runtime.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/retrieval/steps.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/retrieval/steps_endpoint.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/retrieval/steps_graph.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/retrieval/steps_impact.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/retrieval/steps_intf.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/retrieval/steps_struct.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/retrieval/steps_txsec.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/ris.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/risk.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/risk_model.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/rule_catalog.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/rule_pass.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/runs.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/runtime_classifier.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/sarif.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/scanner.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/schema.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/schema_producers.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/schemas/core-analysis-v1.schema.json +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/schemas/endpoints-v1.schema.json +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/schemas/envelope-v1.schema.json +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/schemas/pr-impact-v1.schema.json +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/schemas/verify-edit-v1.schema.json +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/schemas/verify-v1.schema.json +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/security_chain.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/security_config.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/security_config_scan.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/security_posture.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/selection_contract.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/selftest.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/semantic_analyzer.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/semantic_impact_engine.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/semantic_integration_engine.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/semantic_services.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/serializer.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/servlet_surface.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/source_text.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/spring_event_topology.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/spring_findings.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/spring_impact.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/spring_model.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/spring_profiles.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/spring_properties.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/spring_security_audit.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/spring_semantic.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/spring_tx_analyzer.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/sql_taint.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/summarizer.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/target_admission.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/telemetry/__init__.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/telemetry/config.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/telemetry/consent.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/telemetry/events.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/telemetry/filters.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/telemetry/transport.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/test_gap_ranking.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/test_sources.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/text_input.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/timeline.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/timeline_cache.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/token_estimate.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/tree_utils.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/type_usage_surface.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/validation_inference.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/verify_repo.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/verify_rules.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/version_check.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/waivers.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/wired_surface.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/src/sourcecode/workspace.py +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/supabase/functions/README.md +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/supabase/functions/get-license/index.ts +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/supabase/functions/lemonsqueezy-webhook/index.ts +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/supabase/functions/telemetry/index.ts +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/supabase/sql/license_event_ordering.sql +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/supabase/sql/licensing_schema.sql +0 -0
- {sourcecode-5.8.22 → sourcecode-5.8.24}/supabase/sql/telemetry_events.sql +0 -0
|
@@ -1,5 +1,83 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [5.8.24] — 2026-08-22
|
|
4
|
+
|
|
5
|
+
*The thirteenth audit-pass queue is closed entire: all six rows as separate
|
|
6
|
+
commits, the regression first, with the full suite green at 12 329 tests. Three
|
|
7
|
+
of the reported mechanisms are wider than reported and are corrected against
|
|
8
|
+
measurement; one defect was found by the battery rather than by either.*
|
|
9
|
+
|
|
10
|
+
### Fixed — the regression the pass led with
|
|
11
|
+
|
|
12
|
+
- **`cache warm` warms every root view (`AUD-600-R01`)** — the warm built the
|
|
13
|
+
compact view only, so the first `--agent` call after an explicit warm paid a
|
|
14
|
+
full analysis: measured on `mall` (524 Java files) `--agent` 7.59 s → 0.34 s
|
|
15
|
+
(×22) and the raw contract view 3.20 s → 0.33 s (×9.7), against `--compact`
|
|
16
|
+
flat at 0.34 s. The field measured ×49.2 at ~3 000 files. Each view turns a
|
|
17
|
+
different set of analysers on and therefore has its own L1 core;
|
|
18
|
+
`cache_model.ROOT_VIEWS` is now the one authority the warm iterates and
|
|
19
|
+
`cache model` publishes a row per view. `--views` warms a subset, and a view
|
|
20
|
+
left cold is named rather than discovered by its first call.
|
|
21
|
+
|
|
22
|
+
### Fixed — the new pack surface
|
|
23
|
+
|
|
24
|
+
- **The gate composes `verify-edit` (`AUD-600-B01`)** — a pack named *Change
|
|
25
|
+
Safety Gate* did not compose the change-safety command, so a working tree
|
|
26
|
+
that had just gained `GET /internal/dump-config` returning `System.getenv(key)`
|
|
27
|
+
answered `NO_CHANGES` / exit 0. It now answers `UNVERIFIED` / exit 2 with the
|
|
28
|
+
route and its `access_policy`. The general half is the rule: every pack
|
|
29
|
+
publishes a `non_coverage` block, in its payload and in `pack list`, and the
|
|
30
|
+
battery asserts it over the axis and rule catalogues.
|
|
31
|
+
- **`--compact` bounds the assessment pack (`AUD-600-B02`)** — the flag was
|
|
32
|
+
forwarded to the children and nothing else. It now substitutes each
|
|
33
|
+
component's own decision summary for its body: `mall` 608 K → 42 K estimated
|
|
34
|
+
tokens, `thingsboard` 8.5 K, both under the ceiling. A refusal may not deny a
|
|
35
|
+
variant the command declares, so `--format markdown` is derived as the
|
|
36
|
+
bounded rendering it is.
|
|
37
|
+
- **The report keeps the figures the pack carries (`AUD-600-B03`)** — three
|
|
38
|
+
cells read `unknown` while the figure sat in a component payload the same
|
|
39
|
+
pack had written. One catalogue, `MARKDOWN_FIGURES`, read with the same
|
|
40
|
+
reader the bounded projection uses; every remaining `unknown` names what it
|
|
41
|
+
looked for.
|
|
42
|
+
- **A write refusal is decided from `argv` (`AUD-600-D01`)** — `--output-dir`
|
|
43
|
+
inside a read-only tree cost 47.9 s before refusing. The destination is now
|
|
44
|
+
decided before any component runs and the run is served without its artefacts,
|
|
45
|
+
the shape `verify --init --no-write` established. Nothing is created inside
|
|
46
|
+
the analysed tree and every refusal is still announced with its path and type.
|
|
47
|
+
|
|
48
|
+
### Added
|
|
49
|
+
|
|
50
|
+
- **`ask schema packs-v1` (`AUD-600-D02`)** — what each pack composes, what it
|
|
51
|
+
does not, its verdict vocabulary, its exit codes and the aggregation rule that
|
|
52
|
+
produced the verdict, generated from the pack declarations. The rule was
|
|
53
|
+
inferable from one run and published nowhere.
|
|
54
|
+
- **Per-component timing in the pack manifest** — `duration_ms` per component
|
|
55
|
+
and a `timing` rollup naming the slowest one, so a 47 s gate can be attributed
|
|
56
|
+
from outside. A clock is never an answer: `timing` is excluded from
|
|
57
|
+
`content_id`, or two runs of an unchanged tree would disagree.
|
|
58
|
+
- **The fourth exit code for packs** — when every unverified component was cut
|
|
59
|
+
short by its budget the pack leaves with `75` and names them in
|
|
60
|
+
`components_cut_short`. A mixed run keeps the stronger `2` and the verdict
|
|
61
|
+
word never moves.
|
|
62
|
+
|
|
63
|
+
## [5.8.23] — 2026-08-22
|
|
64
|
+
|
|
65
|
+
*The external corpus follow-up is closed: pack output is durable by default,
|
|
66
|
+
the gate verdict matrix is covered, and the 37-repository read-only baseline is
|
|
67
|
+
recorded without overstating the seven scale-limited cases.*
|
|
68
|
+
|
|
69
|
+
### Fixed
|
|
70
|
+
|
|
71
|
+
- **Pack aggregate persistence (`AUD-599-C01`)** — `--output-dir` now writes
|
|
72
|
+
the aggregate as `pack.json`, `pack.yaml` or `pack.md`; an explicit
|
|
73
|
+
`--output FILE` remains authoritative.
|
|
74
|
+
- **Gate verdict coverage (`AUD-599-T01`)** — controlled tests distinguish
|
|
75
|
+
`PASS`, `BLOCK` and `UNVERIFIED` without conflating their exit codes.
|
|
76
|
+
- **Corpus audit follow-up (`AUD-599-P01`, `AUD-599-Q01`)** — the baseline and
|
|
77
|
+
before/after Git snapshots for all 37 repositories are documented. The seven
|
|
78
|
+
repeated timeouts are classified as a scale limitation, not claimed as a
|
|
79
|
+
regression without a comparable phase-level baseline.
|
|
80
|
+
|
|
3
81
|
## [5.8.22] — 2026-08-22
|
|
4
82
|
|
|
5
83
|
*The eleventh audit-pass queue is closed entire: all fourteen open rows shipped
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sourcecode
|
|
3
|
-
Version: 5.8.
|
|
3
|
+
Version: 5.8.24
|
|
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
|
|
@@ -86,12 +86,40 @@ workflow-shaped packs for users who want one consumable result:
|
|
|
86
86
|
```bash
|
|
87
87
|
ask pack assessment . --profile prod --output-dir .ask/packs/assessment
|
|
88
88
|
ask pack gate . --since origin/main --output-dir .ask/packs/gate
|
|
89
|
+
ask pack assessment . --format markdown -o assessment.md
|
|
89
90
|
```
|
|
90
91
|
|
|
92
|
+
For deployment-aware posture evidence, pass the artefacts that describe the
|
|
93
|
+
environment being assessed:
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
ask pack assessment . --deployment k8s/deployment-prod.yaml \
|
|
97
|
+
--output-dir .ask/packs/assessment
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
The gate also renders native CI log annotations without changing its JSON
|
|
101
|
+
contract:
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
ask pack gate . --since origin/main --format github-actions
|
|
105
|
+
ask pack gate . --since origin/main --format gitlab
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
`PASS`, `BLOCK` and `UNVERIFIED` are data decisions. The process exit code is
|
|
109
|
+
the CI signal; `--allow-unverified` can change only that exit code, never the
|
|
110
|
+
reported verdict. Every pack carries a manifest with component invocations,
|
|
111
|
+
source evidence and content fingerprints.
|
|
112
|
+
|
|
91
113
|
The [Product Route](docs/PRODUCT-ROUTE.md) is normative: ASK focuses on
|
|
92
114
|
deterministic evidence for Java/Spring modernization and safe change. Packs
|
|
93
115
|
compose existing commands; they do not hide or replace them.
|
|
94
116
|
|
|
117
|
+
For agent integrations, local MCP exposes the same pack evidence through
|
|
118
|
+
`get_assessment_pack` and `get_change_safety_gate`. MCP defaults to a compact
|
|
119
|
+
projection that preserves the decision and manifest; use the CLI with
|
|
120
|
+
`--output-dir` to persist complete component artifacts. See
|
|
121
|
+
[MCP pack evidence](docs/architecture/DESIGN-pack-mcp-api.md).
|
|
122
|
+
|
|
95
123
|
**The cache is not a performance optimization. It is what makes ASK Engine usable as infrastructure rather than a one-off tool.**
|
|
96
124
|
|
|
97
125
|
---
|
|
@@ -148,7 +176,7 @@ set `ASK_MAX_RSS_MB=<megabytes>`; if the process exceeds it, ASK refuses the
|
|
|
148
176
|
answer with `MEMORY_TOO_LARGE`, including the observed peak and limit. Leave it
|
|
149
177
|
unset, or set it to `0`, to disable the ceiling explicitly.
|
|
150
178
|
|
|
151
|
-
**Current performance status.** Release 5.8.
|
|
179
|
+
**Current performance status.** Release 5.8.24 retains the shared Canonical IR
|
|
152
180
|
path used by `validation` and now passes that same CIR into labelled `data-exposure`
|
|
153
181
|
runs; the no-label path remains parse-free. The one-model-per-declared-label path is
|
|
154
182
|
also retained. These are implementation properties, not duration promises:
|
|
@@ -182,7 +210,7 @@ brew tap haroundominique/sourcecode && brew install sourcecode
|
|
|
182
210
|
# pip / pipx
|
|
183
211
|
pipx install sourcecode # or: pip install sourcecode
|
|
184
212
|
|
|
185
|
-
ask version # ask 5.8.
|
|
213
|
+
ask version # ask 5.8.24 — and, on a build that has aged,
|
|
186
214
|
# how many releases have probably shipped since
|
|
187
215
|
```
|
|
188
216
|
|
|
@@ -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
|
|
@@ -38,12 +38,40 @@ workflow-shaped packs for users who want one consumable result:
|
|
|
38
38
|
```bash
|
|
39
39
|
ask pack assessment . --profile prod --output-dir .ask/packs/assessment
|
|
40
40
|
ask pack gate . --since origin/main --output-dir .ask/packs/gate
|
|
41
|
+
ask pack assessment . --format markdown -o assessment.md
|
|
41
42
|
```
|
|
42
43
|
|
|
44
|
+
For deployment-aware posture evidence, pass the artefacts that describe the
|
|
45
|
+
environment being assessed:
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
ask pack assessment . --deployment k8s/deployment-prod.yaml \
|
|
49
|
+
--output-dir .ask/packs/assessment
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
The gate also renders native CI log annotations without changing its JSON
|
|
53
|
+
contract:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
ask pack gate . --since origin/main --format github-actions
|
|
57
|
+
ask pack gate . --since origin/main --format gitlab
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
`PASS`, `BLOCK` and `UNVERIFIED` are data decisions. The process exit code is
|
|
61
|
+
the CI signal; `--allow-unverified` can change only that exit code, never the
|
|
62
|
+
reported verdict. Every pack carries a manifest with component invocations,
|
|
63
|
+
source evidence and content fingerprints.
|
|
64
|
+
|
|
43
65
|
The [Product Route](docs/PRODUCT-ROUTE.md) is normative: ASK focuses on
|
|
44
66
|
deterministic evidence for Java/Spring modernization and safe change. Packs
|
|
45
67
|
compose existing commands; they do not hide or replace them.
|
|
46
68
|
|
|
69
|
+
For agent integrations, local MCP exposes the same pack evidence through
|
|
70
|
+
`get_assessment_pack` and `get_change_safety_gate`. MCP defaults to a compact
|
|
71
|
+
projection that preserves the decision and manifest; use the CLI with
|
|
72
|
+
`--output-dir` to persist complete component artifacts. See
|
|
73
|
+
[MCP pack evidence](docs/architecture/DESIGN-pack-mcp-api.md).
|
|
74
|
+
|
|
47
75
|
**The cache is not a performance optimization. It is what makes ASK Engine usable as infrastructure rather than a one-off tool.**
|
|
48
76
|
|
|
49
77
|
---
|
|
@@ -100,7 +128,7 @@ set `ASK_MAX_RSS_MB=<megabytes>`; if the process exceeds it, ASK refuses the
|
|
|
100
128
|
answer with `MEMORY_TOO_LARGE`, including the observed peak and limit. Leave it
|
|
101
129
|
unset, or set it to `0`, to disable the ceiling explicitly.
|
|
102
130
|
|
|
103
|
-
**Current performance status.** Release 5.8.
|
|
131
|
+
**Current performance status.** Release 5.8.24 retains the shared Canonical IR
|
|
104
132
|
path used by `validation` and now passes that same CIR into labelled `data-exposure`
|
|
105
133
|
runs; the no-label path remains parse-free. The one-model-per-declared-label path is
|
|
106
134
|
also retained. These are implementation properties, not duration promises:
|
|
@@ -134,7 +162,7 @@ brew tap haroundominique/sourcecode && brew install sourcecode
|
|
|
134
162
|
# pip / pipx
|
|
135
163
|
pipx install sourcecode # or: pip install sourcecode
|
|
136
164
|
|
|
137
|
-
ask version # ask 5.8.
|
|
165
|
+
ask version # ask 5.8.24 — and, on a build that has aged,
|
|
138
166
|
# how many releases have probably shipped since
|
|
139
167
|
```
|
|
140
168
|
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# ASK Engine 5.8.22: auditoría metodológica y de regresión
|
|
2
|
+
|
|
3
|
+
**Fecha:** 2026-08-22
|
|
4
|
+
**Artefacto auditado:** release `5.8.22`, `build_commit`
|
|
5
|
+
`583c07c405358d3e76dd20968960f5ab928608fd`
|
|
6
|
+
**Sujeto principal:** MSAS / `banyan-v2`, HEAD `3dde0376`, 3.342 ficheros Java
|
|
7
|
+
**Registro relacionado:** [`docs/DEFECT-LEDGER.md`](DEFECT-LEDGER.md), entrada
|
|
8
|
+
`AUD-598-X01` y filas derivadas
|
|
9
|
+
|
|
10
|
+
## Alcance y método
|
|
11
|
+
|
|
12
|
+
Se consolidan dos rondas independientes sobre la misma release:
|
|
13
|
+
|
|
14
|
+
- Ronda A: MSAS, 57 invocaciones, 52 cronometradas, 3 `pr-impact` y 5 ayudas,
|
|
15
|
+
`ASK_READONLY=1`, presupuesto explícito y 0 escrituras.
|
|
16
|
+
- Ronda B: banco de 16 repositorios Java/Spring, unas 95 invocaciones, Windows
|
|
17
|
+
11 Pro, pipx y Git Bash.
|
|
18
|
+
|
|
19
|
+
Ambas rondas comprobaron estado Git antes y después. No se observaron
|
|
20
|
+
tracebacks, regresiones funcionales ni escrituras no autorizadas.
|
|
21
|
+
|
|
22
|
+
## Resultado ejecutivo
|
|
23
|
+
|
|
24
|
+
| Ronda | Resultado | Veredicto del auditor |
|
|
25
|
+
|---|---:|---|
|
|
26
|
+
| A | `8.58/10` | Comprar y actualizar |
|
|
27
|
+
| B | `8.8/10` | Adoptar sin reservas |
|
|
28
|
+
|
|
29
|
+
La mejora es válida para fiabilidad y rendimiento general, pero no autoriza a
|
|
30
|
+
cerrar automáticamente defectos del ledger. La propia auditoría demuestra que
|
|
31
|
+
el artefacto empaquetado puede no contener los cierres que el árbol de trabajo
|
|
32
|
+
declara.
|
|
33
|
+
|
|
34
|
+
## Confirmado cerrado
|
|
35
|
+
|
|
36
|
+
- `ask --help`: la regresión de reconstrucción del árbol Click queda corregida.
|
|
37
|
+
- `selftest`: 12 filas, 0 errores y 0 bytes de stderr en la ronda de campo.
|
|
38
|
+
- Determinismo de `posture`: `population_total=1908` y
|
|
39
|
+
`unconditional=1903` en cinco ejecuciones.
|
|
40
|
+
- Las regresiones de 5.8.21 sobre `compare`, `endpoints --servlets` e `impact`
|
|
41
|
+
no reaparecen.
|
|
42
|
+
- No-regresión funcional en el barrido de cierres anteriores.
|
|
43
|
+
|
|
44
|
+
Estos cierres permanecen en el ledger histórico con su commit. No se duplican
|
|
45
|
+
como nuevas filas.
|
|
46
|
+
|
|
47
|
+
## Hallazgos abiertos
|
|
48
|
+
|
|
49
|
+
El estado siguiente es el que debe usarse para planificación y release:
|
|
50
|
+
|
|
51
|
+
| ID | Estado | Hallazgo |
|
|
52
|
+
|---|---|---|
|
|
53
|
+
| `AUD-598-R01` / `ASK-PERF-002` | `open` | `ask . --compact` sube a 214,6 s frente a 154,0 s en 5.8.21, con payload byte-identical; es una regresión condicionada a esa vista/escala. |
|
|
54
|
+
| `AUD-598-X01` | `open` | El ledger del producto va por delante del wheel: cinco cierres declarados no se observan en el artefacto `583c07c`. |
|
|
55
|
+
| `AUD-598-B01` / `ASK-META-001` | `open` | La auditoría de wheel no observa `_meta`, `content_id` ni memoria en 9/9 payloads inspeccionados. Debe resolverse dentro de un wheel construido, no sólo en checkout. |
|
|
56
|
+
| `AUD-598-B02` / `ASK-UX-002` | `open` | `posture --diff` ofrece `--compact` y `--limit`, pero ambos son no-op en el caso medido y los hints forman un ciclo. |
|
|
57
|
+
| `AUD-598-B03` / `B-11` | `open` | Persisten 17 anclas de coste con texto `on 5.1.0` dentro de un build 5.8.22; además `risk` no alcanza su ancla publicada en MSAS. |
|
|
58
|
+
| `AUD-598-B04` / `N-02` | `open` parcial | `1e9` y `1_000` son presupuestos válidos, pero se aceptan sin advertir que no vincularán el proceso. |
|
|
59
|
+
|
|
60
|
+
## Cierres que el artefacto no confirma
|
|
61
|
+
|
|
62
|
+
La auditoría identifica cinco testigos de `AUD-598-X01`:
|
|
63
|
+
|
|
64
|
+
- `AUD-597-A01` / `N-01`: cuatro de cinco líneas de `Runs now` siguen sin
|
|
65
|
+
bounding flag en el wheel.
|
|
66
|
+
- `AUD-596-D01` / `B-13`, `B-14`: `validation` y `data-exposure` carecen de
|
|
67
|
+
identidad y `schema_version`; además se repite un hash entre repositorios.
|
|
68
|
+
- `AUD-596-D10` / `B-29`: no aparece memoria en cinco payloads completos.
|
|
69
|
+
- `AUD-597-D03` / `N-06`: `route_surface_changed.source_file` es `""` y no
|
|
70
|
+
lleva `declaration_line`.
|
|
71
|
+
|
|
72
|
+
La interpretación documentada no es mala fe ni una nueva regresión funcional:
|
|
73
|
+
el ledger y el wheel proceden de estados distintos. La corrección requerida es
|
|
74
|
+
hacer que el build genere y compruebe la relación entre `build_commit` y cada
|
|
75
|
+
commit de cierre antes de publicar.
|
|
76
|
+
|
|
77
|
+
## Observaciones no convertidas en defectos nuevos
|
|
78
|
+
|
|
79
|
+
- `ASK-GATE-001`: `migrate-check --ci` y `migrate-apply --ci` siguen rechazados
|
|
80
|
+
porque son `advisory_only`; la documentación conserva ese precio y no los
|
|
81
|
+
presenta como gates que puedan fallar.
|
|
82
|
+
- `B-22`: la declaración de `compare` mejoró, pero el residuo de `rc=0` con
|
|
83
|
+
cero candidatos se mantiene en su fila histórica.
|
|
84
|
+
- `B-21`, `B-26`, `B-27` y `B-30` siguen siendo residuos abiertos ya mapeados a
|
|
85
|
+
`AUD-596-X02`, `ASK-17`, `C3-128` y la superficie contractual,
|
|
86
|
+
respectivamente.
|
|
87
|
+
- `N-04` y `ASK-CLI-001` conservan residuos de mensaje/diseño ya trazados en
|
|
88
|
+
sus filas; no se cierran por la mejora parcial del coste.
|
|
89
|
+
|
|
90
|
+
## Regla de release
|
|
91
|
+
|
|
92
|
+
Hasta que `AUD-598-X01` se cierre, una fila no debe marcarse `closed` sólo
|
|
93
|
+
porque el commit de la corrección exista en el checkout. El cierre requiere
|
|
94
|
+
identificar el wheel o artefacto instalado, comprobar que contiene el commit y
|
|
95
|
+
reproducir el comportamiento o declarar explícitamente que se cerró contra un
|
|
96
|
+
fixture distinto del testigo original.
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
# Auditoría de features contra el corpus `testing`
|
|
2
|
+
|
|
3
|
+
**Fecha:** 2026-08-22
|
|
4
|
+
**Producto auditado:** ASK Engine en el checkout actual
|
|
5
|
+
**Propósito:** probar las features nuevas de packs, manifests, gates, artefactos,
|
|
6
|
+
MCP y evidencia de despliegue contra repositorios reales, antes de iniciar la
|
|
7
|
+
batería de correcciones.
|
|
8
|
+
|
|
9
|
+
## Veredicto ejecutivo
|
|
10
|
+
|
|
11
|
+
La implementación es funcional en el caso normal y no se ha confirmado una
|
|
12
|
+
regresión de análisis, de determinismo ni de los adaptadores MCP/CI. En la
|
|
13
|
+
batería completa, 30 de 37 repositorios produjeron un pack de assessment
|
|
14
|
+
completo (`MEASURED`, seis componentes, `rc=0`). Los siete restantes agotaron el
|
|
15
|
+
presupuesto externo de 120 segundos sin producir el agregado final.
|
|
16
|
+
|
|
17
|
+
La batería encontró y reprodujo un gap de contrato/ergonomía: usar únicamente
|
|
18
|
+
`--output-dir` dejaba el agregado en stdout. Ese gap queda corregido en el
|
|
19
|
+
checkout actual: el agregado se escribe ahora como `pack.json` (o la extensión
|
|
20
|
+
del formato solicitado), mientras que `--output FILE` explícito conserva
|
|
21
|
+
prioridad.
|
|
22
|
+
|
|
23
|
+
Este documento no convierte los siete timeouts en una regresión: no existe una
|
|
24
|
+
medición comparable anterior con el mismo corpus, host, flags y presupuesto.
|
|
25
|
+
La repetición completa con snapshots antes/después confirmó que son un límite
|
|
26
|
+
operativo repetible del corpus, no una mutación atribuible a ASK. El baseline
|
|
27
|
+
queda en [`docs/perf/corpus-testing-2026-08-22.md`](perf/corpus-testing-2026-08-22.md).
|
|
28
|
+
|
|
29
|
+
## Protocolo reproducible
|
|
30
|
+
|
|
31
|
+
Todas las invocaciones se ejecutaron en modo de sólo lectura:
|
|
32
|
+
|
|
33
|
+
```text
|
|
34
|
+
ASK_READONLY=1 ASK_TELEMETRY=0 ASK_PROGRESS=off
|
|
35
|
+
ask pack assessment REPO --compact --format json \
|
|
36
|
+
--output /tmp/assessment.json \
|
|
37
|
+
--output-dir /tmp/assessment-components
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Se usaron procesos aislados, salidas fuera del repositorio y un timeout externo
|
|
41
|
+
de 120 s por repositorio en la batería completa. El timeout es una condición de
|
|
42
|
+
la prueba, no el valor de `ASK_MAX_ANALYSIS_SECONDS` ni una afirmación sobre el
|
|
43
|
+
presupuesto interno de cada comando.
|
|
44
|
+
|
|
45
|
+
La batería completa cubrió 37 repositorios Git de
|
|
46
|
+
`/Users/user/Documents/workspace/testing`. El corpus no estaba limpio de forma
|
|
47
|
+
homogénea y no se tomó una instantánea de `git status` antes de comenzar; por
|
|
48
|
+
tanto, la prueba no permite atribuir a ASK los cambios ya existentes en esos
|
|
49
|
+
repositorios. Las salidas y resúmenes temporales se conservaron bajo
|
|
50
|
+
`/private/tmp/ask-testing-all*` y `/private/tmp/ask-testing-deep*`, no como
|
|
51
|
+
artefactos del producto.
|
|
52
|
+
|
|
53
|
+
## Resultado de la batería completa
|
|
54
|
+
|
|
55
|
+
| Resultado | Repositorios | Interpretación |
|
|
56
|
+
|---|---:|---|
|
|
57
|
+
| Pack completo | 30/37 | `ask-pack-assessment-v1`, `MEASURED`, `rc=0`, seis componentes y agregado parseable |
|
|
58
|
+
| Timeout externo | 7/37 | Sin agregado final dentro de 120 s; requiere baseline y profiling |
|
|
59
|
+
| Traceback observado | 0 | No se observó traceback en los procesos que terminaron ni en la captura de los timeouts |
|
|
60
|
+
| Escritura intencionada | 0 | `ASK_READONLY=1`; la ausencia de snapshot inicial impide certificar causalidad sobre dirty trees |
|
|
61
|
+
|
|
62
|
+
Los siete repositorios que no terminaron dentro del presupuesto fueron:
|
|
63
|
+
|
|
64
|
+
- `alfresco-community-repo`
|
|
65
|
+
- `cas`
|
|
66
|
+
- `keycloak`
|
|
67
|
+
- `nacos`
|
|
68
|
+
- `neo4j`
|
|
69
|
+
- `shenyu`
|
|
70
|
+
- `tutorials`
|
|
71
|
+
|
|
72
|
+
El resultado debe leerse como “30 casos completados y 7 casos no resueltos en
|
|
73
|
+
este presupuesto”, no como “7 fallos funcionales”.
|
|
74
|
+
|
|
75
|
+
## Muestra profunda corregida
|
|
76
|
+
|
|
77
|
+
Se repitió una muestra de ocho repositorios con un timeout de 180 s y con
|
|
78
|
+
`--output` explícito para separar el agregado de stdout:
|
|
79
|
+
|
|
80
|
+
| Repositorio | Tiempo | Resultado |
|
|
81
|
+
|---|---:|---|
|
|
82
|
+
| `spring-petclinic` | 4,85 s | Completo, `MEASURED`, 6 componentes |
|
|
83
|
+
| `examples` | 6,33 s | Completo, `MEASURED`, 6 componentes |
|
|
84
|
+
| `keycloak-config-cli` | 9,07 s | Completo, `MEASURED`, 6 componentes |
|
|
85
|
+
| `mall` | 28,42 s | Completo, `MEASURED`, 6 componentes |
|
|
86
|
+
| `halo` + `--deployment Dockerfile` | 28,83 s | Completo, `MEASURED`, 6 componentes |
|
|
87
|
+
| `open-banking-gateway` + `--deployment docker-compose.yml` | 24,07 s | Completo, `MEASURED`, 6 componentes |
|
|
88
|
+
| `BroadleafCommerce` | 68,47 s | Completo, `MEASURED`, 6 componentes |
|
|
89
|
+
| `spring-security` | 59,12 s | Completo, `MEASURED`, 6 componentes |
|
|
90
|
+
|
|
91
|
+
En los ocho casos se generaron el agregado y los seis JSON de componente.
|
|
92
|
+
Esto confirma que el problema de la primera pasada de la muestra grande no
|
|
93
|
+
era un fallo del análisis: era la ruta de salida del agregado.
|
|
94
|
+
|
|
95
|
+
## Hallazgo reproducible: salida agregada con `--output-dir`
|
|
96
|
+
|
|
97
|
+
### Síntoma
|
|
98
|
+
|
|
99
|
+
La primera pasada de la muestra profunda usó `--output-dir` sin `--output`.
|
|
100
|
+
Cuatro repositorios terminaron con `rc=1`, error `OUTPUT_TOO_LARGE` y el
|
|
101
|
+
agregado sin persistir:
|
|
102
|
+
|
|
103
|
+
| Repositorio | Estimación del agregado |
|
|
104
|
+
|---|---:|
|
|
105
|
+
| `mall` | 481.677 tokens / 1.926.709 bytes |
|
|
106
|
+
| `spring-security` | 83.077 tokens / 332.310 bytes |
|
|
107
|
+
| `open-banking-gateway` | 93.781 tokens / 375.127 bytes |
|
|
108
|
+
| `BroadleafCommerce` | 377.907 tokens / 1.511.628 bytes |
|
|
109
|
+
|
|
110
|
+
El error informa que no hay una variante inline menor y recomienda `--output
|
|
111
|
+
FILE` o `ASK_MAX_OUTPUT_TOKENS=0`. Al repetir con `--output FILE`, los cuatro
|
|
112
|
+
repositorios completaron correctamente.
|
|
113
|
+
|
|
114
|
+
### Clasificación
|
|
115
|
+
|
|
116
|
+
`AUD-599-C01` — **P2, gap de contrato/ergonomía, corregido en el checkout actual**.
|
|
117
|
+
|
|
118
|
+
No era una falsedad del payload ni una pérdida de evidencia: los componentes sí
|
|
119
|
+
se escribían. La implementación ahora hace persistente también el agregado con
|
|
120
|
+
un nombre determinista y mantiene la ruta explícita como autoridad superior.
|
|
121
|
+
La regresión de CLI cubre ambas rutas.
|
|
122
|
+
|
|
123
|
+
## Contratos comprobados
|
|
124
|
+
|
|
125
|
+
### Assessment pack
|
|
126
|
+
|
|
127
|
+
- Los 30 resultados completos publicaron `ask-pack-assessment-v1`.
|
|
128
|
+
- Cada resultado completo publicó seis componentes y fingerprints
|
|
129
|
+
`content_id`.
|
|
130
|
+
- El catálogo `ask pack list --format json` publicó
|
|
131
|
+
`ask-pack-catalog-v1`, con los packs `assessment` y `gate`.
|
|
132
|
+
- `ask schema schemas-v1 --format json` resolvió
|
|
133
|
+
`ask-pack-assessment-v1`, `ask-pack-gate-v1` y
|
|
134
|
+
`ask-pack-mcp-projection-v1`.
|
|
135
|
+
|
|
136
|
+
### Gate y códigos de salida
|
|
137
|
+
|
|
138
|
+
En la muestra profunda, `pack gate REPO --since HEAD~1` produjo
|
|
139
|
+
`ask-pack-gate-v1`, tres artefactos y `verdict=UNVERIFIED`, `exit_code=2`.
|
|
140
|
+
Esto es correcto para una verificación no certificable; no se debe presentar
|
|
141
|
+
como PASS ni como un bug. La muestra no cubrió un caso positivo `PASS`, por lo
|
|
142
|
+
que ese camino queda pendiente de una fixture controlada.
|
|
143
|
+
|
|
144
|
+
### CI renderers
|
|
145
|
+
|
|
146
|
+
Los renderers de GitHub Actions y GitLab se probaron en
|
|
147
|
+
`spring-petclinic`, `halo` y `open-banking-gateway`.
|
|
148
|
+
|
|
149
|
+
- GitHub produjo anotaciones `::warning`/`::notice` válidas y la línea final
|
|
150
|
+
`ASK_GATE verdict=UNVERIFIED exit_code=2`.
|
|
151
|
+
- GitLab produjo `section_start`, líneas `ASK_GATE_COMPONENT`, línea final
|
|
152
|
+
`ASK_GATE` y `section_end`.
|
|
153
|
+
|
|
154
|
+
El chequeo inicial que esperaba literalmente `::group::` era incorrecto: ese
|
|
155
|
+
token no es requisito del renderer y su ausencia no es un defecto.
|
|
156
|
+
|
|
157
|
+
### MCP
|
|
158
|
+
|
|
159
|
+
Las llamadas externas sobre `spring-petclinic` devolvieron correctamente:
|
|
160
|
+
|
|
161
|
+
- `get_assessment_pack`: `success=true`,
|
|
162
|
+
`ask-pack-assessment-v1`, proyección
|
|
163
|
+
`ask-pack-mcp-projection-v1`, `MEASURED`.
|
|
164
|
+
- `get_change_safety_gate`: `success=true`, `ask-pack-gate-v1`, la misma
|
|
165
|
+
proyección, `UNVERIFIED`.
|
|
166
|
+
|
|
167
|
+
Ambas conservaron `schema_version`, `verdict`, `exit_code` y `manifest`. No se
|
|
168
|
+
observó pérdida de identidad al adaptar el pack a MCP.
|
|
169
|
+
|
|
170
|
+
### Determinismo
|
|
171
|
+
|
|
172
|
+
`spring-petclinic` se ejecutó dos veces con los mismos flags. Los seis
|
|
173
|
+
`content_id` fueron idénticos en ambas pasadas:
|
|
174
|
+
|
|
175
|
+
```text
|
|
176
|
+
migrate-check ae64790941c201de
|
|
177
|
+
posture 84f0efc7c020d72b
|
|
178
|
+
endpoints d3ba88844e0f6c9a
|
|
179
|
+
spring-audit 1cf314c5d323438d
|
|
180
|
+
risk 24ce1698282868ce
|
|
181
|
+
audit-report 4109a5829c4472ac
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
Los manifests completos no fueron byte-identical porque contienen metadatos de
|
|
185
|
+
ejecución (`run_id` y tiempos), lo que es esperado. La identidad del contenido
|
|
186
|
+
sí fue estable.
|
|
187
|
+
|
|
188
|
+
### Evidencia de despliegue
|
|
189
|
+
|
|
190
|
+
`Dockerfile` y `docker-compose.yml` se conservaron en `manifest.inputs` en los
|
|
191
|
+
casos de `halo` y `open-banking-gateway`. El payload de posture mantuvo
|
|
192
|
+
honestamente:
|
|
193
|
+
|
|
194
|
+
```text
|
|
195
|
+
profile_set_is_assumption: true
|
|
196
|
+
decided_in_this_payload: false
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
Es decir, aceptar el artefacto no implica afirmar qué perfil se ejecuta. No es
|
|
200
|
+
un bug; es la frontera correcta de evidencia cuando el deployment no decide el
|
|
201
|
+
perfil dentro del payload analizado.
|
|
202
|
+
|
|
203
|
+
## No hallazgos / límites que no deben convertirse en bugs
|
|
204
|
+
|
|
205
|
+
- No se confirmó regresión en el análisis de endpoints, riesgo, postura,
|
|
206
|
+
migración o auditoría a partir de esta batería.
|
|
207
|
+
- Los `UNVERIFIED` del gate no son `BLOCK` falsos: no hubo payload suficiente
|
|
208
|
+
para establecer un bloqueo.
|
|
209
|
+
- La ausencia de un `PASS` en la muestra no demuestra que el camino positivo
|
|
210
|
+
esté roto; sólo indica cobertura pendiente.
|
|
211
|
+
- Los siete timeouts no son una comparación de regresión hasta obtener baseline
|
|
212
|
+
anterior con la misma población y protocolo.
|
|
213
|
+
- Los repositorios con dirty trees no permiten atribuir sus cambios a ASK sin
|
|
214
|
+
un estado inicial capturado.
|
|
215
|
+
|
|
216
|
+
## Cola para la siguiente fase
|
|
217
|
+
|
|
218
|
+
| Prioridad | ID | Acción previa a corregir |
|
|
219
|
+
|---|---|---|
|
|
220
|
+
| Cerrado | `AUD-599-C01` | Agregado persistido como `pack.<format>` cuando sólo se usa `--output-dir`; test de fallback, prioridad de `--output` y documentación actualizada |
|
|
221
|
+
| Cerrado como límite operativo | `AUD-599-P01` | Baseline de 37 repositorios y repetición completa; no hay regresión demostrada ni optimización defendible sin timings internos comparables |
|
|
222
|
+
| Cerrado en el checkout actual | `AUD-599-T01` | Fixture controlada para `PASS`, `BLOCK` y `UNVERIFIED`, con códigos de salida diferenciados |
|
|
223
|
+
| Cerrado | `AUD-599-Q01` | Segunda batería completa: 37/37 snapshots Git idénticos antes/después |
|
|
224
|
+
|
|
225
|
+
Ninguna fila de esta cola debe marcarse como cerrada hasta que exista una
|
|
226
|
+
corrección, una aserción de regresión y una repetición sobre el artefacto que se
|
|
227
|
+
va a distribuir, conforme a la regla de
|
|
228
|
+
[`DEFECT-LEDGER.md`](DEFECT-LEDGER.md).
|
|
@@ -18,12 +18,14 @@ Before optimising a workflow, ask the model that ships with the installed CLI:
|
|
|
18
18
|
```bash
|
|
19
19
|
ask cache status . # what this repository already has
|
|
20
20
|
ask cache model . # whether a warm helps each command
|
|
21
|
-
ask cache warm .
|
|
22
|
-
ask cache warm . --
|
|
21
|
+
ask cache warm . # every root view plus shared structural layers
|
|
22
|
+
ask cache warm . --views compact # one view only, when that is all the workflow reads
|
|
23
23
|
```
|
|
24
24
|
|
|
25
|
-
`cache warm` is not a general acceleration switch. It warms
|
|
26
|
-
layers for the exact tree and scope you name
|
|
25
|
+
`cache warm` is not a general acceleration switch. It warms every declared view of the
|
|
26
|
+
root analysis and the shared layers for the exact tree and scope you name — each view
|
|
27
|
+
has its own core, so a warm that built one left the others paying a full analysis on
|
|
28
|
+
their first call (AUD-600-R01); the warm names the views it built and any it skipped. A command may receive the finished answer,
|
|
27
29
|
reuse only shared work, or receive no benefit; `cache model` names which. Any analysed-file
|
|
28
30
|
change, committed or not, creates a different cache identity. In CI, persist the ASK cache
|
|
29
31
|
directory only when the job policy allows it; otherwise budget a cold run and use
|
|
@@ -79,13 +81,21 @@ the enclosing monorepo, and `cache status` / `cache clear` resolve to that same
|
|
|
79
81
|
<!-- BEGIN GENERATED: ask cache model --markdown -->
|
|
80
82
|
| Layer | What it stores | What invalidates it | `cache warm` | Written by |
|
|
81
83
|
|---|---|---|---|---|
|
|
82
|
-
| `snapshot` | the rendered answer of the root command (L1 core analysis + L2 view) | tree state · analyzer fingerprint · analysis flags (--env-map, --depth, --docs, --exclude, …) for the core; presentation flags (--compact, --agent, --full, --format, …) for the view | built for
|
|
84
|
+
| `snapshot` | the rendered answer of the root command (L1 core analysis + L2 view) | tree state · analyzer fingerprint · analysis flags (--env-map, --depth, --docs, --exclude, …) for the core; presentation flags (--compact, --agent, --full, --format, …) for the view | built for every declared root view (compact, agent, standard) — one core each, because each view turns a different set of analysers on | the root analysis alone — `ask <repo>` and `ask cache warm`. AUD-591-Q01: `cache_layers.snapshot` read `cold` in all 240 field invocations across 16 repositories, including after `cache clear --all -y` plus two runs, because every one of those runs was of another command. No other command writes `core-*.json.gz`, so on any run but the root analysis this layer is `cold` by construction and its being cold says nothing about the cache. |
|
|
83
85
|
| `ris` | the Repository Intelligence Snapshot — structural index, endpoint index, summaries | tree state (the snapshot records the tree it describes) | rebuilt on every warm | every command that reads it |
|
|
84
86
|
| `cir` | the shared Canonical IR — the Java parse every knowledge command reuses | tree state · analyzer fingerprint · schema version | built | every command that reads it |
|
|
85
87
|
| `task` | one `prepare-context` task answer, per task and per option set | tree state · task · --symptom / --all / --include-config / --format | never — a warm does not run any task | every command that reads it |
|
|
86
88
|
| `timeline-samples` | one watched metric as measured at one sampled commit, so a series re-run over an overlapping range measures only what is new (C3-129) | the analyzer fingerprint and the commit sha, both in the key. The tree at a sha never changes, so an entry is never stale — the fingerprint is what keeps a corrected analysis from being served from a previous release. `timeline --no-cache` (or `ASK_TIMELINE_NO_SAMPLE_CACHE=1`) measures every sample again | never — a warm analyses the working tree, not history | every command that reads it |
|
|
87
89
|
| `parse` | the symbol extraction of one file, keyed by its bytes | the file's own bytes and the extractor's source — content-addressed, so it is never stale and never needs invalidating. Bounded by `ASK_PARSE_CACHE_MAX_MB` (default 512 MB, least-recently-used, swept every 32 MB written rather than on every write, and the last interval before a process exits is never swept — so the store rests up to one interval per writing process above its budget, and the figure to size a disk by is the ceiling `cache status` publishes beside it, not the budget itself (ASK-15)) and reported in `cache status` (F-AR) | filled for every Java file the warm parses | every command that reads it |
|
|
88
90
|
|
|
91
|
+
| Root view | Invocation | Its own core | `cache warm` |
|
|
92
|
+
|---|---|---|---|
|
|
93
|
+
| `compact` | `ask <repo> --compact` | turns dependencies, env map, code notes and architecture on; bounded, and the view the front page recommends first | builds it |
|
|
94
|
+
| `agent` | `ask <repo> --agent` | everything the compact core has plus the module import graph, and it drops the file tree — a different core, not a different rendering. This is the view the root help recommends to AI agents | builds it |
|
|
95
|
+
| `standard` | `ask <repo> (and `ask <repo> --full`, which is this view with the display caps raised)` | the raw contract view: none of the compact analysers run, so its core is neither of the two above and a warm of either leaves it cold | builds it |
|
|
96
|
+
|
|
97
|
+
Each view turns a different set of analysers on, so each has its own L1 core: a warm that builds one leaves the others paying a full analysis on their first call (AUD-600-R01).
|
|
98
|
+
|
|
89
99
|
Measured on BroadleafCommerce (2 000+ Java files, dirty tree), warm machine, 3.2.2, each command in isolation.
|
|
90
100
|
|
|
91
101
|
Measured on release 3.2.2. Figures are that build's on that repository, not a prediction for yours; the nightly performance gate (`docs/perf/REGRESSION-GATE.md`) is what re-measures them.
|
|
@@ -96,7 +106,7 @@ The second anchor is the field one, and it carries its own build for the same re
|
|
|
96
106
|
|---|---|---|---|---|---|
|
|
97
107
|
| `ask (root)` | the answer | --compact 13.3 s cold → 0.3 s warm (cold re-measured on 3.7.0: was 19.3 s, C3-6); --agent --full --env-map --depth 20 34.7 s → 33.9 s (no gain) | yes | `snapshot`, `ris`, `parse` | `--compact` is what a warm stores by default; `--agent` needs `cache warm --agent`. `--env-map`, `--depth N` and `--exclude` change the *analysis*, so they miss the warmed core and rescan — the 171 s the field measured after a 103 s warm on 4.10.4. Eval #23 timed the same invocation at 72,3 s from a purged cache, and then paid 71,7 s again for `--agent` on the state it had just analysed (C3-103). |
|
|
98
108
|
| `posture` | the shared work | 10.1 s → 1.6 s | no | `cir`, `parse` | Resolves the conditional bean graph on every run, over the shared CIR a warm builds — the parse it used to repeat for itself. `--diff` compares two profile sets over that one IR, so the second side costs the resolution only. |
|
|
99
|
-
| `risk` | the shared work |
|
|
109
|
+
| `risk` | the shared work | 240.1 s on the audited monolith (13th pass, rc 0, 178 171 B). The two rounds before it exhausted every budget they gave it — 301 s under a 300 s budget (5.8.20) and 401 s under 400 s (5.8.22) — and the refusal with its budget is the honest anchor for a run that does not finish, never a smaller number measured somewhere else | no | `cir`, `parse` | Composes what the audit, impact-chain and the posture already answer, so it pays each of their costs once over the shared CIR a warm builds — one parse for the whole composition, and the reachability query is cached per symbol within the run. |
|
|
100
110
|
| `enrich` | the shared work | not measured on the battery yet — bounded by the `risk` composition, plus reading one JSON file | no | `cir`, `parse` | Runs the same composition as `risk` over the repository, then joins a SARIF log to it. Reading the log is negligible; everything a warm helps with is the repository side, so what it buys is what it buys `risk`. |
|
|
101
111
|
| `audit-report` | the shared work | not measured on the battery yet — bounded by `risk` + `posture`, or by `posture` when `--from-risk` is supplied | no | `cir`, `parse` | Packages `risk` and `posture` evidence. A warm helps the repository side; `--from-risk risk.json` skips risk recomputation entirely and only builds the posture/report projection. |
|
|
102
112
|
| `migrate-recipe` | the shared work | not measured on the battery yet — bounded by `migrate-check` on the same repository (openmrs-core ~2 s) | no | `parse` | Runs the same scan as `migrate-check` and projects its findings into an OpenRewrite recipe, so it buys exactly what a warm buys `migrate-check`: the parse, not the rule pass. |
|
|
@@ -17,6 +17,10 @@ and `ask pack gate` for recurring change safety in CI. See
|
|
|
17
17
|
[`PRODUCT-ROUTE.md`](PRODUCT-ROUTE.md) for the normative scope and evidence
|
|
18
18
|
contract.
|
|
19
19
|
|
|
20
|
+
The assessment can be delivered as JSON evidence for automation or as an
|
|
21
|
+
executive/procurement Markdown report with `--format markdown`; both views are
|
|
22
|
+
renderings of the same measured pack.
|
|
23
|
+
|
|
20
24
|
The gating axis is **size + automation**, never capability. Nothing is crippled on Free;
|
|
21
25
|
you pay exactly when the tool is replacing the most engineering time — a monolith above
|
|
22
26
|
**500 Java source files**, or CI/CD automation. **€19/mo · €190/yr, per developer.**
|