pdd-cli 0.0.237__tar.gz → 0.0.239__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 (677) hide show
  1. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/PKG-INFO +3 -3
  2. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/README.md +12 -6
  3. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/agentic_change_orchestrator.py +11 -0
  4. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/agentic_checkup.py +7 -1
  5. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/agentic_common.py +20 -0
  6. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/agentic_sync.py +271 -31
  7. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/agentic_sync_runner.py +3 -1
  8. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/checkup_review_loop.py +355 -20
  9. pdd_cli-0.0.239/pdd/ci_drift_heal.py +1638 -0
  10. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/commands/checkup.py +16 -1
  11. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/core/duplicate_cli_guard.py +9 -0
  12. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/metadata_sync.py +22 -6
  13. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/pdd_completion.fish +1 -0
  14. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/pdd_completion.sh +2 -2
  15. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/pdd_completion.zsh +1 -0
  16. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/sync_determine_operation.py +9 -2
  17. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/update_main.py +171 -2
  18. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd_cli.egg-info/PKG-INFO +3 -3
  19. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd_cli.egg-info/SOURCES.txt +2 -0
  20. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pypi_description.rst +2 -2
  21. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pyproject.toml +2 -2
  22. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_change_orchestrator.py +25 -0
  23. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_common.py +134 -0
  24. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_sync.py +650 -45
  25. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_sync_runner.py +32 -0
  26. pdd_cli-0.0.239/tests/test_auto_heal_workflow.py +128 -0
  27. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_checkup_review_loop.py +1389 -0
  28. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_ci_drift_heal.py +607 -19
  29. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_duplicate_cli_guard.py +34 -2
  30. pdd_cli-0.0.239/tests/test_issue_1021_reproduction.py +584 -0
  31. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_sync_determine_operation.py +23 -1
  32. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_update_main.py +421 -13
  33. pdd_cli-0.0.237/pdd/ci_drift_heal.py +0 -1484
  34. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/LICENSE +0 -0
  35. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/__init__.py +0 -0
  36. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/__main__.py +0 -0
  37. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/_keyring_timeout.py +0 -0
  38. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/agentic_architecture.py +0 -0
  39. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/agentic_architecture_orchestrator.py +0 -0
  40. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/agentic_bug.py +0 -0
  41. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/agentic_bug_orchestrator.py +0 -0
  42. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/agentic_change.py +0 -0
  43. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/agentic_checkup_orchestrator.py +0 -0
  44. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/agentic_common_worktree.py +0 -0
  45. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/agentic_crash.py +0 -0
  46. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/agentic_e2e_fix.py +0 -0
  47. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/agentic_e2e_fix_orchestrator.py +0 -0
  48. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/agentic_fix.py +0 -0
  49. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/agentic_langtest.py +0 -0
  50. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/agentic_split.py +0 -0
  51. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/agentic_split_orchestrator.py +0 -0
  52. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/agentic_test.py +0 -0
  53. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/agentic_test_generate.py +0 -0
  54. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/agentic_test_orchestrator.py +0 -0
  55. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/agentic_update.py +0 -0
  56. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/agentic_verify.py +0 -0
  57. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/api_key_scanner.py +0 -0
  58. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/architecture_include_validation.py +0 -0
  59. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/architecture_registry.py +0 -0
  60. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/architecture_sync.py +0 -0
  61. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/architecture_sync_helper.py +0 -0
  62. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/auth_service.py +0 -0
  63. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/auto_deps_architecture.py +0 -0
  64. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/auto_deps_main.py +0 -0
  65. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/auto_include.py +0 -0
  66. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/auto_update.py +0 -0
  67. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/bug_main.py +0 -0
  68. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/bug_to_unit_test.py +0 -0
  69. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/change.py +0 -0
  70. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/change_main.py +0 -0
  71. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/ci_detect_changed_modules.py +0 -0
  72. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/ci_validation.py +0 -0
  73. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/cli.py +0 -0
  74. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/cli_detector.py +0 -0
  75. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/cmd_test_main.py +0 -0
  76. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/code_generator.py +0 -0
  77. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/code_generator_main.py +0 -0
  78. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/commands/__init__.py +0 -0
  79. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/commands/analysis.py +0 -0
  80. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/commands/auth.py +0 -0
  81. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/commands/connect.py +0 -0
  82. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/commands/extracts.py +0 -0
  83. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/commands/firecrawl.py +0 -0
  84. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/commands/fix.py +0 -0
  85. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/commands/generate.py +0 -0
  86. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/commands/maintenance.py +0 -0
  87. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/commands/misc.py +0 -0
  88. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/commands/modify.py +0 -0
  89. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/commands/report.py +0 -0
  90. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/commands/sessions.py +0 -0
  91. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/commands/templates.py +0 -0
  92. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/commands/utility.py +0 -0
  93. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/commands/which.py +0 -0
  94. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/comment_line.py +0 -0
  95. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/config_resolution.py +0 -0
  96. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/conflicts_in_prompts.py +0 -0
  97. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/conflicts_main.py +0 -0
  98. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/construct_paths.py +0 -0
  99. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/content_selector.py +0 -0
  100. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/context_generator.py +0 -0
  101. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/context_generator_main.py +0 -0
  102. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/continue_generation.py +0 -0
  103. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/core/__init__.py +0 -0
  104. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/core/cli.py +0 -0
  105. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/core/cloud.py +0 -0
  106. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/core/dump.py +0 -0
  107. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/core/errors.py +0 -0
  108. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/core/llm_trace.py +0 -0
  109. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/core/remote_session.py +0 -0
  110. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/core/utils.py +0 -0
  111. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/crash_main.py +0 -0
  112. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/data/arena_elo_manifest.json +0 -0
  113. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/data/language_format.csv +0 -0
  114. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/data/llm_model.csv +0 -0
  115. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/detect_change.py +0 -0
  116. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/detect_change_main.py +0 -0
  117. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/docs/prompting_guide.md +0 -0
  118. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/durable_sync_runner.py +0 -0
  119. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/edit_file.py +0 -0
  120. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/embed_retrieve.py +0 -0
  121. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/extracts_prune.py +0 -0
  122. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/failure_classification.py +0 -0
  123. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/find_section.py +0 -0
  124. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/firecrawl_cache.py +0 -0
  125. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/fix_code_loop.py +0 -0
  126. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/fix_code_module_errors.py +0 -0
  127. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/fix_error_loop.py +0 -0
  128. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/fix_errors_from_unit_tests.py +0 -0
  129. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/fix_main.py +0 -0
  130. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/fix_verification_errors.py +0 -0
  131. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/fix_verification_errors_loop.py +0 -0
  132. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/fix_verification_main.py +0 -0
  133. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/generate_model_catalog.py +0 -0
  134. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/generate_output_paths.py +0 -0
  135. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/generate_test.py +0 -0
  136. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/generation_completion.py +0 -0
  137. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/get_comment.py +0 -0
  138. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/get_extension.py +0 -0
  139. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/get_jwt_token.py +0 -0
  140. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/get_language.py +0 -0
  141. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/get_lint_commands.py +0 -0
  142. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/get_run_command.py +0 -0
  143. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/get_test_command.py +0 -0
  144. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/git_update.py +0 -0
  145. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/include_query_extractor.py +0 -0
  146. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/increase_tests.py +0 -0
  147. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/incremental_code_generator.py +0 -0
  148. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/incremental_prd_architecture.py +0 -0
  149. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/insert_includes.py +0 -0
  150. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/install_completion.py +0 -0
  151. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/json_atomic.py +0 -0
  152. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/list_drift_detection.py +0 -0
  153. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/llm_invoke.py +0 -0
  154. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/load_prompt_template.py +0 -0
  155. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/logo_animation.py +0 -0
  156. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/mcp_config.json +0 -0
  157. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/model_tester.py +0 -0
  158. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/one_session_sync.py +0 -0
  159. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/operation_log.py +0 -0
  160. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/path_resolution.py +0 -0
  161. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/pddrc_initializer.py +0 -0
  162. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/pin_example_hack.py +0 -0
  163. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/postprocess.py +0 -0
  164. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/postprocess_0.py +0 -0
  165. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/preprocess.py +0 -0
  166. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/preprocess_main.py +0 -0
  167. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/process_csv_change.py +0 -0
  168. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_arch_step10_completeness_LLM.prompt +0 -0
  169. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_arch_step11_sync_LLM.prompt +0 -0
  170. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_arch_step12_deps_LLM.prompt +0 -0
  171. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_arch_step13_fix_LLM.prompt +0 -0
  172. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_arch_step1_analyze_prd_LLM.prompt +0 -0
  173. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_arch_step1b_complexity_LLM.prompt +0 -0
  174. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_arch_step2_analyze_LLM.prompt +0 -0
  175. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_arch_step2b_codebase_scan_LLM.prompt +0 -0
  176. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_arch_step3_research_LLM.prompt +0 -0
  177. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_arch_step4_data_model_LLM.prompt +0 -0
  178. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_arch_step5_design_LLM.prompt +0 -0
  179. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_arch_step5b_completeness_gate_LLM.prompt +0 -0
  180. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_arch_step5b_fix_LLM.prompt +0 -0
  181. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_arch_step6_research_deps_LLM.prompt +0 -0
  182. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_arch_step7_generate_LLM.prompt +0 -0
  183. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_arch_step7b_review_LLM.prompt +0 -0
  184. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_arch_step8_5_context_docs_LLM.prompt +0 -0
  185. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_arch_step8_pddrc_LLM.prompt +0 -0
  186. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_arch_step9_prompts_LLM.prompt +0 -0
  187. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_arch_step9b_cross_audit_LLM.prompt +0 -0
  188. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_bug_step10_verify_LLM.prompt +0 -0
  189. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_bug_step11_e2e_test_LLM.prompt +0 -0
  190. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_bug_step12_pr_LLM.prompt +0 -0
  191. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_bug_step1_duplicate_LLM.prompt +0 -0
  192. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_bug_step2_docs_LLM.prompt +0 -0
  193. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_bug_step3_triage_LLM.prompt +0 -0
  194. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_bug_step4_api_research_LLM.prompt +0 -0
  195. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_bug_step5_reproduce_LLM.prompt +0 -0
  196. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_bug_step6_root_cause_LLM.prompt +0 -0
  197. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_bug_step7_prompt_classification_LLM.prompt +0 -0
  198. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_bug_step8_test_plan_LLM.prompt +0 -0
  199. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_bug_step9_generate_LLM.prompt +0 -0
  200. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_change_step10_architecture_update_LLM.prompt +0 -0
  201. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_change_step11_identify_issues_LLM.prompt +0 -0
  202. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_change_step12_fix_issues_LLM.prompt +0 -0
  203. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_change_step13_create_pr_LLM.prompt +0 -0
  204. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_change_step1_duplicate_LLM.prompt +0 -0
  205. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_change_step2_docs_LLM.prompt +0 -0
  206. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_change_step3_research_LLM.prompt +0 -0
  207. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_change_step4_clarify_LLM.prompt +0 -0
  208. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_change_step5_docs_change_LLM.prompt +0 -0
  209. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_change_step6_devunits_LLM.prompt +0 -0
  210. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_change_step7_architecture_LLM.prompt +0 -0
  211. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_change_step8_analyze_LLM.prompt +0 -0
  212. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_change_step9_implement_LLM.prompt +0 -0
  213. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_checkup_step1_discover_LLM.prompt +0 -0
  214. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_checkup_step2_deps_LLM.prompt +0 -0
  215. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_checkup_step3_build_LLM.prompt +0 -0
  216. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_checkup_step4_interfaces_LLM.prompt +0 -0
  217. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_checkup_step5_test_LLM.prompt +0 -0
  218. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_checkup_step6_1_fix_LLM.prompt +0 -0
  219. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_checkup_step6_2_regression_tests_LLM.prompt +0 -0
  220. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_checkup_step6_3_e2e_tests_LLM.prompt +0 -0
  221. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_checkup_step7_verify_LLM.prompt +0 -0
  222. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_checkup_step8_create_pr_LLM.prompt +0 -0
  223. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_crash_explore_LLM.prompt +0 -0
  224. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_e2e_fix_step10_ci_validation_LLM.prompt +0 -0
  225. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_e2e_fix_step11_code_cleanup_LLM.prompt +0 -0
  226. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_e2e_fix_step1_unit_tests_LLM.prompt +0 -0
  227. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_e2e_fix_step2_e2e_tests_LLM.prompt +0 -0
  228. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_e2e_fix_step3_root_cause_LLM.prompt +0 -0
  229. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_e2e_fix_step4_fix_e2e_tests_LLM.prompt +0 -0
  230. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_e2e_fix_step5_identify_devunits_LLM.prompt +0 -0
  231. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_e2e_fix_step6_create_unit_tests_LLM.prompt +0 -0
  232. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_e2e_fix_step7_verify_tests_LLM.prompt +0 -0
  233. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_e2e_fix_step8_run_pdd_fix_LLM.prompt +0 -0
  234. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_e2e_fix_step9_verify_all_LLM.prompt +0 -0
  235. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_fix_explore_LLM.prompt +0 -0
  236. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_fix_nonpython_LLM.prompt +0 -0
  237. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_fix_primary_LLM.prompt +0 -0
  238. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_split_step0_intent_LLM.prompt +0 -0
  239. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_split_step1_survey_LLM.prompt +0 -0
  240. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_split_step2_diagnose_LLM.prompt +0 -0
  241. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_split_step3_investigate_LLM.prompt +0 -0
  242. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_split_step4_propose_options_LLM.prompt +0 -0
  243. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_split_step6_extract_LLM.prompt +0 -0
  244. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_split_step6a_phase_extract_LLM.prompt +0 -0
  245. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_split_step7_assess_LLM.prompt +0 -0
  246. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_split_step8_repair_LLM.prompt +0 -0
  247. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_split_step9_refine_check_LLM.prompt +0 -0
  248. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_sync_fix_dry_run_LLM.prompt +0 -0
  249. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_sync_identify_modules_LLM.prompt +0 -0
  250. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_test_generate_LLM.prompt +0 -0
  251. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_test_step10_validate_LLM.prompt +0 -0
  252. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_test_step11_loop_LLM.prompt +0 -0
  253. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_test_step15_plan_validation_LLM.prompt +0 -0
  254. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_test_step16_run_tests_LLM.prompt +0 -0
  255. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_test_step1_duplicate_LLM.prompt +0 -0
  256. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_test_step2_docs_LLM.prompt +0 -0
  257. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_test_step3_clarify_LLM.prompt +0 -0
  258. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_test_step4_detect_frontend_LLM.prompt +0 -0
  259. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_test_step5_test_plan_LLM.prompt +0 -0
  260. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_test_step5b_enhance_plan_LLM.prompt +0 -0
  261. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_test_step6_coverage_LLM.prompt +0 -0
  262. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_test_step6_generate_tests_LLM.prompt +0 -0
  263. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_test_step7_checklist_LLM.prompt +0 -0
  264. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_test_step7_run_tests_LLM.prompt +0 -0
  265. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_test_step8_fix_iterate_LLM.prompt +0 -0
  266. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_test_step8_manual_test_LLM.prompt +0 -0
  267. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_test_step9_regression_LLM.prompt +0 -0
  268. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_test_step9_submit_pr_LLM.prompt +0 -0
  269. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_update_LLM.prompt +0 -0
  270. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/agentic_verify_explore_LLM.prompt +0 -0
  271. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/arrange_graph_layout_LLM.prompt +0 -0
  272. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/auto_include_LLM.prompt +0 -0
  273. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/bug_to_unit_test_LLM.prompt +0 -0
  274. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/change_LLM.prompt +0 -0
  275. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/code_patcher_LLM.prompt +0 -0
  276. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/conflict_LLM.prompt +0 -0
  277. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/continue_generation_LLM.prompt +0 -0
  278. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/core_dump_requirements_LLM.prompt +0 -0
  279. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/cross_issue_reconcile_LLM.prompt +0 -0
  280. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/detect_change_LLM.prompt +0 -0
  281. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/diff_analyzer_LLM.prompt +0 -0
  282. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/example_generator_LLM.prompt +0 -0
  283. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/extract_code_LLM.prompt +0 -0
  284. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/extract_conflict_LLM.prompt +0 -0
  285. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/extract_detect_change_LLM.prompt +0 -0
  286. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/extract_program_code_fix_LLM.prompt +0 -0
  287. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/extract_prompt_change_LLM.prompt +0 -0
  288. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/extract_prompt_split_LLM.prompt +0 -0
  289. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/extract_prompt_update_LLM.prompt +0 -0
  290. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/extract_promptline_LLM.prompt +0 -0
  291. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/extract_unit_code_fix_LLM.prompt +0 -0
  292. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/extract_xml_LLM.prompt +0 -0
  293. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/find_verification_errors_LLM.prompt +0 -0
  294. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/fix_code_module_errors_LLM.prompt +0 -0
  295. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/fix_errors_from_unit_tests_LLM.prompt +0 -0
  296. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/fix_verification_errors_LLM.prompt +0 -0
  297. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/generate_test_LLM.prompt +0 -0
  298. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/generate_test_from_example_LLM.prompt +0 -0
  299. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/include_query_extractor_LLM.prompt +0 -0
  300. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/increase_tests_LLM.prompt +0 -0
  301. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/incremental_prd_architecture_patch_LLM.prompt +0 -0
  302. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/insert_includes_LLM.prompt +0 -0
  303. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/one_session_agent_LLM.prompt +0 -0
  304. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/post_gen_verify_LLM.prompt +0 -0
  305. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/prompt_code_diff_LLM.prompt +0 -0
  306. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/prompt_diff_LLM.prompt +0 -0
  307. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/split_LLM.prompt +0 -0
  308. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/summarize_file_LLM.prompt +0 -0
  309. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/sync_analysis_LLM.prompt +0 -0
  310. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/trace_LLM.prompt +0 -0
  311. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/trim_results_LLM.prompt +0 -0
  312. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/trim_results_start_LLM.prompt +0 -0
  313. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/unfinished_prompt_LLM.prompt +0 -0
  314. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/update_prompt_LLM.prompt +0 -0
  315. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/prompts/xml_convertor_LLM.prompt +0 -0
  316. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/provider_manager.py +0 -0
  317. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/pytest_output.py +0 -0
  318. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/python_env_detector.py +0 -0
  319. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/reasoning.py +0 -0
  320. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/remote_session.py +0 -0
  321. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/render_mermaid.py +0 -0
  322. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/server/__init__.py +0 -0
  323. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/server/app.py +0 -0
  324. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/server/click_executor.py +0 -0
  325. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/server/executor.py +0 -0
  326. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/server/jobs.py +0 -0
  327. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/server/models.py +0 -0
  328. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/server/routes/__init__.py +0 -0
  329. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/server/routes/architecture.py +0 -0
  330. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/server/routes/auth.py +0 -0
  331. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/server/routes/commands.py +0 -0
  332. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/server/routes/config.py +0 -0
  333. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/server/routes/extracts.py +0 -0
  334. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/server/routes/files.py +0 -0
  335. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/server/routes/prompts.py +0 -0
  336. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/server/routes/websocket.py +0 -0
  337. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/server/security.py +0 -0
  338. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/server/terminal_spawner.py +0 -0
  339. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/server/token_counter.py +0 -0
  340. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/setup_tool.py +0 -0
  341. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/split.py +0 -0
  342. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/split_main.py +0 -0
  343. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/split_validation.py +0 -0
  344. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/summarize_directory.py +0 -0
  345. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/sync_animation.py +0 -0
  346. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/sync_graph_order_consistency.py +0 -0
  347. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/sync_main.py +0 -0
  348. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/sync_orchestration.py +0 -0
  349. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/sync_order.py +0 -0
  350. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/sync_tui.py +0 -0
  351. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/template_expander.py +0 -0
  352. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/template_registry.py +0 -0
  353. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/templates/architecture/architecture_json.prompt +0 -0
  354. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/templates/architecture/example_nextjs_task_notes.prompt +0 -0
  355. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/templates/architecture/example_python_backend.prompt +0 -0
  356. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/templates/architecture/pdd_path_construction_guide.prompt +0 -0
  357. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/templates/generic/generate_pddrc_YAML.prompt +0 -0
  358. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/templates/generic/generate_prompt.prompt +0 -0
  359. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/test_result.py +0 -0
  360. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/trace.py +0 -0
  361. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/trace_main.py +0 -0
  362. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/track_cost.py +0 -0
  363. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/unfinished_prompt.py +0 -0
  364. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/update_model_costs.py +0 -0
  365. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/update_prompt.py +0 -0
  366. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/user_story_tests.py +0 -0
  367. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/validate_prompt_includes.py +0 -0
  368. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd/xml_tagger.py +0 -0
  369. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd_cli.egg-info/dependency_links.txt +0 -0
  370. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd_cli.egg-info/entry_points.txt +0 -0
  371. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd_cli.egg-info/requires.txt +0 -0
  372. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/pdd_cli.egg-info/top_level.txt +0 -0
  373. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/setup.cfg +0 -0
  374. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_739_complete.py +0 -0
  375. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_739_e2e_synthetic.py +0 -0
  376. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_739_fixtures.py +0 -0
  377. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_arch_complexity_prompt.py +0 -0
  378. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_architecture.py +0 -0
  379. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_architecture_orchestrator.py +0 -0
  380. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_bug.py +0 -0
  381. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_bug_orchestrator.py +0 -0
  382. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_bug_orchestrator_1.py +0 -0
  383. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_bug_orchestrator_step_comments.py +0 -0
  384. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_bug_step10_prompt.py +0 -0
  385. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_bug_step11_prompt.py +0 -0
  386. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_bug_step7_prompt.py +0 -0
  387. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_change.py +0 -0
  388. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_checkup.py +0 -0
  389. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_checkup_orchestrator.py +0 -0
  390. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_common_issue_813_anthropic_api_key_oauth_shadow.py +0 -0
  391. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_common_worktree.py +0 -0
  392. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_crash.py +0 -0
  393. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_e2e_fix.py +0 -0
  394. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_e2e_fix_orchestrator.py +0 -0
  395. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_e2e_fix_step10_prompt.py +0 -0
  396. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_fix.py +0 -0
  397. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_langtest.py +0 -0
  398. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_split.py +0 -0
  399. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_split_orchestrator.py +0 -0
  400. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_split_real.py +0 -0
  401. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_split_v2.py +0 -0
  402. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_sync_nearest_config.py +0 -0
  403. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_test.py +0 -0
  404. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_test_generate.py +0 -0
  405. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_test_orchestrator.py +0 -0
  406. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_update.py +0 -0
  407. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_agentic_verify.py +0 -0
  408. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_api_key_scanner.py +0 -0
  409. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_architecture_include_validation.py +0 -0
  410. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_architecture_registry.py +0 -0
  411. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_architecture_sync.py +0 -0
  412. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_auth_service.py +0 -0
  413. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_auto_deps_architecture.py +0 -0
  414. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_auto_deps_entry_wipe.py +0 -0
  415. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_auto_deps_lock.py +0 -0
  416. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_auto_deps_main.py +0 -0
  417. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_auto_include.py +0 -0
  418. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_auto_update.py +0 -0
  419. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_bug_main.py +0 -0
  420. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_bug_to_unit_test.py +0 -0
  421. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_change.py +0 -0
  422. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_change_call_site_and_retry.py +0 -0
  423. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_change_main.py +0 -0
  424. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_checkup_pr_mode.py +0 -0
  425. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_ci_detect_changed_modules.py +0 -0
  426. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_ci_validation.py +0 -0
  427. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_circular_includes.py +0 -0
  428. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_cli.py +0 -0
  429. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_cli_binary_isolation.py +0 -0
  430. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_cli_detector.py +0 -0
  431. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_cloud_noninteractive_auth.py +0 -0
  432. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_cmd_test_main.py +0 -0
  433. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_code_generator.py +0 -0
  434. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_code_generator_main.py +0 -0
  435. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_code_patcher_prompt_json_example.py +0 -0
  436. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_commands_auth.py +0 -0
  437. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_commands_firecrawl.py +0 -0
  438. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_commands_fix.py +0 -0
  439. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_commands_generate.py +0 -0
  440. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_commands_maintenance.py +0 -0
  441. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_commands_modify.py +0 -0
  442. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_commands_templates.py +0 -0
  443. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_commands_utility.py +0 -0
  444. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_comment_line.py +0 -0
  445. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_conflicts_in_prompts.py +0 -0
  446. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_conflicts_main.py +0 -0
  447. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_construct_paths.py +0 -0
  448. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_content_selector.py +0 -0
  449. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_context_example_isolation.py +0 -0
  450. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_context_generator.py +0 -0
  451. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_context_generator_main.py +0 -0
  452. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_continue_generation.py +0 -0
  453. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_copy_package_data_to_public.py +0 -0
  454. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_core_dump.py +0 -0
  455. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_core_errors.py +0 -0
  456. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_core_utils.py +0 -0
  457. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_crash_main.py +0 -0
  458. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_cross_step_consistency_prompts.py +0 -0
  459. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_detect_change.py +0 -0
  460. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_detect_change_main.py +0 -0
  461. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_discover_associated_documents.py +0 -0
  462. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_durable_sync_runner.py +0 -0
  463. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_auto_deps_pipeline.py +0 -0
  464. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_bug_step9_verification.py +0 -0
  465. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_219_duplicate_includes.py +0 -0
  466. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_295_openai_schema.py +0 -0
  467. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_296_custom_csv.py +0 -0
  468. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_305_false_success.py +0 -0
  469. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_309_oauth_rate_limit.py +0 -0
  470. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_319_json_braces.py +0 -0
  471. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_340_report_core_no_default.py +0 -0
  472. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_342_syspath_isolation.py +0 -0
  473. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_349_sys_modules_pollution.py +0 -0
  474. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_357_step9_keyerror.py +0 -0
  475. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_358_jwt_cache_null.py +0 -0
  476. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_364_cumulative_cost.py +0 -0
  477. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_373_step5_keyerror.py +0 -0
  478. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_375_malformed_json.py +0 -0
  479. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_379_auth_null_expires.py +0 -0
  480. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_383_commit_intermediate_files.py +0 -0
  481. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_399_ssh_url_message.py +0 -0
  482. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_419_cli_unpushed_commits.py +0 -0
  483. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_419_unpushed_commits.py +0 -0
  484. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_426_include_path_validation.py +0 -0
  485. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_429_prompt_files_in_pr.py +0 -0
  486. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_445_worktree_resume.py +0 -0
  487. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_448_change_orchestrator.py +0 -0
  488. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_448_step5_keyerror.py +0 -0
  489. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_449_auth_logout_message.py +0 -0
  490. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_467_false_cached_steps.py +0 -0
  491. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_468_not_a_bug_early_exit.py +0 -0
  492. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_469_cleanup_messages.py +0 -0
  493. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_469_duplicate_unresolved.py +0 -0
  494. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_470_sessions_cleanup_auth_message.py +0 -0
  495. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_481_pagination.py +0 -0
  496. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_485_warning_false_negative.py +0 -0
  497. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_493_update_output_subdir.py +0 -0
  498. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_508_budget_test_cost.py +0 -0
  499. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_508_sync_budget_tracking.py +0 -0
  500. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_509_retry_cost.py +0 -0
  501. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_521_circular_includes.py +0 -0
  502. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_522_include_fingerprint.py +0 -0
  503. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_545_no_changes_to_commit.py +0 -0
  504. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_549_format_double_escaping.py +0 -0
  505. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_549_other_orchestrators.py +0 -0
  506. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_553_circular_includes_non_recursive.py +0 -0
  507. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_557_codex_ndjson.py +0 -0
  508. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_566_code_fence_tags.py +0 -0
  509. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_579_bug_worktree_rerun.py +0 -0
  510. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_579_orchestrator_rerun.py +0 -0
  511. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_594_preamble_imports.py +0 -0
  512. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_604_handler_wiring.py +0 -0
  513. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_620_hallucinated_imports.py +0 -0
  514. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_626_nextjs_rendering_model.py +0 -0
  515. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_686_anthropic_cost_double_count.py +0 -0
  516. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_687_postprocess_model_name.py +0 -0
  517. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_737_step_completion_markers.py +0 -0
  518. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_745_initial_cost_tracking.py +0 -0
  519. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_773_hard_stop.py +0 -0
  520. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_791_e2e_timeout_retry.py +0 -0
  521. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_796_typescript_python_validation.py +0 -0
  522. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_797_typescript_verification.py +0 -0
  523. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_817_step5_degenerate_cli.py +0 -0
  524. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_824_artifact_filtering.py +0 -0
  525. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_825_param_drop.py +0 -0
  526. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_830_workflow_stall.py +0 -0
  527. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_894.py +0 -0
  528. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_902_provider_fallback.py +0 -0
  529. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_issue_903_convergence.py +0 -0
  530. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_openai_required_array.py +0 -0
  531. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_pattern_verification.py +0 -0
  532. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_selective_includes.py +0 -0
  533. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_selective_includes_integration.py +0 -0
  534. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_step11_cleanup_revert.py +0 -0
  535. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_subprocess_issue_399_ssh_url_message.py +0 -0
  536. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_subprocess_issue_541_quiet_flag.py +0 -0
  537. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_e2e_subprocess_issue_593_bug_exit_code.py +0 -0
  538. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_embed_retrieve.py +0 -0
  539. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_example_error_detection.py +0 -0
  540. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_explicit_output_paths.py +0 -0
  541. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_extracts_prune.py +0 -0
  542. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_failure_classification.py +0 -0
  543. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_find_prompt_file.py +0 -0
  544. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_find_section.py +0 -0
  545. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_firecrawl_cache.py +0 -0
  546. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_fix_code_loop.py +0 -0
  547. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_fix_code_module_errors.py +0 -0
  548. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_fix_error_loop.py +0 -0
  549. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_fix_error_loop_failure_aware.py +0 -0
  550. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_fix_errors_from_unit_tests.py +0 -0
  551. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_fix_main.py +0 -0
  552. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_fix_main_issue_232.py +0 -0
  553. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_fix_verification_errors.py +0 -0
  554. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_fix_verification_errors_loop.py +0 -0
  555. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_fix_verification_main.py +0 -0
  556. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_generate_model_catalog.py +0 -0
  557. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_generate_output_paths.py +0 -0
  558. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_generate_output_paths_regression.py +0 -0
  559. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_generate_test.py +0 -0
  560. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_generation_completion.py +0 -0
  561. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_get_comment.py +0 -0
  562. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_get_extension.py +0 -0
  563. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_get_jwt_token.py +0 -0
  564. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_get_language.py +0 -0
  565. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_get_lint_commands.py +0 -0
  566. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_get_run_command.py +0 -0
  567. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_get_test_command.py +0 -0
  568. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_git_update.py +0 -0
  569. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_include_query_extractor.py +0 -0
  570. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_increase_tests.py +0 -0
  571. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_incremental_code_generator.py +0 -0
  572. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_incremental_prd_architecture.py +0 -0
  573. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_incremental_prd_architecture_real.py +0 -0
  574. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_insert_includes.py +0 -0
  575. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_install_completion.py +0 -0
  576. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_issue_1049_reproduction.py +0 -0
  577. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_issue_1240_generate_prompt_meta_framing.py +0 -0
  578. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_issue_1272_cloud_timeout.py +0 -0
  579. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_issue_225_paths_and_includes.py +0 -0
  580. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_issue_237.py +0 -0
  581. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_issue_467_all_orchestrators.py +0 -0
  582. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_issue_469_duplicate_unresolved.py +0 -0
  583. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_issue_592_failing_case.py +0 -0
  584. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_issue_600_agentic_weaknesses.py +0 -0
  585. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_issue_633_reproduction.py +0 -0
  586. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_issue_686_post_process_args_braces.py +0 -0
  587. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_issue_737_step_completion_markers.py +0 -0
  588. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_issue_791_reproduction.py +0 -0
  589. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_issue_794_anti_tdd_and_test_discovery.py +0 -0
  590. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_issue_794_repro.py +0 -0
  591. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_issue_830_remaining_fixes.py +0 -0
  592. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_issue_865_reproduction.py +0 -0
  593. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_issue_894_pytest_output_deadlock.py +0 -0
  594. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_issue_902.py +0 -0
  595. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_issue_902_prompt_sync.py +0 -0
  596. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_issue_926_preserve_comments_directive.py +0 -0
  597. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_issue_953_directory_scan_regression.py +0 -0
  598. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_jobs_sync_failure_detection.py +0 -0
  599. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_list_drift_detection.py +0 -0
  600. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_llm_invoke.py +0 -0
  601. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_llm_invoke_csv_model_registration.py +0 -0
  602. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_llm_invoke_integration.py +0 -0
  603. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_llm_invoke_nested_schema.py +0 -0
  604. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_llm_invoke_retry_cost.py +0 -0
  605. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_llm_invoke_vertex_retry.py +0 -0
  606. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_load_prompt_template.py +0 -0
  607. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_logo_animation.py +0 -0
  608. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_metadata_sync.py +0 -0
  609. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_mock_vs_production_fix.py +0 -0
  610. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_model_tester.py +0 -0
  611. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_nextjs_rendering_model.py +0 -0
  612. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_one_session_eval.py +0 -0
  613. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_one_session_sync.py +0 -0
  614. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_opencode_provider.py +0 -0
  615. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_operation_log.py +0 -0
  616. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_operation_logging_e2e.py +0 -0
  617. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_path_resolution.py +0 -0
  618. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_pattern_completeness_verification.py +0 -0
  619. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_pddrc_initializer.py +0 -0
  620. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_pddrc_true_e2e.py +0 -0
  621. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_pin_example_hack.py +0 -0
  622. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_postprocess.py +0 -0
  623. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_postprocess_0.py +0 -0
  624. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_preprocess.py +0 -0
  625. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_preprocess_main.py +0 -0
  626. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_preprocess_main_pdd_tags.py +0 -0
  627. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_process_csv_change.py +0 -0
  628. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_prompt_contract_validation.py +0 -0
  629. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_provider_env_isolation.py +0 -0
  630. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_provider_manager.py +0 -0
  631. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_pytest_output.py +0 -0
  632. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_quiet_flag.py +0 -0
  633. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_reasoning.py +0 -0
  634. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_remote_command_completion.py +0 -0
  635. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_remote_session.py +0 -0
  636. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_render_mermaid.py +0 -0
  637. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_report.py +0 -0
  638. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_research_prompt_web_tools.py +0 -0
  639. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_server_routes_prompts.py +0 -0
  640. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_server_spawn.py +0 -0
  641. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_setup_tool.py +0 -0
  642. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_split.py +0 -0
  643. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_split_main.py +0 -0
  644. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_split_seam_resolution.py +0 -0
  645. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_split_validation.py +0 -0
  646. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_step11_api_mocking_guidance.py +0 -0
  647. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_structural_test_guard.py +0 -0
  648. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_structural_test_guard_integration.py +0 -0
  649. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_summarize_directory.py +0 -0
  650. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_sync_animation.py +0 -0
  651. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_sync_animation_0.py +0 -0
  652. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_sync_backward_compat.py +0 -0
  653. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_sync_code_main.py +0 -0
  654. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_sync_contract_matrix.py +0 -0
  655. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_sync_graph_order_consistency.py +0 -0
  656. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_sync_main.py +0 -0
  657. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_sync_orchestration.py +0 -0
  658. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_sync_order.py +0 -0
  659. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_sync_target_coverage_infinite_loop.py +0 -0
  660. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_sync_template_prompt_discovery.py +0 -0
  661. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_sync_tui.py +0 -0
  662. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_template_expander.py +0 -0
  663. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_template_registry.py +0 -0
  664. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_thread_safe_redirector.py +0 -0
  665. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_time_reasoning_effort_env.py +0 -0
  666. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_trace.py +0 -0
  667. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_trace_main.py +0 -0
  668. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_track_cost.py +0 -0
  669. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_unfinished_prompt.py +0 -0
  670. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_update_command.py +0 -0
  671. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_update_model_costs.py +0 -0
  672. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_update_prompt.py +0 -0
  673. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_user_story_tests.py +0 -0
  674. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_version.py +0 -0
  675. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_which.py +0 -0
  676. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_xml_tagger.py +0 -0
  677. {pdd_cli-0.0.237 → pdd_cli-0.0.239}/tests/test_z3_prompt_test_correspondence.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pdd-cli
3
- Version: 0.0.237
3
+ Version: 0.0.239
4
4
  Summary: PDD (Prompt-Driven Development) Command Line Interface
5
5
  Author: Greg Tanaka
6
6
  Author-email: glt@alumni.caltech.edu
@@ -65,7 +65,7 @@ Requires-Dist: twine; extra == "dev"
65
65
  Requires-Dist: httpx==0.28.1; extra == "dev"
66
66
  Dynamic: license-file
67
67
 
68
- .. image:: https://img.shields.io/badge/pdd--cli-v0.0.237-blue
68
+ .. image:: https://img.shields.io/badge/pdd--cli-v0.0.239-blue
69
69
  :alt: PDD-CLI Version
70
70
 
71
71
  .. image:: https://img.shields.io/badge/Discord-join%20chat-7289DA.svg?logo=discord&logoColor=white&link=https://discord.gg/Yp4RTh8bG7
@@ -142,7 +142,7 @@ After installation, verify:
142
142
 
143
143
  pdd --version
144
144
 
145
- You'll see the current PDD version (e.g., 0.0.237).
145
+ You'll see the current PDD version (e.g., 0.0.239).
146
146
 
147
147
  Getting Started with Examples
148
148
  -----------------------------
@@ -1,6 +1,6 @@
1
1
  # PDD (Prompt-Driven Development) Command Line Interface
2
2
 
3
- ![PDD-CLI Version](https://img.shields.io/badge/pdd--cli-v0.0.237-blue) [![Discord](https://img.shields.io/badge/Discord-join%20chat-7289DA.svg?logo=discord&logoColor=white)](https://discord.gg/Yp4RTh8bG7)
3
+ ![PDD-CLI Version](https://img.shields.io/badge/pdd--cli-v0.0.239-blue) [![Discord](https://img.shields.io/badge/Discord-join%20chat-7289DA.svg?logo=discord&logoColor=white)](https://discord.gg/Yp4RTh8bG7)
4
4
 
5
5
  ## Introduction
6
6
 
@@ -362,7 +362,7 @@ For proper model identifiers to use in your custom configuration, refer to the [
362
362
 
363
363
  ## Version
364
364
 
365
- Current version: 0.0.237
365
+ Current version: 0.0.239
366
366
 
367
367
  To check your installed version, run:
368
368
  ```
@@ -864,7 +864,7 @@ Options:
864
864
  - `--skip-verify`: Skip the functional verification step
865
865
  - `--skip-tests`: Skip unit test generation and fixing
866
866
  - `--target-coverage FLOAT`: Desired code coverage percentage (default is 90.0)
867
- - `--dry-run`: Display real-time sync analysis instead of running sync operations. For no-argument project-wide sync, this prints the dependency-ordered module list and estimated cost without executing any module syncs. For single-module sync, it performs the same state analysis as a normal sync run but without acquiring exclusive locks or executing operations.
867
+ - `--dry-run`: Display real-time sync analysis instead of running sync operations. For no-argument project-wide sync, this prints the dependency-ordered module list and estimated cost without executing any module syncs, plus a single compact roll-up of modules outside the Tier 1 (`generate` / `auto-deps`) scope — bucketed by reason (e.g. `Out of Tier 1 scope: 42 example, 31 test, 18 verify, 12 update, 74 no-prompt fixture`) instead of one warning line per skipped entry. When zero modules are stale, the `0 stale module(s)` fragment is rendered in green so the success signal is visually unambiguous. Actionable architecture-graph warnings (ambiguous or unresolved cross-arch dependencies) are still printed individually in yellow. For single-module sync, it performs the same state analysis as a normal sync run but without acquiring exclusive locks or executing operations. Passing the top-level `pdd --verbose` flag (see above) restores the legacy per-module enumeration after the compact roll-up — one yellow warning line per module outside the Tier 1 scope — for debugging.
868
868
  - `--one-session / --no-one-session`: Run sync in a single agentic session instead of separate sessions for each step. Cannot be combined with `--skip-tests` or `--skip-verify`.
869
869
  - `--no-steer`: Disable interactive steering of sync operations.
870
870
  - `--steer-timeout FLOAT`: Timeout in seconds for steering prompts (default: 8.0).
@@ -2412,7 +2412,7 @@ Options:
2412
2412
  - `--git`: Use git history to find the original code file, eliminating the need for the `INPUT_CODE_FILE` argument.
2413
2413
  - `--extensions EXTENSIONS`: In repository-wide mode, filter the update to only include files with the specified comma-separated extensions (e.g., `py,js,ts`).
2414
2414
  - `--simple`: Use the legacy 2-stage LLM update process instead of the default agentic mode. Useful when agentic CLIs are not available or for faster updates.
2415
- - `--sync-metadata`: After the prompt update, run the shared metadata-sync orchestrator so prompt PDD tags, `architecture.json` entries, run reports, and fingerprint state are reconciled in one step. Works in single-file, regeneration, and repo modes. Without this flag, behavior is unchanged and metadata layers must be reconciled with separate commands. **Scope note:** the `tags` stage currently *preserves* existing PDD tags and only *seeds* tags from the matching `architecture.json` entry when a prompt has none — LLM-first **refresh** of stale-but-present tags is tracked at issue [#870](https://github.com/promptdriven/pdd/issues/870) and is not invoked by this orchestrator. When a prompt has zero PDD tags AND no architecture entry, the `tags` stage reports `skipped` (never `ok`) so operators see honest status. On any stage `failed`, `pdd update --sync-metadata` exits non-zero so CI auto-heal does not treat a half-finalized update as healed.
2415
+ - `--sync-metadata`: After the prompt update, run the shared metadata-sync orchestrator so prompt PDD tags, `architecture.json` entries, run reports, and fingerprint state are reconciled in one step. Works in single-file, regeneration, and repo modes. **Fingerprint note:** default single-file/regeneration `pdd update <code>` already finalizes the per-target fingerprint (`.pdd/meta/<basename>_<language>.json`) on success, and logs a skip reason when finalization is intentionally bypassed; `--sync-metadata` does not gate that behavior. Without this flag, the broader prompt-tag/architecture/run-report orchestrator is not run and those layers must be reconciled with separate commands. **Scope note:** the `tags` stage currently *preserves* existing PDD tags and only *seeds* tags from the matching `architecture.json` entry when a prompt has none — LLM-first **refresh** of stale-but-present tags is tracked at issue [#870](https://github.com/promptdriven/pdd/issues/870) and is not invoked by this orchestrator. When a prompt has zero PDD tags AND no architecture entry, the `tags` stage reports `skipped` (never `ok`) so operators see honest status. On any stage `failed`, `pdd update --sync-metadata` exits non-zero so CI auto-heal does not treat a half-finalized update as healed.
2416
2416
 
2417
2417
  Example (Metadata Sync):
2418
2418
  ```bash
@@ -2745,8 +2745,9 @@ Options:
2745
2745
  - `--fixer ROLE`: Fixer role for `--review-loop` (for example, `claude`). The fixer must be different from the reviewer unless `--review-only` is used.
2746
2746
  - `--reviewers ROLES`: Legacy comma-separated review-loop role order, interpreted as `reviewer,fixer` (default: `codex,claude`).
2747
2747
  - `--reviewer-fallback ROLE`: Optional secondary reviewer role to invoke once if the primary reviewer cannot complete (for example, because of auth, network, sandbox, or CLI failures). The fallback must resolve to a role different from the reviewer and fixer; if it succeeds, it becomes the active reviewer for the remaining loop and the superseded primary's row in the final report is annotated `(optional, superseded by <fallback>)` so downstream verdict adapters drop the failed primary from the required-reviewer set and resolve to `ship_degraded` instead of `unknown`.
2748
+ - `--fixer-fallback ROLE`: Optional secondary fixer role to invoke once if the primary fixer cannot complete (for example, Claude Code subscription-tier `credential-limit` failures). Role aliases are normalized so `claude` and `anthropic` resolve to the same identity; the fallback must resolve to a role different from the active fixer, the active reviewer, AND the originally configured reviewer (so `--reviewer codex --reviewer-fallback gemini --fixer-fallback codex` is skipped even after gemini takes over reviewing). Before the fallback runs the worktree is reset so the primary fixer's partial edits do not leak; on success the fallback takes over as the active fixer for the remaining rounds.
2748
2749
  - `--max-review-rounds INT`: Maximum primary-reviewer/fixer rounds (default: 5).
2749
- - `--max-review-cost FLOAT`: Maximum review-loop LLM cost in USD (default: 10.0).
2750
+ - `--max-review-cost FLOAT`: Maximum review-loop LLM cost in USD (default: 50.0).
2750
2751
  - `--max-review-minutes FLOAT`: Maximum review-loop wall-clock minutes (default: 90.0).
2751
2752
  - `--blocking-severities LIST`: Comma-separated severity names used for review-loop reporting and prompt guidance (default: `blocker,critical,medium`). The fixer still receives every valid reviewer finding.
2752
2753
  - `--continue-on-reviewer-limit`: Report provider, rate, context-window, timeout, auth, network, sandbox, permission, and non-zero-exit reviewer failures as `degraded` instead of `failed`. Degraded reviewers are still not clean unless a configured fallback reviewer completes successfully and takes over as the active reviewer.
@@ -3512,7 +3513,7 @@ PDD can be integrated into various development workflows. Here are the conceptua
3512
3513
  4. Stage and commit healed files with a descriptive message — partial metadata state (any stage reporting `failed`) blocks the commit/checkpoint in PR mode. `skipped` is permitted for legitimate cases (no `architecture.json`, unregistered modules, LLM-first tag generation pending #870) and does not block.
3513
3514
  5. Push changes to the current branch
3514
3515
 
3515
- **Metadata Finalization**: The CI auto-heal `update` branch and the preflight drift-heal path both call the same `run_metadata_sync` orchestrator that `pdd update --sync-metadata` uses, so all three workflows share one finalization surface. The orchestrator runs in a fixed order — prompt → tags → architecture → run-report cleanup → fingerprint last. **Within `run_metadata_sync`** a `failed` upstream stage gates every later write-bearing stage (architecture, run_report, fingerprint), so a tags failure cannot drag architecture or fingerprint state out of sync. `skipped` upstream (no `architecture.json`, unregistered modules, LLM-first tag refresh pending #870) is acceptable and does not gate later stages. **The orchestrator is not transactional across stages**: if e.g. tags + architecture succeed and fingerprint then fails, the prompt and `architecture.json` writes have already landed on disk and `run_metadata_sync` itself does not roll them back. End-to-end rollback for a failing module is handled by the CI auto-heal layer — on a sync failure, `pdd.ci_drift_heal` calls `_revert_prompt_file` and the module-scoped `_snapshot_metadata_state_for(drift)` / `_restore_metadata_state_for(snapshot)` pair (which captures this module's `architecture.json` bytes + `.pdd/meta/<basename>_<language>.json` pre-sync and writes them back on failure, never touching other modules' state). A repo-scoped `git restore -- .pdd` / `git restore -- architecture.json` is explicitly NOT used because in a multi-module push-to-main heal it would wipe earlier successful modules' writes from the same run; the legacy `_cleanup_metadata_artifacts` symbol is kept only as a no-op import shim. The combined invariant: `git add -A` on push-to-main cannot publish a failed module's partial metadata alongside another module's successful heal. The combined invariant: auto-heal never commits a half-synced state, and preflight never leaves stale fingerprints after a successful update.
3516
+ **Metadata Finalization**: The CI auto-heal `update` branch and the preflight drift-heal path both call the same `run_metadata_sync` orchestrator that `pdd update --sync-metadata` uses, so all three workflows share one finalization surface. The orchestrator runs in a fixed order — prompt → tags → architecture → run-report cleanup → fingerprint last. **Within `run_metadata_sync`** a `failed` upstream stage gates every later write-bearing stage (architecture, run_report, fingerprint), so a tags failure cannot drag architecture or fingerprint state out of sync. `skipped` upstream (no `architecture.json`, unregistered modules, LLM-first tag refresh pending #870) is acceptable and does not gate later stages. **The orchestrator is not transactional across stages**: if e.g. tags + architecture succeed and fingerprint then fails, the prompt and `architecture.json` writes have already landed on disk and `run_metadata_sync` itself does not roll them back. End-to-end rollback for a failing module is handled by the CI auto-heal layer — on a sync failure, `pdd.ci_drift_heal` calls `_revert_prompt_file` and the module-scoped `_snapshot_metadata_state_for(drift)` / `_restore_metadata_state_for(snapshot)` pair (which captures this module's `architecture.json` bytes + `.pdd/meta/<basename>_<language>.json` pre-sync and writes them back on failure, never touching other modules' state). A repo-scoped `git restore -- .pdd` / `git restore -- architecture.json` is explicitly NOT used because in a multi-module push-to-main heal it would wipe earlier successful modules' writes from the same run; the legacy `_cleanup_metadata_artifacts` symbol is kept only as a no-op import shim. **Staging is scoped, not blanket** — `commit_and_push` runs `git add -u` for tracked updates plus explicit per-module pathspecs (computed from each `DriftInfo`'s `prompt_path`/`code_path`/`example_path`/`test_path` and `_operation_log_metadata_relpaths(basename, language)`), filters out gitignored paths via `git check-ignore`, and adds `project_dependencies.csv` only when a healed module ran `auto-deps`; `git add -A` is explicitly rejected because it sweeps unrelated `.pdd/meta/*.json` fingerprints from out-of-scope modules into the heal commit (issue #1021) and could publish a failed module's partial metadata alongside another module's successful heal. The combined invariant: auto-heal never commits a half-synced state, and preflight never leaves stale fingerprints after a successful update.
3516
3517
 
3517
3518
  **Usage:**
3518
3519
  ```bash
@@ -3561,6 +3562,11 @@ For detailed command examples for each workflow, see the respective command docu
3561
3562
  - `pull_request_target` (opened / synchronize / reopened / ready_for_review): heals only modules changed by the PR and pushes a `chore: auto-heal …` commit back to the PR branch.
3562
3563
  - `issue_comment` with a `/heal` command on a PR by an authorized collaborator: same as above, on demand.
3563
3564
 
3565
+ Generated internal PRs authored by `prompt-driven-github[bot]` are trusted as
3566
+ the autonomous pdd-issue App identity for the `pull_request_target` heal path.
3567
+ Other PR authors and all `/heal` comment requesters must pass the `pdd_cloud`
3568
+ collaborator check before Cloud Build is dispatched.
3569
+
3564
3570
  There is no push-to-main trigger. Drift on `main` is healed by the next PR that touches the affected modules.
3565
3571
 
3566
3572
  **Loop prevention**: Auto-heal commits start with `chore: auto-heal …`; the Cloud Build step short-circuits when the triggering commit subject matches that prefix, so the heal cannot retrigger itself.
@@ -1013,6 +1013,15 @@ def _preflight_drift_heal(
1013
1013
  if not quiet:
1014
1014
  console.print(f" [green]✓[/green] healed {drift.basename}")
1015
1015
  else:
1016
+ combined_output = f"{result.stdout or ''}\n{result.stderr or ''}"
1017
+ if (
1018
+ "metadata finalization failed" in combined_output
1019
+ or "metadata staging verification failed" in combined_output
1020
+ or "[metadata-sync]" in combined_output
1021
+ ):
1022
+ raise RuntimeError(
1023
+ f"preflight metadata finalization failed for {drift.basename}"
1024
+ )
1016
1025
  failed.append(drift.basename)
1017
1026
  if not quiet:
1018
1027
  tail = result.stderr.strip().splitlines()[-1:] or ["(no stderr)"]
@@ -1026,6 +1035,8 @@ def _preflight_drift_heal(
1026
1035
  console.print(
1027
1036
  f" [red]✗[/red] heal timed out for {drift.basename}"
1028
1037
  )
1038
+ except RuntimeError:
1039
+ raise
1029
1040
  except Exception as exc:
1030
1041
  failed.append(drift.basename)
1031
1042
  if not quiet:
@@ -321,8 +321,9 @@ def run_agentic_checkup(
321
321
  reviewer: Optional[str] = None,
322
322
  fixer: Optional[str] = None,
323
323
  reviewer_fallback: Optional[str] = None,
324
+ fixer_fallback: Optional[str] = None,
324
325
  max_review_rounds: int = 5,
325
- max_review_cost: float = 10.0,
326
+ max_review_cost: float = 50.0,
326
327
  max_review_minutes: float = 90.0,
327
328
  require_all_reviewers_clean: bool = True,
328
329
  continue_on_reviewer_limit: bool = False,
@@ -349,6 +350,10 @@ def run_agentic_checkup(
349
350
  reviewer first pass and do not invoke the fixer or push changes.
350
351
  reviewer_fallback: Optional secondary reviewer role to try once when
351
352
  the primary reviewer cannot complete.
353
+ fixer_fallback: Optional secondary fixer role to try once when the
354
+ primary fixer cannot address the reviewer's findings (e.g. a
355
+ subscription-tier credential is exhausted). Must differ from
356
+ both the primary fixer and the active reviewer.
352
357
 
353
358
  Returns:
354
359
  Tuple of (success, message, total_cost, model_used).
@@ -452,6 +457,7 @@ def run_agentic_checkup(
452
457
  reviewer=reviewer,
453
458
  fixer=fixer,
454
459
  reviewer_fallback=reviewer_fallback,
460
+ fixer_fallback=fixer_fallback,
455
461
  review_only=review_only,
456
462
  max_rounds=max_review_rounds,
457
463
  max_cost=max_review_cost,
@@ -388,6 +388,26 @@ _PERMANENT_ERROR_CLASSES: Tuple[Tuple[str, Tuple[str, ...]], ...] = (
388
388
  r"model\s+not\s+found(?!\s+in\s+provider)",
389
389
  ),
390
390
  ),
391
+ (
392
+ # Issue (this PR): Claude Code subscription-tier weekly limit ("You've
393
+ # hit your limit · resets [TIME]"). Distinct from API-tier 429 because
394
+ # the reset window is hours-to-days, not seconds-to-minutes — retrying
395
+ # on the 60s rate-limit floor wastes minutes. Stable token
396
+ # `credential-limit` lets pdd_cloud's OAuth-token waterfall detect this
397
+ # and rotate to a different credential instead of retrying the dead one.
398
+ "credential-limit",
399
+ (
400
+ # Proximity + time-token guard. Requires "hit your limit" and
401
+ # "resets" within 40 chars (typical envelope is "... limit ·
402
+ # resets May 18, 11pm (UTC) ...") AND requires a time-token
403
+ # OR delimiter immediately after "resets" so distant prose
404
+ # like "if you hit your limit, nothing resets automatically"
405
+ # does NOT classify as credential-limit. Without the time
406
+ # token, any sentence stringing both phrases together would
407
+ # short-circuit the rate-limit retry path on benign text.
408
+ r"hit\s+your\s+limit[^\n]{0,40}?\bresets?\b\s*(?:[·:|\-]|in\s|at\s|on\s|\d|jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)",
409
+ ),
410
+ ),
391
411
  (
392
412
  # Issue #1072: quota exhaustion (permanent even when 429 is present)
393
413
  "quota",
@@ -36,7 +36,11 @@ from .architecture_include_validation import (
36
36
  validate_prompt_contract_context,
37
37
  )
38
38
  from .sync_graph_order_consistency import warnings_for_arch_vs_include_sync_order
39
- from .architecture_registry import extract_modules, find_project_root as _find_project_root
39
+ from .architecture_registry import (
40
+ extract_modules,
41
+ find_architecture_for_project,
42
+ find_project_root as _find_project_root,
43
+ )
40
44
  from .construct_paths import (
41
45
  _detect_context_from_basename,
42
46
  _extract_prefix_from_prompts_dir,
@@ -421,12 +425,23 @@ class GlobalSyncAnalysis(NamedTuple):
421
425
 
422
426
  modules_to_sync: List[str]
423
427
  module_cwds: Dict[str, Path]
428
+ module_targets: Dict[str, str]
424
429
  estimated_cost: float
425
430
  module_operations: Dict[str, List[str]]
426
431
  skipped_modules: List[str]
427
432
  all_modules: List[str]
428
433
 
429
434
 
435
+ class GlobalSyncModule(NamedTuple):
436
+ """Scoped global-sync module identity."""
437
+
438
+ key: str
439
+ basename: str
440
+ cwd: Path
441
+ architecture_path: Path
442
+ entry: Dict[str, Any]
443
+
444
+
430
445
  def _architecture_module_basenames(architecture: List[Dict[str, Any]]) -> List[str]:
431
446
  """Return syncable architecture module basenames, preserving declaration order."""
432
447
  basenames: List[str] = []
@@ -441,6 +456,58 @@ def _architecture_module_basenames(architecture: List[Dict[str, Any]]) -> List[s
441
456
  return basenames
442
457
 
443
458
 
459
+ def _architecture_sync_modules(project_root: Path) -> Tuple[List[GlobalSyncModule], List[Dict[str, Any]], Path]:
460
+ """Return architecture modules with cwd scope preserved."""
461
+ arch_files = find_architecture_for_project(project_root)
462
+ if not arch_files:
463
+ return [], [], project_root / "architecture.json"
464
+
465
+ raw_modules: List[Tuple[str, Path, Path, Dict[str, Any]]] = []
466
+ architecture: List[Dict[str, Any]] = []
467
+ seen: set[Tuple[Path, str]] = set()
468
+
469
+ for arch_path in arch_files:
470
+ try:
471
+ data = json.loads(arch_path.read_text(encoding="utf-8"))
472
+ except (json.JSONDecodeError, OSError):
473
+ continue
474
+
475
+ arch_dir = arch_path.parent
476
+ for entry in extract_modules(data):
477
+ basename = _basename_from_architecture_filename(entry.get("filename", ""))
478
+ if not basename:
479
+ continue
480
+ dedupe_key = (arch_path.resolve(), basename)
481
+ if dedupe_key in seen:
482
+ continue
483
+ seen.add(dedupe_key)
484
+ architecture.append(entry)
485
+ # Consult _resolve_module_cwd so a nested .pddrc whose context owns
486
+ # this basename wins over the arch file's own directory. The
487
+ # resolver scans subdirectories of arch_dir for .pddrc files and
488
+ # falls back to arch_dir when no nested config claims the basename.
489
+ cwd = _resolve_module_cwd(basename, arch_dir)
490
+ raw_modules.append((basename, cwd, arch_path, entry))
491
+
492
+ counts: Dict[str, int] = {}
493
+ for basename, _, _, _ in raw_modules:
494
+ counts[basename] = counts.get(basename, 0) + 1
495
+
496
+ modules: List[GlobalSyncModule] = []
497
+ for basename, cwd, arch_path, entry in raw_modules:
498
+ if counts[basename] > 1:
499
+ try:
500
+ rel_scope = arch_path.parent.resolve().relative_to(project_root.resolve()).as_posix()
501
+ except (OSError, ValueError):
502
+ rel_scope = arch_path.parent.as_posix()
503
+ key = f"{rel_scope or '.'}:{basename}"
504
+ else:
505
+ key = basename
506
+ modules.append(GlobalSyncModule(key, basename, cwd, arch_path, entry))
507
+
508
+ return modules, architecture, arch_files[0]
509
+
510
+
444
511
  def _prompt_contract_errors_for_module(
445
512
  basename: str,
446
513
  cwd: Path,
@@ -578,7 +645,7 @@ def _resolve_module_sync_context(
578
645
 
579
646
 
580
647
  def _analyze_global_sync_modules(
581
- modules: List[str],
648
+ modules: List[GlobalSyncModule],
582
649
  project_root: Path,
583
650
  *,
584
651
  quiet: bool = False,
@@ -590,29 +657,33 @@ def _analyze_global_sync_modules(
590
657
  """Tier 1 global sync analysis: fingerprint-scan all architecture modules."""
591
658
  modules_to_sync: List[str] = []
592
659
  module_cwds: Dict[str, Path] = {}
660
+ module_targets: Dict[str, str] = {}
593
661
  module_operations: Dict[str, List[str]] = {}
594
662
  skipped_modules: List[str] = []
595
663
  estimated_cost = 0.0
596
664
  effective_budget = budget if budget is not None else 10.0
597
665
  effective_coverage = target_coverage if target_coverage is not None else 90.0
598
666
 
599
- for basename in modules:
600
- cwd = _resolve_module_cwd(basename, project_root)
601
- module_cwds[basename] = cwd
667
+ for module in modules:
668
+ key = module.key
669
+ basename = module.basename
670
+ cwd = module.cwd
671
+ module_cwds[key] = cwd
672
+ module_targets[key] = basename
602
673
 
603
674
  try:
604
675
  context_name, prompts_dir, lang_to_path = _resolve_module_sync_context(
605
676
  basename, cwd
606
677
  )
607
678
  except Exception as exc:
608
- modules_to_sync.append(basename)
609
- module_operations[basename] = [
679
+ modules_to_sync.append(key)
680
+ module_operations[key] = [
610
681
  f"analysis-error: {exc}; queued for sync as safe fallback"
611
682
  ]
612
683
  continue
613
684
 
614
685
  if not lang_to_path:
615
- skipped_modules.append(f"{basename}: no syncable prompt file found")
686
+ skipped_modules.append(f"{key}: no syncable prompt file found")
616
687
  continue
617
688
 
618
689
  operations: List[str] = []
@@ -644,28 +715,34 @@ def _analyze_global_sync_modules(
644
715
  estimated_cost += float(decision.estimated_cost or 0.0)
645
716
  elif decision.operation not in _GLOBAL_SYNC_NOOP_OPERATIONS:
646
717
  skipped_modules.append(
647
- f"{basename}: {language} requires {decision.operation}; "
718
+ f"{key}: {language} requires {decision.operation}; "
648
719
  "outside Tier 1 prompt-staleness scope"
649
720
  )
650
721
 
651
722
  if needs_sync:
652
- modules_to_sync.append(basename)
653
- module_operations[basename] = operations
723
+ modules_to_sync.append(key)
724
+ module_operations[key] = operations
654
725
 
655
726
  if not quiet:
656
727
  skipped_count = len(modules) - len(modules_to_sync)
728
+ stale_count = len(modules_to_sync)
729
+ if stale_count == 0:
730
+ stale_fragment = f"[green]0 stale module(s)[/green]"
731
+ else:
732
+ stale_fragment = f"{stale_count} stale module(s)"
657
733
  console.print(
658
- f"[bold]Global sync analysis:[/bold] {len(modules_to_sync)} stale "
659
- f"module(s), {skipped_count} already synced or skipped."
734
+ f"[bold]Global sync analysis:[/bold] {stale_fragment}, "
735
+ f"{skipped_count} already synced or skipped."
660
736
  )
661
737
 
662
738
  return GlobalSyncAnalysis(
663
739
  modules_to_sync=modules_to_sync,
664
740
  module_cwds=module_cwds,
741
+ module_targets=module_targets,
665
742
  estimated_cost=estimated_cost,
666
743
  module_operations=module_operations,
667
744
  skipped_modules=skipped_modules,
668
- all_modules=modules,
745
+ all_modules=[module.key for module in modules],
669
746
  )
670
747
 
671
748
 
@@ -683,15 +760,163 @@ def _dependency_ordered_modules(
683
760
  return ordered
684
761
 
685
762
 
763
+ def _build_scoped_global_dep_graph(
764
+ modules: List[GlobalSyncModule],
765
+ target_keys: List[str],
766
+ project_root: Path,
767
+ ) -> Tuple[Dict[str, List[str]], List[str]]:
768
+ """Build a dependency graph for scoped global-sync module keys.
769
+
770
+ Dep resolution proceeds in two passes:
771
+
772
+ 1. Same-architecture scope: prefer a module declared in the same
773
+ architecture.json as the depending module.
774
+ 2. Cross-architecture fallback: if no same-arch match exists, look across
775
+ all loaded modules by basename. An unambiguous match (exactly one
776
+ module across all archs with that basename) is accepted to preserve
777
+ the prior combined-architecture behaviour. Ambiguous cross-arch
778
+ basenames (multiple matches) emit a warning and drop the edge.
779
+ """
780
+ target_set = set(target_keys)
781
+ module_by_key = {module.key: module for module in modules}
782
+ key_by_scope_basename = {
783
+ (module.architecture_path.resolve(), module.basename): module.key
784
+ for module in modules
785
+ }
786
+ # Global basename index used for unambiguous cross-arch fallback.
787
+ keys_by_basename: Dict[str, List[str]] = {}
788
+ for module in modules:
789
+ keys_by_basename.setdefault(module.basename, []).append(module.key)
790
+ graph: Dict[str, List[str]] = {key: [] for key in target_keys}
791
+ warnings: List[str] = []
792
+
793
+ for key in target_keys:
794
+ module = module_by_key.get(key)
795
+ if module is None:
796
+ continue
797
+ deps = module.entry.get("dependencies", [])
798
+ if not isinstance(deps, list):
799
+ continue
800
+ for dep in deps:
801
+ dep_basename = _basename_from_architecture_filename(str(dep))
802
+ if not dep_basename:
803
+ continue
804
+ dep_key = key_by_scope_basename.get(
805
+ (module.architecture_path.resolve(), dep_basename)
806
+ )
807
+ if dep_key is None:
808
+ # Same-architecture lookup missed. Fall back to a global
809
+ # basename lookup so cross-arch edges (preserved by the old
810
+ # combined-architecture builder) still resolve when the
811
+ # basename is unambiguous across the loaded modules.
812
+ candidate_keys = keys_by_basename.get(dep_basename, [])
813
+ if len(candidate_keys) == 1:
814
+ dep_key = candidate_keys[0]
815
+ elif len(candidate_keys) > 1:
816
+ warnings.append(
817
+ f"combined architecture data under {project_root}: "
818
+ f"module '{key}' declares ambiguous cross-arch "
819
+ f"dependency '{dep}' (basename '{dep_basename}' "
820
+ f"matches multiple modules: "
821
+ f"{', '.join(sorted(candidate_keys))}); "
822
+ "edge omitted from schedule"
823
+ )
824
+ continue
825
+ else:
826
+ warnings.append(
827
+ f"combined architecture data under {project_root}: "
828
+ f"module '{key}' declares unresolved dependency "
829
+ f"'{dep}'; no module with that filename in the same "
830
+ "architecture scope; edge omitted from schedule"
831
+ )
832
+ continue
833
+ if dep_key == key:
834
+ continue
835
+ if dep_key in target_set:
836
+ graph[key].append(dep_key)
837
+ else:
838
+ warnings.append(
839
+ f"combined architecture data under {project_root}: module "
840
+ f"'{key}' depends on '{dep_key}' (via '{dep}'), which is not "
841
+ "in the sync target set; edge omitted from schedule"
842
+ )
843
+
844
+ return graph, warnings
845
+
846
+
847
+ _SKIPPED_BUCKET_ORDER: Tuple[str, ...] = (
848
+ "example",
849
+ "test",
850
+ "verify",
851
+ "update",
852
+ "fix",
853
+ "crash",
854
+ "no-prompt fixture",
855
+ "other",
856
+ )
857
+ _SKIPPED_OPERATION_BUCKETS: Tuple[str, ...] = (
858
+ "example",
859
+ "test",
860
+ "verify",
861
+ "update",
862
+ "fix",
863
+ "crash",
864
+ )
865
+
866
+
867
+ def _bucket_skipped_reasons(skipped_modules: List[str]) -> Dict[str, int]:
868
+ """Bucket skipped-module entries by reason for the dry-run roll-up.
869
+
870
+ Entries flagged "no syncable prompt file found" go into `no-prompt fixture`;
871
+ entries shaped "{key}: {language} requires {operation}; outside Tier 1 ..."
872
+ bucket by `operation` when it matches a known Tier-1-out-of-scope op,
873
+ otherwise into `other`.
874
+ """
875
+ buckets: Dict[str, int] = {name: 0 for name in _SKIPPED_BUCKET_ORDER}
876
+ for entry in skipped_modules:
877
+ lower = entry.lower()
878
+ if "no syncable prompt file found" in lower:
879
+ buckets["no-prompt fixture"] += 1
880
+ continue
881
+ matched = False
882
+ for op in _SKIPPED_OPERATION_BUCKETS:
883
+ if f"requires {op}" in lower:
884
+ buckets[op] += 1
885
+ matched = True
886
+ break
887
+ if not matched:
888
+ buckets["other"] += 1
889
+ return buckets
890
+
891
+
892
+ def _format_skipped_bucket_summary(skipped_modules: List[str]) -> Optional[str]:
893
+ """Return a stable single-line roll-up of skipped buckets, or None if empty."""
894
+ if not skipped_modules:
895
+ return None
896
+ buckets = _bucket_skipped_reasons(skipped_modules)
897
+ parts = [
898
+ f"{count} {name}"
899
+ for name in _SKIPPED_BUCKET_ORDER
900
+ if (count := buckets.get(name, 0)) > 0
901
+ ]
902
+ if not parts:
903
+ return None
904
+ return "Out of Tier 1 scope: " + ", ".join(parts)
905
+
906
+
686
907
  def _print_global_sync_plan(
687
908
  analysis: GlobalSyncAnalysis,
688
909
  ordered_modules: List[str],
689
910
  warnings: List[str],
690
911
  budget: Optional[float] = None,
912
+ verbose: bool = False,
691
913
  ) -> None:
692
914
  """Render a concise global sync dry-run plan."""
693
915
  console.print("[bold]Global sync dry run:[/bold]")
694
- console.print(f" Tier 1 (prompt staleness): {len(ordered_modules)} module(s) stale")
916
+ if len(ordered_modules) == 0:
917
+ console.print(" Tier 1 (prompt staleness): [green]0 module(s) stale[/green]")
918
+ else:
919
+ console.print(f" Tier 1 (prompt staleness): {len(ordered_modules)} module(s) stale")
695
920
  console.print(f" Total architecture modules scanned: {len(analysis.all_modules)}")
696
921
  console.print(f" Estimated cost: ${analysis.estimated_cost:.2f}")
697
922
  if budget is not None:
@@ -714,8 +939,13 @@ def _print_global_sync_plan(
714
939
  for warning in warnings:
715
940
  console.print(f"[yellow]Warning: {warning}[/yellow]")
716
941
 
717
- for skipped in analysis.skipped_modules:
718
- console.print(f"[yellow]Warning: {skipped}[/yellow]")
942
+ if analysis.skipped_modules:
943
+ summary = _format_skipped_bucket_summary(analysis.skipped_modules)
944
+ if summary is not None:
945
+ console.print(f" [dim]{summary}[/dim]")
946
+ if verbose:
947
+ for skipped in analysis.skipped_modules:
948
+ console.print(f"[yellow]Warning: {skipped}[/yellow]")
719
949
 
720
950
 
721
951
  def run_global_sync(
@@ -736,8 +966,8 @@ def run_global_sync(
736
966
  ) -> Tuple[bool, str, float, str]:
737
967
  """Run project-wide Tier 1 global sync from architecture.json."""
738
968
  project_root = _find_project_root(Path.cwd())
739
- architecture, arch_path = _load_architecture_json(project_root)
740
- if architecture is None:
969
+ all_modules, architecture, arch_path = _architecture_sync_modules(project_root)
970
+ if not architecture:
741
971
  return (
742
972
  False,
743
973
  f"No architecture.json found under {project_root}.",
@@ -745,7 +975,6 @@ def run_global_sync(
745
975
  "global-sync",
746
976
  )
747
977
 
748
- all_modules = _architecture_module_basenames(architecture)
749
978
  if not all_modules:
750
979
  return (
751
980
  False,
@@ -764,18 +993,20 @@ def run_global_sync(
764
993
  target_coverage=target_coverage,
765
994
  )
766
995
 
767
- dep_result = build_dep_graph_from_architecture_data(
768
- architecture,
996
+ dep_graph, dep_warnings = _build_scoped_global_dep_graph(
997
+ all_modules,
769
998
  analysis.modules_to_sync,
770
- source_name=f"combined architecture data under {project_root}",
999
+ project_root,
771
1000
  )
772
1001
  ordered_modules = _dependency_ordered_modules(
773
- analysis.modules_to_sync, dep_result.graph
1002
+ analysis.modules_to_sync, dep_graph
774
1003
  )
775
1004
 
776
1005
  if dry_run:
777
1006
  if not quiet:
778
- _print_global_sync_plan(analysis, ordered_modules, dep_result.warnings, budget)
1007
+ _print_global_sync_plan(
1008
+ analysis, ordered_modules, dep_warnings, budget, verbose=verbose
1009
+ )
779
1010
  return (
780
1011
  True,
781
1012
  f"Global sync dry run: {len(ordered_modules)} module(s) would sync.",
@@ -801,13 +1032,13 @@ def run_global_sync(
801
1032
  "global-sync",
802
1033
  )
803
1034
 
804
- for warning in dep_result.warnings:
1035
+ for warning in dep_warnings:
805
1036
  if not quiet:
806
1037
  console.print(f"[yellow]Warning: {warning}[/yellow]")
807
1038
 
808
1039
  runner = AsyncSyncRunner(
809
1040
  basenames=ordered_modules,
810
- dep_graph=dep_result.graph,
1041
+ dep_graph=dep_graph,
811
1042
  sync_options={
812
1043
  "total_budget": budget,
813
1044
  "skip_verify": skip_verify,
@@ -825,6 +1056,7 @@ def run_global_sync(
825
1056
  verbose=verbose,
826
1057
  issue_url=None,
827
1058
  module_cwds=analysis.module_cwds,
1059
+ module_targets=analysis.module_targets,
828
1060
  initial_cost=0.0,
829
1061
  )
830
1062
  success, message, cost = runner.run()
@@ -946,6 +1178,13 @@ def _resolve_module_cwd(basename: str, project_root: Path) -> Path:
946
1178
  they match everything and should not claim ownership of unrelated modules.
947
1179
  2. Fall back to project_root (which may have its own root .pddrc).
948
1180
  """
1181
+ root_has_prompt = False
1182
+ try:
1183
+ _, _, root_lang_to_path = _resolve_module_sync_context(basename, project_root)
1184
+ root_has_prompt = bool(root_lang_to_path)
1185
+ except Exception:
1186
+ root_has_prompt = False
1187
+
949
1188
  # 1. Scan subdirectories for .pddrc files (max depth 2)
950
1189
  best_match: Optional[Path] = None
951
1190
  best_depth = -1
@@ -962,10 +1201,11 @@ def _resolve_module_cwd(basename: str, project_root: Path) -> Path:
962
1201
  if _is_catchall_match(basename, config):
963
1202
  continue
964
1203
  candidate_dir = pddrc_path.parent
965
- if _is_broad_basename_glob_match(basename, config, detected) and not (
966
- _prompt_exists_for_context(candidate_dir, config, detected, basename)
967
- ):
968
- continue
1204
+ if _is_broad_basename_glob_match(basename, config, detected):
1205
+ if root_has_prompt:
1206
+ continue
1207
+ if not _prompt_exists_for_context(candidate_dir, config, detected, basename):
1208
+ continue
969
1209
  candidate_depth = len(candidate_dir.relative_to(project_root).parts)
970
1210
  if candidate_depth > best_depth:
971
1211
  best_match = candidate_dir