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.
Files changed (193) hide show
  1. sourcecode-1.30.14/.continue-here.md +231 -0
  2. {sourcecode-1.30.13 → sourcecode-1.30.14}/PKG-INFO +3 -3
  3. {sourcecode-1.30.13 → sourcecode-1.30.14}/README.md +2 -2
  4. {sourcecode-1.30.13 → sourcecode-1.30.14}/pyproject.toml +1 -1
  5. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/__init__.py +1 -1
  6. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/flow_analyzer.py +11 -11
  7. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/prepare_context.py +53 -60
  8. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/repository_ir.py +498 -24
  9. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_repository_ir.py +623 -12
  10. sourcecode-1.30.13/.continue-here.md +0 -166
  11. {sourcecode-1.30.13 → sourcecode-1.30.14}/.agents/skills/source-command-gsd-join-discord/SKILL.md +0 -0
  12. {sourcecode-1.30.13 → sourcecode-1.30.14}/.agents/skills/source-command-gsd-review-backlog/SKILL.md +0 -0
  13. {sourcecode-1.30.13 → sourcecode-1.30.14}/.agents/skills/source-command-gsd-workstreams/SKILL.md +0 -0
  14. {sourcecode-1.30.13 → sourcecode-1.30.14}/.github/workflows/build-windows.yml +0 -0
  15. {sourcecode-1.30.13 → sourcecode-1.30.14}/.gitignore +0 -0
  16. {sourcecode-1.30.13 → sourcecode-1.30.14}/.ruff.toml +0 -0
  17. {sourcecode-1.30.13 → sourcecode-1.30.14}/CONTRIBUTING.md +0 -0
  18. {sourcecode-1.30.13 → sourcecode-1.30.14}/LICENSE +0 -0
  19. {sourcecode-1.30.13 → sourcecode-1.30.14}/SECURITY.md +0 -0
  20. {sourcecode-1.30.13 → sourcecode-1.30.14}/docs/privacy.md +0 -0
  21. {sourcecode-1.30.13 → sourcecode-1.30.14}/docs/schema.md +0 -0
  22. {sourcecode-1.30.13 → sourcecode-1.30.14}/raw +0 -0
  23. {sourcecode-1.30.13 → sourcecode-1.30.14}/run_cli.py +0 -0
  24. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/adaptive_scanner.py +0 -0
  25. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/architecture_analyzer.py +0 -0
  26. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/architecture_summary.py +0 -0
  27. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/ast_extractor.py +0 -0
  28. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/classifier.py +0 -0
  29. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/cli.py +0 -0
  30. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/code_notes_analyzer.py +0 -0
  31. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/confidence_analyzer.py +0 -0
  32. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/context_scorer.py +0 -0
  33. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/context_summarizer.py +0 -0
  34. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/contract_model.py +0 -0
  35. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/contract_pipeline.py +0 -0
  36. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/coverage_parser.py +0 -0
  37. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/dependency_analyzer.py +0 -0
  38. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/detectors/__init__.py +0 -0
  39. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/detectors/base.py +0 -0
  40. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/detectors/csproj_parser.py +0 -0
  41. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/detectors/dart.py +0 -0
  42. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/detectors/dotnet.py +0 -0
  43. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/detectors/elixir.py +0 -0
  44. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/detectors/go.py +0 -0
  45. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/detectors/heuristic.py +0 -0
  46. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/detectors/hybrid.py +0 -0
  47. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/detectors/java.py +0 -0
  48. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/detectors/jvm_ext.py +0 -0
  49. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/detectors/nodejs.py +0 -0
  50. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/detectors/parsers.py +0 -0
  51. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/detectors/php.py +0 -0
  52. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/detectors/project.py +0 -0
  53. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/detectors/python.py +0 -0
  54. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/detectors/ruby.py +0 -0
  55. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/detectors/rust.py +0 -0
  56. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/detectors/systems.py +0 -0
  57. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/detectors/terraform.py +0 -0
  58. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/detectors/tooling.py +0 -0
  59. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/doc_analyzer.py +0 -0
  60. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/entrypoint_classifier.py +0 -0
  61. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/env_analyzer.py +0 -0
  62. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/file_classifier.py +0 -0
  63. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/git_analyzer.py +0 -0
  64. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/graph_analyzer.py +0 -0
  65. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/metrics_analyzer.py +0 -0
  66. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/progress.py +0 -0
  67. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/ranking_engine.py +0 -0
  68. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/redactor.py +0 -0
  69. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/relevance_scorer.py +0 -0
  70. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/repo_classifier.py +0 -0
  71. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/runtime_classifier.py +0 -0
  72. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/scanner.py +0 -0
  73. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/schema.py +0 -0
  74. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/semantic_analyzer.py +0 -0
  75. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/serializer.py +0 -0
  76. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/summarizer.py +0 -0
  77. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/telemetry/__init__.py +0 -0
  78. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/telemetry/config.py +0 -0
  79. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/telemetry/consent.py +0 -0
  80. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/telemetry/events.py +0 -0
  81. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/telemetry/filters.py +0 -0
  82. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/telemetry/transport.py +0 -0
  83. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/tree_utils.py +0 -0
  84. {sourcecode-1.30.13 → sourcecode-1.30.14}/src/sourcecode/workspace.py +0 -0
  85. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/__init__.py +0 -0
  86. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/conftest.py +0 -0
  87. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/coverage.xml +0 -0
  88. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/fastapi_app/pyproject.toml +0 -0
  89. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/fastapi_app/src/main.py +0 -0
  90. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/go_service/cmd/api/main.go +0 -0
  91. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/go_service/go.mod +0 -0
  92. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/jacoco.xml +0 -0
  93. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/latin1_sample.java +0 -0
  94. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/latin1_sample_iso.java +0 -0
  95. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/lcov.info +0 -0
  96. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/nextjs_app/app/page.tsx +0 -0
  97. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/nextjs_app/package.json +0 -0
  98. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/nextjs_app/pnpm-lock.yaml +0 -0
  99. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/pnpm_monorepo/apps/web/app/page.tsx +0 -0
  100. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/pnpm_monorepo/apps/web/package.json +0 -0
  101. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/pnpm_monorepo/packages/api/main.py +0 -0
  102. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/pnpm_monorepo/packages/api/pyproject.toml +0 -0
  103. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/pnpm_monorepo/pnpm-workspace.yaml +0 -0
  104. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/spring_boot_minimal/pom.xml +0 -0
  105. {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
  106. {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
  107. {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
  108. {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
  109. {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
  110. {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
  111. {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
  112. {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
  113. {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
  114. {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
  115. {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
  116. {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
  117. {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
  118. {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
  119. {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
  120. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/DemoApplication.java +0 -0
  121. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/config/FilterConfig.java +0 -0
  122. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/domain/Health.java +0 -0
  123. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/mapper/HealthMapper.java +0 -0
  124. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/repository/HealthRepository.java +0 -0
  125. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/service/HealthService.java +0 -0
  126. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/web/HealthRestController.java +0 -0
  127. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/web/NominaRestController.java +0 -0
  128. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/spring_boot_minimal/src/main/resources/application-dev.yml +0 -0
  129. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/spring_boot_minimal/src/main/resources/application.yml +0 -0
  130. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/fixtures/spring_boot_minimal/src/main/resources/mapper/HealthMapper.xml +0 -0
  131. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_architecture_analyzer.py +0 -0
  132. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_architecture_summary.py +0 -0
  133. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_ast_extractor.py +0 -0
  134. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_block1_reliability.py +0 -0
  135. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_block2_coverage.py +0 -0
  136. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_block5_quality.py +0 -0
  137. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_bug_fixes_v16.py +0 -0
  138. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_classifier.py +0 -0
  139. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_cli.py +0 -0
  140. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_code_notes_analyzer.py +0 -0
  141. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_context_scorer.py +0 -0
  142. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_contract_pipeline.py +0 -0
  143. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_coverage_parser.py +0 -0
  144. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_cross_consistency.py +0 -0
  145. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_dependency_analyzer_node_python.py +0 -0
  146. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_dependency_analyzer_polyglot.py +0 -0
  147. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_dependency_schema.py +0 -0
  148. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_detector_dotnet.py +0 -0
  149. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_detector_go_rust_java.py +0 -0
  150. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_detector_nodejs.py +0 -0
  151. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_detector_php_ruby_dart.py +0 -0
  152. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_detector_python.py +0 -0
  153. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_detector_universal_managed.py +0 -0
  154. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_detector_universal_systems.py +0 -0
  155. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_detectors_base.py +0 -0
  156. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_doc_analyzer_jsdom.py +0 -0
  157. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_doc_analyzer_python.py +0 -0
  158. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_encoding_regression.py +0 -0
  159. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_graph_analyzer_polyglot.py +0 -0
  160. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_graph_analyzer_python_node.py +0 -0
  161. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_graph_schema.py +0 -0
  162. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_hybrid_inference.py +0 -0
  163. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_integration.py +0 -0
  164. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_integration_dependencies.py +0 -0
  165. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_integration_detection.py +0 -0
  166. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_integration_docs.py +0 -0
  167. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_integration_graph_modules.py +0 -0
  168. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_integration_lqn.py +0 -0
  169. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_integration_metrics.py +0 -0
  170. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_integration_multistack.py +0 -0
  171. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_integration_semantics.py +0 -0
  172. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_integration_universal.py +0 -0
  173. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_java_spring_integration.py +0 -0
  174. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_metrics_analyzer.py +0 -0
  175. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_packaging.py +0 -0
  176. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_phase1_improvements.py +0 -0
  177. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_pipeline_integrity.py +0 -0
  178. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_real_projects.py +0 -0
  179. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_redactor.py +0 -0
  180. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_scanner.py +0 -0
  181. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_schema.py +0 -0
  182. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_schema_normalization.py +0 -0
  183. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_semantic_analyzer_node.py +0 -0
  184. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_semantic_analyzer_python.py +0 -0
  185. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_semantic_import_resolution.py +0 -0
  186. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_semantic_schema.py +0 -0
  187. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_signal_hierarchy.py +0 -0
  188. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_summarizer.py +0 -0
  189. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_surface_honesty.py +0 -0
  190. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_task_differentiation.py +0 -0
  191. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_telemetry.py +0 -0
  192. {sourcecode-1.30.13 → sourcecode-1.30.14}/tests/test_v1_10_regressions.py +0 -0
  193. {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.13
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
- ![Version](https://img.shields.io/badge/version-1.30.13-blue)
224
+ ![Version](https://img.shields.io/badge/version-1.30.14-blue)
225
225
  ![Python](https://img.shields.io/badge/python-3.10%2B-green)
226
226
 
227
227
  ---
@@ -257,7 +257,7 @@ pipx install sourcecode
257
257
 
258
258
  ```bash
259
259
  sourcecode version
260
- # sourcecode 1.30.13
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
- ![Version](https://img.shields.io/badge/version-1.30.13-blue)
5
+ ![Version](https://img.shields.io/badge/version-1.30.14-blue)
6
6
  ![Python](https://img.shields.io/badge/python-3.10%2B-green)
7
7
 
8
8
  ---
@@ -38,7 +38,7 @@ pipx install sourcecode
38
38
 
39
39
  ```bash
40
40
  sourcecode version
41
- # sourcecode 1.30.13
41
+ # sourcecode 1.30.14
42
42
  ```
43
43
 
44
44
  ---
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "sourcecode"
7
- version = "1.30.13"
7
+ version = "1.30.14"
8
8
  description = "Deterministic codebase context for AI coding agents"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.9"
@@ -1,3 +1,3 @@
1
1
  """sourcecode — Deterministic codebase context maps for AI coding agents."""
2
2
 
3
- __version__ = "1.30.13"
3
+ __version__ = "1.30.14"
@@ -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 may be affected (inferred from path)" if domain else "persistence may be affected (inferred from path)",
385
- f"{changed_class} classified as repository from path",
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} persistence may be affected (repository with DB write in path)" if domain else "persistence may be affected (repository with DB write in path)",
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} behavior may change" if domain else "behavior may change",
398
- f"{changed_class} is a service in path",
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} behavior may change" if domain else "behavior may change",
404
- f"{changed_class} is in path",
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 may be affected (repository with DB write in path)" if domain else "data persistence may be affected (repository with DB write in path)",
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": "may affect application startup, CLI entry, or framework bootstrap all request flows may be affected (inferred from role)",
543
- "controller": "may alter HTTP routing, API contract, or response shape — API consumers may be affected (inferred from role)",
544
- "service": "may change business rules, transaction scope, or orchestration logic callers and dependents may be affected (inferred from role)",
545
- "repository": "may modify persistence queries or data access patterns — verify data consistency and service layer (inferred from role)",
546
- "mapper": "may alter SQL-to-object binding or query templates data shape and repositories may be affected (inferred from role)",
547
- "security": "may change authentication flow, access control rules, or session handling — all secured endpoints may be affected (inferred from role)",
548
- "spring_config": "may modify bean wiring, datasource, or framework-wide settings — wired beans potentially affected (inferred from role)",
549
- "spring_profile": "may change environment-specific overrides — behavior may differ per active profile (inferred from role)",
550
- "config": "may adjust configuration values all modules reading this config may be affected (inferred from role)",
551
- "build_manifest": "changes dependencies, plugins, or project structure — compile-time and runtime classpath affected",
552
- "db_migration": "modifies database schema existing queries, mappings, and constraints may break",
553
- "domain_model": "may alter entity structure may cascade to repositories, DTOs, serializers, and mappers (inferred from role)",
554
- "dto": "may change data transfer contract serialization and API consumers may break (inferred from role)",
555
- "test": "modifies test coverage or test behavior — no production code affected",
556
- "documentation": "updates documentation only no runtime impact",
557
- "ide_noise": "IDE/tooling artifact no application impact",
558
- "source": "modifies application source artifact role derived from file path structure",
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("score", 0.0),
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, "may modify application logic (role inferred from path)"),
1150
- "truth_level": "inferred",
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, "may modify application logic (role unconfirmed)")
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
- confidence = _score_to_confidence(score)
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} | confidence: {_score_to_confidence(rel_score)}"
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}) | confidence: {_score_to_confidence(_dep_score)}"
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
- "score": _raw_score,
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: gated on semantic diff evidence (api_change/security_change),
2718
- # NOT on artifact type alone. Avoids false behavioral claims for validator/util files.
2719
- behavioral_changes: list[str] = [
2720
- f"{Path(_p).name}: {_CHANGE_EFFECT.get(_cls['artifact_type'], 'may modify application logic')}"
2721
- for _p, _cls in classifications.items()
2722
- if not _cls["is_noise"]
2723
- and diff_severities.get(_p, "unknown") in ("api_change", "security_change")
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 — may require full context restart before deploy")
2723
+ _ri.append("Entrypoint-classified file modified — restart required before deploying to production")
2731
2724
  if "spring_config" in tc:
2732
- _ri.append("Spring config-classified file modified — wired beans may be rewired on restart")
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 — secured endpoints may be affected after restart")
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)