sourcecode 1.30.6__tar.gz → 1.30.8__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 (191) hide show
  1. sourcecode-1.30.8/.continue-here.md +173 -0
  2. {sourcecode-1.30.6 → sourcecode-1.30.8}/PKG-INFO +3 -3
  3. {sourcecode-1.30.6 → sourcecode-1.30.8}/README.md +2 -2
  4. {sourcecode-1.30.6 → sourcecode-1.30.8}/pyproject.toml +1 -1
  5. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/__init__.py +1 -1
  6. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/cli.py +6 -1
  7. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/flow_analyzer.py +6 -5
  8. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/prepare_context.py +99 -28
  9. sourcecode-1.30.6/.continue-here.md +0 -163
  10. {sourcecode-1.30.6 → sourcecode-1.30.8}/.agents/skills/source-command-gsd-join-discord/SKILL.md +0 -0
  11. {sourcecode-1.30.6 → sourcecode-1.30.8}/.agents/skills/source-command-gsd-review-backlog/SKILL.md +0 -0
  12. {sourcecode-1.30.6 → sourcecode-1.30.8}/.agents/skills/source-command-gsd-workstreams/SKILL.md +0 -0
  13. {sourcecode-1.30.6 → sourcecode-1.30.8}/.github/workflows/build-windows.yml +0 -0
  14. {sourcecode-1.30.6 → sourcecode-1.30.8}/.gitignore +0 -0
  15. {sourcecode-1.30.6 → sourcecode-1.30.8}/.ruff.toml +0 -0
  16. {sourcecode-1.30.6 → sourcecode-1.30.8}/CONTRIBUTING.md +0 -0
  17. {sourcecode-1.30.6 → sourcecode-1.30.8}/LICENSE +0 -0
  18. {sourcecode-1.30.6 → sourcecode-1.30.8}/SECURITY.md +0 -0
  19. {sourcecode-1.30.6 → sourcecode-1.30.8}/docs/privacy.md +0 -0
  20. {sourcecode-1.30.6 → sourcecode-1.30.8}/docs/schema.md +0 -0
  21. {sourcecode-1.30.6 → sourcecode-1.30.8}/raw +0 -0
  22. {sourcecode-1.30.6 → sourcecode-1.30.8}/run_cli.py +0 -0
  23. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/adaptive_scanner.py +0 -0
  24. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/architecture_analyzer.py +0 -0
  25. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/architecture_summary.py +0 -0
  26. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/ast_extractor.py +0 -0
  27. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/classifier.py +0 -0
  28. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/code_notes_analyzer.py +0 -0
  29. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/confidence_analyzer.py +0 -0
  30. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/context_scorer.py +0 -0
  31. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/context_summarizer.py +0 -0
  32. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/contract_model.py +0 -0
  33. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/contract_pipeline.py +0 -0
  34. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/coverage_parser.py +0 -0
  35. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/dependency_analyzer.py +0 -0
  36. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/detectors/__init__.py +0 -0
  37. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/detectors/base.py +0 -0
  38. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/detectors/csproj_parser.py +0 -0
  39. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/detectors/dart.py +0 -0
  40. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/detectors/dotnet.py +0 -0
  41. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/detectors/elixir.py +0 -0
  42. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/detectors/go.py +0 -0
  43. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/detectors/heuristic.py +0 -0
  44. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/detectors/hybrid.py +0 -0
  45. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/detectors/java.py +0 -0
  46. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/detectors/jvm_ext.py +0 -0
  47. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/detectors/nodejs.py +0 -0
  48. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/detectors/parsers.py +0 -0
  49. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/detectors/php.py +0 -0
  50. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/detectors/project.py +0 -0
  51. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/detectors/python.py +0 -0
  52. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/detectors/ruby.py +0 -0
  53. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/detectors/rust.py +0 -0
  54. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/detectors/systems.py +0 -0
  55. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/detectors/terraform.py +0 -0
  56. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/detectors/tooling.py +0 -0
  57. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/doc_analyzer.py +0 -0
  58. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/entrypoint_classifier.py +0 -0
  59. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/env_analyzer.py +0 -0
  60. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/file_classifier.py +0 -0
  61. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/git_analyzer.py +0 -0
  62. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/graph_analyzer.py +0 -0
  63. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/metrics_analyzer.py +0 -0
  64. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/progress.py +0 -0
  65. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/ranking_engine.py +0 -0
  66. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/redactor.py +0 -0
  67. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/relevance_scorer.py +0 -0
  68. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/repo_classifier.py +0 -0
  69. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/runtime_classifier.py +0 -0
  70. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/scanner.py +0 -0
  71. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/schema.py +0 -0
  72. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/semantic_analyzer.py +0 -0
  73. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/serializer.py +0 -0
  74. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/summarizer.py +0 -0
  75. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/telemetry/__init__.py +0 -0
  76. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/telemetry/config.py +0 -0
  77. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/telemetry/consent.py +0 -0
  78. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/telemetry/events.py +0 -0
  79. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/telemetry/filters.py +0 -0
  80. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/telemetry/transport.py +0 -0
  81. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/tree_utils.py +0 -0
  82. {sourcecode-1.30.6 → sourcecode-1.30.8}/src/sourcecode/workspace.py +0 -0
  83. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/__init__.py +0 -0
  84. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/conftest.py +0 -0
  85. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/fixtures/coverage.xml +0 -0
  86. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/fixtures/fastapi_app/pyproject.toml +0 -0
  87. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/fixtures/fastapi_app/src/main.py +0 -0
  88. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/fixtures/go_service/cmd/api/main.go +0 -0
  89. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/fixtures/go_service/go.mod +0 -0
  90. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/fixtures/jacoco.xml +0 -0
  91. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/fixtures/latin1_sample.java +0 -0
  92. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/fixtures/latin1_sample_iso.java +0 -0
  93. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/fixtures/lcov.info +0 -0
  94. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/fixtures/nextjs_app/app/page.tsx +0 -0
  95. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/fixtures/nextjs_app/package.json +0 -0
  96. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/fixtures/nextjs_app/pnpm-lock.yaml +0 -0
  97. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/fixtures/pnpm_monorepo/apps/web/app/page.tsx +0 -0
  98. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/fixtures/pnpm_monorepo/apps/web/package.json +0 -0
  99. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/fixtures/pnpm_monorepo/packages/api/main.py +0 -0
  100. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/fixtures/pnpm_monorepo/packages/api/pyproject.toml +0 -0
  101. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/fixtures/pnpm_monorepo/pnpm-workspace.yaml +0 -0
  102. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/fixtures/spring_boot_minimal/pom.xml +0 -0
  103. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/ausente/application/service/FindAusenteService.java +0 -0
  104. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/ausente/domain/entities/Ausente.java +0 -0
  105. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/ausente/infrastructure/rest/AusenteRestController.java +0 -0
  106. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/autocoberturas/application/service/FindAutocoberturasService.java +0 -0
  107. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/autocoberturas/domain/entities/Autocoberturas.java +0 -0
  108. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/autocoberturas/infrastructure/rest/AutocoberturasRestController.java +0 -0
  109. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/calendarioTrabajador/application/service/FindCalendarioTrabajadorService.java +0 -0
  110. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/calendarioTrabajador/domain/entities/CalendarioTrabajador.java +0 -0
  111. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/calendarioTrabajador/infrastructure/rest/CalendarioTrabajadorRestController.java +0 -0
  112. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/departamento/application/service/FindDepartamentoService.java +0 -0
  113. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/departamento/domain/entities/Departamento.java +0 -0
  114. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/departamento/infrastructure/rest/DepartamentoRestController.java +0 -0
  115. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/empleado/application/service/FindEmpleadoService.java +0 -0
  116. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/empleado/domain/entities/Empleado.java +0 -0
  117. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/empleado/infrastructure/rest/EmpleadoRestController.java +0 -0
  118. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/DemoApplication.java +0 -0
  119. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/config/FilterConfig.java +0 -0
  120. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/domain/Health.java +0 -0
  121. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/mapper/HealthMapper.java +0 -0
  122. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/repository/HealthRepository.java +0 -0
  123. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/service/HealthService.java +0 -0
  124. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/web/HealthRestController.java +0 -0
  125. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/web/NominaRestController.java +0 -0
  126. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/fixtures/spring_boot_minimal/src/main/resources/application-dev.yml +0 -0
  127. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/fixtures/spring_boot_minimal/src/main/resources/application.yml +0 -0
  128. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/fixtures/spring_boot_minimal/src/main/resources/mapper/HealthMapper.xml +0 -0
  129. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_architecture_analyzer.py +0 -0
  130. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_architecture_summary.py +0 -0
  131. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_ast_extractor.py +0 -0
  132. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_block1_reliability.py +0 -0
  133. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_block2_coverage.py +0 -0
  134. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_block5_quality.py +0 -0
  135. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_bug_fixes_v16.py +0 -0
  136. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_classifier.py +0 -0
  137. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_cli.py +0 -0
  138. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_code_notes_analyzer.py +0 -0
  139. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_context_scorer.py +0 -0
  140. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_contract_pipeline.py +0 -0
  141. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_coverage_parser.py +0 -0
  142. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_cross_consistency.py +0 -0
  143. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_dependency_analyzer_node_python.py +0 -0
  144. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_dependency_analyzer_polyglot.py +0 -0
  145. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_dependency_schema.py +0 -0
  146. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_detector_dotnet.py +0 -0
  147. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_detector_go_rust_java.py +0 -0
  148. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_detector_nodejs.py +0 -0
  149. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_detector_php_ruby_dart.py +0 -0
  150. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_detector_python.py +0 -0
  151. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_detector_universal_managed.py +0 -0
  152. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_detector_universal_systems.py +0 -0
  153. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_detectors_base.py +0 -0
  154. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_doc_analyzer_jsdom.py +0 -0
  155. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_doc_analyzer_python.py +0 -0
  156. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_encoding_regression.py +0 -0
  157. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_graph_analyzer_polyglot.py +0 -0
  158. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_graph_analyzer_python_node.py +0 -0
  159. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_graph_schema.py +0 -0
  160. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_hybrid_inference.py +0 -0
  161. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_integration.py +0 -0
  162. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_integration_dependencies.py +0 -0
  163. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_integration_detection.py +0 -0
  164. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_integration_docs.py +0 -0
  165. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_integration_graph_modules.py +0 -0
  166. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_integration_lqn.py +0 -0
  167. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_integration_metrics.py +0 -0
  168. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_integration_multistack.py +0 -0
  169. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_integration_semantics.py +0 -0
  170. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_integration_universal.py +0 -0
  171. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_java_spring_integration.py +0 -0
  172. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_metrics_analyzer.py +0 -0
  173. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_packaging.py +0 -0
  174. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_phase1_improvements.py +0 -0
  175. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_pipeline_integrity.py +0 -0
  176. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_real_projects.py +0 -0
  177. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_redactor.py +0 -0
  178. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_scanner.py +0 -0
  179. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_schema.py +0 -0
  180. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_schema_normalization.py +0 -0
  181. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_semantic_analyzer_node.py +0 -0
  182. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_semantic_analyzer_python.py +0 -0
  183. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_semantic_import_resolution.py +0 -0
  184. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_semantic_schema.py +0 -0
  185. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_signal_hierarchy.py +0 -0
  186. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_summarizer.py +0 -0
  187. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_surface_honesty.py +0 -0
  188. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_task_differentiation.py +0 -0
  189. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_telemetry.py +0 -0
  190. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_v1_10_regressions.py +0 -0
  191. {sourcecode-1.30.6 → sourcecode-1.30.8}/tests/test_workspace_analyzer.py +0 -0
@@ -0,0 +1,173 @@
1
+ # Continue Here — atlas-cli sesión 10
2
+
3
+ **Paused:** 2026-05-16 (sesión 10)
4
+ **Repo:** `/Users/user/Downloads/atlas-cli`
5
+ **Branch:** master
6
+ **Último commit:** `f269c64` — (fix)solucionando bug de review-pr en repos masivos
7
+ **Working tree:** CLEAN
8
+
9
+ ---
10
+
11
+ ## Lo que se hizo esta sesión
12
+
13
+ ### Fix 1: Contrato de verdad en `behavioral_impact` (Fase 1 del rediseño)
14
+
15
+ Motivación: output parecía "falsa autoridad" — emitía paths sin indicar nivel de evidencia.
16
+
17
+ **Cambios en `flow_analyzer.py`:**
18
+
19
+ Nuevas helpers:
20
+ - `_classify_evidence_type(clean, class_name)` → `"direct_injection" | "direct_call" | "heuristic_only" | "none"`
21
+ - `_worst_evidence(levels)` → evidencia más débil de la cadena
22
+ - `_compute_confidence(evidence_level, trace_len)` → `"high" | "medium" | "low"`
23
+ - `_build_trace_step(source, target, evidence_type)` → e.g. `"ArticleController injects ArticleFavoriteService"`
24
+ - `_impact_item(statement, support, certainty)` → dict con 3 campos
25
+
26
+ **Nuevo schema de cada entry en `behavioral_impact`:**
27
+
28
+ ```json
29
+ {
30
+ "entry_point": "ArticleController.favoriteArticle",
31
+ "affected_path": ["ArticleFavoriteService.favorite", "ArticleFavoriteRepository.save"],
32
+ "impact": [
33
+ {
34
+ "statement": "article favorite persistence affected",
35
+ "support": "ArticleFavoriteRepository is a repository in path",
36
+ "certainty": "medium"
37
+ }
38
+ ],
39
+ "end_state": "DB write",
40
+ "confidence": "high",
41
+ "evidence_level": "direct_injection",
42
+ "trace": [
43
+ "ArticleController injects ArticleFavoriteService",
44
+ "ArticleFavoriteService injects ArticleFavoriteRepository"
45
+ ]
46
+ }
47
+ ```
48
+
49
+ Regla: no trace → no entry. `heuristic_only` → confidence máximo `low`.
50
+ Scope de `impact`: solo persistence + security annotations + `@Transactional`.
51
+
52
+ ---
53
+
54
+ ### Fix 2: Git-first scope resolution para `review-pr`
55
+
56
+ Motivación: `review-pr` colgaba en repos grandes (Broadleaf Commerce) por traversal completo del filesystem antes de conocer el scope.
57
+
58
+ **Nuevo flujo:**
59
+ ```
60
+ ANTES: filesystem scan → heuristics → analysis
61
+ AHORA: git diff → scope resolution → targeted loading → analysis
62
+ ```
63
+
64
+ **Cambios en `prepare_context.py`:**
65
+
66
+ Nuevos métodos en `TaskContextBuilder`:
67
+ - `_resolve_git_root()` → `git rev-parse --show-toplevel`
68
+ - `_get_pr_scope_files(since)` → union de `git diff HEAD~1` + `git diff HEAD` + staged + untracked; filtra paths `../`
69
+ - `_expand_scope_for_analysis(scope_files)` → scope files + siblings en mismos directorios (depth=1)
70
+
71
+ Nuevo Step 0 en `build()` (antes del scanner):
72
+ - Resuelve git root + scope completo
73
+ - Early returns para no-git y ref inválida (sin hacer ningún scan)
74
+
75
+ Step 1 (scanner) — rama git-first:
76
+ - Skip `AdaptiveScanner` completamente → `file_tree = {}`
77
+ - `all_paths = _expand_scope_for_analysis(scope_files)` (bounded context para behavioral_impact)
78
+
79
+ Step 2 (detection) — rama git-first:
80
+ - Skip workspace sub-scans (cada workspace corría su propio `AdaptiveScanner`)
81
+
82
+ Step 5d — simplificado:
83
+ - Ya no re-corre git (scope pre-resuelto en step 0)
84
+ - Solo: `_delta_files = set(_pr_scope_files)`
85
+
86
+ Nuevos campos en `TaskOutput`: `scope_source`, `scope_files`, `repo_root`.
87
+
88
+ Output JSON nuevo bloque:
89
+ ```json
90
+ "scope": {
91
+ "source": "git_diff,untracked",
92
+ "files": [...],
93
+ "repo_root": "/path/to/repo"
94
+ }
95
+ ```
96
+
97
+ **Tiempo real:** 1.2s (antes: ∞ en Broadleaf).
98
+
99
+ ---
100
+
101
+ ## Estado de tests
102
+
103
+ ```
104
+ 777 passed, 3 skipped, 1 deselected
105
+ ```
106
+
107
+ ---
108
+
109
+ ## Commits de esta sesión
110
+
111
+ | Hash | Descripción |
112
+ |------|-------------|
113
+ | `fc861e1` | (fix)incrementando representatividad del análisis de flujo |
114
+ | `f269c64` | (fix)solucionando bug de review-pr en repos masivos |
115
+
116
+ ---
117
+
118
+ ## Pendiente
119
+
120
+ 1. **Smoke test `behavioral_impact`** en repo real spring-boot:
121
+ ```bash
122
+ cd ~/Documents/workspace/spring-boot-realworld-example-app
123
+ sourcecode prepare-context review-pr . 2>/dev/null | python3 -c "
124
+ import json, sys
125
+ d = json.load(sys.stdin)
126
+ for bi in d.get('behavioral_impact', []):
127
+ print('entry:', bi['entry_point'])
128
+ print('confidence:', bi['confidence'])
129
+ print('trace:', bi['trace'])
130
+ print()
131
+ "
132
+ ```
133
+
134
+ 2. **Smoke test en Broadleaf Commerce** — verificar que no cuelga:
135
+ ```bash
136
+ cd ~/Documents/workspace/broadleaf-commerce
137
+ time sourcecode prepare-context review-pr . 2>/dev/null | python3 -c "
138
+ import json, sys
139
+ d = json.load(sys.stdin)
140
+ print('scope_source:', d.get('scope', {}).get('source'))
141
+ print('scope_files:', len(d.get('scope', {}).get('files', [])))
142
+ "
143
+ ```
144
+
145
+ 3. **Evaluar si `execution_paths` sigue siendo útil** o si `behavioral_impact` lo reemplaza.
146
+
147
+ 4. **Fase 2 del rediseño behavioral_impact** — smoke en Broadleaf, medir false positives.
148
+
149
+ 5. **Tests unitarios para `_classify_diff_severity`** — sin tests.
150
+
151
+ 6. **`User.java` clasificado como `"source"` no `"domain_model"`** — fix opcional.
152
+
153
+ ---
154
+
155
+ ## Para retomar
156
+
157
+ ```bash
158
+ cd /Users/user/Downloads/atlas-cli
159
+ git log --oneline -3
160
+
161
+ python3 -m pytest tests/ \
162
+ --ignore=tests/test_block2_coverage.py \
163
+ --ignore=tests/test_packaging.py \
164
+ --deselect=tests/test_dependency_analyzer_node_python.py::test_python_requirements_without_lockfile_keeps_declared_versions \
165
+ -q
166
+ # Expected: 777 passed
167
+
168
+ python3 -m pytest tests/test_v1_10_regressions.py::TestBehavioralImpact tests/test_v1_10_regressions.py::TestReviewPrSuspectedAreas -v
169
+ ```
170
+
171
+ ---
172
+
173
+ *Pausado 2026-05-16 sesión 10 — gsd:pause-work*
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sourcecode
3
- Version: 1.30.6
3
+ Version: 1.30.8
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.6-blue)
224
+ ![Version](https://img.shields.io/badge/version-1.30.8-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.6
260
+ # sourcecode 1.30.8
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.6-blue)
5
+ ![Version](https://img.shields.io/badge/version-1.30.8-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.6
41
+ # sourcecode 1.30.8
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.6"
7
+ version = "1.30.8"
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.6"
3
+ __version__ = "1.30.8"
@@ -1760,7 +1760,7 @@ def prepare_context_cmd(
1760
1760
  out["architecture_summary"] = output.architecture_summary
1761
1761
  if _task_include("confidence"):
1762
1762
  out["confidence"] = output.confidence
1763
- if _task_include("relevant_files"):
1763
+ if task != "review-pr" and _task_include("relevant_files"):
1764
1764
  out["relevant_files"] = [
1765
1765
  {k: v for k, v in asdict(f).items() if v != ""}
1766
1766
  for f in output.relevant_files
@@ -1862,6 +1862,11 @@ def prepare_context_cmd(
1862
1862
  out["configuration_impact"] = output.configuration_impact
1863
1863
  if output.test_coverage_risk:
1864
1864
  out["test_coverage_risk"] = output.test_coverage_risk
1865
+ # honest split: runtime files vs build artifacts — no mixed ranking
1866
+ if output.runtime_changes:
1867
+ out["runtime_changes"] = output.runtime_changes
1868
+ if output.build_changes:
1869
+ out["build_changes"] = output.build_changes
1865
1870
  if output.review_hotspots:
1866
1871
  out["review_hotspots"] = output.review_hotspots
1867
1872
  if output.suggested_review_order:
@@ -364,7 +364,8 @@ def _domain_from_class(class_name: str) -> str:
364
364
 
365
365
 
366
366
  def _impact_item(statement: str, support: str, certainty: str) -> dict:
367
- return {"statement": statement, "support": support, "certainty": certainty}
367
+ truth_level = "observed" if certainty == "high" else "inferred"
368
+ return {"statement": statement, "support": support, "certainty": certainty, "truth_level": truth_level}
368
369
 
369
370
 
370
371
  def _impact_descriptions(
@@ -380,14 +381,14 @@ def _impact_descriptions(
380
381
 
381
382
  if changed_type in _REPO_ARTIFACT_TYPES:
382
383
  items.append(_impact_item(
383
- f"{domain} persistence affected" if domain else "persistence affected",
384
- f"{changed_class} is a repository in path",
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",
385
386
  certainty,
386
387
  ))
387
388
  elif changed_type in _SERVICE_ARTIFACT_TYPES:
388
389
  if end_state == "DB write":
389
390
  items.append(_impact_item(
390
- f"{domain} persistence affected" if domain else "persistence affected",
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)",
391
392
  f"{changed_class} delegates to repository with DB write",
392
393
  certainty,
393
394
  ))
@@ -439,7 +440,7 @@ def _impact_descriptions_for_controller(
439
440
  domain = d
440
441
  break
441
442
  items.append(_impact_item(
442
- f"{domain} persistence affected" if domain else "data persistence affected",
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)",
443
444
  "repository with DB write detected in path",
444
445
  certainty,
445
446
  ))
@@ -357,6 +357,9 @@ class TaskOutput:
357
357
  scope_source: Optional[str] = None # "git_diff" | "staged" | "untracked" | "full_scan_fallback"
358
358
  scope_files: list[str] = field(default_factory=list)
359
359
  repo_root: Optional[str] = None
360
+ # honest output schema (review-pr only): runtime vs build split
361
+ runtime_changes: list[dict] = field(default_factory=list)
362
+ build_changes: dict = field(default_factory=dict)
360
363
 
361
364
 
362
365
  # ─────────────────────────────────────────────────────────────────────────────
@@ -416,6 +419,26 @@ _ALL_EXTENSIONS: frozenset[str] = _SOURCE_EXTENSIONS | frozenset({
416
419
  ".md", ".toml", ".yaml", ".yml", ".json", ".xml",
417
420
  })
418
421
 
422
+ _ARTIFACT_CHANGE_EFFECT: dict[str, str] = {
423
+ "entrypoint": "may affect application startup, CLI entry, or framework bootstrap — all request flows may be affected (inferred from role)",
424
+ "controller": "may alter HTTP routing, API contract, or response shape — API consumers may be affected (inferred from role)",
425
+ "service": "may change business rules, transaction scope, or orchestration logic — callers and dependents may be affected (inferred from role)",
426
+ "repository": "may modify persistence queries or data access patterns — verify data consistency and service layer (inferred from role)",
427
+ "mapper": "may alter SQL-to-object binding or query templates — data shape and repositories may be affected (inferred from role)",
428
+ "security": "may change authentication flow, access control rules, or session handling — all secured endpoints may be affected (inferred from role)",
429
+ "spring_config": "may modify bean wiring, datasource, or framework-wide settings — wired beans potentially affected (inferred from role)",
430
+ "spring_profile": "may change environment-specific overrides — behavior may differ per active profile (inferred from role)",
431
+ "config": "may adjust configuration values — all modules reading this config may be affected (inferred from role)",
432
+ "build_manifest": "changes dependencies, plugins, or project structure — compile-time and runtime classpath affected",
433
+ "db_migration": "modifies database schema — existing queries, mappings, and constraints may break",
434
+ "domain_model": "may alter entity structure — may cascade to repositories, DTOs, serializers, and mappers (inferred from role)",
435
+ "dto": "may change data transfer contract — serialization and API consumers may break (inferred from role)",
436
+ "test": "modifies test coverage or test behavior — no production code affected",
437
+ "documentation": "updates documentation only — no runtime impact",
438
+ "ide_noise": "IDE/tooling artifact — no application impact",
439
+ "source": "modifies application source — artifact role derived from file path structure",
440
+ }
441
+
419
442
  # Maps frontend symptom keywords → backend terms likely to contain the root cause.
420
443
  # Used to boost service/interceptor files when the symptom is UI-only.
421
444
  _FRONTEND_SYMPTOM_MAP: dict[str, list[str]] = {
@@ -830,6 +853,8 @@ class TaskContextBuilder:
830
853
  _pr_review_hotspots: list[str] = []
831
854
  _pr_suggested_review_order: list[str] = []
832
855
  _pr_base_ref: Optional[str] = None
856
+ _pr_runtime_changes: list[dict] = []
857
+ _pr_build_changes: dict = {}
833
858
 
834
859
  if task_name == "review-pr":
835
860
  _pr_base_ref = since or "HEAD"
@@ -879,14 +904,21 @@ class TaskContextBuilder:
879
904
  "risk_level": _test_risk_level,
880
905
  }
881
906
 
882
- # Review hotspots: top changed files ranked by impact score
907
+ # Pre-classify changed files once reused for hotspots, order, and runtime/build split
908
+ _pr_changed_cls: dict[str, dict] = {
909
+ f: self._classify_changed_file(f) for f in (_delta_files or set())
910
+ }
911
+
912
+ # Review hotspots: top changed RUNTIME files ranked by impact score — no build artifacts
883
913
  _pr_review_hotspots = sorted(
884
- _delta_files or set(),
914
+ [f for f, cls in _pr_changed_cls.items()
915
+ if not cls["is_noise"] and cls["artifact_type"] != "build_manifest"],
885
916
  key=lambda f: _delta_impact_score_per_file.get(f, 0.0),
886
917
  reverse=True,
887
918
  )[:8]
888
919
 
889
920
  # Suggested review order: security first, then api → service → persistence → config
921
+ # build_manifest is intentionally absent from _ORDER_TYPES
890
922
  _ORDER_TYPES = ["security", "controller", "service", "repository", "mapper",
891
923
  "spring_config", "config", "domain_model", "dto"]
892
924
  _seen_order: set[str] = set()
@@ -894,7 +926,7 @@ class TaskContextBuilder:
894
926
  for _ra in _delta_risk_areas:
895
927
  for _f in _ra.get("affected_files", []):
896
928
  if _f not in _seen_order:
897
- _cls = self._classify_changed_file(_f)
929
+ _cls = _pr_changed_cls.get(_f) or self._classify_changed_file(_f)
898
930
  if _cls["artifact_type"] == _otype:
899
931
  _pr_suggested_review_order.append(_f)
900
932
  _seen_order.add(_f)
@@ -903,6 +935,60 @@ class TaskContextBuilder:
903
935
  _pr_suggested_review_order.append(_f)
904
936
  _seen_order.add(_f)
905
937
 
938
+ # Build runtime_changes and build_changes — honest split, no score numbers
939
+ _pr_runtime_changes: list[dict] = []
940
+ _pr_build_changes: dict = {}
941
+ _build_artifact_files: list[str] = []
942
+
943
+ _SCORE_TO_CONFIDENCE = {
944
+ "high": lambda s: s >= 0.60,
945
+ "medium": lambda s: 0.40 <= s < 0.60,
946
+ }
947
+
948
+ for _f in sorted(_delta_files or set()):
949
+ _f_cls = _pr_changed_cls.get(_f) or self._classify_changed_file(_f)
950
+ _f_atype = _f_cls["artifact_type"]
951
+ if _f_cls["is_noise"]:
952
+ continue
953
+ if _f_atype == "build_manifest":
954
+ _build_artifact_files.append(_f)
955
+ continue
956
+ # role: always "inferred" — no runtime evidence for role classification
957
+ _cls_conf = _f_cls["confidence"] # "high"|"medium"|"low" from _classify_changed_file
958
+ _role_basis = "naming" if _cls_conf == "high" else ("path" if _cls_conf == "medium" else "extension")
959
+ _role_obj = {
960
+ "type": "inferred",
961
+ "confidence": "medium" if _cls_conf == "high" else "low",
962
+ "basis": _role_basis,
963
+ }
964
+ # evidence: list what we actually know
965
+ _evidence: list[str] = ["changed in git diff"]
966
+ _f_module = _f_cls.get("module", "")
967
+ if _f_module:
968
+ _evidence.append(f"matched module path: {_f_module}")
969
+ _evidence.append("NO call graph evidence")
970
+ # file confidence: replaces numeric score
971
+ _impact_s = _delta_impact_score_per_file.get(_f, 0.45)
972
+ _f_conf = "high" if _impact_s >= 0.60 else ("medium" if _impact_s >= 0.40 else "low")
973
+ _pr_runtime_changes.append({
974
+ "path": _f,
975
+ "role": _role_obj,
976
+ "confidence": _f_conf,
977
+ "artifact_type": _f_atype,
978
+ "evidence": _evidence,
979
+ "change_effect": {
980
+ "statement": _ARTIFACT_CHANGE_EFFECT.get(_f_atype, "may modify application logic (role inferred from path)"),
981
+ "truth_level": "inferred",
982
+ "confidence": _role_obj["confidence"],
983
+ },
984
+ })
985
+
986
+ if _build_artifact_files:
987
+ _pr_build_changes = {
988
+ "files": _build_artifact_files,
989
+ "impact": "dependency/configuration only",
990
+ }
991
+
906
992
  # ── 6d. review-pr: execution paths + behavioral impact ──────────────
907
993
  _execution_paths: list[dict] = []
908
994
  _behavioral_impact: list[dict] = []
@@ -1158,6 +1244,9 @@ class TaskContextBuilder:
1158
1244
  scope_source=_pr_scope_source if task_name == "review-pr" else None,
1159
1245
  scope_files=list(_pr_scope_files) if task_name == "review-pr" and _pr_scope_files else [],
1160
1246
  repo_root=str(_pr_git_root) if task_name == "review-pr" and _pr_git_root else None,
1247
+ # honest output schema: runtime vs build split (review-pr only)
1248
+ runtime_changes=_pr_runtime_changes,
1249
+ build_changes=_pr_build_changes,
1161
1250
  )
1162
1251
 
1163
1252
  def render_prompt(self, output: TaskOutput) -> str:
@@ -1990,26 +2079,8 @@ class TaskContextBuilder:
1990
2079
  "build_manifest": frozenset(),
1991
2080
  }
1992
2081
 
1993
- # deterministic change_effect descriptions per artifact type
1994
- _CHANGE_EFFECT: dict[str, str] = {
1995
- "entrypoint": "modifies application startup, CLI entry, or framework bootstrap — all request flows may be affected",
1996
- "controller": "alters HTTP routing, API contract, or response shape — API consumers are affected",
1997
- "service": "changes business rules, transaction scope, or orchestration logic — callers and dependents affected",
1998
- "repository": "modifies persistence queries or data access patterns — data consistency and service layer affected",
1999
- "mapper": "alters SQL-to-object binding or query templates — data shape and repositories affected",
2000
- "security": "changes authentication flow, access control rules, or session handling — all secured endpoints affected",
2001
- "spring_config": "modifies bean wiring, datasource, or framework-wide settings — all wired beans potentially affected",
2002
- "spring_profile": "changes environment-specific overrides — behavior differs per active profile",
2003
- "config": "adjusts configuration values — all modules reading this config are affected",
2004
- "build_manifest": "changes dependencies, plugins, or project structure — compile-time and runtime classpath affected",
2005
- "db_migration": "modifies database schema — existing queries, mappings, and constraints may break",
2006
- "domain_model": "alters entity structure — cascades to repositories, DTOs, serializers, and mappers",
2007
- "dto": "changes data transfer contract — serialization and API consumers may break",
2008
- "test": "modifies test coverage or test behavior — no production code affected",
2009
- "documentation": "updates documentation only — no runtime impact",
2010
- "ide_noise": "IDE/tooling artifact — no application impact",
2011
- "source": "modifies application source — artifact role derived from file path structure",
2012
- }
2082
+ # use module-level constant (single source of truth)
2083
+ _CHANGE_EFFECT = _ARTIFACT_CHANGE_EFFECT
2013
2084
 
2014
2085
  # change_type taxonomy — closed set, derived from artifact type
2015
2086
  _ARTIFACT_CHANGE_TYPES: dict[str, list[str]] = {
@@ -2454,19 +2525,19 @@ class TaskContextBuilder:
2454
2525
  def _runtime_impact(tc: dict[str, int]) -> list[str]:
2455
2526
  _ri: list[str] = []
2456
2527
  if "entrypoint" in tc:
2457
- _ri.append("Application bootstrap modified — full context restart required before deploy")
2528
+ _ri.append("Entrypoint-classified file modified — may require full context restart before deploy (role inferred from path)")
2458
2529
  if "spring_config" in tc:
2459
- _ri.append("Spring ApplicationContext bean wiring modified — dependent beans rewired on restart")
2530
+ _ri.append("Spring config-classified file modified — wired beans may be rewired on restart (role inferred from path)")
2460
2531
  if "security" in tc:
2461
- _ri.append("Security filter chain modified — all secured endpoints affected after restart")
2532
+ _ri.append("Security-classified file modified — secured endpoints may be affected after restart (role inferred from path)")
2462
2533
  if "db_migration" in tc:
2463
2534
  _ri.append("Database schema migration pending — execute before deploying application")
2464
2535
  _svc = tc.get("service", 0)
2465
2536
  if _svc >= 2:
2466
- _ri.append(f"{_svc} service(s) modified — verify transaction scope and data consistency")
2537
+ _ri.append(f"{_svc} service-classified file(s) modified — verify transaction scope and data consistency (role inferred from path)")
2467
2538
  _repo = tc.get("repository", 0) + tc.get("mapper", 0)
2468
2539
  if _repo > 0:
2469
- _ri.append(f"{_repo} persistence component(s) modified — verify data access queries")
2540
+ _ri.append(f"{_repo} persistence-classified component(s) modified — verify data access queries (role inferred from path)")
2470
2541
  if "build_manifest" in tc:
2471
2542
  _ri.append("Build manifest modified — dependency resolution required before compile")
2472
2543
  return _ri
@@ -1,163 +0,0 @@
1
- # Continue Here — atlas-cli sesión 9
2
-
3
- **Paused:** 2026-05-16 (sesión 9)
4
- **Repo:** `/Users/user/Downloads/atlas-cli`
5
- **Branch:** master
6
- **Último commit:** `88e1ebd` — Actualizando README
7
- **Working tree:** DIRTY (sin commit — usuario pidió "no hagas commit" esta sesión)
8
-
9
- ---
10
-
11
- ## Lo que se hizo esta sesión
12
-
13
- ### Fix: test regresivo stale en `test_signal_hierarchy.py`
14
-
15
- `test_prepare_context_review_pr_task` esperaba exit_code 0 pero la nueva conducta (desde `7085e97`) devuelve exit_code 1 cuando no hay diff. El test corría contra atlas-cli (no tmp_project — el arg se consume por `_preprocess_args`), entonces era frágil: con cambios pendientes en atlas-cli → exit 0, sin cambios → exit 1.
16
-
17
- **Fix:** test acepta ambos exit codes y verifica estructura JSON en cada caso.
18
-
19
- ---
20
-
21
- ### Feature: `behavioral_impact` para `review-pr`
22
-
23
- Nueva capability: en vez de "archivos relacionados por heurística", modelar impacto causal del cambio.
24
-
25
- **Nueva sección top-level en output de review-pr:**
26
- ```json
27
- {
28
- "behavioral_impact": [{
29
- "entry_point": "ArticleController.favoriteArticle",
30
- "affected_path": ["ArticleFavoriteService.favorite", "ArticleFavoriteRepository.save"],
31
- "impact": ["article favorite persistence affected"],
32
- "end_state": "DB write"
33
- }]
34
- }
35
- ```
36
-
37
- **Dos traversals:**
38
-
39
- | Archivo cambiado | Estrategia | entry_point |
40
- |---|---|---|
41
- | Controller | Forward: ctrl → svc → repo | El propio controller |
42
- | Service/Repo/Domain | Reverse: buscar qué controller inyecta/llama la cadena | Controller que lo usa |
43
-
44
- **Reverse lookup:** primero directo (ctrl usa clase directamente), luego indirecto (ctrl → svc mediador → clase cambiada).
45
-
46
- **Impact generation:** basado en artifact_type + end_state + nombre de clase sin sufijo:
47
- - Repository → `"X persistence affected"`
48
- - Service + DB write → `"X data persistence behavior may change"`
49
- - Service + event → `"X event emission affected"`
50
- - + si hay `@PreAuthorize`/`@Secured` en controller → `"authorization check present on entry point"`
51
-
52
- **Sin evidencia → no emitir path.** `_has_code_evidence` gate en cada paso.
53
-
54
- ---
55
-
56
- ## Archivos modificados (sin commit)
57
-
58
- | Archivo | Cambio |
59
- |---------|--------|
60
- | `src/sourcecode/flow_analyzer.py` | `analyze_behavioral_impact()` + helpers `_domain_from_class`, `_impact_descriptions`, `_impact_descriptions_for_controller` (~205 líneas nuevas) |
61
- | `src/sourcecode/prepare_context.py` | Campo `behavioral_impact` en `TaskOutput`, bloque 6d llama `analyze_behavioral_impact` |
62
- | `src/sourcecode/cli.py` | Serializa `behavioral_impact` en output de review-pr |
63
- | `tests/test_signal_hierarchy.py` | Fix stale test `test_prepare_context_review_pr_task` |
64
- | `tests/test_v1_10_regressions.py` | Clase `TestBehavioralImpact` con 5 tests unitarios |
65
-
66
- ---
67
-
68
- ## Tests al pausar
69
-
70
- ```
71
- 777 passed, 3 skipped, 1 deselected
72
- ```
73
-
74
- Los 5 tests nuevos en `TestBehavioralImpact` pasan:
75
- - `test_service_change_finds_controller_entry_point` ✓
76
- - `test_repository_change_finds_controller_via_service` ✓
77
- - `test_controller_change_forward_traversal` ✓
78
- - `test_no_evidence_returns_empty` ✓
79
- - `test_impact_strings_describe_behavior_not_files` ✓
80
-
81
- ---
82
-
83
- ## Pendiente de sesión anterior (sigue vigente)
84
-
85
- 1. **Smoke test `delta`** — verificar Fix 1-3 (BFS module constraint) no afecta `delta`:
86
- ```bash
87
- cd ~/Documents/workspace/spring-boot-realworld-example-app
88
- sourcecode prepare-context delta . --since HEAD~1 2>/dev/null | python3 -c "
89
- import json,sys; d=json.load(sys.stdin)
90
- print('relevant_files:', len(d.get('relevant_files', [])))
91
- "
92
- ```
93
-
94
- 2. **Smoke test `security_change` path** — cambio real en auth logic debe expandir security chain.
95
-
96
- 3. **Tests unitarios para `_classify_diff_severity`** — sin tests actualmente.
97
-
98
- 4. **`User.java` clasificado como `"source"` no `"domain_model"`** — fix opcional en `_classify_changed_file`.
99
-
100
- 5. **Smoke tests saint-server** — pendiente sesión 4/5.
101
-
102
- ---
103
-
104
- ## Pendiente de esta sesión (nuevo)
105
-
106
- 1. **COMMIT** — toda la sesión sin commit. Hacer commit:
107
- ```bash
108
- git add src/sourcecode/flow_analyzer.py \
109
- src/sourcecode/prepare_context.py \
110
- src/sourcecode/cli.py \
111
- tests/test_signal_hierarchy.py \
112
- tests/test_v1_10_regressions.py
113
- git commit -m "feat(review-pr): behavioral_impact — impacto causal de cambio, no expansión heurística"
114
- ```
115
-
116
- 2. **Smoke test `behavioral_impact`** en repo real:
117
- ```bash
118
- /Users/user/.local/pipx/venvs/sourcecode/bin/python -m pip install -e . -q
119
- cd ~/Documents/workspace/spring-boot-realworld-example-app
120
- # Modificar un service (ej. ArticleFavoriteService.java) sin commit y correr:
121
- sourcecode prepare-context review-pr . 2>/dev/null | python3 -c "
122
- import json, sys
123
- d = json.load(sys.stdin)
124
- for bi in d.get('behavioral_impact', []):
125
- print('entry:', bi['entry_point'])
126
- print('path:', bi['affected_path'])
127
- print('impact:', bi['impact'])
128
- print('end_state:', bi['end_state'])
129
- print()
130
- "
131
- ```
132
-
133
- 3. **Evaluar si `execution_paths` sigue siendo útil** o si `behavioral_impact` lo reemplaza completamente. Ambos coexisten ahora.
134
-
135
- 4. **Impact generation refinement** — para service changes, `"X data persistence behavior may change"` es verbose. Podría simplificarse a `"X persistence affected"`.
136
-
137
- ---
138
-
139
- ## Para retomar
140
-
141
- ```bash
142
- cd /Users/user/Downloads/atlas-cli
143
- git log --oneline -3
144
- git diff --stat HEAD # verá los 5 archivos sin commit
145
-
146
- # Verificar import
147
- python3 -c "from sourcecode.flow_analyzer import analyze_behavioral_impact; print('OK')"
148
-
149
- # Tests completos
150
- python3 -m pytest tests/ \
151
- --ignore=tests/test_block2_coverage.py \
152
- --ignore=tests/test_packaging.py \
153
- --deselect=tests/test_dependency_analyzer_node_python.py::test_python_requirements_without_lockfile_keeps_declared_versions \
154
- -q
155
- # Expected: 777 passed
156
-
157
- # Tests nuevos específicamente
158
- python3 -m pytest tests/test_v1_10_regressions.py::TestBehavioralImpact -v
159
- ```
160
-
161
- ---
162
-
163
- *Pausado 2026-05-16 sesión 9 — gsd:pause-work*