claude-code-conductor 2.41.0__tar.gz → 2.43.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.
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/breaking-changes.txt +1 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/hooks/select_tier.py +17 -8
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/skills/dev-workflow/SKILL.md +39 -21
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/skills/dev-workflow/scripts/record_agent_outcome.py +72 -25
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/skills/parallel-agents/SKILL.md +34 -9
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/CHANGELOG.md +42 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/PKG-INFO +1 -1
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/src/c3/__init__.py +1 -1
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/src/c3/_db_params.py +31 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/src/c3/cli_tier.py +3 -4
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/src/c3/db.py +67 -219
- claude_code_conductor-2.43.0/src/c3/migrations/005_drop_agent_tier_bandit.sql +18 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/hooks/test_record_agent_outcome.py +902 -18
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/hooks/test_select_tier.py +105 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/hooks/test_select_tier_escalation.py +48 -31
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/hooks/test_session_start.py +5 -1
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/hooks/test_session_stop.py +16 -26
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/test_cli_tier.py +41 -26
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/test_db.py +497 -309
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/test_migrate.py +181 -6
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/CLAUDE.md +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/agents/architect.md +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/agents/code-reviewer.md +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/agents/design-critic.md +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/agents/developer.md +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/agents/doc-writer.md +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/agents/interviewer.md +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/agents/planner.md +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/agents/project-setup.md +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/agents/security-reviewer.md +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/agents/systematic-debugger.md +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/agents/tester.md +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/agents/wt_developer.md +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/agents/wt_systematic-debugger.md +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/agents/wt_tester.md +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/deletions.txt +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/docs/config-policy.md +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/docs/parallel-agents-setup.md +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/docs/platform-adapters.md +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/docs/settings.json.md +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/hooks/_hook_utils.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/hooks/check_agent_invocation.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/hooks/consolidate_memory.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/hooks/permission_handler.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/hooks/permission_handler_toast.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/hooks/planner_check.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/hooks/post_tool.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/hooks/pre_compact.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/hooks/pre_tool.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/hooks/recall_autorebuild.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/hooks/recall_inject.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/hooks/restore_session.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/hooks/session_start.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/hooks/session_stop.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/hooks/session_utils.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/hooks/statusline.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/hooks/stop.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/hooks/worktree_guard.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/memory/.gitkeep +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/permission_rules.json +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/rules/promoted/index.md +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/settings.json +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/skills/brainstorm/SKILL.md +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/skills/codex-review/SKILL.md +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/skills/dev-workflow/references/code-review-checklist.md +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/skills/dev-workflow/references/design-critic-rubric.md +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/skills/dev-workflow/references/design-rubric.md +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/skills/dev-workflow/references/interview-rubric.md +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/skills/dev-workflow/references/plan-design-guidelines.md +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/skills/dev-workflow/references/security-review-checklist.md +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/skills/dev-workflow/scripts/record_review_decision.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/skills/dev-workflow/scripts/review_hint_inject.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/skills/develop/SKILL.md +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/skills/doc/SKILL.md +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/skills/extract-lib/SKILL.md +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/skills/init-session/SKILL.md +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/skills/init-session/scripts/session_guard.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/skills/mcp-config/SKILL.md +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/skills/pattern-status/SKILL.md +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/skills/promote-pattern/SKILL.md +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/skills/recall/SKILL.md +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/skills/report-timestamp/SKILL.md +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/skills/report-timestamp/scripts/get_timestamp.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/skills/review-phase/SKILL.md +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/skills/setup/SKILL.md +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/skills/setup/reference.md +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/skills/setup/templates/coding-standards-template.md +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/skills/setup/templates/project-conventions-template.md +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/skills/start/SKILL.md +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/state/.gitkeep +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.gitignore +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/ARCHITECTURE.md +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/LICENSE +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/LICENSES/fastembed-LICENSE +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/LICENSES/fastembed-NOTICE +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/LICENSES/numpy-LICENSE +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/LICENSES/onnxruntime-LICENSE +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/LICENSES/paraphrase-multilingual-MiniLM-L12-v2-LICENSE +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/README.md +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/hatch_build.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/pyproject.toml +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/src/c3/__main__.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/src/c3/_excludes.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/src/c3/_terminal.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/src/c3/adapters.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/src/c3/cli.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/src/c3/cli_ask.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/src/c3/cli_doctor.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/src/c3/cli_init.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/src/c3/cli_list.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/src/c3/cli_plan.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/src/c3/cli_recall.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/src/c3/cli_update.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/src/c3/embedding.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/src/c3/gitutil.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/src/c3/mcp_server.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/src/c3/migrate.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/src/c3/migrations/001_initial.sql +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/src/c3/migrations/002_agent_cost_runs.sql +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/src/c3/migrations/003_tier_cost.sql +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/src/c3/migrations/004_agent_outcomes.sql +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/src/c3/migrations/README.md +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/src/c3/migrations/__init__.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/src/c3/paths.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/src/c3/plan_validator.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/src/c3/platforms.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/src/c3/pricing.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/src/c3/question.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/src/c3/recall_chunker.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/src/c3/recall_index.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/src/c3/usage_ingester.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/__init__.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/conftest.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/fixtures/usage/README.md +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/fixtures/usage/mainline.jsonl +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/fixtures/usage/subagents/agent-deadbeef.jsonl +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/fixtures/usage/subagents/agent-deadbeef.meta.json +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/hooks/__init__.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/hooks/test_check_agent_invocation.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/hooks/test_consolidate_memory.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/hooks/test_hook_utils.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/hooks/test_permission_handler.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/hooks/test_permission_handler_toast.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/hooks/test_pip_reinstall_reminder.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/hooks/test_planner_check.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/hooks/test_planner_check_dev.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/hooks/test_post_tool.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/hooks/test_pre_tool.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/hooks/test_recall_autorebuild.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/hooks/test_recall_inject.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/hooks/test_record_review_decision.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/hooks/test_restore_session.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/hooks/test_review_hint_inject.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/hooks/test_session_utils.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/hooks/test_settings_local_absolute_paths.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/hooks/test_similarity_boost.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/hooks/test_statusline.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/hooks/test_statusline_template_sync.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/hooks/test_sync_check.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/hooks/test_template_guard.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/skills/__init__.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/skills/_skill_helpers.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/skills/test_dev_workflow_no_task_type.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/skills/test_init_session_no_task_type.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/skills/test_planner_lightweight.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/skills/test_recall_skill.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/skills/test_session_backlog_reconciliation.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/skills/test_session_guard.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/skills/test_setup_templates.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/skills/test_start_skill_bugfix_flow.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/skills/test_start_skill_new_flow.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/skills/test_start_skill_security_audit_phase.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/test_adapters.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/test_check_deletions.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/test_cli_ask.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/test_cli_doctor.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/test_cli_entry.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/test_cli_init.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/test_cli_list.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/test_cli_plan.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/test_cli_recall.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/test_cli_update_breaking_changes.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/test_cli_update_deletions.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/test_docstring_consistency.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/test_embedding.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/test_excludes.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/test_extract_breaking_changes.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/test_gitutil.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/test_mcp_server_elicit.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/test_paths.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/test_plan_validator.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/test_pre_compact.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/test_pre_tool_hook.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/test_precompact_additional.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/test_precompact_toctou_fixes.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/test_pricing.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/test_recall_chunker.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/test_recall_index.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/test_references_migration.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/test_session_utils_additional.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/test_skill_no_builtin_conflict.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/test_statusline.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/test_stop_additional.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/test_stop_hook.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/test_stop_precompact_fixes.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/test_sync_template_stop.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/test_template_pre_tool_hook.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/test_usage_ingester.py +0 -0
- {claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/tests/test_worktree_guard.py +0 -0
|
@@ -7,3 +7,4 @@
|
|
|
7
7
|
v2.11.0|summarize-memory agent + skill removed; replaced by `c3 recall`|summarize-memory エージェント / skill を完全廃止。代替は `c3 recall` の意味検索。
|
|
8
8
|
v2.20.0|hooks/schema.sql removed; SQLite schema is now managed by c3/migrations/ (auto-applied at session_start)|hooks/schema.sql を削除しました。SQLite スキーマは c3/migrations/ (wheel 内) で管理され session_start で自動適用されます。
|
|
9
9
|
v2.41.0|Learning tables tier_bandit/tier_recent_outcomes are DROPPED and learning data resets; record_tier_outcome.py replaced by record_agent_outcome.py; c3 tier stats --json shape changed; old db.py tier APIs removed or shimmed (shims removed next release)|
|
|
10
|
+
v2.43.0|Dropped agent_tier_bandit table (migration 005; bandit params now derived from agent_outcomes event log at read time, learning data preserved). Removed update_agent_tier_params and five v2.41.0 deprecated shims (read_tier_params, read_tier_failure_rate, update_tier_params, record_tier_recent_outcome, sync_tier_bandit_cost). read_agent_failure_rate signature changed: last_n replaced by window_days (time-based window, default 14 days via C3_FAILURE_WINDOW_DAYS).|
|
|
@@ -5,15 +5,19 @@ tier-routing MVP: タスクの複雑度を簡易ヒューリスティックで
|
|
|
5
5
|
(または学習データ収集期は uniform random)で推奨 Tier を決定して
|
|
6
6
|
``additionalContext`` で親 Claude に伝える。
|
|
7
7
|
|
|
8
|
-
MVP
|
|
9
|
-
- **やる**: 推奨 Tier
|
|
10
|
-
|
|
8
|
+
MVP スコープ(ユーザー承認済み・tier-routing 自動適用フェーズ2でソフト適用を追加):
|
|
9
|
+
- **やる**: 推奨 Tier を提示し、developer / wt_developer の Agent 起動時に
|
|
10
|
+
`model:` へ明示適用するよう親 Claude に指示する(ソフト適用・
|
|
11
|
+
additionalContext 経由の行動指示であり機械強制ではない)。agent の
|
|
12
|
+
`model:` フロントマター自体は変更しない
|
|
13
|
+
- **やらない**: PreToolUse hook 等による機械適用(updatedInput での自動書き換え・
|
|
14
|
+
次フェーズ)、developer 以外の role への適用、フォールバック(Haiku 失敗→Sonnet 自動昇格)
|
|
11
15
|
|
|
12
16
|
学習データ:
|
|
13
17
|
- 結果は ``.claude/state/tier_selection.json`` に直近 1 件のみ書き込む
|
|
14
18
|
- dev-workflow の各フェーズ承認ゲート(並列タスク単位を含む)で
|
|
15
|
-
``record_agent_outcome.py``
|
|
16
|
-
|
|
19
|
+
``record_agent_outcome.py`` が結果を ``agent_outcomes`` イベントログに記録し、
|
|
20
|
+
bandit params(α/β)は読み取り時に ``read_agent_tier_params`` が導出集計で計算する
|
|
17
21
|
|
|
18
22
|
入力 / 出力:
|
|
19
23
|
- stdin: UserPromptSubmit payload(``prompt`` フィールドを参照)
|
|
@@ -501,8 +505,8 @@ def write_tier_selection(
|
|
|
501
505
|
) -> None:
|
|
502
506
|
"""直近の選択結果を ``tier_selection.json`` に書く。
|
|
503
507
|
|
|
504
|
-
record_agent_outcome.py
|
|
505
|
-
|
|
508
|
+
record_agent_outcome.py が結果を ``agent_outcomes`` イベントログに記録し、
|
|
509
|
+
α/β は読み取り時に導出される。既存ファイルは上書きされる(最新 1 件のみ保持)。
|
|
506
510
|
|
|
507
511
|
``suggested_model`` を併せて書く。tier 名と model の短縮名は同一とする。
|
|
508
512
|
(PO 廃止前は runner.py が読んで ``claude --agents`` 用に使っていたが、v2.0.0 以降は
|
|
@@ -601,7 +605,12 @@ def build_additional_context(
|
|
|
601
605
|
f"[tier-routing 推奨] 複雑度: {complexity} / 推奨 Tier: {tier}({confidence}・developer 基準)。"
|
|
602
606
|
f" エージェント定義 frontmatter の model がデフォルトですが、Agent 呼び出し時に"
|
|
603
607
|
f" model: を明示指定すれば上書きできます(fork を除く)。"
|
|
604
|
-
f"
|
|
608
|
+
f" 指示: developer / wt_developer を Agent ツールで起動する際は"
|
|
609
|
+
f" model: {tier} を明示指定してこの推奨 Tier を適用すること"
|
|
610
|
+
f"(学習データ収集中の期間も含め常に適用する。fork は model 上書き不可のため対象外)。"
|
|
611
|
+
f" 対象は developer / wt_developer のみ。tester 等の他 role、および親 Claude"
|
|
612
|
+
f" ペルソナで動かす role(interviewer / architect / planner)は"
|
|
613
|
+
f" tier レバーが無いため対象外で従来どおりとする。{suffix}"
|
|
605
614
|
)
|
|
606
615
|
|
|
607
616
|
|
{claude_code_conductor-2.41.0 → claude_code_conductor-2.43.0}/.claude/skills/dev-workflow/SKILL.md
RENAMED
|
@@ -35,6 +35,17 @@ user-invocable: false
|
|
|
35
35
|
- `--note` は指摘本文を逐語引用せず、シェルメタ文字(引用符・バッククォート・`$` 等)を含まない短い要約で書く(コマンドライン展開事故・シェルインジェクションを避けるため。record_agent_outcome.py 側で長さ上限と秘密情報マスクも適用されるが、そもそも逐語引用しないことが第一防御)
|
|
36
36
|
- 全エラー exit 0 のため呼び出しが失敗してもワークフローは止めない(記録漏れの可能性はあるが後続フェーズはブロックしない)
|
|
37
37
|
|
|
38
|
+
**ソフト適用(推奨 Tier の `model:` 指定・ADR-AS-1/ADR-AS-2):**
|
|
39
|
+
|
|
40
|
+
- developer を Agent ツールで起動する箇所(**D-2 / D-2.5 の再実行 / D-4**)では、`[tier-routing 推奨]` が指示した推奨 Tier を Agent 呼び出しの `model:` に明示指定する(ソフト適用・学習データ収集中の期間も含め常に適用する。fork は model 上書き不可のため対象外)。**tester / systematic-debugger は対象外**で従来どおり frontmatter 任せとする。interviewer/architect/planner は親 Claude ペルソナで動かし tier レバーが無いため対象外。
|
|
41
|
+
- **推奨 Tier の SSOT**: 「推奨 Tier」の唯一のソースは `.claude/state/tier_selection.json` の `tier`(無ければ `suggested_model`)であり、`[tier-routing 推奨]` の additionalContext テキストはその値を人間可読に射影した派生表示で SSOT ではない。この値は kickoff プロンプトの UserPromptSubmit で select_tier が 1 度だけ書き、E-2 の `--final` で削除されるまで wave/ゲートをまたいで安定する(承認応答は UserPromptSubmit を発火しないため途中で上書きされない)。
|
|
42
|
+
- developer の record ブロックは**原則 `--tier` を付けない**(record_agent_outcome.py が tier_selection.json から実適用 tier を機械解決する。tier 値の LLM 申告を行わない)。**例外(機械条件・ADR-AS-2)**: developer 起動時に指定した `model:` が推奨 Tier(tier_selection.json.tier)と**異なる値だった場合は、必ずその実際に指定した値を `--tier {実 model の tier}` に付けて**実態を記録する(「指定 model: ≠ 推奨 Tier なら必ず付与」という観測可能な二値条件で判定する)。
|
|
43
|
+
|
|
44
|
+
**集計注記**(DC-AS-002 / ADR-25-3):
|
|
45
|
+
|
|
46
|
+
- E-1/E-2(レビュー指摘由来)のイベントは全 gate 不可逆に記録するが、bandit params・escalation 判定の集計対象は **BANDIT_GATES(D-2.5/D-3/D-5/D-2.5-stuck)のみ**である。E-1/E-2 の成否は個別の集計から除外される(意図どおり・read-side フィルタで実現)。
|
|
47
|
+
- **reviewer role(code-reviewer/security-reviewer・および E-gate のみの role)は BANDIT_GATES に該当 gate を持たないため、`c3 tier stats` 等の表示で当該 role の bandit は常に uniform(全 tier `(1.0,1.0,0)`・0 trials)になる**。これは設計意図の帰結であり退行ではない。tier 選択の実消費者は `select_tier`(developer role 固定)のみで、reviewer role の bandit が uniform でも tier 選択ロジックには影響しない。
|
|
48
|
+
|
|
38
49
|
---
|
|
39
50
|
|
|
40
51
|
## フェーズ A: ヒアリング
|
|
@@ -475,16 +486,23 @@ Agent ツールで `tester` エージェントを起動する。→ 失敗する
|
|
|
475
486
|
|
|
476
487
|
### D-2: developer(Green フェーズ)
|
|
477
488
|
|
|
478
|
-
Agent ツールで `developer`
|
|
489
|
+
Agent ツールで `developer` エージェントを起動する(`model:` に推奨 Tier を指定・上記「tier-routing 結果記録の運用」節参照)。→ テストが通る実装を行う。
|
|
479
490
|
|
|
480
491
|
### D-2.5: Stuck チェック
|
|
481
492
|
|
|
482
493
|
Glob で `.claude/reports/debug-needed-*.md` の最新を確認する。
|
|
483
494
|
|
|
484
495
|
**ファイルが存在する場合:**
|
|
496
|
+
0. **stuck 記録**(削除前記録・ADR-25-6):
|
|
497
|
+
```bash
|
|
498
|
+
python .claude/skills/dev-workflow/scripts/record_agent_outcome.py \
|
|
499
|
+
--role developer --outcome failure --gate D-2.5-stuck \
|
|
500
|
+
--execution subagent --task {plan タスクID} --complexity {セッションファイルの tier-routing複雑度: 行の値} \
|
|
501
|
+
--note "stuck: debug-needed 検出(自力完走不能)"
|
|
502
|
+
```
|
|
485
503
|
1. Agent ツールで `systematic-debugger` を起動する。プロンプトに debug-needed ファイルのパスのみを含め、内容は agent 側で Read させる(プロンプトに直接展開しない)[SR-AI-001]
|
|
486
504
|
2. 生成された `.claude/reports/debug-analysis-*.md` を Glob で取得してパスのみコンテキストに保持する(内容は次段で agent に Read させる)
|
|
487
|
-
3. D-2 の developer
|
|
505
|
+
3. D-2 の developer を再実行する(`model:` に推奨 Tier を指定・上記「tier-routing 結果記録の運用」節参照)。プロンプトに debug-analysis の**ファイルパスのみ**を含め、内容は agent 側で Read させる(プロンプトに展開しない)[SR-AI-001]
|
|
488
506
|
4. debug-needed ファイルを削除する
|
|
489
507
|
|
|
490
508
|
**ファイルが存在しない場合:** そのまま次へ進む
|
|
@@ -543,17 +561,17 @@ AskUserQuestion で確認する:
|
|
|
543
561
|
|
|
544
562
|
不合格の場合: D-2(developer)に戻る。合格するまで繰り返す。
|
|
545
563
|
|
|
546
|
-
**tier-routing 結果記録(不合格時のみ・D-2.5
|
|
564
|
+
**tier-routing 結果記録(不合格時のみ・D-2.5 と重複回避のため全合格時は記録しない・欠陥の所在で判定)**: D-5 否認ブロックと同型で、テストコード欠陥は `tester` failure、プロダクトコード欠陥は `developer` failure、両方または判別不能な場合は `developer` のみ記録する:
|
|
547
565
|
```bash
|
|
548
566
|
python .claude/skills/dev-workflow/scripts/record_agent_outcome.py \
|
|
549
|
-
--role developer --outcome failure --gate D-3 \
|
|
567
|
+
--role {tester|developer(欠陥の所在で判定・テストコード欠陥=tester/プロダクトコード欠陥=developer/両方または判別不能=developer)} --outcome failure --gate D-3 \
|
|
550
568
|
--execution subagent --complexity {セッションファイルの tier-routing複雑度: 行の値} \
|
|
551
569
|
--task {plan タスクID}
|
|
552
570
|
```
|
|
553
571
|
|
|
554
572
|
### D-4: developer(Refactor フェーズ)
|
|
555
573
|
|
|
556
|
-
Agent ツールで `developer`
|
|
574
|
+
Agent ツールで `developer` エージェントを起動する(`model:` に推奨 Tier を指定・上記「tier-routing 結果記録の運用」節参照)。→ テストを壊さずにコードを整理する。
|
|
557
575
|
|
|
558
576
|
完了後 → セッションファイルの `- [ ] developer: Refactor フェーズ` を `- [x]` に Edit し、`現在地:` を `現在地: フェーズD 実装中 / 次ゲート: tester 最終確認` に Edit する。
|
|
559
577
|
|
|
@@ -659,13 +677,13 @@ python .claude/skills/dev-workflow/scripts/record_agent_outcome.py \
|
|
|
659
677
|
**「全て対応する」の場合:**
|
|
660
678
|
全指摘に `> **[対応予定]**` をマークし、セッションファイルの `- [ ] code-review` を `- [x]` に Edit し、`現在地:` を `現在地: フェーズC 計画中(レビュー差し戻し)` に Edit してから**フェーズ C** へ(内部遷移・Step 0 なし)。
|
|
661
679
|
|
|
662
|
-
**tier-routing 結果記録(帰属判定)**: 指摘内容から最上流起因 role を判定し failure を記録する(デフォルト developer
|
|
680
|
+
**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` も明記する):
|
|
663
681
|
```bash
|
|
664
682
|
python .claude/skills/dev-workflow/scripts/record_agent_outcome.py \
|
|
665
|
-
--role {developer|architect|planner(帰属判定)} --outcome failure --gate E-1 \
|
|
666
|
-
--execution {developer=subagent / architect・planner=persona} \
|
|
683
|
+
--role {developer|tester|architect|planner(帰属判定)} --outcome failure --gate E-1 \
|
|
684
|
+
--execution {developer・tester=subagent / architect・planner=persona} \
|
|
667
685
|
--complexity {セッションファイルの tier-routing複雑度: 行の値} \
|
|
668
|
-
--tier {developer は省略(frontmatter から自己解決) / architect・planner は親モデルのtier名(haiku/sonnet/opus)。判別不能なら unknown} \
|
|
686
|
+
--tier {developer・tester は省略(frontmatter/tier_selection から自己解決) / architect・planner は親モデルのtier名(haiku/sonnet/opus)。判別不能なら unknown} \
|
|
669
687
|
--note "{帰属理由を1行で(コード断片の逐語引用禁止)}"
|
|
670
688
|
```
|
|
671
689
|
|
|
@@ -691,13 +709,13 @@ python .claude/skills/dev-workflow/scripts/record_agent_outcome.py \
|
|
|
691
709
|
```
|
|
692
710
|
4. セッションファイルの `## うまくいったアプローチ` に `[許容例外] {指摘内容} → {許容理由}` の形式で追記し `patterns` に記録する
|
|
693
711
|
5. セッションファイルの `- [ ] code-review` を `- [x]` に Edit し、`現在地:` を `現在地: フェーズC 計画中(レビュー差し戻し)` に Edit してから**フェーズ C** へ(内部遷移・Step 0 なし)。
|
|
694
|
-
6. **tier-routing 結果記録(帰属判定)**: 指摘内容から最上流起因 role を判定し failure を記録する(デフォルト developer
|
|
712
|
+
6. **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` も明記する):
|
|
695
713
|
```bash
|
|
696
714
|
python .claude/skills/dev-workflow/scripts/record_agent_outcome.py \
|
|
697
|
-
--role {developer|architect|planner(帰属判定)} --outcome failure --gate E-1 \
|
|
698
|
-
--execution {developer=subagent / architect・planner=persona} \
|
|
715
|
+
--role {developer|tester|architect|planner(帰属判定)} --outcome failure --gate E-1 \
|
|
716
|
+
--execution {developer・tester=subagent / architect・planner=persona} \
|
|
699
717
|
--complexity {セッションファイルの tier-routing複雑度: 行の値} \
|
|
700
|
-
--tier {developer は省略(frontmatter から自己解決) / architect・planner は親モデルのtier名(haiku/sonnet/opus)。判別不能なら unknown} \
|
|
718
|
+
--tier {developer・tester は省略(frontmatter/tier_selection から自己解決) / architect・planner は親モデルのtier名(haiku/sonnet/opus)。判別不能なら unknown} \
|
|
701
719
|
--note "{帰属理由を1行で(コード断片の逐語引用禁止)}"
|
|
702
720
|
```
|
|
703
721
|
|
|
@@ -789,13 +807,13 @@ python .claude/skills/dev-workflow/scripts/record_agent_outcome.py \
|
|
|
789
807
|
**「全て対応する」の場合:**
|
|
790
808
|
全指摘に `> **[対応予定]**` をマークし、セッションファイルの `- [ ] security-review` を `- [x]` に Edit し、`現在地:` を `現在地: フェーズC 計画中(レビュー差し戻し)` に Edit してから**フェーズ C** へ(内部遷移・Step 0 なし)。
|
|
791
809
|
|
|
792
|
-
**tier-routing 結果記録(帰属判定)**: 指摘内容から最上流起因 role を判定し failure を記録する(デフォルト developer
|
|
810
|
+
**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` も明記する):
|
|
793
811
|
```bash
|
|
794
812
|
python .claude/skills/dev-workflow/scripts/record_agent_outcome.py \
|
|
795
|
-
--role {developer|architect|planner(帰属判定)} --outcome failure --gate E-2 \
|
|
796
|
-
--execution {developer=subagent / architect・planner=persona} \
|
|
813
|
+
--role {developer|tester|architect|planner(帰属判定)} --outcome failure --gate E-2 \
|
|
814
|
+
--execution {developer・tester=subagent / architect・planner=persona} \
|
|
797
815
|
--complexity {セッションファイルの tier-routing複雑度: 行の値} \
|
|
798
|
-
--tier {developer は省略(frontmatter から自己解決) / architect・planner は親モデルのtier名(haiku/sonnet/opus)。判別不能なら unknown} \
|
|
816
|
+
--tier {developer・tester は省略(frontmatter/tier_selection から自己解決) / architect・planner は親モデルのtier名(haiku/sonnet/opus)。判別不能なら unknown} \
|
|
799
817
|
--note "{帰属理由を1行で(コード断片の逐語引用禁止)}"
|
|
800
818
|
```
|
|
801
819
|
|
|
@@ -821,13 +839,13 @@ python .claude/skills/dev-workflow/scripts/record_agent_outcome.py \
|
|
|
821
839
|
```
|
|
822
840
|
4. セッションファイルの `## うまくいったアプローチ` に `[許容例外] {指摘内容} → {許容理由}` の形式で追記し `patterns` に記録する
|
|
823
841
|
5. セッションファイルの `- [ ] security-review` を `- [x]` に Edit し、`現在地:` を `現在地: フェーズC 計画中(レビュー差し戻し)` に Edit してから**フェーズ C** へ(内部遷移・Step 0 なし)。
|
|
824
|
-
6. **tier-routing 結果記録(帰属判定)**: 指摘内容から最上流起因 role を判定し failure を記録する(デフォルト developer
|
|
842
|
+
6. **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` も明記する):
|
|
825
843
|
```bash
|
|
826
844
|
python .claude/skills/dev-workflow/scripts/record_agent_outcome.py \
|
|
827
|
-
--role {developer|architect|planner(帰属判定)} --outcome failure --gate E-2 \
|
|
828
|
-
--execution {developer=subagent / architect・planner=persona} \
|
|
845
|
+
--role {developer|tester|architect|planner(帰属判定)} --outcome failure --gate E-2 \
|
|
846
|
+
--execution {developer・tester=subagent / architect・planner=persona} \
|
|
829
847
|
--complexity {セッションファイルの tier-routing複雑度: 行の値} \
|
|
830
|
-
--tier {developer は省略(frontmatter から自己解決) / architect・planner は親モデルのtier名(haiku/sonnet/opus)。判別不能なら unknown} \
|
|
848
|
+
--tier {developer・tester は省略(frontmatter/tier_selection から自己解決) / architect・planner は親モデルのtier名(haiku/sonnet/opus)。判別不能なら unknown} \
|
|
831
849
|
--note "{帰属理由を1行で(コード断片の逐語引用禁止)}"
|
|
832
850
|
```
|
|
833
851
|
|
|
@@ -14,18 +14,40 @@ Usage:
|
|
|
14
14
|
``required=True``(``SystemExit(2)``)ではなく ``required=False`` + main() 内
|
|
15
15
|
チェックで stderr 警告 + ``return 0``(記録スキップ)とする
|
|
16
16
|
(「全エラー exit 0 流儀」を貫くため。呼び出し元の dev-workflow を止めない)。
|
|
17
|
-
- --tier
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
17
|
+
- --tier 省略時の tier 解決優先順位(architecture-report-20260703-081149.md
|
|
18
|
+
§3-1・ADR-AS-1〜AS-4。tier-routing 自動適用フェーズ2・ソフト適用):
|
|
19
|
+
|
|
20
|
+
| 優先 | ソース | 対象 |
|
|
21
|
+
|----|--------------------------------------------------|-------------------------------|
|
|
22
|
+
| 1 | --tier(明示・TIERS 検証) | 全 role(並列/worktree 経路は常用申告) |
|
|
23
|
+
| 2 | tier_selection.json の tier→suggested_model | _SOFT_APPLY_ROLES(developer)・逐次経路のみ |
|
|
24
|
+
| 3 | agents/{role}.md frontmatter model: | developer 以外、および 2 が不成立の developer |
|
|
25
|
+
| 4 | 解決不能 | 記録スキップ(stderr 警告 + exit 0) |
|
|
26
|
+
|
|
27
|
+
--execution=subagent かつ role が _SOFT_APPLY_ROLES に含まれる場合(現状
|
|
28
|
+
developer のみ)、--tier 省略時は tier_selection.json(select_tier.py が
|
|
29
|
+
UserPromptSubmit で書く推奨/実効 tier の SSOT)の `tier`(無ければ
|
|
30
|
+
`suggested_model`)を ``pricing.resolve_tier`` で正規化し優先 2 として
|
|
31
|
+
採用する。tier_selection.json が無い・値が不正(正規化不能)・role が
|
|
32
|
+
対象外(tester 等)のときは優先 3(frontmatter 自己解決)へ fallback する。
|
|
33
|
+
逸脱時の是正エスケープハッチ(ADR-AS-2): 親が起動時に指定した model: が
|
|
34
|
+
推奨 Tier と異なる場合は必ず --tier に実際の tier を付す運用を dev-workflow
|
|
35
|
+
SKILL.md 側が担う(本スクリプトは優先 1 で受けるのみでコード変更は無い)。
|
|
36
|
+
並列(worktree isolation)経路は wt_developer→developer の記録を親 Claude
|
|
37
|
+
が main リポジトリで実行し、tier_selection.json を読まず常に --tier を
|
|
38
|
+
明示する(ADR-AS-4)。そのため本スクリプトは並列経路向けの追加コードを
|
|
39
|
+
持たず、優先 1(--tier 明示)を共用するだけで足りる。
|
|
40
|
+
--execution=persona は --tier 省略時、frontmatter へも tier_selection.json
|
|
41
|
+
へも fallback せず常に tier="unknown" 固定でイベントログのみ記録する
|
|
42
|
+
(frontmatter/tier_selection は subagent の実使用 tier であり、persona の
|
|
43
|
+
実行時には親モデルが効くため)。
|
|
23
44
|
- --tier を明示した場合は TIERS(haiku/sonnet/opus) に含まれるか検証し、
|
|
24
45
|
含まれなければ警告 + 記録スキップとする。ただし --execution=persona かつ
|
|
25
46
|
--tier unknown は明示的な escape 値として許容する。
|
|
26
|
-
-
|
|
27
|
-
|
|
28
|
-
|
|
47
|
+
- 両 execution モードとも agent_outcomes イベントログに記録する。bandit params は
|
|
48
|
+
読み取り時に agent_outcomes から導出計算される(agent_tier_bandit 削除・
|
|
49
|
+
ADR-25-4)。--execution=persona は親 Claude ペルソナ実行のため frontmatter
|
|
50
|
+
model が効かず tier="unknown" で記録される。
|
|
29
51
|
- dedupe: 同一 (session_id, gate, role, outcome, task) が直近 5 分以内に
|
|
30
52
|
記録済みなら 2 回目は skip。--task は任意引数で、省略時同士は従来通り
|
|
31
53
|
(session_id, gate, role, outcome) のみで判定する(後方互換)。task の
|
|
@@ -85,6 +107,11 @@ _VALID_COMPLEXITIES = ("simple", "medium", "complex")
|
|
|
85
107
|
# db.py の _TIER_BANDIT_TIERS と同じ語彙。SSOT はそちら側にあるが、依存を
|
|
86
108
|
# 増やさないためこのスクリプト内でも同じ値を保持する)。
|
|
87
109
|
_VALID_TIERS = ("haiku", "sonnet", "opus")
|
|
110
|
+
# architecture-report-20260703-081149.md §3-1 / ADR-AS-1: tier_selection.json
|
|
111
|
+
# を tier 解決の SSOT として読む role の一覧(ソフト適用対象)。将来 role を
|
|
112
|
+
# 追加する場合はこのタプルを拡張するだけでよい(SSOT)。tester 等はここに
|
|
113
|
+
# 含めず frontmatter 自己解決のまま(role gating)。
|
|
114
|
+
_SOFT_APPLY_ROLES = ("developer",)
|
|
88
115
|
# Round1 CR-NEW: dedupe キーへ --task を組み込むため、agent_outcomes への
|
|
89
116
|
# task 列追加(migration)はせず note フィールドの先頭にマーカーを埋め込んで
|
|
90
117
|
# 表現する。
|
|
@@ -207,7 +234,9 @@ def _build_parser() -> argparse.ArgumentParser:
|
|
|
207
234
|
)
|
|
208
235
|
parser.add_argument(
|
|
209
236
|
"--tier", default=None,
|
|
210
|
-
help="省略時は
|
|
237
|
+
help="省略時は developer は tier_selection.json(soft-apply・逸脱時は "
|
|
238
|
+
"frontmatter fallback)、それ以外は agents/{role}.md の model: を"
|
|
239
|
+
"自己解決する",
|
|
211
240
|
)
|
|
212
241
|
parser.add_argument("--note", default=None, help="帰属理由等の自由記述")
|
|
213
242
|
parser.add_argument(
|
|
@@ -502,6 +531,10 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
502
531
|
c3_pricing = _load_pricing_module()
|
|
503
532
|
tier_override = args.tier
|
|
504
533
|
|
|
534
|
+
# ADR-AS-1: selection(tier_selection.json)の読み取りは tier 解決より前に
|
|
535
|
+
# 1 度だけ行う(session_id 用読み取りと共用・二重 open 回避)。
|
|
536
|
+
selection = _read_selection()
|
|
537
|
+
|
|
505
538
|
if tier_override is not None:
|
|
506
539
|
if tier_override in _VALID_TIERS:
|
|
507
540
|
tier = tier_override
|
|
@@ -522,7 +555,31 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
522
555
|
# DC-AS-001 の誤帰属がイベントログに再発するため)。
|
|
523
556
|
tier = "unknown"
|
|
524
557
|
else:
|
|
525
|
-
tier =
|
|
558
|
+
tier = None
|
|
559
|
+
# ADR-AS-1 優先 2: role が soft-apply 対象(_SOFT_APPLY_ROLES)なら
|
|
560
|
+
# tier_selection.json の tier(無ければ suggested_model)を
|
|
561
|
+
# resolve_tier で正規化し、_VALID_TIERS に含まれれば採用する。
|
|
562
|
+
# 逐次経路(worktree なし)のみが対象。並列(worktree)経路は親が
|
|
563
|
+
# --tier を明示するため優先 1 で解決され、ここには来ない(ADR-AS-4)。
|
|
564
|
+
if role in _SOFT_APPLY_ROLES and selection is not None:
|
|
565
|
+
soft_apply_raw = selection.get("tier") or selection.get("suggested_model")
|
|
566
|
+
# 非文字列ガード: resolve_tier() は内部で無条件に model.lower() を
|
|
567
|
+
# 呼ぶため、tier_selection.json の破損・レース等で tier/
|
|
568
|
+
# suggested_model が非文字列(int/list/dict 等)だと AttributeError
|
|
569
|
+
# が未捕捉で伝播し、全エラー exit 0 不変を破る。_read_selection() が
|
|
570
|
+
# dict 型を弾くのと同じ防御思想でフィールド型も検証し、非文字列は
|
|
571
|
+
# soft-apply を採らず優先3(frontmatter fallback)へ落とす。
|
|
572
|
+
if (
|
|
573
|
+
isinstance(soft_apply_raw, str)
|
|
574
|
+
and c3_pricing is not None
|
|
575
|
+
):
|
|
576
|
+
resolved = c3_pricing.resolve_tier(soft_apply_raw)
|
|
577
|
+
if resolved in _VALID_TIERS:
|
|
578
|
+
tier = resolved
|
|
579
|
+
if tier is None:
|
|
580
|
+
# 優先 3: frontmatter 自己解決(非対象 role、または soft-apply が
|
|
581
|
+
# 不成立だった developer の fallback)。
|
|
582
|
+
tier = _resolve_tier_from_frontmatter(role, c3_pricing)
|
|
526
583
|
if tier is None:
|
|
527
584
|
print(
|
|
528
585
|
f"[record_agent_outcome] tier unresolved for role={role!r} "
|
|
@@ -541,7 +598,6 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
541
598
|
)
|
|
542
599
|
db_path = None
|
|
543
600
|
|
|
544
|
-
selection = _read_selection()
|
|
545
601
|
session_id = selection.get("session_id") if selection else None
|
|
546
602
|
|
|
547
603
|
if session_id is not None:
|
|
@@ -577,19 +633,10 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
577
633
|
note = _compose_note(note_body, task)
|
|
578
634
|
|
|
579
635
|
try:
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
c3_db.record_agent_outcome_event(
|
|
585
|
-
role=role, complexity=complexity, tier=tier, success=success,
|
|
586
|
-
gate=gate, note=note, session_id=session_id, db_path=db_path,
|
|
587
|
-
)
|
|
588
|
-
else: # persona
|
|
589
|
-
c3_db.record_agent_outcome_event(
|
|
590
|
-
role=role, complexity=complexity, tier=tier, success=success,
|
|
591
|
-
gate=gate, note=note, session_id=session_id, db_path=db_path,
|
|
592
|
-
)
|
|
636
|
+
c3_db.record_agent_outcome_event(
|
|
637
|
+
role=role, complexity=complexity, tier=tier, success=success,
|
|
638
|
+
gate=gate, note=note, session_id=session_id, db_path=db_path,
|
|
639
|
+
)
|
|
593
640
|
except Exception as exc: # noqa: BLE001
|
|
594
641
|
print(
|
|
595
642
|
f"[record_agent_outcome] recording failed: {type(exc).__name__}",
|
|
@@ -144,15 +144,16 @@ plan-report 承認時点で全タスク・agent・writes・prompt が確認済
|
|
|
144
144
|
|
|
145
145
|
| plan-report の agent | 実際に指定する subagent_type | 補足 |
|
|
146
146
|
|---|---|---|
|
|
147
|
-
| `tester` | `wt_tester` | 並列 worktree 専用、`permissionMode: bypassPermissions
|
|
148
|
-
| `developer` | `wt_developer` |
|
|
149
|
-
| `systematic-debugger` | `wt_systematic-debugger` |
|
|
150
|
-
| `code-reviewer` | `code-reviewer` | レビュー専用(ソース編集なし)、`permissionMode: bypassPermissions` を元 agent
|
|
151
|
-
| `security-reviewer` | `security-reviewer` |
|
|
147
|
+
| `tester` | `wt_tester` | 並列 worktree 専用、`permissionMode: bypassPermissions`。**model: 指定対象外**(frontmatter 任せ・ソフト適用対象外) |
|
|
148
|
+
| `developer` | `wt_developer` | 同上。**起動時に推奨 Tier を `model:` 指定(ソフト適用対象・2-C 参照)**。他バリアント(wt_tester / wt_systematic-debugger / reviewer)は対象外 |
|
|
149
|
+
| `systematic-debugger` | `wt_systematic-debugger` | 同上。**model: 指定対象外**(frontmatter 任せ・ソフト適用対象外) |
|
|
150
|
+
| `code-reviewer` | `code-reviewer` | レビュー専用(ソース編集なし)、`permissionMode: bypassPermissions` を元 agent に直接付与。**model: 指定対象外** |
|
|
151
|
+
| `security-reviewer` | `security-reviewer` | 同上。**model: 指定対象外** |
|
|
152
152
|
|
|
153
153
|
各 Agent ツール呼び出しに以下を指定:
|
|
154
154
|
|
|
155
155
|
- `subagent_type`: 上記マッピング表の値
|
|
156
|
+
- `model`: **`wt_developer` タスクのみ** `[tier-routing 推奨]`(developer 基準)の推奨 Tier を指定する(ソフト適用)。この推奨 Tier の SSOT は `.claude/state/tier_selection.json` の `tier`(無ければ `suggested_model`)であり、kickoff の UserPromptSubmit で 1 度確定して以降 wave をまたいで安定する(`[tier-routing 推奨]` の表示テキストはその派生表示)。並列 wave 内に複数の `wt_developer` が居る場合、**全 wt_developer は同一の推奨 Tier(単一 tier_selection.json.tier)で起動される。これは本 MVP の設計として明示的に許容する**(per-task complexity に応じて wt_developer ごとに tier を変える機能は本 MVP のスコープ外・フェーズ 3 以降)。`wt_tester` / `wt_systematic-debugger` / `code-reviewer` / `security-reviewer` は **model: 指定対象外**(frontmatter/元 agent 任せ)。fork は model 上書き不可のため対象外。
|
|
156
157
|
- `isolation`: **`read_only: false` タスクのみ `"worktree"` を指定する。`read_only: true`(code-reviewer / security-reviewer)はソースを変更しないため worktree 不要。`isolation` を省略して main リポジトリで直接実行し、レポートを main の `.claude/reports/` に直接書かせる。**
|
|
157
158
|
> **R5 hook による機械強制**: 上記ルールに違反して `read_only: true` のレビュータスクに `isolation: "worktree"` を指定した場合、`.claude/hooks/check_agent_invocation.py`(PreToolUse Agent hook)が exit 2 でブロックする。詳細は `.claude/skills/dev-workflow/references/plan-design-guidelines.md` R5 参照。
|
|
158
159
|
- `run_in_background`: `true`
|
|
@@ -212,10 +213,23 @@ worktree path は Agent ツール返り値の `<worktree><worktreePath>...</work
|
|
|
212
213
|
- 「スキップして次の wave へ」 → 失敗内容をセッションファイルの `## 試みたが失敗したアプローチ` に追記して次の wave へ
|
|
213
214
|
- 「中断」 → セッションファイルの該当 wave 行は `- [ ]` のままにしてスキル終了
|
|
214
215
|
|
|
215
|
-
**tier-routing 結果記録(失敗タスク)**: 選択肢に関わらず、この wave で失敗した各タスクのうち `wt_developer`/`wt_tester` で起動したものについて、1 タスク = 1 記録で failure を記録する(`wt_developer`→`--role developer`、`wt_tester`→`--role tester`。`--execution subagent`)。`code-reviewer`/`security-reviewer`/`wt_systematic-debugger`
|
|
216
|
+
**tier-routing 結果記録(失敗タスク)**: 選択肢に関わらず、この wave で失敗した各タスクのうち `wt_developer`/`wt_tester` で起動したものについて、1 タスク = 1 記録で failure を記録する(`wt_developer`→`--role developer`、`wt_tester`→`--role tester`。`--execution subagent`)。`code-reviewer`/`security-reviewer`/`wt_systematic-debugger` のタスクは記録対象外。この記録は親 Claude が **main リポジトリ(2-F-0 の `cd <ROOT>` 後)で実行**する。**「スキップして次の wave へ」を選んだ場合も、次の wave に進む前に必ずこの記録を済ませること**(`--complexity` は dev-workflow 開始時の `[tier-routing 推奨]` 表示の複雑度をそのまま渡す。「リトライ」を選び再実行が成功した場合は 1 タスク 1 記録の原則により 2-F-4 で改めて success を記録する=リトライ結果は新たな別記録になる)。
|
|
217
|
+
|
|
218
|
+
**`--tier` の付与ルール(ADR-AS-4・worktree の state 分離対応)**:
|
|
219
|
+
- `wt_developer`→`developer` の記録は **`--tier {当該 wt_developer 起動時に 2-C の model: へ適用した推奨 Tier}` を明示する**(tier_selection.json の worktree 自己解決には依存せず親が申告する)。この値の SSOT は `tier_selection.json.tier`(kickoff で 1 度確定・以降 wave をまたいで安定)で、2-C の `model:` に指定したのと同一値を渡す。並列 wave 内の複数 wt_developer は同一の推奨 Tier を共有する(単一 tier_selection.json・DC-AS-003 で許容済み)。逸脱時(実際に指定した `model:` が推奨 Tier と異なる)はその実際に指定した tier を `--tier` に渡す(並列経路では常に実適用値を申告するため、逸脱の有無に依らず `--tier` を付ける運用に一本化される)。
|
|
220
|
+
- `wt_tester`→`tester` の記録は **`--tier` を付けない**(frontmatter 解決のまま不変。tester はソフト適用対象外)。
|
|
221
|
+
|
|
216
222
|
```bash
|
|
223
|
+
# wt_developer→developer(--tier を明示)
|
|
224
|
+
python .claude/skills/dev-workflow/scripts/record_agent_outcome.py \
|
|
225
|
+
--role developer --outcome failure --gate 2-E \
|
|
226
|
+
--execution subagent --complexity {セッションファイルの tier-routing複雑度: 行の値} \
|
|
227
|
+
--tier {当該 wt_developer 起動時に model: へ適用した推奨 Tier(tier_selection.json.tier と同値)} \
|
|
228
|
+
--task {task_id}
|
|
229
|
+
|
|
230
|
+
# wt_tester→tester(--tier を付けない・frontmatter 解決)
|
|
217
231
|
python .claude/skills/dev-workflow/scripts/record_agent_outcome.py \
|
|
218
|
-
--role
|
|
232
|
+
--role tester --outcome failure --gate 2-E \
|
|
219
233
|
--execution subagent --complexity {セッションファイルの tier-routing複雑度: 行の値} \
|
|
220
234
|
--task {task_id}
|
|
221
235
|
```
|
|
@@ -304,10 +318,21 @@ git branch -D worktree-agent-{id}
|
|
|
304
318
|
'- 成功タスク: {M}件\n- 残 wave: {K}/{TOTAL}\n- 成果物: {要約}')")
|
|
305
319
|
```
|
|
306
320
|
|
|
307
|
-
**tier-routing 結果記録(成功タスクのみ)**: この wave で成功した各タスクのうち `wt_developer`/`wt_tester` で起動したものについて、1 タスク = 1 記録で success を記録する(`wt_developer`→`--role developer`、`wt_tester`→`--role tester`。`--execution subagent`)。`code-reviewer`/`security-reviewer`/`wt_systematic-debugger` のタスクは記録対象外(`--complexity` は dev-workflow 開始時の `[tier-routing 推奨]`
|
|
321
|
+
**tier-routing 結果記録(成功タスクのみ)**: この wave で成功した各タスクのうち `wt_developer`/`wt_tester` で起動したものについて、1 タスク = 1 記録で success を記録する(`wt_developer`→`--role developer`、`wt_tester`→`--role tester`。`--execution subagent`)。`code-reviewer`/`security-reviewer`/`wt_systematic-debugger` のタスクは記録対象外(`--complexity` は dev-workflow 開始時の `[tier-routing 推奨]` 表示の複雑度をそのまま渡す)。この記録は親 Claude が **main リポジトリ(2-F-0 の `cd <ROOT>` 後)で実行**する。
|
|
322
|
+
|
|
323
|
+
**`--tier` の付与ルール(ADR-AS-4・2-E と同一)**: `wt_developer`→`developer` は **`--tier {当該 wt_developer 起動時に 2-C の model: へ適用した推奨 Tier(tier_selection.json.tier と同値)}` を明示**する(worktree 自己解決に依存しない・並列 wave 内の複数 wt_developer は同一 tier を共有〈DC-AS-003〉・逸脱時は実際に指定した tier を渡す)。`wt_tester`→`tester` は **`--tier` を付けない**(frontmatter 解決のまま不変・ソフト適用対象外)。
|
|
324
|
+
|
|
308
325
|
```bash
|
|
326
|
+
# wt_developer→developer(--tier を明示)
|
|
327
|
+
python .claude/skills/dev-workflow/scripts/record_agent_outcome.py \
|
|
328
|
+
--role developer --outcome success --gate 2-D \
|
|
329
|
+
--execution subagent --complexity {セッションファイルの tier-routing複雑度: 行の値} \
|
|
330
|
+
--tier {当該 wt_developer 起動時に model: へ適用した推奨 Tier(tier_selection.json.tier と同値)} \
|
|
331
|
+
--task {task_id}
|
|
332
|
+
|
|
333
|
+
# wt_tester→tester(--tier を付けない・frontmatter 解決)
|
|
309
334
|
python .claude/skills/dev-workflow/scripts/record_agent_outcome.py \
|
|
310
|
-
--role
|
|
335
|
+
--role tester --outcome success --gate 2-D \
|
|
311
336
|
--execution subagent --complexity {セッションファイルの tier-routing複雑度: 行の値} \
|
|
312
337
|
--task {task_id}
|
|
313
338
|
```
|
|
@@ -1,5 +1,47 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [2.43.0] - 2026-07-03
|
|
4
|
+
|
|
5
|
+
### 変更
|
|
6
|
+
|
|
7
|
+
- **tier-routing 学習シグナルの客観化と bandit のイベントログ導出化(フェーズ2.5)**: v2.42.0 ソフト適用の実運用で確定した 2 つの構造問題(escalation×ソフト適用による sonnet 探索閉塞デッドロック・レビュー指摘由来の失敗シグナルがモデル能力とタスク難度と レビュワー厳しさの混合物になる問題)を解消する。
|
|
8
|
+
- **失敗シグナルの客観化**: bandit(推奨算出)と escalation の failure rate に集計されるのは `BANDIT_GATES`(D-2.5 / D-3 / D-5 / D-2.5-stuck)の客観ゲートのみになった。E-1/E-2 レビュー指摘由来の記録は**イベントログとして保存を継続**しつつ、集計からは成功・失敗とも対称に除外する(developer の仕事は「動く実装」であり「レビュワーに指摘されない実装」ではない、というシグナル哲学)。
|
|
9
|
+
- **bandit のイベントログ導出化**: `read_agent_tier_params` は `agent_outcomes` イベントログからの導出集計(gate フィルタ付き GROUP BY・placeholder は `len(BANDIT_GATES)` から動的生成)になった。シグナル定義の変更が**過去ログへ遡及適用**されるため、今後の調整で学習データのリセットが不要になる。戻り値契約は不変で select_tier.py / `c3 tier stats` は無改修。
|
|
10
|
+
- **失敗率の時間ベース窓**: `read_agent_failure_rate` の窓が「直近 N 件」から「時間ベース」(`C3_FAILURE_WINDOW_DAYS`・既定 14 日)になった。古い失敗が失効 → サンプル 5 件未満で escalation 停止 → 敗者復活が自然に働き、sonnet 閉塞が解消される(実機で `(None, 1)`・escalation 非発動を確認済み)。
|
|
11
|
+
- **stuck failure の新設**: dev-workflow D-2.5 が `debug-needed-*.md` 検出時(削除前)に `--gate D-2.5-stuck` で developer failure を記録する。「その tier が自力で完走できなかった」という最も客観的な能力シグナル。
|
|
12
|
+
- `record_agent_outcome.py` はイベント記録のみに簡素化(bandit 更新呼び出しを削除)。
|
|
13
|
+
|
|
14
|
+
### 破壊的変更
|
|
15
|
+
|
|
16
|
+
- **旧学習テーブル `agent_tier_bandit` を DROP**(migration 005 が `c3 update` 後の session 開始時に自動適用)。累積 α/β は `agent_outcomes` からの導出に置き換わるため**学習データ自体は失われない**(イベントログから新ルールで即再計算される)。
|
|
17
|
+
- **`src/c3/db.py` の `update_agent_tier_params` を削除**(bandit は書き込み更新されず読み取り時導出になったため)。
|
|
18
|
+
- **v2.41.0 で deprecated 化したシム 5 関数を削除**: `read_tier_params` / `read_tier_failure_rate` / `update_tier_params` / `record_tier_recent_outcome` / `sync_tier_bandit_cost`(予告どおりの削除。直接呼んでいるカスタマイズは移行が必要)。
|
|
19
|
+
- **`read_agent_failure_rate` のシグネチャ変更**: `last_n` 引数を撤去し `window_days`(時間窓)に置換。
|
|
20
|
+
|
|
21
|
+
### 後方互換
|
|
22
|
+
|
|
23
|
+
- `read_agent_tier_params` の戻り値契約(`{tier: (alpha, beta, trials)}`・初期値・DB 不在フォールバック)は不変。環境変数(`C3_TIER_EPSILON` / `C3_TIER_COST_LAMBDA` / `C3_ESCALATION_THRESHOLD`)・`LEARNING_THRESHOLD=30`・cost-aware tie-break・ソフト適用(v2.42.0)のロジックは不変。新 env `C3_FAILURE_WINDOW_DAYS` は任意設定(未設定時 14 日)。
|
|
24
|
+
- 集計対象 gate の限定により `c3 tier stats` の trials 表示は従来より少なくなる(正しいデータでの数え直しであり意図した挙動)。レビュワー系 role(E gate の記録しか持たない role)は bandit 上恒久 uniform 表示になる。
|
|
25
|
+
|
|
26
|
+
## [2.42.0] - 2026-07-03
|
|
27
|
+
|
|
28
|
+
### 追加
|
|
29
|
+
|
|
30
|
+
- **tier-routing ソフト適用(フェーズ2)**: 推奨 Tier を「表示のみ」から「適用指示」に前進させた。`select_tier.py` の additionalContext が「developer / wt_developer を Agent ツールで起動する際は `model:` を明示指定して推奨 Tier を適用すること」という親 Claude への行動指示を出す(uniform 期=学習データ収集中も適用・fork は model 上書き不可のため対象外・tester 等の他 role と親 Claude ペルソナ role は対象外)。
|
|
31
|
+
- **学習記録の帰属整合(ADR-AS-1)**: `record_agent_outcome.py` の developer subagent 記録(`--tier` 省略時)は、frontmatter 自己解決より先に `tier_selection.json` の `tier`(→`suggested_model`)を SSOT として機械解決する。tier 値の LLM 申告をゼロに保ったまま、ソフト適用で haiku/opus を実行した探索データを正しいセルに帰属できる(frontmatter は sonnet 固定のため従来方式では表現不能だった)。非文字列ガード・`resolve_tier` 正規化・TIERS ホワイトリストの三段検証付きで、不成立時は frontmatter fallback。
|
|
32
|
+
- **並列(worktree)経路は `--tier` 明示(ADR-AS-4)**: `.claude/state/` は gitignored で worktree に複製されないため、parallel-agents の wt_developer→developer 記録は親 Claude が起動時に適用した推奨 Tier と同値を `--tier` で明示する(record スクリプトのコード変更なしで state 分離問題を経路設計で回避)。
|
|
33
|
+
- **エスケープハッチの機械条件化(ADR-AS-2)**: 「起動時に指定した `model:` が推奨 Tier と異なる場合は必ず同値を `--tier` に付す」という観測可能な二値条件に統一(旧「意図的に」という主観語を廃止)。
|
|
34
|
+
- **実機検証済み**: worktree isolation 下でも Agent 呼び出しの `model:` 上書きが有効であること(frontmatter sonnet の wt_developer が haiku で稼働)、記録 tier と実使用 tier の一致(`c3 tier stats`)を実測確認。
|
|
35
|
+
|
|
36
|
+
### 変更
|
|
37
|
+
|
|
38
|
+
- **レビュー指摘時の帰属語彙に tester を追加**: dev-workflow の E-1/E-2 帰属判定を `{developer|architect|planner}` から `{developer|tester|architect|planner}` に拡張し(テストコード欠陥起因の指摘は tester failure)、D-3 不合格時の記録も D-5 と同じ欠陥所在判定(tester|developer)に統一。従来はテスト起因の指摘でも developer に failure が付く誤帰属だった。
|
|
39
|
+
|
|
40
|
+
### 後方互換
|
|
41
|
+
|
|
42
|
+
- `tier_selection.json` が存在しない・`tier` フィールドを持たない環境では従来どおり frontmatter 自己解決に fallback する。環境変数(`C3_TIER_EPSILON` / `C3_TIER_COST_LAMBDA` / `C3_ESCALATION_THRESHOLD`)・`LEARNING_THRESHOLD=30`・cost-aware tie-break・DB スキーマ・公開 API/CLI に変更なし。**破壊的変更なし**。
|
|
43
|
+
- v2.41.0 で「次リリースで削除予定」とした `src/c3/db.py` の deprecated シム(`read_tier_params` / `read_tier_failure_rate` / `update_tier_params` / `record_tier_recent_outcome` / `sync_tier_bandit_cost`)は本リリースでは削除せず残置する(本リリースは `.claude/` 側のみの変更で src/c3 に触れないため。削除は次の src/c3 改修リリースで実施)。
|
|
44
|
+
|
|
3
45
|
## [2.41.0] - 2026-07-03
|
|
4
46
|
|
|
5
47
|
### 変更
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: claude-code-conductor
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.43.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
|
|
@@ -46,6 +46,18 @@ COST_LAMBDA_MAX = 5.0
|
|
|
46
46
|
# record_agent_outcome.py の --role 検証・cli_tier.py の role 別表示グルーピングが参照する。
|
|
47
47
|
AGENT_ROLES: tuple[str, ...] = ("interviewer", "architect", "planner", "developer", "tester")
|
|
48
48
|
|
|
49
|
+
# bandit 集計・escalation failure_rate でカウントする客観 gate の SSOT(フェーズ2.5・ADR-25-1)。
|
|
50
|
+
# D-2.5=実装完了 / D-3・D-5=テスト合否(「動く実装」の直接測定) / D-2.5-stuck=自力完走不能。
|
|
51
|
+
# E-1/E-2(レビュー指摘由来)は success/failure とも対称に除外する(含めない)。
|
|
52
|
+
# db.py の read_agent_tier_params / read_agent_failure_rate が read-side でのみ参照する
|
|
53
|
+
# (record 側は全 gate を無条件記録するため参照不要)。
|
|
54
|
+
BANDIT_GATES: tuple[str, ...] = ("D-2.5", "D-3", "D-5", "D-2.5-stuck")
|
|
55
|
+
|
|
56
|
+
# escalation failure_rate 計算の時間窓デフォルト(日数・フェーズ2.5・ADR-25-2)。
|
|
57
|
+
# C3_FAILURE_WINDOW_DAYS 環境変数で上書き可。妥当域は半開区間 (0, 3650](0 拒否・上限 10 年)。
|
|
58
|
+
# 本定数が SSOT(read_agent_failure_rate がここから解決する)。
|
|
59
|
+
FAILURE_WINDOW_DAYS_DEFAULT = 14.0
|
|
60
|
+
|
|
49
61
|
|
|
50
62
|
def _resolve_float_env(
|
|
51
63
|
env_key: str,
|
|
@@ -146,3 +158,22 @@ def resolve_escalation_threshold() -> float:
|
|
|
146
158
|
)
|
|
147
159
|
# default=ESCALATION_THRESHOLD_DEFAULT のため None になり得ない(戻り値型を float に絞る)
|
|
148
160
|
return cast(float, value)
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
def resolve_failure_window_days() -> float:
|
|
164
|
+
"""``C3_FAILURE_WINDOW_DAYS`` を安全に解決する(read_agent_failure_rate 用 SSOT)。
|
|
165
|
+
|
|
166
|
+
妥当域: (0, 3650](x=0 拒否の半開区間・上限 10 年で過大窓を弾く)。
|
|
167
|
+
default が float のため戻り値は常に float。
|
|
168
|
+
詳細な共通挙動は :func:`_resolve_float_env` を参照。
|
|
169
|
+
"""
|
|
170
|
+
value = _resolve_float_env(
|
|
171
|
+
"C3_FAILURE_WINDOW_DAYS",
|
|
172
|
+
FAILURE_WINDOW_DAYS_DEFAULT,
|
|
173
|
+
min_val=0.0,
|
|
174
|
+
max_val=3650.0,
|
|
175
|
+
min_inclusive=False,
|
|
176
|
+
log_prefix="[c3:failure_window]",
|
|
177
|
+
)
|
|
178
|
+
# default=FAILURE_WINDOW_DAYS_DEFAULT のため None になり得ない(戻り値型を float に絞る)
|
|
179
|
+
return cast(float, value)
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
tier-routing (Phase 2 完成) の効果計測用ダッシュボード。
|
|
4
4
|
|
|
5
5
|
主な機能:
|
|
6
|
-
- ``c3 tier stats``: role 別 complexity × tier
|
|
7
|
-
直近 outcome
|
|
6
|
+
- ``c3 tier stats``: role 別 complexity × tier の bandit params(agent_outcomes からの導出集計)と
|
|
7
|
+
直近 outcome を表形式表示
|
|
8
8
|
- ``c3 tier stats --json``: 機械可読 JSON 出力
|
|
9
9
|
- ``c3 tier stats --recent N``: 直近 outcome の表示件数を変更(デフォルト 10)
|
|
10
10
|
- ``c3 tier stats --role <role>``: 指定 role のみに絞り込む
|
|
@@ -13,8 +13,7 @@ tier-routing (Phase 2 完成) の効果計測用ダッシュボード。
|
|
|
13
13
|
- PO 廃止前の ``c3 status`` CLI パターンを踏襲(旧 ``cli_status.py`` / v2.0.0 で削除)
|
|
14
14
|
- データがゼロでも「収集中」と分かる表示にする
|
|
15
15
|
- escalation 発動回数は専用テーブルがないため今回は表示なし(将来拡張余地)
|
|
16
|
-
- v2.41.0 cli-tier-stats タスクで role 次元(
|
|
17
|
-
に対応。旧フラット tier_bandit / learning_progress / tier_cost(session 合計
|
|
16
|
+
- v2.41.0 cli-tier-stats タスクで role 次元(agent_outcomes)に対応。旧フラット tier_bandit / learning_progress / tier_cost(session 合計
|
|
18
17
|
USD 概算セクション)は廃止(architecture-report-20260702-214748.md §3-7)
|
|
19
18
|
"""
|
|
20
19
|
|