claude-code-conductor 2.31.0__tar.gz → 2.32.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 (202) hide show
  1. claude_code_conductor-2.32.0/.claude/hooks/recall_autorebuild.py +437 -0
  2. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/settings.json +6 -0
  3. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/skills/dev-workflow/references/design-rubric.md +1 -0
  4. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/skills/dev-workflow/references/interview-rubric.md +1 -0
  5. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/CHANGELOG.md +25 -0
  6. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/PKG-INFO +1 -1
  7. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/src/c3/__init__.py +1 -1
  8. claude_code_conductor-2.32.0/tests/hooks/test_recall_autorebuild.py +1278 -0
  9. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/CLAUDE.md +0 -0
  10. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/agents/architect.md +0 -0
  11. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/agents/code-reviewer.md +0 -0
  12. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/agents/developer.md +0 -0
  13. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/agents/doc-writer.md +0 -0
  14. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/agents/interviewer.md +0 -0
  15. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/agents/planner.md +0 -0
  16. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/agents/project-setup.md +0 -0
  17. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/agents/security-reviewer.md +0 -0
  18. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/agents/systematic-debugger.md +0 -0
  19. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/agents/tester.md +0 -0
  20. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/agents/wt_developer.md +0 -0
  21. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/agents/wt_systematic-debugger.md +0 -0
  22. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/agents/wt_tester.md +0 -0
  23. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/breaking-changes.txt +0 -0
  24. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/deletions.txt +0 -0
  25. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/docs/config-policy.md +0 -0
  26. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/docs/parallel-agents-setup.md +0 -0
  27. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/docs/platform-adapters.md +0 -0
  28. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/docs/settings.json.md +0 -0
  29. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/hooks/_hook_utils.py +0 -0
  30. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/hooks/check_agent_invocation.py +0 -0
  31. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/hooks/consolidate_memory.py +0 -0
  32. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/hooks/permission_handler.py +0 -0
  33. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/hooks/permission_handler_toast.py +0 -0
  34. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/hooks/planner_check.py +0 -0
  35. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/hooks/post_tool.py +0 -0
  36. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/hooks/pre_compact.py +0 -0
  37. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/hooks/pre_tool.py +0 -0
  38. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/hooks/recall_inject.py +0 -0
  39. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/hooks/restore_session.py +0 -0
  40. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/hooks/select_tier.py +0 -0
  41. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/hooks/session_start.py +0 -0
  42. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/hooks/session_stop.py +0 -0
  43. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/hooks/session_utils.py +0 -0
  44. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/hooks/statusline.py +0 -0
  45. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/hooks/stop.py +0 -0
  46. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/hooks/worktree_guard.py +0 -0
  47. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/memory/.gitkeep +0 -0
  48. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/permission_rules.json +0 -0
  49. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/rules/promoted/index.md +0 -0
  50. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/skills/brainstorm/SKILL.md +0 -0
  51. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/skills/codex-review/SKILL.md +0 -0
  52. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/skills/dev-workflow/SKILL.md +0 -0
  53. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/skills/dev-workflow/references/code-review-checklist.md +0 -0
  54. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/skills/dev-workflow/references/plan-design-guidelines.md +0 -0
  55. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/skills/dev-workflow/references/security-review-checklist.md +0 -0
  56. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/skills/dev-workflow/scripts/record_review_decision.py +0 -0
  57. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/skills/dev-workflow/scripts/record_tier_outcome.py +0 -0
  58. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/skills/dev-workflow/scripts/review_hint_inject.py +0 -0
  59. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/skills/develop/SKILL.md +0 -0
  60. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/skills/doc/SKILL.md +0 -0
  61. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/skills/extract-lib/SKILL.md +0 -0
  62. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/skills/init-session/SKILL.md +0 -0
  63. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/skills/mcp-config/SKILL.md +0 -0
  64. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/skills/parallel-agents/SKILL.md +0 -0
  65. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/skills/pattern-status/SKILL.md +0 -0
  66. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/skills/promote-pattern/SKILL.md +0 -0
  67. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/skills/recall/SKILL.md +0 -0
  68. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/skills/report-timestamp/SKILL.md +0 -0
  69. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/skills/report-timestamp/scripts/get_timestamp.py +0 -0
  70. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/skills/review-phase/SKILL.md +0 -0
  71. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/skills/setup/SKILL.md +0 -0
  72. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/skills/setup/reference.md +0 -0
  73. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/skills/setup/templates/coding-standards-template.md +0 -0
  74. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/skills/setup/templates/project-conventions-template.md +0 -0
  75. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/skills/start/SKILL.md +0 -0
  76. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.claude/state/.gitkeep +0 -0
  77. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/.gitignore +0 -0
  78. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/ARCHITECTURE.md +0 -0
  79. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/LICENSE +0 -0
  80. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/LICENSES/chroma-hnswlib-LICENSE +0 -0
  81. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/LICENSES/chroma-hnswlib-NOTICE +0 -0
  82. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/LICENSES/fastembed-LICENSE +0 -0
  83. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/LICENSES/fastembed-NOTICE +0 -0
  84. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/LICENSES/onnxruntime-LICENSE +0 -0
  85. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/LICENSES/paraphrase-multilingual-MiniLM-L12-v2-LICENSE +0 -0
  86. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/README.md +0 -0
  87. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/hatch_build.py +0 -0
  88. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/pyproject.toml +0 -0
  89. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/src/c3/__main__.py +0 -0
  90. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/src/c3/_db_params.py +0 -0
  91. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/src/c3/_excludes.py +0 -0
  92. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/src/c3/_terminal.py +0 -0
  93. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/src/c3/adapters.py +0 -0
  94. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/src/c3/cli.py +0 -0
  95. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/src/c3/cli_ask.py +0 -0
  96. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/src/c3/cli_doctor.py +0 -0
  97. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/src/c3/cli_init.py +0 -0
  98. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/src/c3/cli_list.py +0 -0
  99. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/src/c3/cli_plan.py +0 -0
  100. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/src/c3/cli_recall.py +0 -0
  101. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/src/c3/cli_tier.py +0 -0
  102. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/src/c3/cli_update.py +0 -0
  103. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/src/c3/db.py +0 -0
  104. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/src/c3/embedding.py +0 -0
  105. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/src/c3/mcp_server.py +0 -0
  106. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/src/c3/migrate.py +0 -0
  107. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/src/c3/migrations/001_initial.sql +0 -0
  108. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/src/c3/migrations/002_agent_cost_runs.sql +0 -0
  109. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/src/c3/migrations/003_tier_cost.sql +0 -0
  110. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/src/c3/migrations/README.md +0 -0
  111. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/src/c3/migrations/__init__.py +0 -0
  112. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/src/c3/paths.py +0 -0
  113. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/src/c3/plan_validator.py +0 -0
  114. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/src/c3/platforms.py +0 -0
  115. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/src/c3/pricing.py +0 -0
  116. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/src/c3/question.py +0 -0
  117. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/src/c3/recall_chunker.py +0 -0
  118. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/src/c3/recall_index.py +0 -0
  119. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/src/c3/usage_ingester.py +0 -0
  120. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/__init__.py +0 -0
  121. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/conftest.py +0 -0
  122. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/fixtures/usage/README.md +0 -0
  123. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/fixtures/usage/mainline.jsonl +0 -0
  124. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/fixtures/usage/subagents/agent-deadbeef.jsonl +0 -0
  125. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/fixtures/usage/subagents/agent-deadbeef.meta.json +0 -0
  126. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/hooks/__init__.py +0 -0
  127. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/hooks/test_check_agent_invocation.py +0 -0
  128. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/hooks/test_consolidate_memory.py +0 -0
  129. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/hooks/test_hook_utils.py +0 -0
  130. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/hooks/test_permission_handler.py +0 -0
  131. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/hooks/test_permission_handler_toast.py +0 -0
  132. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/hooks/test_pip_reinstall_reminder.py +0 -0
  133. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/hooks/test_planner_check.py +0 -0
  134. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/hooks/test_planner_check_dev.py +0 -0
  135. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/hooks/test_post_tool.py +0 -0
  136. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/hooks/test_pre_tool.py +0 -0
  137. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/hooks/test_recall_inject.py +0 -0
  138. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/hooks/test_record_review_decision.py +0 -0
  139. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/hooks/test_record_tier_outcome.py +0 -0
  140. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/hooks/test_restore_session.py +0 -0
  141. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/hooks/test_review_hint_inject.py +0 -0
  142. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/hooks/test_select_tier.py +0 -0
  143. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/hooks/test_select_tier_escalation.py +0 -0
  144. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/hooks/test_session_start.py +0 -0
  145. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/hooks/test_session_stop.py +0 -0
  146. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/hooks/test_session_utils.py +0 -0
  147. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/hooks/test_settings_local_absolute_paths.py +0 -0
  148. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/hooks/test_similarity_boost.py +0 -0
  149. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/hooks/test_statusline.py +0 -0
  150. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/hooks/test_statusline_template_sync.py +0 -0
  151. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/hooks/test_sync_check.py +0 -0
  152. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/hooks/test_template_guard.py +0 -0
  153. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/skills/__init__.py +0 -0
  154. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/skills/_skill_helpers.py +0 -0
  155. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/skills/test_dev_workflow_no_task_type.py +0 -0
  156. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/skills/test_init_session_no_task_type.py +0 -0
  157. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/skills/test_planner_lightweight.py +0 -0
  158. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/skills/test_recall_skill.py +0 -0
  159. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/skills/test_session_backlog_reconciliation.py +0 -0
  160. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/skills/test_setup_templates.py +0 -0
  161. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/skills/test_start_skill_bugfix_flow.py +0 -0
  162. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/skills/test_start_skill_new_flow.py +0 -0
  163. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/skills/test_start_skill_security_audit_phase.py +0 -0
  164. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/test_adapters.py +0 -0
  165. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/test_check_deletions.py +0 -0
  166. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/test_cli_ask.py +0 -0
  167. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/test_cli_doctor.py +0 -0
  168. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/test_cli_entry.py +0 -0
  169. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/test_cli_init.py +0 -0
  170. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/test_cli_list.py +0 -0
  171. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/test_cli_plan.py +0 -0
  172. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/test_cli_recall.py +0 -0
  173. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/test_cli_tier.py +0 -0
  174. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/test_cli_update_breaking_changes.py +0 -0
  175. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/test_cli_update_deletions.py +0 -0
  176. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/test_db.py +0 -0
  177. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/test_docstring_consistency.py +0 -0
  178. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/test_embedding.py +0 -0
  179. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/test_excludes.py +0 -0
  180. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/test_extract_breaking_changes.py +0 -0
  181. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/test_mcp_server_elicit.py +0 -0
  182. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/test_migrate.py +0 -0
  183. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/test_paths.py +0 -0
  184. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/test_plan_validator.py +0 -0
  185. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/test_pre_compact.py +0 -0
  186. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/test_pre_tool_hook.py +0 -0
  187. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/test_precompact_additional.py +0 -0
  188. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/test_precompact_toctou_fixes.py +0 -0
  189. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/test_pricing.py +0 -0
  190. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/test_recall_chunker.py +0 -0
  191. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/test_recall_index.py +0 -0
  192. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/test_references_migration.py +0 -0
  193. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/test_session_utils_additional.py +0 -0
  194. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/test_skill_no_builtin_conflict.py +0 -0
  195. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/test_statusline.py +0 -0
  196. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/test_stop_additional.py +0 -0
  197. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/test_stop_hook.py +0 -0
  198. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/test_stop_precompact_fixes.py +0 -0
  199. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/test_sync_template_stop.py +0 -0
  200. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/test_template_pre_tool_hook.py +0 -0
  201. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/test_usage_ingester.py +0 -0
  202. {claude_code_conductor-2.31.0 → claude_code_conductor-2.32.0}/tests/test_worktree_guard.py +0 -0
@@ -0,0 +1,437 @@
1
+ #!/usr/bin/env python3
2
+ """Stop hook: automatically rebuild the recall index when it is stale.
3
+
4
+ Mode 1 (default / Stop hook):
5
+ Checks if the recall index exists and is stale, then spawns this same
6
+ script as a detached background worker (Mode 2) and exits immediately
7
+ (exit 0, no blocking).
8
+
9
+ Mode 2 (--rebuild-worker):
10
+ Invoked by Mode 1. Runs ``c3 recall rebuild --target <repo_root>``
11
+ via subprocess, then releases the lock in a finally block.
12
+
13
+ The hook never outputs ``{"decision": "block"}`` and never blocks the
14
+ Claude turn from completing (ADR-5).
15
+ """
16
+
17
+ from __future__ import annotations
18
+
19
+ import json
20
+ import os
21
+ import subprocess
22
+ import sys
23
+ import time
24
+ from pathlib import Path
25
+
26
+ # CLAUDE.md §9-3: reconfigure stdout/stderr to UTF-8 on Windows.
27
+ try:
28
+ if sys.stdout and hasattr(sys.stdout, "reconfigure"):
29
+ sys.stdout.reconfigure(encoding="utf-8")
30
+ if sys.stderr and hasattr(sys.stderr, "reconfigure"):
31
+ sys.stderr.reconfigure(encoding="utf-8")
32
+ except AttributeError:
33
+ pass
34
+
35
+ # ---------------------------------------------------------------------------
36
+ # Constants
37
+ # ---------------------------------------------------------------------------
38
+
39
+ _DISABLE_ENV_VAR = "C3_RECALL_AUTOREBUILD_DISABLE"
40
+
41
+ # Lock TTL in seconds. rebuild normally finishes in tens of seconds;
42
+ # 600 s gives a generous safety margin (ADR-3).
43
+ _LOCK_TTL = 600
44
+
45
+ # Worker subprocess timeout (seconds).
46
+ # Intentionally equal to _LOCK_TTL: the lock becomes reclaimable as stale
47
+ # immediately after the worker timeout fires, preventing a stuck lock state.
48
+ _WORKER_TIMEOUT = 600
49
+
50
+ # Stale source globs — keep in sync with recall_inject._STALE_SOURCE_GLOBS.
51
+ # CR-L-02: these must mirror c3.recall_index.collect_sources source kinds.
52
+ _STALE_SOURCE_GLOBS = (
53
+ (Path(".claude") / "memory" / "sessions", "*.tmp"),
54
+ (Path(".claude") / "agent-memory", "*.md"),
55
+ (Path(".claude") / "reports" / "archive", "*.md"),
56
+ )
57
+ _STALE_PATTERNS_JSON = Path(".claude") / "memory" / "patterns.json"
58
+
59
+
60
+ # ---------------------------------------------------------------------------
61
+ # Pure helper functions (testable without side effects)
62
+ # ---------------------------------------------------------------------------
63
+
64
+
65
+ def find_repo_root() -> Path | None:
66
+ """Return the directory containing ``.claude/``, or None.
67
+
68
+ When CLAUDE_PROJECT_DIR is set, only that exact directory is checked
69
+ (no ancestor traversal). This prevents false positives when running
70
+ inside a temp directory whose parent happens to contain ``.claude``.
71
+
72
+ When CLAUDE_PROJECT_DIR is not set, searches from cwd upward.
73
+
74
+ Note: this intentionally differs from ``recall_inject.find_repo_root``.
75
+ ``recall_inject`` always walks upward from cwd regardless of
76
+ CLAUDE_PROJECT_DIR; this hook skips ancestor traversal when the env var
77
+ is set to avoid false positives in hook context (temp-dir invocations).
78
+ Cross-reference: .claude/hooks/recall_inject.py ``find_repo_root``.
79
+ """
80
+ env_dir = os.getenv("CLAUDE_PROJECT_DIR")
81
+ if env_dir:
82
+ try:
83
+ candidate = Path(env_dir).resolve()
84
+ except (OSError, ValueError):
85
+ # L-04 [SR-V-001]: null バイト等の不正パスで resolve() が ValueError を投げる場合
86
+ # 例外を伝播させず None を返す(ADR-6)。
87
+ return None
88
+ if (candidate / ".claude").is_dir():
89
+ return candidate
90
+ return None
91
+ # No env override: walk upward from cwd.
92
+ here = Path.cwd().resolve()
93
+ for candidate in [here, *here.parents]:
94
+ if (candidate / ".claude").is_dir():
95
+ return candidate
96
+ return None
97
+
98
+
99
+ def index_exists(repo_root: Path) -> bool:
100
+ """Return True if the recall HNSW index file exists.
101
+
102
+ Only ``recall.hnsw`` is checked — not ``recall_meta.json`` — because
103
+ this hook's purpose is to trigger a rebuild when the index is stale.
104
+ If the binary index is present (even without a metadata sidecar),
105
+ the stale check in ``index_is_stale_fast`` is meaningful and we should
106
+ proceed. ``recall_inject`` checks both files because it needs a valid
107
+ meta to run a search; we do not run a search here.
108
+ """
109
+ index = repo_root / ".claude" / "state" / "recall.hnsw"
110
+ return index.exists()
111
+
112
+
113
+ def index_is_stale_fast(repo_root: Path) -> bool:
114
+ """Return True if any recall source file is newer than the index.
115
+
116
+ Uses only stat() calls — never reads file contents — to stay fast
117
+ enough for every-Stop invocation (ADR-1).
118
+
119
+ Stale source globs are kept in sync with recall_inject._STALE_SOURCE_GLOBS
120
+ (CR-L-02: mirror c3.recall_index.collect_sources when adding/removing
121
+ source kinds).
122
+
123
+ Symlinks are skipped to avoid reading mtime of files outside the
124
+ C3 source tree.
125
+ """
126
+ index_path = repo_root / ".claude" / "state" / "recall.hnsw"
127
+ if not index_path.exists():
128
+ # Defensive guard for independent callers: main() already checks
129
+ # index_exists() before calling this function, but callers outside
130
+ # main() benefit from this early return rather than silently
131
+ # returning False with no indication of the missing index.
132
+ return False
133
+ try:
134
+ index_mtime = index_path.stat().st_mtime
135
+ except OSError:
136
+ return False
137
+
138
+ for rel_dir, pattern in _STALE_SOURCE_GLOBS:
139
+ absolute = repo_root / rel_dir
140
+ if not absolute.is_dir():
141
+ continue
142
+ for path in absolute.rglob(pattern):
143
+ # Skip symlinks (Cycle2-L-1 guard), non-files, and .gitkeep
144
+ # (parity with recall_inject.index_is_stale: .gitkeep files are
145
+ # placeholder markers, not actual recall source content).
146
+ if path.is_symlink() or not path.is_file() or path.name == ".gitkeep":
147
+ continue
148
+ try:
149
+ if path.stat().st_mtime > index_mtime:
150
+ return True
151
+ except OSError:
152
+ continue
153
+
154
+ patterns_path = repo_root / _STALE_PATTERNS_JSON
155
+ if patterns_path.is_file() and not patterns_path.is_symlink():
156
+ try:
157
+ if patterns_path.stat().st_mtime > index_mtime:
158
+ return True
159
+ except OSError:
160
+ pass
161
+
162
+ return False
163
+
164
+
165
+ def is_worktree(repo_root: Path) -> bool:
166
+ """Return True if repo_root is a git worktree (i.e. .git is a file).
167
+
168
+ In a normal repository, .git is a directory.
169
+ In a git worktree, .git is a file containing a ``gitdir:`` pointer.
170
+ We skip rebuild in worktrees to avoid spurious multi-index rebuilds
171
+ during parallel-agents runs (ADR-4).
172
+ """
173
+ dot_git = repo_root / ".git"
174
+ return dot_git.is_file()
175
+
176
+
177
+ def _lock_path_for(repo_root: Path) -> Path:
178
+ """Return the canonical lock file path for the given repo root."""
179
+ return repo_root / ".claude" / "state" / "recall_rebuild.lock"
180
+
181
+
182
+ def acquire_lock(lock_path: Path, ttl: int, now: float | None = None) -> Path | None:
183
+ """Attempt to acquire the rebuild lock atomically.
184
+
185
+ Uses os.open(O_CREAT|O_EXCL) for cross-platform atomic creation.
186
+
187
+ - If the lock does not exist: create it and return a truthy token.
188
+ - If the lock exists and mtime + ttl > now (fresh): return None (failed).
189
+ - If the lock exists and mtime + ttl <= now (stale): remove it,
190
+ then create a new lock and return a truthy token (ADR-3).
191
+
192
+ TOCTOU note: between the stale-lock deletion and the O_EXCL creation,
193
+ another process may race to create the lock first. In that case
194
+ ``os.open`` raises ``FileExistsError`` and this function returns ``None``.
195
+ Returning ``None`` here is correct and expected behaviour — the other
196
+ process won the race and will perform the rebuild.
197
+
198
+ ``now`` is injectable for deterministic testing.
199
+ """
200
+ if now is None:
201
+ now = time.time()
202
+
203
+ # Check for existing lock.
204
+ if lock_path.exists():
205
+ try:
206
+ mtime = lock_path.stat().st_mtime
207
+ except OSError:
208
+ mtime = 0.0
209
+ if mtime + ttl > now:
210
+ # Fresh lock held by another process — refuse acquisition.
211
+ return None
212
+ # Stale lock — remove and fall through to create a new one.
213
+ try:
214
+ lock_path.unlink()
215
+ except OSError:
216
+ pass
217
+
218
+ # Atomic create via O_CREAT|O_EXCL.
219
+ # L-01 [SR-NEW]: 0o600 を明示してロックファイルを所有者のみ読み書き可能に制限する。
220
+ # Windows は mode 引数を無視するが、指定しても無害。
221
+ try:
222
+ fd = os.open(
223
+ str(lock_path),
224
+ os.O_CREAT | os.O_EXCL | os.O_WRONLY,
225
+ 0o600,
226
+ )
227
+ except FileExistsError:
228
+ # Another process won the race.
229
+ return None
230
+ except OSError:
231
+ return None
232
+
233
+ try:
234
+ content = json.dumps({"pid": os.getpid(), "started": now}).encode()
235
+ os.write(fd, content)
236
+ finally:
237
+ os.close(fd)
238
+
239
+ return lock_path # Truthy token.
240
+
241
+
242
+ def release_lock(lock_path: Path) -> None:
243
+ """Remove the lock file. Safe to call even if the file does not exist."""
244
+ try:
245
+ lock_path.unlink()
246
+ except FileNotFoundError:
247
+ pass
248
+ except OSError:
249
+ pass
250
+
251
+
252
+ def build_worker_argv(self_path: Path, repo_root: Path) -> list[str]:
253
+ """Return the argv list to launch this script as a rebuild worker.
254
+
255
+ The resulting command is:
256
+ python <self_path> --rebuild-worker --target <repo_root>
257
+ """
258
+ return [
259
+ sys.executable,
260
+ str(self_path),
261
+ "--rebuild-worker",
262
+ "--target",
263
+ str(repo_root),
264
+ ]
265
+
266
+
267
+ def spawn_detached(repo_root: Path) -> None:
268
+ """Launch this script in worker mode as a detached background process.
269
+
270
+ Platform specifics (ADR-2):
271
+ - Windows: DETACHED_PROCESS | CREATE_NEW_PROCESS_GROUP | CREATE_NO_WINDOW
272
+ - POSIX: start_new_session=True
273
+ - Common: close_fds=True, stdin/stdout/stderr=DEVNULL
274
+ """
275
+ self_path = Path(__file__).resolve()
276
+ argv = build_worker_argv(self_path, repo_root)
277
+ devnull = subprocess.DEVNULL
278
+
279
+ # L-02 [SR-K-003]: ANTHROPIC_/CLAUDE_/OPENAI_ プレフィックスの変数を除外した最小 env を構成する。
280
+ # Note: CLAUDE_PROJECT_DIR も CLAUDE_ プレフィックスで除外されるが、worker は
281
+ # --target 引数で repo_root を受け取るため CLAUDE_PROJECT_DIR 除外の影響を受けない。
282
+ _EXCLUDED_PREFIXES = ("ANTHROPIC_", "CLAUDE_", "OPENAI_")
283
+ env = {
284
+ k: v
285
+ for k, v in os.environ.items()
286
+ if not any(k.upper().startswith(p) for p in _EXCLUDED_PREFIXES)
287
+ }
288
+
289
+ kwargs: dict = {
290
+ "close_fds": True,
291
+ "stdin": devnull,
292
+ "stdout": devnull,
293
+ "stderr": devnull,
294
+ "env": env,
295
+ }
296
+ if sys.platform == "win32":
297
+ kwargs["creationflags"] = (
298
+ subprocess.DETACHED_PROCESS
299
+ | subprocess.CREATE_NEW_PROCESS_GROUP
300
+ | subprocess.CREATE_NO_WINDOW
301
+ )
302
+ else:
303
+ kwargs["start_new_session"] = True
304
+
305
+ subprocess.Popen(argv, **kwargs)
306
+
307
+
308
+ def run_rebuild_worker(repo_root: Path) -> None:
309
+ """Mode 2: run ``c3 recall rebuild --target <repo_root>`` synchronously.
310
+
311
+ Releases the lock in a finally block regardless of success or failure
312
+ (ADR-3).
313
+ """
314
+ # M-01 [SR-V-002]: --target パスの .claude/ 存在を検証し、なければ rebuild しない。
315
+ # 不正なターゲット(シンボリックアタック等)による意図しない rebuild を防止する。
316
+ if not (repo_root / ".claude").is_dir():
317
+ return
318
+
319
+ # L-03 [SR-R-004]: C3_RECALL_AUTOREBUILD_DEBUG=1 のとき子プロセスの stderr を親に継承させる。
320
+ # None を渡すと subprocess.run のデフォルト(親 stderr 継承)になる。
321
+ debug = os.environ.get("C3_RECALL_AUTOREBUILD_DEBUG") == "1"
322
+ stderr_target = None if debug else subprocess.DEVNULL
323
+
324
+ # Windows: 孫プロセス(c3 recall rebuild = console app の python.exe)が
325
+ # 新しいコンソールウィンドウを確保して一瞬表示されるのを防ぐ。worker 自身は
326
+ # DETACHED_PROCESS でコンソールを持たないため、明示しないと孫が新規確保する。
327
+ run_kwargs: dict = {
328
+ "stdin": subprocess.DEVNULL,
329
+ "stdout": subprocess.DEVNULL,
330
+ "stderr": stderr_target,
331
+ "timeout": _WORKER_TIMEOUT,
332
+ }
333
+ if sys.platform == "win32":
334
+ run_kwargs["creationflags"] = subprocess.CREATE_NO_WINDOW
335
+
336
+ lock_path = _lock_path_for(repo_root)
337
+ try:
338
+ subprocess.run(
339
+ [
340
+ sys.executable,
341
+ "-m",
342
+ "c3.cli",
343
+ "recall",
344
+ "rebuild",
345
+ "--target",
346
+ str(repo_root),
347
+ ],
348
+ **run_kwargs,
349
+ )
350
+ except Exception as e:
351
+ sys.stderr.write(f"[recall_autorebuild] worker error: {type(e).__name__}\n")
352
+ finally:
353
+ release_lock(lock_path)
354
+
355
+
356
+ # ---------------------------------------------------------------------------
357
+ # Main entry point
358
+ # ---------------------------------------------------------------------------
359
+
360
+
361
+ def main() -> int:
362
+ """Stop hook entry point. Always returns 0 (never blocks Claude turn).
363
+
364
+ Flow (ADR-5, ADR-6):
365
+ 1. Check disable env var.
366
+ 2. Read Stop payload from stdin (errors are swallowed).
367
+ 3. Resolve repo root; skip if unknown.
368
+ 4. Skip if inside a git worktree (ADR-4).
369
+ 5. Skip if recall index does not exist.
370
+ 6. Skip if index is not stale (ADR-1).
371
+ 7. Acquire rebuild lock (skip on contention / ADR-3).
372
+ 8. Spawn worker; release lock on spawn failure.
373
+ """
374
+ # 1. Disable env var.
375
+ if os.environ.get(_DISABLE_ENV_VAR) == "1":
376
+ return 0
377
+
378
+ # 2. Read stdin (Stop payload). Errors are harmless — we don't use
379
+ # the payload for anything meaningful here, just consume it.
380
+ try:
381
+ sys.stdin.read()
382
+ except Exception:
383
+ pass
384
+
385
+ try:
386
+ # 3. Repo root.
387
+ repo_root = find_repo_root()
388
+ if repo_root is None:
389
+ return 0
390
+
391
+ # 4. Worktree guard.
392
+ if is_worktree(repo_root):
393
+ return 0
394
+
395
+ # 5. Index existence.
396
+ if not index_exists(repo_root):
397
+ return 0
398
+
399
+ # 6. Stale check (stat only — ADR-1).
400
+ if not index_is_stale_fast(repo_root):
401
+ return 0
402
+
403
+ # 7. Acquire lock.
404
+ lock_path = _lock_path_for(repo_root)
405
+ token = acquire_lock(lock_path, _LOCK_TTL)
406
+ if token is None:
407
+ return 0
408
+
409
+ # 8. Spawn detached worker.
410
+ try:
411
+ spawn_detached(repo_root)
412
+ except Exception:
413
+ release_lock(lock_path)
414
+
415
+ except Exception:
416
+ pass
417
+
418
+ return 0
419
+
420
+
421
+ # ---------------------------------------------------------------------------
422
+ # Worker mode dispatch
423
+ # ---------------------------------------------------------------------------
424
+
425
+ if __name__ == "__main__":
426
+ if "--rebuild-worker" in sys.argv:
427
+ # Mode 2: resolve --target and run rebuild worker.
428
+ try:
429
+ idx = sys.argv.index("--target")
430
+ repo_root = Path(sys.argv[idx + 1]).resolve()
431
+ except (ValueError, IndexError):
432
+ sys.exit(0)
433
+ run_rebuild_worker(repo_root)
434
+ sys.exit(0)
435
+ else:
436
+ # Mode 1: Stop hook.
437
+ sys.exit(main())
@@ -7,6 +7,7 @@
7
7
  "Bash(python .claude/hooks/restore_session.py*)",
8
8
  "Bash(python .claude/hooks/permission_handler.py*)",
9
9
  "Bash(python .claude/hooks/statusline.py*)",
10
+ "Bash(python .claude/hooks/recall_autorebuild.py*)",
10
11
  "Bash(python .claude/skills/dev-workflow/scripts/review_hint_inject.py*)",
11
12
  "Bash(python .claude/skills/dev-workflow/scripts/record_review_decision.py*)",
12
13
  "Bash(python .claude/skills/dev-workflow/scripts/record_tier_outcome.py*)",
@@ -214,6 +215,11 @@
214
215
  "type": "command",
215
216
  "command": "python",
216
217
  "args": ["${CLAUDE_PROJECT_DIR}/.claude/hooks/session_stop.py"]
218
+ },
219
+ {
220
+ "type": "command",
221
+ "command": "python",
222
+ "args": ["${CLAUDE_PROJECT_DIR}/.claude/hooks/recall_autorebuild.py"]
217
223
  }
218
224
  ]
219
225
  }
@@ -29,6 +29,7 @@ architect は interviewer と異なり**構造化(選択肢付き)**で確
29
29
 
30
30
  `requirements-report`(コンテキスト内になければ Glob で最新を Read)と既存コード(Glob / Grep)を読み、
31
31
  床 4 観点を「判明 / 未判明」でマークする。要件から自明に決まる設計判断は再質問しない。
32
+ ユーザーが設計関連の資料(PDF / 画像 / 既存ドキュメント等)を提示している場合は Read で読み込み、観点の判明マークに反映する(ユーザーに事前執筆は求めない)。
32
33
 
33
34
  ### Step 2: 技術スタック制約を起点に動的確認
34
35
 
@@ -33,6 +33,7 @@
33
33
  ヒアリングを始める前に、**会話コンテキスト**と**既存 `requirements-report`**(あれば Glob で最新を Read)を読み、
34
34
  床 5 観点それぞれを「判明 / 未判明」でマークする。
35
35
 
36
+ - **ユーザーが資料(PDF / 画像 / 既存の要件定義書・ドキュメント等)を提示している場合は Read で読み込み**、その内容からも観点を判明マークする(資料ドリブンの壁打ち。ユーザーに指示書の事前執筆は求めず、既に持っている資料を土台に未知だけを動的に掘る)。
36
37
  - **判明済みの観点は再質問しない**(ユーザーが既に話した内容を聞き返さない)。
37
38
  - 判明が部分的なら「未判明(部分)」とし、不足部分だけを後続で確認する。
38
39
 
@@ -1,5 +1,30 @@
1
1
  # Changelog
2
2
 
3
+ ## [2.32.0] - 2026-06-07
4
+
5
+ **recall 索引の自動リビルドを配布物に追加(機能追加・破壊的変更なし)**: 配布元で試作・運用していた Stop hook `recall_autorebuild.py` を配布物(`.claude/hooks/`)へ昇格し、全利用先で**既定有効**にした。セッション終了(Stop)ごとに recall 索引(`.claude/state/recall.hnsw`)が stale かを stat のみで軽量判定し、stale なら `c3 recall rebuild` を detached background プロセスで起動して索引を自動で新鮮化する。LLM 非関与の決定論的 CLI を呼ぶだけなので、過去に `llm_summary.md`(summarize-memory)廃止の真因となった LLM 出力汚染・Stop 自己再トリガーループは原理的に発生しない。
6
+
7
+ ### 追加
8
+
9
+ - **`.claude/hooks/recall_autorebuild.py`(新規・配布 hook)**: Stop hook。Mode1=判定して detached spawn、Mode2(`--rebuild-worker`)=`python -m c3.cli recall rebuild --target <root>` を実行しロックを finally で解放。多重ガード: 索引未構築なら no-op(`index_exists`)/stale でなければ skip/git worktree では skip(parallel-agents 中の多重リビルド回避)/ロック(`O_CREAT|O_EXCL` + TTL 600s・stale 回収)で多重起動防止/常に exit 0(Claude のターンをブロックしない・`decision:block` を出さない)/spawn 子 env から `ANTHROPIC_`/`CLAUDE_`/`OPENAI_` を除外/Windows は `CREATE_NO_WINDOW`/3 OS 対応。`C3_RECALL_AUTOREBUILD_DISABLE=1` で無効化、`C3_RECALL_AUTOREBUILD_DEBUG=1` で worker stderr 継承。
10
+ - **`.claude/settings.json` の Stop に登録**(`session_stop.py` と並列)し、`Bash(python .claude/hooks/recall_autorebuild.py*)` を allow に追加。
11
+
12
+ ### 後方互換
13
+
14
+ - 追加 hook のみで公開 API・CLI・DB スキーマ・他 hook に変更なし。recall 索引を構築していない利用先では `index_exists` で no-op となり無影響。既定有効だが `C3_RECALL_AUTOREBUILD_DISABLE=1` でオプトアウト可能。**破壊的変更なし**・migration 不要。
15
+
16
+ ## [2.31.1] - 2026-06-06
17
+
18
+ **ドキュメント PATCH(コード変更・破壊的変更・migration なし)**: v2.31.0 で導入した動的ヒアリング/設計ルーブリックの Step 1(既知情報の取り込み)に、**資料ドリブンの壁打ち**を明文化した。ユーザーが提示した資料(PDF / 画像 / 既存の要件定義書・ドキュメント等)を Read で読み込み、床観点の判明マークに反映する。ユーザーに指示書の事前執筆を求めず、既に持っている資料を土台に未知だけを動的に掘る方針。
19
+
20
+ ### ドキュメント
21
+
22
+ - `.claude/skills/dev-workflow/references/interview-rubric.md` / `design-rubric.md` の Step 1 に「ユーザー提示資料があれば Read で読み込み観点を判明マーク(事前執筆は求めない)」を 1 行ずつ追記。
23
+
24
+ ### 後方互換
25
+
26
+ - reference ファイル本文への追記のみ。`SKILL.md`・公開 API・CLI・DB スキーマ・hook に変更なし。資料は元々会話コンテキストとして読めるため挙動の実体変化はなく、rubric の指示を明示化しただけ。**破壊的変更なし**・migration 不要。
27
+
3
28
  ## [2.31.0] - 2026-06-06
4
29
 
5
30
  **標準ワークフローのヒアリング/設計フェーズを動的化(機能改善・破壊的変更なし)**: `dev-workflow` のフェーズ A(interviewer)と フェーズ B(architect)の固定 `AskUserQuestion` テンプレ(毎回同じ4択・3択)を、ルーブリック型ハイブリッドの動的生成に置き換えた。「聞く観点カテゴリ=固定(予測可能)/質問文・選択肢・深掘り=動的(タスク固有)」を両立させ、固定テンプレでは拾えなかった観点(特に成功条件/受け入れ基準)を掘れるようにする。
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: claude-code-conductor
3
- Version: 2.31.0
3
+ Version: 2.32.0
4
4
  Summary: Multi-agent orchestration framework for Claude Code with Codex/Cursor adapters (C3)
5
5
  Project-URL: Homepage, https://github.com/satoh-y-0323/claude-code-conductor
6
6
  Project-URL: Repository, https://github.com/satoh-y-0323/claude-code-conductor
@@ -1,3 +1,3 @@
1
1
  """Claude Code Conductor (C3) - multi-agent orchestration framework for Claude Code."""
2
2
 
3
- __version__ = "2.31.0"
3
+ __version__ = "2.32.0"