sourcecode 5.5.1__tar.gz → 5.5.2__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.2}/CHANGELOG.md +20 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/PKG-INFO +3 -3
- {sourcecode-5.5.1 → sourcecode-5.5.2}/README.md +2 -2
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/USER_GUIDE.md +1 -1
- {sourcecode-5.5.1 → sourcecode-5.5.2}/pyproject.toml +1 -1
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/__init__.py +1 -1
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/cli.py +22 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/dependency_analyzer.py +15 -1
- sourcecode-5.5.2/src/sourcecode/manifest_cache.py +62 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/migrate_check.py +20 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/repository_ir.py +50 -2
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/risk.py +25 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/servlet_surface.py +10 -3
- {sourcecode-5.5.1 → sourcecode-5.5.2}/.github/workflows/build-windows.yml +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/.github/workflows/perf-gate.yml +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/.gitignore +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/.ruff.toml +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/CLAUDE.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/CONTRIBUTING.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/LICENSE +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/SECURITY.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/CACHE.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/COMMERCIAL-OFFER.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/CUSTOMER-VALIDATION.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/DEFECT-LEDGER.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/DEMO-5MIN.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/DEVELOPMENT-ROADMAP.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/EXECUTION-PLAN-12MO.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/EXECUTIVE-ROADMAP.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/MANUAL-USUARIO.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/MODERNIZATION.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/PRODUCT_AUDIT.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/PRODUCT_IDENTITY.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/PRODUCT_TIERS.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/RC1-CHECKLIST.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/RELEASE-CHECKLIST.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/CATALOG-retrieval-intents.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/DESIGN-knowledge-provider-integration.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/DESIGN-p5.3b-statement-surface.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/DESIGN-p5.5-span-index.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/DESIGN-p6-semantic-impact-engine.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/DESIGN-p6-semantic-integration-engine.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/DESIGN-p7-semantic-services.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/DESIGN-robustness-security-inference.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/DESIGN-semantic-retrieval.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/EPV-p6-class-typeref.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/REPORT-p6-flow-analyzer-comparison.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/REPORT-p6-integration-detector-comparison.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/REPORT-p8-flow-analyzer-migration.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/REPORT-p9-integration-detector-migration.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/adr/0001-semantic-ir.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/adr/0002-source-evidence-boundary.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/adr/0003-architectural-characterization.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/adr/0004-semantic-retrieval.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/adr/0005-evidence-reconciliation.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/adr/0006-performance-harness.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/adr/0007-composition-semantics.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/adr/0008-answer-coherence.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/consumer-disposition-inventory.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/overview.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/product-architecture-review.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/product-strategy-layering.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/semantic-ir-consumer-matrix.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/semantic-ir-roadmap.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/baseline-ci.yml +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/commercial-pipeline-audit.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/contracts-ci.yml +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/contracts.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/eval/2026-06-15-petclinic-rest-issue11-vets-pagination.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/eval/2026-06-15-petclinic-rest-issue147-validation.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/eval/2026-06-15-petclinic-rest-workflow.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/eval/2026-06-15-phase18-openapi-surface.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/eval/2026-06-15-phase20-validation-surface.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/eval/2026-06-16-broadleaf-checkout-impact-fieldtest.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/eval/2026-06-16-petclinic-rest-issue11-weakness2-closed.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/eval/2026-06-16-spring-petclinic-issue2333-dead-vets.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/licensing-schema.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/migrate-check.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/README.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/REGRESSION-GATE.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/SUMMARY.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/alfresco__ask__cold.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/alfresco__ask__warm.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/broadleaf__ask__cold.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/broadleaf__ask__warm.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/eureka__ask__cold.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/eureka__ask__warm.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/jenkins__ask__cold.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/jenkins__ask__warm.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/jobrunr__ask__cold.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/jobrunr__ask__warm.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/keycloak__ask__cold.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/keycloak__ask__warm.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/neo4j__ask__cold.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/neo4j__ask__warm.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/ofbiz__ask__cold.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/ofbiz__ask__warm.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/openmrs__ask__cold.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/openmrs__ask__warm.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/petclinic__ask__cold.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/petclinic__ask__warm.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/SUMMARY.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/alfresco__ask__cold.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/alfresco__ask__warm.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/broadleaf__ask__cold.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/broadleaf__ask__warm.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/eureka__ask__cold.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/eureka__ask__warm.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/jenkins__ask__cold.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/jenkins__ask__warm.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/jobrunr__ask__cold.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/jobrunr__ask__warm.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/keycloak__ask__cold.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/keycloak__ask__warm.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/neo4j__ask__cold.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/neo4j__ask__warm.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/ofbiz__ask__cold.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/ofbiz__ask__warm.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/openmrs__ask__cold.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/openmrs__ask__warm.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/petclinic__ask__cold.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/petclinic__ask__warm.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/gate-latest/README.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/gate-latest/broadleaf__ask__warm.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/gate-latest/broadleaf__endpoints__warm.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/gate-latest/broadleaf__migrate-check__warm.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/gate-latest/broadleaf__posture__warm.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/gate-latest/broadleaf__spring-audit__warm.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/gate-latest/broadleaf__validation__warm.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/perf/baselines/reference-best/README.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/posture.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/privacy.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/pro-experience-audit.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/schema.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/spec/envelope-v1.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/docs/spring-audit-ci.yml +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/raw +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/scripts/compare_integration_engines.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/scripts/customer_smoke_test.sh +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/scripts/generate_jdk_exports.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/scripts/perf_gate.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/scripts/perf_harness.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/scripts/sync_gate_anchors.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/adaptive_scanner.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/archetype.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/architectural_baseline.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/architectural_delta.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/architecture_analyzer.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/architecture_summary.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/ast_extractor.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/audit_report.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/baseline_autocapture.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/bundled_docs.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/cache.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/cache_model.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/call_surface.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/caller_metrics.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/caller_reach.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/canonical_ir.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/chain_rules.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/change_plan.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/cir_graphs.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/classifier.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/client_calls.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/code_notes_analyzer.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/compare.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/confidence_analyzer.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/constraint_diff.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/consumer_join.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/container_wiring.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/context_cache.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/context_graph.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/context_scorer.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/context_summarizer.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/contract_diff.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/contract_init.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/contract_model.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/contract_pipeline.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/coverage_parser.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/data_exposure.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/data_labels.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/declarations.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/defect_identity.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/degradation.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/deployment_prefix.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/detach.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/detectors/__init__.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/detectors/base.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/detectors/csproj_parser.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/detectors/dart.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/detectors/dotnet.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/detectors/elixir.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/detectors/go.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/detectors/heuristic.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/detectors/hybrid.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/detectors/java.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/detectors/jvm_ext.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/detectors/nodejs.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/detectors/parsers.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/detectors/php.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/detectors/project.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/detectors/python.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/detectors/ruby.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/detectors/rust.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/detectors/systems.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/detectors/terraform.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/detectors/tooling.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/doc_analyzer.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/dynamic_argument_surface.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/endpoint_literals.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/endpoint_metrics.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/entrypoint_classifier.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/env_analyzer.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/envelope.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/environment_resolution.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/error_schema.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/evidence_provider.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/execution_plan.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/explain.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/facts/__init__.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/facts/registry.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/file_chunker.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/file_classifier.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/filter_surface.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/format_contract.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/fqn_utils.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/gate_anchors.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/git_analyzer.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/git_checkout.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/graph_analyzer.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/graph_evidence.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/hibernate_strat.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/identity_fallback.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/integration_coordinates.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/jdk_exports.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/license.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/mcp/__init__.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/mcp/dependency_import.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/mcp/onboarding/__init__.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/mcp/onboarding/applier.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/mcp/onboarding/backup.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/mcp/onboarding/detector.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/mcp/onboarding/planner.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/mcp/orchestrator.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/mcp/registry.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/mcp/runner.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/mcp/server.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/mcp_nudge.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/metrics_analyzer.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/migration_blast.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/non_coverage.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/openapi_surface.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/openrewrite_recipe.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/output_budget.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/output_encoding.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/parallel.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/parse_cache.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/partial_contract.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/path_admission.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/path_filters.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/perf.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/phased_run.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/pipe_contract.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/posture.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/pr_comment_renderer.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/pr_impact.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/prepare_context.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/progress.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/provenance.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/ranking_engine.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/readiness_timeline.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/readonly.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/reconciliation.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/redactor.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/reference_facts.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/release_info.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/relevance_scorer.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/remedies.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/rename_refactor.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/repo_classifier.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/retrieval/__init__.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/retrieval/context.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/retrieval/errors.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/retrieval/executor.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/retrieval/planner.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/retrieval/query.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/retrieval/request.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/retrieval/resolution.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/retrieval/result.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/retrieval/retriever.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/retrieval/runtime.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/retrieval/steps.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/retrieval/steps_endpoint.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/retrieval/steps_graph.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/retrieval/steps_impact.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/retrieval/steps_intf.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/retrieval/steps_struct.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/retrieval/steps_txsec.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/ris.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/rule_catalog.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/rule_pass.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/runs.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/runtime_classifier.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/sarif.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/scanner.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/schema.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/schemas/envelope-v1.schema.json +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/security_chain.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/security_config.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/security_config_scan.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/security_posture.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/semantic_analyzer.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/semantic_impact_engine.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/semantic_integration_engine.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/semantic_services.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/serializer.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/source_text.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/spring_event_topology.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/spring_findings.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/spring_impact.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/spring_model.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/spring_profiles.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/spring_properties.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/spring_security_audit.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/spring_semantic.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/spring_tx_analyzer.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/sql_taint.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/summarizer.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/target_admission.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/telemetry/__init__.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/telemetry/config.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/telemetry/consent.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/telemetry/events.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/telemetry/filters.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/telemetry/transport.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/test_gap_ranking.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/test_sources.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/text_input.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/timeline.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/token_estimate.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/tree_utils.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/type_usage_surface.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/validation_inference.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/validation_surface.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/verify_edit.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/verify_repo.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/verify_rules.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/version_check.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/waivers.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/src/sourcecode/workspace.py +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/supabase/functions/README.md +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/supabase/functions/get-license/index.ts +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/supabase/functions/lemonsqueezy-webhook/index.ts +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/supabase/functions/telemetry/index.ts +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/supabase/sql/license_event_ordering.sql +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/supabase/sql/licensing_schema.sql +0 -0
- {sourcecode-5.5.1 → sourcecode-5.5.2}/supabase/sql/telemetry_events.sql +0 -0
|
@@ -2,6 +2,26 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## [5.5.2] — 2026-08-13
|
|
6
|
+
|
|
7
|
+
**Follow-up audit corrections and performance visibility.**
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
- `endpoints --include-tests` now admits test-suite `src/main` sources while
|
|
11
|
+
preserving the production default and its exclusion evidence.
|
|
12
|
+
- `impact` publishes caller provenance and a hub-excluded reach axis instead of
|
|
13
|
+
presenting service-locator expansion as an undifferentiated repository total.
|
|
14
|
+
- Servlet populations use one unique URL-pattern authority with reconciled
|
|
15
|
+
declaration counts.
|
|
16
|
+
- Manifest dependency analysis is content-addressed and root output publishes
|
|
17
|
+
timing layers, including manifest cost.
|
|
18
|
+
- `risk` stdout and `migrate-check --compact` deduplicate invariant rule prose;
|
|
19
|
+
full reports remain available through `-o`.
|
|
20
|
+
|
|
21
|
+
### Documentation
|
|
22
|
+
- Consolidated the two follow-up audits in the roadmap without duplicating the
|
|
23
|
+
already resolved 5.5.0 defect entries.
|
|
24
|
+
|
|
5
25
|
## [5.5.1] — 2026-08-13
|
|
6
26
|
|
|
7
27
|
**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.2
|
|
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.2 — 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.2 — and, on a build that has aged,
|
|
92
92
|
# how many releases have probably shipped since
|
|
93
93
|
```
|
|
94
94
|
|
|
@@ -3125,6 +3125,7 @@ def main(
|
|
|
3125
3125
|
raise typer.Exit()
|
|
3126
3126
|
|
|
3127
3127
|
_t0 = time.monotonic()
|
|
3128
|
+
_root_timing: dict[str, float] = {}
|
|
3128
3129
|
no_tree: bool = False # set True by --agent; --no-tree flag removed
|
|
3129
3130
|
|
|
3130
3131
|
# Validate new flag choices
|
|
@@ -3947,6 +3948,7 @@ def main(
|
|
|
3947
3948
|
if _advisory:
|
|
3948
3949
|
typer.echo(_advisory, err=True)
|
|
3949
3950
|
|
|
3951
|
+
_manifest_t0 = time.perf_counter()
|
|
3950
3952
|
_perf_detection = perf.start()
|
|
3951
3953
|
detector = ProjectDetector(build_default_detectors())
|
|
3952
3954
|
workspace_analysis = WorkspaceAnalyzer().analyze(target, manifests)
|
|
@@ -4007,6 +4009,7 @@ def main(
|
|
|
4007
4009
|
root_dependencies, root_summary = dependency_analyzer.analyze(target)
|
|
4008
4010
|
dependency_records.extend(root_dependencies)
|
|
4009
4011
|
dependency_summaries.append(root_summary)
|
|
4012
|
+
_root_timing["manifests_ms"] = round((time.perf_counter() - _manifest_t0) * 1000, 2)
|
|
4010
4013
|
module_graphs = []
|
|
4011
4014
|
if graph_analyzer is not None:
|
|
4012
4015
|
root_graph_tree = (
|
|
@@ -4652,6 +4655,13 @@ def main(
|
|
|
4652
4655
|
)
|
|
4653
4656
|
|
|
4654
4657
|
perf.stop("analysis", _perf_analysis)
|
|
4658
|
+
# Root timings are deliberately a small diagnostic envelope. They make cold
|
|
4659
|
+
# manifest cost visible even when the optional perf recorder is disabled.
|
|
4660
|
+
_root_timing.setdefault("context_ms", round((time.monotonic() - _t0) * 1000, 2))
|
|
4661
|
+
_root_timing.setdefault("parse_ms", 0.0)
|
|
4662
|
+
_root_timing.setdefault("cir_ms", 0.0)
|
|
4663
|
+
_root_timing.setdefault("ris_ms", 0.0)
|
|
4664
|
+
_root_timing.setdefault("snapshot_ms", 0.0)
|
|
4655
4665
|
# 4. Serialize
|
|
4656
4666
|
_progress.update("serializing output")
|
|
4657
4667
|
_perf_serialize = perf.start()
|
|
@@ -4697,8 +4707,16 @@ def main(
|
|
|
4697
4707
|
raw_dict = standard_view(sm, include_tree=tree and not no_tree)
|
|
4698
4708
|
if not no_redact:
|
|
4699
4709
|
raw_dict = redact_dict(raw_dict)
|
|
4710
|
+
data = raw_dict
|
|
4700
4711
|
content = _serialize_dict(raw_dict, format)
|
|
4701
4712
|
|
|
4713
|
+
if isinstance(data, dict):
|
|
4714
|
+
data.setdefault("_meta", {})["timing_ms"] = {
|
|
4715
|
+
**_root_timing,
|
|
4716
|
+
"total_ms": round((time.monotonic() - _t0) * 1000, 2),
|
|
4717
|
+
}
|
|
4718
|
+
content = _serialize_dict(data, format)
|
|
4719
|
+
|
|
4702
4720
|
perf.stop("serialize", _perf_serialize)
|
|
4703
4721
|
perf.flush_recorder()
|
|
4704
4722
|
|
|
@@ -9221,6 +9239,7 @@ def spring_audit_cmd(
|
|
|
9221
9239
|
elif format == "github-comment":
|
|
9222
9240
|
output = _render_spring_audit_github_comment(combined, min_severity)
|
|
9223
9241
|
else:
|
|
9242
|
+
data = combined.to_compact_dict() if compact else combined.to_dict()
|
|
9224
9243
|
output = _serialize_dict(data, format)
|
|
9225
9244
|
|
|
9226
9245
|
# F-AV: our own readers ask for the count under either spelling — the break
|
|
@@ -9808,6 +9827,9 @@ def risk_cmd(
|
|
|
9808
9827
|
data, rule_filter=rule_filter, band_filter=band_filter, top_n=top_n
|
|
9809
9828
|
)
|
|
9810
9829
|
else:
|
|
9830
|
+
if output_path is None:
|
|
9831
|
+
from sourcecode.risk import compact_risk_output
|
|
9832
|
+
data = compact_risk_output(data)
|
|
9811
9833
|
output = _serialize_dict(data, format)
|
|
9812
9834
|
_emit_command_output(
|
|
9813
9835
|
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)
|
|
@@ -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)
|
|
@@ -6411,7 +6411,7 @@ def extract_java_endpoints(
|
|
|
6411
6411
|
|
|
6412
6412
|
java_files = sorted(
|
|
6413
6413
|
p for p in root.rglob("*.java")
|
|
6414
|
-
if not is_test_source_file(_rel(p))
|
|
6414
|
+
if (include_tests or not is_test_source_file(_rel(p)))
|
|
6415
6415
|
and "target/" not in str(p).replace("\\", "/")
|
|
6416
6416
|
and not any(f in str(p).replace("\\", "/") for f in _CLIENT_PATH_FRAGMENTS)
|
|
6417
6417
|
)
|
|
@@ -7419,16 +7419,22 @@ def compute_blast_radius(
|
|
|
7419
7419
|
|
|
7420
7420
|
# BFS for indirect callers
|
|
7421
7421
|
indirect_callers: list[str] = []
|
|
7422
|
+
_indirect_parent: dict[str, str] = {}
|
|
7423
|
+
_hub_frontier_nodes: set[str] = set()
|
|
7422
7424
|
visited: set[str] = set(matched_fqns) | set(direct_callers)
|
|
7423
7425
|
|
|
7424
7426
|
while queue:
|
|
7425
7427
|
node, depth = queue.pop(0)
|
|
7426
7428
|
if depth >= _effective_depth:
|
|
7427
7429
|
continue
|
|
7428
|
-
|
|
7430
|
+
_node_callers = _walk_callers(node)
|
|
7431
|
+
if len(_node_callers) > _HUB_CALLER_THRESHOLD:
|
|
7432
|
+
_hub_frontier_nodes.add(node)
|
|
7433
|
+
for caller in _node_callers:
|
|
7429
7434
|
if caller not in visited:
|
|
7430
7435
|
visited.add(caller)
|
|
7431
7436
|
all_affected[caller] = depth + 1
|
|
7437
|
+
_indirect_parent[caller] = node
|
|
7432
7438
|
indirect_callers.append(caller)
|
|
7433
7439
|
queue.append((caller, depth + 1))
|
|
7434
7440
|
|
|
@@ -7658,6 +7664,29 @@ def compute_blast_radius(
|
|
|
7658
7664
|
n_direct_classes = len(_direct_caller_classes)
|
|
7659
7665
|
n_direct = n_direct_symbols
|
|
7660
7666
|
n_indirect = len(indirect_callers)
|
|
7667
|
+
|
|
7668
|
+
# The complete reverse walk is useful as a measured upper reach, but a
|
|
7669
|
+
# service-locator hub can make it collapse to "the whole repository". Publish
|
|
7670
|
+
# a second, conservative axis that stops at hub frontiers instead of forcing
|
|
7671
|
+
# consumers to guess from a flat list of symbols.
|
|
7672
|
+
_without_hubs: list[str] = []
|
|
7673
|
+
_without_hubs_seen = set(matched_fqns) | set(direct_callers)
|
|
7674
|
+
_without_hubs_queue: list[tuple[str, int]] = [
|
|
7675
|
+
(c, 1) for c in direct_callers
|
|
7676
|
+
]
|
|
7677
|
+
while _without_hubs_queue:
|
|
7678
|
+
_node, _depth = _without_hubs_queue.pop(0)
|
|
7679
|
+
if _depth >= _effective_depth:
|
|
7680
|
+
continue
|
|
7681
|
+
_next = _walk_callers(_node)
|
|
7682
|
+
if len(_next) > _HUB_CALLER_THRESHOLD:
|
|
7683
|
+
continue
|
|
7684
|
+
for _caller in _next:
|
|
7685
|
+
if _caller not in _without_hubs_seen:
|
|
7686
|
+
_without_hubs_seen.add(_caller)
|
|
7687
|
+
_without_hubs.append(_caller)
|
|
7688
|
+
_without_hubs_queue.append((_caller, _depth + 1))
|
|
7689
|
+
|
|
7661
7690
|
n_ep = len(endpoints_affected)
|
|
7662
7691
|
n_txn = len(txn_nodes)
|
|
7663
7692
|
n_mappers = len(mappers_affected)
|
|
@@ -7824,6 +7853,20 @@ def compute_blast_radius(
|
|
|
7824
7853
|
_indirect_summary = (
|
|
7825
7854
|
_indirect_ordered if _indirect_cap is None else _indirect_ordered[:_indirect_cap]
|
|
7826
7855
|
)
|
|
7856
|
+
def _via_hub(_node: str) -> bool:
|
|
7857
|
+
_seen_path: set[str] = set()
|
|
7858
|
+
_cursor = _node
|
|
7859
|
+
while _cursor in _indirect_parent and _cursor not in _seen_path:
|
|
7860
|
+
_seen_path.add(_cursor)
|
|
7861
|
+
_cursor = _indirect_parent[_cursor]
|
|
7862
|
+
if _cursor in _hub_frontier_nodes:
|
|
7863
|
+
return True
|
|
7864
|
+
return False
|
|
7865
|
+
|
|
7866
|
+
_indirect_details = [
|
|
7867
|
+
{"fqn": _node, "depth": all_affected.get(_node), "via_hub": _via_hub(_node)}
|
|
7868
|
+
for _node in _indirect_summary
|
|
7869
|
+
]
|
|
7827
7870
|
|
|
7828
7871
|
out: dict = {
|
|
7829
7872
|
"target": target,
|
|
@@ -7870,6 +7913,7 @@ def compute_blast_radius(
|
|
|
7870
7913
|
else _direct_caller_symbols[:_direct_cap]
|
|
7871
7914
|
),
|
|
7872
7915
|
"indirect_callers": _indirect_summary,
|
|
7916
|
+
"indirect_caller_details": _indirect_details,
|
|
7873
7917
|
"container_wired": [w.to_dict() for w in _container_wired],
|
|
7874
7918
|
"endpoints_affected": endpoints_affected,
|
|
7875
7919
|
"mappers_affected": mappers_affected,
|
|
@@ -7889,6 +7933,10 @@ def compute_blast_radius(
|
|
|
7889
7933
|
"indirect_caller_count": n_indirect,
|
|
7890
7934
|
"indirect_callers_computed": not _bfs_truncated or _indirect_sampled,
|
|
7891
7935
|
"indirect_callers_sampled": _indirect_sampled,
|
|
7936
|
+
"indirect_caller_count_unit": "reference symbols (methods or classes)",
|
|
7937
|
+
"indirect_callers_without_hubs_count": len(_without_hubs),
|
|
7938
|
+
"indirect_callers_without_hubs_unit": "reference symbols (hub frontiers excluded)",
|
|
7939
|
+
"hub_frontier_count": len(_hub_frontier_nodes),
|
|
7892
7940
|
"endpoints_affected_count": n_ep,
|
|
7893
7941
|
# C1-37: four figures called "endpoints" at one commit (3 364 /
|
|
7894
7942
|
# 3 382 / 3 382 / 3 574). Each one now says which population it
|
|
@@ -47,6 +47,31 @@ if TYPE_CHECKING:
|
|
|
47
47
|
|
|
48
48
|
RISK_SCHEMA = "risk-v1"
|
|
49
49
|
|
|
50
|
+
|
|
51
|
+
def compact_risk_output(data: dict) -> dict:
|
|
52
|
+
"""Project stdout to stable rule prose plus small per-defect evidence."""
|
|
53
|
+
compact = dict(data)
|
|
54
|
+
rows = data.get("risks") or []
|
|
55
|
+
rules: dict[str, dict] = {}
|
|
56
|
+
lean: list[dict] = []
|
|
57
|
+
for row in rows:
|
|
58
|
+
rule_ids = row.get("rule_ids") or [row.get("rule_id", "unknown")]
|
|
59
|
+
for rule_id in rule_ids:
|
|
60
|
+
rules.setdefault(rule_id, {
|
|
61
|
+
"title": row.get("title", ""),
|
|
62
|
+
"statement": row.get("statement", ""),
|
|
63
|
+
})
|
|
64
|
+
lean.append({
|
|
65
|
+
key: row[key] for key in (
|
|
66
|
+
"defect_id", "symbol", "source_file", "first_line", "band",
|
|
67
|
+
"score", "rule_ids", "factors",
|
|
68
|
+
) if key in row
|
|
69
|
+
})
|
|
70
|
+
compact["rules"] = rules
|
|
71
|
+
compact["risks"] = lean
|
|
72
|
+
compact["default_output"] = "bounded"
|
|
73
|
+
return compact
|
|
74
|
+
|
|
50
75
|
#: The composition, in one place. The payload publishes it, `--help` renders it and
|
|
51
76
|
#: the battery holds both to it: a hand-copied model line in the help screen went on
|
|
52
77
|
#: advertising four factors for as long as it took someone to read it, which is the
|
|
@@ -168,9 +168,16 @@ def build_servlet_surface(root: Path, *, limit: Optional[int] = None) -> dict:
|
|
|
168
168
|
elif path.suffix == ".java":
|
|
169
169
|
mappings.extend(_from_registration_beans(path, relative))
|
|
170
170
|
|
|
171
|
-
#
|
|
172
|
-
#
|
|
173
|
-
|
|
171
|
+
# A URL pattern is the observable HTTP surface. Multiple descriptors can
|
|
172
|
+
# repeat it, but publishing every duplicate made `declarations` disagree with
|
|
173
|
+
# the pattern census and with endpoint-side reconciliation. Keep the first
|
|
174
|
+
# deterministic declaration as provenance and expose one row per reachable
|
|
175
|
+
# pattern.
|
|
176
|
+
_unique: dict[str, ServletMapping] = {}
|
|
177
|
+
for mapping in sorted(mappings, key=lambda m: (m.url_pattern, m.source_file, m.source)):
|
|
178
|
+
_unique.setdefault(mapping.url_pattern, mapping)
|
|
179
|
+
mappings = list(_unique.values())
|
|
180
|
+
patterns = sorted(_unique)
|
|
174
181
|
by_source: "dict[str, int]" = {}
|
|
175
182
|
for mapping in mappings:
|
|
176
183
|
by_source[mapping.source] = by_source.get(mapping.source, 0) + 1
|
|
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.5.1 → sourcecode-5.5.2}/docs/architecture/DESIGN-knowledge-provider-integration.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/DESIGN-p6-semantic-integration-engine.md
RENAMED
|
File without changes
|
|
File without changes
|
{sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/DESIGN-robustness-security-inference.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/REPORT-p6-flow-analyzer-comparison.md
RENAMED
|
File without changes
|
{sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/REPORT-p6-integration-detector-comparison.md
RENAMED
|
File without changes
|
{sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/REPORT-p8-flow-analyzer-migration.md
RENAMED
|
File without changes
|
{sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/REPORT-p9-integration-detector-migration.md
RENAMED
|
File without changes
|
|
File without changes
|
{sourcecode-5.5.1 → sourcecode-5.5.2}/docs/architecture/adr/0002-source-evidence-boundary.md
RENAMED
|
File without changes
|
{sourcecode-5.5.1 → sourcecode-5.5.2}/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.5.1 → sourcecode-5.5.2}/docs/eval/2026-06-15-petclinic-rest-issue11-vets-pagination.md
RENAMED
|
File without changes
|
{sourcecode-5.5.1 → sourcecode-5.5.2}/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.5.1 → sourcecode-5.5.2}/docs/eval/2026-06-16-broadleaf-checkout-impact-fieldtest.md
RENAMED
|
File without changes
|
|
File without changes
|
{sourcecode-5.5.1 → sourcecode-5.5.2}/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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|