claude-code-conductor 2.15.2__tar.gz → 2.17.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 (175) hide show
  1. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/CLAUDE.md +1 -0
  2. claude_code_conductor-2.17.0/.claude/docs/config-policy.md +308 -0
  3. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/hooks/stop.py +130 -8
  4. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/CHANGELOG.md +124 -0
  5. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/PKG-INFO +1 -1
  6. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/hatch_build.py +3 -0
  7. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/src/c3/__init__.py +1 -1
  8. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/src/c3/_excludes.py +3 -0
  9. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/test_stop_additional.py +504 -0
  10. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/agents/architect.md +0 -0
  11. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/agents/code-reviewer.md +0 -0
  12. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/agents/developer.md +0 -0
  13. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/agents/doc-writer.md +0 -0
  14. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/agents/interviewer.md +0 -0
  15. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/agents/planner.md +0 -0
  16. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/agents/project-setup.md +0 -0
  17. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/agents/security-reviewer.md +0 -0
  18. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/agents/systematic-debugger.md +0 -0
  19. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/agents/tester.md +0 -0
  20. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/agents/wt_developer.md +0 -0
  21. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/agents/wt_systematic-debugger.md +0 -0
  22. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/agents/wt_tester.md +0 -0
  23. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/docs/parallel-agents-setup.md +0 -0
  24. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/docs/platform-adapters.md +0 -0
  25. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/docs/settings.json.md +0 -0
  26. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/hooks/_hook_utils.py +0 -0
  27. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/hooks/check_agent_invocation.py +0 -0
  28. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/hooks/consolidate_memory.py +0 -0
  29. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/hooks/permission_handler.py +0 -0
  30. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/hooks/permission_handler_toast.py +0 -0
  31. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/hooks/planner_check.py +0 -0
  32. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/hooks/post_tool.py +0 -0
  33. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/hooks/pre_compact.py +0 -0
  34. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/hooks/pre_tool.py +0 -0
  35. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/hooks/recall_inject.py +0 -0
  36. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/hooks/restore_session.py +0 -0
  37. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/hooks/schema.sql +0 -0
  38. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/hooks/select_tier.py +0 -0
  39. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/hooks/session_start.py +0 -0
  40. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/hooks/session_stop.py +0 -0
  41. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/hooks/session_utils.py +0 -0
  42. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/hooks/statusline.py +0 -0
  43. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/hooks/worktree_guard.py +0 -0
  44. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/memory/.gitkeep +0 -0
  45. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/permission_rules.json +0 -0
  46. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/rules/promoted/index.md +0 -0
  47. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/settings.json +0 -0
  48. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/skills/codex-review/SKILL.md +0 -0
  49. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/skills/dev-workflow/SKILL.md +0 -0
  50. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/skills/dev-workflow/references/code-review-checklist.md +0 -0
  51. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/skills/dev-workflow/references/plan-design-guidelines.md +0 -0
  52. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/skills/dev-workflow/references/security-review-checklist.md +0 -0
  53. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/skills/dev-workflow/scripts/record_review_decision.py +0 -0
  54. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/skills/dev-workflow/scripts/record_tier_outcome.py +0 -0
  55. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/skills/dev-workflow/scripts/review_hint_inject.py +0 -0
  56. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/skills/develop/SKILL.md +0 -0
  57. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/skills/doc/SKILL.md +0 -0
  58. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/skills/extract-lib/SKILL.md +0 -0
  59. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/skills/init-session/SKILL.md +0 -0
  60. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/skills/mcp-config/SKILL.md +0 -0
  61. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/skills/parallel-agents/SKILL.md +0 -0
  62. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/skills/pattern-status/SKILL.md +0 -0
  63. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/skills/promote-pattern/SKILL.md +0 -0
  64. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/skills/recall/SKILL.md +0 -0
  65. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/skills/report-timestamp/SKILL.md +0 -0
  66. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/skills/report-timestamp/scripts/get_timestamp.py +0 -0
  67. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/skills/review-phase/SKILL.md +0 -0
  68. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/skills/setup/SKILL.md +0 -0
  69. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/skills/setup/reference.md +0 -0
  70. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/skills/setup/templates/coding-standards-template.md +0 -0
  71. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/skills/setup/templates/project-conventions-template.md +0 -0
  72. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/skills/start/SKILL.md +0 -0
  73. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.claude/state/.gitkeep +0 -0
  74. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/.gitignore +0 -0
  75. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/LICENSE +0 -0
  76. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/LICENSES/chroma-hnswlib-LICENSE +0 -0
  77. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/LICENSES/chroma-hnswlib-NOTICE +0 -0
  78. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/LICENSES/fastembed-LICENSE +0 -0
  79. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/LICENSES/fastembed-NOTICE +0 -0
  80. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/LICENSES/onnxruntime-LICENSE +0 -0
  81. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/LICENSES/paraphrase-multilingual-MiniLM-L12-v2-LICENSE +0 -0
  82. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/README.md +0 -0
  83. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/pyproject.toml +0 -0
  84. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/src/c3/__main__.py +0 -0
  85. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/src/c3/_terminal.py +0 -0
  86. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/src/c3/adapters.py +0 -0
  87. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/src/c3/cli.py +0 -0
  88. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/src/c3/cli_ask.py +0 -0
  89. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/src/c3/cli_doctor.py +0 -0
  90. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/src/c3/cli_init.py +0 -0
  91. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/src/c3/cli_list.py +0 -0
  92. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/src/c3/cli_plan.py +0 -0
  93. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/src/c3/cli_recall.py +0 -0
  94. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/src/c3/cli_tier.py +0 -0
  95. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/src/c3/cli_update.py +0 -0
  96. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/src/c3/db.py +0 -0
  97. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/src/c3/embedding.py +0 -0
  98. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/src/c3/mcp_server.py +0 -0
  99. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/src/c3/paths.py +0 -0
  100. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/src/c3/plan_validator.py +0 -0
  101. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/src/c3/platforms.py +0 -0
  102. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/src/c3/question.py +0 -0
  103. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/src/c3/recall_chunker.py +0 -0
  104. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/src/c3/recall_index.py +0 -0
  105. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/__init__.py +0 -0
  106. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/conftest.py +0 -0
  107. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/hooks/__init__.py +0 -0
  108. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/hooks/test_check_agent_invocation.py +0 -0
  109. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/hooks/test_consolidate_memory.py +0 -0
  110. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/hooks/test_hook_utils.py +0 -0
  111. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/hooks/test_permission_handler.py +0 -0
  112. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/hooks/test_permission_handler_toast.py +0 -0
  113. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/hooks/test_pip_reinstall_reminder.py +0 -0
  114. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/hooks/test_planner_check.py +0 -0
  115. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/hooks/test_planner_check_dev.py +0 -0
  116. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/hooks/test_post_tool.py +0 -0
  117. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/hooks/test_pre_tool.py +0 -0
  118. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/hooks/test_recall_inject.py +0 -0
  119. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/hooks/test_record_review_decision.py +0 -0
  120. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/hooks/test_record_tier_outcome.py +0 -0
  121. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/hooks/test_restore_session.py +0 -0
  122. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/hooks/test_review_hint_inject.py +0 -0
  123. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/hooks/test_select_tier.py +0 -0
  124. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/hooks/test_select_tier_escalation.py +0 -0
  125. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/hooks/test_session_start.py +0 -0
  126. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/hooks/test_session_stop.py +0 -0
  127. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/hooks/test_session_utils.py +0 -0
  128. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/hooks/test_settings_local_absolute_paths.py +0 -0
  129. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/hooks/test_similarity_boost.py +0 -0
  130. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/hooks/test_statusline.py +0 -0
  131. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/hooks/test_statusline_template_sync.py +0 -0
  132. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/hooks/test_sync_check.py +0 -0
  133. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/hooks/test_template_guard.py +0 -0
  134. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/skills/__init__.py +0 -0
  135. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/skills/_skill_helpers.py +0 -0
  136. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/skills/test_dev_workflow_no_task_type.py +0 -0
  137. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/skills/test_init_session_no_task_type.py +0 -0
  138. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/skills/test_planner_lightweight.py +0 -0
  139. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/skills/test_recall_skill.py +0 -0
  140. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/skills/test_session_backlog_reconciliation.py +0 -0
  141. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/skills/test_setup_templates.py +0 -0
  142. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/skills/test_start_skill_bugfix_flow.py +0 -0
  143. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/skills/test_start_skill_new_flow.py +0 -0
  144. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/skills/test_start_skill_security_audit_phase.py +0 -0
  145. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/test_adapters.py +0 -0
  146. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/test_cli_ask.py +0 -0
  147. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/test_cli_entry.py +0 -0
  148. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/test_cli_init.py +0 -0
  149. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/test_cli_list.py +0 -0
  150. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/test_cli_plan.py +0 -0
  151. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/test_cli_recall.py +0 -0
  152. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/test_cli_tier.py +0 -0
  153. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/test_cli_update.py +0 -0
  154. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/test_db.py +0 -0
  155. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/test_docstring_consistency.py +0 -0
  156. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/test_embedding.py +0 -0
  157. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/test_excludes.py +0 -0
  158. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/test_mcp_server_elicit.py +0 -0
  159. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/test_paths.py +0 -0
  160. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/test_plan_validator.py +0 -0
  161. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/test_pre_compact.py +0 -0
  162. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/test_pre_tool_hook.py +0 -0
  163. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/test_precompact_additional.py +0 -0
  164. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/test_precompact_toctou_fixes.py +0 -0
  165. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/test_recall_chunker.py +0 -0
  166. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/test_recall_index.py +0 -0
  167. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/test_references_migration.py +0 -0
  168. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/test_session_utils_additional.py +0 -0
  169. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/test_skill_no_builtin_conflict.py +0 -0
  170. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/test_statusline.py +0 -0
  171. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/test_stop_hook.py +0 -0
  172. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/test_stop_precompact_fixes.py +0 -0
  173. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/test_sync_template_stop.py +0 -0
  174. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/test_template_pre_tool_hook.py +0 -0
  175. {claude_code_conductor-2.15.2 → claude_code_conductor-2.17.0}/tests/test_worktree_guard.py +0 -0
@@ -49,6 +49,7 @@
49
49
 
50
50
  `.claude/docs/` は人間向けリファレンスのためエージェントは読まなくてよい。
51
51
  詳細は `.claude/docs/taxonomy.md` を参照。
52
+ 設定の優先順位・配布判断は `.claude/docs/config-policy.md` を参照。
52
53
 
53
54
  ## Platform Compatibility
54
55
 
@@ -0,0 +1,308 @@
1
+ # C3 Config Policy — 設定階層・配布判断の公式リファレンス
2
+
3
+ **バージョン**: v2.17.0
4
+ **対象読者**: C3 利用先ユーザー / C3 自体をフォーク・拡張する開発者
5
+ **canonical 宣言**: 設定優先順位・配布判断に関しては本ドキュメントが唯一の公式情報源。
6
+ 他ファイル(`CLAUDE.md` / `_excludes.py` docstring)から本ドキュメントへの参照リンクが張られている場合、
7
+ 詳細は常に本ドキュメントを参照すること。
8
+
9
+ ---
10
+
11
+ ## 1. 設定ファイル一覧(所在マップ)
12
+
13
+ ### 1-1. 配布元リポジトリ(C3 開発者向け)
14
+
15
+ ```
16
+ /CLAUDE.md 配布元専用(.gitignore で除外)
17
+ .claude/CLAUDE.md 配布元・配布先共通(常時注入)
18
+ .claude/settings.json プロジェクト共通設定(配布される)
19
+ .claude/settings.local.json 個人 override(配布されない)
20
+ .claude/permission_rules.json C3 独自の自動承認パターン(配布される)
21
+ .claude/rules/ C3 配布デフォルトルール(配布される)
22
+ .claude/rules/promoted/ プロジェクト固有昇格ルール(配布される、update は触らない)
23
+ .claude/hooks/ Claude Code lifecycle hooks(配布される)
24
+ .dev/hooks/ 配布元専用 hook(配布されない)
25
+ src/c3/_excludes.py wheel 除外パターン(配布元のビルド制御)
26
+ hatch_build.py _excludes.py の重複定義(ビルド時専用)
27
+ ```
28
+
29
+ ### 1-2. 利用先プロジェクト(C3 ユーザー向け)
30
+
31
+ ```
32
+ .claude/CLAUDE.md c3 init で配置・c3 update で更新
33
+ .claude/settings.json c3 init で配置・c3 update で更新
34
+ .claude/settings.local.json ユーザーが個別作成(c3 は触らない)
35
+ .claude/permission_rules.json c3 init で配置・c3 update で更新
36
+ .claude/rules/ c3 init で配置・c3 update で更新
37
+ .claude/rules/promoted/index.md c3 init で空雛形のみ配置(c3 update は触らない)
38
+ .claude/hooks/ c3 init で配置・c3 update で更新
39
+ .claude/state/ 実行時生成(gitignore 推奨)
40
+ .claude/memory/ 実行時生成
41
+ .claude/agent-memory/ 実行時生成
42
+ .claude/reports/ 実行時生成(gitignore 推奨)
43
+ .claude/worktrees/ 並列実行時一時生成
44
+ .claude/logs/ 実行時生成
45
+ ```
46
+
47
+ ### 1-3. ディレクトリの命名・配置チート
48
+
49
+ 各ディレクトリの **命名・役割・配置判断** は `.claude/docs/taxonomy.md` を参照。
50
+ 本ドキュメントは配布判断・優先順位に特化しており、taxonomy と住み分けている。
51
+
52
+ ---
53
+
54
+ ## 2. 設定優先順位と書き込み権限
55
+
56
+ 設定は性質の異なる **3 つのレイヤー** に分かれる。1 列に並べると誤解を生むため分離して記述する。
57
+
58
+ ### レイヤー A: ツール権限(Claude Code 公式)
59
+
60
+ 同じキー(`permissions.allow` など)が複数ファイルで定義されている場合、
61
+ **上位ファイルが下位ファイルを上書き**する(高 → 低の順):
62
+
63
+ 1. `.claude/settings.local.json` — 個人 override(`.gitignore` 推奨。c3 update の対象外)
64
+ 2. `.claude/settings.json` — プロジェクト共通設定(git 管理)
65
+ 3. `~/.claude/settings.json` — グローバル個人設定(マシンローカル)
66
+
67
+ > **重要**: `hooks` セクションのみ「マージしない・完全上書き」挙動。
68
+ > `settings.local.json` に `hooks` を書くと `settings.json` の `hooks` が **すべて無効化** される。
69
+ > 詳細は §7「既知の落とし穴」を参照。
70
+ > キー仕様の詳細は `.claude/docs/settings.json.md` を参照。
71
+
72
+ ### レイヤー B: 自動承認パターン(C3 独自拡張)
73
+
74
+ - `.claude/permission_rules.json` の `auto_allow` 配列
75
+ - `permission_handler.py`(`PermissionRequest` hook)が読み込んで、パターンにマッチすれば自動承認
76
+ - レイヤー A で `deny` 判定されたものを覆すことはできない(hook の決定権の範囲内)
77
+ - `notify_on_auto: false` で通知を抑止できる
78
+
79
+ > **注意**: `permission_rules.json` は Claude Code 公式の `permissions.allow` とは **独立した別レイヤー**。
80
+ > 同列に並べると「どちらが優先されるか」で誤解が生じる。レイヤー A と B は並立している。
81
+
82
+ > **注意**: `auto_allow` パターンは最小限に留めること。広範なパターン(例: `Bash(*)`)は C3 の意図する動作範囲を超えた危険コマンドも自動承認する可能性がある。
83
+
84
+ ### レイヤー C: LLM 指示・知識(CLAUDE.md / rules)
85
+
86
+ - `.claude/CLAUDE.md` — 常時注入されるプロジェクト指示
87
+ - `.claude/rules/*.md` — `paths:` フロントマターがあればパスマッチ時のみ、なければ常時注入
88
+ - `.claude/rules/promoted/index.md` — `@rules/promoted/index.md` で CLAUDE.md から include される
89
+ (`/promote-pattern` skill が追記する **ユーザー所有領域**)
90
+
91
+ 「優先順位」という概念は厳密には適用されない(全文ロードされる)が、
92
+ **`rules/promoted/` は c3 update が触らない**点が肝となる。
93
+
94
+ ### 書き込み権限マトリクス
95
+
96
+ | ファイル | c3 init が初期配置 | c3 update が上書き | ユーザーが編集してよい |
97
+ |---|---|---|---|
98
+ | `.claude/settings.json` | ○ | ○ | △(チーム合意のもと) |
99
+ | `.claude/settings.local.json` | × | × | ○(個人 override / 秘匿情報) |
100
+ | `.claude/permission_rules.json` | ○ | ○ | △(ファイル全体を上書き編集する場合は注意) |
101
+ | `.claude/CLAUDE.md` | ○ | ○ | △(c3 update で上書きされる前提で) |
102
+ | `.claude/rules/*.md` | ○ | ○ | △(同上) |
103
+ | `.claude/rules/promoted/index.md` | ○(空雛形のみ) | × | ○(`/promote-pattern` が追記、手動編集も可) |
104
+
105
+ ---
106
+
107
+ ## 3. 配布判断マトリクス(12 カテゴリ)
108
+
109
+ `_excludes.py` の `EXCLUDE_PATTERNS` / `KEEP_PATTERNS` を実装照合した結果。
110
+ 各カテゴリに配布有無・c3 update の更新有無・理由を明示する。
111
+
112
+ | # | カテゴリ | 配布 | c3 update が更新 | 理由 |
113
+ |---|---|---|---|---|
114
+ | 1 | `.claude/hooks/*.py` | ○ | ○ | Claude Code lifecycle hook の実体。配布先で動作する。例外: `subagent_log.py` のみ除外(個人デバッグ用) |
115
+ | 2 | `.claude/agents/*.md` | ○ | ○ | ペルソナ定義。配布先で読まれる。例外: `tdd-develop.md` のみ除外(v2.1.0 廃止) |
116
+ | 3 | `.claude/skills/*/` | ○ | ○ | オーケストレーション/ユーティリティ skill 定義(`scripts/` / `templates/` 等サブディレクトリ含む)。例外: `worktree-tdd-workflow/*` のみ除外(v2.1.0 廃止) |
117
+ | 4 | `.claude/rules/*.md` | ○ | ○ | C3 配布デフォルトルール(常時注入対象) |
118
+ | 5 | `.claude/rules/promoted/*` | ○ | × | プロジェクト固有昇格ルール。配布元の `promoted/index.md` は空雛形のみ配布。利用先で `/promote-pattern` が追記する **ユーザー所有領域**。c3 update が触ると昇格内容が失われる |
119
+ | 6 | `.claude/docs/*.md` | △(一部のみ) | ○ | 利用先向けリファレンス。配布対象は `platform-adapters.md` / `settings.json.md` / `parallel-agents-setup.md` / `config-policy.md`(本ドキュメント)の 4 ファイル。配布元固有の設計メモ等は `_excludes.py` で個別除外。`taxonomy.md` は tracked(GitHub 公開)だが EXCLUDE 対象のため wheel 非配布(詳細は §7 落とし穴 2 参照)。 |
120
+ | 7 | `.claude/CLAUDE.md` | ○ | ○ | 配布先で常時注入される共通ルール |
121
+ | 8 | `.claude/settings.json` | ○ | ○ | プロジェクト共通設定(hooks 登録・permissions など) |
122
+ | 9 | `.claude/permission_rules.json` | ○ | ○ | C3 独自の自動承認パターン(PermissionRequest hook が参照) |
123
+ | 10 | `.claude/settings.local.json` | × | — | 個人 override・秘匿情報。`_excludes.py` でも除外、`.gitignore` でも除外、c3 update も触らない |
124
+ | 11 | `.claude/reports/*` / `memory/*` / `agent-memory/*` / `state/*` / `tmp/*` / `worktrees/*` / `logs/*` | × (`.gitkeep` のみ ○) | — | 実行時生成領域。空ディレクトリのみ `KEEP_PATTERNS` の `.gitkeep` で配布。データ本体は除外 |
125
+ | 12 | `.dev/*` / `/CLAUDE.md` / `/AGENTS.md` / `/.codex/` / `/.cursor/` / `/.agents/` | × | — | 配布元専用または adapter 生成物。wheel には構造的に含まれない(`src/c3/_template/.claude/` 配下のみ同梱)が、配布元 `.gitignore` で commit 混入も防ぐ |
126
+
127
+ > **注意 (カテゴリ #6)**: `taxonomy.md` は `_excludes.py` の EXCLUDE 対象だが、`.gitignore` では tracked 状態(GitHub に公開済み)。
128
+ > **wheel には含まれない**点に注意。gitignore と wheel 配布は別レイヤーであり、
129
+ > 「tracked = 配布される」ではない。
130
+
131
+ ---
132
+
133
+ ## 4. settings.local.json 運用の原則
134
+
135
+ `settings.local.json` は以下の **3 原則**で運用する:
136
+
137
+ ### 原則 1: 個人 override / 秘匿情報はここに書く
138
+
139
+ - 個人の `permissions.allow` 追加(チーム全員には不要なもの)
140
+ - API キー・個人トークン等の秘匿情報(`env` セクションに記述)
141
+ - 個人的な `mcpServers` 設定
142
+
143
+ `.gitignore` に含まれているため、通常の `git add` では staging されずリモートに上がらない(ただし `git status` で確認を推奨)。
144
+
145
+ > **注意**: `git add -f` の強制オプションを使うと `.gitignore` が無効化されるため、秘匿情報が誤ってコミットされるリスクがある。CI/CD パイプラインでの自動 `add` 設定にも注意すること。
146
+
147
+ > **注意**: `c3 init` はプロジェクトルートの `.gitignore` を自動編集しない。`settings.local.json` を新規作成する場合は、ユーザー自身が `.gitignore` に `.claude/settings.local.json` を追加すること。
148
+
149
+ ### 原則 2: c3 update は触らない
150
+
151
+ `settings.local.json` は `c3 init` も `c3 update` も作成・上書きしない。
152
+ 個人設定を安全に保ちつつ、C3 のアップデートを受け取れる設計。
153
+
154
+ ### 原則 3: `hooks` セクションは書かない
155
+
156
+ **最重要の落とし穴**。`settings.local.json` に `hooks` セクションを追記すると、
157
+ `settings.json` の `hooks` エントリが **すべて無効化** される(マージではなく完全上書き)。
158
+
159
+ C3 の lifecycle hook(`permission_handler.py` 等)が動かなくなるため、
160
+ `hooks` のカスタマイズは必ず `settings.json` 側に行う(チーム合意を経て)。
161
+
162
+ 詳細は §7「既知の落とし穴」の項目 1 を参照。
163
+
164
+ ---
165
+
166
+ ## 5. プラットフォーム別 config 整合(canonical 宣言)
167
+
168
+ ### canonical は `.claude/` に置く
169
+
170
+ C3 の設定・ルール・スキルの **唯一の公式ソース** は `.claude/` ディレクトリ。
171
+ Codex / Cursor 向けの adapter 生成物は **派生生成物** であり、primary source ではない。
172
+
173
+ | プラットフォーム | 設定参照経路 | 生成コマンド |
174
+ |---|---|---|
175
+ | Claude Code | `.claude/settings.json` / `.claude/CLAUDE.md` | — |
176
+ | Codex | `.codex/` / `/AGENTS.md` | `c3 init --platform codex` |
177
+ | Cursor | `.cursor/rules/c3-core.mdc` | `c3 init --platform cursor` |
178
+
179
+ ### adapter 生成物の位置付け
180
+
181
+ - `.codex/` / `/AGENTS.md` / `/.cursor/` / `/.agents/` は **c3 init が生成する派生物**
182
+ - これらを直接編集すると `c3 init --platform` の再実行で上書きされる
183
+ - 配布元リポジトリでは `.gitignore` に含まれる(配布対象外)
184
+
185
+ ### 複数プラットフォームを切り替える場合
186
+
187
+ 同じプロジェクトで Claude Code / Codex / Cursor を切り替えて使う場合、
188
+ 設定の変更は必ず `.claude/` 側に行い、必要に応じて `c3 init --platform` で adapter を再生成する。
189
+
190
+ 詳細は `.claude/docs/platform-adapters.md` を参照。
191
+
192
+ ---
193
+
194
+ ## 6. 3 ファイル同期ルール
195
+
196
+ ### なぜ 3 ファイルが同期されなければならないか
197
+
198
+ C3 の wheel 配布除外パターンは **3 つのファイルに分散して定義** されている:
199
+
200
+ | ファイル | 役割 | 変更が必要な場面 |
201
+ |---|---|---|
202
+ | `.gitignore` | git 追跡から除外(配布元リポジトリの個人作業ファイルを管理外に) | 配布元で新たに除外すべきファイルが増えた時 |
203
+ | `src/c3/_excludes.py` | `c3 init` / `c3 update` 時の除外判断(Python 実装) | 配布先への配布/非配布を変更する時 |
204
+ | `hatch_build.py` | wheel ビルド時の除外判断(`_excludes.py` の重複定義) | `_excludes.py` を変更した時(必ず同期) |
205
+
206
+ `hatch_build.py` の重複が必要な理由: hatch build hook はパッケージ import 前に走るため、
207
+ `_excludes.py` を import できない。2 ファイルの完全一致が必須。
208
+
209
+ ### 同期確認の方法
210
+
211
+ `.dev/hooks/_sync_check.py`(PostToolUse hook)が、3 ファイルのいずれかを変更した時に
212
+ 残り 2 ファイルの同期を `stderr` で警告する。警告が出たら必ず対応する。
213
+
214
+ ### 変更手順
215
+
216
+ 1. `.gitignore` / `_excludes.py` / `hatch_build.py` のいずれかを変更
217
+ 2. `_sync_check.py` の警告を確認
218
+ 3. 残り 2 ファイルに同じパターンを追加(または削除)
219
+ 4. `python -m build --wheel` で wheel を再生成して実体検証
220
+
221
+ ### 過去の同期漏れ defect
222
+
223
+ | バージョン | 内容 | カテゴリ #(§3 参照) |
224
+ |---|---|---|
225
+ | v1.1.0 | `state/tier_selection.json` が wheel に混入した | #11 |
226
+ | v2.14.1 | `worktrees/` 配下ファイルが wheel に混入した | #11 |
227
+
228
+ いずれも `_excludes.py` / `hatch_build.py` の同期漏れが原因。
229
+
230
+ ---
231
+
232
+ ## 7. 既知の落とし穴
233
+
234
+ **ここを読まないと事故る**ポイントを集約。症状が出たらまず確認すること。
235
+
236
+ ### 落とし穴 1: `hooks` セクションが `settings.local.json` で完全上書きされる
237
+
238
+ **症状**: `permission_handler.py` 等の C3 hook が突然動かなくなる。
239
+
240
+ **原因**: Claude Code の `settings.json` 系では、`hooks` セクションのみマージではなく
241
+ **完全上書き**の挙動を取る(`permissions.allow` 等他のキーはマージ)。
242
+ `settings.local.json` に `hooks: []` や任意の hook 定義を書くと、
243
+ `settings.json` の `hooks` エントリが全て無効化される。
244
+
245
+ **対処**: `settings.local.json` の `hooks` セクションを削除し、`settings.json` 側に移す。
246
+ カスタム hook を追加したい場合はチームで `settings.json` を編集する(git 管理)。
247
+
248
+ ### 落とし穴 2: `taxonomy.md` は tracked だが wheel 配布されない
249
+
250
+ **症状**: `_excludes.py` で除外されているはずの `taxonomy.md` が GitHub に公開されている、
251
+ または「なぜ `.gitignore` に入っていないのか」と疑問に思う。
252
+
253
+ **原因**: `taxonomy.md` は `.gitignore` では tracked(GitHub に公開済み)だが、
254
+ `_excludes.py` の `EXCLUDE_PATTERNS` で除外されているため **wheel には含まれない**。
255
+ 「git tracked = 配布される」ではない。wheel 配布と git 追跡は独立したレイヤー。
256
+
257
+ **対処**: 混乱した場合は §3 のカテゴリ #6 の注意書きを参照。
258
+ `config-policy.md`(本ドキュメント)は wheel に含まれる設計になっている(`_excludes.py` に除外パターンなし)。
259
+
260
+ ### 落とし穴 3: `rules/promoted/` を `c3 update` が上書きしない
261
+
262
+ **症状**: `c3 update` 後に `/promote-pattern` で追加したルールが消えている(実際には消えないが消えると思って不安)、
263
+ または「なぜ promoted/ は更新されないのか」と疑問に思う。
264
+
265
+ **原因**: `.claude/rules/promoted/index.md` は **ユーザー所有領域**。
266
+ c3 update が上書きすると利用先で `/promote-pattern` が追記したルールが消失するため、意図的に除外している(§3 カテゴリ #5 参照)。
267
+
268
+ **対処**: `promoted/` への変更は `c3 update` に委ねず、手動または `/promote-pattern` skill で管理する。
269
+ C3 side で `promoted/` の雛形を更新した場合は、リリースノートで手動マージ手順を案内する。
270
+
271
+ ### 落とし穴 4: `permission_rules.json` は `settings.json.permissions.deny` を覆せない(要検証)
272
+
273
+ **現状**: `permission_handler.py` の実装を読む限り、`PermissionRequest` hook は
274
+ Claude Code 側で `deny` 判定が出た後に発火するため、`permission_rules.json` の `auto_allow` で
275
+ `deny` を覆すことはできないはず。ただし Claude Code 公式仕様に明記なし。
276
+
277
+ **残課題**: v2.18.0 以降の検証タスクとして記録。現時点では「覆せない前提で設計する」ことを推奨。
278
+
279
+ ---
280
+
281
+ ## 8. 参照先
282
+
283
+ ### 一次資料
284
+
285
+ | 資料 | 場所 | 内容 |
286
+ |---|---|---|
287
+ | 配布元ルール | `/CLAUDE.md` | 3 ファイル同期・wheel 実体検証手順(配布元開発者向け) |
288
+ | 共通ルール | `.claude/CLAUDE.md` | LLM 行動規範・承認フロー |
289
+ | 設定キー仕様 | `.claude/docs/settings.json.md` | settings.json の各キー詳細仕様 |
290
+ | ディレクトリ命名 | `.claude/docs/taxonomy.md` | ディレクトリの命名・役割・配置判断 |
291
+ | プラットフォーム別 | `.claude/docs/platform-adapters.md` | Codex / Cursor adapter の生成物と参照経路 |
292
+ | 背景・設計判断 | `.claude/docs/C3のconfig_policyとversion_upgradeの考慮点と超えるべき壁.md` | 本ドキュメント作成の背景・version upgrade の残課題 |
293
+
294
+ ### 実装ファイル
295
+
296
+ | ファイル | 場所 | 内容 |
297
+ |---|---|---|
298
+ | 除外パターン定義 | `src/c3/_excludes.py` | `EXCLUDE_PATTERNS` / `KEEP_PATTERNS` 定数 + `should_skip()` |
299
+ | ビルド時除外 | `hatch_build.py` | `_excludes.py` の重複定義(ビルドフック用) |
300
+ | 同期確認 hook | `.dev/hooks/_sync_check.py` | 3 ファイル変更時の警告(配布元専用) |
301
+ | 自動承認 hook | `.claude/hooks/permission_handler.py` | `permission_rules.json` を読んで自動承認 |
302
+
303
+ ### 残課題リンク(v2.18.0 以降)
304
+
305
+ - `permission_rules.json` の `auto_allow` が `settings.json.permissions.deny` を覆せるか検証
306
+ - `~/.claude/settings.json` のグローバル設定と `.claude/settings.json` の同キー競合時のマージ範囲確認
307
+ - `c3 update` の削除検出(`deletions.txt` 方式、v2.18.0 予定)
308
+ - `c3 update` 時の Breaking changes 警告(v2.19.0 予定)
@@ -11,7 +11,7 @@ import re
11
11
  import tempfile
12
12
  from datetime import date, datetime, timezone
13
13
 
14
- from session_utils import SESSION_JSON_MARKER, is_worktree, create_session_template, SESSIONS_DIR, ensure_session_initialized
14
+ from session_utils import SESSION_JSON_MARKER, is_worktree, create_session_template, SESSIONS_DIR, ensure_session_initialized, extract_section
15
15
 
16
16
  try:
17
17
  sys.stdin.reconfigure(encoding='utf-8')
@@ -31,6 +31,14 @@ MAX_ID_LENGTH = 64
31
31
  MAX_DESCRIPTION_LENGTH = 500
32
32
  MAX_LAST_MSG = 500
33
33
 
34
+ # 過去セッションファイルから引き継ぐ - [ ] 行のサニタイズ用パターン。
35
+ # C0/C1 制御文字 (タブ と通常スペース は保持) と U+2028 / U+2029 を除去する。
36
+ # 過去ファイルの ## 残タスク はユーザー編集領域のため信頼境界として扱う [SR-V-001]。
37
+ # raw string は \uXXXX を解釈しないため、U+2028 / U+2029 は chr() で生成して連結する。
38
+ _INHERIT_SANITIZE_RE = re.compile(
39
+ r'[\x00-\x08\x0b-\x1f\x7f-\x9f' + chr(0x2028) + chr(0x2029) + r']'
40
+ )
41
+
34
42
  # _append_last_message が処理済みのパスを記録するキャッシュ(重複 read/write 防止)。
35
43
  _last_message_applied_paths: set = set()
36
44
 
@@ -39,6 +47,99 @@ def get_session_path(date_str: str) -> str:
39
47
  return os.path.join(SESSIONS_DIR, f'{date_str}.tmp')
40
48
 
41
49
 
50
+ def _inherit_backlog_from_latest_session(
51
+ new_path: str, today_str: str, sessions_dir: str | None = None
52
+ ) -> None:
53
+ """新規セッションファイルに、直近過去セッションの未完了バックログを引き継ぐ。
54
+
55
+ 過去ファイルの ``## 残タスク`` セクションから ``- [ ]`` 行のみ抽出し、
56
+ 新規ファイルの ``## 残タスク`` セクションに追記する。``- [x]`` 行は対象外。
57
+ マルチライン継続行(インデントされた `- [ ]` 以外の継続行)は引き継がない。
58
+
59
+ 本ヘルパーは `ensure_session_file` の新規作成パスからのみ呼ばれる。既存当日
60
+ ファイルが存在する場合は呼ばれないため、ユーザー編集を上書きする危険はない。
61
+
62
+ 過去ファイルから引き継ぐ行は `_INHERIT_SANITIZE_RE` で制御文字・ANSI エスケープ・
63
+ U+2028/U+2029 を除去してから書き込むため、過去ファイルの改ざんによる端末
64
+ インジェクションは構造的に防御される [SR-V-001]。
65
+
66
+ Args:
67
+ new_path: 新規作成された当日セッションファイルのパス。
68
+ today_str: 今日の日付(YYYYMMDD)。これ未満の日付の .tmp が対象。
69
+ sessions_dir: SESSIONS_DIR を上書きしたい場合のテスト用引数。
70
+ None の場合はモジュールグローバル SESSIONS_DIR を使う。
71
+ """
72
+ _sessions_dir = sessions_dir if sessions_dir is not None else SESSIONS_DIR
73
+ if not os.path.isdir(_sessions_dir):
74
+ return
75
+
76
+ # 今日より前で最大の日付(= 直近過去セッション)を選ぶ
77
+ past_dates = [
78
+ fname[:-4] for fname in os.listdir(_sessions_dir)
79
+ if fname.endswith('.tmp') and fname[:-4] < today_str
80
+ ]
81
+ if not past_dates:
82
+ return
83
+ latest_past_path = os.path.join(_sessions_dir, f'{max(past_dates)}.tmp')
84
+
85
+ try:
86
+ # universal newlines(デフォルト)で読み込む。攻撃により \r 単体が混入しても
87
+ # この時点で \n に変換されるため、\r 単体は構造的に防御される。
88
+ # ただし Python の str.splitlines() は \n に加え \v / \f / \x1c / \x1d / \x1e /
89
+ # \x85 / U+2028 / U+2029 でも分割する。これらは _INHERIT_SANITIZE_RE で
90
+ # 事前に除去してから splitlines に渡す必要がある。
91
+ with open(latest_past_path, 'r', encoding='utf-8') as f:
92
+ past_content = f.read()
93
+ except OSError:
94
+ return
95
+
96
+ # U+2028/U+2029 等の行区切り文字を事前にサニタイズしてから splitlines するため、
97
+ # 過去ファイルに混入した行区切り文字によって意図しない行分割が発生しない。
98
+ backlog_section = extract_section(past_content, '残タスク')
99
+ sanitized_section = _INHERIT_SANITIZE_RE.sub('', backlog_section)
100
+ pending_tasks = [
101
+ line for line in sanitized_section.splitlines()
102
+ if line.lstrip().startswith('- [ ]')
103
+ ]
104
+ if not pending_tasks:
105
+ return
106
+
107
+ try:
108
+ with open(new_path, 'r', encoding='utf-8') as f:
109
+ new_content = f.read()
110
+ except OSError:
111
+ return
112
+
113
+ inheritance_block = '\n'.join(pending_tasks) + '\n'
114
+ updated = new_content.replace(
115
+ '## 残タスク\n',
116
+ f'## 残タスク\n{inheritance_block}',
117
+ 1,
118
+ )
119
+
120
+ if updated == new_content:
121
+ return
122
+
123
+ # アトミック書き込み: _apply_session_updates と同じ tempfile + os.replace パターン。
124
+ # suffix='.writing' は SESSIONS_DIR 内の `.tmp` 一覧フィルタに引っかからないよう
125
+ # 構造的に隔離する [SR-NEW L-1]。
126
+ dir_ = os.path.dirname(new_path)
127
+ tmp_path = None
128
+ try:
129
+ tmp_fd, tmp_path = tempfile.mkstemp(dir=dir_, suffix='.writing')
130
+ try:
131
+ with os.fdopen(tmp_fd, 'w', encoding='utf-8') as tmp_f:
132
+ tmp_f.write(updated)
133
+ except Exception:
134
+ os.close(tmp_fd)
135
+ raise
136
+ os.replace(tmp_path, new_path)
137
+ tmp_path = None
138
+ finally:
139
+ if tmp_path is not None and os.path.exists(tmp_path):
140
+ os.unlink(tmp_path)
141
+
142
+
42
143
  def ensure_session_file(date_str: str) -> None:
43
144
  os.makedirs(SESSIONS_DIR, exist_ok=True)
44
145
  path = get_session_path(date_str)
@@ -46,6 +147,11 @@ def ensure_session_file(date_str: str) -> None:
46
147
  try:
47
148
  with open(path, 'x', encoding='utf-8') as f:
48
149
  f.write(create_session_template(date_str))
150
+ # 新規作成時のみ、直近過去セッションから未完了タスクを引き継ぐ。
151
+ # 既存ファイルがある場合 (FileExistsError ブランチ) はユーザー編集を尊重し
152
+ # 引き継ぎを発動しない。sessions_dir を明示渡しにすることで、引き継ぎ関数内
153
+ # の SESSIONS_DIR 直参照を排除し、テスト時のグローバル差し替え依存を減らす。
154
+ _inherit_backlog_from_latest_session(path, date_str, sessions_dir=SESSIONS_DIR)
49
155
  print(f'[Stop] セッションファイルを作成しました: {path}', file=sys.stderr)
50
156
  except FileExistsError:
51
157
  # /exit による中断等でファイルが空の場合はテンプレートを書き直す(DRY: session_utils へ委譲)
@@ -65,8 +171,12 @@ def _apply_session_updates(path: str, content: str, message: str = '') -> None:
65
171
  now = datetime.now(timezone.utc).astimezone().strftime('%Y-%m-%d %H:%M:%S')
66
172
  updated = re.sub(r'(- 記録時刻: ).*', rf'\g<1>{now}', content)
67
173
 
68
- # 最終応答を追記(メッセージがあり、まだ存在しない場合のみ)
69
- if message and '- 最終応答:' not in updated:
174
+ # 最終応答を最新メッセージに更新する(既存があれば上書き、なければ追記)。
175
+ # 同一 stop hook 呼び出し内の冪等性は session_stop.py stop.run を 1 回だけ呼ぶ
176
+ # + stop_hook_active 早期 return (run() 内) で担保されているため、過去セッションの
177
+ # 古い応答は積極的に上書きしてよい。古い `not in updated` ガードは「最初の応答が
178
+ # 一日中残る」問題を引き起こしていた。
179
+ if message:
70
180
  single_line = ' '.join(message.split())
71
181
  # サロゲート文字など UTF-8 非互換文字を除去(JSON デコード時に生成される場合がある)
72
182
  single_line = single_line.encode('utf-8', errors='replace').decode('utf-8')
@@ -76,11 +186,23 @@ def _apply_session_updates(path: str, content: str, message: str = '') -> None:
76
186
  # --> をサニタイズして <!-- C3:SESSION:JSON ... --> ブロックを保護する
77
187
  truncated = truncated.replace('-->', '-- >')
78
188
 
79
- updated = re.sub(
80
- r'(- 記録時刻: [^\n]*)',
81
- lambda m: m.group(0) + f'\n- 最終応答: {truncated}',
82
- updated
83
- )
189
+ # 置換文字列に truncated(LLM 出力由来)を直接埋め込むと \1 等が後方参照として
190
+ # 解釈される。両分岐とも lambda で構造的に防御する [SR-V-001 Info-1]
191
+ if '- 最終応答:' in updated:
192
+ replacement = f'- 最終応答: {truncated}'
193
+ updated = re.sub(
194
+ r'- 最終応答: [^\n]*',
195
+ lambda _: replacement,
196
+ updated,
197
+ count=1,
198
+ )
199
+ else:
200
+ updated = re.sub(
201
+ r'(- 記録時刻: [^\n]*)',
202
+ lambda m: m.group(0) + f'\n- 最終応答: {truncated}',
203
+ updated,
204
+ count=1,
205
+ )
84
206
 
85
207
  if updated != content:
86
208
  dir_ = os.path.dirname(path)
@@ -1,5 +1,129 @@
1
1
  # Changelog
2
2
 
3
+ ## v2.17.0 (2026-05-24)
4
+
5
+ **基盤整備リリース第 1 弾**: 設定階層と配布判断ルールを canonical 化する。
6
+ コード変更は最小(docstring 追記のみ)、API 互換性完全維持、利用先への影響なし。
7
+
8
+ ### 追加
9
+
10
+ - **`.claude/docs/config-policy.md` を新規作成(308 行)**: 設定階層と配布判断ルールを
11
+ canonical 化する。主要構成は以下:
12
+ - §1 設定ファイル所在マップ(配布元と利用先での所在を一覧化)
13
+ - §2 設定優先順位(3 レイヤー: ツール権限 / 自動承認パターン / LLM 指示)と書き込み権限マトリクス
14
+ - §3 配布判断マトリクス(12 カテゴリ、`_excludes.py` の `EXCLUDE_PATTERNS` / `KEEP_PATTERNS`
15
+ と完全照合済み)
16
+ - §4 `settings.local.json` 運用の原則(`git add -f` リスク警告 / `c3 init` は `.gitignore`
17
+ を自動編集しないため手動追記が必要な点を明記)
18
+ - §5 プラットフォーム別 config 整合(canonical は `.claude/`、`.codex/` / `.cursor/` /
19
+ `.agents/` は adapter 生成物)
20
+ - §6 3 ファイル同期ルール(`.gitignore` / `_excludes.py` / `hatch_build.py`)
21
+ - §7 既知の落とし穴(`hooks` セクションの完全上書き / `taxonomy.md` の特殊扱い /
22
+ `rules/promoted/` を `c3 update` が触らない / `permission_rules.json` の `auto_allow`
23
+ 過度設定リスク)
24
+ - §8 参照先
25
+ - **`src/c3/_excludes.py` / `hatch_build.py` の docstring**:
26
+ 両ファイル冒頭の docstring 末尾に「See `.claude/docs/config-policy.md`」参照を
27
+ 完全一致 1 文で追記(3 ファイル同期の精神に則る)。定数 `EXCLUDE_PATTERNS` /
28
+ `KEEP_PATTERNS` は変更なし。
29
+ - **`.claude/CLAUDE.md`**: Directory Structure セクション末尾に config-policy.md
30
+ への参照を 1 行追加。
31
+
32
+ ### 背景・経緯
33
+
34
+ `.claude/docs/C3のconfig_policyとversion_upgradeの考慮点と超えるべき壁.md`(2026-05-22
35
+ 作成、配布元専用)で整理された「基盤整備 3 連発」のうち、規模「小 × 2」の高優先項目
36
+ を 1 リリースで完結させた。アーキテクト段階の実装照合で以下 3 点を初期素案から
37
+ 訂正:
38
+ - 配布判断マトリクス 10 → 12 カテゴリ(`permission_rules.json` 独立追加、例外 3 件明示)
39
+ - 章数 7 → 8(§7「既知の落とし穴」追加)
40
+ - 「5 段優先順位」→「3 レイヤー」(実装と乖離していたため修正)
41
+
42
+ ### 次リリース予告
43
+
44
+ - **v2.18.0** (予定): `c3 update` が削除を検出しない問題(`c3_update_no_delete_detection`
45
+ パターン)の解消。`deletions.txt` 方式で配布物に削除すべきパス一覧を含める。
46
+ - **v2.19.0** (予定): Breaking changes 警告 + バージョン checkpoint。`c3 update`
47
+ 実行時に前回バージョンとの diff から breaking changes 一覧を表示する。
48
+
49
+ ### 影響
50
+
51
+ - 既存利用先: なし。doc 追加 + docstring 追記のみで、コード挙動・CLI 挙動・wheel
52
+ 配布物の構造(`_template/.claude/docs/` 配下に `config-policy.md` 追加のみ)に
53
+ 破壊的変更はない。
54
+ - 既存テスト: 944 PASS / 4 skip 維持。
55
+ - レビュー対応: Round 1 code-review 4 件(M-01 / M-02 / L-01 / L-02)+ Round 2
56
+ security-review 3 件(SR-M-01 / SR-L-01 / SR-L-02)を計 3 ラウンドで全件解消。
57
+
58
+ ---
59
+
60
+ ## v2.16.0 (2026-05-24)
61
+
62
+ ### 修正
63
+
64
+ - **stop.py: 最終応答が古いまま残るバグを修正**:
65
+ `_apply_session_updates` の `if message and '- 最終応答:' not in updated:`
66
+ ガードにより、1 日に複数 Claude セッションがあると最初のセッションの最終
67
+ 応答が一日中残り続けていた。`re.sub` で最新メッセージに上書きする方式に
68
+ 変更。同一 stop hook 呼び出し内の冪等性は `session_stop.py` の単一プロセス +
69
+ `stop_hook_active` 早期 return で従来通り担保されている。
70
+
71
+ ### 追加
72
+
73
+ - **stop.py: 残タスクの前日自動引き継ぎ機能**:
74
+ 新規ヘルパー `_inherit_backlog_from_latest_session` を追加し、
75
+ `ensure_session_file` の新規作成パスで `SESSIONS_DIR` 内の直近過去 `.tmp`
76
+ から `## 残タスク` セクションの `- [ ]` 行のみを抽出して当日ファイルに
77
+ 引き継ぐ。既存当日ファイルがある場合 (`FileExistsError` ブランチ) は
78
+ 発動せずユーザー編集を尊重する。`init-session` Step 1.5(git log 照合)が
79
+ これまで空ファイルでは何も検出できなかった問題を構造的に解消。
80
+ - **過去ファイル由来の制御文字サニタイズ** [SR-V-001]:
81
+ `_INHERIT_SANITIZE_RE` を導入し、過去ファイルから引き継ぐ `- [ ]` 行に
82
+ 含まれる C0/C1 制御文字 (`\x00-\x08` / `\x0b-\x1f` / `\x7f-\x9f`) と
83
+ U+2028 / U+2029 を除去。タブ (`\x09`) と通常スペース (`\x20`) は保持。
84
+ universal newlines による `\r` の `\n` 変換と二層で防御することで、
85
+ 過去ファイル改ざんによる端末インジェクションを構造的に防ぐ。
86
+ - **新規ヘルパー `_inherit_backlog_from_latest_session` の `sessions_dir`
87
+ 引数**: テスト時にモジュールグローバル `SESSIONS_DIR` を差し替えずに
88
+ 動作確認できるよう、`sessions_dir: str | None = None` 引数を追加。
89
+ `ensure_session_file` からは `sessions_dir=SESSIONS_DIR` を明示渡し。
90
+
91
+ ### 改善
92
+
93
+ - **`_apply_session_updates` の `re.sub` 置換文字列を lambda 形式に統一**:
94
+ 上書き分岐 / 追記分岐の両方で `lambda _: replacement` または
95
+ `lambda m: ...` 形式に統一し、LLM 出力由来の `\1` 等が後方参照として
96
+ 解釈されるリスクを構造的に防御。
97
+ - **アトミック書き込みの tempfile suffix を `.writing` に変更**:
98
+ `_inherit_backlog_from_latest_session` 内の一時ファイルが `.tmp`
99
+ フィルタと誤検出される可能性を排除(書き込み途中の一時ファイルを
100
+ `YYYYMMDD.tmp` として誤認することを構造的に防ぐ)。
101
+
102
+ ### 回帰防御
103
+
104
+ - `tests/test_stop_additional.py` に新規 10 件のテスト追加:
105
+ - `TestAppendLastMessageOverwrite` (3 件): 最終応答上書き / 他セクション
106
+ 保全 / 冪等性
107
+ - `TestInheritBacklogFromLatestSession` (4 件): 引き継ぎ動作 / 過去
108
+ ファイル無し / 既存当日ファイル保護 / 完了済みのみケース
109
+ - `TestInheritBacklogControlCharSanitize` (1 件): 制御文字・ANSI・
110
+ U+2028/U+2029 の除去とタブ・スペース保持
111
+ - `TestInheritBacklogSessionsDirArg` (1 件): `sessions_dir` 引数経路
112
+ - `TestInheritBacklogNewPathOSErrorGuard` (1 件): `new_path` 読み込み
113
+ OSError の伝播防止
114
+ - pytest フル実行: **944 passed** / 4 skipped / 0 regression
115
+
116
+ ### 内部
117
+
118
+ - `_inherit_backlog_from_latest_session` の `new_path` 読み込みに
119
+ `try/except OSError: return` を追加。Stop hook プロセスの異常終了を防ぐ。
120
+ - `_INHERIT_SANITIZE_RE` の U+2028 / U+2029 は `chr(0x2028)` + `chr(0x2029)`
121
+ の連結で構築(raw string が `\uXXXX` を解釈しないため、表記揺れを排除)。
122
+ - `tests/test_stop_additional.py`: `from session_utils import extract_section`
123
+ をファイル先頭に集約 / `_setup` 戻り値型ヒントを精緻化。
124
+
125
+ ---
126
+
3
127
  ## v2.15.2 (2026-05-24)
4
128
 
5
129
  ### 改善
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: claude-code-conductor
3
- Version: 2.15.2
3
+ Version: 2.17.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
@@ -6,6 +6,9 @@ than rely on ``[tool.hatch.build] exclude`` patterns - which do not propagate
6
6
  into ``force-include`` sources - we copy the wanted subset into a staging
7
7
  location during ``initialize()`` and the wheel target packages that staged tree
8
8
  verbatim.
9
+
10
+ See ``.claude/docs/config-policy.md`` for the distribution decision matrix
11
+ and the rationale behind each excluded pattern.
9
12
  """
10
13
 
11
14
  from __future__ import annotations
@@ -1,3 +1,3 @@
1
1
  """Claude Code Conductor (C3) - multi-agent orchestration framework for Claude Code."""
2
2
 
3
- __version__ = "2.15.2"
3
+ __version__ = "2.17.0"