claude-code-conductor 2.56.0__tar.gz → 2.58.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 (244) hide show
  1. claude_code_conductor-2.58.0/.claude/.gitignore +69 -0
  2. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/agents/code-reviewer.md +3 -5
  3. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/agents/developer.md +2 -4
  4. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/agents/security-reviewer.md +3 -5
  5. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/agents/systematic-debugger.md +3 -5
  6. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/agents/tester.md +2 -4
  7. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/agents/wt_developer.md +2 -4
  8. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/agents/wt_systematic-debugger.md +3 -5
  9. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/agents/wt_tester.md +2 -4
  10. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/breaking-changes.txt +1 -0
  11. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/docs/config-policy.md +106 -12
  12. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/hooks/_hook_utils.py +2 -0
  13. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/hooks/stop.py +87 -1
  14. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/skills/autonomous-mode/SKILL.md +3 -1
  15. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/skills/dev-workflow/SKILL.md +88 -4
  16. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.gitignore +5 -1
  17. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/CHANGELOG.md +46 -0
  18. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/PKG-INFO +2 -2
  19. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/README.md +1 -1
  20. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/src/c3/__init__.py +1 -1
  21. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/src/c3/_excludes.py +42 -0
  22. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/src/c3/cli_init.py +5 -1
  23. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/src/c3/cli_update.py +51 -7
  24. claude_code_conductor-2.58.0/tests/test_claude_gitignore.py +186 -0
  25. claude_code_conductor-2.58.0/tests/test_init_only_patterns.py +907 -0
  26. claude_code_conductor-2.58.0/tests/test_scripts_stdout_encoding.py +298 -0
  27. claude_code_conductor-2.58.0/tests/test_stop_agent_memory_warn.py +337 -0
  28. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/CLAUDE.md +0 -0
  29. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/agents/architect.md +0 -0
  30. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/agents/design-critic.md +0 -0
  31. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/agents/doc-writer.md +0 -0
  32. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/agents/interviewer.md +0 -0
  33. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/agents/planner.md +0 -0
  34. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/agents/project-setup.md +0 -0
  35. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/deletions.txt +0 -0
  36. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/docs/autonomous-mode-onboarding.md +0 -0
  37. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/docs/nul-boundary.md +0 -0
  38. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/docs/parallel-agents-setup.md +0 -0
  39. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/docs/platform-adapters.md +0 -0
  40. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/docs/settings.json.md +0 -0
  41. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/hooks/check_agent_invocation.py +0 -0
  42. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/hooks/consolidate_memory.py +0 -0
  43. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/hooks/patterns_guard.py +0 -0
  44. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/hooks/permission_handler.py +0 -0
  45. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/hooks/permission_handler_toast.py +0 -0
  46. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/hooks/planner_check.py +0 -0
  47. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/hooks/post_tool.py +0 -0
  48. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/hooks/pre_compact.py +0 -0
  49. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/hooks/pre_tool.py +0 -0
  50. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/hooks/recall_autorebuild.py +0 -0
  51. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/hooks/recall_inject.py +0 -0
  52. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/hooks/report_contract_check.py +0 -0
  53. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/hooks/restore_session.py +0 -0
  54. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/hooks/select_tier.py +0 -0
  55. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/hooks/session_mode_watch.py +0 -0
  56. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/hooks/session_start.py +0 -0
  57. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/hooks/session_stop.py +0 -0
  58. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/hooks/session_utils.py +0 -0
  59. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/hooks/statusline.py +0 -0
  60. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/hooks/tier_autoapply.py +0 -0
  61. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/hooks/tier_gap_check.py +0 -0
  62. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/hooks/worktree_guard.py +0 -0
  63. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/memory/.gitkeep +0 -0
  64. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/permission_rules.json +0 -0
  65. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/rules/promoted/index.md +0 -0
  66. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/settings.json +0 -0
  67. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/skills/autonomous-mode/scripts/mode_line.py +0 -0
  68. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/skills/brainstorm/SKILL.md +0 -0
  69. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/skills/codex-review/SKILL.md +0 -0
  70. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/skills/dev-workflow/references/code-review-checklist.md +0 -0
  71. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/skills/dev-workflow/references/design-critic-rubric.md +0 -0
  72. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/skills/dev-workflow/references/design-rubric.md +0 -0
  73. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/skills/dev-workflow/references/interview-rubric.md +0 -0
  74. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/skills/dev-workflow/references/plan-design-guidelines.md +0 -0
  75. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/skills/dev-workflow/references/security-review-checklist.md +0 -0
  76. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/skills/dev-workflow/scripts/record_agent_outcome.py +0 -0
  77. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/skills/dev-workflow/scripts/record_review_decision.py +0 -0
  78. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/skills/dev-workflow/scripts/review_hint_inject.py +0 -0
  79. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/skills/develop/SKILL.md +0 -0
  80. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/skills/doc/SKILL.md +0 -0
  81. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/skills/extract-lib/SKILL.md +0 -0
  82. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/skills/init-session/SKILL.md +0 -0
  83. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/skills/init-session/scripts/session_guard.py +0 -0
  84. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/skills/mcp-config/SKILL.md +0 -0
  85. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/skills/parallel-agents/SKILL.md +0 -0
  86. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/skills/pattern-status/SKILL.md +0 -0
  87. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/skills/promote-pattern/SKILL.md +0 -0
  88. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/skills/recall/SKILL.md +0 -0
  89. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/skills/report-timestamp/SKILL.md +0 -0
  90. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/skills/report-timestamp/scripts/get_timestamp.py +0 -0
  91. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/skills/review-phase/SKILL.md +0 -0
  92. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/skills/setup/SKILL.md +0 -0
  93. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/skills/setup/reference.md +0 -0
  94. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/skills/setup/templates/coding-standards-template.md +0 -0
  95. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/skills/setup/templates/project-conventions-template.md +0 -0
  96. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/skills/start/SKILL.md +0 -0
  97. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/.claude/state/.gitkeep +0 -0
  98. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/ARCHITECTURE.md +0 -0
  99. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/LICENSE +0 -0
  100. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/LICENSES/fastembed-LICENSE +0 -0
  101. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/LICENSES/fastembed-NOTICE +0 -0
  102. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/LICENSES/numpy-LICENSE +0 -0
  103. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/LICENSES/onnxruntime-LICENSE +0 -0
  104. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/LICENSES/paraphrase-multilingual-MiniLM-L12-v2-LICENSE +0 -0
  105. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/hatch_build.py +0 -0
  106. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/pyproject.toml +0 -0
  107. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/src/c3/__main__.py +0 -0
  108. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/src/c3/_db_params.py +0 -0
  109. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/src/c3/_terminal.py +0 -0
  110. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/src/c3/adapters.py +0 -0
  111. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/src/c3/cli.py +0 -0
  112. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/src/c3/cli_ask.py +0 -0
  113. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/src/c3/cli_doctor.py +0 -0
  114. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/src/c3/cli_list.py +0 -0
  115. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/src/c3/cli_metrics.py +0 -0
  116. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/src/c3/cli_plan.py +0 -0
  117. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/src/c3/cli_recall.py +0 -0
  118. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/src/c3/cli_run.py +0 -0
  119. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/src/c3/cli_tier.py +0 -0
  120. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/src/c3/db.py +0 -0
  121. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/src/c3/embedding.py +0 -0
  122. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/src/c3/gitutil.py +0 -0
  123. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/src/c3/mcp_server.py +0 -0
  124. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/src/c3/migrate.py +0 -0
  125. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/src/c3/migrations/001_initial.sql +0 -0
  126. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/src/c3/migrations/002_agent_cost_runs.sql +0 -0
  127. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/src/c3/migrations/003_tier_cost.sql +0 -0
  128. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/src/c3/migrations/004_agent_outcomes.sql +0 -0
  129. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/src/c3/migrations/005_drop_agent_tier_bandit.sql +0 -0
  130. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/src/c3/migrations/006_review_decisions_severity.sql +0 -0
  131. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/src/c3/migrations/README.md +0 -0
  132. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/src/c3/migrations/__init__.py +0 -0
  133. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/src/c3/paths.py +0 -0
  134. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/src/c3/plan_validator.py +0 -0
  135. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/src/c3/platforms.py +0 -0
  136. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/src/c3/pricing.py +0 -0
  137. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/src/c3/question.py +0 -0
  138. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/src/c3/recall_chunker.py +0 -0
  139. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/src/c3/recall_index.py +0 -0
  140. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/src/c3/usage_ingester.py +0 -0
  141. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/__init__.py +0 -0
  142. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/_pre_compact_helpers.py +0 -0
  143. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/conftest.py +0 -0
  144. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/fixtures/usage/README.md +0 -0
  145. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/fixtures/usage/mainline.jsonl +0 -0
  146. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/fixtures/usage/subagents/agent-deadbeef.jsonl +0 -0
  147. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/fixtures/usage/subagents/agent-deadbeef.meta.json +0 -0
  148. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/hooks/__init__.py +0 -0
  149. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/hooks/test_check_agent_invocation.py +0 -0
  150. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/hooks/test_consolidate_memory.py +0 -0
  151. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/hooks/test_hook_utils.py +0 -0
  152. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/hooks/test_permission_handler.py +0 -0
  153. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/hooks/test_permission_handler_toast.py +0 -0
  154. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/hooks/test_pip_reinstall_reminder.py +0 -0
  155. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/hooks/test_planner_check.py +0 -0
  156. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/hooks/test_planner_check_dev.py +0 -0
  157. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/hooks/test_post_tool.py +0 -0
  158. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/hooks/test_pre_tool.py +0 -0
  159. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/hooks/test_recall_autorebuild.py +0 -0
  160. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/hooks/test_recall_inject.py +0 -0
  161. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/hooks/test_record_agent_outcome.py +0 -0
  162. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/hooks/test_record_review_decision.py +0 -0
  163. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/hooks/test_restore_session.py +0 -0
  164. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/hooks/test_review_hint_inject.py +0 -0
  165. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/hooks/test_select_tier.py +0 -0
  166. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/hooks/test_select_tier_escalation.py +0 -0
  167. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/hooks/test_session_start.py +0 -0
  168. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/hooks/test_session_stop.py +0 -0
  169. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/hooks/test_session_utils.py +0 -0
  170. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/hooks/test_settings_local_absolute_paths.py +0 -0
  171. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/hooks/test_settings_tier_autoapply_registration.py +0 -0
  172. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/hooks/test_similarity_boost.py +0 -0
  173. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/hooks/test_statusline.py +0 -0
  174. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/hooks/test_statusline_template_sync.py +0 -0
  175. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/hooks/test_sync_check.py +0 -0
  176. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/hooks/test_template_guard.py +0 -0
  177. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/hooks/test_tier_autoapply.py +0 -0
  178. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/hooks/test_tier_gap_check.py +0 -0
  179. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/hooks/test_tier_security_fixes.py +0 -0
  180. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/skills/__init__.py +0 -0
  181. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/skills/_skill_helpers.py +0 -0
  182. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/skills/test_dev_workflow_no_task_type.py +0 -0
  183. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/skills/test_init_session_no_task_type.py +0 -0
  184. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/skills/test_marker_compliance.py +0 -0
  185. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/skills/test_parallel_agents_skill_tier.py +0 -0
  186. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/skills/test_planner_lightweight.py +0 -0
  187. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/skills/test_recall_skill.py +0 -0
  188. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/skills/test_session_backlog_reconciliation.py +0 -0
  189. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/skills/test_session_guard.py +0 -0
  190. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/skills/test_setup_templates.py +0 -0
  191. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/skills/test_start_skill_bugfix_flow.py +0 -0
  192. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/skills/test_start_skill_new_flow.py +0 -0
  193. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/skills/test_start_skill_security_audit_phase.py +0 -0
  194. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/test_adapters.py +0 -0
  195. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/test_check_deletions.py +0 -0
  196. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/test_cli_ask.py +0 -0
  197. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/test_cli_doctor.py +0 -0
  198. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/test_cli_doctor_launcher.py +0 -0
  199. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/test_cli_entry.py +0 -0
  200. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/test_cli_init.py +0 -0
  201. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/test_cli_list.py +0 -0
  202. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/test_cli_metrics.py +0 -0
  203. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/test_cli_plan.py +0 -0
  204. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/test_cli_recall.py +0 -0
  205. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/test_cli_run.py +0 -0
  206. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/test_cli_tier.py +0 -0
  207. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/test_cli_update_breaking_changes.py +0 -0
  208. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/test_cli_update_deletions.py +0 -0
  209. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/test_db.py +0 -0
  210. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/test_docstring_consistency.py +0 -0
  211. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/test_embedding.py +0 -0
  212. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/test_excludes.py +0 -0
  213. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/test_extract_breaking_changes.py +0 -0
  214. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/test_gitutil.py +0 -0
  215. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/test_hooks_stdin_idiom.py +0 -0
  216. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/test_mcp_server_elicit.py +0 -0
  217. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/test_migrate.py +0 -0
  218. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/test_mode_line.py +0 -0
  219. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/test_no_bare_python_launcher.py +0 -0
  220. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/test_nul_boundary_lint.py +0 -0
  221. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/test_paths.py +0 -0
  222. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/test_patterns_guard.py +0 -0
  223. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/test_plan_validator.py +0 -0
  224. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/test_pre_compact.py +0 -0
  225. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/test_pre_tool_hook.py +0 -0
  226. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/test_precompact_additional.py +0 -0
  227. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/test_precompact_toctou_fixes.py +0 -0
  228. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/test_pricing.py +0 -0
  229. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/test_recall_chunker.py +0 -0
  230. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/test_recall_index.py +0 -0
  231. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/test_references_migration.py +0 -0
  232. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/test_report_contract_check.py +0 -0
  233. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/test_session_mode_watch.py +0 -0
  234. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/test_session_utils_additional.py +0 -0
  235. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/test_settings_hooks_registration.py +0 -0
  236. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/test_skill_no_builtin_conflict.py +0 -0
  237. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/test_statusline.py +0 -0
  238. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/test_stop_additional.py +0 -0
  239. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/test_stop_hook.py +0 -0
  240. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/test_stop_precompact_fixes.py +0 -0
  241. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/test_sync_template_stop.py +0 -0
  242. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/test_template_pre_tool_hook.py +0 -0
  243. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/test_usage_ingester.py +0 -0
  244. {claude_code_conductor-2.56.0 → claude_code_conductor-2.58.0}/tests/test_worktree_guard.py +0 -0
@@ -0,0 +1,69 @@
1
+ # =============================================================================
2
+ # C3 が利用先プロジェクトへ配置する .gitignore
3
+ #
4
+ # 方針: 実行時生成領域は「載せない理由があるもの以外は git 管理する」。
5
+ # C3 は使いながら育てるフレームワークで、育った結果(agent-memory / reports /
6
+ # memory / state/c3.db)はチームの引き継ぎ資産になる。載せなければ、その資産は
7
+ # 最初に動かした人のマシンにしか残らない。
8
+ # 分類の根拠と public リポジトリでの注意は docs/config-policy.md §1-2 を参照。
9
+ #
10
+ # ここで除外するのは次の 2 種類だけ:
11
+ # (a) 再生成可能 … 元データから再構築できる
12
+ # (b) セッション一時 … 1 セッション限りで意味を失う
13
+ #
14
+ # このファイルは c3 init が配置する。**c3 update は上書きしない**ため
15
+ # (_excludes.py の INIT_ONLY_PATTERNS)、プロジェクト固有の除外をここへ追記しても
16
+ # アップデートで失われない。ただし C3 側の分類更新(新しい一時ファイルの追加など)も
17
+ # 自動では届かないので、リリースノートで案内された変更は手動でマージすること。
18
+ # =============================================================================
19
+
20
+ # --- (a) 再生成可能 ----------------------------------------------------------
21
+ # recall インデックス。`c3 recall rebuild` で元データから再構築できる。
22
+ # 実測で数十 MB あり、更新のたびに履歴を太らせるため除外する。
23
+ state/recall.hnsw
24
+ state/recall_meta.json
25
+ state/*.bak
26
+
27
+ # --- (b) セッション一時 ------------------------------------------------------
28
+ # hook が毎セッション書き換える使い捨てファイル。
29
+ # ただし setup_done.flag は「/setup 実行済み」というプロジェクト単位の状態なので
30
+ # 除外しない(新しく参加した人が setup 未実施と誤判定されるのを防ぐ)。
31
+ state/*.flag
32
+ !state/setup_done.flag
33
+ state/tier_selection.json
34
+ state/*.lock
35
+
36
+ # SQLite の WAL サイドカー(db.py は PRAGMA journal_mode=WAL で開く)。
37
+ # 通常はチェックポイントで c3.db 本体へ取り込まれるが、プロセス異常終了時に
38
+ # 残存しうる。トランザクション中間データを「引き継ぎ資産」として commit しない。
39
+ state/*-wal
40
+ state/*-shm
41
+
42
+ # 実行ログ・並列実行の一時領域(.gitkeep は空ディレクトリ維持のため残す)
43
+ logs/
44
+ worktrees/
45
+ tmp/*
46
+ !tmp/.gitkeep
47
+
48
+ # --- 個人設定 ----------------------------------------------------------------
49
+ # per-user / per-environment の設定。C3 は触らない。
50
+ settings.local.json
51
+
52
+ # =============================================================================
53
+ # 意図的に tracked にしているもの(ここで除外しない)
54
+ #
55
+ # state/c3.db tier-routing の学習と review-hint の判断記録
56
+ # (許容例外・是正履歴)。載せないと「この
57
+ # プロジェクトではこの指摘を許容する」という
58
+ # 合意が、記録した個人に閉じる
59
+ # state/setup_done.flag /setup 実行済みマーカー
60
+ # state/security_audit_exceptions.json 許容例外の設定
61
+ # state/tier_autoapply.jsonl tier 適用ログ
62
+ # agent-memory/ 各 agent が蓄積した判断基準
63
+ # reports/ PR で「レポート+実差分」を並べて読める
64
+ # memory/ セッション記録・学習パターン
65
+ #
66
+ # public リポジトリでは security 系(security-reviewer の agent-memory と
67
+ # security-review-report-*.md)が「既知の弱点と、それを見逃している理由の一覧」に
68
+ # なるため、公開プロジェクトではそれらの除外を検討する(docs/config-policy.md §1-2)。
69
+ # =============================================================================
@@ -19,13 +19,11 @@ tools:
19
19
  コードの品質・保守性・パフォーマンスをレビューし、改善提案を code-review-report として出力する。
20
20
 
21
21
  ## Memory
22
- - 起動時に `.claude/agent-memory/code-reviewer/MEMORY.md` がシステムプロンプトに自動注入される(フロントマター `memory: project` による)。注入された内容を踏まえてレビューすること。
23
- - 作業終了時、次回以降のレビューに役立つ知見があれば MEMORY.md に追記する。記録対象は以下に限定する:
22
+ - 作業終了時、次回以降のレビューに役立つ知見があれば `.claude/agent-memory/code-reviewer/MEMORY.md` に追記する。記録対象は以下に限定する:
24
23
  - 再現価値のあるレビュー観点・指摘パターン
25
- - **許容例外**: ユーザーが指摘を許容した観点と理由(次回レビューでの再指摘を防ぐ)
24
+ - **許容例外**: ユーザーが指摘を許容した観点と理由(`[許容例外]` プレフィックスを付ける。次回レビューでの再指摘を防ぐ)
26
25
  - 本プロジェクト特有のコーディング規約・トレードオフ判断
27
- - 雑記録・一回性の進捗ログは記録しない。MEMORY.md は 200 行以内を保ち、超える場合は価値の低いエントリから削除する。
28
- - 形式は箇条書き 1 行 + 必要なら次行にインデントで補足。許容例外は `[許容例外]` プレフィックスを付けて理由を併記する。
26
+ - 雑記録・一回性の進捗ログは記録しない。1 エントリ 1 行で簡潔に書き、MEMORY.md 全体は 200 行 / 25KB 以内に保つ(超過分は起動時に読まれない・超えたら価値の低いエントリから削除する)。
29
27
 
30
28
  ## Key Scope
31
29
 
@@ -20,13 +20,11 @@ tools:
20
20
  plan-report に基づき実装・デバッグ・リファクタリングを行い、tester が検証できる状態にする。
21
21
 
22
22
  ## Memory
23
- - 起動時に `.claude/agent-memory/developer/MEMORY.md` がシステムプロンプトに自動注入される(フロントマター `memory: project` による)。注入された内容を踏まえて作業すること。
24
- - 作業終了時、次回以降の作業に役立つ知見があれば MEMORY.md に追記する。記録対象は以下に限定する:
23
+ - 作業終了時、次回以降の作業に役立つ知見があれば `.claude/agent-memory/developer/MEMORY.md` に追記する。記録対象は以下に限定する:
25
24
  - 再現価値のある実装・リファクタリングのパターン
26
25
  - 同じハマり方を繰り返さないための注意点(言語・ライブラリ・ツール特有の落とし穴)
27
26
  - 本プロジェクト特有の制約・許容例外(理由とセットで)
28
- - 雑記録・一回性の進捗ログは記録しない。MEMORY.md は 200 行以内を保ち、超える場合は価値の低いエントリから削除する。
29
- - 形式は箇条書き 1 行 + 必要なら次行にインデントで補足。日付や ID は不要(コンテンツ自身が自己説明的であること)。
27
+ - 雑記録・一回性の進捗ログは記録しない。1 エントリ 1 行で簡潔に書き、MEMORY.md 全体は 200 行 / 25KB 以内に保つ(超過分は起動時に読まれない・超えたら価値の低いエントリから削除する)。
30
28
 
31
29
  ## Key Scope
32
30
 
@@ -19,13 +19,11 @@ tools:
19
19
  SQLインジェクション・XSS・認証認可・秘密情報漏洩などの脆弱性を診断し、security-review-report を出力する。
20
20
 
21
21
  ## Memory
22
- - 起動時に `.claude/agent-memory/security-reviewer/MEMORY.md` がシステムプロンプトに自動注入される(フロントマター `memory: project` による)。注入された内容を踏まえて診断すること。
23
- - 作業終了時、次回以降の診断に役立つ知見があれば MEMORY.md に追記する。記録対象は以下に限定する:
22
+ - 作業終了時、次回以降の診断に役立つ知見があれば `.claude/agent-memory/security-reviewer/MEMORY.md` に追記する。記録対象は以下に限定する:
24
23
  - 再現価値のある脆弱性パターン・診断観点
25
- - **許容例外**: ユーザーが指摘を許容したリスク・脅威モデル外と判断した観点と理由(次回診断での再指摘を防ぐ)
24
+ - **許容例外**: ユーザーが指摘を許容したリスク・脅威モデル外と判断した観点と理由(`[許容例外]` プレフィックスを付ける。次回診断での再指摘を防ぐ)
26
25
  - 本プロジェクト特有の脅威モデル・信頼境界・許容されている設計(理由とセットで)
27
- - 雑記録・一回性の進捗ログは記録しない。MEMORY.md は 200 行以内を保ち、超える場合は価値の低いエントリから削除する。
28
- - 形式は箇条書き 1 行 + 必要なら次行にインデントで補足。許容例外は `[許容例外]` プレフィックスを付けて理由を併記する。
26
+ - 雑記録・一回性の進捗ログは記録しない。1 エントリ 1 行で簡潔に書き、MEMORY.md 全体は 200 行 / 25KB 以内に保つ(超過分は起動時に読まれない・超えたら価値の低いエントリから削除する)。
29
27
 
30
28
  ## Key Scope
31
29
 
@@ -19,13 +19,11 @@ developer が詰まった問題の根本原因を調査し、debug-analysis-repo
19
19
  コードの修正は行わない。調査と分析のみ担当する。
20
20
 
21
21
  ## Memory
22
- - 起動時に `.claude/agent-memory/systematic-debugger/MEMORY.md` がシステムプロンプトに自動注入される(フロントマター `memory: project` による)。注入された内容を踏まえて調査すること。
23
- - 作業終了時、次回以降の調査に役立つ知見があれば MEMORY.md に追記する。記録対象は以下に限定する:
24
- - **過去の根本原因パターン**: 「症状 → 原因」のペア(同じ症状を再調査せずに済む)
22
+ - 作業終了時、次回以降の調査に役立つ知見があれば `.claude/agent-memory/systematic-debugger/MEMORY.md` に追記する。記録対象は以下に限定する:
23
+ - **過去の根本原因パターン**: 「症状 → 原因」のペア(矢印で明示する。同じ症状を再調査せずに済む)
25
24
  - **有効だった調査経路**: 短時間で原因到達できた Grep / コマンド・差分の見方
26
25
  - 本プロジェクト特有の落とし穴(環境・設定・依存関係に起因する繰り返し問題)
27
- - 雑記録・一回性の進捗ログは記録しない。MEMORY.md は 200 行以内を保ち、超える場合は価値の低いエントリから削除する。
28
- - 形式は箇条書き 1 行 + 必要なら次行にインデントで補足。「症状 → 原因」のペアは矢印で明示する。
26
+ - 雑記録・一回性の進捗ログは記録しない。1 エントリ 1 行で簡潔に書き、MEMORY.md 全体は 200 行 / 25KB 以内に保つ(超過分は起動時に読まれない・超えたら価値の低いエントリから削除する)。
29
27
 
30
28
  ## Key Scope
31
29
 
@@ -18,13 +18,11 @@ tools:
18
18
  テスト仕様の設計・テストコード作成・テスト実行を行い、品質状況を test-report として出力する。
19
19
 
20
20
  ## Memory
21
- - 起動時に `.claude/agent-memory/tester/MEMORY.md` がシステムプロンプトに自動注入される(フロントマター `memory: project` による)。注入された内容を踏まえて作業すること。
22
- - 作業終了時、次回以降の作業に役立つ知見があれば MEMORY.md に追記する。記録対象は以下に限定する:
21
+ - 作業終了時、次回以降の作業に役立つ知見があれば `.claude/agent-memory/tester/MEMORY.md` に追記する。記録対象は以下に限定する:
23
22
  - 再現価値のあるテスト設計パターン(Red の書き方・テスト分割の粒度・モック戦略)
24
23
  - 本プロジェクト特有のテスト落とし穴(環境依存・並行実行・フレーク要因)
25
24
  - テスト実行コマンド・前提条件などプロジェクト特有の情報
26
- - 雑記録・一回性の進捗ログは記録しない。MEMORY.md は 200 行以内を保ち、超える場合は価値の低いエントリから削除する。
27
- - 形式は箇条書き 1 行 + 必要なら次行にインデントで補足。日付や ID は不要(コンテンツ自身が自己説明的であること)。
25
+ - 雑記録・一回性の進捗ログは記録しない。1 エントリ 1 行で簡潔に書き、MEMORY.md 全体は 200 行 / 25KB 以内に保つ(超過分は起動時に読まれない・超えたら価値の低いエントリから削除する)。
28
26
 
29
27
  ## Key Scope
30
28
 
@@ -25,13 +25,11 @@ tools:
25
25
  plan-report に基づき実装・デバッグ・リファクタリングを行い、tester が検証できる状態にする。
26
26
 
27
27
  ## Memory
28
- - 起動時に `.claude/agent-memory/wt_developer/MEMORY.md` がシステムプロンプトに自動注入される(フロントマター `memory: project` による)。注入された内容を踏まえて作業すること。
29
- - 作業終了時、次回以降の作業に役立つ知見があれば MEMORY.md に追記する。記録対象は以下に限定する:
28
+ - 作業終了時、次回以降の作業に役立つ知見があれば `.claude/agent-memory/wt_developer/MEMORY.md` に追記する。記録対象は以下に限定する:
30
29
  - 再現価値のある実装・リファクタリングのパターン
31
30
  - 同じハマり方を繰り返さないための注意点(言語・ライブラリ・ツール特有の落とし穴)
32
31
  - 本プロジェクト特有の制約・許容例外(理由とセットで)
33
- - 雑記録・一回性の進捗ログは記録しない。MEMORY.md は 200 行以内を保ち、超える場合は価値の低いエントリから削除する。
34
- - 形式は箇条書き 1 行 + 必要なら次行にインデントで補足。日付や ID は不要(コンテンツ自身が自己説明的であること)。
32
+ - 雑記録・一回性の進捗ログは記録しない。1 エントリ 1 行で簡潔に書き、MEMORY.md 全体は 200 行 / 25KB 以内に保つ(超過分は起動時に読まれない・超えたら価値の低いエントリから削除する)。
35
33
 
36
34
  ## Key Scope
37
35
 
@@ -24,13 +24,11 @@ developer が詰まった問題の根本原因を調査し、debug-analysis-repo
24
24
  コードの修正は行わない。調査と分析のみ担当する。
25
25
 
26
26
  ## Memory
27
- - 起動時に `.claude/agent-memory/wt_systematic-debugger/MEMORY.md` がシステムプロンプトに自動注入される(フロントマター `memory: project` による)。注入された内容を踏まえて調査すること。
28
- - 作業終了時、次回以降の調査に役立つ知見があれば MEMORY.md に追記する。記録対象は以下に限定する:
29
- - **過去の根本原因パターン**: 「症状 → 原因」のペア(同じ症状を再調査せずに済む)
27
+ - 作業終了時、次回以降の調査に役立つ知見があれば `.claude/agent-memory/wt_systematic-debugger/MEMORY.md` に追記する。記録対象は以下に限定する:
28
+ - **過去の根本原因パターン**: 「症状 → 原因」のペア(矢印で明示する。同じ症状を再調査せずに済む)
30
29
  - **有効だった調査経路**: 短時間で原因到達できた Grep / コマンド・差分の見方
31
30
  - 本プロジェクト特有の落とし穴(環境・設定・依存関係に起因する繰り返し問題)
32
- - 雑記録・一回性の進捗ログは記録しない。MEMORY.md は 200 行以内を保ち、超える場合は価値の低いエントリから削除する。
33
- - 形式は箇条書き 1 行 + 必要なら次行にインデントで補足。「症状 → 原因」のペアは矢印で明示する。
31
+ - 雑記録・一回性の進捗ログは記録しない。1 エントリ 1 行で簡潔に書き、MEMORY.md 全体は 200 行 / 25KB 以内に保つ(超過分は起動時に読まれない・超えたら価値の低いエントリから削除する)。
34
32
 
35
33
  ## Key Scope
36
34
 
@@ -23,13 +23,11 @@ tools:
23
23
  テスト仕様の設計・テストコード作成・テスト実行を行い、品質状況を test-report として出力する。
24
24
 
25
25
  ## Memory
26
- - 起動時に `.claude/agent-memory/wt_tester/MEMORY.md` がシステムプロンプトに自動注入される(フロントマター `memory: project` による)。注入された内容を踏まえて作業すること。
27
- - 作業終了時、次回以降の作業に役立つ知見があれば MEMORY.md に追記する。記録対象は以下に限定する:
26
+ - 作業終了時、次回以降の作業に役立つ知見があれば `.claude/agent-memory/wt_tester/MEMORY.md` に追記する。記録対象は以下に限定する:
28
27
  - 再現価値のあるテスト設計パターン(Red の書き方・テスト分割の粒度・モック戦略)
29
28
  - 本プロジェクト特有のテスト落とし穴(環境依存・並行実行・フレーク要因)
30
29
  - テスト実行コマンド・前提条件などプロジェクト特有の情報
31
- - 雑記録・一回性の進捗ログは記録しない。MEMORY.md は 200 行以内を保ち、超える場合は価値の低いエントリから削除する。
32
- - 形式は箇条書き 1 行 + 必要なら次行にインデントで補足。日付や ID は不要(コンテンツ自身が自己説明的であること)。
30
+ - 雑記録・一回性の進捗ログは記録しない。1 エントリ 1 行で簡潔に書き、MEMORY.md 全体は 200 行 / 25KB 以内に保つ(超過分は起動時に読まれない・超えたら価値の低いエントリから削除する)。
33
31
 
34
32
  ## Key Scope
35
33
 
@@ -9,3 +9,4 @@ v2.20.0|hooks/schema.sql removed; SQLite schema is now managed by c3/migrations/
9
9
  v2.41.0|Learning tables tier_bandit/tier_recent_outcomes are DROPPED and learning data resets; record_tier_outcome.py replaced by record_agent_outcome.py; c3 tier stats --json shape changed; old db.py tier APIs removed or shimmed (shims removed next release)|
10
10
  v2.43.0|Dropped agent_tier_bandit table (migration 005; bandit params now derived from agent_outcomes event log at read time, learning data preserved). Removed update_agent_tier_params and five v2.41.0 deprecated shims (read_tier_params, read_tier_failure_rate, update_tier_params, record_tier_recent_outcome, sync_tier_bandit_cost). read_agent_failure_rate signature changed: last_n replaced by window_days (time-based window, default 14 days via C3_FAILURE_WINDOW_DAYS).|
11
11
  v2.51.0|Hook and statusLine launchers in the distributed settings.json changed from bare 'python' to 'c3 run'. Run 'c3 update' to migrate. If you customized settings.json directly, review 'c3 update --dry-run' first and move customizations to settings.local.json before updating.|配布 settings.json の hook / statusLine 起動子が python から c3 run 前提に変更。c3 update で移行。settings.json を直接カスタムしている場合は c3 update --dry-run で差分確認しカスタムを settings.local.json へ移してから update。
12
+ v2.58.0|c3 init and c3 update now place .claude/.gitignore in the target project. It excludes only regenerable files (state/recall.*) and session-scoped files (state/*.flag, state/tier_selection.json, logs/, worktrees/, tmp/). Existing projects that already committed those must run 'git rm -r --cached .claude/state/recall.hnsw .claude/state/recall_meta.json .claude/logs .claude/worktrees' once and commit, because .gitignore has no effect on already-tracked files. If your root .gitignore excludes the whole .claude/state/ directory, git never descends into it and the negation patterns in .claude/.gitignore do not apply; change the root rule to .claude/state/* or remove it. See .claude/docs/config-policy.md section 1-2.|c3 init / c3 update が .claude/.gitignore を配置するようになりました。除外は再生成可能なもの(state/recall.*)とセッション一時のもの(state/*.flag・state/tier_selection.json・logs/・worktrees/・tmp/)のみです。既にこれらを commit している既存プロジェクトは、.gitignore が tracked ファイルに効かないため git rm -r --cached を一度実行してください。ルートの .gitignore で .claude/state/ をディレクトリごと除外している場合は否定パターンが効かないため、ワイルドカード形式へ変更するか削除してください。詳細は .claude/docs/config-policy.md §1-2 を参照。
@@ -37,14 +37,85 @@ src/c3/migrations/ SQLite schema migration SQL ファイル
37
37
  .claude/rules/ c3 init で配置・c3 update で更新
38
38
  .claude/rules/promoted/index.md c3 init で空雛形のみ配置(c3 update は触らない)
39
39
  .claude/hooks/ c3 init で配置・c3 update で更新
40
- .claude/state/ 実行時生成(gitignore 推奨)
41
- .claude/memory/ 実行時生成
42
- .claude/agent-memory/ 実行時生成
43
- .claude/reports/ 実行時生成(gitignore 推奨)
44
- .claude/worktrees/ 並列実行時一時生成
45
- .claude/logs/ 実行時生成
40
+ .claude/state/ 実行時生成(c3.db 等は git 管理を推奨・一部除外。下記参照)
41
+ .claude/memory/ 実行時生成(チーム開発では git 管理を推奨。下記参照)
42
+ .claude/agent-memory/ 実行時生成(チーム開発では git 管理を推奨。下記参照)
43
+ .claude/reports/ 実行時生成(チーム開発では git 管理を推奨。下記参照)
44
+ .claude/worktrees/ 並列実行時一時生成(.claude/.gitignore が自動除外)
45
+ .claude/logs/ 実行時生成(.claude/.gitignore が自動除外)
46
46
  ```
47
47
 
48
+ > **`.claude/` 実行時生成領域のコミット方針**: **チーム開発では「載せない理由があるもの以外は
49
+ > git 管理する」を既定とする。** C3 は使いながら育てるフレームワークで、育った結果の大半は
50
+ > これらの領域に溜まる。載せなければ、その資産は最初に動かした人のマシンにしか存在しない。
51
+ > **`c3 init` は `.claude/.gitignore` を配置する**(プロジェクトルートの `.gitignore` は編集しない)。
52
+ > そこで除外されない領域は既定で tracked になる。
53
+ >
54
+ > **載せない**(載せても価値がないか、載せると邪魔になるもの):
55
+ >
56
+ > | 対象 | 理由 |
57
+ > |---|---|
58
+ > | `state/recall.hnsw` / `state/recall_meta.json`(+ `.bak`) | **元データから再生成可能**。実測 63MB あり履歴を無用に太らせる |
59
+ > | `state/*.flag` / `state/tier_selection.json` | hook が動的生成する**セッション一時**ファイル |
60
+ > | `logs/` / `worktrees/` | 実行ログ・並列実行の一時領域 |
61
+ >
62
+ > > **既存プロジェクトへの移行(重要)**: **`.gitignore` は「既に tracked のファイル」には効かない。**
63
+ > > v2.58.0 より前から C3 を使っていて `state/recall.hnsw`(実測 63MB)等を既に commit している場合、
64
+ > > `c3 update` で `.claude/.gitignore` が配置されても**それだけでは追跡から外れない**。
65
+ > > 一度だけ以下を実行する(作業ツリーのファイルは消えない):
66
+ > >
67
+ > > ```bash
68
+ > > git rm -r --cached .claude/state/recall.hnsw .claude/state/recall_meta.json \
69
+ > > .claude/logs .claude/worktrees 2>/dev/null
70
+ > > git status # 削除予定が想定どおりか確認してから commit する
71
+ > > ```
72
+ > >
73
+ > > 履歴からも消したい場合(63MB が clone を重くしている等)は `git filter-repo` 等での
74
+ > > 履歴書き換えが必要で、共有ブランチでは force push を伴うためチームと合意してから行う。
75
+ > > **未 commit のプロジェクトでは何もしなくてよい**(`.claude/.gitignore` が最初から効く)。
76
+ > >
77
+ > > また、プロジェクトルートの `.gitignore` で `.claude/state/` のように**ディレクトリごと**除外して
78
+ > > いる場合、git はその配下へ降りないため `.claude/.gitignore` の否定パターン(`!state/setup_done.flag`
79
+ > > 等)が**効かない**。ルート側を `.claude/state/*` のようなワイルドカード形式にするか、
80
+ > > ルート側の当該行を削除して `.claude/.gitignore` に一本化する。
81
+ >
82
+ > **載せる**(引き継ぎ資産):
83
+ >
84
+ > | 対象 | 何が引き継がれるか |
85
+ > |---|---|
86
+ > | `agent-memory/` | 各 agent が蓄積した判断基準。とりわけ reviewer の `[許容例外]`(この指摘はこのプロジェクトでは許容する、というユーザー判断の記録)は、コミットして初めてチーム全員の reviewer が同じ判断を再現できる |
87
+ > | `reports/` | 個々の変更の記録。PR レビュー時に「レポート+実差分」を並べて読め、レビュアーが変更の意図まで追える(実運用で有効性を確認済み) |
88
+ > | `memory/` | セッション記録(現在地・残タスク・うまくいったアプローチ)と学習パターン。次に触る人が前回の文脈から再開できる |
89
+ > | `state/c3.db` | tier-routing の学習データと review-hint の判断記録(許容例外・是正履歴)。載せないと「このプロジェクトではこの指摘を許容する」という合意が記録した個人に閉じる |
90
+ > | `state/security_audit_exceptions.json` / `state/tier_autoapply.jsonl` | 許容例外の設定と tier 適用ログ |
91
+ >
92
+ > agent-memory は Claude Code の `memory: project` スコープの実体で、公式仕様でも「バージョン管理で
93
+ > 共有可能」な領域として設計されている(共有したくないものは `user` / `local` スコープに置く)。
94
+ >
95
+ > **c3.db のコンフリクトについて**: SQLite バイナリは git でマージできないため、同一プロジェクトを
96
+ > 複数人が**同時に**改修する運用では、衝突時の解決手段が「どちらかの DB を丸ごと選ぶ」しかなく
97
+ > 片方の記録が失われる。2026-07-28 時点の実運用ではコンフリクトは発生していない(同一プロジェクトへの
98
+ > 同時改修という運用形態を取っていないため)。**まず載せる方針とし、実際に衝突が問題化した時点で
99
+ > エクスポート方式(DB を JSONL 等へダンプして tracked にし、DB 本体は再構築する)を検討する。**
100
+ > 衝突の起きやすさはチームの運用形態に依存するため、一律の正解はない。
101
+ >
102
+ > **前提となる規律**: コミットする以上、agent 定義の `## Memory` 節が定める**記録対象の限定**
103
+ > (秘密情報・一時情報・雑記録を書かない)が守られている必要がある。共有するとこの規律は
104
+ > 「自分だけの問題」ではなくなる。
105
+ >
106
+ > **public リポジトリでの注意**: security-reviewer の MEMORY.md と `security-review-report-*.md`
107
+ > には構造上「この脅威はこのプロジェクトでは許容する・理由は〜」が蓄積される。private repo では
108
+ > チームの資産だが、public では「**既知の弱点と、それを見逃している理由の一覧**」を公開することに
109
+ > なる。公開プロジェクトでは security 系(reviewer の agent-memory と security-review-report)を
110
+ > `.gitignore` に加えるか `local` スコープへ移すことを検討する。
111
+ > (C3 配布元リポジトリ自身が `.claude/agent-memory/` と `.claude/reports/` を gitignore して
112
+ > いるのは、この理由と、配布物と開発ログを分けるためであって、「共有すべきでない領域だから」
113
+ > ではない。)
114
+ >
115
+ > なお各 `MEMORY.md` は起動時に**先頭 200 行 / 25KB まで**しか system prompt に載らない(超過分は
116
+ > 読まれない)。共有運用ではこれは「チーム全員の reviewer が過去の合意を読めなくなる」ことを意味する
117
+ > ため、`stop.py` が 80% 到達で stderr 警告を出す。警告が出たら価値の低いエントリから削って予算内に戻す。
118
+
48
119
  ### 1-3. ディレクトリの命名・配置チート
49
120
 
50
121
  各ディレクトリの **命名・役割・配置判断** は `.claude/docs/taxonomy.md` を参照。
@@ -61,7 +132,7 @@ src/c3/migrations/ SQLite schema migration SQL ファイル
61
132
  同じキー(`permissions.allow` など)が複数ファイルで定義されている場合、
62
133
  **上位ファイルが下位ファイルを上書き**する(高 → 低の順):
63
134
 
64
- 1. `.claude/settings.local.json` — 個人 override(`.gitignore` 推奨。c3 update の対象外)
135
+ 1. `.claude/settings.local.json` — 個人 override(`.claude/.gitignore` が自動除外。c3 update の対象外)
65
136
  2. `.claude/settings.json` — プロジェクト共通設定(git 管理)
66
137
  3. `~/.claude/settings.json` — グローバル個人設定(マシンローカル)
67
138
 
@@ -103,10 +174,11 @@ src/c3/migrations/ SQLite schema migration SQL ファイル
103
174
  | `.claude/CLAUDE.md` | ○ | ○ | △(c3 update で上書きされる前提で) |
104
175
  | `.claude/rules/*.md` | ○ | ○ | △(同上) |
105
176
  | `.claude/rules/promoted/index.md` | ○(空雛形のみ) | × | ○(`/promote-pattern` が追記、手動編集も可) |
177
+ | `.claude/.gitignore` | ○ | ×(INIT_ONLY) | ○(追記は `c3 update` で失われない。C3 側の分類更新は手動マージ) |
106
178
 
107
179
  ---
108
180
 
109
- ## 3. 配布判断マトリクス(14 カテゴリ)
181
+ ## 3. 配布判断マトリクス(15 カテゴリ)
110
182
 
111
183
  `_excludes.py` の `EXCLUDE_PATTERNS` / `KEEP_PATTERNS` を実装照合した結果。
112
184
  各カテゴリに配布有無・c3 update の更新有無・理由を明示する。
@@ -117,7 +189,7 @@ src/c3/migrations/ SQLite schema migration SQL ファイル
117
189
  | 2 | `.claude/agents/*.md` | ○ | ○ | ペルソナ定義。配布先で読まれる。例外: `tdd-develop.md` のみ除外(v2.1.0 廃止) |
118
190
  | 3 | `.claude/skills/*/` | ○ | ○ | オーケストレーション/ユーティリティ skill 定義(`scripts/` / `templates/` 等サブディレクトリ含む)。例外: `worktree-tdd-workflow/*` のみ除外(v2.1.0 廃止) |
119
191
  | 4 | `.claude/rules/*.md` | ○ | ○ | C3 配布デフォルトルール(常時注入対象) |
120
- | 5 | `.claude/rules/promoted/*` | ○ | × | プロジェクト固有昇格ルール。配布元の `promoted/index.md` は空雛形のみ配布。利用先で `/promote-pattern` が追記する **ユーザー所有領域**。c3 update が触ると昇格内容が失われる |
192
+ | 5 | `.claude/rules/promoted/*` | ○ | ×(`index.md` は INIT_ONLY) | プロジェクト固有昇格ルール。配布元の `promoted/index.md` は空雛形のみ配布。利用先で `/promote-pattern` が追記する **ユーザー所有領域**。`index.md` は `INIT_ONLY_PATTERNS` で上書きから保護される。昇格ルール本体(`YYYYMMDD-{id}.md`)は template 側に存在しないため `_walk_diff` の走査対象にならず元から無事 |
121
193
  | 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 参照)。 |
122
194
  | 7 | `.claude/CLAUDE.md` | ○ | ○ | 配布先で常時注入される共通ルール |
123
195
  | 8 | `.claude/settings.json` | ○ | ○ | プロジェクト共通設定(hooks 登録・permissions など) |
@@ -127,6 +199,7 @@ src/c3/migrations/ SQLite schema migration SQL ファイル
127
199
  | 12 | `.dev/*` / `/CLAUDE.md` / `/AGENTS.md` / `/.codex/` / `/.cursor/` / `/.agents/` | × | — | 配布元専用または adapter 生成物。wheel には構造的に含まれない(`src/c3/_template/.claude/` 配下のみ同梱)が、配布元 `.gitignore` で commit 混入も防ぐ |
128
200
  | 13 | `.claude/deletions.txt` | ○ | ○ | `c3 update` が読み込み、利用先 `.claude/` から該当ファイルを削除候補として扱う。配布元の `.claude/deletions.txt` に追記したエントリは次回 pip install → `c3 update` で利用先に伝播。`KEEP_PATTERNS` で明示配布。`c3 update` 自体は本ファイルを削除しない(§7 落とし穴 5 参照) |
129
201
  | 14 | `.claude/breaking-changes.txt` | ○ | ○ | `c3 update` が読み込み、利用先の `.claude/state/c3_version.txt`(バージョン checkpoint)と diff を計算して破壊的変更を表示する。MAJOR bump 時は y/N 承認プロンプトを発火。`KEEP_PATTERNS` で明示配布。配布元 `.claude/breaking-changes.txt` を更新すれば次回 pip install → `c3 update` で利用先に伝播。利用先 git 管理は tracked(上書きされる) |
202
+ | 15 | `.claude/.gitignore` | ○ | ×(INIT_ONLY) | 利用先の実行時生成領域のうち「再生成可能」「セッション一時」だけを除外する配布 `.gitignore`(§1-2 の方針の実装)。プロジェクトルートの `.gitignore` は編集しないため既存設定と衝突しない。`INIT_ONLY_PATTERNS` により初回配置のみで **c3 update は上書きしない**(利用先の追記を守る)。C3 側で分類を更新した場合はリリースノートで手動マージを案内する |
130
203
 
131
204
  > **注意 (カテゴリ #6)**: `taxonomy.md` は `_excludes.py` の EXCLUDE 対象だが、`.gitignore` では tracked 状態(GitHub に公開済み)。
132
205
  > **wheel には含まれない**点に注意。gitignore と wheel 配布は別レイヤーであり、
@@ -148,7 +221,7 @@ src/c3/migrations/ SQLite schema migration SQL ファイル
148
221
 
149
222
  > **注意**: `git add -f` の強制オプションを使うと `.gitignore` が無効化されるため、秘匿情報が誤ってコミットされるリスクがある。CI/CD パイプラインでの自動 `add` 設定にも注意すること。
150
223
 
151
- > **注意**: `c3 init` はプロジェクトルートの `.gitignore` を自動編集しない。`settings.local.json` を新規作成する場合は、ユーザー自身が `.gitignore` に `.claude/settings.local.json` を追加すること。
224
+ > **注意**: `c3 init` はプロジェクトルートの `.gitignore` を自動編集しない。代わりに `.claude/.gitignore` を配置し、その中で `settings.local.json` を除外している(v2.58.0〜)。**それ以前に `c3 init` した既存プロジェクトには `.claude/.gitignore` が無い**ため、`c3 update` で配置されるまではユーザー自身がルートの `.gitignore` に `.claude/settings.local.json` を追加すること。
152
225
 
153
226
  ### 原則 2: c3 update は触らない
154
227
 
@@ -203,7 +276,7 @@ C3 の wheel 配布除外パターンは **3 つのファイルに分散して
203
276
 
204
277
  | ファイル | 役割 | 変更が必要な場面 |
205
278
  |---|---|---|
206
- | `.gitignore` | git 追跡から除外(配布元リポジトリの個人作業ファイルを管理外に) | 配布元で新たに除外すべきファイルが増えた時 |
279
+ | `.gitignore` | git 追跡から除外(配布元リポジトリの実行時データ・開発ログを管理外に。利用先の推奨方針は §1-2 の注記を参照) | 配布元で新たに除外すべきファイルが増えた時 |
207
280
  | `src/c3/_excludes.py` | `c3 init` / `c3 update` 時の除外判断(Python 実装) | 配布先への配布/非配布を変更する時 |
208
281
  | `hatch_build.py` | wheel ビルド時の除外判断(`_excludes.py` の重複定義) | `_excludes.py` を変更した時(必ず同期) |
209
282
 
@@ -265,11 +338,26 @@ C3 の wheel 配布除外パターンは **3 つのファイルに分散して
265
338
  または「なぜ promoted/ は更新されないのか」と疑問に思う。
266
339
 
267
340
  **原因**: `.claude/rules/promoted/index.md` は **ユーザー所有領域**。
268
- c3 update が上書きすると利用先で `/promote-pattern` が追記したルールが消失するため、意図的に除外している(§3 カテゴリ #5 参照)。
341
+ c3 update が上書きすると利用先で `/promote-pattern` が追記した目録行が消失するため、
342
+ `_excludes.py` の **`INIT_ONLY_PATTERNS`** で「初回配置のみ・update は触らない」に指定している(§3 カテゴリ #5 参照)。
343
+
344
+ > **経緯(v2.58.0)**: それ以前は「意図的に除外している」と書きながら実装が伴っておらず
345
+ > (`should_skip("rules/promoted/index.md")` は `False`)、実際には `c3 update` の上書き対象だった。
346
+ > 原因は `should_skip` が「wheel 収録 / init 配置 / update 上書き」の 3 つを 1 つの真偽値で兼ねており、
347
+ > 「init では配置するが update では触らない」を表現できなかったこと。`INIT_ONLY_PATTERNS` で
348
+ > 3 番目の軸を分離して解消した。
269
349
 
270
350
  **対処**: `promoted/` への変更は `c3 update` に委ねず、手動または `/promote-pattern` skill で管理する。
271
351
  C3 side で `promoted/` の雛形を更新した場合は、リリースノートで手動マージ手順を案内する。
272
352
 
353
+ **削除経路**: INIT_ONLY ファイルは `_walk_diff` だけでなく `.claude/deletions.txt` 経由の削除からも保護される。
354
+ 配布元が誤って `rules/promoted/index.md` を `deletions.txt` に追記しても、利用先ユーザーが育てた
355
+ 目録行が完全削除されることはない(セーフガード step 13 で弾かれ、warning が出力される)。
356
+
357
+ **意図的廃止の場合**: INIT_ONLY をユーザーの同意のもと廃止したい場合、`deletions.txt` は使えない
358
+ (セーフガード構造上、INIT_ONLY は削除不能に設計)。代わりにリリースノートで「利用先ユーザーが
359
+ 手動で削除するよう案内する」手順を記載する(c3 update では自動削除できない制約を明記)。
360
+
273
361
  ### 落とし穴 4: `deletions.txt` 自身は削除されない・絶対パスは無視される
274
362
 
275
363
  **症状**: `deletions.txt` が利用先に残り続ける / 絶対パスを書いたのに削除されない / `..` 含みパスが効かない。
@@ -285,6 +373,12 @@ C3 side で `promoted/` の雛形を更新した場合は、リリースノー
285
373
  - シンボリックリンク経由のパス
286
374
  - ディレクトリ(ファイルのみサポート)
287
375
  - `\` (バックスラッシュ)を含むパス
376
+ - INIT_ONLY ファイル(`.gitignore` / `rules/promoted/index.md`)。判定は解決済み実体パスに対して
377
+ 成分正規化(各パートに `.lower().rstrip('. ')` 適用)して行われるため、表記ゆれ(二重スラッシュ
378
+ `rules//promoted/`・末尾スラッシュ `rules/promoted/index.md/`・大小違い `RULES/PROMOTED/INDEX.MD` や
379
+ `.GITIGNORE`)でも全 OS で保護される。実在しないファイルに対しても保護が成立する(従来は実体ケース
380
+ 正準化に依存していたが、実体がない場合は `Path.resolve()` はケース正準化を行わないため、全 OS 対応には
381
+ 成分正規化が必須。また Unicode 正規化形の差(macOS の NFD など)は `.lower()` では畳まれないという制限あり)
288
382
 
289
383
  **対処**:
290
384
  - 削除候補に書くパスは「.claude/ からの相対 POSIX パス」のみ(例: `agents/foo.md`)
@@ -36,6 +36,8 @@ DEBUG_ENV = "C3_HOOK_DEBUG"
36
36
  _CONTROL_CHARS_RE = re.compile(r"[\x00-\x1f\x7f-\x9f]")
37
37
 
38
38
 
39
+ # NOTE: 同一ロジックが src/c3/cli_update.py::_validate_deletion_path の step 13 に
40
+ # 複製されている(import 経路がないため)。変更時は両方を揃えること。
39
41
  def norm_component(s: str) -> str:
40
42
  """パス成分を正規化する(ケース非依存化・末尾ドット/スペース除去)。
41
43
 
@@ -34,6 +34,21 @@ MAX_DESCRIPTION_LENGTH = 500
34
34
  DESCRIPTION_WARN_LENGTH = 1000
35
35
  MAX_LAST_MSG = 500
36
36
 
37
+ # サブエージェントの MEMORY.md は、ハーネスが起動時に「先頭 200 行 / 25KB」までしか
38
+ # system prompt へ載せない(公式 sub-agents.md「Enable persistent memory」)。
39
+ # 超過分は読まれないため、過去にユーザーと合意した許容例外が injection window 外へ落ち、
40
+ # 次回起動時にその合意を知らないまま再指摘する(=合意の実効的な巻き戻り)。
41
+ # ハーネスの truncation は「読まれる範囲」の cutoff であって「書く量」の抑制圧力ではないため、
42
+ # 超過後ではなく予算の 80% 到達時点で警告する(超過時点では既に巻き戻りが起きている)。
43
+ AGENT_MEMORY_DIR = os.path.join(_CLAUDE_DIR, 'agent-memory')
44
+ AGENT_MEMORY_LIMIT_BYTES = 25 * 1024
45
+ AGENT_MEMORY_LIMIT_LINES = 200
46
+ AGENT_MEMORY_WARN_RATIO = 0.8
47
+ # 行数カウントのための読み込み上限。サイズ自体は getsize() で正確に取れるため、
48
+ # 全体を read() する必要はない。予算の 2 倍を超えたファイルは(上限を超えた時点で
49
+ # 必ず警告条件を満たすので)行数を下限値として報告する [SR-NEW]。
50
+ AGENT_MEMORY_READ_CAP_BYTES = AGENT_MEMORY_LIMIT_BYTES * 2
51
+
37
52
  # 過去セッションファイルから引き継ぐ - [ ] 行のサニタイズ用パターン。
38
53
  # C0/C1 制御文字 (タブ と通常スペース は保持) と U+2028 / U+2029 を除去する。
39
54
  # 過去ファイルの ## 残タスク はユーザー編集領域のため信頼境界として扱う [SR-V-001]。
@@ -42,6 +57,21 @@ _INHERIT_SANITIZE_RE = re.compile(
42
57
  r'[\x00-\x08\x0b-\x1f\x7f-\x9f' + chr(0x2028) + chr(0x2029) + r']'
43
58
  )
44
59
 
60
+ # stderr へ表示する外部由来の値(agent-memory のディレクトリ名・patterns.json の id 等)の
61
+ # 無害化用。_INHERIT_SANITIZE_RE はセッションファイルの「行単位」処理向けで LF が来ない前提の
62
+ # ため \x0a を残すが、表示経路では改行が入ると「1 件 1 行」の出力契約が崩れ、後続テキストを
63
+ # 独立した警告行に見せかけられる [SR-V-001]。表示用は C0 全域(TAB 含む)・C1 に加え、
64
+ # 双方向制御文字とゼロ幅文字(表示偽装)も除去する。
65
+ _DISPLAY_SANITIZE_RE = re.compile(
66
+ r'[\x00-\x1f\x7f-\x9f'
67
+ + chr(0x200b) + '-' + chr(0x200f)
68
+ + chr(0x2028) + chr(0x2029)
69
+ + chr(0x202a) + '-' + chr(0x202e)
70
+ + chr(0x2066) + '-' + chr(0x2069)
71
+ + chr(0xfeff)
72
+ + r']'
73
+ )
74
+
45
75
  # _append_last_message が処理済みのパスを記録するキャッシュ(重複 read/write 防止)。
46
76
  _last_message_applied_paths: set = set()
47
77
 
@@ -356,7 +386,7 @@ def _warn_oversized_descriptions(patterns: list) -> None:
356
386
  # 制御文字/ANSI 等を除去し MAX_ID_LENGTH で切り詰めて無害化する。
357
387
  if not isinstance(pid, str):
358
388
  pid = str(pid)
359
- pid = _INHERIT_SANITIZE_RE.sub('', pid)[:MAX_ID_LENGTH]
389
+ pid = _DISPLAY_SANITIZE_RE.sub('', pid)[:MAX_ID_LENGTH]
360
390
  print(
361
391
  f'[Stop] patterns.json エントリの description が肥大しています '
362
392
  f'(id={pid}, {len(desc)}字 > {DESCRIPTION_WARN_LENGTH}字)。'
@@ -365,6 +395,55 @@ def _warn_oversized_descriptions(patterns: list) -> None:
365
395
  )
366
396
 
367
397
 
398
+ def _warn_oversized_agent_memory() -> None:
399
+ """agent-memory/*/MEMORY.md が injection 予算の 80% に達していたら stderr 警告する。
400
+
401
+ 削除・切り詰めは行わない(警告のみ・read-only)。1 ファイル 1 行で出力する。
402
+ patterns.json 側の `_warn_oversized_descriptions` と同じ「警告のみ」方針を取る。
403
+ 本関数は例外を出さない防御的実装だが、呼び出し側でも try/except で二重に保護する。
404
+ """
405
+ warn_bytes = int(AGENT_MEMORY_LIMIT_BYTES * AGENT_MEMORY_WARN_RATIO)
406
+ warn_lines = int(AGENT_MEMORY_LIMIT_LINES * AGENT_MEMORY_WARN_RATIO)
407
+ try:
408
+ names = sorted(os.listdir(AGENT_MEMORY_DIR))
409
+ except OSError:
410
+ # 利用先の初回起動時などディレクトリ自体が無い場合は何もしない
411
+ return
412
+
413
+ for name in names:
414
+ path = os.path.join(AGENT_MEMORY_DIR, name, 'MEMORY.md')
415
+ try:
416
+ size = os.path.getsize(path)
417
+ with open(path, 'rb') as f:
418
+ head = f.read(AGENT_MEMORY_READ_CAP_BYTES)
419
+ except OSError:
420
+ # MEMORY.md 未生成のディレクトリ(wt_developer 等)や
421
+ # トップ階層の .gitkeep 等はスキップする
422
+ continue
423
+
424
+ # 末尾改行は行を増やさない(全 agent-memory ファイルが末尾改行ありのため、
425
+ # 単純な count+1 だと通常経路で常に 1 行多く報告してしまう)。
426
+ lines = head.count(b'\n')
427
+ if head and not head.endswith(b'\n'):
428
+ lines += 1
429
+ truncated = size > len(head)
430
+
431
+ if size <= warn_bytes and lines <= warn_lines:
432
+ continue
433
+
434
+ # ディレクトリ名はファイルシステム由来で未検証のため、出力前に制御文字・
435
+ # 表示偽装文字を除去し MAX_ID_LENGTH で切り詰めて無害化する。
436
+ safe = _DISPLAY_SANITIZE_RE.sub('', name)[:MAX_ID_LENGTH]
437
+ line_label = f'{lines}行以上' if truncated else f'{lines}行'
438
+ print(
439
+ f'[Stop] agent-memory/{safe}/MEMORY.md が injection 予算に接近しています '
440
+ f'({size}B / {AGENT_MEMORY_LIMIT_BYTES}B, {line_label} / {AGENT_MEMORY_LIMIT_LINES}行)。'
441
+ f'超えた分は起動時に system prompt へ載らず、蓄積した知見が読まれなくなります。'
442
+ f'価値の低いエントリから削って予算内に戻してください',
443
+ file=sys.stderr,
444
+ )
445
+
446
+
368
447
  def update_patterns(date_str: str) -> None:
369
448
  new_observations = extract_session_patterns(date_str)
370
449
  data = load_patterns()
@@ -467,6 +546,13 @@ def run(payload: dict) -> int:
467
546
  _append_last_message(get_session_path(today_str), last_msg)
468
547
 
469
548
  update_patterns(today_str)
549
+
550
+ # agent-memory の肥大検知(警告のみ)。誤動作しても Stop を止めない。
551
+ try:
552
+ _warn_oversized_agent_memory()
553
+ except Exception:
554
+ pass
555
+
470
556
  return 0
471
557
 
472
558
 
@@ -66,7 +66,7 @@ D-0(実行モード自動判別)は AskUserQuestion を持たないステッ
66
66
  | **B-3** | レポート承認 AskUserQuestion | **要点をテキスト提示して自動で次フェーズへ**(レポートは通常どおり Write・記録も通常どおり) |
67
67
  | **C-1** | マイルストーン要否 | 「設けない」相当で自動進行 |
68
68
  | **C-2** | レポート承認 AskUserQuestion | **要点をテキスト提示して自動で次フェーズへ**(レポートは通常どおり Write・記録も通常どおり) |
69
- | **C-3** | 監査 opt-in+findings 分岐 | design-critic を**必ず起動**し、findings 分岐は原則**「全て対応する」に固定**(「全て許容して進む」を選べるのは **High/Medium が 0 で Low のみが残ったサイクル**に限る=空収束防止)。**High/Medium 0 まで自動ループ(初回上限 5 サイクル、差し戻し後は上限 2 サイクルの別枠)**。Low の残存は収束を妨げない(残存件数を報告する)。severity 記録は通常どおり |
69
+ | **C-3** | 監査 opt-in+findings 分岐 | design-critic を**必ず起動**し、findings 分岐は原則**「全て対応する」に固定**(「全て許容して進む」を選べるのは **High/Medium が 0 で Low のみが残ったサイクル**に限る=空収束防止)。**High/Medium 0 まで自動ループ(初回上限 5 サイクル、差し戻し後は上限 2 サイクルの別枠)**。Low の残存は収束を妨げない(残存件数を報告する)。severity 記録は通常どおり(差し戻し後も design-critic を必ず起動する。上限 2 サイクルの別枠・本表の C-3 行のとおり。転記行 2 種=C-3省略宣言 / C-3監査要求の生成・評価も行わない。理由: 自律は人間の承認の目が無いため機械監査を厚く保つ)。ステップ 0 の転記行の確認は HITL のみ |
70
70
  | **D-2.5** | テスト承認 | **テスト全緑まで自動**(stuck 時は systematic-debugger 経由も自動)。全緑が客観条件 |
71
71
  | **D-3** | テスト承認 | **テスト全緑まで自動**(stuck 時は systematic-debugger 経由も自動)。全緑が客観条件 |
72
72
  | **D-5** | テスト承認 | **テスト全緑まで自動**(stuck 時は systematic-debugger 経由も自動)。全緑が客観条件 |
@@ -86,6 +86,8 @@ D-0(実行モード自動判別)は AskUserQuestion を持たないステッ
86
86
  **High/Medium を許容で流すことは引き続き構造的に禁じる**(空収束防止)。
87
87
  許容という価値判断がこの例外に当てはまらない場合は、従来どおり**人間の関所へエスカレーション**する。
88
88
 
89
+ **dev-workflow C-3 のステップ 0(転記行の確認)は HITL 専用**: dev-workflow SKILL.md の C-3 ステップ 0 で転記行 2 種(C-3省略宣言 / C-3監査要求)を評価するステップと、これらの転記行を生成する C-2 の C-3省略宣言ブロックは HITL 専用。自律モードでは C-3 全体が本表に従い、差し戻し後も design-critic を必ず起動する(上限 2 サイクルの別枠・本表の C-3 行のとおり)。転記行 2 種の生成・評価も行わない。理由: 自律は人間の承認の目が無いため機械監査を厚く保つ。
90
+
89
91
  **収束サイクルに残った Low の扱い**(C-3 のみ):
90
92
 
91
93
  | サイクルの状態 | 分岐 |