claude-code-conductor 2.45.0__tar.gz → 2.46.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 (213) hide show
  1. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/skills/dev-workflow/SKILL.md +66 -9
  2. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/skills/dev-workflow/scripts/record_review_decision.py +33 -5
  3. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/CHANGELOG.md +18 -0
  4. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/PKG-INFO +2 -1
  5. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/README.md +1 -0
  6. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/src/c3/__init__.py +1 -1
  7. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/src/c3/_db_params.py +8 -0
  8. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/src/c3/_terminal.py +7 -2
  9. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/src/c3/cli.py +2 -0
  10. claude_code_conductor-2.46.0/src/c3/cli_metrics.py +351 -0
  11. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/src/c3/db.py +673 -16
  12. claude_code_conductor-2.46.0/src/c3/migrations/006_review_decisions_severity.sql +17 -0
  13. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/hooks/test_record_review_decision.py +171 -0
  14. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/hooks/test_review_hint_inject.py +63 -0
  15. claude_code_conductor-2.46.0/tests/test_cli_metrics.py +1198 -0
  16. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/test_db.py +1288 -2
  17. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/test_migrate.py +116 -0
  18. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/CLAUDE.md +0 -0
  19. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/agents/architect.md +0 -0
  20. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/agents/code-reviewer.md +0 -0
  21. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/agents/design-critic.md +0 -0
  22. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/agents/developer.md +0 -0
  23. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/agents/doc-writer.md +0 -0
  24. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/agents/interviewer.md +0 -0
  25. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/agents/planner.md +0 -0
  26. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/agents/project-setup.md +0 -0
  27. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/agents/security-reviewer.md +0 -0
  28. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/agents/systematic-debugger.md +0 -0
  29. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/agents/tester.md +0 -0
  30. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/agents/wt_developer.md +0 -0
  31. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/agents/wt_systematic-debugger.md +0 -0
  32. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/agents/wt_tester.md +0 -0
  33. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/breaking-changes.txt +0 -0
  34. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/deletions.txt +0 -0
  35. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/docs/config-policy.md +0 -0
  36. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/docs/parallel-agents-setup.md +0 -0
  37. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/docs/platform-adapters.md +0 -0
  38. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/docs/settings.json.md +0 -0
  39. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/hooks/_hook_utils.py +0 -0
  40. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/hooks/check_agent_invocation.py +0 -0
  41. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/hooks/consolidate_memory.py +0 -0
  42. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/hooks/permission_handler.py +0 -0
  43. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/hooks/permission_handler_toast.py +0 -0
  44. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/hooks/planner_check.py +0 -0
  45. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/hooks/post_tool.py +0 -0
  46. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/hooks/pre_compact.py +0 -0
  47. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/hooks/pre_tool.py +0 -0
  48. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/hooks/recall_autorebuild.py +0 -0
  49. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/hooks/recall_inject.py +0 -0
  50. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/hooks/restore_session.py +0 -0
  51. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/hooks/select_tier.py +0 -0
  52. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/hooks/session_start.py +0 -0
  53. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/hooks/session_stop.py +0 -0
  54. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/hooks/session_utils.py +0 -0
  55. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/hooks/statusline.py +0 -0
  56. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/hooks/stop.py +0 -0
  57. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/hooks/worktree_guard.py +0 -0
  58. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/memory/.gitkeep +0 -0
  59. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/permission_rules.json +0 -0
  60. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/rules/promoted/index.md +0 -0
  61. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/settings.json +0 -0
  62. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/skills/brainstorm/SKILL.md +0 -0
  63. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/skills/codex-review/SKILL.md +0 -0
  64. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/skills/dev-workflow/references/code-review-checklist.md +0 -0
  65. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/skills/dev-workflow/references/design-critic-rubric.md +0 -0
  66. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/skills/dev-workflow/references/design-rubric.md +0 -0
  67. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/skills/dev-workflow/references/interview-rubric.md +0 -0
  68. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/skills/dev-workflow/references/plan-design-guidelines.md +0 -0
  69. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/skills/dev-workflow/references/security-review-checklist.md +0 -0
  70. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/skills/dev-workflow/scripts/record_agent_outcome.py +0 -0
  71. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/skills/dev-workflow/scripts/review_hint_inject.py +0 -0
  72. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/skills/develop/SKILL.md +0 -0
  73. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/skills/doc/SKILL.md +0 -0
  74. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/skills/extract-lib/SKILL.md +0 -0
  75. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/skills/init-session/SKILL.md +0 -0
  76. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/skills/init-session/scripts/session_guard.py +0 -0
  77. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/skills/mcp-config/SKILL.md +0 -0
  78. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/skills/parallel-agents/SKILL.md +0 -0
  79. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/skills/pattern-status/SKILL.md +0 -0
  80. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/skills/promote-pattern/SKILL.md +0 -0
  81. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/skills/recall/SKILL.md +0 -0
  82. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/skills/report-timestamp/SKILL.md +0 -0
  83. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/skills/report-timestamp/scripts/get_timestamp.py +0 -0
  84. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/skills/review-phase/SKILL.md +0 -0
  85. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/skills/setup/SKILL.md +0 -0
  86. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/skills/setup/reference.md +0 -0
  87. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/skills/setup/templates/coding-standards-template.md +0 -0
  88. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/skills/setup/templates/project-conventions-template.md +0 -0
  89. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/skills/start/SKILL.md +0 -0
  90. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.claude/state/.gitkeep +0 -0
  91. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/.gitignore +0 -0
  92. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/ARCHITECTURE.md +0 -0
  93. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/LICENSE +0 -0
  94. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/LICENSES/fastembed-LICENSE +0 -0
  95. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/LICENSES/fastembed-NOTICE +0 -0
  96. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/LICENSES/numpy-LICENSE +0 -0
  97. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/LICENSES/onnxruntime-LICENSE +0 -0
  98. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/LICENSES/paraphrase-multilingual-MiniLM-L12-v2-LICENSE +0 -0
  99. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/hatch_build.py +0 -0
  100. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/pyproject.toml +0 -0
  101. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/src/c3/__main__.py +0 -0
  102. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/src/c3/_excludes.py +0 -0
  103. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/src/c3/adapters.py +0 -0
  104. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/src/c3/cli_ask.py +0 -0
  105. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/src/c3/cli_doctor.py +0 -0
  106. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/src/c3/cli_init.py +0 -0
  107. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/src/c3/cli_list.py +0 -0
  108. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/src/c3/cli_plan.py +0 -0
  109. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/src/c3/cli_recall.py +0 -0
  110. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/src/c3/cli_tier.py +0 -0
  111. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/src/c3/cli_update.py +0 -0
  112. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/src/c3/embedding.py +0 -0
  113. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/src/c3/gitutil.py +0 -0
  114. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/src/c3/mcp_server.py +0 -0
  115. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/src/c3/migrate.py +0 -0
  116. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/src/c3/migrations/001_initial.sql +0 -0
  117. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/src/c3/migrations/002_agent_cost_runs.sql +0 -0
  118. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/src/c3/migrations/003_tier_cost.sql +0 -0
  119. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/src/c3/migrations/004_agent_outcomes.sql +0 -0
  120. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/src/c3/migrations/005_drop_agent_tier_bandit.sql +0 -0
  121. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/src/c3/migrations/README.md +0 -0
  122. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/src/c3/migrations/__init__.py +0 -0
  123. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/src/c3/paths.py +0 -0
  124. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/src/c3/plan_validator.py +0 -0
  125. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/src/c3/platforms.py +0 -0
  126. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/src/c3/pricing.py +0 -0
  127. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/src/c3/question.py +0 -0
  128. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/src/c3/recall_chunker.py +0 -0
  129. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/src/c3/recall_index.py +0 -0
  130. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/src/c3/usage_ingester.py +0 -0
  131. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/__init__.py +0 -0
  132. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/_pre_compact_helpers.py +0 -0
  133. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/conftest.py +0 -0
  134. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/fixtures/usage/README.md +0 -0
  135. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/fixtures/usage/mainline.jsonl +0 -0
  136. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/fixtures/usage/subagents/agent-deadbeef.jsonl +0 -0
  137. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/fixtures/usage/subagents/agent-deadbeef.meta.json +0 -0
  138. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/hooks/__init__.py +0 -0
  139. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/hooks/test_check_agent_invocation.py +0 -0
  140. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/hooks/test_consolidate_memory.py +0 -0
  141. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/hooks/test_hook_utils.py +0 -0
  142. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/hooks/test_permission_handler.py +0 -0
  143. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/hooks/test_permission_handler_toast.py +0 -0
  144. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/hooks/test_pip_reinstall_reminder.py +0 -0
  145. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/hooks/test_planner_check.py +0 -0
  146. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/hooks/test_planner_check_dev.py +0 -0
  147. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/hooks/test_post_tool.py +0 -0
  148. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/hooks/test_pre_tool.py +0 -0
  149. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/hooks/test_recall_autorebuild.py +0 -0
  150. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/hooks/test_recall_inject.py +0 -0
  151. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/hooks/test_record_agent_outcome.py +0 -0
  152. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/hooks/test_restore_session.py +0 -0
  153. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/hooks/test_select_tier.py +0 -0
  154. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/hooks/test_select_tier_escalation.py +0 -0
  155. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/hooks/test_session_start.py +0 -0
  156. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/hooks/test_session_stop.py +0 -0
  157. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/hooks/test_session_utils.py +0 -0
  158. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/hooks/test_settings_local_absolute_paths.py +0 -0
  159. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/hooks/test_similarity_boost.py +0 -0
  160. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/hooks/test_statusline.py +0 -0
  161. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/hooks/test_statusline_template_sync.py +0 -0
  162. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/hooks/test_sync_check.py +0 -0
  163. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/hooks/test_template_guard.py +0 -0
  164. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/skills/__init__.py +0 -0
  165. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/skills/_skill_helpers.py +0 -0
  166. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/skills/test_dev_workflow_no_task_type.py +0 -0
  167. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/skills/test_init_session_no_task_type.py +0 -0
  168. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/skills/test_planner_lightweight.py +0 -0
  169. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/skills/test_recall_skill.py +0 -0
  170. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/skills/test_session_backlog_reconciliation.py +0 -0
  171. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/skills/test_session_guard.py +0 -0
  172. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/skills/test_setup_templates.py +0 -0
  173. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/skills/test_start_skill_bugfix_flow.py +0 -0
  174. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/skills/test_start_skill_new_flow.py +0 -0
  175. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/skills/test_start_skill_security_audit_phase.py +0 -0
  176. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/test_adapters.py +0 -0
  177. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/test_check_deletions.py +0 -0
  178. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/test_cli_ask.py +0 -0
  179. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/test_cli_doctor.py +0 -0
  180. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/test_cli_entry.py +0 -0
  181. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/test_cli_init.py +0 -0
  182. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/test_cli_list.py +0 -0
  183. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/test_cli_plan.py +0 -0
  184. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/test_cli_recall.py +0 -0
  185. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/test_cli_tier.py +0 -0
  186. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/test_cli_update_breaking_changes.py +0 -0
  187. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/test_cli_update_deletions.py +0 -0
  188. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/test_docstring_consistency.py +0 -0
  189. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/test_embedding.py +0 -0
  190. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/test_excludes.py +0 -0
  191. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/test_extract_breaking_changes.py +0 -0
  192. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/test_gitutil.py +0 -0
  193. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/test_mcp_server_elicit.py +0 -0
  194. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/test_paths.py +0 -0
  195. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/test_plan_validator.py +0 -0
  196. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/test_pre_compact.py +0 -0
  197. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/test_pre_tool_hook.py +0 -0
  198. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/test_precompact_additional.py +0 -0
  199. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/test_precompact_toctou_fixes.py +0 -0
  200. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/test_pricing.py +0 -0
  201. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/test_recall_chunker.py +0 -0
  202. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/test_recall_index.py +0 -0
  203. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/test_references_migration.py +0 -0
  204. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/test_session_utils_additional.py +0 -0
  205. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/test_skill_no_builtin_conflict.py +0 -0
  206. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/test_statusline.py +0 -0
  207. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/test_stop_additional.py +0 -0
  208. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/test_stop_hook.py +0 -0
  209. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/test_stop_precompact_fixes.py +0 -0
  210. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/test_sync_template_stop.py +0 -0
  211. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/test_template_pre_tool_hook.py +0 -0
  212. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/test_usage_ingester.py +0 -0
  213. {claude_code_conductor-2.45.0 → claude_code_conductor-2.46.0}/tests/test_worktree_guard.py +0 -0
@@ -320,8 +320,22 @@ design-review-report を Read して findings の有無を確認する。design-
320
320
  }
321
321
  ```
322
322
 
323
+ **severity 供給経路の注記**: 以下の design-critic 判断記録で渡す `--severity` は `high`/`medium`/`low` の 3 段階のみ(design-critic は `critical` を供給しない。`critical` は security-reviewer 経由でのみ記録され得る。§2-2 severity 語彙対応表)。
324
+
323
325
  **「全て対応する」の場合:**
324
- 全指摘に `> **[対応予定]**` をマークしてから層別ルーティング(ステップ 4)へ。
326
+ 全指摘に `> **[対応予定]**` をマークする。
327
+
328
+ **design-critic 判断記録**: マークした直後・同一ステップ内で、層別ルーティング(ステップ 4)へ進む前に、各 DC-XX-NNN について Bash で c3.db に記録する:
329
+ ```bash
330
+ python .claude/skills/dev-workflow/scripts/record_review_decision.py \
331
+ --reviewer design-critic \
332
+ --checklist-id DC-XX-NNN \
333
+ --severity {high|medium|low} \
334
+ --decision fixed \
335
+ --finding "{指摘の1行要約(逐語引用せず・引用符/バッククォート/$ 等のシェルメタ文字を含めない。該当文字は置換/省略)}"
336
+ ```
337
+
338
+ 層別ルーティング(ステップ 4)へ。
325
339
 
326
340
  **「対応する指摘を選ぶ」の場合:**
327
341
  続けて AskUserQuestion で確認する(別ターン):
@@ -334,7 +348,16 @@ design-review-report を Read して findings の有無を確認する。design-
334
348
  ```
335
349
  1. 対応する指摘に `> **[対応予定]**` を Edit で追記する
336
350
  2. 許容する指摘の直下に `> **[許容]** {理由}` を Edit で追記する(検出記録は削除しない)
337
- 3. `[対応予定]` を付けた finding 1 件以上あれば層別ルーティング(ステップ 4)へ。全て許容した場合はフェーズ D へ。
351
+ 3. **design-critic 判断記録**: 1・2 disposition Edit した直後・同一ステップ内で、各 DC-XX-NNN について Bash で c3.db に記録する(`[対応予定]`→`fixed` / `[許容]`→`accepted`):
352
+ ```bash
353
+ python .claude/skills/dev-workflow/scripts/record_review_decision.py \
354
+ --reviewer design-critic \
355
+ --checklist-id DC-XX-NNN \
356
+ --severity {high|medium|low} \
357
+ --decision {fixed|accepted} \
358
+ --finding "{指摘の1行要約(逐語引用せず・引用符/バッククォート/$ 等のシェルメタ文字を含めない。該当文字は置換/省略)}"
359
+ ```
360
+ 4. `[対応予定]` を付けた finding が 1 件以上あれば層別ルーティング(ステップ 4)へ。全て許容した場合はフェーズ D へ。
338
361
 
339
362
  **「全て許容して進む」の場合:**
340
363
  続けて AskUserQuestion で許容理由を確認する(別ターン):
@@ -345,7 +368,19 @@ design-review-report を Read して findings の有無を確認する。design-
345
368
  }]
346
369
  }
347
370
  ```
348
- 全指摘の直下に `> **[許容]** {理由}` を Edit で追記してから**フェーズ D** へ。
371
+ 全指摘の直下に `> **[許容]** {理由}` を Edit で追記する。
372
+
373
+ **design-critic 判断記録**: Edit した直後・同一ステップ内で、フェーズ D へ進む前に、各 DC-XX-NNN について Bash で c3.db に記録する:
374
+ ```bash
375
+ python .claude/skills/dev-workflow/scripts/record_review_decision.py \
376
+ --reviewer design-critic \
377
+ --checklist-id DC-XX-NNN \
378
+ --severity {high|medium|low} \
379
+ --decision accepted \
380
+ --finding "{指摘の1行要約(逐語引用せず・引用符/バッククォート/$ 等のシェルメタ文字を含めない。該当文字は置換/省略)}"
381
+ ```
382
+
383
+ フェーズ D へ。
349
384
 
350
385
  **「否認・再監査を依頼する」の場合:**
351
386
  続けて AskUserQuestion でフィードバックを確認してからステップ 2(design-critic 再起動)へ。
@@ -677,6 +712,16 @@ python .claude/skills/dev-workflow/scripts/record_agent_outcome.py \
677
712
  **「全て対応する」の場合:**
678
713
  全指摘に `> **[対応予定]**` をマークし、セッションファイルの `- [ ] code-review` を `- [x]` に Edit し、`現在地:` を `現在地: フェーズC 計画中(レビュー差し戻し)` に Edit してから**フェーズ C** へ(内部遷移・Step 0 なし)。
679
714
 
715
+ **review-hint 判断記録**: tier-routing 記録の前に、全指摘(`[CR-NEW]` 含む)について Bash で c3.db に記録する:
716
+ ```bash
717
+ python .claude/skills/dev-workflow/scripts/record_review_decision.py \
718
+ --checklist-id {CR-XX-NNN または CR-NEW} \
719
+ --finding "{指摘の1行要約(逐語引用せず・引用符/バッククォート/$ 等のシェルメタ文字を含めない。該当文字は置換/省略)}" \
720
+ --decision fixed \
721
+ --severity {レポートの重要度を小文字で(high/medium/low)} \
722
+ --reviewer code-reviewer
723
+ ```
724
+
680
725
  **tier-routing 結果記録(帰属判定)**: 指摘内容から最上流起因 role を判定し failure を記録する(デフォルト developer・迷ったらこれ/**テストコード欠陥起因の指摘は tester failure**/設計不備なら architect/計画不備なら planner。`--note` に理由必須。developer・tester は `--execution subagent`、architect/planner は `--execution persona`。developer・tester は `--tier` を省略(frontmatter/tier_selection から自己解決)、architect/planner の場合は `--tier` も明記する):
681
726
  ```bash
682
727
  python .claude/skills/dev-workflow/scripts/record_agent_outcome.py \
@@ -698,12 +743,13 @@ python .claude/skills/dev-workflow/scripts/record_agent_outcome.py \
698
743
  ```
699
744
  1. 対応する指摘に `> **[対応予定]**` を追記する
700
745
  2. 許容する指摘の直下に `> **[許容]** {理由}` を Edit で追記する(検出記録は削除しない)
701
- 3. **review-hint 判断記録**: 各指摘について Bash で c3.db に記録する(`[CR-XX-NNN]` を含むもののみ。`[CR-NEW]` は記録対象外、チェックリスト追加候補として別途扱う):
746
+ 3. **review-hint 判断記録**: 各指摘について Bash で c3.db に記録する(`[CR-XX-NNN]`/`[CR-NEW]` を含むもの。`[CR-NEW]` も checklist-id にそのまま渡して記録する。チェックリスト追加候補としての扱いは従来どおり別途):
702
747
  ```bash
703
748
  python .claude/skills/dev-workflow/scripts/record_review_decision.py \
704
749
  --checklist-id CR-Q-001 \
705
- --finding "{指摘本文を 1 行で}" \
750
+ --finding "{指摘の1行要約(逐語引用せず・引用符/バッククォート/$ 等のシェルメタ文字を含めない。該当文字は置換/省略)}" \
706
751
  --decision {fixed|accepted} \
752
+ --severity {レポートの重要度を小文字で(high/medium/low)} \
707
753
  --reason "{許容理由(accepted の時のみ)}" \
708
754
  --reviewer code-reviewer
709
755
  ```
@@ -729,7 +775,7 @@ AskUserQuestion で許容理由を確認する:
729
775
  }
730
776
  ```
731
777
  1. 全指摘の直下に `> **[許容]** {理由}` を Edit で追記する(検出記録は削除しない)
732
- 2. **review-hint 判断記録**: `[CR-XX-NNN]` 指摘について `record_review_decision.py --decision accepted` で記録する
778
+ 2. **review-hint 判断記録**: `[CR-NEW]` 含む全指摘を `record_review_decision.py --decision accepted --severity {レポートの重要度を小文字で(high/medium/low)}` で記録する
733
779
  3. セッションファイルの `## うまくいったアプローチ` に `[許容例外] {指摘内容} → {許容理由}` の形式で追記し `patterns` に記録する
734
780
  4. セッションファイルの `- [ ] code-review` を `- [x]` に Edit し、`現在地:` を `現在地: フェーズE レビュー中 / 次: security-review` に Edit して E-2 へ。
735
781
  5. **tier-routing 結果記録**:
@@ -807,6 +853,16 @@ python .claude/skills/dev-workflow/scripts/record_agent_outcome.py \
807
853
  **「全て対応する」の場合:**
808
854
  全指摘に `> **[対応予定]**` をマークし、セッションファイルの `- [ ] security-review` を `- [x]` に Edit し、`現在地:` を `現在地: フェーズC 計画中(レビュー差し戻し)` に Edit してから**フェーズ C** へ(内部遷移・Step 0 なし)。
809
855
 
856
+ **review-hint 判断記録**: tier-routing 記録の前に、全指摘(`[SR-NEW]` 含む)について Bash で c3.db に記録する:
857
+ ```bash
858
+ python .claude/skills/dev-workflow/scripts/record_review_decision.py \
859
+ --checklist-id {SR-XX-NNN または SR-NEW} \
860
+ --finding "{指摘の1行要約(逐語引用せず・引用符/バッククォート/$ 等のシェルメタ文字を含めない。該当文字は置換/省略)}" \
861
+ --decision fixed \
862
+ --severity {レポートの重要度を小文字で(critical/high/medium/low)} \
863
+ --reviewer security-reviewer
864
+ ```
865
+
810
866
  **tier-routing 結果記録(帰属判定)**: 指摘内容から最上流起因 role を判定し failure を記録する(デフォルト developer・迷ったらこれ/**テストコード欠陥起因の指摘は tester failure**/設計不備なら architect/計画不備なら planner。`--note` に理由必須。developer・tester は `--execution subagent`、architect/planner は `--execution persona`。developer・tester は `--tier` を省略(frontmatter/tier_selection から自己解決)、architect/planner の場合は `--tier` も明記する):
811
867
  ```bash
812
868
  python .claude/skills/dev-workflow/scripts/record_agent_outcome.py \
@@ -828,12 +884,13 @@ python .claude/skills/dev-workflow/scripts/record_agent_outcome.py \
828
884
  ```
829
885
  1. 対応する指摘に `> **[対応予定]**` を追記する
830
886
  2. 許容する指摘の直下に `> **[許容]** {理由}` を Edit で追記する(検出記録は削除しない)
831
- 3. **review-hint 判断記録**: 各指摘について Bash で c3.db に記録する(`[SR-XX-NNN]` を含むもののみ。`[SR-NEW]` は記録対象外、チェックリスト追加候補として別途扱う):
887
+ 3. **review-hint 判断記録**: 各指摘について Bash で c3.db に記録する(`[SR-XX-NNN]`/`[SR-NEW]` を含むもの。`[SR-NEW]` も checklist-id にそのまま渡して記録する。チェックリスト追加候補としての扱いは従来どおり別途):
832
888
  ```bash
833
889
  python .claude/skills/dev-workflow/scripts/record_review_decision.py \
834
890
  --checklist-id SR-K-002 \
835
- --finding "{指摘本文を 1 行で}" \
891
+ --finding "{指摘の1行要約(逐語引用せず・引用符/バッククォート/$ 等のシェルメタ文字を含めない。該当文字は置換/省略)}" \
836
892
  --decision {fixed|accepted} \
893
+ --severity {レポートの重要度を小文字で(critical/high/medium/low)} \
837
894
  --reason "{許容理由(accepted の時のみ)}" \
838
895
  --reviewer security-reviewer
839
896
  ```
@@ -859,7 +916,7 @@ AskUserQuestion で許容理由を確認する:
859
916
  }
860
917
  ```
861
918
  1. 全指摘の直下に `> **[許容]** {理由}` を Edit で追記する(検出記録は削除しない)
862
- 2. **review-hint 判断記録**: `[SR-XX-NNN]` 指摘について `record_review_decision.py --decision accepted` で記録する
919
+ 2. **review-hint 判断記録**: `[SR-NEW]` 含む全指摘を `record_review_decision.py --decision accepted --severity {レポートの重要度を小文字で(critical/high/medium/low)}` で記録する
863
920
  3. セッションファイルの `## うまくいったアプローチ` に `[許容例外] {指摘内容} → {許容理由}` の形式で追記し `patterns` に記録する
864
921
  4. セッションファイルの `- [ ] security-review` を `- [x]` に Edit し、`現在地:` を `現在地: 完了` に Edit する。続けて **「引き継ぎバックログの照合」**(後述の共通ステップ)を実行してからコミットを提案する。
865
922
  5. **tier-routing 結果記録**: 全許容で完了するのも「成功」としてカウント:
@@ -25,9 +25,18 @@ import re
25
25
  import sys
26
26
 
27
27
 
28
- # checklist_id 形式検証用の正規表現([CR-XX-NNN] / [SR-XX-NNN]、連番 3 桁以上)[SR-V-001]
29
- # review_hint_inject.py の CHECKLIST_ID_RE と整合([ ] なし)。
30
- CHECKLIST_ID_PATTERN = re.compile(r"^(CR|SR)-[A-Z]+-\d{3,}$")
28
+ # checklist_id 形式検証用の正規表現([CR-XX-NNN] / [SR-XX-NNN] / [DC-XX-NNN]
29
+ # 連番 3 桁以上)[SR-V-001]。review_hint_inject.py の CHECKLIST_ID_RE と整合([ ] なし)。
30
+ # DC は design-critic の checklist_id(architecture-report §2-2(a))。
31
+ CHECKLIST_ID_PATTERN = re.compile(r"^(CR|SR|DC)-[A-Z]+-\d{3,}$")
32
+
33
+ # --severity の許容語彙(大小文字非依存・record_review_decision の手動検証で使用)。
34
+ # architecture-report §2-2(c): --decision / --reviewer とは非対称に argparse choices を
35
+ # 使わず、語彙外入力でも severity=None で記録を継続する(フェイルセーフ規律)。
36
+ # 相互参照: src/c3/db.py:fetch_prevented_findings の IN リテラル / src/c3/cli_metrics.py:_derive_headline
37
+ # の severity リテラル(item2)。語彙変更時は 3 箇所同期が必要・import 共有は実行コンテキスト
38
+ # 分離のため不可。
39
+ _SEVERITY_VOCAB = {"critical", "high", "medium", "low"}
31
40
 
32
41
 
33
42
  # DB 肥大化防止のためのフィールド長上限 [SR-V-001]。
@@ -89,17 +98,35 @@ def main(argv: list[str] | None = None) -> int:
89
98
  parser.add_argument("--context", default=None,
90
99
  help=f"ファイル名・コミット等の補助情報(最大 {MAX_CONTEXT_LEN} 文字で切り詰め)")
91
100
  parser.add_argument("--reviewer", required=True,
92
- choices=["code-reviewer", "security-reviewer"],
101
+ choices=["code-reviewer", "security-reviewer", "design-critic"],
93
102
  help="どちらの reviewer の指摘か")
103
+ parser.add_argument("--severity", default=None,
104
+ help="指摘の重要度(critical/high/medium/low。任意・大小文字非依存)")
94
105
 
95
106
  args = parser.parse_args(argv)
96
107
 
108
+ # --severity の手動検証(argparse choices は使わない)。
109
+ # 語彙外・表記ゆれ(Title Case 等)でもワークフローを止めず、
110
+ # 語彙外なら stderr 警告 + severity=None で記録を続行する(フェイルセーフ規律)。
111
+ severity = args.severity
112
+ if severity is not None:
113
+ normalized = severity.strip().lower()
114
+ if normalized in _SEVERITY_VOCAB:
115
+ severity = normalized
116
+ else:
117
+ print(
118
+ f"[record_review_decision] --severity 語彙外 (severity=NULL で記録続行): "
119
+ f"{args.severity!r} (expected: critical/high/medium/low)",
120
+ file=sys.stderr,
121
+ )
122
+ severity = None
123
+
97
124
  # checklist-id 形式検証(不正な値は DB に蓄積させず skip。CR-NEW / SR-NEW は対象外として除外)
98
125
  # [SR-V-001] 不正な ID が DB に入ると review-hint 照合が空振りするため insert を中止する
99
126
  if args.checklist_id not in ("CR-NEW", "SR-NEW") and not CHECKLIST_ID_PATTERN.match(args.checklist_id):
100
127
  print(
101
128
  f"[record_review_decision] --checklist-id format invalid (skipped): {args.checklist_id!r} "
102
- f"(expected pattern: CR-XX-NNN or SR-XX-NNN)",
129
+ f"(expected pattern: CR-XX-NNN, SR-XX-NNN, or DC-XX-NNN)",
103
130
  file=sys.stderr,
104
131
  )
105
132
  return 0
@@ -123,6 +150,7 @@ def main(argv: list[str] | None = None) -> int:
123
150
  reason=args.reason,
124
151
  context_summary=args.context,
125
152
  reviewer=args.reviewer,
153
+ severity=severity,
126
154
  )
127
155
  if not ok:
128
156
  # 失敗は警告のみ(DB 不在等で C3 利用先で頻繁に起きうる)
@@ -1,5 +1,23 @@
1
1
  # Changelog
2
2
 
3
+ ## [2.46.0] - 2026-07-07
4
+
5
+ ### 追加
6
+
7
+ - **`c3 metrics` コマンドを新設(効果の総括メトリクス)**: 「C3 を使うと何がどれだけ良かったか」を横断で確認する CLI。①事前検出実績(レビューが出荷前に捕捉した指摘の深刻度付きヘッドライン `fixed かつ Medium 以上 N 件`・reviewer×severity×decision マトリクス・直近実例。severity 未記録は `unknown` として併記されヘッドラインが下限値であることを明示)②差し戻しの月次傾向(暦月ゼロ埋め・1セッションあたり件数)・fix-cycle 近似分布・帰属 role 分布(review/development/other 別掲)③手戻りコスト概況(session 粒度近似・注記付き・`overall_ratio ≤ 1.0` 保証)。`--json` / `--since` / `--months`(上限 120)/ `--examples` 対応。集計は `agent_outcomes` / `agent_cost_runs` / `review_decisions` の read-only 消費で、**tier-routing の bandit 学習シグナル(`BANDIT_GATES`・E-1/E-2 除外)には一切干渉しない**。DB 由来文字列は `_sanitize_tree` で人間向け・`--json` 両経路とも一律サニタイズ。
8
+ - **migration 006: `review_decisions` に `severity` 列を追加**(nullable TEXT・additive。既存行は NULL のまま保持され `c3 update` 後のセッション開始時に自動適用)。
9
+ - **`record_review_decision.py` の拡張**: `--severity`(critical/high/medium/low・大小文字非依存・語彙外は警告+NULL で記録続行の フェイルセーフ)、`--reviewer design-critic`、`DC-XX-NNN` 形式の checklist-id を受理。`insert_review_decision` にはレガシースキーマ(severity 列不在)への旧 7 列 INSERT フォールバックと二層目の軽量検証(接頭辞・語彙・長さ・型ガード)を追加。
10
+ - **`sanitize_terminal_text` が U+2028/U+2029(Unicode 行区切り)も除去対象に**(init-session の SR L-2 サニタイズ仕様と整合)。
11
+
12
+ ### 変更
13
+
14
+ - **dev-workflow の判断記録カバレッジを拡大(運用変更・forward-only)**: E-1/E-2 の「全て対応する」パス(従来は記録なし=fixed 実績の最大の欠測経路)と C-3(design-critic 指摘)に severity 付きの `record_review_decision.py` 記録ステップを新設。`[CR-NEW]`/`[SR-NEW]` も記録対象になった(従来は運用指示で記録対象外)。`--finding` には指摘本文を逐語引用せずシェルメタ文字を含まない短い要約を書く(`--note` と同じ規律)。
15
+ - severity の供給経路: `critical` は security-reviewer のみが供給し得る(code-reviewer / design-critic は high/medium/low の3段階)。ヘッドラインの critical 内訳が 0 のままでも異常ではない。
16
+
17
+ ### 後方互換
18
+
19
+ - DDL は additive のみ・新引数は全て optional・`--severity` 省略の従来コマンドは無警告 exit 0 で完全後方互換・review-hint 注入(`review_hint_inject.py`)は不変。**破壊的変更なし**(記録カバレッジの拡大は運用変更であり、既存インターフェース・保存済みデータ・ヒント注入はすべて従来どおり動作する)。
20
+
3
21
  ## [2.45.0] - 2026-07-05
4
22
 
5
23
  ### 追加
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: claude-code-conductor
3
- Version: 2.45.0
3
+ Version: 2.46.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
@@ -203,6 +203,7 @@ C3 のスラッシュコマンドはすべてスキル(`skills/{name}/SKILL.md
203
203
  | `c3 recall rebuild [--force]` | numpy ベクトル検索インデックスを再構築(初回は fastembed が ~220MB のモデルを取得) |
204
204
  | `c3 recall stats` | チャンク数・モデル名・最終 rebuild 日時を表示 |
205
205
  | `c3 tier stats` | tier-routing(複雑度に応じた Tier 自動ルーティング)の学習データ・Tier 別コスト・現在の routing パラメータ(λ/ε/escalation・v2.27.0〜)を表形式で表示(`--json` で機械可読出力・`--recent N` で直近 outcome 件数指定)。ルーティング挙動は環境変数 `C3_TIER_COST_LAMBDA`(cost-weighted の重み・`0 ≤ λ ≤ 5`・v2.26.0〜、上限拡張 v2.27.0)/ `C3_TIER_EPSILON` / `C3_ESCALATION_THRESHOLD` で調整可([CLI リファレンス](https://satoh-y-0323.github.io/claude-code-conductor/cli-reference/)参照) |
206
+ | `c3 metrics` | P4 効果の総括メトリクス。レビュー指摘の事前検出実績(fixed/accepted 判断記録)・差し戻しの傾向と帰属・手戻りコスト概況を read-only で表示(`--json` で機械可読出力・`--since YYYY-MM-DD` / `--months N`(既定12)/ `--examples N`(既定5)でフィルタ)。詳細は [CLI リファレンス](https://satoh-y-0323.github.io/claude-code-conductor/cli-reference/)参照 |
206
207
 
207
208
  ### 基本的な使い方
208
209
 
@@ -156,6 +156,7 @@ C3 のスラッシュコマンドはすべてスキル(`skills/{name}/SKILL.md
156
156
  | `c3 recall rebuild [--force]` | numpy ベクトル検索インデックスを再構築(初回は fastembed が ~220MB のモデルを取得) |
157
157
  | `c3 recall stats` | チャンク数・モデル名・最終 rebuild 日時を表示 |
158
158
  | `c3 tier stats` | tier-routing(複雑度に応じた Tier 自動ルーティング)の学習データ・Tier 別コスト・現在の routing パラメータ(λ/ε/escalation・v2.27.0〜)を表形式で表示(`--json` で機械可読出力・`--recent N` で直近 outcome 件数指定)。ルーティング挙動は環境変数 `C3_TIER_COST_LAMBDA`(cost-weighted の重み・`0 ≤ λ ≤ 5`・v2.26.0〜、上限拡張 v2.27.0)/ `C3_TIER_EPSILON` / `C3_ESCALATION_THRESHOLD` で調整可([CLI リファレンス](https://satoh-y-0323.github.io/claude-code-conductor/cli-reference/)参照) |
159
+ | `c3 metrics` | P4 効果の総括メトリクス。レビュー指摘の事前検出実績(fixed/accepted 判断記録)・差し戻しの傾向と帰属・手戻りコスト概況を read-only で表示(`--json` で機械可読出力・`--since YYYY-MM-DD` / `--months N`(既定12)/ `--examples N`(既定5)でフィルタ)。詳細は [CLI リファレンス](https://satoh-y-0323.github.io/claude-code-conductor/cli-reference/)参照 |
159
160
 
160
161
  ### 基本的な使い方
161
162
 
@@ -1,3 +1,3 @@
1
1
  """Claude Code Conductor (C3) - multi-agent orchestration framework for Claude Code."""
2
2
 
3
- __version__ = "2.45.0"
3
+ __version__ = "2.46.0"
@@ -58,6 +58,14 @@ BANDIT_GATES: tuple[str, ...] = ("D-2.5", "D-3", "D-5", "D-2.5-stuck")
58
58
  # 本定数が SSOT(read_agent_failure_rate がここから解決する)。
59
59
  FAILURE_WINDOW_DAYS_DEFAULT = 14.0
60
60
 
61
+ # metrics(`c3 metrics`)用 gate 定数の SSOT(P4 効果の総括メトリクス・ADR-006-5)。
62
+ # BANDIT_GATES とは完全に独立した定義であり、値を再利用・コピーしない。
63
+ # db.py の metrics ヘルパー群(read_review_decision_matrix 等)は agent_outcomes /
64
+ # agent_cost_runs を read-only 消費するのみで、bandit 学習シグナル(BANDIT_GATES)
65
+ # および E-1/E-2 の bandit 除外分岐には一切干渉しない(絶対制約・成功条件5)。
66
+ METRICS_REVIEW_GATES: tuple[str, ...] = ("E-1", "E-2", "C-3") # レビュー差し戻し(傾向・コスト対象)
67
+ METRICS_DEV_GATES: tuple[str, ...] = ("D-3", "D-5") # 開発内リトライ(役割分布で別掲)
68
+
61
69
 
62
70
  def _resolve_float_env(
63
71
  env_key: str,
@@ -20,7 +20,10 @@ _CSI_M_RE = re.compile(r"\033\[[0-9;]*m")
20
20
  # Allow newline (\n), tab (\t), carriage return (\r) but strip any other
21
21
  # C0 control or escape character (\x1b) so that ANSI/title-injection cannot
22
22
  # happen via DB-stored values such as ``current_step`` / ``error_message``.
23
- _DISALLOWED_CONTROL_RE = re.compile(r"[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]")
23
+ # Also strip the Unicode line/paragraph separators U+2028 / U+2029 so they
24
+ # match the init-session SR L-2 sanitization spec (removes U+2028 / U+2029).
25
+ # NEL (U+0085) is intentionally NOT included per that spec.
26
+ _DISALLOWED_CONTROL_RE = re.compile("[\x00-\x08\x0b\x0c\x0e-\x1f\x7f" + chr(0x2028) + chr(0x2029) + "]")
24
27
 
25
28
 
26
29
  def supports_color() -> bool:
@@ -52,7 +55,9 @@ def sanitize_terminal_text(s: str) -> str:
52
55
 
53
56
  Used for DB-sourced strings (``current_step`` / ``error_message``) so
54
57
  they cannot inject ANSI escape sequences (title, cursor, screen clear)
55
- into the terminal. Newlines / tabs are preserved.
58
+ into the terminal. Newlines / tabs / carriage returns are preserved.
59
+ The Unicode line/paragraph separators U+2028 / U+2029 are also stripped
60
+ (init-session SR L-2 sanitization spec); NEL (U+0085) is out of scope.
56
61
  """
57
62
  if not s:
58
63
  return s
@@ -17,6 +17,7 @@ from c3 import (
17
17
  cli_doctor,
18
18
  cli_init,
19
19
  cli_list,
20
+ cli_metrics,
20
21
  cli_plan,
21
22
  cli_recall,
22
23
  cli_tier,
@@ -43,6 +44,7 @@ def build_parser() -> argparse.ArgumentParser:
43
44
  cli_doctor.register(sub)
44
45
  cli_plan.register(sub)
45
46
  cli_tier.register(sub)
47
+ cli_metrics.register(sub)
46
48
  cli_ask.register(sub)
47
49
  cli_recall.register(sub)
48
50