sourcecode 1.30.13__tar.gz → 1.30.14__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-1.30.14/.continue-here.md +231 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/PKG-INFO +3 -3
- {sourcecode-1.30.13 → sourcecode-1.30.14}/README.md +2 -2
- {sourcecode-1.30.13 → sourcecode-1.30.14}/pyproject.toml +1 -1
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/__init__.py +1 -1
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/flow_analyzer.py +11 -11
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/prepare_context.py +53 -60
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/repository_ir.py +498 -24
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_repository_ir.py +623 -12
- sourcecode-1.30.13/.continue-here.md +0 -166
- {sourcecode-1.30.13 → sourcecode-1.30.14}/.agents/skills/source-command-gsd-join-discord/SKILL.md +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/.agents/skills/source-command-gsd-review-backlog/SKILL.md +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/.agents/skills/source-command-gsd-workstreams/SKILL.md +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/.github/workflows/build-windows.yml +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/.gitignore +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/.ruff.toml +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/CONTRIBUTING.md +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/LICENSE +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/SECURITY.md +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/docs/privacy.md +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/docs/schema.md +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/raw +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/run_cli.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/adaptive_scanner.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/architecture_analyzer.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/architecture_summary.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/ast_extractor.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/classifier.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/cli.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/code_notes_analyzer.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/confidence_analyzer.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/context_scorer.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/context_summarizer.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/contract_model.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/contract_pipeline.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/coverage_parser.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/dependency_analyzer.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/detectors/__init__.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/detectors/base.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/detectors/csproj_parser.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/detectors/dart.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/detectors/dotnet.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/detectors/elixir.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/detectors/go.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/detectors/heuristic.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/detectors/hybrid.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/detectors/java.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/detectors/jvm_ext.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/detectors/nodejs.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/detectors/parsers.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/detectors/php.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/detectors/project.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/detectors/python.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/detectors/ruby.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/detectors/rust.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/detectors/systems.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/detectors/terraform.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/detectors/tooling.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/doc_analyzer.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/entrypoint_classifier.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/env_analyzer.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/file_classifier.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/git_analyzer.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/graph_analyzer.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/metrics_analyzer.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/progress.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/ranking_engine.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/redactor.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/relevance_scorer.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/repo_classifier.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/runtime_classifier.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/scanner.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/schema.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/semantic_analyzer.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/serializer.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/summarizer.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/telemetry/__init__.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/telemetry/config.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/telemetry/consent.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/telemetry/events.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/telemetry/filters.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/telemetry/transport.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/tree_utils.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/workspace.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/__init__.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/conftest.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/coverage.xml +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/fastapi_app/pyproject.toml +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/fastapi_app/src/main.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/go_service/cmd/api/main.go +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/go_service/go.mod +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/jacoco.xml +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/latin1_sample.java +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/latin1_sample_iso.java +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/lcov.info +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/nextjs_app/app/page.tsx +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/nextjs_app/package.json +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/nextjs_app/pnpm-lock.yaml +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/pnpm_monorepo/apps/web/app/page.tsx +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/pnpm_monorepo/apps/web/package.json +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/pnpm_monorepo/packages/api/main.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/pnpm_monorepo/packages/api/pyproject.toml +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/pnpm_monorepo/pnpm-workspace.yaml +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/spring_boot_minimal/pom.xml +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/ausente/application/service/FindAusenteService.java +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/ausente/domain/entities/Ausente.java +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/ausente/infrastructure/rest/AusenteRestController.java +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/autocoberturas/application/service/FindAutocoberturasService.java +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/autocoberturas/domain/entities/Autocoberturas.java +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/autocoberturas/infrastructure/rest/AutocoberturasRestController.java +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/calendarioTrabajador/application/service/FindCalendarioTrabajadorService.java +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/calendarioTrabajador/domain/entities/CalendarioTrabajador.java +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/calendarioTrabajador/infrastructure/rest/CalendarioTrabajadorRestController.java +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/departamento/application/service/FindDepartamentoService.java +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/departamento/domain/entities/Departamento.java +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/departamento/infrastructure/rest/DepartamentoRestController.java +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/empleado/application/service/FindEmpleadoService.java +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/empleado/domain/entities/Empleado.java +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/empleado/infrastructure/rest/EmpleadoRestController.java +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/DemoApplication.java +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/config/FilterConfig.java +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/domain/Health.java +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/mapper/HealthMapper.java +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/repository/HealthRepository.java +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/service/HealthService.java +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/web/HealthRestController.java +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/web/NominaRestController.java +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/spring_boot_minimal/src/main/resources/application-dev.yml +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/spring_boot_minimal/src/main/resources/application.yml +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/spring_boot_minimal/src/main/resources/mapper/HealthMapper.xml +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_architecture_analyzer.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_architecture_summary.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_ast_extractor.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_block1_reliability.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_block2_coverage.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_block5_quality.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_bug_fixes_v16.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_classifier.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_cli.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_code_notes_analyzer.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_context_scorer.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_contract_pipeline.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_coverage_parser.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_cross_consistency.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_dependency_analyzer_node_python.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_dependency_analyzer_polyglot.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_dependency_schema.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_detector_dotnet.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_detector_go_rust_java.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_detector_nodejs.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_detector_php_ruby_dart.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_detector_python.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_detector_universal_managed.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_detector_universal_systems.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_detectors_base.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_doc_analyzer_jsdom.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_doc_analyzer_python.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_encoding_regression.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_graph_analyzer_polyglot.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_graph_analyzer_python_node.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_graph_schema.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_hybrid_inference.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_integration.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_integration_dependencies.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_integration_detection.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_integration_docs.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_integration_graph_modules.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_integration_lqn.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_integration_metrics.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_integration_multistack.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_integration_semantics.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_integration_universal.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_java_spring_integration.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_metrics_analyzer.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_packaging.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_phase1_improvements.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_pipeline_integrity.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_real_projects.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_redactor.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_scanner.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_schema.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_schema_normalization.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_semantic_analyzer_node.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_semantic_analyzer_python.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_semantic_import_resolution.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_semantic_schema.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_signal_hierarchy.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_summarizer.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_surface_honesty.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_task_differentiation.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_telemetry.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_v1_10_regressions.py +0 -0
- {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_workspace_analyzer.py +0 -0
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
# Continue Here — atlas-cli sesión 14
|
|
2
|
+
|
|
3
|
+
**Paused:** 2026-05-17 (sesión 14)
|
|
4
|
+
**Repo:** `/Users/user/Downloads/atlas-cli`
|
|
5
|
+
**Branch:** master
|
|
6
|
+
**Working tree:** 4 ficheros modificados, SIN commit (trabajo listo para commit)
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Trabajo de esta sesión (NO commiteado)
|
|
11
|
+
|
|
12
|
+
Esta sesión completó 3 tareas sobre `repository_ir.py`. Todo el trabajo incluye la sesión 13 (stable IDs) + sesión 14 (route diffing + reverse graph). Hacer UN solo commit con todo.
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
### Tarea 1 (sesión 13): Rearchitecture Directive — eliminar lenguaje especulativo
|
|
17
|
+
|
|
18
|
+
**Ficheros:** `src/sourcecode/prepare_context.py`, `src/sourcecode/flow_analyzer.py`
|
|
19
|
+
|
|
20
|
+
| Eliminado | Reemplazado con |
|
|
21
|
+
|---|---|
|
|
22
|
+
| `_ARTIFACT_CHANGE_EFFECT` con "may affect/inferred from role" | Labels estructurales: `"HTTP routing layer (request-to-handler mapping)"` |
|
|
23
|
+
| `"type": "inferred"` en `_role_obj` | `{basis, has_annotation_signal, has_symbol_signal}` |
|
|
24
|
+
| `"confidence": _f_conf` en runtime change entries | `"evidence_completeness"` del impact dict |
|
|
25
|
+
| `_score_to_confidence()` function | Deleted completely |
|
|
26
|
+
| `"confidence": score_band` en `impact_score_per_file` | `"evidence": {has_reverse_edges, has_route_diff, has_security_diff, has_wiring_evidence}` |
|
|
27
|
+
| `behavioral_changes` sin graph evidence | Gateado en `has_graph_evidence == True` |
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
### Tarea 2 (sesión 13): Stable Symbol Identities
|
|
32
|
+
|
|
33
|
+
**Ficheros:** `src/sourcecode/repository_ir.py`, `tests/test_repository_ir.py`
|
|
34
|
+
|
|
35
|
+
**Nuevas funciones helper:**
|
|
36
|
+
- `_normalize_type_name(raw)` — strip annotations/modifiers/param names → solo tipo
|
|
37
|
+
- `_parse_param_types(params_str)` — `"Long id, String name"` → `["Long", "String"]` (depth-aware, maneja generics)
|
|
38
|
+
- `_compute_stable_id(package, class_simple, kind, name, param_types, return_type)` — ID determinista
|
|
39
|
+
|
|
40
|
+
**`SymbolRecord`** — 8 nuevos campos: `stable_id`, `symbol_kind`, `canonical_name`, `source_file`, `signature`, `param_types`, `return_type`, `annotation_values`
|
|
41
|
+
|
|
42
|
+
**`symbol_kind` values:** `enum`, `annotation`, `endpoint`, `bean`, `constructor` (además de `class`, `interface`, `method`, `field`)
|
|
43
|
+
|
|
44
|
+
**Formato stable_id:**
|
|
45
|
+
```
|
|
46
|
+
{package}:{class_simple}:{kind}:{name}[:{(param_types)}[:{return_type}]]
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
### Tarea 3 (sesión 14): Spring Route-Surface Diffing
|
|
52
|
+
|
|
53
|
+
**Ficheros:** `src/sourcecode/repository_ir.py`, `tests/test_repository_ir.py`
|
|
54
|
+
|
|
55
|
+
**Qué se implementó:**
|
|
56
|
+
|
|
57
|
+
| Componente | Cambio |
|
|
58
|
+
|---|---|
|
|
59
|
+
| `_ANN_WITH_ARGS_RE` | Captura args de anotaciones (`@GetMapping("/path")`) |
|
|
60
|
+
| `SymbolRecord.annotation_values` | `dict[str, str]` — ann_name → raw args string |
|
|
61
|
+
| `_HTTP_METHOD_MAP` | `@GetMapping → GET` etc. |
|
|
62
|
+
| `_parse_route_path/http_method/extras` | Extraen path, method, produces/consumes |
|
|
63
|
+
| `_is_route_symbol / _route_annotation_name / _enclosing_class` | Helpers de routes |
|
|
64
|
+
| `_symbol_fingerprint` | Incluye valores de route annotations — cambio de path → fingerprint cambia |
|
|
65
|
+
| `_diff_symbols` | Detecta `route_surface_change` antes de `annotation_change` genérico |
|
|
66
|
+
| `_DIFF_INTENSITY_MAP` | `route_surface_change: 1.0` |
|
|
67
|
+
| `_diff_routes` | Diff estructurado: old/new path, HTTP method, produces/consumes, evidence dict |
|
|
68
|
+
| `_assemble` | Emite `route_surface: [...]` |
|
|
69
|
+
|
|
70
|
+
**Output cuando route cambia:**
|
|
71
|
+
```json
|
|
72
|
+
{
|
|
73
|
+
"route_surface": [{
|
|
74
|
+
"symbol": "com.example.HealthController#health",
|
|
75
|
+
"controller": "com.example.HealthController",
|
|
76
|
+
"route_surface_changed": true,
|
|
77
|
+
"old_route": "/health",
|
|
78
|
+
"new_route": "/health/v3",
|
|
79
|
+
"stable_id": "com.example:HealthController:endpoint:health:():String",
|
|
80
|
+
"evidence": {
|
|
81
|
+
"annotation_value_changed": true,
|
|
82
|
+
"mapping_annotation": "RequestMapping",
|
|
83
|
+
"old_value": "/health",
|
|
84
|
+
"new_value": "/health/v3"
|
|
85
|
+
}
|
|
86
|
+
}]
|
|
87
|
+
}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
### Tarea 4 (sesión 14): Reverse Impact Graph
|
|
93
|
+
|
|
94
|
+
**Ficheros:** `src/sourcecode/repository_ir.py`, `tests/test_repository_ir.py`
|
|
95
|
+
|
|
96
|
+
**Problema raíz resuelto:** `_propagate_impact` traversaba grafo hacia ADELANTE (si A cambia → impacta B que A usa). Incorrecto. Impact analysis necesita grafo INVERSO (si A cambia → impacta quién DEPENDE de A).
|
|
97
|
+
|
|
98
|
+
**Qué se implementó:**
|
|
99
|
+
|
|
100
|
+
| Componente | Cambio |
|
|
101
|
+
|---|---|
|
|
102
|
+
| `contained_in` edges | `_build_relations` emite `method/field → enclosing class` |
|
|
103
|
+
| `_build_reverse_adjacency` | Invierte todas las relaciones (excluye `annotated_with`, `mapped_to`) |
|
|
104
|
+
| `_EDGE_REASON_TEMPLATES` + `_edge_reason` | Edge → string legible |
|
|
105
|
+
| `_bfs_impact_with_paths` | Reemplaza `_propagate_impact`. BFS en grafo inverso con path tracking |
|
|
106
|
+
| `enclosing_seeds` param | Omite `contained_in` edges al sembrar desde clase enclosing para no incluir métodos hermanos |
|
|
107
|
+
| `reverse_graph` en output | `{target_fqn: {edge_type: [from_fqn, ...]}}` — índice para agentes |
|
|
108
|
+
|
|
109
|
+
**Cadena de propagación funcional:**
|
|
110
|
+
```
|
|
111
|
+
UserRepository#findById cambia →
|
|
112
|
+
[1] UserService ← "UserService depends on UserRepository (import)"
|
|
113
|
+
[2] UserService#getUser ← "... is a member of UserService"
|
|
114
|
+
[2] OrderController ← "OrderController depends on UserService (import)"
|
|
115
|
+
[3] OrderController#getUser ← "... is a member of OrderController"
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
`UserRepository#save` (hermano, sin cambios) correctamente excluido.
|
|
119
|
+
|
|
120
|
+
**Cada entidad impactada expone:**
|
|
121
|
+
```json
|
|
122
|
+
{
|
|
123
|
+
"entity": "com.example.web.OrderController",
|
|
124
|
+
"depth": 2,
|
|
125
|
+
"impact_score": 0.0113,
|
|
126
|
+
"via": "com.example.service.UserService",
|
|
127
|
+
"graph_path": ["com.example.repo.UserRepository", "com.example.service.UserService", "com.example.web.OrderController"],
|
|
128
|
+
"included_because": [
|
|
129
|
+
"com.example.service.UserService depends on com.example.repo.UserRepository (import)",
|
|
130
|
+
"com.example.web.OrderController depends on com.example.service.UserService (import)"
|
|
131
|
+
]
|
|
132
|
+
}
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## Estado de tests
|
|
138
|
+
|
|
139
|
+
```
|
|
140
|
+
920 passed, 3 skipped (era 885 antes de sesión 13)
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
Pre-existing failures (no tocar):
|
|
144
|
+
- `tests/test_block2_coverage.py` — bug `DocRecord` en `doc_analyzer.py`
|
|
145
|
+
- `tests/test_dependency_analyzer_node_python.py::test_python_requirements_without_lockfile_keeps_declared_versions`
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## Cambios sin commitear
|
|
150
|
+
|
|
151
|
+
```
|
|
152
|
+
src/sourcecode/flow_analyzer.py | 22 +-
|
|
153
|
+
src/sourcecode/prepare_context.py | 113 ++++---
|
|
154
|
+
src/sourcecode/repository_ir.py | 522 +++++++++++++++++++++++++++++--
|
|
155
|
+
tests/test_repository_ir.py | 635 +++++++++++++++++++++++++++++++++++++-
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
**Para commitear TODO (primera acción al retomar):**
|
|
159
|
+
```bash
|
|
160
|
+
cd /Users/user/Downloads/atlas-cli
|
|
161
|
+
git add src/sourcecode/flow_analyzer.py \
|
|
162
|
+
src/sourcecode/prepare_context.py \
|
|
163
|
+
src/sourcecode/repository_ir.py \
|
|
164
|
+
tests/test_repository_ir.py
|
|
165
|
+
|
|
166
|
+
git commit -m "feat: stable IDs + route-surface diffing + reverse impact graph
|
|
167
|
+
|
|
168
|
+
- Stable deterministic IDs for all symbol kinds (class/interface/enum/
|
|
169
|
+
method/constructor/field/endpoint/bean) — survives formatting/body changes
|
|
170
|
+
- symbol_kind, canonical_name, signature, annotation_values on all graph nodes
|
|
171
|
+
- Replace heuristic confidence scoring with evidence completeness dicts
|
|
172
|
+
- Remove speculative behavioral prose (may affect / inferred from role)
|
|
173
|
+
- Gate behavioral_changes on has_graph_evidence
|
|
174
|
+
- Route-surface diffing: annotation value changes detected as route_surface_change;
|
|
175
|
+
evidence dict with old/new path, HTTP method, produces/consumes
|
|
176
|
+
- Reverse impact graph: BFS on inverted graph; each impacted symbol carries
|
|
177
|
+
graph_path + included_because explaining the dependency chain
|
|
178
|
+
- contained_in edges expose method/field → class membership for propagation
|
|
179
|
+
- reverse_graph output: {target: {edge_type: [from_fqns]}} for agent queries
|
|
180
|
+
- 35 new acceptance tests (920 total passing)"
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
## Pendientes (próxima sesión)
|
|
186
|
+
|
|
187
|
+
### Prioridad alta
|
|
188
|
+
1. **Spring bean wiring graph** — `_build_relations` ya emite `injects` edges para `@Autowired` fields. Falta: trazar grafo completo `@Configuration → @Bean → @Autowired` y exponer como `wiring_graph` en IR output.
|
|
189
|
+
|
|
190
|
+
2. **Smoke test en repo spring-boot real:**
|
|
191
|
+
```bash
|
|
192
|
+
cd ~/Documents/workspace/spring-boot-realworld-example-app
|
|
193
|
+
sourcecode repo-ir . --since HEAD~1 2>/dev/null | python3 -c "
|
|
194
|
+
import json, sys
|
|
195
|
+
d = json.load(sys.stdin)
|
|
196
|
+
print('schema:', d['schema_version'])
|
|
197
|
+
print('nodes:', len(d['graph']['nodes']))
|
|
198
|
+
print('route_surface:', d.get('route_surface', []))
|
|
199
|
+
rg = d.get('reverse_graph', {})
|
|
200
|
+
print('reverse_graph keys:', len(rg))
|
|
201
|
+
"
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
3. **Transaction boundary tracking** — `@Transactional` ya detectado. Falta: emitir `transactional_boundary` edges.
|
|
205
|
+
|
|
206
|
+
### Prioridad media
|
|
207
|
+
4. **`_diff_routes` para `@RequestMapping` en clase** — si class-level mapping cambia (`/api/v1` → `/api/v2`), debería propagarse a todos los endpoints del controller.
|
|
208
|
+
|
|
209
|
+
5. **Tests unitarios para `_classify_diff_severity`** — sin cobertura
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## Para retomar
|
|
214
|
+
|
|
215
|
+
```bash
|
|
216
|
+
cd /Users/user/Downloads/atlas-cli
|
|
217
|
+
git log --oneline -5 # último commit: 31aa91a
|
|
218
|
+
git status # debe mostrar 4 ficheros modificados sin trackear
|
|
219
|
+
|
|
220
|
+
python3 -m pytest tests/ \
|
|
221
|
+
--ignore=tests/test_block2_coverage.py \
|
|
222
|
+
--ignore=tests/test_dependency_analyzer_node_python.py \
|
|
223
|
+
-q
|
|
224
|
+
# Expected: 920 passed, 3 skipped
|
|
225
|
+
|
|
226
|
+
# Primera acción: commitear (comando arriba)
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
---
|
|
230
|
+
|
|
231
|
+
*Pausado 2026-05-17 sesión 14 — gsd:pause-work*
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sourcecode
|
|
3
|
-
Version: 1.30.
|
|
3
|
+
Version: 1.30.14
|
|
4
4
|
Summary: Deterministic codebase context for AI coding agents
|
|
5
5
|
License: Apache License
|
|
6
6
|
Version 2.0, January 2004
|
|
@@ -221,7 +221,7 @@ Description-Content-Type: text/markdown
|
|
|
221
221
|
|
|
222
222
|
**Deterministic, behavior-aware codebase context for AI agents and PR review.**
|
|
223
223
|
|
|
224
|
-

|
|
225
225
|

|
|
226
226
|
|
|
227
227
|
---
|
|
@@ -257,7 +257,7 @@ pipx install sourcecode
|
|
|
257
257
|
|
|
258
258
|
```bash
|
|
259
259
|
sourcecode version
|
|
260
|
-
# sourcecode 1.30.
|
|
260
|
+
# sourcecode 1.30.14
|
|
261
261
|
```
|
|
262
262
|
|
|
263
263
|
---
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
**Deterministic, behavior-aware codebase context for AI agents and PR review.**
|
|
4
4
|
|
|
5
|
-

|
|
6
6
|

|
|
7
7
|
|
|
8
8
|
---
|
|
@@ -38,7 +38,7 @@ pipx install sourcecode
|
|
|
38
38
|
|
|
39
39
|
```bash
|
|
40
40
|
sourcecode version
|
|
41
|
-
# sourcecode 1.30.
|
|
41
|
+
# sourcecode 1.30.14
|
|
42
42
|
```
|
|
43
43
|
|
|
44
44
|
---
|
|
@@ -381,27 +381,27 @@ def _impact_descriptions(
|
|
|
381
381
|
|
|
382
382
|
if changed_type in _REPO_ARTIFACT_TYPES:
|
|
383
383
|
items.append(_impact_item(
|
|
384
|
-
f"{domain} persistence
|
|
385
|
-
f"{changed_class} classified as
|
|
384
|
+
f"{domain} persistence layer modified" if domain else "persistence layer modified",
|
|
385
|
+
f"{changed_class} classified as {changed_type} (artifact_type evidence)",
|
|
386
386
|
certainty,
|
|
387
387
|
))
|
|
388
388
|
elif changed_type in _SERVICE_ARTIFACT_TYPES:
|
|
389
389
|
if end_state == "DB write":
|
|
390
390
|
items.append(_impact_item(
|
|
391
|
-
f"{domain}
|
|
392
|
-
f"{changed_class} delegates to repository with DB write",
|
|
391
|
+
f"{domain} service layer: DB write in call path" if domain else "service layer: DB write in call path",
|
|
392
|
+
f"{changed_class} delegates to repository with DB write (code evidence)",
|
|
393
393
|
certainty,
|
|
394
394
|
))
|
|
395
395
|
else:
|
|
396
396
|
items.append(_impact_item(
|
|
397
|
-
f"{domain}
|
|
398
|
-
f"{changed_class} is a service
|
|
397
|
+
f"{domain} service layer modified" if domain else "service layer modified",
|
|
398
|
+
f"{changed_class} is a service (artifact_type={changed_type})",
|
|
399
399
|
certainty,
|
|
400
400
|
))
|
|
401
401
|
else:
|
|
402
402
|
items.append(_impact_item(
|
|
403
|
-
f"{domain}
|
|
404
|
-
f"{changed_class}
|
|
403
|
+
f"{domain} component modified" if domain else "component modified",
|
|
404
|
+
f"{changed_class} found in traced call path (artifact_type={changed_type})",
|
|
405
405
|
certainty,
|
|
406
406
|
))
|
|
407
407
|
|
|
@@ -440,14 +440,14 @@ def _impact_descriptions_for_controller(
|
|
|
440
440
|
domain = d
|
|
441
441
|
break
|
|
442
442
|
items.append(_impact_item(
|
|
443
|
-
f"{domain} persistence
|
|
444
|
-
"repository with DB write detected in path",
|
|
443
|
+
f"{domain} persistence layer: repository with DB write in call path" if domain else "persistence layer: repository with DB write in call path",
|
|
444
|
+
"repository with DB write detected in traced call path (code evidence)",
|
|
445
445
|
certainty,
|
|
446
446
|
))
|
|
447
447
|
else:
|
|
448
448
|
items.append(_impact_item(
|
|
449
|
-
"request handler behavior may change",
|
|
450
449
|
"controller entry point modified",
|
|
450
|
+
"controller entry point is in changed files (direct diff evidence)",
|
|
451
451
|
certainty,
|
|
452
452
|
))
|
|
453
453
|
|
|
@@ -539,23 +539,23 @@ def _read_code_signal_evidence(root: Path, file_path: str, artifact_type: str) -
|
|
|
539
539
|
|
|
540
540
|
|
|
541
541
|
_ARTIFACT_CHANGE_EFFECT: dict[str, str] = {
|
|
542
|
-
"entrypoint": "
|
|
543
|
-
"controller": "
|
|
544
|
-
"service": "
|
|
545
|
-
"repository": "
|
|
546
|
-
"mapper": "
|
|
547
|
-
"security": "
|
|
548
|
-
"spring_config": "
|
|
549
|
-
"spring_profile": "
|
|
550
|
-
"config": "
|
|
551
|
-
"build_manifest": "
|
|
552
|
-
"db_migration": "
|
|
553
|
-
"domain_model": "
|
|
554
|
-
"dto": "
|
|
555
|
-
"test": "
|
|
556
|
-
"documentation": "
|
|
557
|
-
"ide_noise": "IDE/tooling artifact
|
|
558
|
-
"source": "
|
|
542
|
+
"entrypoint": "application entrypoint (framework bootstrap / CLI handler)",
|
|
543
|
+
"controller": "HTTP routing layer (request-to-handler mapping)",
|
|
544
|
+
"service": "business logic layer (@Service component)",
|
|
545
|
+
"repository": "data access layer (persistence queries / ORM)",
|
|
546
|
+
"mapper": "SQL-object mapping layer (MyBatis mapper / query template)",
|
|
547
|
+
"security": "security component (authentication / access control configuration)",
|
|
548
|
+
"spring_config": "Spring @Configuration class (bean definitions / datasource wiring)",
|
|
549
|
+
"spring_profile": "Spring profile override (environment-specific configuration)",
|
|
550
|
+
"config": "configuration file (application properties / environment values)",
|
|
551
|
+
"build_manifest": "build manifest (dependency and plugin configuration)",
|
|
552
|
+
"db_migration": "database schema migration (DDL change pending execution)",
|
|
553
|
+
"domain_model": "domain entity (@Entity / value object)",
|
|
554
|
+
"dto": "data transfer object (serialization contract)",
|
|
555
|
+
"test": "test file (no production code modified)",
|
|
556
|
+
"documentation": "documentation file (no runtime impact)",
|
|
557
|
+
"ide_noise": "IDE/tooling artifact (no application impact)",
|
|
558
|
+
"source": "application source (artifact role requires annotation inspection)",
|
|
559
559
|
}
|
|
560
560
|
|
|
561
561
|
# Maps frontend symptom keywords → backend terms likely to contain the root cause.
|
|
@@ -1037,7 +1037,7 @@ class TaskContextBuilder:
|
|
|
1037
1037
|
_pr_review_hotspots = sorted(
|
|
1038
1038
|
[f for f, cls in _pr_changed_cls.items()
|
|
1039
1039
|
if not cls["is_noise"] and cls["artifact_type"] != "build_manifest"],
|
|
1040
|
-
key=lambda f: (_delta_impact_score_per_file.get(f) or {}).get("
|
|
1040
|
+
key=lambda f: (_delta_impact_score_per_file.get(f) or {}).get("_rank_score", 0.0),
|
|
1041
1041
|
reverse=True,
|
|
1042
1042
|
)[:8]
|
|
1043
1043
|
|
|
@@ -1123,33 +1123,29 @@ class TaskContextBuilder:
|
|
|
1123
1123
|
_has_code_ev = any(e["type"] in ("annotation", "import") for e in _evidence)
|
|
1124
1124
|
_has_symbol_ev = any(e["type"] == "symbol" for e in _evidence)
|
|
1125
1125
|
_role_basis = "annotation" if _has_code_ev else ("symbol" if _has_symbol_ev else "git_diff_only")
|
|
1126
|
-
_cls_conf = _f_cls["confidence"]
|
|
1127
1126
|
_role_obj = {
|
|
1128
|
-
"type": "inferred",
|
|
1129
|
-
"confidence": "medium" if (_has_code_ev or (_has_symbol_ev and _cls_conf == "high")) else "low",
|
|
1130
1127
|
"basis": _role_basis,
|
|
1128
|
+
"has_annotation_signal": _has_code_ev,
|
|
1129
|
+
"has_symbol_signal": _has_symbol_ev,
|
|
1131
1130
|
}
|
|
1132
1131
|
|
|
1133
|
-
# File confidence: from structured impact entry
|
|
1134
|
-
_impact_entry = _delta_impact_score_per_file.get(_f) or {}
|
|
1135
|
-
_f_conf = _impact_entry.get("confidence", "low")
|
|
1136
1132
|
_diff_source = (
|
|
1137
1133
|
DiffSourceType.GIT_RANGE.value if _f in _committed_set
|
|
1138
1134
|
else DiffSourceType.WORKTREE_UNSTAGED.value if _f in _uncommitted_set
|
|
1139
1135
|
else "unknown"
|
|
1140
1136
|
)
|
|
1137
|
+
_impact_entry = _delta_impact_score_per_file.get(_f) or {}
|
|
1141
1138
|
_entry = {
|
|
1142
1139
|
"path": _f,
|
|
1143
1140
|
"diff_source": _diff_source,
|
|
1144
1141
|
"role": _role_obj,
|
|
1145
|
-
"confidence": _f_conf,
|
|
1146
1142
|
"artifact_type": _f_atype,
|
|
1147
1143
|
"evidence": _evidence,
|
|
1148
1144
|
"change_effect": {
|
|
1149
|
-
"statement": _ARTIFACT_CHANGE_EFFECT.get(_f_atype, "
|
|
1150
|
-
"
|
|
1151
|
-
"confidence": _role_obj["confidence"],
|
|
1145
|
+
"statement": _ARTIFACT_CHANGE_EFFECT.get(_f_atype, "application source (artifact role requires annotation inspection)"),
|
|
1146
|
+
"classification_method": _f_cls.get("confidence", "low"),
|
|
1152
1147
|
},
|
|
1148
|
+
"evidence_completeness": _impact_entry.get("evidence", {}),
|
|
1153
1149
|
}
|
|
1154
1150
|
_pr_runtime_changes.append(_entry)
|
|
1155
1151
|
# Split committed vs uncommitted — never merged
|
|
@@ -2336,17 +2332,10 @@ class TaskContextBuilder:
|
|
|
2336
2332
|
return "service" # annotation-confirmed — not "core_service" (overclaim)
|
|
2337
2333
|
return "unclassified" # no role claim without evidence
|
|
2338
2334
|
|
|
2339
|
-
def _score_to_confidence(score: float) -> str:
|
|
2340
|
-
if score >= 0.60:
|
|
2341
|
-
return "high"
|
|
2342
|
-
if score >= 0.40:
|
|
2343
|
-
return "medium"
|
|
2344
|
-
return "low"
|
|
2345
|
-
|
|
2346
2335
|
def _structured_why(path: str, atype: str, module: str, role: str, risk_areas: list[str], cls_confidence: str = "low") -> str:
|
|
2347
2336
|
area = _classify_impact_area(path, risk_areas, atype)
|
|
2348
2337
|
prop = _PROPAGATION_RISK.get(atype, "low") if atype != "source" else "unknown"
|
|
2349
|
-
effect = _CHANGE_EFFECT.get(atype, "
|
|
2338
|
+
effect = _CHANGE_EFFECT.get(atype, "application source (artifact role requires annotation inspection)")
|
|
2350
2339
|
parts = [f"artifact_type: {atype}", f"classification_confidence: {cls_confidence}"]
|
|
2351
2340
|
# Only emit role/area/propagation when there is confirmed evidence (not source/unclassified)
|
|
2352
2341
|
if role not in ("unclassified",):
|
|
@@ -2431,8 +2420,7 @@ class TaskContextBuilder:
|
|
|
2431
2420
|
role = _role_in_system(path, atype, in_ep)
|
|
2432
2421
|
cls_conf = cls.get("confidence", "low")
|
|
2433
2422
|
why_str = _structured_why(path, atype, module, role, cls["risk_areas"], cls_conf)
|
|
2434
|
-
|
|
2435
|
-
reason = f"changed since {ref_label} | artifact: {atype} | confidence: {confidence}"
|
|
2423
|
+
reason = f"changed since {ref_label} | artifact: {atype}"
|
|
2436
2424
|
|
|
2437
2425
|
relevant.append(RelevantFile(path=path, role=role, score=round(score, 2), reason=reason, why=why_str))
|
|
2438
2426
|
why[path] = why_str
|
|
@@ -2485,7 +2473,7 @@ class TaskContextBuilder:
|
|
|
2485
2473
|
why_str = _structured_why(path, rel_atype, _extract_ddd_domain(path), role, rel_cls["risk_areas"], rel_conf)
|
|
2486
2474
|
why_str += f" | pulled_by: type-aware expansion from {ctx_type} '{ctx_val}'"
|
|
2487
2475
|
why_str += f" | triggered_by: {', '.join(triggers[:3])}"
|
|
2488
|
-
reason = f"expansion: {ctx_type} '{ctx_val}' | artifact: {rel_atype}
|
|
2476
|
+
reason = f"expansion: {ctx_type} '{ctx_val}' | artifact: {rel_atype}"
|
|
2489
2477
|
related.append((rel_score, path, RelevantFile(
|
|
2490
2478
|
path=path, role=role, score=rel_score, reason=reason, why=why_str
|
|
2491
2479
|
)))
|
|
@@ -2595,7 +2583,7 @@ class TaskContextBuilder:
|
|
|
2595
2583
|
_why_str += f" | pulled_by: hop-{_hop_num} import from {Path(_seed_path).name}"
|
|
2596
2584
|
_reason = (
|
|
2597
2585
|
f"hop-{_hop_num} import-dependent of {Path(_seed_path).name}"
|
|
2598
|
-
f" ({_seed_atype})
|
|
2586
|
+
f" ({_seed_atype})"
|
|
2599
2587
|
)
|
|
2600
2588
|
why[_dep_path] = _why_str
|
|
2601
2589
|
# Tests import production code but are not structural dependencies —
|
|
@@ -2670,18 +2658,18 @@ class TaskContextBuilder:
|
|
|
2670
2658
|
0.02
|
|
2671
2659
|
)
|
|
2672
2660
|
_raw_score = round(min(1.0, _base * 0.50 + _sec_w + _fw + _fanout + _ctw), 3)
|
|
2661
|
+
_caller_count = _downstream_count.get(_path, 0)
|
|
2673
2662
|
impact_score_per_file[_path] = {
|
|
2674
|
-
"
|
|
2675
|
-
"confidence": _score_to_confidence(_raw_score),
|
|
2676
|
-
"score_breakdown": {
|
|
2677
|
-
"artifact_base": round(_base * 0.50, 3),
|
|
2678
|
-
"security_weight": _sec_w,
|
|
2679
|
-
"framework_weight": _fw,
|
|
2680
|
-
"fanout_weight": round(_fanout, 3),
|
|
2681
|
-
"change_type_weight": _ctw,
|
|
2682
|
-
},
|
|
2663
|
+
"_rank_score": _raw_score, # internal ranking only — not a confidence claim
|
|
2683
2664
|
"change_types": sorted(_file_ctypes),
|
|
2684
2665
|
"diff_severity": _diff_sev,
|
|
2666
|
+
"evidence": {
|
|
2667
|
+
"has_reverse_edges": _caller_count > 0,
|
|
2668
|
+
"reverse_edge_count": _caller_count,
|
|
2669
|
+
"has_route_diff": _diff_sev == "api_change",
|
|
2670
|
+
"has_security_diff": _diff_sev == "security_change",
|
|
2671
|
+
"has_wiring_evidence": _atype in {"spring_config", "security"} and _cls.get("confidence") == "high",
|
|
2672
|
+
},
|
|
2685
2673
|
}
|
|
2686
2674
|
|
|
2687
2675
|
_CT_ORDER = ["security_change", "behavioral_change", "structural_change",
|
|
@@ -2714,24 +2702,29 @@ class TaskContextBuilder:
|
|
|
2714
2702
|
changed_subsystems.append(_subsys)
|
|
2715
2703
|
_seen_subsys.add(_subsys)
|
|
2716
2704
|
|
|
2717
|
-
# behavioral_changes:
|
|
2718
|
-
#
|
|
2719
|
-
|
|
2720
|
-
|
|
2721
|
-
|
|
2722
|
-
|
|
2723
|
-
|
|
2724
|
-
|
|
2705
|
+
# behavioral_changes: only emitted when graph evidence exists (import edges found).
|
|
2706
|
+
# Without reverse dependency graph, we cannot make traceable structural claims.
|
|
2707
|
+
# Also gated on semantic diff evidence (api_change/security_change) per file.
|
|
2708
|
+
_has_graph_ev = bool(graph_edges)
|
|
2709
|
+
behavioral_changes: list[str] = (
|
|
2710
|
+
[
|
|
2711
|
+
f"{Path(_p).name}: {_CHANGE_EFFECT.get(_cls['artifact_type'], 'application source (artifact role requires annotation inspection)')} [diff_severity={diff_severities.get(_p)}]"
|
|
2712
|
+
for _p, _cls in classifications.items()
|
|
2713
|
+
if not _cls["is_noise"]
|
|
2714
|
+
and diff_severities.get(_p, "unknown") in ("api_change", "security_change")
|
|
2715
|
+
]
|
|
2716
|
+
if _has_graph_ev else []
|
|
2717
|
+
)
|
|
2725
2718
|
|
|
2726
2719
|
def _runtime_impact(tc: dict[str, int]) -> list[str]:
|
|
2727
2720
|
_ri: list[str] = []
|
|
2728
2721
|
# Only emit claims that are evidence-backed (annotation-confirmed roles)
|
|
2729
2722
|
if "entrypoint" in tc:
|
|
2730
|
-
_ri.append("Entrypoint-classified file modified —
|
|
2723
|
+
_ri.append("Entrypoint-classified file modified — restart required before deploying to production")
|
|
2731
2724
|
if "spring_config" in tc:
|
|
2732
|
-
_ri.append("Spring
|
|
2725
|
+
_ri.append("Spring @Configuration-classified file modified — bean context rebuild required on restart")
|
|
2733
2726
|
if "security" in tc:
|
|
2734
|
-
_ri.append("Security-classified file modified —
|
|
2727
|
+
_ri.append("Security-classified file modified — inspect authentication and access control wiring")
|
|
2735
2728
|
if "db_migration" in tc:
|
|
2736
2729
|
_ri.append("Database schema migration pending — execute before deploying application")
|
|
2737
2730
|
# service transactional claim: only if @Service annotation confirmed (not source/unclassified)
|