sourcecode 5.5.1__tar.gz → 5.5.4__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.5.1 → sourcecode-5.5.4}/CHANGELOG.md +56 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/PKG-INFO +3 -3
- {sourcecode-5.5.1 → sourcecode-5.5.4}/README.md +2 -2
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/DEFECT-LEDGER.md +11 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/USER_GUIDE.md +8 -2
- {sourcecode-5.5.1 → sourcecode-5.5.4}/pyproject.toml +1 -1
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/__init__.py +1 -1
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/cli.py +42 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/dependency_analyzer.py +15 -1
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/deployment_prefix.py +18 -12
- sourcecode-5.5.4/src/sourcecode/manifest_cache.py +62 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/migrate_check.py +20 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/repository_ir.py +141 -30
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/risk.py +25 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/servlet_surface.py +60 -8
- {sourcecode-5.5.1 → sourcecode-5.5.4}/.github/workflows/build-windows.yml +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/.github/workflows/perf-gate.yml +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/.gitignore +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/.ruff.toml +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/CLAUDE.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/CONTRIBUTING.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/LICENSE +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/SECURITY.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/CACHE.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/COMMERCIAL-OFFER.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/CUSTOMER-VALIDATION.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/DEMO-5MIN.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/DEVELOPMENT-ROADMAP.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/EXECUTION-PLAN-12MO.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/EXECUTIVE-ROADMAP.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/MANUAL-USUARIO.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/MODERNIZATION.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/PRODUCT_AUDIT.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/PRODUCT_IDENTITY.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/PRODUCT_TIERS.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/RC1-CHECKLIST.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/RELEASE-CHECKLIST.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/architecture/CATALOG-retrieval-intents.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/architecture/DESIGN-knowledge-provider-integration.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/architecture/DESIGN-p5.3b-statement-surface.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/architecture/DESIGN-p5.5-span-index.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/architecture/DESIGN-p6-semantic-impact-engine.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/architecture/DESIGN-p6-semantic-integration-engine.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/architecture/DESIGN-p7-semantic-services.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/architecture/DESIGN-robustness-security-inference.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/architecture/DESIGN-semantic-retrieval.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/architecture/EPV-p6-class-typeref.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/architecture/REPORT-p6-flow-analyzer-comparison.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/architecture/REPORT-p6-integration-detector-comparison.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/architecture/REPORT-p8-flow-analyzer-migration.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/architecture/REPORT-p9-integration-detector-migration.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/architecture/adr/0001-semantic-ir.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/architecture/adr/0002-source-evidence-boundary.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/architecture/adr/0003-architectural-characterization.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/architecture/adr/0004-semantic-retrieval.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/architecture/adr/0005-evidence-reconciliation.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/architecture/adr/0006-performance-harness.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/architecture/adr/0007-composition-semantics.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/architecture/adr/0008-answer-coherence.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/architecture/consumer-disposition-inventory.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/architecture/overview.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/architecture/product-architecture-review.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/architecture/product-strategy-layering.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/architecture/semantic-ir-consumer-matrix.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/architecture/semantic-ir-roadmap.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/baseline-ci.yml +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/commercial-pipeline-audit.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/contracts-ci.yml +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/contracts.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/eval/2026-06-15-petclinic-rest-issue11-vets-pagination.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/eval/2026-06-15-petclinic-rest-issue147-validation.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/eval/2026-06-15-petclinic-rest-workflow.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/eval/2026-06-15-phase18-openapi-surface.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/eval/2026-06-15-phase20-validation-surface.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/eval/2026-06-16-broadleaf-checkout-impact-fieldtest.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/eval/2026-06-16-petclinic-rest-issue11-weakness2-closed.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/eval/2026-06-16-spring-petclinic-issue2333-dead-vets.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/licensing-schema.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/migrate-check.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/perf/README.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/perf/REGRESSION-GATE.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/perf/baselines/2.5.15/SUMMARY.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/perf/baselines/2.5.15/alfresco__ask__cold.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/perf/baselines/2.5.15/alfresco__ask__warm.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/perf/baselines/2.5.15/broadleaf__ask__cold.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/perf/baselines/2.5.15/broadleaf__ask__warm.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/perf/baselines/2.5.15/eureka__ask__cold.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/perf/baselines/2.5.15/eureka__ask__warm.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/perf/baselines/2.5.15/jenkins__ask__cold.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/perf/baselines/2.5.15/jenkins__ask__warm.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/perf/baselines/2.5.15/jobrunr__ask__cold.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/perf/baselines/2.5.15/jobrunr__ask__warm.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/perf/baselines/2.5.15/keycloak__ask__cold.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/perf/baselines/2.5.15/keycloak__ask__warm.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/perf/baselines/2.5.15/neo4j__ask__cold.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/perf/baselines/2.5.15/neo4j__ask__warm.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/perf/baselines/2.5.15/ofbiz__ask__cold.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/perf/baselines/2.5.15/ofbiz__ask__warm.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/perf/baselines/2.5.15/openmrs__ask__cold.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/perf/baselines/2.5.15/openmrs__ask__warm.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/perf/baselines/2.5.15/petclinic__ask__cold.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/perf/baselines/2.5.15/petclinic__ask__warm.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/perf/baselines/2.5.16/SUMMARY.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/perf/baselines/2.5.16/alfresco__ask__cold.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/perf/baselines/2.5.16/alfresco__ask__warm.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/perf/baselines/2.5.16/broadleaf__ask__cold.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/perf/baselines/2.5.16/broadleaf__ask__warm.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/perf/baselines/2.5.16/eureka__ask__cold.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/perf/baselines/2.5.16/eureka__ask__warm.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/perf/baselines/2.5.16/jenkins__ask__cold.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/perf/baselines/2.5.16/jenkins__ask__warm.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/perf/baselines/2.5.16/jobrunr__ask__cold.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/perf/baselines/2.5.16/jobrunr__ask__warm.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/perf/baselines/2.5.16/keycloak__ask__cold.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/perf/baselines/2.5.16/keycloak__ask__warm.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/perf/baselines/2.5.16/neo4j__ask__cold.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/perf/baselines/2.5.16/neo4j__ask__warm.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/perf/baselines/2.5.16/ofbiz__ask__cold.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/perf/baselines/2.5.16/ofbiz__ask__warm.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/perf/baselines/2.5.16/openmrs__ask__cold.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/perf/baselines/2.5.16/openmrs__ask__warm.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/perf/baselines/2.5.16/petclinic__ask__cold.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/perf/baselines/2.5.16/petclinic__ask__warm.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/perf/baselines/gate-latest/README.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/perf/baselines/gate-latest/broadleaf__ask__warm.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/perf/baselines/gate-latest/broadleaf__endpoints__warm.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/perf/baselines/gate-latest/broadleaf__migrate-check__warm.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/perf/baselines/gate-latest/broadleaf__posture__warm.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/perf/baselines/gate-latest/broadleaf__spring-audit__warm.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/perf/baselines/gate-latest/broadleaf__validation__warm.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/perf/baselines/reference-best/README.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/posture.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/privacy.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/pro-experience-audit.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/schema.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/spec/envelope-v1.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/docs/spring-audit-ci.yml +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/raw +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/scripts/compare_integration_engines.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/scripts/customer_smoke_test.sh +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/scripts/generate_jdk_exports.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/scripts/perf_gate.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/scripts/perf_harness.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/scripts/sync_gate_anchors.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/adaptive_scanner.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/archetype.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/architectural_baseline.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/architectural_delta.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/architecture_analyzer.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/architecture_summary.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/ast_extractor.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/audit_report.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/baseline_autocapture.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/bundled_docs.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/cache.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/cache_model.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/call_surface.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/caller_metrics.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/caller_reach.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/canonical_ir.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/chain_rules.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/change_plan.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/cir_graphs.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/classifier.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/client_calls.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/code_notes_analyzer.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/compare.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/confidence_analyzer.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/constraint_diff.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/consumer_join.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/container_wiring.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/context_cache.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/context_graph.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/context_scorer.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/context_summarizer.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/contract_diff.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/contract_init.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/contract_model.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/contract_pipeline.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/coverage_parser.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/data_exposure.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/data_labels.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/declarations.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/defect_identity.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/degradation.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/detach.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/detectors/__init__.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/detectors/base.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/detectors/csproj_parser.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/detectors/dart.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/detectors/dotnet.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/detectors/elixir.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/detectors/go.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/detectors/heuristic.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/detectors/hybrid.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/detectors/java.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/detectors/jvm_ext.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/detectors/nodejs.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/detectors/parsers.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/detectors/php.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/detectors/project.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/detectors/python.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/detectors/ruby.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/detectors/rust.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/detectors/systems.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/detectors/terraform.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/detectors/tooling.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/doc_analyzer.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/dynamic_argument_surface.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/endpoint_literals.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/endpoint_metrics.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/entrypoint_classifier.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/env_analyzer.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/envelope.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/environment_resolution.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/error_schema.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/evidence_provider.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/execution_plan.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/explain.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/facts/__init__.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/facts/registry.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/file_chunker.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/file_classifier.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/filter_surface.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/format_contract.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/fqn_utils.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/gate_anchors.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/git_analyzer.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/git_checkout.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/graph_analyzer.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/graph_evidence.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/hibernate_strat.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/identity_fallback.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/integration_coordinates.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/jdk_exports.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/license.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/mcp/__init__.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/mcp/dependency_import.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/mcp/onboarding/__init__.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/mcp/onboarding/applier.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/mcp/onboarding/backup.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/mcp/onboarding/detector.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/mcp/onboarding/planner.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/mcp/orchestrator.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/mcp/registry.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/mcp/runner.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/mcp/server.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/mcp_nudge.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/metrics_analyzer.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/migration_blast.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/non_coverage.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/openapi_surface.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/openrewrite_recipe.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/output_budget.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/output_encoding.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/parallel.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/parse_cache.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/partial_contract.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/path_admission.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/path_filters.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/perf.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/phased_run.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/pipe_contract.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/posture.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/pr_comment_renderer.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/pr_impact.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/prepare_context.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/progress.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/provenance.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/ranking_engine.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/readiness_timeline.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/readonly.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/reconciliation.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/redactor.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/reference_facts.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/release_info.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/relevance_scorer.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/remedies.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/rename_refactor.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/repo_classifier.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/retrieval/__init__.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/retrieval/context.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/retrieval/errors.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/retrieval/executor.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/retrieval/planner.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/retrieval/query.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/retrieval/request.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/retrieval/resolution.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/retrieval/result.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/retrieval/retriever.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/retrieval/runtime.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/retrieval/steps.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/retrieval/steps_endpoint.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/retrieval/steps_graph.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/retrieval/steps_impact.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/retrieval/steps_intf.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/retrieval/steps_struct.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/retrieval/steps_txsec.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/ris.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/rule_catalog.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/rule_pass.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/runs.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/runtime_classifier.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/sarif.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/scanner.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/schema.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/schemas/envelope-v1.schema.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/security_chain.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/security_config.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/security_config_scan.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/security_posture.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/semantic_analyzer.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/semantic_impact_engine.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/semantic_integration_engine.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/semantic_services.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/serializer.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/source_text.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/spring_event_topology.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/spring_findings.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/spring_impact.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/spring_model.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/spring_profiles.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/spring_properties.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/spring_security_audit.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/spring_semantic.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/spring_tx_analyzer.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/sql_taint.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/summarizer.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/target_admission.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/telemetry/__init__.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/telemetry/config.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/telemetry/consent.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/telemetry/events.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/telemetry/filters.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/telemetry/transport.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/test_gap_ranking.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/test_sources.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/text_input.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/timeline.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/token_estimate.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/tree_utils.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/type_usage_surface.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/validation_inference.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/validation_surface.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/verify_edit.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/verify_repo.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/verify_rules.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/version_check.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/waivers.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/src/sourcecode/workspace.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/supabase/functions/README.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/supabase/functions/get-license/index.ts +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/supabase/functions/lemonsqueezy-webhook/index.ts +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/supabase/functions/telemetry/index.ts +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/supabase/sql/license_event_ordering.sql +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/supabase/sql/licensing_schema.sql +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.4}/supabase/sql/telemetry_events.sql +0 -0
|
@@ -2,6 +2,62 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## [5.5.4] — 2026-08-13
|
|
6
|
+
|
|
7
|
+
**Re-audit performance and HTTP contract corrections.**
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
- Consolidated repeated XML and configuration traversals in `endpoints`; servlet
|
|
11
|
+
discovery now uses a pruned walk or the inventories already computed by the
|
|
12
|
+
endpoint analysis.
|
|
13
|
+
- Parsed braced Spring `RequestMethod` declarations and expose complete
|
|
14
|
+
`methods` lists while retaining the backwards-compatible primary `method`.
|
|
15
|
+
- Verified that atomic `--output` replacement produced the requested destination
|
|
16
|
+
before recording the run as successful.
|
|
17
|
+
|
|
18
|
+
### Documentation
|
|
19
|
+
- Documented `ANY` semantics and synchronized the defect ledger, roadmap, and
|
|
20
|
+
atomic audit-fix commits. The reported CLI alias discrepancy was not
|
|
21
|
+
reproducible against the public command signatures.
|
|
22
|
+
|
|
23
|
+
## [5.5.3] — 2026-08-13
|
|
24
|
+
|
|
25
|
+
**Audit regression fixes and diagnostic output.**
|
|
26
|
+
|
|
27
|
+
### Fixed
|
|
28
|
+
- Restored bounded default `spring-audit` stdout while preserving complete
|
|
29
|
+
reports through `--output`.
|
|
30
|
+
- Added depth, provenance, unit declarations, and hub-excluded reach to
|
|
31
|
+
`impact` for service-locator architectures.
|
|
32
|
+
- Hardened `web.xml` mapping extraction for legacy descriptors and consecutive
|
|
33
|
+
mappings, without activating commented mappings.
|
|
34
|
+
- Published root timing metadata and reused content-addressed manifest analysis.
|
|
35
|
+
- Made excluded test-source route counts explicit in endpoint output.
|
|
36
|
+
|
|
37
|
+
### Documentation
|
|
38
|
+
- Updated the roadmap with the 5.5.2 audit follow-up, deduplicated against
|
|
39
|
+
previous defect entries and linked to atomic fix commits.
|
|
40
|
+
|
|
41
|
+
## [5.5.2] — 2026-08-13
|
|
42
|
+
|
|
43
|
+
**Follow-up audit corrections and performance visibility.**
|
|
44
|
+
|
|
45
|
+
### Fixed
|
|
46
|
+
- `endpoints --include-tests` now admits test-suite `src/main` sources while
|
|
47
|
+
preserving the production default and its exclusion evidence.
|
|
48
|
+
- `impact` publishes caller provenance and a hub-excluded reach axis instead of
|
|
49
|
+
presenting service-locator expansion as an undifferentiated repository total.
|
|
50
|
+
- Servlet populations use one unique URL-pattern authority with reconciled
|
|
51
|
+
declaration counts.
|
|
52
|
+
- Manifest dependency analysis is content-addressed and root output publishes
|
|
53
|
+
timing layers, including manifest cost.
|
|
54
|
+
- `risk` stdout and `migrate-check --compact` deduplicate invariant rule prose;
|
|
55
|
+
full reports remain available through `-o`.
|
|
56
|
+
|
|
57
|
+
### Documentation
|
|
58
|
+
- Consolidated the two follow-up audits in the roadmap without duplicating the
|
|
59
|
+
already resolved 5.5.0 defect entries.
|
|
60
|
+
|
|
5
61
|
## [5.5.1] — 2026-08-13
|
|
6
62
|
|
|
7
63
|
**External audit corrections and command execution performance.**
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sourcecode
|
|
3
|
-
Version: 5.5.
|
|
3
|
+
Version: 5.5.4
|
|
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.5.
|
|
129
|
+
ask version # ask 5.5.4 — 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.5.
|
|
91
|
+
ask version # ask 5.5.4 — and, on a build that has aged,
|
|
92
92
|
# how many releases have probably shipped since
|
|
93
93
|
```
|
|
94
94
|
|
|
@@ -16,6 +16,17 @@ The facts these rows are keyed to are published: `ask schema facts-v1` prints th
|
|
|
16
16
|
|
|
17
17
|
---
|
|
18
18
|
|
|
19
|
+
## Audit synchronization
|
|
20
|
+
|
|
21
|
+
| ID | Defect | Found | Severity | Status |
|
|
22
|
+
|---|---|---|---|---|
|
|
23
|
+
| AS-01 | `risk`/`enrich` could omit `sql_taint.bounded_interpolations`, making `sinks_total` impossible to audit against its bounded evidence. | 5.4.2 re-audit | Medium | **closed 5.4.2** — both projections preserve the bounded rows; the paired fixture asserts the sink total and the retained bounded interpolation. |
|
|
24
|
+
| AS-02 | Route projection emitted declarations from abstract Spring controllers, creating phantom routes and inflating the unprotected census. | 5.4.2 re-audit | Low | **closed 5.4.2** — abstract declarers are excluded while concrete subtype projection remains admitted; the route-surface regression covers both sides. |
|
|
25
|
+
| AS-03 | The distributed ledger could leave `C3-123` open after the 5.4.1 build already excluded static assets. | 5.4.2 re-audit | Informational | **closed 5.4.2** — the stale state was synchronized to the wheel it documents. |
|
|
26
|
+
| AS-04 | An unconstrained `@RequestMapping` was described by consumers as GET although Spring admits every verb. | 5.5.1 audit | Medium | **closed 5.5.1** — primary `method` is `ANY`; 5.5.4 adds the concrete `methods` list so consumers do not need to infer its expansion. |
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
19
30
|
## Class C1 — One fact, two authorities
|
|
20
31
|
|
|
21
32
|
| ID | Defect | Found | Severity | Status |
|
|
@@ -136,7 +136,7 @@ pipx install sourcecode # isolated install, no venv needed
|
|
|
136
136
|
|
|
137
137
|
# Verify
|
|
138
138
|
ask version
|
|
139
|
-
# ask 5.5.
|
|
139
|
+
# ask 5.5.4
|
|
140
140
|
```
|
|
141
141
|
|
|
142
142
|
Requires Python 3.9+.
|
|
@@ -261,7 +261,13 @@ ask endpoints /path/to/repo
|
|
|
261
261
|
ask endpoints . --format yaml
|
|
262
262
|
```
|
|
263
263
|
|
|
264
|
-
Output: list of `{method, path, controller, handler}`.
|
|
264
|
+
Output: list of `{method, methods, path, controller, handler}`. `method` remains
|
|
265
|
+
the backwards-compatible primary verb; `methods` is the complete declared set.
|
|
266
|
+
An unconstrained `@RequestMapping` reports `method: "ANY"` and
|
|
267
|
+
`methods: ["GET", "POST", "PUT", "DELETE", "PATCH"]`, because it accepts all
|
|
268
|
+
of those verbs rather than defaulting to GET. Covers `@GetMapping`, `@PostMapping`,
|
|
269
|
+
`@PutMapping`, `@DeleteMapping`, `@PatchMapping`, `@RequestMapping`, `@GET`,
|
|
270
|
+
`@POST`, `@PUT`, `@DELETE`, `@PATCH` + `@Path`.
|
|
265
271
|
|
|
266
272
|
Each endpoint carries a `security` policy. Standard annotations (`@PreAuthorize`, `@Secured`, `@RolesAllowed`, …) are recognized automatically; a custom authorization annotation reports `policy: "none_detected"` until declared in a `sourcecode.config.json` at the repo root:
|
|
267
273
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import contextlib
|
|
4
|
+
import errno
|
|
4
5
|
import hashlib
|
|
5
6
|
import json
|
|
6
7
|
import difflib
|
|
@@ -1196,6 +1197,15 @@ def _safe_write_file(path: "Path", content: str) -> None:
|
|
|
1196
1197
|
fh.flush()
|
|
1197
1198
|
os.fsync(fh.fileno())
|
|
1198
1199
|
tmp.replace(path)
|
|
1200
|
+
# Atomic replacement alone does not prove that the destination is the
|
|
1201
|
+
# requested artifact. Verify the postcondition before reporting a run
|
|
1202
|
+
# output path, especially for non-empty JSON reports.
|
|
1203
|
+
if not path.is_file() or (content and path.stat().st_size == 0):
|
|
1204
|
+
raise OSError(
|
|
1205
|
+
errno.EIO,
|
|
1206
|
+
"atomic output replacement did not produce the requested file",
|
|
1207
|
+
str(path),
|
|
1208
|
+
)
|
|
1199
1209
|
try:
|
|
1200
1210
|
dir_fd = os.open(str(path.parent), os.O_RDONLY)
|
|
1201
1211
|
try:
|
|
@@ -3125,6 +3135,7 @@ def main(
|
|
|
3125
3135
|
raise typer.Exit()
|
|
3126
3136
|
|
|
3127
3137
|
_t0 = time.monotonic()
|
|
3138
|
+
_root_timing: dict[str, float] = {}
|
|
3128
3139
|
no_tree: bool = False # set True by --agent; --no-tree flag removed
|
|
3129
3140
|
|
|
3130
3141
|
# Validate new flag choices
|
|
@@ -3947,6 +3958,7 @@ def main(
|
|
|
3947
3958
|
if _advisory:
|
|
3948
3959
|
typer.echo(_advisory, err=True)
|
|
3949
3960
|
|
|
3961
|
+
_manifest_t0 = time.perf_counter()
|
|
3950
3962
|
_perf_detection = perf.start()
|
|
3951
3963
|
detector = ProjectDetector(build_default_detectors())
|
|
3952
3964
|
workspace_analysis = WorkspaceAnalyzer().analyze(target, manifests)
|
|
@@ -4007,6 +4019,7 @@ def main(
|
|
|
4007
4019
|
root_dependencies, root_summary = dependency_analyzer.analyze(target)
|
|
4008
4020
|
dependency_records.extend(root_dependencies)
|
|
4009
4021
|
dependency_summaries.append(root_summary)
|
|
4022
|
+
_root_timing["manifests_ms"] = round((time.perf_counter() - _manifest_t0) * 1000, 2)
|
|
4010
4023
|
module_graphs = []
|
|
4011
4024
|
if graph_analyzer is not None:
|
|
4012
4025
|
root_graph_tree = (
|
|
@@ -4652,6 +4665,13 @@ def main(
|
|
|
4652
4665
|
)
|
|
4653
4666
|
|
|
4654
4667
|
perf.stop("analysis", _perf_analysis)
|
|
4668
|
+
# Root timings are deliberately a small diagnostic envelope. They make cold
|
|
4669
|
+
# manifest cost visible even when the optional perf recorder is disabled.
|
|
4670
|
+
_root_timing.setdefault("context_ms", round((time.monotonic() - _t0) * 1000, 2))
|
|
4671
|
+
_root_timing.setdefault("parse_ms", 0.0)
|
|
4672
|
+
_root_timing.setdefault("cir_ms", 0.0)
|
|
4673
|
+
_root_timing.setdefault("ris_ms", 0.0)
|
|
4674
|
+
_root_timing.setdefault("snapshot_ms", 0.0)
|
|
4655
4675
|
# 4. Serialize
|
|
4656
4676
|
_progress.update("serializing output")
|
|
4657
4677
|
_perf_serialize = perf.start()
|
|
@@ -4697,8 +4717,16 @@ def main(
|
|
|
4697
4717
|
raw_dict = standard_view(sm, include_tree=tree and not no_tree)
|
|
4698
4718
|
if not no_redact:
|
|
4699
4719
|
raw_dict = redact_dict(raw_dict)
|
|
4720
|
+
data = raw_dict
|
|
4700
4721
|
content = _serialize_dict(raw_dict, format)
|
|
4701
4722
|
|
|
4723
|
+
if isinstance(data, dict):
|
|
4724
|
+
data.setdefault("_meta", {})["timing_ms"] = {
|
|
4725
|
+
**_root_timing,
|
|
4726
|
+
"total_ms": round((time.monotonic() - _t0) * 1000, 2),
|
|
4727
|
+
}
|
|
4728
|
+
content = _serialize_dict(data, format)
|
|
4729
|
+
|
|
4702
4730
|
perf.stop("serialize", _perf_serialize)
|
|
4703
4731
|
perf.flush_recorder()
|
|
4704
4732
|
|
|
@@ -9221,6 +9249,17 @@ def spring_audit_cmd(
|
|
|
9221
9249
|
elif format == "github-comment":
|
|
9222
9250
|
output = _render_spring_audit_github_comment(combined, min_severity)
|
|
9223
9251
|
else:
|
|
9252
|
+
_bounded_default = (
|
|
9253
|
+
not compact and output_path is None and format == "json" and not table
|
|
9254
|
+
)
|
|
9255
|
+
data = (
|
|
9256
|
+
combined.to_compact_dict()
|
|
9257
|
+
if compact or _bounded_default
|
|
9258
|
+
else combined.to_dict()
|
|
9259
|
+
)
|
|
9260
|
+
if _bounded_default:
|
|
9261
|
+
data.pop("mode", None)
|
|
9262
|
+
data["default_output"] = "bounded"
|
|
9224
9263
|
output = _serialize_dict(data, format)
|
|
9225
9264
|
|
|
9226
9265
|
# F-AV: our own readers ask for the count under either spelling — the break
|
|
@@ -9808,6 +9847,9 @@ def risk_cmd(
|
|
|
9808
9847
|
data, rule_filter=rule_filter, band_filter=band_filter, top_n=top_n
|
|
9809
9848
|
)
|
|
9810
9849
|
else:
|
|
9850
|
+
if output_path is None:
|
|
9851
|
+
from sourcecode.risk import compact_risk_output
|
|
9852
|
+
data = compact_risk_output(data)
|
|
9811
9853
|
output = _serialize_dict(data, format)
|
|
9812
9854
|
_emit_command_output(
|
|
9813
9855
|
output,
|
|
@@ -162,6 +162,15 @@ class DependencyAnalyzer:
|
|
|
162
162
|
*,
|
|
163
163
|
workspace: str | None = None,
|
|
164
164
|
) -> tuple[list[DependencyRecord], DependencySummary]:
|
|
165
|
+
from sourcecode import manifest_cache
|
|
166
|
+
|
|
167
|
+
cached = manifest_cache.load(root)
|
|
168
|
+
if cached is not None:
|
|
169
|
+
records, summary = cached
|
|
170
|
+
if workspace is not None:
|
|
171
|
+
records = [replace(record, workspace=workspace) for record in records]
|
|
172
|
+
summary = replace(summary, dependencies=records)
|
|
173
|
+
return records, summary
|
|
165
174
|
records: list[DependencyRecord] = []
|
|
166
175
|
limitations: list[str] = []
|
|
167
176
|
|
|
@@ -185,7 +194,12 @@ class DependencyAnalyzer:
|
|
|
185
194
|
replace(r, role=_infer_role(r.name, r.ecosystem, r.scope))
|
|
186
195
|
for r in deduped
|
|
187
196
|
]
|
|
188
|
-
|
|
197
|
+
summary = self._build_summary(deduped, limitations)
|
|
198
|
+
manifest_cache.save(root, deduped, summary)
|
|
199
|
+
if workspace is not None:
|
|
200
|
+
deduped = [replace(record, workspace=workspace) for record in deduped]
|
|
201
|
+
summary = replace(summary, dependencies=deduped)
|
|
202
|
+
return deduped, summary
|
|
189
203
|
|
|
190
204
|
def merge_summaries(self, summaries: Iterable[DependencySummary]) -> DependencySummary:
|
|
191
205
|
result = DependencySummary(requested=True)
|
|
@@ -23,7 +23,7 @@ from __future__ import annotations
|
|
|
23
23
|
import re
|
|
24
24
|
from dataclasses import dataclass, field
|
|
25
25
|
from pathlib import Path
|
|
26
|
-
from typing import Any, Optional
|
|
26
|
+
from typing import Any, Iterable, Optional
|
|
27
27
|
|
|
28
28
|
# Published Spring Boot property keys (DATA — never a predicate on a repo name).
|
|
29
29
|
_CONTEXT_PATH_KEYS: tuple[str, ...] = (
|
|
@@ -163,25 +163,31 @@ def _profile_of_document(flat: "dict[str, str]", file_profile: Optional[str]) ->
|
|
|
163
163
|
return file_profile
|
|
164
164
|
|
|
165
165
|
|
|
166
|
-
def _config_files(root: Path) -> "list[Path]":
|
|
166
|
+
def _config_files(root: Path, files: Optional[Iterable[Path]] = None) -> "list[Path]":
|
|
167
167
|
"""Spring config files under conventional resource directories.
|
|
168
168
|
|
|
169
169
|
Bounded and sorted for determinism; test resources are excluded because a
|
|
170
170
|
prefix declared for tests is not the deployed one.
|
|
171
171
|
"""
|
|
172
|
+
candidates = files if files is not None else root.rglob("application*.*")
|
|
172
173
|
found: list[Path] = []
|
|
173
|
-
for
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
174
|
+
for path in candidates:
|
|
175
|
+
path = Path(path)
|
|
176
|
+
name = path.name
|
|
177
|
+
if name not in _CONFIG_BASENAMES and not _PROFILE_FILE_RE.match(name):
|
|
178
|
+
continue
|
|
179
|
+
text = str(path).replace("\\", "/")
|
|
180
|
+
in_resources = "/src/main/resources/" in text
|
|
181
|
+
in_config = "/config/" in text
|
|
182
|
+
if not (in_resources or in_config) or "/src/test/" in text or "/target/" in text:
|
|
183
|
+
continue
|
|
184
|
+
found.append(path)
|
|
181
185
|
return sorted(set(found))[:60]
|
|
182
186
|
|
|
183
187
|
|
|
184
|
-
def detect_deployment_prefix(
|
|
188
|
+
def detect_deployment_prefix(
|
|
189
|
+
root: Path, *, files: Optional[Iterable[Path]] = None
|
|
190
|
+
) -> DeploymentPrefix:
|
|
185
191
|
"""Read the deployment prefix from the repo's Spring configuration.
|
|
186
192
|
|
|
187
193
|
Best effort and never raises: an unreadable or malformed config yields an
|
|
@@ -190,7 +196,7 @@ def detect_deployment_prefix(root: Path) -> DeploymentPrefix:
|
|
|
190
196
|
"""
|
|
191
197
|
result = DeploymentPrefix()
|
|
192
198
|
try:
|
|
193
|
-
candidates = _config_files(Path(root))
|
|
199
|
+
candidates = _config_files(Path(root), files)
|
|
194
200
|
except Exception:
|
|
195
201
|
return result
|
|
196
202
|
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"""Content-addressed cache for manifest dependency analysis."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
import hashlib
|
|
5
|
+
import json
|
|
6
|
+
import os
|
|
7
|
+
from dataclasses import asdict
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
|
|
10
|
+
from sourcecode.schema import DependencyRecord, DependencySummary
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def _base() -> Path:
|
|
14
|
+
configured = os.environ.get("SOURCECODE_CACHE_DIR", "")
|
|
15
|
+
return Path(configured) if configured else Path.home() / ".sourcecode" / "cache"
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def _key(root: Path) -> str:
|
|
19
|
+
digest = hashlib.sha256()
|
|
20
|
+
analyzer = Path(__file__).with_name("dependency_analyzer.py")
|
|
21
|
+
digest.update(analyzer.read_bytes())
|
|
22
|
+
names = {
|
|
23
|
+
"pom.xml", "build.gradle", "build.gradle.kts", "package.json",
|
|
24
|
+
"package-lock.json", "pyproject.toml", "Cargo.toml", "go.mod",
|
|
25
|
+
"composer.json", "Gemfile",
|
|
26
|
+
}
|
|
27
|
+
paths: set[Path] = set()
|
|
28
|
+
for name in names:
|
|
29
|
+
paths.update(root.rglob(name))
|
|
30
|
+
for path in sorted(paths):
|
|
31
|
+
if not path.is_file():
|
|
32
|
+
continue
|
|
33
|
+
try:
|
|
34
|
+
digest.update(path.relative_to(root).as_posix().encode())
|
|
35
|
+
digest.update(path.read_bytes())
|
|
36
|
+
except OSError:
|
|
37
|
+
continue
|
|
38
|
+
return digest.hexdigest()
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def load(root: Path) -> tuple[list[DependencyRecord], DependencySummary] | None:
|
|
42
|
+
try:
|
|
43
|
+
path = _base() / "manifest-cache-v1" / f"{_key(root)}.json"
|
|
44
|
+
data = json.loads(path.read_text(encoding="utf-8"))
|
|
45
|
+
records = [DependencyRecord(**row) for row in data["records"]]
|
|
46
|
+
summary = DependencySummary(**data["summary"])
|
|
47
|
+
summary.dependencies = records
|
|
48
|
+
return records, summary
|
|
49
|
+
except (OSError, ValueError, KeyError, TypeError):
|
|
50
|
+
return None
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def save(root: Path, records: list[DependencyRecord], summary: DependencySummary) -> None:
|
|
54
|
+
try:
|
|
55
|
+
path = _base() / "manifest-cache-v1" / f"{_key(root)}.json"
|
|
56
|
+
path.parent.mkdir(parents=True, exist_ok=True)
|
|
57
|
+
payload = {"records": [asdict(row) for row in records], "summary": asdict(summary)}
|
|
58
|
+
tmp = path.with_suffix(".tmp")
|
|
59
|
+
tmp.write_text(json.dumps(payload, sort_keys=True), encoding="utf-8")
|
|
60
|
+
tmp.replace(path)
|
|
61
|
+
except OSError:
|
|
62
|
+
return
|
|
@@ -2375,6 +2375,26 @@ class MigrationReport:
|
|
|
2375
2375
|
compact, "findings", top_n,
|
|
2376
2376
|
key=lambda f: SEVERITY_ORDER.get(f.get("severity"), 3),
|
|
2377
2377
|
)
|
|
2378
|
+
# Keep invariant rule prose once; each finding carries only location and
|
|
2379
|
+
# rule identity. Full prose remains available in the non-compact report.
|
|
2380
|
+
_rule_catalog: dict[str, dict] = {}
|
|
2381
|
+
_lean_findings: list[dict] = []
|
|
2382
|
+
for _finding in compact.get("findings", []):
|
|
2383
|
+
_rule_id = _finding.get("rule_id", "unknown")
|
|
2384
|
+
_rule_catalog.setdefault(_rule_id, {
|
|
2385
|
+
"title": _finding.get("title", ""),
|
|
2386
|
+
"explanation": _finding.get("explanation", ""),
|
|
2387
|
+
"fix_hint": _finding.get("fix_hint", ""),
|
|
2388
|
+
})
|
|
2389
|
+
_lean_findings.append({
|
|
2390
|
+
key: _finding[key]
|
|
2391
|
+
for key in (
|
|
2392
|
+
"id", "rule_id", "severity", "source_file", "first_line",
|
|
2393
|
+
"migration_target", "imports_found", "code_context",
|
|
2394
|
+
) if key in _finding
|
|
2395
|
+
})
|
|
2396
|
+
compact["rule_catalog"] = _rule_catalog
|
|
2397
|
+
compact["findings"] = _lean_findings
|
|
2378
2398
|
hib = full.get("hibernate")
|
|
2379
2399
|
if isinstance(hib, dict):
|
|
2380
2400
|
h = dict(hib)
|