claude-code-conductor 2.53.0__tar.gz → 2.54.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.53.0 → claude_code_conductor-2.54.0}/.claude/hooks/select_tier.py +74 -9
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/hooks/tier_autoapply.py +82 -8
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/hooks/tier_gap_check.py +4 -3
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/skills/dev-workflow/SKILL.md +48 -5
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/skills/dev-workflow/scripts/record_agent_outcome.py +113 -22
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/skills/parallel-agents/SKILL.md +41 -16
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/CHANGELOG.md +20 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/PKG-INFO +1 -1
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/src/c3/__init__.py +1 -1
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/src/c3/_db_params.py +32 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/src/c3/db.py +35 -18
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/hooks/test_record_agent_outcome.py +243 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/hooks/test_select_tier.py +143 -2
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/hooks/test_tier_autoapply.py +296 -0
- claude_code_conductor-2.54.0/tests/skills/test_marker_compliance.py +153 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/test_cli_tier.py +4 -1
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/test_db.py +151 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/CLAUDE.md +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/agents/architect.md +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/agents/code-reviewer.md +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/agents/design-critic.md +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/agents/developer.md +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/agents/doc-writer.md +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/agents/interviewer.md +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/agents/planner.md +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/agents/project-setup.md +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/agents/security-reviewer.md +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/agents/systematic-debugger.md +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/agents/tester.md +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/agents/wt_developer.md +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/agents/wt_systematic-debugger.md +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/agents/wt_tester.md +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/breaking-changes.txt +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/deletions.txt +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/docs/autonomous-mode-onboarding.md +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/docs/config-policy.md +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/docs/nul-boundary.md +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/docs/parallel-agents-setup.md +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/docs/platform-adapters.md +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/docs/settings.json.md +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/hooks/_hook_utils.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/hooks/check_agent_invocation.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/hooks/consolidate_memory.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/hooks/permission_handler.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/hooks/permission_handler_toast.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/hooks/planner_check.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/hooks/post_tool.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/hooks/pre_compact.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/hooks/pre_tool.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/hooks/recall_autorebuild.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/hooks/recall_inject.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/hooks/restore_session.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/hooks/session_start.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/hooks/session_stop.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/hooks/session_utils.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/hooks/statusline.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/hooks/stop.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/hooks/worktree_guard.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/memory/.gitkeep +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/permission_rules.json +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/rules/promoted/index.md +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/settings.json +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/skills/autonomous-mode/SKILL.md +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/skills/autonomous-mode/scripts/mode_line.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/skills/brainstorm/SKILL.md +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/skills/codex-review/SKILL.md +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/skills/dev-workflow/references/code-review-checklist.md +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/skills/dev-workflow/references/design-critic-rubric.md +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/skills/dev-workflow/references/design-rubric.md +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/skills/dev-workflow/references/interview-rubric.md +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/skills/dev-workflow/references/plan-design-guidelines.md +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/skills/dev-workflow/references/security-review-checklist.md +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/skills/dev-workflow/scripts/record_review_decision.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/skills/dev-workflow/scripts/review_hint_inject.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/skills/develop/SKILL.md +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/skills/doc/SKILL.md +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/skills/extract-lib/SKILL.md +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/skills/init-session/SKILL.md +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/skills/init-session/scripts/session_guard.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/skills/mcp-config/SKILL.md +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/skills/pattern-status/SKILL.md +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/skills/promote-pattern/SKILL.md +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/skills/recall/SKILL.md +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/skills/report-timestamp/SKILL.md +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/skills/report-timestamp/scripts/get_timestamp.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/skills/review-phase/SKILL.md +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/skills/setup/SKILL.md +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/skills/setup/reference.md +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/skills/setup/templates/coding-standards-template.md +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/skills/setup/templates/project-conventions-template.md +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/skills/start/SKILL.md +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/state/.gitkeep +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.gitignore +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/ARCHITECTURE.md +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/LICENSE +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/LICENSES/fastembed-LICENSE +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/LICENSES/fastembed-NOTICE +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/LICENSES/numpy-LICENSE +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/LICENSES/onnxruntime-LICENSE +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/LICENSES/paraphrase-multilingual-MiniLM-L12-v2-LICENSE +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/README.md +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/hatch_build.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/pyproject.toml +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/src/c3/__main__.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/src/c3/_excludes.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/src/c3/_terminal.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/src/c3/adapters.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/src/c3/cli.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/src/c3/cli_ask.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/src/c3/cli_doctor.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/src/c3/cli_init.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/src/c3/cli_list.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/src/c3/cli_metrics.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/src/c3/cli_plan.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/src/c3/cli_recall.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/src/c3/cli_run.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/src/c3/cli_tier.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/src/c3/cli_update.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/src/c3/embedding.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/src/c3/gitutil.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/src/c3/mcp_server.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/src/c3/migrate.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/src/c3/migrations/001_initial.sql +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/src/c3/migrations/002_agent_cost_runs.sql +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/src/c3/migrations/003_tier_cost.sql +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/src/c3/migrations/004_agent_outcomes.sql +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/src/c3/migrations/005_drop_agent_tier_bandit.sql +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/src/c3/migrations/006_review_decisions_severity.sql +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/src/c3/migrations/README.md +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/src/c3/migrations/__init__.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/src/c3/paths.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/src/c3/plan_validator.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/src/c3/platforms.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/src/c3/pricing.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/src/c3/question.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/src/c3/recall_chunker.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/src/c3/recall_index.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/src/c3/usage_ingester.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/__init__.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/_pre_compact_helpers.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/conftest.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/fixtures/usage/README.md +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/fixtures/usage/mainline.jsonl +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/fixtures/usage/subagents/agent-deadbeef.jsonl +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/fixtures/usage/subagents/agent-deadbeef.meta.json +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/hooks/__init__.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/hooks/test_check_agent_invocation.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/hooks/test_consolidate_memory.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/hooks/test_hook_utils.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/hooks/test_permission_handler.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/hooks/test_permission_handler_toast.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/hooks/test_pip_reinstall_reminder.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/hooks/test_planner_check.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/hooks/test_planner_check_dev.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/hooks/test_post_tool.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/hooks/test_pre_tool.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/hooks/test_recall_autorebuild.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/hooks/test_recall_inject.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/hooks/test_record_review_decision.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/hooks/test_restore_session.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/hooks/test_review_hint_inject.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/hooks/test_select_tier_escalation.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/hooks/test_session_start.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/hooks/test_session_stop.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/hooks/test_session_utils.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/hooks/test_settings_local_absolute_paths.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/hooks/test_settings_tier_autoapply_registration.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/hooks/test_similarity_boost.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/hooks/test_statusline.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/hooks/test_statusline_template_sync.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/hooks/test_sync_check.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/hooks/test_template_guard.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/hooks/test_tier_gap_check.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/hooks/test_tier_security_fixes.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/skills/__init__.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/skills/_skill_helpers.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/skills/test_dev_workflow_no_task_type.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/skills/test_init_session_no_task_type.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/skills/test_parallel_agents_skill_tier.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/skills/test_planner_lightweight.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/skills/test_recall_skill.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/skills/test_session_backlog_reconciliation.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/skills/test_session_guard.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/skills/test_setup_templates.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/skills/test_start_skill_bugfix_flow.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/skills/test_start_skill_new_flow.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/skills/test_start_skill_security_audit_phase.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/test_adapters.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/test_check_deletions.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/test_cli_ask.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/test_cli_doctor.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/test_cli_doctor_launcher.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/test_cli_entry.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/test_cli_init.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/test_cli_list.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/test_cli_metrics.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/test_cli_plan.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/test_cli_recall.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/test_cli_run.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/test_cli_update_breaking_changes.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/test_cli_update_deletions.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/test_docstring_consistency.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/test_embedding.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/test_excludes.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/test_extract_breaking_changes.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/test_gitutil.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/test_mcp_server_elicit.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/test_migrate.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/test_mode_line.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/test_no_bare_python_launcher.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/test_nul_boundary_lint.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/test_paths.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/test_plan_validator.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/test_pre_compact.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/test_pre_tool_hook.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/test_precompact_additional.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/test_precompact_toctou_fixes.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/test_pricing.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/test_recall_chunker.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/test_recall_index.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/test_references_migration.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/test_session_utils_additional.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/test_skill_no_builtin_conflict.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/test_statusline.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/test_stop_additional.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/test_stop_hook.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/test_stop_precompact_fixes.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/test_sync_template_stop.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/test_template_pre_tool_hook.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/test_usage_ingester.py +0 -0
- {claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/tests/test_worktree_guard.py +0 -0
|
@@ -12,9 +12,17 @@ tier-routing MVP: タスクの複雑度を簡易ヒューリスティックで
|
|
|
12
12
|
推奨の提示と tier_selection.json への記録のみを担い、model の注入は
|
|
13
13
|
tier_autoapply.py が行う。明示指定された `model:` は tier_autoapply が
|
|
14
14
|
尊重して上書きしない。agent の `model:` フロントマター自体は変更しない
|
|
15
|
-
-
|
|
15
|
+
- **やる(ADR-3〜ADR-5 拡張)**: tester(Red) 推奨を additive な ``roles.tester``
|
|
16
|
+
キーとして tier_selection.json に併記する。tester / wt_tester は test- タスク
|
|
17
|
+
(Red フェーズ)に限り tier_autoapply が機械適用する(D-3/D-5 等の非 Red 起動は
|
|
18
|
+
従来どおり frontmatter 任せ)。
|
|
19
|
+
- **やらない**: developer / wt_developer / tester(Red) 以外の role への適用、
|
|
16
20
|
フォールバック(Haiku 失敗→Sonnet 自動昇格)
|
|
17
21
|
|
|
22
|
+
【opus 固定不変則(ADR-6)】機械適用(APPLY_ROLES / RED_APPLY_ROLES)に追加できるのは
|
|
23
|
+
frontmatter ``model: sonnet`` の role のみ。opus frontmatter の agent(architect /
|
|
24
|
+
planner / design-critic / doc-writer / project-setup)は tier レバーを持たず恒久対象外。
|
|
25
|
+
|
|
18
26
|
学習データ(帰属機械化・フェーズ3):
|
|
19
27
|
- 結果は ``.claude/state/tier_selection.json`` に直近 1 件のみ書き込む
|
|
20
28
|
- Agent 起動時に ``tier_autoapply.py`` が実適用 model を
|
|
@@ -451,15 +459,20 @@ _ESCALATION_MAP: dict[str, str] = {
|
|
|
451
459
|
# SSOT: db.ESCALATION_THRESHOLD_DEFAULT 由来(import 部で取得)。C3_ESCALATION_THRESHOLD env で上書き可(v2.26.0)。
|
|
452
460
|
|
|
453
461
|
|
|
454
|
-
def _db_failure_rate(complexity: str, tier: str) -> tuple:
|
|
462
|
+
def _db_failure_rate(complexity: str, tier: str, role: str = "developer") -> tuple:
|
|
455
463
|
"""DB から failure rate を読み取るデフォルト実装。
|
|
456
464
|
|
|
465
|
+
``role`` は集計対象の agent role(既定 ``"developer"``・後方互換)。
|
|
466
|
+
ADR-5: tester 推奨の escalation では ``role="tester"`` を渡し
|
|
467
|
+
``read_agent_failure_rate("tester", ...)`` を引く(role 別 gate 集合は
|
|
468
|
+
db 側 ``bandit_gates_for_role`` が解決する)。
|
|
469
|
+
|
|
457
470
|
c3_db のインポートに失敗した場合は ``(None, 0)`` を返す。
|
|
458
471
|
"""
|
|
459
472
|
c3_db = _load_c3_db_module()
|
|
460
473
|
if c3_db is None:
|
|
461
474
|
return None, 0
|
|
462
|
-
return c3_db.read_agent_failure_rate(
|
|
475
|
+
return c3_db.read_agent_failure_rate(role, complexity, tier)
|
|
463
476
|
|
|
464
477
|
|
|
465
478
|
def maybe_escalate(
|
|
@@ -468,6 +481,7 @@ def maybe_escalate(
|
|
|
468
481
|
*,
|
|
469
482
|
failure_rate_fn=None,
|
|
470
483
|
threshold: float | None = None,
|
|
484
|
+
role: str = "developer",
|
|
471
485
|
) -> tuple[str, str | None]:
|
|
472
486
|
"""Phase 2-B: failure rate が高ければ 1 段昇格する。
|
|
473
487
|
|
|
@@ -476,10 +490,15 @@ def maybe_escalate(
|
|
|
476
490
|
chosen_tier: select_tier が選んだ tier。
|
|
477
491
|
failure_rate_fn: テスト用に注入可能な
|
|
478
492
|
``(complexity, tier) -> (rate_or_None, sample_count)``。
|
|
479
|
-
省略時は :func:`_db_failure_rate`
|
|
493
|
+
省略時は :func:`_db_failure_rate` を使う。既存の注入契約(2 引数)を
|
|
494
|
+
保つため、注入時は ``role`` を渡さない(テストは戻り値を固定するため
|
|
495
|
+
role 分岐は不要)。role は既定実装 ``_db_failure_rate`` へのみ透過する。
|
|
480
496
|
threshold: escalation 閾値(failure rate がこの値以上で昇格)。
|
|
481
497
|
None のとき module 定数 ``ESCALATION_THRESHOLD`` を使う。
|
|
482
498
|
``main()`` は ``_resolve_escalation_threshold()`` で解決した値を渡す。
|
|
499
|
+
role: 集計対象の agent role(既定 ``"developer"``)。ADR-5: tester 推奨の
|
|
500
|
+
escalation では ``role="tester"`` を渡して ``_db_failure_rate`` 経由で
|
|
501
|
+
tester セルの failure rate を引く。
|
|
483
502
|
|
|
484
503
|
Returns:
|
|
485
504
|
``(effective_tier, escalation_reason)``。
|
|
@@ -489,8 +508,10 @@ def maybe_escalate(
|
|
|
489
508
|
if chosen_tier not in _ESCALATION_MAP:
|
|
490
509
|
return chosen_tier, None
|
|
491
510
|
|
|
492
|
-
|
|
493
|
-
|
|
511
|
+
if failure_rate_fn is not None:
|
|
512
|
+
rate, samples = failure_rate_fn(complexity, chosen_tier)
|
|
513
|
+
else:
|
|
514
|
+
rate, samples = _db_failure_rate(complexity, chosen_tier, role)
|
|
494
515
|
eff_threshold = threshold if threshold is not None else ESCALATION_THRESHOLD
|
|
495
516
|
if rate is None or rate < eff_threshold:
|
|
496
517
|
return chosen_tier, None
|
|
@@ -516,6 +537,7 @@ def write_tier_selection(
|
|
|
516
537
|
cost_tiebreak: bool = False,
|
|
517
538
|
cost_weighted: bool = False,
|
|
518
539
|
cost_lambda: float | None = None,
|
|
540
|
+
roles: dict[str, dict] | None = None,
|
|
519
541
|
) -> None:
|
|
520
542
|
"""直近の選択結果を ``tier_selection.json`` に書く。
|
|
521
543
|
|
|
@@ -543,6 +565,13 @@ def write_tier_selection(
|
|
|
543
565
|
``cost_lambda`` を任意で含める(v2.26.0)。
|
|
544
566
|
``_resolve_cost_lambda()`` で解決した λ 値(None 以外のとき出力)。
|
|
545
567
|
None のときはキー自体を省略する(env 未設定時の後方互換)。
|
|
568
|
+
|
|
569
|
+
``roles`` を任意で含める(ADR-3・additive role 別推奨)。
|
|
570
|
+
``{"tester": {"tier": <実効 tier>, "mode": <mode>, "escalated"?: True}}`` の形。
|
|
571
|
+
None(渡されない)のときはキー自体を省略する(session_id / cost_tiebreak と
|
|
572
|
+
同じ additive-omit パターン=トップレベルの bit 一致を保つ後方互換の核心)。
|
|
573
|
+
トップレベルの ``tier`` / ``mode`` は現行どおり developer 推奨を書き、
|
|
574
|
+
``roles.tester`` は新読者(tier_autoapply 注入・record 優先 3)だけが見る。
|
|
546
575
|
"""
|
|
547
576
|
os.makedirs(os.path.dirname(TIER_SELECTION_PATH), exist_ok=True)
|
|
548
577
|
payload: dict[str, object] = {
|
|
@@ -570,6 +599,8 @@ def write_tier_selection(
|
|
|
570
599
|
payload["cost_weighted"] = True
|
|
571
600
|
if cost_lambda is not None:
|
|
572
601
|
payload["cost_lambda"] = cost_lambda
|
|
602
|
+
if roles is not None:
|
|
603
|
+
payload["roles"] = roles
|
|
573
604
|
try:
|
|
574
605
|
with open(TIER_SELECTION_PATH, "w", encoding="utf-8") as f:
|
|
575
606
|
json.dump(payload, f, ensure_ascii=False)
|
|
@@ -588,6 +619,7 @@ def build_additional_context(
|
|
|
588
619
|
complexity_source: str | None = None,
|
|
589
620
|
cost_tiebreak: bool = False,
|
|
590
621
|
cost_weighted: bool = False,
|
|
622
|
+
tester_tier: str | None = None,
|
|
591
623
|
) -> str:
|
|
592
624
|
"""親 Claude に追加注入する文字列を組み立てる。
|
|
593
625
|
|
|
@@ -597,6 +629,11 @@ def build_additional_context(
|
|
|
597
629
|
``cost_weighted`` が True のとき、cost-weighted 文言を suffix に追加する(v2.26.0)。
|
|
598
630
|
True のときは cost_tiebreak の文言より優先される(λ>0 全 tier weighting を明示)。
|
|
599
631
|
False のときは cost_tiebreak による既存文言のみ(v2.25.0 以前と完全一致)。
|
|
632
|
+
|
|
633
|
+
``tester_tier`` が渡された場合、tester(Red) 推奨 Tier を併記する(ADR-4)。
|
|
634
|
+
None(既定)のときは併記行を省略する(build_additional_context を直接呼ぶ
|
|
635
|
+
既存テストの後方互換)。tester / wt_tester は test- タスク(Red)に限り機械適用
|
|
636
|
+
対象であることを対象説明に明記する。
|
|
600
637
|
"""
|
|
601
638
|
trials = sum(p[2] for p in params.values())
|
|
602
639
|
if mode == "uniform":
|
|
@@ -615,6 +652,10 @@ def build_additional_context(
|
|
|
615
652
|
elif cost_tiebreak:
|
|
616
653
|
suffix += " [cost-aware: 成功率拮抗のため低コスト Tier を選択]"
|
|
617
654
|
|
|
655
|
+
tester_note = ""
|
|
656
|
+
if tester_tier is not None:
|
|
657
|
+
tester_note = f" tester(Red) 推奨 Tier: {tester_tier}。"
|
|
658
|
+
|
|
618
659
|
return (
|
|
619
660
|
f"[tier-routing 推奨] 複雑度: {complexity} / 推奨 Tier: {tier}({confidence}・developer 基準)。"
|
|
620
661
|
f" developer / wt_developer を Agent ツールで起動する際は、PreToolUse hook"
|
|
@@ -622,9 +663,12 @@ def build_additional_context(
|
|
|
622
663
|
f"(親 Claude が model: を転記する必要はありません・学習データ収集中の期間も含め常に適用)。"
|
|
623
664
|
f" 推奨と異なる Tier を使いたい場合のみ、Agent 呼び出し時に model: を明示指定してください"
|
|
624
665
|
f"(明示指定は尊重され hook に上書きされません。fork は model 上書き不可のため対象外)。"
|
|
625
|
-
f"
|
|
626
|
-
f"
|
|
627
|
-
f"
|
|
666
|
+
f"{tester_note}"
|
|
667
|
+
f" tester / wt_tester は test- タスク(Red フェーズ)に限り機械適用対象です"
|
|
668
|
+
f"(C3_TASK_ID: test-... マーカー付き起動のみ・D-3/D-5 等の非 Red 起動は"
|
|
669
|
+
f" 従来どおり frontmatter 任せ)。親 Claude ペルソナで動かす role"
|
|
670
|
+
f"(interviewer / architect / planner)は tier レバーが無いため対象外で"
|
|
671
|
+
f" 従来どおりとする。{suffix}"
|
|
628
672
|
)
|
|
629
673
|
|
|
630
674
|
|
|
@@ -814,6 +858,25 @@ def main() -> int:
|
|
|
814
858
|
effective_tier, escalation_reason = maybe_escalate(complexity, tier, threshold=esc_thr)
|
|
815
859
|
escalated = effective_tier != tier
|
|
816
860
|
|
|
861
|
+
# ADR-3/ADR-4/ADR-5: tester(Red) 推奨を additive に算出する。complexity /
|
|
862
|
+
# cost_map / epsilon / lam は developer と同一解決値を使う(per-prompt 分類・
|
|
863
|
+
# DC-AS-001)。escalation は role="tester" で tester セルの failure rate を引く。
|
|
864
|
+
# developer 推奨を先に確定してから算出するため、tester 側の rng 消費は
|
|
865
|
+
# developer の結果に影響しない(トップレベル bit 一致の後方互換を保つ)。
|
|
866
|
+
if c3_db is None:
|
|
867
|
+
tester_params = {t: (1.0, 1.0, 0) for t in TIERS}
|
|
868
|
+
else:
|
|
869
|
+
tester_params = c3_db.read_agent_tier_params("tester", complexity)
|
|
870
|
+
tester_result = select_tier_detailed(tester_params, cost_map=cost_map, epsilon=eps, lam=lam)
|
|
871
|
+
tester_effective, _tester_esc_reason = maybe_escalate(
|
|
872
|
+
complexity, tester_result.tier, threshold=esc_thr, role="tester",
|
|
873
|
+
)
|
|
874
|
+
tester_escalated = tester_effective != tester_result.tier
|
|
875
|
+
tester_entry: dict[str, object] = {"tier": tester_effective, "mode": tester_result.mode}
|
|
876
|
+
if tester_escalated:
|
|
877
|
+
tester_entry["escalated"] = True
|
|
878
|
+
roles = {"tester": tester_entry}
|
|
879
|
+
|
|
817
880
|
write_tier_selection(
|
|
818
881
|
complexity, effective_tier, mode,
|
|
819
882
|
escalated=escalated, escalation_reason=escalation_reason,
|
|
@@ -823,6 +886,7 @@ def main() -> int:
|
|
|
823
886
|
cost_tiebreak=cost_tiebreak,
|
|
824
887
|
cost_weighted=result.cost_weighted,
|
|
825
888
|
cost_lambda=lam,
|
|
889
|
+
roles=roles,
|
|
826
890
|
)
|
|
827
891
|
|
|
828
892
|
context_text = build_additional_context(
|
|
@@ -831,6 +895,7 @@ def main() -> int:
|
|
|
831
895
|
complexity_source=complexity_source,
|
|
832
896
|
cost_tiebreak=cost_tiebreak,
|
|
833
897
|
cost_weighted=result.cost_weighted,
|
|
898
|
+
tester_tier=tester_effective,
|
|
834
899
|
)
|
|
835
900
|
output = {
|
|
836
901
|
"hookSpecificOutput": {
|
{claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/hooks/tier_autoapply.py
RENAMED
|
@@ -12,6 +12,10 @@ check_agent は reviewer 系のみ)のため実行順序に依存しない(
|
|
|
12
12
|
tier_selection.json から有効 tier を解決できたとき、`updatedInput` で
|
|
13
13
|
`model:{推奨tier}` を注入した(source=injected・permissionDecision は
|
|
14
14
|
T0 実測により省略形を正とした)。
|
|
15
|
+
- `RED_APPLY_ROLES = {tester, wt_tester}` かつ `model` 無指定かつ
|
|
16
|
+
`C3_TASK_ID:` マーカーが `test-` で始まりかつ `roles.tester.tier` を解決できた
|
|
17
|
+
ときのみ注入した(Red 限定・ADR-2)。confirm-/impl-/マーカー無し・roles 欠落は
|
|
18
|
+
注入せず記録のみ(frontmatter の既定が実効・fail-safe)。
|
|
15
19
|
- 明示 `model` 指定時は素通り(source=explicit・明示尊重)。
|
|
16
20
|
- tier_selection 不在/破損/非文字列 tier のときは注入せず素通り
|
|
17
21
|
(source=frontmatter-default・frontmatter の sonnet が実効するため)。
|
|
@@ -81,7 +85,19 @@ TIER_SELECTION_PATH = os.path.join(_CLAUDE_DIR, "state", "tier_selection.json")
|
|
|
81
85
|
APPLIED_STATE_PATH = os.path.join(_CLAUDE_DIR, "state", "tier_autoapply.jsonl")
|
|
82
86
|
|
|
83
87
|
# §3-2 ロール分岐表の定数。
|
|
88
|
+
# APPLY_ROLES: 無条件 APPLY(起動フェーズを問わず tier_selection.json のトップレベル
|
|
89
|
+
# tier を機械適用する)role 集合。
|
|
90
|
+
# RED_APPLY_ROLES: Red フェーズ(test- タスク)限定で機械適用する role 集合(ADR-2)。
|
|
91
|
+
# 注入条件は「role ∈ RED_APPLY_ROLES かつ C3_TASK_ID マーカーが test- 開始かつ
|
|
92
|
+
# roles.tester.tier 解決可」の 3 条件全成立時のみ。D-3/D-5 等の非 Red 起動には
|
|
93
|
+
# test- マーカーを付与しない運用不変則(dev-workflow SKILL)と組で NF-2 を守る。
|
|
94
|
+
#
|
|
95
|
+
# 【opus 固定不変則(ADR-6)】APPLY_ROLES / RED_APPLY_ROLES に追加できるのは
|
|
96
|
+
# frontmatter model: sonnet の role のみ。opus frontmatter の agent(architect /
|
|
97
|
+
# planner / design-critic / doc-writer / project-setup)は tier レバーを持たず
|
|
98
|
+
# 恒久対象外(機械検査テストで frontmatter が sonnet であることを CI 回帰網に固定)。
|
|
84
99
|
APPLY_ROLES = frozenset({"developer", "wt_developer"})
|
|
100
|
+
RED_APPLY_ROLES = frozenset({"tester", "wt_tester"})
|
|
85
101
|
LAUNCH_LOG_ROLES = frozenset({"developer", "wt_developer", "tester", "wt_tester"})
|
|
86
102
|
# wt_* → 無印への正規化(record 側 role 語彙・agent_outcomes.role と一致・§0-4)。
|
|
87
103
|
_ROLE_NORMALIZE = {"wt_developer": "developer", "wt_tester": "tester"}
|
|
@@ -99,9 +115,12 @@ _ROTATE_TAIL_LINES = 500
|
|
|
99
115
|
|
|
100
116
|
_PROMPT_PREFIX_MAX_CHARS = 200
|
|
101
117
|
|
|
102
|
-
# T8: 起動プロンプト先頭の C3_TASK_ID マーカー抽出用(§3-1
|
|
103
|
-
# allowlist + 上限200
|
|
104
|
-
|
|
118
|
+
# T8: 起動プロンプト先頭の C3_TASK_ID マーカー抽出用(§3-1・SR-AI-001 で \A 化)。
|
|
119
|
+
# 文字列先頭アンカー \A + allowlist + 上限200字で誤抽出・秘密混入を構造排除する
|
|
120
|
+
# (record MAX_TASK_LEN=200 と整合)。re.MULTILINE の行頭 ^ は本文孤立行・フェンス内・
|
|
121
|
+
# 2 行目マーカーを誤抽出するため撤廃し、マーカーは「文字列先頭 1 行目のみ」を唯一の
|
|
122
|
+
# 正当配置に統一する(parallel/逐次とも 1 行目マーカー・2 行目以降にガード指示・§2-3 改訂 7)。
|
|
123
|
+
_TASK_ID_MARKER_RE = re.compile(r'\AC3_TASK_ID:[ ]([A-Za-z0-9._\-]{1,200})[ ]*(?:\r?\n|\Z)')
|
|
105
124
|
|
|
106
125
|
|
|
107
126
|
def _load_pricing_module():
|
|
@@ -176,7 +195,9 @@ def _clean_prompt_prefix(prompt: object) -> str:
|
|
|
176
195
|
def _extract_task_id(prompt: object) -> str | None:
|
|
177
196
|
"""起動プロンプトから C3_TASK_ID マーカー(最初の 1 個)を抽出した(§3)。
|
|
178
197
|
|
|
179
|
-
許容文字集合 [A-Za-z0-9._-]
|
|
198
|
+
許容文字集合 [A-Za-z0-9._-]・文字列先頭アンカー \\A・上限200字で誤抽出と秘密混入を防ぐ。
|
|
199
|
+
マーカーは「プロンプト文字列の先頭 1 行目」にある場合のみ抽出成立する(本文孤立行・
|
|
200
|
+
フェンス内・2 行目以降は非マッチ=None・SR-AI-001)。
|
|
180
201
|
prompt_prefix の mask→truncate パイプラインとは独立(正規表現自体がサニタイザ・§3-3)。
|
|
181
202
|
非文字列・不一致は None(→ jsonl は task_id: null で従来挙動・逐次経路も None)。
|
|
182
203
|
"""
|
|
@@ -221,6 +242,34 @@ def _resolve_selection_tier(c3_pricing) -> str | None:
|
|
|
221
242
|
return None
|
|
222
243
|
|
|
223
244
|
|
|
245
|
+
def _resolve_roles_tier(c3_pricing, role: str) -> str | None:
|
|
246
|
+
"""tier_selection.json の ``roles.<role>.tier`` を正規化 tier に解決した(ADR-3)。
|
|
247
|
+
|
|
248
|
+
Red 限定注入の tier 源。トップレベル ``tier`` ではなく additive な
|
|
249
|
+
``roles`` キー配下を読む。``roles`` 欠落・``roles.<role>`` 破損・非文字列 tier・
|
|
250
|
+
正規化不能は全て None を返し、呼び出し側は注入せず frontmatter-default に落ちる
|
|
251
|
+
(fail-safe が安全側に一致)。
|
|
252
|
+
"""
|
|
253
|
+
if c3_pricing is None:
|
|
254
|
+
return None
|
|
255
|
+
selection = _read_selection()
|
|
256
|
+
if selection is None:
|
|
257
|
+
return None
|
|
258
|
+
roles = selection.get("roles")
|
|
259
|
+
if not isinstance(roles, dict):
|
|
260
|
+
return None
|
|
261
|
+
entry = roles.get(role)
|
|
262
|
+
if not isinstance(entry, dict):
|
|
263
|
+
return None
|
|
264
|
+
raw = entry.get("tier")
|
|
265
|
+
if not isinstance(raw, str):
|
|
266
|
+
return None
|
|
267
|
+
resolved = c3_pricing.resolve_tier(raw)
|
|
268
|
+
if resolved in _VALID_TIERS:
|
|
269
|
+
return resolved
|
|
270
|
+
return None
|
|
271
|
+
|
|
272
|
+
|
|
224
273
|
def _rotate_if_needed(path: str) -> None:
|
|
225
274
|
"""applied-state が 1MB を超えていたら末尾500行へ切り詰めた(§3-4・失敗時は無視)。"""
|
|
226
275
|
try:
|
|
@@ -351,9 +400,14 @@ def main() -> None:
|
|
|
351
400
|
model_val = tool_input.get("model")
|
|
352
401
|
has_explicit_model = isinstance(model_val, str) and model_val.strip() != ""
|
|
353
402
|
|
|
403
|
+
# task_id は注入判定(RED_APPLY_ROLES の test- プレフィックス条件)と row 記録の
|
|
404
|
+
# 双方で使うため先に抽出する(§3-1・ADR-2)。
|
|
405
|
+
prompt = tool_input.get("prompt")
|
|
406
|
+
task_id = _extract_task_id(prompt)
|
|
407
|
+
|
|
354
408
|
inject = False
|
|
355
409
|
if has_explicit_model:
|
|
356
|
-
# 明示尊重: 注入せず素通りし explicit
|
|
410
|
+
# 明示尊重: 注入せず素通りし explicit で記録した(RED_APPLY_ROLES でも不変)。
|
|
357
411
|
source = "explicit"
|
|
358
412
|
model_applied: str | None = model_val
|
|
359
413
|
elif subagent_type in APPLY_ROLES:
|
|
@@ -367,12 +421,28 @@ def main() -> None:
|
|
|
367
421
|
# tier_selection 不在/破損/非文字列: frontmatter の既定が実効するため記録のみ。
|
|
368
422
|
source = "frontmatter-default"
|
|
369
423
|
model_applied = None
|
|
424
|
+
elif subagent_type in RED_APPLY_ROLES:
|
|
425
|
+
# tester/wt_tester: Red 限定注入(ADR-2)。C3_TASK_ID マーカーが test- 開始
|
|
426
|
+
# かつ roles.tester.tier が解決可のときのみ注入。confirm-/impl-/マーカー無し・
|
|
427
|
+
# roles 欠落/破損は注入せず記録のみ(frontmatter の既定が実効・fail-safe 一致)。
|
|
428
|
+
if isinstance(task_id, str) and task_id.startswith("test-"):
|
|
429
|
+
c3_pricing = _load_pricing_module()
|
|
430
|
+
tier = _resolve_roles_tier(c3_pricing, role_recorded)
|
|
431
|
+
if tier is not None:
|
|
432
|
+
inject = True
|
|
433
|
+
source = "injected"
|
|
434
|
+
model_applied = tier
|
|
435
|
+
else:
|
|
436
|
+
source = "frontmatter-default"
|
|
437
|
+
model_applied = None
|
|
438
|
+
else:
|
|
439
|
+
source = "frontmatter-default"
|
|
440
|
+
model_applied = None
|
|
370
441
|
else:
|
|
371
|
-
#
|
|
442
|
+
# LAUNCH_LOG_ROLES のうち上記いずれにも該当しない role(現状なし・防御)。
|
|
372
443
|
source = "frontmatter-default"
|
|
373
444
|
model_applied = None
|
|
374
445
|
|
|
375
|
-
prompt = tool_input.get("prompt")
|
|
376
446
|
row = {
|
|
377
447
|
"ts": datetime.now(timezone.utc).isoformat(timespec="seconds"),
|
|
378
448
|
"session_id": session_id,
|
|
@@ -381,7 +451,11 @@ def main() -> None:
|
|
|
381
451
|
"model_applied": model_applied,
|
|
382
452
|
"source": source,
|
|
383
453
|
"prompt_prefix": _clean_prompt_prefix(prompt),
|
|
384
|
-
|
|
454
|
+
# SR-K-003 前提: task_id は _TASK_ID_MARKER_RE の allowlist [A-Za-z0-9._-] を
|
|
455
|
+
# 通過済みのため秘密混入が構造的に不可能で _mask_secrets を適用していない。
|
|
456
|
+
# 許容文字集合が緩和される場合(記号・空白等を許す等)は、prompt_prefix と同様に
|
|
457
|
+
# _mask_secrets 適用が必要になる(マスク非対称の申し送り)。
|
|
458
|
+
"task_id": task_id,
|
|
385
459
|
}
|
|
386
460
|
_append_applied_state(row)
|
|
387
461
|
|
{claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/hooks/tier_gap_check.py
RENAMED
|
@@ -44,9 +44,10 @@ TIER_SELECTION_PATH = os.path.join(_CLAUDE_DIR, "state", "tier_selection.json")
|
|
|
44
44
|
|
|
45
45
|
# roll 対象: developer のみ(tester は除外)。
|
|
46
46
|
# 理由: tier_autoapply.py LAUNCH_LOG_ROLES に tester を含めて起動ログは記録するが、
|
|
47
|
-
# dev-workflow の記録契約上 tester の outcome
|
|
48
|
-
# tester
|
|
49
|
-
#
|
|
47
|
+
# dev-workflow の記録契約上 tester の outcome 記録は D-1(Red 限定・条件 1〜4)と
|
|
48
|
+
# D-5(最終確認)に限られ、tester の起動回数(Red フェーズでのテスト実行・confirm
|
|
49
|
+
# 起動・D-3 など複数回)には遠く及ばない。したがって起動 N >> 記録 M となり常時
|
|
50
|
+
# K' > 0 で誤警告が発火する(カーディナリティ不一致)ため tester は依然除外する。
|
|
50
51
|
# CR F-1 で構造的誤検知として developer のみに限定した(起動ログ記録は維持)。
|
|
51
52
|
_EVALUATED_ROLES = frozenset({"developer"})
|
|
52
53
|
# 直近5分は中間状態として除外
|
{claude_code_conductor-2.53.0 → claude_code_conductor-2.54.0}/.claude/skills/dev-workflow/SKILL.md
RENAMED
|
@@ -52,13 +52,14 @@ session.tmp の `モード:` 行を確認する。**有効な自律宣言**(§
|
|
|
52
52
|
|
|
53
53
|
**機械適用(推奨 Tier の `model:` 自動注入・ADR-AS-1・フェーズ3):**
|
|
54
54
|
|
|
55
|
-
- developer を Agent ツールで起動する箇所(**D-2 / D-2.5 の再実行 / D-4**)では、PreToolUse hook(`tier_autoapply.py`)が `[tier-routing 推奨]` の推奨 Tier を Agent 呼び出しの `model:` に自動適用する(機械適用・学習データ収集中の期間も含め常に適用する。親 Claude が `model:` を転記する必要はない。fork は model 上書き不可のため対象外)。推奨と異なる Tier を使いたい場合のみ Agent 呼び出しで `model:` を明示指定する(明示指定は hook に尊重され上書きされない)。**tester / systematic-debugger
|
|
55
|
+
- developer を Agent ツールで起動する箇所(**D-2 / D-2.5 の再実行 / D-4**)では、PreToolUse hook(`tier_autoapply.py`)が `[tier-routing 推奨]` の推奨 Tier を Agent 呼び出しの `model:` に自動適用する(機械適用・学習データ収集中の期間も含め常に適用する。親 Claude が `model:` を転記する必要はない。fork は model 上書き不可のため対象外)。推奨と異なる Tier を使いたい場合のみ Agent 呼び出しで `model:` を明示指定する(明示指定は hook に尊重され上書きされない)。**tester は Red 起動(D-1 のマーカー付き `test-` タスク)のみ機械適用対象**(RED_APPLY_ROLES・Red 限定注入)で、D-3/D-5 等の非 Red 起動と systematic-debugger は対象外=従来どおり frontmatter 任せとする。interviewer/architect/planner は親 Claude ペルソナで動かし tier レバーが無いため対象外。
|
|
56
|
+
- **opus 固定不変則(ADR-6)**: 機械適用(`model:` 自動注入)の対象に追加してよいのは frontmatter が `model: sonnet` の role(developer / wt_developer / tester / wt_tester)のみで、opus 5 体(architect / planner / design-critic / doc-writer / project-setup)は恒久的に注入対象外とする(強 model 固定の設計判断・機械検査で保護)。
|
|
56
57
|
- **推奨 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 を発火しないため途中で上書きされない)。
|
|
57
58
|
- developer の record ブロックは**`--tier` を付けない**(tier_autoapply.py が実適用 model を `.claude/state/tier_autoapply.jsonl` に記録し、record_agent_outcome.py が applied-state を session_id 一致で読んで実適用 tier を機械解決する=適用者=記録 SSOT。tier 値の LLM 申告を行わない。明示指定で推奨と異なる Tier を使った場合も、その実適用値が applied-state に記録されるため `--tier` の付与は不要)。
|
|
58
59
|
|
|
59
60
|
**集計注記**(DC-AS-002 / ADR-25-3):
|
|
60
61
|
|
|
61
|
-
-
|
|
62
|
+
- bandit params・escalation 判定の**集計対象 gate は role 別(`BANDIT_GATES_BY_ROLE`)**である: developer 等の既定 role は **BANDIT_GATES(D-2.5/D-3/D-5/D-2.5-stuck)**、**tester は D-1 のみ**(D-3/D-5 の tester 記録はイベントログとして残るが集計対象外)。E-1/E-2(レビュー指摘由来)のイベントは全 gate 不可逆に記録するが、その成否は従来どおり個別の集計から除外される(意図どおり・read-side フィルタで実現)。
|
|
62
63
|
- **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 選択ロジックには影響しない。
|
|
63
64
|
|
|
64
65
|
---
|
|
@@ -532,8 +533,31 @@ legacy TDD モードまたは parallel-agents モードで実装される。
|
|
|
532
533
|
|
|
533
534
|
Agent ツールで `tester` エージェントを起動する。→ 失敗するテストを先に作成する。**必ず `.claude/reports/test-report-YYYYMMDD-HHMMSS.md` を Write してから終了すること。**
|
|
534
535
|
|
|
536
|
+
**Red 起動プロンプトのマーカー規約(必須)**: tester を Agent ツールで起動するプロンプトの**1 行目(文字列先頭)**に、以下の機械可読マーカー行を**必須**で 1 行含める(省略可能な推奨ではない・parallel 経路の同型マーカーの逐次版)。`tier_autoapply.py` の抽出正規表現は文字列先頭アンカー `\A` のため、2 行目以降・本文中・フェンス内に置くと抽出されず注入されない(SR-AI-001):
|
|
537
|
+
|
|
538
|
+
```
|
|
539
|
+
C3_TASK_ID: test-{plan タスクID}
|
|
540
|
+
```
|
|
541
|
+
|
|
542
|
+
- `{plan タスクID}` は plan-report の当該 Red タスク ID(英数と `.` `_` `-` のみ・200 字以内)。値は下記の failure 記録・D-3 の success/failure 記録の `--task test-{plan タスクID}` と**完全一致**させる。plan タスク ID を持たない bug-fix モードでは D-1 自体がスキップされるため対象外。
|
|
543
|
+
- この行を PreToolUse hook(`tier_autoapply.py`)が抽出し、`test-` プレフィックス条件を満たす tester 起動にのみ推奨 Tier を `model:` へ自動適用する(Red 限定注入・RED_APPLY_ROLES)。record はこのマーカー由来の applied-state を `--task` と突合して実適用 tier を機械解決する。
|
|
544
|
+
- **不変則(D-3/D-5 マーカー付与禁止)**: D-3 / D-5 の tester 起動プロンプトには `C3_TASK_ID: test-...` マーカーを**付与しない**(注入条件はフェーズではなくマーカー値のみをキーにするため、D-3/D-5 に付与すると確認フェーズへ Red 注入が誤発火する)。D-3/D-5 の起動プロンプトに `C3_TASK_ID:` を書く必要がある場合は `confirm-` 等の非 test- 値とする。
|
|
545
|
+
- **マーカー欠落の検知導線**: record 実行時に applied-state 突合失敗の stderr 警告("marker not injected or task mismatch?")が出た場合は、マーカー欠落による tier 記録欠損として**セッションファイルの `## 試みたが失敗したアプローチ` へ 1 行記録する**(自律運転中はあわせて gaps 台帳へも記録する)。
|
|
546
|
+
|
|
535
547
|
完了後 → セッションファイルの `- [ ] tester: Red フェーズ` を `- [x]` に Edit し、`現在地:` を `現在地: フェーズD 実装中 / 次: developer Green` に Edit する。
|
|
536
548
|
|
|
549
|
+
**D-1 完了時の成否判定(成否 4 条件のうち条件 1・2)**: Red 成果物の帰属先は Red を書いた tier(gate `D-1`)に統一する。
|
|
550
|
+
|
|
551
|
+
- **条件 1(Red の失敗理由が意図と違う)** / **条件 2(ベースライン破壊=既存の緑テストを赤化させた)**: いずれかに該当する場合はその場で failure を記録する:
|
|
552
|
+
```bash
|
|
553
|
+
c3 run .claude/skills/dev-workflow/scripts/record_agent_outcome.py \
|
|
554
|
+
--role tester --outcome failure --gate D-1 \
|
|
555
|
+
--execution subagent --complexity {セッションファイルの tier-routing複雑度: 行の値} \
|
|
556
|
+
--task test-{plan タスクID}
|
|
557
|
+
```
|
|
558
|
+
- **条件 1・2 とも該当なし**: この時点では**記録しない**(成功の確定は D-3 全合格時=条件 4)。
|
|
559
|
+
- 条件 3(Green 中のテスト側修正の所在判定)・条件 4(success)は D-3 で扱う。
|
|
560
|
+
|
|
537
561
|
### D-2: developer(Green フェーズ)
|
|
538
562
|
|
|
539
563
|
Agent ツールで `developer` エージェントを起動する(`model:` は tier_autoapply hook が推奨 Tier を自動適用・上記「tier-routing 結果記録の運用」節参照)。→ テストが通る実装を行う。
|
|
@@ -611,14 +635,33 @@ AskUserQuestion で確認する:
|
|
|
611
635
|
|
|
612
636
|
不合格の場合: D-2(developer)に戻る。合格するまで繰り返す。
|
|
613
637
|
|
|
614
|
-
**tier-routing
|
|
638
|
+
**tier-routing 結果記録(全合格時・条件 4 = Red 成果物の生存確定)**: 全テスト合格=Red が要求した挙動が実装で満たされ Red 成果物が生存した確定点なので、Red の tier に success を帰属する(gate `D-1`):
|
|
615
639
|
```bash
|
|
616
640
|
c3 run .claude/skills/dev-workflow/scripts/record_agent_outcome.py \
|
|
617
|
-
--role
|
|
641
|
+
--role tester --outcome success --gate D-1 \
|
|
618
642
|
--execution subagent --complexity {セッションファイルの tier-routing複雑度: 行の値} \
|
|
619
|
-
--task {plan タスクID}
|
|
643
|
+
--task test-{plan タスクID}
|
|
620
644
|
```
|
|
621
645
|
|
|
646
|
+
**tier-routing 結果記録(不合格時のみ・D-2.5 と重複回避のため全合格時はこの failure ブロックを記録しない・欠陥の所在で判定)**: 欠陥の所在で role・gate を分岐する。
|
|
647
|
+
|
|
648
|
+
- **テストコード欠陥(条件 3・Red 成果物への帰属)**: `tester` failure を gate `D-1` で記録する(`--gate D-3` ではなく `--gate D-1` に統一・Red 成果物への帰属):
|
|
649
|
+
```bash
|
|
650
|
+
c3 run .claude/skills/dev-workflow/scripts/record_agent_outcome.py \
|
|
651
|
+
--role tester --outcome failure --gate D-1 \
|
|
652
|
+
--execution subagent --complexity {セッションファイルの tier-routing複雑度: 行の値} \
|
|
653
|
+
--task test-{plan タスクID}
|
|
654
|
+
```
|
|
655
|
+
- **除外境界(条件 3)**: テスト側修正を「仕様変更追随」として failure 記録から除外できるのは、**その裁定がセッションファイルに記録されている場合のみ**とする(裁定記録が無ければ既定で failure を記録する)。
|
|
656
|
+
- **所在判定チェック観点**: テストコード欠陥かを判定する際、source(プロダクトコード)が誤アサーションへ追従(over-fit)していないかを併せて確認する(over-fit していれば source 側の欠陥=developer 帰属)。
|
|
657
|
+
- **プロダクトコード欠陥/両方または判別不能**: `developer` failure を gate `D-3` で記録する(developer の bandit gate は現行どおり):
|
|
658
|
+
```bash
|
|
659
|
+
c3 run .claude/skills/dev-workflow/scripts/record_agent_outcome.py \
|
|
660
|
+
--role developer --outcome failure --gate D-3 \
|
|
661
|
+
--execution subagent --complexity {セッションファイルの tier-routing複雑度: 行の値} \
|
|
662
|
+
--task {plan タスクID}
|
|
663
|
+
```
|
|
664
|
+
|
|
622
665
|
### D-4: developer(Refactor フェーズ)
|
|
623
666
|
|
|
624
667
|
Agent ツールで `developer` エージェントを起動する(`model:` は tier_autoapply hook が推奨 Tier を自動適用・上記「tier-routing 結果記録の運用」節参照)。→ テストを壊さずにコードを整理する。
|