claude-code-conductor 2.55.0__tar.gz → 2.56.0__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 (239) hide show
  1. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/docs/parallel-agents-setup.md +28 -6
  2. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/hooks/check_agent_invocation.py +4 -3
  3. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/hooks/patterns_guard.py +1 -0
  4. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/hooks/planner_check.py +4 -3
  5. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/hooks/post_tool.py +1 -0
  6. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/hooks/pre_compact.py +17 -4
  7. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/hooks/pre_tool.py +6 -2
  8. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/hooks/recall_autorebuild.py +3 -1
  9. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/hooks/report_contract_check.py +1 -0
  10. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/hooks/session_mode_watch.py +1 -0
  11. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/hooks/tier_autoapply.py +5 -3
  12. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/hooks/worktree_guard.py +6 -2
  13. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/skills/dev-workflow/references/plan-design-guidelines.md +9 -0
  14. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/skills/parallel-agents/SKILL.md +16 -11
  15. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/CHANGELOG.md +37 -0
  16. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/PKG-INFO +1 -1
  17. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/src/c3/__init__.py +1 -1
  18. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/skills/test_planner_lightweight.py +1 -1
  19. claude_code_conductor-2.56.0/tests/test_hooks_stdin_idiom.py +357 -0
  20. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/test_session_mode_watch.py +142 -0
  21. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/CLAUDE.md +0 -0
  22. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/agents/architect.md +0 -0
  23. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/agents/code-reviewer.md +0 -0
  24. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/agents/design-critic.md +0 -0
  25. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/agents/developer.md +0 -0
  26. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/agents/doc-writer.md +0 -0
  27. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/agents/interviewer.md +0 -0
  28. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/agents/planner.md +0 -0
  29. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/agents/project-setup.md +0 -0
  30. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/agents/security-reviewer.md +0 -0
  31. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/agents/systematic-debugger.md +0 -0
  32. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/agents/tester.md +0 -0
  33. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/agents/wt_developer.md +0 -0
  34. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/agents/wt_systematic-debugger.md +0 -0
  35. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/agents/wt_tester.md +0 -0
  36. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/breaking-changes.txt +0 -0
  37. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/deletions.txt +0 -0
  38. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/docs/autonomous-mode-onboarding.md +0 -0
  39. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/docs/config-policy.md +0 -0
  40. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/docs/nul-boundary.md +0 -0
  41. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/docs/platform-adapters.md +0 -0
  42. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/docs/settings.json.md +0 -0
  43. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/hooks/_hook_utils.py +0 -0
  44. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/hooks/consolidate_memory.py +0 -0
  45. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/hooks/permission_handler.py +0 -0
  46. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/hooks/permission_handler_toast.py +0 -0
  47. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/hooks/recall_inject.py +0 -0
  48. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/hooks/restore_session.py +0 -0
  49. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/hooks/select_tier.py +0 -0
  50. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/hooks/session_start.py +0 -0
  51. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/hooks/session_stop.py +0 -0
  52. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/hooks/session_utils.py +0 -0
  53. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/hooks/statusline.py +0 -0
  54. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/hooks/stop.py +0 -0
  55. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/hooks/tier_gap_check.py +0 -0
  56. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/memory/.gitkeep +0 -0
  57. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/permission_rules.json +0 -0
  58. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/rules/promoted/index.md +0 -0
  59. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/settings.json +0 -0
  60. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/skills/autonomous-mode/SKILL.md +0 -0
  61. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/skills/autonomous-mode/scripts/mode_line.py +0 -0
  62. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/skills/brainstorm/SKILL.md +0 -0
  63. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/skills/codex-review/SKILL.md +0 -0
  64. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/skills/dev-workflow/SKILL.md +0 -0
  65. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/skills/dev-workflow/references/code-review-checklist.md +0 -0
  66. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/skills/dev-workflow/references/design-critic-rubric.md +0 -0
  67. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/skills/dev-workflow/references/design-rubric.md +0 -0
  68. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/skills/dev-workflow/references/interview-rubric.md +0 -0
  69. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/skills/dev-workflow/references/security-review-checklist.md +0 -0
  70. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/skills/dev-workflow/scripts/record_agent_outcome.py +0 -0
  71. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/skills/dev-workflow/scripts/record_review_decision.py +0 -0
  72. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/skills/dev-workflow/scripts/review_hint_inject.py +0 -0
  73. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/skills/develop/SKILL.md +0 -0
  74. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/skills/doc/SKILL.md +0 -0
  75. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/skills/extract-lib/SKILL.md +0 -0
  76. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/skills/init-session/SKILL.md +0 -0
  77. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/skills/init-session/scripts/session_guard.py +0 -0
  78. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/skills/mcp-config/SKILL.md +0 -0
  79. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/skills/pattern-status/SKILL.md +0 -0
  80. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/skills/promote-pattern/SKILL.md +0 -0
  81. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/skills/recall/SKILL.md +0 -0
  82. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/skills/report-timestamp/SKILL.md +0 -0
  83. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/skills/report-timestamp/scripts/get_timestamp.py +0 -0
  84. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/skills/review-phase/SKILL.md +0 -0
  85. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/skills/setup/SKILL.md +0 -0
  86. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/skills/setup/reference.md +0 -0
  87. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/skills/setup/templates/coding-standards-template.md +0 -0
  88. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/skills/setup/templates/project-conventions-template.md +0 -0
  89. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/skills/start/SKILL.md +0 -0
  90. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.claude/state/.gitkeep +0 -0
  91. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/.gitignore +0 -0
  92. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/ARCHITECTURE.md +0 -0
  93. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/LICENSE +0 -0
  94. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/LICENSES/fastembed-LICENSE +0 -0
  95. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/LICENSES/fastembed-NOTICE +0 -0
  96. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/LICENSES/numpy-LICENSE +0 -0
  97. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/LICENSES/onnxruntime-LICENSE +0 -0
  98. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/LICENSES/paraphrase-multilingual-MiniLM-L12-v2-LICENSE +0 -0
  99. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/README.md +0 -0
  100. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/hatch_build.py +0 -0
  101. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/pyproject.toml +0 -0
  102. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/src/c3/__main__.py +0 -0
  103. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/src/c3/_db_params.py +0 -0
  104. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/src/c3/_excludes.py +0 -0
  105. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/src/c3/_terminal.py +0 -0
  106. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/src/c3/adapters.py +0 -0
  107. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/src/c3/cli.py +0 -0
  108. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/src/c3/cli_ask.py +0 -0
  109. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/src/c3/cli_doctor.py +0 -0
  110. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/src/c3/cli_init.py +0 -0
  111. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/src/c3/cli_list.py +0 -0
  112. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/src/c3/cli_metrics.py +0 -0
  113. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/src/c3/cli_plan.py +0 -0
  114. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/src/c3/cli_recall.py +0 -0
  115. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/src/c3/cli_run.py +0 -0
  116. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/src/c3/cli_tier.py +0 -0
  117. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/src/c3/cli_update.py +0 -0
  118. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/src/c3/db.py +0 -0
  119. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/src/c3/embedding.py +0 -0
  120. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/src/c3/gitutil.py +0 -0
  121. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/src/c3/mcp_server.py +0 -0
  122. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/src/c3/migrate.py +0 -0
  123. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/src/c3/migrations/001_initial.sql +0 -0
  124. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/src/c3/migrations/002_agent_cost_runs.sql +0 -0
  125. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/src/c3/migrations/003_tier_cost.sql +0 -0
  126. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/src/c3/migrations/004_agent_outcomes.sql +0 -0
  127. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/src/c3/migrations/005_drop_agent_tier_bandit.sql +0 -0
  128. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/src/c3/migrations/006_review_decisions_severity.sql +0 -0
  129. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/src/c3/migrations/README.md +0 -0
  130. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/src/c3/migrations/__init__.py +0 -0
  131. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/src/c3/paths.py +0 -0
  132. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/src/c3/plan_validator.py +0 -0
  133. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/src/c3/platforms.py +0 -0
  134. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/src/c3/pricing.py +0 -0
  135. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/src/c3/question.py +0 -0
  136. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/src/c3/recall_chunker.py +0 -0
  137. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/src/c3/recall_index.py +0 -0
  138. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/src/c3/usage_ingester.py +0 -0
  139. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/__init__.py +0 -0
  140. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/_pre_compact_helpers.py +0 -0
  141. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/conftest.py +0 -0
  142. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/fixtures/usage/README.md +0 -0
  143. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/fixtures/usage/mainline.jsonl +0 -0
  144. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/fixtures/usage/subagents/agent-deadbeef.jsonl +0 -0
  145. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/fixtures/usage/subagents/agent-deadbeef.meta.json +0 -0
  146. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/hooks/__init__.py +0 -0
  147. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/hooks/test_check_agent_invocation.py +0 -0
  148. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/hooks/test_consolidate_memory.py +0 -0
  149. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/hooks/test_hook_utils.py +0 -0
  150. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/hooks/test_permission_handler.py +0 -0
  151. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/hooks/test_permission_handler_toast.py +0 -0
  152. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/hooks/test_pip_reinstall_reminder.py +0 -0
  153. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/hooks/test_planner_check.py +0 -0
  154. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/hooks/test_planner_check_dev.py +0 -0
  155. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/hooks/test_post_tool.py +0 -0
  156. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/hooks/test_pre_tool.py +0 -0
  157. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/hooks/test_recall_autorebuild.py +0 -0
  158. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/hooks/test_recall_inject.py +0 -0
  159. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/hooks/test_record_agent_outcome.py +0 -0
  160. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/hooks/test_record_review_decision.py +0 -0
  161. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/hooks/test_restore_session.py +0 -0
  162. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/hooks/test_review_hint_inject.py +0 -0
  163. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/hooks/test_select_tier.py +0 -0
  164. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/hooks/test_select_tier_escalation.py +0 -0
  165. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/hooks/test_session_start.py +0 -0
  166. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/hooks/test_session_stop.py +0 -0
  167. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/hooks/test_session_utils.py +0 -0
  168. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/hooks/test_settings_local_absolute_paths.py +0 -0
  169. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/hooks/test_settings_tier_autoapply_registration.py +0 -0
  170. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/hooks/test_similarity_boost.py +0 -0
  171. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/hooks/test_statusline.py +0 -0
  172. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/hooks/test_statusline_template_sync.py +0 -0
  173. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/hooks/test_sync_check.py +0 -0
  174. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/hooks/test_template_guard.py +0 -0
  175. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/hooks/test_tier_autoapply.py +0 -0
  176. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/hooks/test_tier_gap_check.py +0 -0
  177. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/hooks/test_tier_security_fixes.py +0 -0
  178. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/skills/__init__.py +0 -0
  179. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/skills/_skill_helpers.py +0 -0
  180. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/skills/test_dev_workflow_no_task_type.py +0 -0
  181. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/skills/test_init_session_no_task_type.py +0 -0
  182. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/skills/test_marker_compliance.py +0 -0
  183. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/skills/test_parallel_agents_skill_tier.py +0 -0
  184. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/skills/test_recall_skill.py +0 -0
  185. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/skills/test_session_backlog_reconciliation.py +0 -0
  186. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/skills/test_session_guard.py +0 -0
  187. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/skills/test_setup_templates.py +0 -0
  188. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/skills/test_start_skill_bugfix_flow.py +0 -0
  189. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/skills/test_start_skill_new_flow.py +0 -0
  190. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/skills/test_start_skill_security_audit_phase.py +0 -0
  191. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/test_adapters.py +0 -0
  192. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/test_check_deletions.py +0 -0
  193. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/test_cli_ask.py +0 -0
  194. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/test_cli_doctor.py +0 -0
  195. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/test_cli_doctor_launcher.py +0 -0
  196. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/test_cli_entry.py +0 -0
  197. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/test_cli_init.py +0 -0
  198. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/test_cli_list.py +0 -0
  199. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/test_cli_metrics.py +0 -0
  200. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/test_cli_plan.py +0 -0
  201. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/test_cli_recall.py +0 -0
  202. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/test_cli_run.py +0 -0
  203. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/test_cli_tier.py +0 -0
  204. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/test_cli_update_breaking_changes.py +0 -0
  205. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/test_cli_update_deletions.py +0 -0
  206. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/test_db.py +0 -0
  207. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/test_docstring_consistency.py +0 -0
  208. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/test_embedding.py +0 -0
  209. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/test_excludes.py +0 -0
  210. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/test_extract_breaking_changes.py +0 -0
  211. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/test_gitutil.py +0 -0
  212. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/test_mcp_server_elicit.py +0 -0
  213. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/test_migrate.py +0 -0
  214. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/test_mode_line.py +0 -0
  215. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/test_no_bare_python_launcher.py +0 -0
  216. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/test_nul_boundary_lint.py +0 -0
  217. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/test_paths.py +0 -0
  218. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/test_patterns_guard.py +0 -0
  219. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/test_plan_validator.py +0 -0
  220. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/test_pre_compact.py +0 -0
  221. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/test_pre_tool_hook.py +0 -0
  222. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/test_precompact_additional.py +0 -0
  223. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/test_precompact_toctou_fixes.py +0 -0
  224. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/test_pricing.py +0 -0
  225. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/test_recall_chunker.py +0 -0
  226. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/test_recall_index.py +0 -0
  227. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/test_references_migration.py +0 -0
  228. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/test_report_contract_check.py +0 -0
  229. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/test_session_utils_additional.py +0 -0
  230. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/test_settings_hooks_registration.py +0 -0
  231. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/test_skill_no_builtin_conflict.py +0 -0
  232. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/test_statusline.py +0 -0
  233. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/test_stop_additional.py +0 -0
  234. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/test_stop_hook.py +0 -0
  235. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/test_stop_precompact_fixes.py +0 -0
  236. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/test_sync_template_stop.py +0 -0
  237. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/test_template_pre_tool_hook.py +0 -0
  238. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/test_usage_ingester.py +0 -0
  239. {claude_code_conductor-2.55.0 → claude_code_conductor-2.56.0}/tests/test_worktree_guard.py +0 -0
@@ -101,12 +101,34 @@ parallel-agents は「直近の修正を反映した worktree で並列実装さ
101
101
 
102
102
  検証実績 (2026-05-23 〜 2026-05-24):
103
103
 
104
- - foreground / background / 並列 / 失敗 (exit 1) の全パターンで 10/10 cleanup 確認
105
- - ごく稀に **外部要因による一時的ファイルロック** で cleanup が失敗するケースを
106
- 1 件観測 (約 1/11 以下)。原因は未特定(アンチウィルス・バックアップソフト・
107
- その他常駐プロセスのいずれかの可能性)
108
- - SKILL.md Step 2-F-3 の残留チェック + `git worktree prune` フォールバックで
109
- 実害なく吸収される設計
104
+ - 2026-05-23 の集中検証で foreground / background / 並列 / 失敗 (exit 1) の 4 パターン・
105
+ **全 5 シナリオで cleanup 確認**(一次資料:
106
+ `.claude/reports/archive/worktree-cleanup-verification-20260523-234110.md`。ただし
107
+ この検証ログは gitignored かつ配布対象外で、C3 配布元のローカルにのみ保管されている。
108
+ fresh clone / `c3 init` 展開先には存在しないため、配布元での検証可能性を残す目的で
109
+ パスのみ記載している)
110
+ - 上記に v2.15.2 リリース作業中 (〜2026-05-24) の実起動を加えた累計では **10/11 で
111
+ cleanup**。残る 1 件は **外部要因による一時的ファイルロック** で cleanup が失敗した
112
+ ケース (約 1/11)。原因は未特定(アンチウィルス・バックアップソフト・その他常駐
113
+ プロセスのいずれかの可能性)
114
+
115
+ なお 2026-05-23 の 5 シナリオ検証はファイル変更を伴わないタスク(`pwd` / `git rev-parse` /
116
+ `date`)のみで実施されており、ソースコード変更を伴うタスクでの auto-cleanup 挙動は
117
+ 下記 2026-07-26 実測の追記で初めて確認された(5 シナリオは実行モードの網羅であって
118
+ ファイル変更の有無の網羅ではないため、両者は矛盾しない)。
119
+
120
+ **2026-07-26 実測で判明した条件**:
121
+
122
+ - **git 的に未変更の worktree は確実に auto-cleanup される** — confirm- 系の
123
+ gitignored-only レポート出力タスクなど、`writes` が全て `.claude/reports/` 等の
124
+ gitignored ファイルのみの場合、Agent 完了時に worktree が自動削除される
125
+ - **変更が残る worktree は残留しうる** — ソースコード修正など変更が git 管理下に
126
+ 残る worktree は auto-cleanup されず残留することがある。残留時は SKILL.md Step
127
+ 2-F-3 の残留チェック + 手動 cleanup(`git worktree remove` / `git branch -D`)で
128
+ 後始末する
129
+
130
+ SKILL.md Step 2-F-3 の残留チェック + `git worktree prune` フォールバックで
131
+ 実害なく吸収される設計。
110
132
 
111
133
  ---
112
134
 
@@ -41,6 +41,7 @@ sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
41
41
  from _hook_utils import write_debug_log # noqa: E402
42
42
 
43
43
  try:
44
+ sys.stdin.reconfigure(encoding="utf-8")
44
45
  sys.stdout.reconfigure(encoding="utf-8")
45
46
  sys.stderr.reconfigure(encoding="utf-8")
46
47
  except AttributeError:
@@ -53,8 +54,8 @@ REVIEWER_TYPES = frozenset({"code-reviewer", "security-reviewer"})
53
54
  PROJECT_ROOT = Path(__file__).resolve().parents[2]
54
55
  DEBUG_LOG_PATH = PROJECT_ROOT / ".claude" / "tmp" / "agent_hook_debug.log"
55
56
 
56
- # DoS 防御の読み取り上限(hook はローカル前提だが多層防御として明示する)。
57
- _STDIN_READ_LIMIT_BYTES = 1 * 1024 * 1024 # 1 MiB
57
+ # DoS 防御の読み取り上限(文字数ベース)。hook はローカル前提だが多層防御として明示する。
58
+ _STDIN_READ_LIMIT_CHARS = 1 * 1024 * 1024 # 1M chars
58
59
 
59
60
 
60
61
  def _escape_for_log(value: str) -> str:
@@ -64,7 +65,7 @@ def _escape_for_log(value: str) -> str:
64
65
 
65
66
  def main() -> None:
66
67
  try:
67
- payload = json.loads(sys.stdin.read(_STDIN_READ_LIMIT_BYTES))
68
+ payload = json.loads(sys.stdin.read(_STDIN_READ_LIMIT_CHARS))
68
69
  except (json.JSONDecodeError, ValueError):
69
70
  sys.exit(0)
70
71
 
@@ -30,6 +30,7 @@ sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
30
30
  from _hook_utils import sanitize_for_terminal # noqa: E402
31
31
 
32
32
  try:
33
+ sys.stdin.reconfigure(encoding='utf-8')
33
34
  sys.stdout.reconfigure(encoding='utf-8')
34
35
  sys.stderr.reconfigure(encoding='utf-8')
35
36
  except AttributeError:
@@ -41,6 +41,7 @@ sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
41
41
  from _hook_utils import write_debug_log # noqa: E402
42
42
 
43
43
  try:
44
+ sys.stdin.reconfigure(encoding="utf-8")
44
45
  sys.stdout.reconfigure(encoding="utf-8")
45
46
  sys.stderr.reconfigure(encoding="utf-8")
46
47
  except AttributeError:
@@ -58,8 +59,8 @@ except ImportError:
58
59
  PROJECT_ROOT = Path(__file__).resolve().parents[2]
59
60
  DEBUG_LOG_PATH = PROJECT_ROOT / ".claude" / "tmp" / "planner_check_debug.log"
60
61
 
61
- # DoS 防御の読み取り上限(hook はローカル前提だが多層防御として明示する)。
62
- _STDIN_READ_LIMIT_BYTES = 1 * 1024 * 1024 # 1 MiB
62
+ # DoS 防御の読み取り上限(stdin は文字数ベース)。hook はローカル前提だが多層防御として明示する。
63
+ _STDIN_READ_LIMIT_CHARS = 1 * 1024 * 1024 # 1M chars
63
64
  _FILE_READ_LIMIT_BYTES = 512 * 1024 # 512 KiB
64
65
 
65
66
 
@@ -230,7 +231,7 @@ def _check_r6_reviewer_absence(tasks: list) -> list[str]:
230
231
 
231
232
  def main() -> None:
232
233
  try:
233
- payload = json.loads(sys.stdin.read(_STDIN_READ_LIMIT_BYTES))
234
+ payload = json.loads(sys.stdin.read(_STDIN_READ_LIMIT_CHARS))
234
235
  except (json.JSONDecodeError, ValueError):
235
236
  sys.exit(0)
236
237
 
@@ -21,6 +21,7 @@ import re
21
21
  import sys
22
22
 
23
23
  try:
24
+ sys.stdin.reconfigure(encoding='utf-8')
24
25
  sys.stdout.reconfigure(encoding='utf-8')
25
26
  sys.stderr.reconfigure(encoding='utf-8')
26
27
  except AttributeError:
@@ -12,10 +12,23 @@ import re
12
12
  import sys
13
13
  from datetime import datetime, timedelta, timezone
14
14
 
15
- sys.stdout.reconfigure(encoding='utf-8')
16
- sys.stderr.reconfigure(encoding='utf-8')
17
-
18
- from session_utils import SESSION_JSON_MARKER, append_checkpoint, is_worktree, SESSIONS_DIR
15
+ try:
16
+ sys.stdin.reconfigure(encoding='utf-8')
17
+ sys.stdout.reconfigure(encoding='utf-8')
18
+ sys.stderr.reconfigure(encoding='utf-8')
19
+ except AttributeError:
20
+ pass
21
+
22
+ from session_utils import append_checkpoint, is_worktree, SESSIONS_DIR
23
+ # SESSION_JSON_MARKER は本ファイルのロジックでは未参照だが、過去レビュー(Code Medium-3a)の
24
+ # 契約として module-level 定数の存在を tests/test_stop_precompact_fixes.py が要求する再エクスポート。
25
+ # 未使用に見えても削除しないこと。
26
+ # `# noqa: F401` は flake8/ruff 固有の規約で生の pyflakes は解釈しないため、
27
+ # 代わりに __all__ へ列挙して re-export であることを明示する(pyflakes は
28
+ # __all__ 掲載名を使用済みとみなすため、警告が実際に抑制される)。
29
+ from session_utils import SESSION_JSON_MARKER
30
+
31
+ __all__ = ["SESSION_JSON_MARKER"]
19
32
 
20
33
 
21
34
  # デバウンス窓幅(秒)。直近の PreCompact checkpoint からこの秒数以内の再実行は
@@ -7,8 +7,12 @@ import re
7
7
  import shlex
8
8
  import sys
9
9
 
10
- sys.stdout.reconfigure(encoding='utf-8')
11
- sys.stderr.reconfigure(encoding='utf-8')
10
+ try:
11
+ sys.stdin.reconfigure(encoding='utf-8')
12
+ sys.stdout.reconfigure(encoding='utf-8')
13
+ sys.stderr.reconfigure(encoding='utf-8')
14
+ except AttributeError:
15
+ pass
12
16
 
13
17
 
14
18
  def _is_rm_rf(tokens: list[str], rm_idx: int) -> bool:
@@ -23,8 +23,10 @@ import sys
23
23
  import time
24
24
  from pathlib import Path
25
25
 
26
- # CLAUDE.md §9-3: reconfigure stdout/stderr to UTF-8 on Windows.
26
+ # CLAUDE.md §9-3: reconfigure stdin/stdout/stderr to UTF-8 on Windows.
27
27
  try:
28
+ if sys.stdin and hasattr(sys.stdin, "reconfigure"):
29
+ sys.stdin.reconfigure(encoding="utf-8")
28
30
  if sys.stdout and hasattr(sys.stdout, "reconfigure"):
29
31
  sys.stdout.reconfigure(encoding="utf-8")
30
32
  if sys.stderr and hasattr(sys.stderr, "reconfigure"):
@@ -38,6 +38,7 @@ sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
38
38
  from _hook_utils import norm_component, sanitize_for_terminal # noqa: E402
39
39
 
40
40
  try:
41
+ sys.stdin.reconfigure(encoding='utf-8')
41
42
  sys.stdout.reconfigure(encoding='utf-8')
42
43
  sys.stderr.reconfigure(encoding='utf-8')
43
44
  except AttributeError:
@@ -52,6 +52,7 @@ sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
52
52
  from _hook_utils import norm_component, sanitize_for_terminal # noqa: E402
53
53
 
54
54
  try:
55
+ sys.stdin.reconfigure(encoding='utf-8')
55
56
  sys.stdout.reconfigure(encoding='utf-8')
56
57
  sys.stderr.reconfigure(encoding='utf-8')
57
58
  except AttributeError:
@@ -106,8 +106,10 @@ _VALID_TIERS = ("haiku", "sonnet", "opus")
106
106
 
107
107
  KILL_SWITCH_ENV = "C3_TIER_AUTOAPPLY_DISABLE"
108
108
 
109
- # DoS 防御の stdin 読み取り上限(check_agent_invocation.py と同一)。
110
- _STDIN_READ_LIMIT_BYTES = 1 * 1024 * 1024 # 1 MiB
109
+ # DoS 防御の stdin 読み取り上限(文字数ベース・check_agent_invocation.py と同一)。
110
+ # sys.stdin はテキストストリームのため read(n) の n は文字数であってバイト数ではない
111
+ # (UTF-8 マルチバイト文字では実バイト量が最大 4 倍になり得る)。
112
+ _STDIN_READ_LIMIT_CHARS = 1 * 1024 * 1024 # 1M chars
111
113
 
112
114
  # applied-state のローテーション閾値(§3-4)。
113
115
  _MAX_JSONL_BYTES = 1 * 1024 * 1024 # 1 MB
@@ -371,7 +373,7 @@ def main() -> None:
371
373
  sys.exit(0)
372
374
 
373
375
  try:
374
- payload = json.loads(sys.stdin.read(_STDIN_READ_LIMIT_BYTES))
376
+ payload = json.loads(sys.stdin.read(_STDIN_READ_LIMIT_CHARS))
375
377
  except (json.JSONDecodeError, ValueError):
376
378
  sys.exit(0)
377
379
  if not isinstance(payload, dict):
@@ -16,8 +16,12 @@ import os
16
16
  import re
17
17
  import sys
18
18
 
19
- sys.stdout.reconfigure(encoding='utf-8')
20
- sys.stderr.reconfigure(encoding='utf-8')
19
+ try:
20
+ sys.stdin.reconfigure(encoding='utf-8')
21
+ sys.stdout.reconfigure(encoding='utf-8')
22
+ sys.stderr.reconfigure(encoding='utf-8')
23
+ except AttributeError:
24
+ pass
21
25
 
22
26
  # worktree パスの識別に使うコンポーネント名。
23
27
  # `.claude/worktrees/agent-<id>/` という構造を前提とし、
@@ -65,6 +65,14 @@ v2.1.0 で `tdd-develop` エージェントを廃止した。TDD を伴う機能
65
65
 
66
66
  13. **`depends_on: []` を空配列で書かない** — `c3 plan validate` の構造チェックで lint されるリスクがある(依存が無いタスクは `depends_on` フィールド**自体を省略**する慣習)
67
67
 
68
+ ## worktree 実行経路の制約(運用ルール・機械強制なし)
69
+
70
+ 14. **writes が全て gitignored のタスクは main 直接経路で起動される** — `writes` が全て `.claude/reports/` 等の gitignored ファイル(レポート出力のみ)のタスク(confirm- 系が典型)は、`parallel-agents` skill 実行時に worktree を使わず main 直接経路・素の agent(読み替え: `wt_tester`→`tester` / `wt_developer`→`developer`)で起動される。git 的に「未変更」の worktree は Agent 完了時に auto-cleanup され、親が取り込む前に成果物が消失するため。
71
+ - **planner は該当タスクの `writes` 宣言を変更不要** — 運用層(`parallel-agents` skill)で読み替える設計のため、plan-report 側は従来通り `wt_tester` / `wt_developer` を宣言してよい
72
+ - **main 直接経路のタスク取り込み時の検証** — worktree 隔離が失われるため、親 Claude は当該タスク完了後に `git status --short` で `writes` 宣言外のファイルへの書き込みが発生していないことを確認する(宣言外の変更があれば、通常の permission プロンプトに頼らず明示的に指摘して取り込みを中止する)
73
+ - **R5 との同族関係** — R5(`read_only: true` タスク worktree 禁止)と同じく gitignored-only write を理由に isolation を外すが、R5 は hook で機械強制、本ルール 14 は**文書ルール(機械強制なし)**であり段階的対処の段階 1
74
+ - **再発実績の積み上がり時** は機械化(hook 拡張)への昇格を検討する(v2.55.1 で初実測)
75
+
68
76
  ## 直列・並列交互パターンの取り扱い
69
77
 
70
78
  ユーザーが **stage 単位で順序を強制したい / 中間状態を確認したい** と要求した場合は、ルール 1(「真の依存だけに絞る」)から逸脱して順序付けの `depends_on` を許容してよい。典型構造:
@@ -102,6 +110,7 @@ plan-report を Write する前に以下を必ず確認する:
102
110
  - [ ] 想定実行時間が 15 分を超えるタスクがないか
103
111
  - [ ] R5: `read_only: true` タスクに `isolation: "worktree"` を指定していないか
104
112
  - [ ] R6: タスク総数 3 件以上なら reviewer 系タスクが 1 件以上含まれているか
113
+ - [ ] ルール 14: writes が全て gitignored のタスク(confirm- 等)は運用層で main 直接経路に読み替えられることを認識しているか
105
114
 
106
115
  ---
107
116
 
@@ -110,9 +110,9 @@ stdout の JSON 形式:
110
110
  |---|---|---|---|---|
111
111
  | test-login | tester | `wt_tester` | false | tests/auth/test_login.py, .claude/reports/test-report-test-login.md |
112
112
  | impl-login | developer | `wt_developer` | false | src/auth/login.py |
113
- | confirm-login | tester | `wt_tester` | false | .claude/reports/test-report-confirm-login.md |
113
+ | confirm-login | tester | `tester` | false | .claude/reports/test-report-confirm-login.md |
114
114
 
115
- v2.2.0 以降、全 agent が並列起動可能のため `parallelizable` 列は省略する。subagent_type マッピングは 2-C 参照。
115
+ v2.2.0 以降、全 agent が並列起動可能のため `parallelizable` 列は省略する。subagent_type マッピングは 2-C 参照。confirm-login は writes が gitignored レポートのみのため 2-C の isolation ルール(gitignored-only writes は main 直接経路・素の agent)適用。
116
116
 
117
117
  ### 2-B: マイルストーン確認(設定時のみ)
118
118
 
@@ -154,7 +154,7 @@ plan-report 承認時点で全タスク・agent・writes・prompt が確認済
154
154
 
155
155
  - `subagent_type`: 上記マッピング表の値
156
156
  - `model`: **親 Claude は `model:` を指定しない**。`wt_developer` タスクは起動時に PreToolUse hook(`tier_autoapply.py`)が `[tier-routing 推奨]`(developer 基準)の推奨 Tier を `model:` へ自動適用する(機械適用・親 Claude が model: を転記する必要はない)。この推奨 Tier の SSOT は `.claude/state/tier_selection.json` の `tier`(無ければ `suggested_model`)であり、kickoff の UserPromptSubmit で 1 度確定して以降 wave をまたいで安定する(`[tier-routing 推奨]` の表示テキストはその派生表示)。hook は実適用した model を `.claude/state/tier_autoapply.jsonl` に記録する(適用者=記録 SSOT)。並列 wave 内に複数の `wt_developer` が居る場合、**全 wt_developer は同一の推奨 Tier(単一 tier_selection.json.tier)で起動される。これは本 MVP の設計として明示的に許容する**(per-task complexity に応じて wt_developer ごとに tier を変える機能は本 MVP のスコープ外・フェーズ 3 以降)。推奨と異なる Tier を使いたい場合のみ `model:` を明示指定する(明示指定は hook に尊重され上書きされない)。`wt_tester` は **test- タスク(Red)に限り機械適用対象**(`C3_TASK_ID` マーカーの `test-` プレフィックスで RED_APPLY_ROLES 注入・confirm- 等の非 test- タスクは対象外=frontmatter 任せ)。`wt_systematic-debugger` / `code-reviewer` / `security-reviewer` は **model: 指定対象外**(frontmatter/元 agent 任せ・機械適用対象外)。fork は model 上書き不可のため対象外。
157
- - `isolation`: **`read_only: false` タスクのみ `"worktree"` を指定する。`read_only: true`(code-reviewer / security-reviewer)はソースを変更しないため worktree 不要。`isolation` を省略して main リポジトリで直接実行し、レポートを main の `.claude/reports/` に直接書かせる。**
157
+ - `isolation`: **`read_only: false` タスクのみ `"worktree"` を指定する。ただし `writes` が全て gitignored ファイル(実質 `.claude/reports/` のレポートのみ)のタスク(confirm- 系が典型)は git 的に「未変更」の worktree となるため Agent 完了時に auto-cleanup され、親が取り込む前に成果物が消失する(2026-07-26 実測)ため、worktree を使わず `isolation` を省略して main 直接経路・素の agent(読み替え: `wt_tester`→`tester` 等)で起動する。`read_only: true`(code-reviewer / security-reviewer)はソースを変更しないため worktree 不要。`isolation` を省略して main リポジトリで直接実行し、レポートを main の `.claude/reports/` に直接書かせる。**
158
158
  > **R5 hook による機械強制**: 上記ルールに違反して `read_only: true` のレビュータスクに `isolation: "worktree"` を指定した場合、`.claude/hooks/check_agent_invocation.py`(PreToolUse Agent hook)が exit 2 でブロックする。詳細は `.claude/skills/dev-workflow/references/plan-design-guidelines.md` R5 参照。
159
159
  - `run_in_background`: `true`
160
160
  - `description`: タスク id(5 単語以内)
@@ -247,7 +247,7 @@ c3 run .claude/skills/dev-workflow/scripts/record_agent_outcome.py \
247
247
  --execution subagent --complexity {セッションファイルの tier-routing複雑度: 行の値} \
248
248
  --task {task_id} # ← test-* の task_id(2-C の C3_TASK_ID マーカーと完全一致)
249
249
 
250
- # wt_tester→tester・confirm- タスクの失敗(gate は 2-E のまま・frontmatter 解決)
250
+ # tester→tester・confirm- タスクの失敗(gitignored-only writes ルール(plan-design-guidelines.md ルール 14・2-C の isolation 項参照)により main 直接経路で起動・gate は 2-E のまま・frontmatter 解決)
251
251
  c3 run .claude/skills/dev-workflow/scripts/record_agent_outcome.py \
252
252
  --role tester --outcome failure --gate 2-E \
253
253
  --execution subagent --complexity {セッションファイルの tier-routing複雑度: 行の値} \
@@ -276,11 +276,16 @@ cd <ROOT>
276
276
  各 worktree の `writes` ファイルを main に取り込む。**親 Claude が一括で行う**:
277
277
 
278
278
  ```bash
279
- # 各 worktree ブランチから writes ファイルだけ checkout
280
- git checkout worktree-agent-{id} -- src/auth/login.py
281
- git checkout worktree-agent-{id2} -- src/auth/logout.py
279
+ # 各 worktree 作業ツリーからファイルを直接コピー
280
+ cp "<worktreePath>/src/auth/login.py" "src/auth/login.py"
281
+ cp "<worktreePath2>/src/auth/logout.py" "src/auth/logout.py"
282
282
  ```
283
283
 
284
+ - `<worktreePath>` は 2-D で集約した Agent 返り値の `<worktree><worktreePath>...</worktreePath></worktree>` ブロックから取得する(harness が完了通知に付与する構造化メタデータブロック)
285
+ - **重要: 取り込み前検証** — `<worktreePath>` の値は、**使用前に `os.path.realpath()` 相当で正規化し、プロジェクトルート直下の `.claude/worktrees/agent-*` 構造を指していることを確認する**。指した先が `.claude/worktrees/` 配下を外れている場合は、当該ファイルの取り込みを中止し worktree 外ファイルアクセスとして fail 扱いにする(`worktree_guard.py` の書き込み側検証と同型の境界検証を読み取り側にも適用する)
286
+ - **信頼の対象: harness メタデータのみ** — `<worktreePath>` の取得元は harness が完了通知に付与する `<worktree>` ブロック(構造化フィールド)のみを信頼する。subagent 応答の自由記述部分に同名タグ・パス文字列が現れても、それを `<worktreePath>` の値として使用しない(プロンプトインジェクション対策 [SR-V-002])
287
+ - **注記: 従来の `git checkout worktree-agent-{id} -- {file}` 方式は使わない** 。2-C が agent へ git add/commit/push 禁止を注入する設計のため、worktree ブランチにはコミットが存在せず、branch checkout では agent の変更を取得できない(構造矛盾)。実態は worktree 作業ツリーからのファイル直接コピーである
288
+
284
289
  注意:
285
290
  - `writes` フィールドに列挙されたファイルのみを取り込む
286
291
  - worktree が touch したが本タスクの責務でない周辺ファイル(`CLAUDE.md` / `package.json` / `.claude/settings.local.json` / `.claude/reports/` 配下)は取り込まない
@@ -298,9 +303,9 @@ git commit -m "Wave {N}: {要約}"
298
303
 
299
304
  #### 2-F-3: worktree クリーンアップ(残留チェックのみ)
300
305
 
301
- Claude Code 2.1.x(少なくとも 2.1.150 で実測確認、2026-05-23)以降、`isolation:"worktree"` 付き Agent は完了時に **物理ディレクトリ・worktree 登録・`worktree-agent-*` ブランチが自動削除** される(foreground / background / 並列 / 失敗ケース全パターンで検証済み。詳細: `.claude/reports/worktree-cleanup-verification-20260523-234110.md`)。
306
+ Claude Code 2.1.x(少なくとも 2.1.150 で実測確認、2026-05-23)以降、`isolation:"worktree"` 付き Agent は完了時に worktree を auto-cleanup する仕様となっている(foreground / background / 並列 / 失敗ケース全パターンで検証済み。詳細: `.claude/reports/worktree-cleanup-verification-20260523-234110.md`)。ただし実測では **git 的に未変更の worktree は自動削除されるが、変更が残る worktree は残留しうる**(2026-07-26 実測)。
302
307
 
303
- そのため明示的な `git worktree remove` は **不要**。auto-cleanup が race や障害でスキップされた場合のセーフティとして残留チェックのみ行う:
308
+ したがって明示的な `git worktree remove` は基本的に不要だが、auto-cleanup が完全に走らなかった場合のセーフティとして残留チェック + 手動 cleanup で後始末する:
304
309
 
305
310
  ```bash
306
311
  # 念のため worktree 登録の残留を確認、あれば prune(物理ディレクトリも片付く)
@@ -362,7 +367,7 @@ append_checkpoint(os.path.join(SESSIONS_DIR, '{YYYYMMDD}.tmp'),
362
367
 
363
368
  - **impl- タスク(wt_developer)の成功** → `--role developer --gate 2-D`(現行のまま)。
364
369
  - **test- タスク(wt_tester Red)の成功** → **success を記録しない**(**現行の `--gate 2-D` success 記録は廃止**=成功の確定は confirm- 全合格まで遅延)。ただし wave 完了処理で親が test-report を確認し、**条件 1(Red の失敗理由が意図と違う)・条件 2(ベースライン破壊)** の違反があれば `--role tester --outcome failure --gate D-1 --task test-{X}` を記録する(違反が無ければこの時点では何も記録しない)。
365
- - **confirm- タスク(wt_tester)の成功** → **2 件**記録する:
370
+ - **confirm- タスク(plain tester・main 直接経路)の成功** → **2 件**記録する(ルール 14 により gitignored-only writes のため main 直接経路で起動される。記録ルールは同一):
366
371
  1. confirm-X 自身のイベントログ `--role tester --outcome success --gate 2-D --task confirm-{X}`(現行のまま・bandit 外)。
367
372
  2. **条件 4(Red 成果物の生存確定)**: confirm-X 全合格(wave 成功)は Red が要求した挙動が実装で満たされた確定点なので、対応する test-X の成功を `--role tester --outcome success --gate D-1 --task test-{X}` として記録する(逐次 D-3 全合格時と同じ確定点)。
368
373
 
@@ -375,7 +380,7 @@ c3 run .claude/skills/dev-workflow/scripts/record_agent_outcome.py \
375
380
  --execution subagent --complexity {セッションファイルの tier-routing複雑度: 行の値} \
376
381
  --task {task_id} # ← 2-C の C3_TASK_ID マーカーと完全一致・突合の必須キー
377
382
 
378
- # confirm- タスク自身のイベントログ: wt_tester→tester(gate 2-D・frontmatter 解決)
383
+ # confirm- タスク自身のイベントログ: tester→tester(ルール 14 により main 直接経路で起動・gate 2-D・frontmatter 解決)
379
384
  c3 run .claude/skills/dev-workflow/scripts/record_agent_outcome.py \
380
385
  --role tester --outcome success --gate 2-D \
381
386
  --execution subagent --complexity {セッションファイルの tier-routing複雑度: 行の値} \
@@ -1,5 +1,42 @@
1
1
  # Changelog
2
2
 
3
+ ## [2.56.0] - 2026-07-26
4
+
5
+ ### 追加
6
+
7
+ - **plan-design-guidelines にルール 14 を新設(gitignored-only writes タスクの main 直接経路)**: `writes` が全て gitignored ファイル(`.claude/reports/` のレポート出力のみ・confirm- 系が典型)のタスクは、parallel-agents 実行時に worktree を使わず main 直接経路・素の agent(`wt_tester`→`tester` / `wt_developer`→`developer` 読み替え)で起動する運用ルールを文書化。git 的に「未変更」の worktree は Agent 完了時に auto-cleanup され、親が取り込む前に成果物(レポート)が消失する実測 defect(2026-07-26・v2.55.1 走行 Wave 2)の再発防止。R5(read_only タスクの worktree 禁止)と同族だが本ルールは文書ルール(hook 機械強制なし)で、planner の `writes` 宣言は変更不要(読み替えは実行層)。あわせて main 直接経路タスクは worktree の使い捨て隔離を失うため、親がタスク完了後に `git status --short` で宣言外変更なしを確認する検証手順も明記
8
+ - **parallel-agents 2-F-1 に取り込み前検証を新設**: worktree からの成果物取り込みで使う `worktreePath` は、harness が完了通知に付与する `<worktree>` メタデータブロックのみを信頼し(subagent 応答本文中の同名タグ・パス文字列は無視=プロンプトインジェクション対策)、使用前に realpath 相当で正規化して `.claude/worktrees/agent-*` 配下を指すことを確認する(範囲外は取り込み中止・fail 扱い)。`worktree_guard.py` の書き込み側検証と同型の境界検証を読み取り側にも適用。コマンド例もクォート付きへ修正
9
+
10
+ ### 変更
11
+
12
+ - **parallel-agents 2-F-1 の取り込み方式を実態合わせ(`git checkout` ブランチ方式 → worktree 作業ツリーからの直接コピー)**: 従来記載の `git checkout worktree-agent-{id} -- {file}` は、2-C が agent へ git commit 禁止を注入する設計と構造矛盾(worktree ブランチにコミットが存在せず変更を取得できない)のため、実態である `cp` 直接コピー方式へ書き換え
13
+ - **parallel-agents 2-F-3 の auto-cleanup 記述を条件形へ**: 「完了時に全パターンで自動削除」から「git 的に未変更の worktree は自動削除・変更が残る worktree は残留しうる(残留チェック+手動 cleanup で後始末)」へ実測(2026-07-26)に基づき修正。2-A 例示表・2-F-4 の confirm- タスク表記もルール 14 と整合する形へ統一
14
+ - **docs/parallel-agents-setup.md の auto-cleanup 信頼度節を一次資料と整合**: 2026-05-23 検証の実数(4 パターン・全 5 シナリオ)と累計 10/11 の出典関係・検証軸差分(旧検証はファイル変更を伴わないタスクのみ)・引用先の到達可能性(非配布・配布元ローカル保管)を明記
15
+
16
+ ### 後方互換
17
+
18
+ - **破壊的変更なし**。全て skill / ガイドライン / docs の文書変更(テストは docstring 1 行のみ・実装コード変更なし)。ルール 14 は従来暗黙だった実行層の読み替えを明文化するもので、plan-report のスキーマ・agent 定義・hook 挙動は不変
19
+
20
+ ## [2.55.1] - 2026-07-26
21
+
22
+ ### 修正
23
+
24
+ - **hook stdin cp932 defect の修正(stdin UTF-8 reconfigure 横断適用)**: v2.55.0 の `session_mode_watch.py` が実機の Edit 発火で沈黙する defect を修正。Windows ネイティブ Python では hook の stdin が cp932 既定でデコードされるため、ハーネスが送る UTF-8 JSON payload 中の日本語(`モード:` 行)が mojibake となり `^モード: 自律` 正規表現が不一致→モード行変更を一切検知できていなかった(実機発火スモークで確定・同一 payload の素パイプ再現と `PYTHONIOENCODING=utf-8` 対照実験で原因を実測特定)。stdin reconfigure が欠落していた 10 hook(新規 3 本 + 既存 7 本: session_mode_watch / patterns_guard / report_contract_check / check_agent_invocation / planner_check / post_tool / pre_tool / pre_compact / worktree_guard / recall_autorebuild)へ `sys.stdin.reconfigure(encoding='utf-8')` を追加し、既存 12 hook のイディオムへ統一(canonical 順序 stdin → stdout → stderr・素の呼び出し 3 ファイルは try/except AttributeError ラップ化=crash-to-fail-open リスクの軽減方向)
25
+
26
+ ### 追加
27
+
28
+ - **cp932 実バイトリグレッションテスト**: `PYTHONIOENCODING=cp932` を強制した subprocess に `ensure_ascii=False` の生 UTF-8 payload をパイプし、Windows ネイティブ既定の欠陥環境を CI の Linux 上でも決定論的に再現するテストを `tests/test_session_mode_watch.py` に追加(ASCII エスケープ payload では defect を再現できないことが既存テスト素通しの真因だった)
29
+ - **静的イディオム検査 `tests/test_hooks_stdin_idiom.py` 新設**: `.claude/hooks/*.py` を走査し「`sys.stdin` を読む hook は stdin reconfigure 必須」を機械強制する。検出は純粋 AST 判定(reconfigure receiver 除外の 2 周走査)でコメント/docstring 内の文字列による偽陽性・誤検出なし。アンダースコア始まりファイルも検査対象
30
+
31
+ ### 変更
32
+
33
+ - **`_STDIN_READ_LIMIT_BYTES` → `_STDIN_READ_LIMIT_CHARS` 改名**(check_agent_invocation / planner_check / tier_autoapply): `sys.stdin.read(n)` の n は文字数であり命名のバイト数示唆と実際の意味論の乖離を解消(読み取り方式は不変・挙動変更なし)
34
+ - **`pre_compact.py` の `SESSION_JSON_MARKER` 再エクスポートを `__all__` 明示化**: 過去レビュー(Code Medium-3a)の契約再エクスポートである旨のコメントを付し、生 pyflakes でも未使用 import 警告が出ない形へ整理
35
+
36
+ ### 後方互換
37
+
38
+ - **破壊的変更なし**。修正は「stdin を UTF-8 として読む」の 1 点で、fail-open 挙動・payload 処理ロジック・ブロック/警告の判定条件は不変。修正前に誤って沈黙していた検知(session_mode_watch のモード行監視)が正しく発火するようになる方向のみの変更
39
+
3
40
  ## [2.55.0] - 2026-07-26
4
41
 
5
42
  ### 追加
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: claude-code-conductor
3
- Version: 2.55.0
3
+ Version: 2.56.0
4
4
  Summary: Multi-agent orchestration framework for Claude Code with Codex/Cursor adapters (C3)
5
5
  Project-URL: Homepage, https://github.com/satoh-y-0323/claude-code-conductor
6
6
  Project-URL: Repository, https://github.com/satoh-y-0323/claude-code-conductor
@@ -1,3 +1,3 @@
1
1
  """Claude Code Conductor (C3) - multi-agent orchestration framework for Claude Code."""
2
2
 
3
- __version__ = "2.55.0"
3
+ __version__ = "2.56.0"
@@ -45,7 +45,7 @@ def test_planner_references_plan_design_guidelines():
45
45
 
46
46
 
47
47
  def test_plan_design_guidelines_exists_and_has_rules():
48
- """skills/dev-workflow/references/plan-design-guidelines.md が存在し、ルール 1〜13 と R2〜R6 を含む。"""
48
+ """skills/dev-workflow/references/plan-design-guidelines.md が存在し、ルール 1〜14 と R2〜R6 を含む。"""
49
49
  content = _read(PLAN_DESIGN_GUIDELINES)
50
50
  assert content, "skills/dev-workflow/references/plan-design-guidelines.md が存在しない"
51
51
  required_concepts = (