claude-code-conductor 2.51.0__tar.gz → 2.52.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 (226) hide show
  1. claude_code_conductor-2.52.0/.claude/docs/nul-boundary.md +232 -0
  2. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/hooks/consolidate_memory.py +4 -4
  3. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/hooks/permission_handler.py +1 -1
  4. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/hooks/planner_check.py +3 -3
  5. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/hooks/recall_inject.py +1 -1
  6. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/hooks/restore_session.py +5 -5
  7. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/hooks/statusline.py +2 -2
  8. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/hooks/stop.py +2 -2
  9. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/dev-workflow/SKILL.md +2 -2
  10. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/dev-workflow/scripts/review_hint_inject.py +2 -2
  11. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/setup/SKILL.md +5 -1
  12. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.gitignore +1 -0
  13. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/CHANGELOG.md +27 -0
  14. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/PKG-INFO +33 -12
  15. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/README.md +32 -11
  16. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/hatch_build.py +1 -0
  17. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/__init__.py +1 -1
  18. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/_excludes.py +1 -0
  19. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/adapters.py +3 -3
  20. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/cli_tier.py +1 -1
  21. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/cli_update.py +1 -1
  22. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/db.py +4 -4
  23. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_adapters.py +8 -2
  24. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_cli_run.py +30 -7
  25. claude_code_conductor-2.52.0/tests/test_nul_boundary_lint.py +873 -0
  26. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/CLAUDE.md +0 -0
  27. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/agents/architect.md +0 -0
  28. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/agents/code-reviewer.md +0 -0
  29. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/agents/design-critic.md +0 -0
  30. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/agents/developer.md +0 -0
  31. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/agents/doc-writer.md +0 -0
  32. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/agents/interviewer.md +0 -0
  33. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/agents/planner.md +0 -0
  34. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/agents/project-setup.md +0 -0
  35. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/agents/security-reviewer.md +0 -0
  36. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/agents/systematic-debugger.md +0 -0
  37. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/agents/tester.md +0 -0
  38. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/agents/wt_developer.md +0 -0
  39. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/agents/wt_systematic-debugger.md +0 -0
  40. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/agents/wt_tester.md +0 -0
  41. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/breaking-changes.txt +0 -0
  42. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/deletions.txt +0 -0
  43. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/docs/config-policy.md +0 -0
  44. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/docs/parallel-agents-setup.md +0 -0
  45. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/docs/platform-adapters.md +0 -0
  46. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/docs/settings.json.md +0 -0
  47. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/hooks/_hook_utils.py +0 -0
  48. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/hooks/check_agent_invocation.py +0 -0
  49. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/hooks/permission_handler_toast.py +0 -0
  50. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/hooks/post_tool.py +0 -0
  51. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/hooks/pre_compact.py +0 -0
  52. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/hooks/pre_tool.py +0 -0
  53. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/hooks/recall_autorebuild.py +0 -0
  54. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/hooks/select_tier.py +0 -0
  55. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/hooks/session_start.py +0 -0
  56. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/hooks/session_stop.py +0 -0
  57. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/hooks/session_utils.py +0 -0
  58. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/hooks/tier_autoapply.py +0 -0
  59. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/hooks/tier_gap_check.py +0 -0
  60. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/hooks/worktree_guard.py +0 -0
  61. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/memory/.gitkeep +0 -0
  62. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/permission_rules.json +0 -0
  63. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/rules/promoted/index.md +0 -0
  64. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/settings.json +0 -0
  65. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/brainstorm/SKILL.md +0 -0
  66. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/codex-review/SKILL.md +0 -0
  67. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/dev-workflow/references/code-review-checklist.md +0 -0
  68. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/dev-workflow/references/design-critic-rubric.md +0 -0
  69. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/dev-workflow/references/design-rubric.md +0 -0
  70. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/dev-workflow/references/interview-rubric.md +0 -0
  71. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/dev-workflow/references/plan-design-guidelines.md +0 -0
  72. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/dev-workflow/references/security-review-checklist.md +0 -0
  73. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/dev-workflow/scripts/record_agent_outcome.py +0 -0
  74. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/dev-workflow/scripts/record_review_decision.py +0 -0
  75. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/develop/SKILL.md +0 -0
  76. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/doc/SKILL.md +0 -0
  77. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/extract-lib/SKILL.md +0 -0
  78. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/init-session/SKILL.md +0 -0
  79. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/init-session/scripts/session_guard.py +0 -0
  80. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/mcp-config/SKILL.md +0 -0
  81. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/parallel-agents/SKILL.md +0 -0
  82. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/pattern-status/SKILL.md +0 -0
  83. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/promote-pattern/SKILL.md +0 -0
  84. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/recall/SKILL.md +0 -0
  85. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/report-timestamp/SKILL.md +0 -0
  86. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/report-timestamp/scripts/get_timestamp.py +0 -0
  87. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/review-phase/SKILL.md +0 -0
  88. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/setup/reference.md +0 -0
  89. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/setup/templates/coding-standards-template.md +0 -0
  90. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/setup/templates/project-conventions-template.md +0 -0
  91. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/start/SKILL.md +0 -0
  92. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/state/.gitkeep +0 -0
  93. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/ARCHITECTURE.md +0 -0
  94. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/LICENSE +0 -0
  95. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/LICENSES/fastembed-LICENSE +0 -0
  96. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/LICENSES/fastembed-NOTICE +0 -0
  97. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/LICENSES/numpy-LICENSE +0 -0
  98. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/LICENSES/onnxruntime-LICENSE +0 -0
  99. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/LICENSES/paraphrase-multilingual-MiniLM-L12-v2-LICENSE +0 -0
  100. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/pyproject.toml +0 -0
  101. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/__main__.py +0 -0
  102. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/_db_params.py +0 -0
  103. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/_terminal.py +0 -0
  104. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/cli.py +0 -0
  105. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/cli_ask.py +0 -0
  106. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/cli_doctor.py +0 -0
  107. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/cli_init.py +0 -0
  108. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/cli_list.py +0 -0
  109. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/cli_metrics.py +0 -0
  110. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/cli_plan.py +0 -0
  111. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/cli_recall.py +0 -0
  112. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/cli_run.py +0 -0
  113. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/embedding.py +0 -0
  114. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/gitutil.py +0 -0
  115. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/mcp_server.py +0 -0
  116. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/migrate.py +0 -0
  117. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/migrations/001_initial.sql +0 -0
  118. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/migrations/002_agent_cost_runs.sql +0 -0
  119. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/migrations/003_tier_cost.sql +0 -0
  120. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/migrations/004_agent_outcomes.sql +0 -0
  121. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/migrations/005_drop_agent_tier_bandit.sql +0 -0
  122. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/migrations/006_review_decisions_severity.sql +0 -0
  123. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/migrations/README.md +0 -0
  124. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/migrations/__init__.py +0 -0
  125. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/paths.py +0 -0
  126. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/plan_validator.py +0 -0
  127. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/platforms.py +0 -0
  128. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/pricing.py +0 -0
  129. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/question.py +0 -0
  130. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/recall_chunker.py +0 -0
  131. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/recall_index.py +0 -0
  132. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/usage_ingester.py +0 -0
  133. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/__init__.py +0 -0
  134. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/_pre_compact_helpers.py +0 -0
  135. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/conftest.py +0 -0
  136. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/fixtures/usage/README.md +0 -0
  137. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/fixtures/usage/mainline.jsonl +0 -0
  138. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/fixtures/usage/subagents/agent-deadbeef.jsonl +0 -0
  139. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/fixtures/usage/subagents/agent-deadbeef.meta.json +0 -0
  140. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/__init__.py +0 -0
  141. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_check_agent_invocation.py +0 -0
  142. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_consolidate_memory.py +0 -0
  143. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_hook_utils.py +0 -0
  144. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_permission_handler.py +0 -0
  145. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_permission_handler_toast.py +0 -0
  146. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_pip_reinstall_reminder.py +0 -0
  147. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_planner_check.py +0 -0
  148. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_planner_check_dev.py +0 -0
  149. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_post_tool.py +0 -0
  150. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_pre_tool.py +0 -0
  151. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_recall_autorebuild.py +0 -0
  152. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_recall_inject.py +0 -0
  153. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_record_agent_outcome.py +0 -0
  154. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_record_review_decision.py +0 -0
  155. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_restore_session.py +0 -0
  156. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_review_hint_inject.py +0 -0
  157. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_select_tier.py +0 -0
  158. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_select_tier_escalation.py +0 -0
  159. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_session_start.py +0 -0
  160. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_session_stop.py +0 -0
  161. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_session_utils.py +0 -0
  162. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_settings_local_absolute_paths.py +0 -0
  163. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_settings_tier_autoapply_registration.py +0 -0
  164. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_similarity_boost.py +0 -0
  165. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_statusline.py +0 -0
  166. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_statusline_template_sync.py +0 -0
  167. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_sync_check.py +0 -0
  168. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_template_guard.py +0 -0
  169. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_tier_autoapply.py +0 -0
  170. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_tier_gap_check.py +0 -0
  171. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_tier_security_fixes.py +0 -0
  172. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/skills/__init__.py +0 -0
  173. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/skills/_skill_helpers.py +0 -0
  174. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/skills/test_dev_workflow_no_task_type.py +0 -0
  175. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/skills/test_init_session_no_task_type.py +0 -0
  176. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/skills/test_parallel_agents_skill_tier.py +0 -0
  177. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/skills/test_planner_lightweight.py +0 -0
  178. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/skills/test_recall_skill.py +0 -0
  179. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/skills/test_session_backlog_reconciliation.py +0 -0
  180. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/skills/test_session_guard.py +0 -0
  181. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/skills/test_setup_templates.py +0 -0
  182. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/skills/test_start_skill_bugfix_flow.py +0 -0
  183. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/skills/test_start_skill_new_flow.py +0 -0
  184. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/skills/test_start_skill_security_audit_phase.py +0 -0
  185. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_check_deletions.py +0 -0
  186. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_cli_ask.py +0 -0
  187. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_cli_doctor.py +0 -0
  188. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_cli_doctor_launcher.py +0 -0
  189. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_cli_entry.py +0 -0
  190. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_cli_init.py +0 -0
  191. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_cli_list.py +0 -0
  192. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_cli_metrics.py +0 -0
  193. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_cli_plan.py +0 -0
  194. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_cli_recall.py +0 -0
  195. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_cli_tier.py +0 -0
  196. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_cli_update_breaking_changes.py +0 -0
  197. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_cli_update_deletions.py +0 -0
  198. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_db.py +0 -0
  199. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_docstring_consistency.py +0 -0
  200. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_embedding.py +0 -0
  201. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_excludes.py +0 -0
  202. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_extract_breaking_changes.py +0 -0
  203. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_gitutil.py +0 -0
  204. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_mcp_server_elicit.py +0 -0
  205. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_migrate.py +0 -0
  206. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_no_bare_python_launcher.py +0 -0
  207. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_paths.py +0 -0
  208. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_plan_validator.py +0 -0
  209. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_pre_compact.py +0 -0
  210. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_pre_tool_hook.py +0 -0
  211. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_precompact_additional.py +0 -0
  212. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_precompact_toctou_fixes.py +0 -0
  213. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_pricing.py +0 -0
  214. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_recall_chunker.py +0 -0
  215. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_recall_index.py +0 -0
  216. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_references_migration.py +0 -0
  217. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_session_utils_additional.py +0 -0
  218. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_skill_no_builtin_conflict.py +0 -0
  219. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_statusline.py +0 -0
  220. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_stop_additional.py +0 -0
  221. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_stop_hook.py +0 -0
  222. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_stop_precompact_fixes.py +0 -0
  223. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_sync_template_stop.py +0 -0
  224. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_template_pre_tool_hook.py +0 -0
  225. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_usage_ingester.py +0 -0
  226. {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_worktree_guard.py +0 -0
@@ -0,0 +1,232 @@
1
+ # NUL 境界 lint — 宣言マーカーの規約
2
+
3
+ このドキュメントは、C3 配布物に含まれるコードから見かける
4
+ `# nul-boundary: allow(<理由>)` マーカーの意味と使い方を説明します。
5
+
6
+ ---
7
+
8
+ ## マーカーの意味
9
+
10
+ ### 標準形
11
+
12
+ ```python
13
+ # nul-boundary: allow(なぜこの join が NUL 区切りでないのか)
14
+ result = "\n".join(items)
15
+ ```
16
+
17
+ **意味**: この `str.join()` 呼び出しが `"\n"` や `", "` などの NUL 以外を区切りにしているのは、
18
+ 意図的かつ妥当である、ということを宣言しています。
19
+
20
+ ### 語彙は 1 種のみ
21
+
22
+ マーカーの形は **`allow(<理由>)` の 1 種だけ**です。
23
+
24
+ - ✅ `allow(人間可読な出力なので改行を維持)` — OK
25
+ - ❌ `human(...)` / `safe(...)` / `fixed(...)` / `legacy(...)` — これらは使いません
26
+
27
+ 理由は、**マーカーは「意図的に NUL ではない」以上のことを主張しない**ためです。
28
+ 真偽を機械が検査できない分類語を足すと、設計と実装が乖離した瞬間に嘘になります。
29
+ 中立な 1 語に統一することで、その穴を消しています。
30
+
31
+ ### 理由は 5 文字以上
32
+
33
+ 理由部分(括弧の中身)は、**`strip()` 後に 5 文字以上**である必要があります。
34
+
35
+ - ✅ `allow(display output)` — 5文字
36
+ - ✅ `allow( 永続ファイルの後方互換性を保つ )` — strip 後で十分
37
+ - ❌ `allow()` / `allow( )` — 理由がない
38
+ - ❌ `allow(ok)` — 2文字では不足
39
+
40
+ この下限は「honor system の最小限」です。一言では説明できない程度の具体性を強制します。
41
+
42
+ ---
43
+
44
+ ## 配置規則
45
+
46
+ マーカーは、対象となる `join` 呼び出しに結び付けられます。その結び付けは以下の順序で行われます。
47
+
48
+ ### 規則 1: 同一行(行末)
49
+
50
+ マーカーが行 `L` にあり、その行に `join` 呼び出しが含まれるなら、そこに結び付きます。
51
+
52
+ ```python
53
+ result = "\n".join(items) # nul-boundary: allow(説明)
54
+ ```
55
+
56
+ これが最優先の配置方法です。
57
+
58
+ ### 規則 2: 直前行
59
+
60
+ マーカーが行 `L` にあり、規則 1 が成立しない場合のみ、
61
+ その「直前行 `L+1`」に `join` があれば結び付きます。
62
+
63
+ ```python
64
+ # nul-boundary: allow(説明)
65
+ result = "\n".join(items)
66
+ ```
67
+
68
+ **重要**: 「直前」は厳密に `L+1` です。間に別の行が 1 行でも挟まると、結び付きません。
69
+
70
+ ```python
71
+ # nul-boundary: allow(説明)
72
+ # このコメント行が間に挟まってしまった
73
+ result = "\n".join(items) # ← この join は宣言で保護されていません
74
+ ```
75
+
76
+ ### 規則 3: 複数対象の場合は無効
77
+
78
+ マーカーが複数の `join` に結び付こうとする場合、**その宣言はどの対象も保護しません** (fail-closed)。
79
+
80
+ ```python
81
+ x = "\n".join(items1)
82
+ y = "\n".join(items2) # nul-boundary: allow(説明)
83
+ # ← 上下両方に結び付く可能性があるため、この宣言は無効
84
+ ```
85
+
86
+ この場合、**両方** の行に宣言を書く必要があります:
87
+
88
+ ```python
89
+ x = "\n".join(items1) # nul-boundary: allow(説明)
90
+ y = "\n".join(items2) # nul-boundary: allow(説明)
91
+ ```
92
+
93
+ ### 特例: f-string 内の `join`
94
+
95
+ f-string 内に `join` がある場合、マーカーを f-string の内側に置くことはできません。
96
+ この場合、**包含する文の どこか**(例えば末尾行の行末)にマーカーを置きます:
97
+
98
+ ```python
99
+ result = (f"header\n"
100
+ f"{items.join(x)}\n"
101
+ f"footer") # nul-boundary: allow(説明)
102
+ ```
103
+
104
+ マーカーの結び付け判定では、f-string 内の `join` の行範囲を「包含する文の行範囲」に置き換えて処理します。
105
+
106
+ ---
107
+
108
+ ## なぜ NUL 境界則があるのか
109
+
110
+ C3 で「同じ穴を 6 回開けた」経験があります:
111
+
112
+ | # | 例 | 内容 |
113
+ |---|---|---|
114
+ | 1 | ポーセレン CLI 出力の処理 | `\n` 結合による境界偽装 |
115
+ | 2 | tracked ブロック | `-z` で NUL 取得したものを `\n` で再結合 |
116
+ | 3 | `format_ignored_manifest` | tracked を NUL 化しても manifest は `\n` のまま |
117
+ | 4 | 設定の指紋化 | 同型の穴が繰り返す |
118
+ | 5 | pytest 設定ハッシュ | 「軽量」な実装が同じ完全性を要求される |
119
+ | 6 | manifest の曖昧区切り | 2 スペース区切り=同型の脅威 |
120
+
121
+ **3 回を超えたら個別に直すのをやめて、ルール化+機械検査化する潮時** という教訓です。
122
+
123
+ 機械可読なデータ(ログ行・ハッシュ入力・パス一覧など)がパイプラインを流れる場合:
124
+
125
+ - **区切りは NUL で切る**(`"\x00"`・1 文字ちょうど)
126
+ - **`\n` は人間可読出力にのみ使う**(表示・ユーザーへのメッセージ)
127
+
128
+ この分離により、外部由来の値に改行が混ざっても、機械可読側は境界を偽装されません。
129
+
130
+ ---
131
+
132
+ ## 既知の限界
133
+
134
+ 以下の 7 項目は機械検査の対象外です。
135
+
136
+ | ID | 限界 | 影響 |
137
+ |---|---|---|
138
+ | L-1 | `+` 演算子による `\n` 連結を検出しない | 例: `a + "\n" + b` |
139
+ | L-2 | f-string / `%` 書式による組み立てを検出しない | 行集合の構築に f-string 使用 |
140
+ | L-3 | `split` 側の非対称を検出しない | NUL で結合し `\n` で分割する場合など |
141
+ | L-4 | **宣言の内容の真偽は検査しない** | `allow(...)` の理由に嘘を書けば通る |
142
+ | L-5 | NUL 区切りの場合、**要素側に NUL が含まれない**ことは検査しない | 外部由来値に NUL が混ぜば偽装は成立 |
143
+ | L-6 | 走査対象は 4 ディレクトリに限る | `.dev/hooks` / `scripts` / `tests` は対象外 |
144
+ | L-7 | **`allow` で `\n` を維持した箇所、要素側に改行が混入しないことは保証しない** | `\n` 区切りを保つ以上、要素に改行が入れば境界偽装は成立 |
145
+
146
+ このうち **L-4** と **L-7** が重要です:
147
+
148
+ ### L-4: 理由の真偽は検査しない
149
+
150
+ 例えば:
151
+
152
+ ```python
153
+ # nul-boundary: allow(後方互換性が要る永続形式なので)
154
+ # → しかし実は一度限りの出力(互換性は不要)
155
+ result = "\n".join(items)
156
+ ```
157
+
158
+ こういった嘘は機械では検出できません。
159
+ **宣言の妥当性は E フェーズのレビューと `git blame` で担保します**。
160
+
161
+ ### L-7: `\n` 維持時の要素側改行
162
+
163
+ `allow` で `\n` 区切りを維持した箇所については、
164
+ 要素(区切られる側)に改行が入らないことは保証しません。
165
+
166
+ 例えば:
167
+
168
+ ```python
169
+ # nul-boundary: allow(状態ファイルなので人間可読性のため \n を維持)
170
+ lines = log_entries # ← このリスト要素が実は複数行テキストなら?
171
+ result = "\n".join(lines)
172
+ ```
173
+
174
+ 要素側での改行混入を防ぐのは呼び出し元の責務です。
175
+
176
+ ---
177
+
178
+ ## 理由文の書き方
179
+
180
+ 理由には「**なぜ NUL にできない/する必要がないか**」を具体的に書きます。
181
+ 書式は**自由記述**(ラベルの種別分けは不要)です。
182
+
183
+ ### よい例
184
+
185
+ - `allow(人間が直接編集するファイルなので改行ベース)` — 用途が明確
186
+ - `allow(永続形式で過去バージョンとの互換性が必須)` — 制約の根拠がある
187
+ - `allow(正規表現の `\n` 境界に依存した処理が下流にある)` — 外部制約を示唆
188
+ - `allow(status/commit メッセージは`git`が改行で期待するため)` — 標準仕様に依存
189
+
190
+ ### 避けるべき書き方
191
+
192
+ - `allow(human)` — 理由でなく分類語(機械検査できない)
193
+ - `allow(safe)` — 同上
194
+ - `allow(ok)` — 説明が短すぎる
195
+
196
+ ---
197
+
198
+ ## 検査は配布元でのみ
199
+
200
+ この `nul-boundary` 検査(`tests/test_nul_boundary_lint.py`)は、
201
+ C3 の配布元リポジトリでのみ実行されます。
202
+
203
+ C3 を配布先で `pip install c3-***.whl` でインストールしたユーザーは:
204
+
205
+ - マーカー `# nul-boundary: allow(...)` は、コード内のコメントとして見えます
206
+ - **検査ツール自体は wheel に含まれません** (`tests/` は配布対象外)
207
+
208
+ ユーザーが C3 をカスタマイズして新しい `join` を追加した場合:
209
+
210
+ 1. このドキュメントを参考にして、**マーカーの配置規則に従って**宣言を書いてください
211
+ 2. **理由は 5 文字以上、具体的に書いてください**
212
+ 3. 配布元へ PR を送る際は、配布元の CI で `tests/test_nul_boundary_lint.py` が走り、
213
+ テスト出力で確認できます
214
+
215
+ ---
216
+
217
+ ## 参照・関連
218
+
219
+ - **実装・リレビューの必須チェック**: `.claude/skills/autonomous-mode/SKILL.md` §(a)
220
+ - **auto-memory**: `feedback_nul_boundary_for_machine_readable_line_sets` — 一般則の背景と根拠
221
+ - **計画**: `plan-report-*.md` §5 T4 — 文書作成の指示と成功条件
222
+
223
+ ---
224
+
225
+ ## 配布物への含有確認
226
+
227
+ **3 ファイル同期の判断記録**(CLAUDE.md §2):
228
+
229
+ `.gitignore` / `src/c3/_excludes.py` / `hatch_build.py` **の変更は不要**。
230
+
231
+ 理由: `src/c3/_excludes.py:33` は `docs/*` の一括除外を持たず、個別列挙のみ(`decisions.md` など明示的に除外対象の文書を明記)。
232
+ 本ドキュメント `docs/nul-boundary.md` は除外リストに載らないため、既定で `wheel` に含まれます。
@@ -205,7 +205,7 @@ def build_summary_markdown(
205
205
  lines.append("_該当エントリなし_")
206
206
  lines.append("")
207
207
 
208
- return "\n".join(lines).rstrip() + "\n"
208
+ return "\n".join(lines).rstrip() + "\n" # nul-boundary: allow(Markdown 文書の行組み立て。行そのものが文書構造で split 対象ではない)
209
209
 
210
210
 
211
211
  def write_summary(
@@ -361,7 +361,7 @@ def build_promotion_candidates_section(
361
361
  lines.append(f"_候補数: 0 / 最終確認: {today_str}_")
362
362
  lines.append("")
363
363
  lines.append("_該当エントリなし_")
364
- return "\n".join(lines), candidates
364
+ return "\n".join(lines), candidates # nul-boundary: allow(consolidated_summary.md の昇格候補セクション本文。人間が読む Markdown で機械パースしない)
365
365
 
366
366
  lines.append(
367
367
  f"_候補数: {len(candidates)} / 最終確認: {today_str} / "
@@ -376,7 +376,7 @@ def build_promotion_candidates_section(
376
376
  except (TypeError, ValueError):
377
377
  trust_str = "?"
378
378
  lines.append(f"- `{cid}` (trust {trust_str})")
379
- return "\n".join(lines), candidates
379
+ return "\n".join(lines), candidates # nul-boundary: allow(consolidated_summary.md の昇格候補一覧本文。人間が読む Markdown で機械パースしない)
380
380
 
381
381
 
382
382
  def _extract_candidate_fields(c: dict) -> dict:
@@ -479,7 +479,7 @@ def write_promotion_candidates_log(
479
479
  lines.append(f"- {safe_desc}")
480
480
  lines.append("")
481
481
 
482
- payload = "\n".join(lines).rstrip() + "\n"
482
+ payload = "\n".join(lines).rstrip() + "\n" # nul-boundary: allow(promotion-candidates.md の昇格候補一覧本文。人間が読む Markdown で機械パースしない・"毎回上書き"のため後方互換制約はない)
483
483
  return _atomic_write(output_path, payload)
484
484
 
485
485
 
@@ -106,7 +106,7 @@ def _glob_to_regex(pattern: str) -> str:
106
106
  # ** を一時プレースホルダーに退避してから * と ** を別々に処理する
107
107
  parts = pattern.split('**')
108
108
  escaped = [re.escape(p).replace(r'\*', '[^/]*') for p in parts]
109
- return '.*'.join(escaped)
109
+ return '.*'.join(escaped) # nul-boundary: allow(glob を正規表現へ変換する組み立て。区切り .* は正規表現の文法で固定)
110
110
 
111
111
 
112
112
  def _match_file_path(raw: str, p_arg: str) -> bool:
@@ -198,7 +198,7 @@ def _check_r4_writes_conflicts(tasks: list) -> list[str]:
198
198
  if _all_pairs_transitively_ordered(claim_ids, ancestors):
199
199
  continue
200
200
  # claim_ids は task id の生 join のため、特殊文字を repr で逃がして安全に出力する
201
- joined = ", ".join(repr(cid) for cid in sorted(claim_ids))
201
+ joined = ", ".join(repr(cid) for cid in sorted(claim_ids)) # nul-boundary: allow(stderr へ出す人間可読な警告文に埋め込む列挙。機械可読な行集合ではない)
202
202
  violations.append(
203
203
  f"R4: writes {path!r} を複数 task ({joined}) "
204
204
  "が宣言していますが depends_on で順序付けされていません。"
@@ -272,7 +272,7 @@ def main() -> None:
272
272
  if warnings:
273
273
  # 検出されたルール名(R2/R4/R6)を抽出してデバッグログに記録
274
274
  detected_rules = sorted({m.split(":")[0] for m in warnings if ":" in m})
275
- write_debug_log(DEBUG_LOG_PATH, f"{basename} WARN {','.join(detected_rules)}")
275
+ write_debug_log(DEBUG_LOG_PATH, f"{basename} WARN {','.join(detected_rules)}") # nul-boundary: allow(デバッグログ 1 行に載せる検出ルール名の列挙。人間が読む log で再パースしない)
276
276
  # 経路1: stderr に人間向けメッセージ(ターミナル表示用)
277
277
  print("[PlannerCheck WARN] plan-report の検査で違反を検出しました:",
278
278
  file=sys.stderr)
@@ -285,7 +285,7 @@ def main() -> None:
285
285
  # LLM のコンテキストウィンドウに挿入する(公式仕様)
286
286
  additional_context = (
287
287
  "[PlannerCheck WARN] plan-report の検査で違反を検出しました:\n"
288
- + "\n".join(f" - {msg}" for msg in sanitized_warnings)
288
+ + "\n".join(f" - {msg}" for msg in sanitized_warnings) # nul-boundary: allow(LLM へ注入する人間可読メッセージ本文。表示専用で行集合として再パースしない)
289
289
  + "\n\n"
290
290
  + "ルールの詳細は .claude/skills/dev-workflow/references/plan-design-guidelines.md を参照。"
291
291
  + "意図的に許容する場合はユーザーに確認を取ること。"
@@ -147,7 +147,7 @@ def format_additional_context(hits: Iterable[dict], *, stale: bool = False) -> s
147
147
  lines.append(f" [{i}] score={score_str} {path} :: {label}")
148
148
  if snippet:
149
149
  lines.append(f" {snippet}")
150
- return "\n".join(lines)
150
+ return "\n".join(lines) # nul-boundary: allow(LLM コンテキストへ注入する人間可読テキスト。表示専用で再パースしない)
151
151
 
152
152
 
153
153
  def find_repo_root() -> Path | None:
@@ -101,7 +101,7 @@ def _tail(text: str, n: int) -> str:
101
101
  仕様として明記・固定する。
102
102
  """
103
103
  lines = text.splitlines()
104
- return '\n'.join(lines[-n:]) if len(lines) > n else text
104
+ return '\n'.join(lines[-n:]) if len(lines) > n else text # nul-boundary: allow(末尾 N 行を人間可読テキストへ戻す。呼び出し元は表示のため再 splitlines するだけ)
105
105
 
106
106
 
107
107
  def _sanitize_genba(value: str) -> str:
@@ -175,23 +175,23 @@ def main():
175
175
  # ③残タスク(- [ ] 行のみ・0件ならセクション省略)
176
176
  if pending_todos:
177
177
  lines.append('\n## 残タスク')
178
- lines.append('\n'.join(pending_todos))
178
+ lines.append('\n'.join(pending_todos)) # nul-boundary: allow(stdout へ出す復元メッセージの残タスク段落。表示専用)
179
179
 
180
180
  # ④うまくいったアプローチ(末尾 N 行に切り詰め・行単位でサニタイズ)(SR M-2)
181
181
  if successes:
182
182
  lines.append('\n## うまくいったアプローチ')
183
183
  tail_text = _tail(successes, APPROACH_TAIL_LINES)
184
184
  sanitized_lines = [_sanitize(line) for line in tail_text.splitlines()]
185
- lines.append('\n'.join(sanitized_lines))
185
+ lines.append('\n'.join(sanitized_lines)) # nul-boundary: allow(stdout へ出す復元メッセージの成功アプローチ段落。表示専用)
186
186
 
187
187
  # ⑤試みたが失敗したアプローチ(末尾 N 行に切り詰め・行単位でサニタイズ)(SR M-2)
188
188
  if failures:
189
189
  lines.append('\n## 試みたが失敗したアプローチ')
190
190
  tail_text = _tail(failures, APPROACH_TAIL_LINES)
191
191
  sanitized_lines = [_sanitize(line) for line in tail_text.splitlines()]
192
- lines.append('\n'.join(sanitized_lines))
192
+ lines.append('\n'.join(sanitized_lines)) # nul-boundary: allow(stdout へ出す復元メッセージの失敗アプローチ段落。表示専用)
193
193
 
194
- print('\n'.join(lines))
194
+ print('\n'.join(lines)) # nul-boundary: allow(stdout へ出力する復元メッセージ全体。読み手は Claude Code の表示でリポジトリ内に split 側がない)
195
195
 
196
196
 
197
197
  if __name__ == '__main__':
@@ -127,9 +127,9 @@ def render_output(raw: str) -> None:
127
127
 
128
128
  output_parts: list[str] = []
129
129
  if header:
130
- output_parts.append(' '.join(header))
130
+ output_parts.append(' '.join(header)) # nul-boundary: allow(ステータスライン先頭部の表示文字列。読み手は Claude Code の表示でリポジトリ内に split 側がない)
131
131
  output_parts.extend(metrics)
132
- sys.stdout.write(' | '.join(output_parts) + '\n')
132
+ sys.stdout.write(' | '.join(output_parts) + '\n') # nul-boundary: allow(ステータスライン 1 行の区切り表示。区切り文字が表示書式そのもの)
133
133
  sys.stdout.flush()
134
134
 
135
135
 
@@ -113,7 +113,7 @@ def _inherit_backlog_from_latest_session(
113
113
  except OSError:
114
114
  return
115
115
 
116
- inheritance_block = '\n'.join(pending_tasks) + '\n'
116
+ inheritance_block = '\n'.join(pending_tasks) + '\n' # nul-boundary: allow(セッション .tmp の残タスクセクションへ書く行。利用先に旧形式が既に存在する永続形式で後方互換が要る)
117
117
  updated = new_content.replace(
118
118
  '## 残タスク\n',
119
119
  f'## 残タスク\n{inheritance_block}',
@@ -180,7 +180,7 @@ def _apply_session_updates(path: str, content: str, message: str = '') -> None:
180
180
  # 古い応答は積極的に上書きしてよい。古い `not in updated` ガードは「最初の応答が
181
181
  # 一日中残る」問題を引き起こしていた。
182
182
  if message:
183
- single_line = ' '.join(message.split())
183
+ single_line = ' '.join(message.split()) # nul-boundary: allow(最終応答を単一行へ平坦化する空白正規化。そもそも行集合ではない)
184
184
  # サロゲート文字など UTF-8 非互換文字を除去(JSON デコード時に生成される場合がある)
185
185
  single_line = single_line.encode('utf-8', errors='replace').decode('utf-8')
186
186
  truncated = single_line[:MAX_LAST_MSG]
@@ -30,8 +30,8 @@ user-invocable: false
30
30
  session.tmp の `モード:` 行を確認する。**有効な自律宣言**(§3-3)でなければ**以下の各ゲートを
31
31
  記載どおり AskUserQuestion で実行する(従来動作)**。有効な自律宣言のときのみ、
32
32
  `.claude/skills/autonomous-mode/SKILL.md` の「ゲート対応表」に従って承認ゲートを客観収束条件に
33
- 付け替える。**非可逆操作の関所・情報不足の質問・重量フェーズ着手前の usage 確認は常に人間**
34
- (自律でも停止して確認する=人間の 3 関所・§4-1 / requirements §7)。
33
+ 付け替える。**非可逆操作の関所・情報不足の質問の 2 類型は常に人間**(自律でも停止して確認する)。なお
34
+ `autonomous-mode` skill は配布元限定のため配布物には含まれず、**利用先では自律宣言は常に無効**=HITL で動作する。
35
35
 
36
36
  > **skill 未 Read でも『モード行を見て skill を Read せよ』の 1 段で復帰できる** — develop / review-phase を「直接開始」した場合(init-session を経ない起動)、autonomous-mode skill の明示 Read が挟まらない可能性がある。ただし本ブロックが
37
37
  > 各ゲートで `モード:` 行の確認を要求するため、skill 未 Read でも「モード行を見て skill を Read せよ」
@@ -162,7 +162,7 @@ def build_hint_section(
162
162
  summary_parts.append(f"許容 {accepted}")
163
163
  if deferred:
164
164
  summary_parts.append(f"保留 {deferred}")
165
- lines.append(f"- 過去 {total} 件: " + " / ".join(summary_parts))
165
+ lines.append(f"- 過去 {total} 件: " + " / ".join(summary_parts)) # nul-boundary: allow(人間可読なサマリ表示の断片。機械可読な行集合ではない)
166
166
 
167
167
  # 直近の判断
168
168
  latest = rows[0]
@@ -185,7 +185,7 @@ def build_hint_section(
185
185
  lines.append(f"- `{cid}` は code-reviewer と security-reviewer の両方で指摘されています")
186
186
  lines.append("")
187
187
 
188
- return "\n".join(lines).rstrip() + "\n"
188
+ return "\n".join(lines).rstrip() + "\n" # nul-boundary: allow(レポート末尾へ追記する Markdown 本文。文書形式で再パースしない)
189
189
 
190
190
 
191
191
  def append_hints_to_report(
@@ -1,6 +1,5 @@
1
1
  ---
2
2
  description: 技術スタックと独自規約をヒアリングして project-setup エージェントに coding-standards.md と project-conventions.md を生成させる。プロジェクト開始時に使用する。
3
- disable-model-invocation: true
4
3
  ---
5
4
 
6
5
  # setup
@@ -8,6 +7,11 @@ disable-model-invocation: true
8
7
  プロジェクトのコーディング規約を設定する。
9
8
  ヒアリングは親 Claude が担当し、収集後に project-setup エージェントを起動する。
10
9
 
10
+ > **起動経路の制約**: 本 skill の起動は (a) ユーザーの `/setup` 明示呼び出し、
11
+ > (b) `init-session` ガード G-2 が `SETUP_NEEDED` を検出した際のチェーン起動、の 2 経路のみ。
12
+ > それ以外の場面で LLM の判断により自発的に起動してはならない
13
+ > (frontmatter で model invocation を禁止しない理由は G-2 チェーン起動を許可するため。v2.38.0 設計)。
14
+
11
15
  ---
12
16
 
13
17
  ## Phase 1: 技術スタックのヒアリング(親 Claude が実施)
@@ -64,6 +64,7 @@ site/
64
64
  .claude/docs/grill-me機能を実装する際の考慮点とC3との相性や超えるべき壁.md
65
65
  .claude/docs/C3のconfig_policyとversion_upgradeの考慮点と超えるべき壁.md
66
66
  .claude/docs/model_settings.md
67
+ .claude/docs/環境条件別c3の問題点.md
67
68
 
68
69
  # codex 対応調査メモ (個人作業ノート、配布・コミット対象外)
69
70
  .claude/docs/codex対応/
@@ -1,5 +1,32 @@
1
1
  # Changelog
2
2
 
3
+ ## [2.52.0] - 2026-07-23
4
+
5
+ ### 追加
6
+
7
+ - **NUL 境界原則の機械検査を追加**: `tests/test_nul_boundary_lint.py` を新設し、AST で `str.join` の呼び出しを全件検出したうえで、宣言マーカー `# nul-boundary: allow(<理由>)`(`tokenize.COMMENT` 限定・理由 5 文字以上)が付いていない使用を違反として検出する。外部由来文字列による境界偽装(改行結合した行集合を機械パースする箇所で発生しうる)を、レビューの目視ではなくテストで恒久的に塞ぐ
8
+ - **`.claude/docs/nul-boundary.md` を新設(配布対象)**: 「機械可読な行集合の区切りは NUL・改行は人間可読出力のみ」という NUL 境界原則と、`allow` 宣言の書式・判断基準をまとめた規約文書
9
+
10
+ ### 変更
11
+
12
+ - **配布 hook 8 本・`src/c3` 4 本の `join` 使用箇所に `allow` 宣言コメントを追記**(追跡対象 29 件)。`consolidate_memory.py` / `permission_handler.py` / `planner_check.py` / `recall_inject.py` / `restore_session.py` / `statusline.py` / `stop.py` / `dev-workflow/scripts/review_hint_inject.py`、`adapters.py` / `cli_tier.py` / `cli_update.py` / `db.py` が対象。**いずれもコメント追記のみでロジック変更はなく、原則に照らした是正が必要な箇所は 0 件だった**(既存の join は全て人間可読出力向けと確認)
13
+ - **dev-workflow の「運転モードによるゲート挙動の切替」ブロックの記述を更新**: 自律モード時にも常に人間が判断する関所を「非可逆操作・情報不足の質問・重量フェーズ着手前の usage 確認」の 3 類型から、**「非可逆操作・情報不足の質問」の 2 類型**へ縮退した。あわせて、`autonomous-mode` skill は配布元限定で配布物に含まれないこと・**利用先では自律宣言が常に無効(= HITL で動作)** であることを本文に明記した(配布元での自律モード規約改訂に伴う、配布物側の記述整合)
14
+
15
+ ### 後方互換
16
+
17
+ - **破壊的変更なし**。`autonomous-mode` skill は wheel 非収録で利用先には存在せず、自律モードそのものを起動できない。今回の dev-workflow の変更は「有効な自律宣言があるときの説明文」に閉じており、既定の HITL 動作(各ゲートを AskUserQuestion で実行)は無変更のため、利用先の実挙動は変わらない
18
+ - NUL 境界 lint は配布物に対する追加検査であり、既存 hook / CLI の動作は不変(コメント追記のみ)
19
+
20
+ ## [2.51.1] - 2026-07-22
21
+
22
+ ### 修正
23
+
24
+ - **setup skill が Skill ツール(AI)から起動できず、init-session の自動チェーン(G-2)が機能しない defect を修正**: `setup/SKILL.md` の frontmatter `disable-model-invocation: true`(2026-05-03 の commands→skills 移行時に付与)が、v2.38.0 で導入した /start→/init-session→/setup 自動チェーン設計と矛盾していた。利用先の初回導入(`SETUP_NEEDED` 検出時)でチェーン起動がブロックされ、手動での `/setup` 実行を強いられていた(利用先プロジェクトで実地確認)。frontmatter からフラグを削除し、代わりに本文へ起動経路の制約(ユーザーの `/setup` 明示呼び出し・init-session G-2 チェーンの 2 経路のみ。それ以外の自発起動は禁止)を明記した
25
+
26
+ ### 後方互換
27
+
28
+ - 既存利用先への影響なし。setup 実施済みプロジェクト(`setup_done.flag` あり)では G-2 が発火しないため挙動不変。破壊的変更なし
29
+
3
30
  ## [2.51.0] - 2026-07-18
4
31
 
5
32
  ### 追加
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: claude-code-conductor
3
- Version: 2.51.0
3
+ Version: 2.52.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
@@ -66,14 +66,16 @@ Claude Code Conductor(C3)は「親 Claude が複数の専門エージェン
66
66
  ユーザー
67
67
  ↓ /start, /develop, /review-phase, /doc, /mcp-config, /extract-lib ...
68
68
  親 Claude(オーケストレーター)
69
- ├─ interviewer ← ヒアリング
70
- ├─ architect ← 設計
71
- ├─ planner ← タスク計画
72
- ├─ developer ← 実装
73
- ├─ tester ← テスト
74
- ├─ code-reviewer ← コードレビュー
75
- ├─ security-reviewer ← セキュリティレビュー
76
- └─ doc-writer ← ドキュメント生成
69
+ ├─ interviewer ← ヒアリング
70
+ ├─ architect ← 設計
71
+ ├─ planner ← タスク計画
72
+ ├─ design-critic ← 設計・計画の監査
73
+ ├─ developer ← 実装
74
+ ├─ tester ← テスト
75
+ ├─ code-reviewer ← コードレビュー
76
+ ├─ security-reviewer ← セキュリティレビュー
77
+ ├─ systematic-debugger ← デバッグ調査
78
+ └─ doc-writer ← ドキュメント生成
77
79
  ```
78
80
 
79
81
  各エージェントは明確なスコープを持ち、担当外の作業は行いません。
@@ -149,7 +151,7 @@ C3 では「どのファイルをどこに置くべきか」の定義が設計
149
151
  フェーズ B: 設計 architecture-report を生成
150
152
  ↓ 承認
151
153
  フェーズ C: 計画 plan-report を生成
152
- ↓ 承認(自動遷移)
154
+ ↓ 承認(任意で design-critic が設計・計画を監査 → design-review-report)
153
155
  フェーズ D: TDD tester → developer → tester のサイクル
154
156
  ↓ 承認(自動遷移)
155
157
  フェーズ E: レビュー code-reviewer → security-reviewer
@@ -176,6 +178,7 @@ C3 のスラッシュコマンドはすべてスキル(`skills/{name}/SKILL.md
176
178
  | `/develop` | TDD フェーズから直接開始 |
177
179
  | `/review-phase` | レビューフェーズから直接開始(code-reviewer + security-reviewer) |
178
180
  | `/promote-pattern` | 蓄積されたパターンを rules/ または skills/ に昇格 |
181
+ | `/pattern-status` | patterns.json の現状(信用度・昇格候補・期限残・既昇格)を表形式で可視化(読み取り専用) |
179
182
 
180
183
  ### ユーティリティ
181
184
 
@@ -186,17 +189,27 @@ C3 のスラッシュコマンドはすべてスキル(`skills/{name}/SKILL.md
186
189
  | `/extract-lib` | 複数プロジェクトのコードを横断解析し、共通処理をライブラリとして設計・生成 |
187
190
  | `/recall` | 過去のセッション・レポート・パターンから類似情報を意味検索(numpy ベクトル検索 + 多言語 embedding) |
188
191
  | `/brainstorm` | 仕事・設計の相談を、資料(PDF/画像)を読み込んだ上で気軽に発散・壁打ち。視点・選択肢・論点を増やす方向(grill=詰めるとは逆)(v2.29.0〜) |
192
+ | `/codex-review` | Codex CLI に `.codex/agents/` の定義を読み込ませ、code-reviewer / security-reviewer ペルソナでレビューを並走実行(Codex adapter セットアップ済み環境のみ・レポート契約は C3 と共通) |
193
+
194
+ ### 内部参照スキル(`/start` などから自動呼び出し)
195
+
196
+ | スキル | 役割 |
197
+ |---|---|
198
+ | `dev-workflow` | 5 フェーズのワークフロー本体 |
199
+ | `parallel-agents` | plan-report の wave 単位で親 Claude の Agent ツール並列起動 + isolation:worktree |
200
+ | `report-timestamp` | レポートファイル名のタイムスタンプ取得 |
189
201
 
190
202
  ### ターミナルで使う `c3` CLI(PyPI インストール時)
191
203
 
192
204
  | コマンド | 役割 |
193
205
  |---|---|
194
206
  | `c3 init` | 利用先プロジェクトに `.claude/` を展開する |
195
- | `c3 init --platform codex|cursor|opencode|all` | `.claude/` を canonical source にしたまま Codex/Cursor/OpenCode adapter を追加 |
207
+ | `c3 init --platform codex\|cursor\|opencode\|all` | `.claude/` を canonical source にしたまま Codex/Cursor/OpenCode adapter を追加 |
196
208
  | `c3 update` | `.claude/` をパッケージ最新版へ更新する(個人ファイルはスキップ) |
197
209
  | `c3 list-agents` / `list-skills` | 設置済みアセットを一覧表示 |
198
210
  | `c3 doctor` | 環境診断(`.claude/`・settings.json・claude バイナリ・adapter 生成物) |
199
211
  | `c3 ask` | Claude Code 以外で `AskUserQuestion` 互換の単一選択・複数選択を実行 |
212
+ | `c3 run <script.py>` / `c3 run -m <module>` / `c3 run -c <code>` | 配布物の Python スクリプトを OS 共通の起動口で実行(v2.51.0〜)。`.claude/` の hooks・skills スクリプトは無印 `python` ではなくこの経由で起動する(interpreter 探索・絶対パスの settings.json 混入を排除) |
200
213
  | `c3 plan validate <plan-report>` | plan-report の YAML フロントマターと agent 存在を検証 |
201
214
  | `c3 plan waves <plan-report>` | plan-report の wave 分解結果を JSON で出力 |
202
215
  | `c3 recall search "<query>"` または `c3 recall "<query>"` | `.claude/memory/sessions/` 等から類似チャンクを意味検索 |
@@ -230,15 +243,20 @@ C3 のスラッシュコマンドはすべてスキル(`skills/{name}/SKILL.md
230
243
  | interviewer | sonnet | requirements-report | 親 Claude がペルソナ採用 |
231
244
  | architect | opus | architecture-report | 親 Claude がペルソナ採用 |
232
245
  | planner | opus | plan-report | 親 Claude がペルソナ採用 |
246
+ | design-critic | opus | design-review-report | Agent ツールで起動(フェーズ C 承認後の任意監査) |
233
247
  | developer | sonnet | 実装コード | Agent ツールで起動 |
234
248
  | tester | sonnet | テスト・test-report | Agent ツールで起動 |
235
249
  | code-reviewer | sonnet | code-review-report | Agent ツールで起動 |
236
250
  | security-reviewer | sonnet | security-review-report | Agent ツールで起動 |
237
- | doc-writer | sonnet | ドキュメント各種 | Agent ツールで起動 |
251
+ | doc-writer | opus | ドキュメント各種 | Agent ツールで起動 |
238
252
  | systematic-debugger | sonnet | debug-analysis-report | Agent ツールで起動(行き詰まり時)|
253
+ | project-setup | opus | rules/ 規約ファイル | Agent ツールで起動(`/setup` 時)|
254
+ | wt_developer / wt_tester / wt_systematic-debugger | sonnet | task_id ベースのレポート | parallel-agents skill が isolation:worktree 付きで起動 |
239
255
 
240
256
  インタラクティブな対話が必要なエージェント(interviewer・architect・planner)は親 Claude がペルソナを採用して動作します。実装・検証系エージェントはサブエージェントとして起動されます。
241
257
 
258
+ > **model 列は既定値です。** developer / wt_developer は tier-routing(タスク複雑度に応じた Haiku/Sonnet/Opus の自動選択・Thompson Sampling)の hook が起動時に model を自動適用するため、実際の使用 model は複雑度と学習データに応じて変わります。
259
+
242
260
  ---
243
261
 
244
262
  ## 既存プロジェクトへの導入
@@ -358,8 +376,11 @@ Copy-Item -Recurse claude-code-conductor\.claude your-project\
358
376
  requirements-report-YYYYMMDD-HHMMSS.md
359
377
  architecture-report-YYYYMMDD-HHMMSS.md
360
378
  plan-report-YYYYMMDD-HHMMSS.md
379
+ design-review-report-YYYYMMDD-HHMMSS.md
380
+ test-report-YYYYMMDD-HHMMSS.md
361
381
  code-review-report-YYYYMMDD-HHMMSS.md
362
382
  security-review-report-YYYYMMDD-HHMMSS.md
383
+ debug-analysis-report-YYYYMMDD-HHMMSS.md
363
384
  archive/ ← /start 実行時に古いレポートをここに移動
364
385
  ```
365
386