sourcecode 5.4.2__tar.gz → 5.5.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {sourcecode-5.4.2 → sourcecode-5.5.0}/CHANGELOG.md +29 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/PKG-INFO +3 -3
- {sourcecode-5.4.2 → sourcecode-5.5.0}/README.md +2 -2
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/USER_GUIDE.md +1 -1
- {sourcecode-5.4.2 → sourcecode-5.5.0}/pyproject.toml +1 -1
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/__init__.py +1 -1
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/cache_model.py +9 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/cli.py +20 -1
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/non_coverage.py +21 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/reference_facts.py +39 -11
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/repository_ir.py +5 -1
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/validation_surface.py +89 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/.github/workflows/build-windows.yml +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/.github/workflows/perf-gate.yml +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/.gitignore +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/.ruff.toml +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/CLAUDE.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/CONTRIBUTING.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/LICENSE +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/SECURITY.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/CACHE.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/COMMERCIAL-OFFER.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/CUSTOMER-VALIDATION.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/DEFECT-LEDGER.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/DEMO-5MIN.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/DEVELOPMENT-ROADMAP.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/EXECUTION-PLAN-12MO.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/EXECUTIVE-ROADMAP.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/MANUAL-USUARIO.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/MODERNIZATION.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/PRODUCT_AUDIT.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/PRODUCT_IDENTITY.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/PRODUCT_TIERS.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/RC1-CHECKLIST.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/RELEASE-CHECKLIST.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/architecture/CATALOG-retrieval-intents.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/architecture/DESIGN-knowledge-provider-integration.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/architecture/DESIGN-p5.3b-statement-surface.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/architecture/DESIGN-p5.5-span-index.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/architecture/DESIGN-p6-semantic-impact-engine.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/architecture/DESIGN-p6-semantic-integration-engine.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/architecture/DESIGN-p7-semantic-services.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/architecture/DESIGN-robustness-security-inference.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/architecture/DESIGN-semantic-retrieval.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/architecture/EPV-p6-class-typeref.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/architecture/REPORT-p6-flow-analyzer-comparison.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/architecture/REPORT-p6-integration-detector-comparison.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/architecture/REPORT-p8-flow-analyzer-migration.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/architecture/REPORT-p9-integration-detector-migration.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/architecture/adr/0001-semantic-ir.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/architecture/adr/0002-source-evidence-boundary.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/architecture/adr/0003-architectural-characterization.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/architecture/adr/0004-semantic-retrieval.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/architecture/adr/0005-evidence-reconciliation.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/architecture/adr/0006-performance-harness.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/architecture/adr/0007-composition-semantics.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/architecture/adr/0008-answer-coherence.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/architecture/consumer-disposition-inventory.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/architecture/overview.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/architecture/product-architecture-review.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/architecture/product-strategy-layering.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/architecture/semantic-ir-consumer-matrix.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/architecture/semantic-ir-roadmap.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/baseline-ci.yml +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/commercial-pipeline-audit.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/contracts-ci.yml +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/contracts.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/eval/2026-06-15-petclinic-rest-issue11-vets-pagination.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/eval/2026-06-15-petclinic-rest-issue147-validation.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/eval/2026-06-15-petclinic-rest-workflow.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/eval/2026-06-15-phase18-openapi-surface.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/eval/2026-06-15-phase20-validation-surface.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/eval/2026-06-16-broadleaf-checkout-impact-fieldtest.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/eval/2026-06-16-petclinic-rest-issue11-weakness2-closed.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/eval/2026-06-16-spring-petclinic-issue2333-dead-vets.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/licensing-schema.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/migrate-check.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/perf/README.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/perf/REGRESSION-GATE.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/perf/baselines/2.5.15/SUMMARY.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/perf/baselines/2.5.15/alfresco__ask__cold.json +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/perf/baselines/2.5.15/alfresco__ask__warm.json +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/perf/baselines/2.5.15/broadleaf__ask__cold.json +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/perf/baselines/2.5.15/broadleaf__ask__warm.json +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/perf/baselines/2.5.15/eureka__ask__cold.json +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/perf/baselines/2.5.15/eureka__ask__warm.json +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/perf/baselines/2.5.15/jenkins__ask__cold.json +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/perf/baselines/2.5.15/jenkins__ask__warm.json +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/perf/baselines/2.5.15/jobrunr__ask__cold.json +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/perf/baselines/2.5.15/jobrunr__ask__warm.json +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/perf/baselines/2.5.15/keycloak__ask__cold.json +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/perf/baselines/2.5.15/keycloak__ask__warm.json +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/perf/baselines/2.5.15/neo4j__ask__cold.json +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/perf/baselines/2.5.15/neo4j__ask__warm.json +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/perf/baselines/2.5.15/ofbiz__ask__cold.json +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/perf/baselines/2.5.15/ofbiz__ask__warm.json +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/perf/baselines/2.5.15/openmrs__ask__cold.json +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/perf/baselines/2.5.15/openmrs__ask__warm.json +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/perf/baselines/2.5.15/petclinic__ask__cold.json +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/perf/baselines/2.5.15/petclinic__ask__warm.json +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/perf/baselines/2.5.16/SUMMARY.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/perf/baselines/2.5.16/alfresco__ask__cold.json +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/perf/baselines/2.5.16/alfresco__ask__warm.json +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/perf/baselines/2.5.16/broadleaf__ask__cold.json +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/perf/baselines/2.5.16/broadleaf__ask__warm.json +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/perf/baselines/2.5.16/eureka__ask__cold.json +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/perf/baselines/2.5.16/eureka__ask__warm.json +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/perf/baselines/2.5.16/jenkins__ask__cold.json +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/perf/baselines/2.5.16/jenkins__ask__warm.json +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/perf/baselines/2.5.16/jobrunr__ask__cold.json +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/perf/baselines/2.5.16/jobrunr__ask__warm.json +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/perf/baselines/2.5.16/keycloak__ask__cold.json +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/perf/baselines/2.5.16/keycloak__ask__warm.json +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/perf/baselines/2.5.16/neo4j__ask__cold.json +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/perf/baselines/2.5.16/neo4j__ask__warm.json +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/perf/baselines/2.5.16/ofbiz__ask__cold.json +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/perf/baselines/2.5.16/ofbiz__ask__warm.json +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/perf/baselines/2.5.16/openmrs__ask__cold.json +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/perf/baselines/2.5.16/openmrs__ask__warm.json +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/perf/baselines/2.5.16/petclinic__ask__cold.json +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/perf/baselines/2.5.16/petclinic__ask__warm.json +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/perf/baselines/gate-latest/README.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/perf/baselines/gate-latest/broadleaf__ask__warm.json +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/perf/baselines/gate-latest/broadleaf__endpoints__warm.json +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/perf/baselines/gate-latest/broadleaf__migrate-check__warm.json +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/perf/baselines/gate-latest/broadleaf__posture__warm.json +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/perf/baselines/gate-latest/broadleaf__spring-audit__warm.json +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/perf/baselines/gate-latest/broadleaf__validation__warm.json +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/perf/baselines/reference-best/README.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/posture.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/privacy.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/pro-experience-audit.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/schema.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/spec/envelope-v1.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/docs/spring-audit-ci.yml +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/raw +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/scripts/compare_integration_engines.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/scripts/customer_smoke_test.sh +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/scripts/generate_jdk_exports.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/scripts/perf_gate.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/scripts/perf_harness.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/scripts/sync_gate_anchors.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/adaptive_scanner.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/archetype.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/architectural_baseline.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/architectural_delta.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/architecture_analyzer.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/architecture_summary.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/ast_extractor.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/audit_report.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/baseline_autocapture.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/bundled_docs.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/cache.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/call_surface.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/caller_metrics.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/caller_reach.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/canonical_ir.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/chain_rules.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/change_plan.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/cir_graphs.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/classifier.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/client_calls.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/code_notes_analyzer.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/compare.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/confidence_analyzer.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/constraint_diff.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/consumer_join.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/container_wiring.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/context_cache.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/context_graph.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/context_scorer.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/context_summarizer.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/contract_diff.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/contract_init.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/contract_model.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/contract_pipeline.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/coverage_parser.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/data_exposure.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/data_labels.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/declarations.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/defect_identity.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/degradation.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/dependency_analyzer.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/deployment_prefix.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/detach.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/detectors/__init__.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/detectors/base.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/detectors/csproj_parser.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/detectors/dart.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/detectors/dotnet.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/detectors/elixir.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/detectors/go.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/detectors/heuristic.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/detectors/hybrid.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/detectors/java.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/detectors/jvm_ext.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/detectors/nodejs.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/detectors/parsers.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/detectors/php.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/detectors/project.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/detectors/python.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/detectors/ruby.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/detectors/rust.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/detectors/systems.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/detectors/terraform.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/detectors/tooling.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/doc_analyzer.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/dynamic_argument_surface.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/endpoint_literals.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/endpoint_metrics.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/entrypoint_classifier.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/env_analyzer.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/envelope.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/environment_resolution.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/error_schema.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/evidence_provider.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/execution_plan.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/explain.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/facts/__init__.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/facts/registry.json +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/file_chunker.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/file_classifier.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/filter_surface.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/format_contract.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/fqn_utils.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/gate_anchors.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/git_analyzer.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/git_checkout.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/graph_analyzer.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/graph_evidence.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/hibernate_strat.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/identity_fallback.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/integration_coordinates.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/jdk_exports.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/license.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/mcp/__init__.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/mcp/dependency_import.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/mcp/onboarding/__init__.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/mcp/onboarding/applier.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/mcp/onboarding/backup.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/mcp/onboarding/detector.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/mcp/onboarding/planner.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/mcp/orchestrator.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/mcp/registry.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/mcp/runner.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/mcp/server.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/mcp_nudge.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/metrics_analyzer.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/migrate_check.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/migration_blast.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/openapi_surface.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/openrewrite_recipe.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/output_budget.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/output_encoding.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/parallel.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/parse_cache.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/partial_contract.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/path_admission.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/path_filters.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/perf.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/phased_run.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/pipe_contract.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/posture.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/pr_comment_renderer.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/pr_impact.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/prepare_context.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/progress.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/provenance.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/ranking_engine.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/readiness_timeline.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/readonly.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/reconciliation.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/redactor.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/release_info.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/relevance_scorer.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/remedies.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/rename_refactor.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/repo_classifier.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/retrieval/__init__.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/retrieval/context.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/retrieval/errors.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/retrieval/executor.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/retrieval/planner.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/retrieval/query.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/retrieval/request.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/retrieval/resolution.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/retrieval/result.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/retrieval/retriever.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/retrieval/runtime.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/retrieval/steps.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/retrieval/steps_endpoint.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/retrieval/steps_graph.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/retrieval/steps_impact.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/retrieval/steps_intf.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/retrieval/steps_struct.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/retrieval/steps_txsec.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/ris.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/risk.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/rule_catalog.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/rule_pass.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/runs.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/runtime_classifier.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/sarif.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/scanner.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/schema.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/schemas/envelope-v1.schema.json +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/security_chain.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/security_config.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/security_config_scan.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/security_posture.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/semantic_analyzer.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/semantic_impact_engine.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/semantic_integration_engine.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/semantic_services.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/serializer.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/servlet_surface.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/source_text.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/spring_event_topology.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/spring_findings.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/spring_impact.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/spring_model.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/spring_profiles.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/spring_properties.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/spring_security_audit.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/spring_semantic.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/spring_tx_analyzer.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/sql_taint.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/summarizer.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/target_admission.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/telemetry/__init__.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/telemetry/config.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/telemetry/consent.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/telemetry/events.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/telemetry/filters.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/telemetry/transport.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/test_gap_ranking.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/test_sources.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/text_input.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/timeline.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/token_estimate.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/tree_utils.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/type_usage_surface.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/validation_inference.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/verify_edit.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/verify_repo.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/verify_rules.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/version_check.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/waivers.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/src/sourcecode/workspace.py +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/supabase/functions/README.md +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/supabase/functions/get-license/index.ts +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/supabase/functions/lemonsqueezy-webhook/index.ts +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/supabase/functions/telemetry/index.ts +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/supabase/sql/license_event_ordering.sql +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/supabase/sql/licensing_schema.sql +0 -0
- {sourcecode-5.4.2 → sourcecode-5.5.0}/supabase/sql/telemetry_events.sql +0 -0
|
@@ -2,6 +2,35 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## [5.5.0] — 2026-08-12
|
|
6
|
+
|
|
7
|
+
**Audit backlog resolved and performance signals made explicit.**
|
|
8
|
+
This release folds in the latest external audit queue: programmatic Spring
|
|
9
|
+
validation now contributes to `validation` gaps and confidence, servlet and
|
|
10
|
+
endpoint publishing preserve extension mappings and `ANY` methods, reference
|
|
11
|
+
classification distinguishes class literals from config wires, and the cache
|
|
12
|
+
model now warns about large repositories against the correct scale. The roadmap
|
|
13
|
+
also records the audit backlog, including the command-execution timing
|
|
14
|
+
regression called out in the report.
|
|
15
|
+
|
|
16
|
+
### Fixed
|
|
17
|
+
- **Programmatic validation is now surfaced.** `Validator` and `@InitBinder`
|
|
18
|
+
evidence now affect `validation` gaps and overall confidence, and the payload
|
|
19
|
+
carries the non-coverage note for that limit.
|
|
20
|
+
- **Servlet extension mappings stay visible.** Patterns such as `*.ftl` and
|
|
21
|
+
`*.vm` are preserved in the servlet surface instead of being dropped.
|
|
22
|
+
- **Methodless request mappings publish as `ANY`.** `@RequestMapping` without a
|
|
23
|
+
declared method is no longer narrowed to `GET`.
|
|
24
|
+
- **Class literals count as references.** `Foo.class` hits now promote the
|
|
25
|
+
type to `referenced` instead of `unknown_framework_dispatch`.
|
|
26
|
+
- **Large-repository cache advice compares against the right scale.** The size
|
|
27
|
+
warning now tells the operator when the repository exceeds the measured
|
|
28
|
+
reference population.
|
|
29
|
+
|
|
30
|
+
### Documentation
|
|
31
|
+
- Added the external 2026-08-12 audit queue and its performance backlog to the
|
|
32
|
+
roadmap.
|
|
33
|
+
|
|
5
34
|
## [5.4.2] — 2026-08-12
|
|
6
35
|
|
|
7
36
|
**External audit fixes and roadmap alignment.**
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sourcecode
|
|
3
|
-
Version: 5.
|
|
3
|
+
Version: 5.5.0
|
|
4
4
|
Summary: Persistent structural context and ultra-fast repeated analysis for AI coding agents
|
|
5
5
|
License-File: LICENSE
|
|
6
6
|
Keywords: agents,ai,codebase,context,developer-tools,llm
|
|
@@ -42,7 +42,7 @@ Description-Content-Type: text/markdown
|
|
|
42
42
|
|
|
43
43
|
**Context · Impact · Migration · Architecture · Review — everything from one structural model.**
|
|
44
44
|
|
|
45
|
-

|
|
46
46
|

|
|
47
47
|
|
|
48
48
|
> **ASK Engine** is the product. The CLI command is **`ask`**. The legacy **`sourcecode`**
|
|
@@ -126,7 +126,7 @@ brew tap haroundominique/sourcecode && brew install sourcecode
|
|
|
126
126
|
# pip / pipx
|
|
127
127
|
pipx install sourcecode # or: pip install sourcecode
|
|
128
128
|
|
|
129
|
-
ask version # ask 5.
|
|
129
|
+
ask version # ask 5.5.0 — and, on a build that has aged,
|
|
130
130
|
# how many releases have probably shipped since
|
|
131
131
|
```
|
|
132
132
|
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
**Context · Impact · Migration · Architecture · Review — everything from one structural model.**
|
|
6
6
|
|
|
7
|
-

|
|
8
8
|

|
|
9
9
|
|
|
10
10
|
> **ASK Engine** is the product. The CLI command is **`ask`**. The legacy **`sourcecode`**
|
|
@@ -88,7 +88,7 @@ brew tap haroundominique/sourcecode && brew install sourcecode
|
|
|
88
88
|
# pip / pipx
|
|
89
89
|
pipx install sourcecode # or: pip install sourcecode
|
|
90
90
|
|
|
91
|
-
ask version # ask 5.
|
|
91
|
+
ask version # ask 5.5.0 — and, on a build that has aged,
|
|
92
92
|
# how many releases have probably shipped since
|
|
93
93
|
```
|
|
94
94
|
|
|
@@ -492,6 +492,7 @@ class Conditioning:
|
|
|
492
492
|
scope: str # "3 342 Java files, cache cold"
|
|
493
493
|
transfers: "Optional[bool]" # do the reference figures apply here?
|
|
494
494
|
per_command: "dict[str, str]" # command → how it can be run here
|
|
495
|
+
java_files: "Optional[int]" = None # measured scope size, if available
|
|
495
496
|
|
|
496
497
|
def statement(self) -> str:
|
|
497
498
|
"""One sentence about whether the figures below transfer to this scope."""
|
|
@@ -500,6 +501,14 @@ class Conditioning:
|
|
|
500
501
|
f"This repository ({self.scope}) was not measured, so nothing below "
|
|
501
502
|
f"is claimed about it: the figures are the reference repository's."
|
|
502
503
|
)
|
|
504
|
+
if self.java_files is not None and self.java_files > REFERENCE_JAVA_FILES:
|
|
505
|
+
return (
|
|
506
|
+
f"This repository ({self.scope}) is larger than the repository the "
|
|
507
|
+
f"figures below were measured on ({REFERENCE_JAVA_FILES} Java files), "
|
|
508
|
+
f"and what cost tracks here is the build rather than the file count: "
|
|
509
|
+
f"{FIELD_ANCHOR}. Read each figure as the reference's, not as yours; "
|
|
510
|
+
f"the `here:` lines say how each command can be run on this one."
|
|
511
|
+
)
|
|
503
512
|
if self.transfers:
|
|
504
513
|
return (
|
|
505
514
|
f"This repository ({self.scope}) is within the size the figures "
|
|
@@ -27,6 +27,7 @@ from sourcecode.phased_run import PhasedRun
|
|
|
27
27
|
from sourcecode.partial_contract import PARTIAL_EXIT_CODE as _PARTIAL_EXIT
|
|
28
28
|
from sourcecode.partial_contract import read_count as _read_count
|
|
29
29
|
from sourcecode import perf
|
|
30
|
+
from sourcecode.non_coverage import block as _non_coverage_block
|
|
30
31
|
from sourcecode.caller_metrics import (
|
|
31
32
|
CALLER_METRIC_RECONCILIATION,
|
|
32
33
|
CYCLE_METRIC_RECONCILIATION,
|
|
@@ -7287,6 +7288,23 @@ def validation_cmd(
|
|
|
7287
7288
|
except Exception:
|
|
7288
7289
|
pass
|
|
7289
7290
|
|
|
7291
|
+
if data.get("programmatic_validation", {}).get("detected"):
|
|
7292
|
+
data.setdefault("non_coverage", _non_coverage_block("validation"))
|
|
7293
|
+
_vc = data.get("validation_confidence")
|
|
7294
|
+
if isinstance(_vc, dict):
|
|
7295
|
+
_vc["overall"] = "Likely"
|
|
7296
|
+
_vc["claim"] = (
|
|
7297
|
+
"Declared constraints are present, but programmatic Spring "
|
|
7298
|
+
"Validator wiring was detected outside this surface's model"
|
|
7299
|
+
)
|
|
7300
|
+
limits = _vc.setdefault("known_precision_limits", [])
|
|
7301
|
+
note = (
|
|
7302
|
+
"Programmatic Spring Validator / @InitBinder wiring is outside the "
|
|
7303
|
+
"declared-constraint surface."
|
|
7304
|
+
)
|
|
7305
|
+
if note not in limits:
|
|
7306
|
+
limits.append(note)
|
|
7307
|
+
|
|
7290
7308
|
if path_prefix:
|
|
7291
7309
|
data["endpoints"] = [
|
|
7292
7310
|
e for e in data.get("endpoints", [])
|
|
@@ -14387,7 +14405,8 @@ def _cache_model_conditioning(path: Path) -> Any:
|
|
|
14387
14405
|
line += f" ({found.reference})"
|
|
14388
14406
|
per_command[row.command] = line
|
|
14389
14407
|
return _cmodel.Conditioning(
|
|
14390
|
-
scope=scope.describe(), transfers=transfers, per_command=per_command
|
|
14408
|
+
scope=scope.describe(), transfers=transfers, per_command=per_command,
|
|
14409
|
+
java_files=scope.java_files,
|
|
14391
14410
|
)
|
|
14392
14411
|
except Exception:
|
|
14393
14412
|
# A cost note is never worth failing a command that answers.
|
|
@@ -321,6 +321,27 @@ NON_COVERAGE: tuple[NonCoverage, ...] = (
|
|
|
321
321
|
"routes) is a measurement this command does not yet make."
|
|
322
322
|
),
|
|
323
323
|
),
|
|
324
|
+
NonCoverage(
|
|
325
|
+
id="NC-011",
|
|
326
|
+
surface="validation",
|
|
327
|
+
not_covered=(
|
|
328
|
+
"Programmatic Spring request-body validation wired with "
|
|
329
|
+
"`org.springframework.validation.Validator` or `@InitBinder`."
|
|
330
|
+
),
|
|
331
|
+
why=(
|
|
332
|
+
"This surface reads declared bean-validation constraints recovered from "
|
|
333
|
+
"OpenAPI or DTO annotations. A validator registered in controller code "
|
|
334
|
+
"can enforce body rules without any declarative constraint on the "
|
|
335
|
+
"payload, so treating the result as fully verified would overstate what "
|
|
336
|
+
"the declared-constraint scan proves."
|
|
337
|
+
),
|
|
338
|
+
instead=(
|
|
339
|
+
"`@InitBinder` / `setValidator(...)` wiring, or a Spring `Validator` "
|
|
340
|
+
"implementation, which this surface reports only as a coverage "
|
|
341
|
+
"boundary. `validation` still shows the declared rules; the programmatic "
|
|
342
|
+
"validator remains outside that model."
|
|
343
|
+
),
|
|
344
|
+
),
|
|
324
345
|
)
|
|
325
346
|
|
|
326
347
|
|
|
@@ -162,7 +162,7 @@ _QUALIFIED_TYPE_RE = re.compile(r"\b[A-Z][A-Za-z0-9_$]*\.[A-Z][A-Za-z0-9_$]*")
|
|
|
162
162
|
|
|
163
163
|
def _scan_repository(
|
|
164
164
|
root: Path, simple_names: "set[str]", nested: "dict[str, tuple[str, str]]"
|
|
165
|
-
) -> "tuple[dict[str, str], dict[str, str]]":
|
|
165
|
+
) -> "tuple[dict[str, str], dict[str, str], dict[str, str]]":
|
|
166
166
|
"""One walk, two questions — `(config-wired names, nested types other code names)`.
|
|
167
167
|
|
|
168
168
|
Both scans need the whole tree, and walking it twice doubled the cost of the
|
|
@@ -175,6 +175,7 @@ def _scan_repository(
|
|
|
175
175
|
"""
|
|
176
176
|
config_hits: dict[str, str] = {}
|
|
177
177
|
nested_hits: dict[str, str] = {}
|
|
178
|
+
literal_hits: dict[str, str] = {}
|
|
178
179
|
pending = set(simple_names)
|
|
179
180
|
by_qualified: dict[str, list[str]] = {}
|
|
180
181
|
for fqn, (qualified, _own) in nested.items():
|
|
@@ -183,7 +184,7 @@ def _scan_repository(
|
|
|
183
184
|
scan_config = bool(pending)
|
|
184
185
|
scan_java = bool(by_qualified)
|
|
185
186
|
if not scan_config and not scan_java:
|
|
186
|
-
return config_hits, nested_hits
|
|
187
|
+
return config_hits, nested_hits, literal_hits
|
|
187
188
|
|
|
188
189
|
scanned = 0
|
|
189
190
|
for dirpath, dirnames, filenames in os.walk(root):
|
|
@@ -191,7 +192,7 @@ def _scan_repository(
|
|
|
191
192
|
for filename in filenames:
|
|
192
193
|
is_java = filename.endswith(".java")
|
|
193
194
|
is_config = os.path.splitext(filename)[1].lower() in _CONFIG_REF_EXTS
|
|
194
|
-
if not ((is_java and scan_java) or (is_config and scan_config)):
|
|
195
|
+
if not ((is_java and (scan_java or scan_config)) or (is_config and scan_config)):
|
|
195
196
|
continue
|
|
196
197
|
if scanned >= _SCAN_MAX_FILES:
|
|
197
198
|
break
|
|
@@ -206,6 +207,17 @@ def _scan_repository(
|
|
|
206
207
|
pending.discard(hit)
|
|
207
208
|
config_hits[hit] = rel
|
|
208
209
|
scan_config = bool(pending)
|
|
210
|
+
if is_java and scan_config:
|
|
211
|
+
# A `Foo.class` literal is a real static reference, and the
|
|
212
|
+
# field audit found one of these on the annotation-dispatch path.
|
|
213
|
+
class_hits = {
|
|
214
|
+
hit for hit in pending
|
|
215
|
+
if f"{hit}.class" in text
|
|
216
|
+
}
|
|
217
|
+
for hit in class_hits:
|
|
218
|
+
pending.discard(hit)
|
|
219
|
+
literal_hits[hit] = rel
|
|
220
|
+
scan_config = bool(pending)
|
|
209
221
|
if is_java and scan_java:
|
|
210
222
|
for hit in set(_QUALIFIED_TYPE_RE.findall(text)) & set(by_qualified):
|
|
211
223
|
for fqn in by_qualified[hit]:
|
|
@@ -213,10 +225,10 @@ def _scan_repository(
|
|
|
213
225
|
nested_hits[fqn] = rel
|
|
214
226
|
scan_java = len(nested_hits) < len(nested)
|
|
215
227
|
if not scan_config and not scan_java:
|
|
216
|
-
return config_hits, nested_hits
|
|
228
|
+
return config_hits, nested_hits, literal_hits
|
|
217
229
|
if scanned >= _SCAN_MAX_FILES:
|
|
218
230
|
break
|
|
219
|
-
return config_hits, nested_hits
|
|
231
|
+
return config_hits, nested_hits, literal_hits
|
|
220
232
|
|
|
221
233
|
|
|
222
234
|
def analyze_type_references(nodes: "list[dict]", root: Path) -> ReferenceFacts:
|
|
@@ -226,7 +238,15 @@ def analyze_type_references(nodes: "list[dict]", root: Path) -> ReferenceFacts:
|
|
|
226
238
|
examined, because a method with no callers is a different question.
|
|
227
239
|
"""
|
|
228
240
|
root = Path(root)
|
|
229
|
-
|
|
241
|
+
def _node_kind(node: dict) -> str:
|
|
242
|
+
kind = str(node.get("symbol_kind") or node.get("kind") or node.get("type") or "")
|
|
243
|
+
if kind in ("class", "interface", "enum", "annotation", "record"):
|
|
244
|
+
return kind
|
|
245
|
+
if kind == "@interface":
|
|
246
|
+
return "annotation"
|
|
247
|
+
return str(node.get("type") or "")
|
|
248
|
+
|
|
249
|
+
types = [n for n in nodes or [] if _node_kind(n) in ("class", "interface", "enum", "annotation", "record") and n.get("fqn")]
|
|
230
250
|
if not types:
|
|
231
251
|
return ReferenceFacts(0, {s: 0 for s in STATUSES}, ())
|
|
232
252
|
|
|
@@ -237,7 +257,7 @@ def analyze_type_references(nodes: "list[dict]", root: Path) -> ReferenceFacts:
|
|
|
237
257
|
entries.append(TypeReference(
|
|
238
258
|
fqn=str(node["fqn"]), status=REFERENCED,
|
|
239
259
|
basis="incoming edge in the call-graph",
|
|
240
|
-
type=
|
|
260
|
+
type=_node_kind(node), role=str(node.get("role") or "other"),
|
|
241
261
|
))
|
|
242
262
|
else:
|
|
243
263
|
candidates.append(node)
|
|
@@ -271,22 +291,30 @@ def analyze_type_references(nodes: "list[dict]", root: Path) -> ReferenceFacts:
|
|
|
271
291
|
f"{parts[-2]}.{parts[-1]}",
|
|
272
292
|
str(node.get("source_file") or "").replace("\\", "/"),
|
|
273
293
|
)
|
|
274
|
-
config_hits, nested_hits = _scan_repository(root, set(by_simple), nested_candidates)
|
|
294
|
+
config_hits, nested_hits, literal_hits = _scan_repository(root, set(by_simple), nested_candidates)
|
|
295
|
+
literal_refs: dict[str, str] = {}
|
|
275
296
|
for simple, config_file in config_hits.items():
|
|
276
297
|
for node in by_simple.get(simple, []):
|
|
277
298
|
dispatch_basis[str(node["fqn"])] = f"named in {config_file}"
|
|
299
|
+
for simple, literal_file in literal_hits.items():
|
|
300
|
+
for node in by_simple.get(simple, []):
|
|
301
|
+
literal_refs[str(node["fqn"])] = literal_file
|
|
278
302
|
|
|
279
303
|
for node in candidates:
|
|
280
304
|
fqn = str(node["fqn"])
|
|
281
305
|
common = {
|
|
282
306
|
"fqn": fqn,
|
|
283
|
-
"type":
|
|
307
|
+
"type": _node_kind(node),
|
|
284
308
|
"role": str(node.get("role") or "other"),
|
|
285
309
|
}
|
|
286
|
-
if fqn in nested_hits:
|
|
310
|
+
if fqn in nested_hits or fqn in literal_refs:
|
|
287
311
|
entries.append(TypeReference(
|
|
288
312
|
status=REFERENCED,
|
|
289
|
-
basis=
|
|
313
|
+
basis=(
|
|
314
|
+
f"named as a qualified nested type in {nested_hits[fqn]}"
|
|
315
|
+
if fqn in nested_hits
|
|
316
|
+
else f"referenced by a class literal in {literal_refs[fqn]}"
|
|
317
|
+
),
|
|
290
318
|
**common,
|
|
291
319
|
))
|
|
292
320
|
elif fqn in dispatch_basis:
|
|
@@ -3778,7 +3778,11 @@ def _parse_route_http_method(ann_name: str, args_str: str) -> str:
|
|
|
3778
3778
|
if explicit:
|
|
3779
3779
|
return explicit
|
|
3780
3780
|
m = re.search(r'method\s*=\s*(?:RequestMethod\.)?(\w+)', args_str or "")
|
|
3781
|
-
|
|
3781
|
+
if m:
|
|
3782
|
+
return m.group(1).upper()
|
|
3783
|
+
if ann_name == "@RequestMapping":
|
|
3784
|
+
return "ANY"
|
|
3785
|
+
return ""
|
|
3782
3786
|
|
|
3783
3787
|
|
|
3784
3788
|
def _parse_route_extras(args_str: str) -> dict:
|
|
@@ -34,6 +34,7 @@ from pathlib import Path
|
|
|
34
34
|
from typing import TYPE_CHECKING, Any, Optional
|
|
35
35
|
|
|
36
36
|
from sourcecode.path_filters import is_test_path
|
|
37
|
+
from sourcecode.non_coverage import block as non_coverage_block
|
|
37
38
|
|
|
38
39
|
if TYPE_CHECKING:
|
|
39
40
|
from sourcecode.context_graph import ContextGraph
|
|
@@ -471,6 +472,47 @@ def _is_body_endpoint(ep: "dict[str, Any]") -> bool:
|
|
|
471
472
|
return method in ("POST", "PUT", "PATCH")
|
|
472
473
|
|
|
473
474
|
|
|
475
|
+
def _programmatic_validation_signals(graph: "ContextGraph") -> "list[str]":
|
|
476
|
+
"""Presence-only evidence for Spring Validator / InitBinder wiring.
|
|
477
|
+
|
|
478
|
+
The validation surface does not model these flows, but the command still
|
|
479
|
+
needs to say when a repo is using them so the declared-constraint summary is
|
|
480
|
+
not read as a full proof."""
|
|
481
|
+
evidence: list[str] = []
|
|
482
|
+
|
|
483
|
+
for t in graph.types():
|
|
484
|
+
if _is_excluded(t.source_file):
|
|
485
|
+
continue
|
|
486
|
+
sig = (t.signature or "")
|
|
487
|
+
if "org.springframework.validation.Validator" not in sig:
|
|
488
|
+
continue
|
|
489
|
+
if "ConstraintValidator" in sig:
|
|
490
|
+
continue
|
|
491
|
+
evidence.append(f"{t.fqn} implements org.springframework.validation.Validator")
|
|
492
|
+
|
|
493
|
+
for m in graph.symbols(kind="method"):
|
|
494
|
+
if _is_excluded(m.source_file):
|
|
495
|
+
continue
|
|
496
|
+
if m.has_annotation("InitBinder"):
|
|
497
|
+
evidence.append(f"{m.fqn} is annotated with @InitBinder")
|
|
498
|
+
|
|
499
|
+
if evidence:
|
|
500
|
+
return sorted(dict.fromkeys(evidence))
|
|
501
|
+
|
|
502
|
+
try:
|
|
503
|
+
for edge in graph.cir.call_graph:
|
|
504
|
+
target = str(edge.get("to") or edge.get("to_symbol") or "")
|
|
505
|
+
if target.endswith("setValidator"):
|
|
506
|
+
source = str(edge.get("from") or edge.get("from_symbol") or "")
|
|
507
|
+
if source:
|
|
508
|
+
evidence.append(f"{source} calls {target}")
|
|
509
|
+
break
|
|
510
|
+
except Exception:
|
|
511
|
+
pass
|
|
512
|
+
|
|
513
|
+
return sorted(dict.fromkeys(evidence))
|
|
514
|
+
|
|
515
|
+
|
|
474
516
|
def build_validation_surface(
|
|
475
517
|
root: Path,
|
|
476
518
|
endpoints_data: "Optional[dict[str, Any]]" = None,
|
|
@@ -494,6 +536,7 @@ def build_validation_surface(
|
|
|
494
536
|
graph = _build_graph(root)
|
|
495
537
|
|
|
496
538
|
catalog = discover_custom_validators(root, graph)
|
|
539
|
+
programmatic_evidence = _programmatic_validation_signals(graph)
|
|
497
540
|
|
|
498
541
|
out_endpoints: "list[dict[str, Any]]" = []
|
|
499
542
|
gaps: "list[dict[str, Any]]" = []
|
|
@@ -579,6 +622,11 @@ def build_validation_surface(
|
|
|
579
622
|
"gaps": len(gaps),
|
|
580
623
|
},
|
|
581
624
|
}
|
|
625
|
+
if programmatic_evidence:
|
|
626
|
+
result["programmatic_validation"] = {
|
|
627
|
+
"detected": True,
|
|
628
|
+
"evidence": programmatic_evidence,
|
|
629
|
+
}
|
|
582
630
|
spec_path = endpoints_data.get("openapi_spec")
|
|
583
631
|
if spec_path:
|
|
584
632
|
result["openapi_spec"] = spec_path
|
|
@@ -661,7 +709,48 @@ def build_validation_surface(
|
|
|
661
709
|
"expected for such repos, not a missing-validation finding."
|
|
662
710
|
)
|
|
663
711
|
|
|
712
|
+
if programmatic_evidence:
|
|
713
|
+
result["non_coverage"] = non_coverage_block("validation")
|
|
714
|
+
result["note"] = (
|
|
715
|
+
result.get("note", "")
|
|
716
|
+
+ " Programmatic Spring Validator wiring was detected, which is "
|
|
717
|
+
"outside the declared-constraint surface this command models."
|
|
718
|
+
).strip()
|
|
719
|
+
if not result.get("gaps"):
|
|
720
|
+
result["gaps"] = [
|
|
721
|
+
{
|
|
722
|
+
"method": "",
|
|
723
|
+
"path": "",
|
|
724
|
+
"controller": "",
|
|
725
|
+
"reason": "programmatic_validator_wiring_unmodeled",
|
|
726
|
+
"basis": "programmatic_validation",
|
|
727
|
+
"confidence": "Likely",
|
|
728
|
+
}
|
|
729
|
+
]
|
|
730
|
+
result["summary"]["gaps"] = 1
|
|
731
|
+
|
|
664
732
|
_reconcile_with_code_axis(result, graph, root)
|
|
733
|
+
if programmatic_evidence:
|
|
734
|
+
result["non_coverage"] = non_coverage_block("validation")
|
|
735
|
+
note = result.get("note", "")
|
|
736
|
+
programmatic_note = (
|
|
737
|
+
" Programmatic Spring Validator wiring was detected, which is "
|
|
738
|
+
"outside the declared-constraint surface this command models."
|
|
739
|
+
)
|
|
740
|
+
if programmatic_note.strip() not in note:
|
|
741
|
+
result["note"] = (note + programmatic_note).strip()
|
|
742
|
+
if not result.get("gaps"):
|
|
743
|
+
result["gaps"] = [
|
|
744
|
+
{
|
|
745
|
+
"method": "",
|
|
746
|
+
"path": "",
|
|
747
|
+
"controller": "",
|
|
748
|
+
"reason": "programmatic_validator_wiring_unmodeled",
|
|
749
|
+
"basis": "programmatic_validation",
|
|
750
|
+
"confidence": "Likely",
|
|
751
|
+
}
|
|
752
|
+
]
|
|
753
|
+
result["summary"]["gaps"] = 1
|
|
665
754
|
return result
|
|
666
755
|
|
|
667
756
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sourcecode-5.4.2 → sourcecode-5.5.0}/docs/architecture/DESIGN-knowledge-provider-integration.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sourcecode-5.4.2 → sourcecode-5.5.0}/docs/architecture/DESIGN-p6-semantic-integration-engine.md
RENAMED
|
File without changes
|
|
File without changes
|
{sourcecode-5.4.2 → sourcecode-5.5.0}/docs/architecture/DESIGN-robustness-security-inference.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sourcecode-5.4.2 → sourcecode-5.5.0}/docs/architecture/REPORT-p6-flow-analyzer-comparison.md
RENAMED
|
File without changes
|
{sourcecode-5.4.2 → sourcecode-5.5.0}/docs/architecture/REPORT-p6-integration-detector-comparison.md
RENAMED
|
File without changes
|
{sourcecode-5.4.2 → sourcecode-5.5.0}/docs/architecture/REPORT-p8-flow-analyzer-migration.md
RENAMED
|
File without changes
|
{sourcecode-5.4.2 → sourcecode-5.5.0}/docs/architecture/REPORT-p9-integration-detector-migration.md
RENAMED
|
File without changes
|
|
File without changes
|
{sourcecode-5.4.2 → sourcecode-5.5.0}/docs/architecture/adr/0002-source-evidence-boundary.md
RENAMED
|
File without changes
|
{sourcecode-5.4.2 → sourcecode-5.5.0}/docs/architecture/adr/0003-architectural-characterization.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sourcecode-5.4.2 → sourcecode-5.5.0}/docs/eval/2026-06-15-petclinic-rest-issue11-vets-pagination.md
RENAMED
|
File without changes
|
{sourcecode-5.4.2 → sourcecode-5.5.0}/docs/eval/2026-06-15-petclinic-rest-issue147-validation.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sourcecode-5.4.2 → sourcecode-5.5.0}/docs/eval/2026-06-16-broadleaf-checkout-impact-fieldtest.md
RENAMED
|
File without changes
|
|
File without changes
|
{sourcecode-5.4.2 → sourcecode-5.5.0}/docs/eval/2026-06-16-spring-petclinic-issue2333-dead-vets.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|