claude-code-conductor 2.42.0__tar.gz → 2.44.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.42.0 → claude_code_conductor-2.44.0}/.claude/breaking-changes.txt +1 -0
- claude_code_conductor-2.44.0/.claude/hooks/pre_compact.py +205 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/hooks/select_tier.py +4 -4
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/skills/dev-workflow/SKILL.md +12 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/skills/dev-workflow/scripts/record_agent_outcome.py +8 -16
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/CHANGELOG.md +34 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/PKG-INFO +1 -1
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/src/c3/__init__.py +1 -1
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/src/c3/_db_params.py +31 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/src/c3/cli_tier.py +3 -4
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/src/c3/db.py +67 -219
- claude_code_conductor-2.44.0/src/c3/migrations/005_drop_agent_tier_bandit.sql +18 -0
- claude_code_conductor-2.44.0/tests/_pre_compact_helpers.py +88 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/hooks/test_record_agent_outcome.py +267 -8
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/hooks/test_select_tier_escalation.py +48 -31
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/hooks/test_session_start.py +5 -1
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/hooks/test_session_stop.py +16 -26
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/test_cli_tier.py +41 -26
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/test_db.py +497 -309
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/test_migrate.py +181 -6
- claude_code_conductor-2.44.0/tests/test_pre_compact.py +1014 -0
- claude_code_conductor-2.44.0/tests/test_precompact_additional.py +149 -0
- claude_code_conductor-2.42.0/.claude/hooks/pre_compact.py +0 -61
- claude_code_conductor-2.42.0/tests/test_pre_compact.py +0 -265
- claude_code_conductor-2.42.0/tests/test_precompact_additional.py +0 -135
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/CLAUDE.md +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/agents/architect.md +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/agents/code-reviewer.md +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/agents/design-critic.md +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/agents/developer.md +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/agents/doc-writer.md +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/agents/interviewer.md +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/agents/planner.md +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/agents/project-setup.md +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/agents/security-reviewer.md +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/agents/systematic-debugger.md +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/agents/tester.md +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/agents/wt_developer.md +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/agents/wt_systematic-debugger.md +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/agents/wt_tester.md +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/deletions.txt +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/docs/config-policy.md +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/docs/parallel-agents-setup.md +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/docs/platform-adapters.md +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/docs/settings.json.md +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/hooks/_hook_utils.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/hooks/check_agent_invocation.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/hooks/consolidate_memory.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/hooks/permission_handler.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/hooks/permission_handler_toast.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/hooks/planner_check.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/hooks/post_tool.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/hooks/pre_tool.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/hooks/recall_autorebuild.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/hooks/recall_inject.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/hooks/restore_session.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/hooks/session_start.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/hooks/session_stop.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/hooks/session_utils.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/hooks/statusline.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/hooks/stop.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/hooks/worktree_guard.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/memory/.gitkeep +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/permission_rules.json +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/rules/promoted/index.md +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/settings.json +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/skills/brainstorm/SKILL.md +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/skills/codex-review/SKILL.md +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/skills/dev-workflow/references/code-review-checklist.md +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/skills/dev-workflow/references/design-critic-rubric.md +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/skills/dev-workflow/references/design-rubric.md +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/skills/dev-workflow/references/interview-rubric.md +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/skills/dev-workflow/references/plan-design-guidelines.md +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/skills/dev-workflow/references/security-review-checklist.md +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/skills/dev-workflow/scripts/record_review_decision.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/skills/dev-workflow/scripts/review_hint_inject.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/skills/develop/SKILL.md +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/skills/doc/SKILL.md +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/skills/extract-lib/SKILL.md +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/skills/init-session/SKILL.md +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/skills/init-session/scripts/session_guard.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/skills/mcp-config/SKILL.md +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/skills/parallel-agents/SKILL.md +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/skills/pattern-status/SKILL.md +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/skills/promote-pattern/SKILL.md +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/skills/recall/SKILL.md +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/skills/report-timestamp/SKILL.md +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/skills/report-timestamp/scripts/get_timestamp.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/skills/review-phase/SKILL.md +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/skills/setup/SKILL.md +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/skills/setup/reference.md +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/skills/setup/templates/coding-standards-template.md +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/skills/setup/templates/project-conventions-template.md +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/skills/start/SKILL.md +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/state/.gitkeep +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.gitignore +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/ARCHITECTURE.md +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/LICENSE +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/LICENSES/fastembed-LICENSE +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/LICENSES/fastembed-NOTICE +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/LICENSES/numpy-LICENSE +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/LICENSES/onnxruntime-LICENSE +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/LICENSES/paraphrase-multilingual-MiniLM-L12-v2-LICENSE +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/README.md +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/hatch_build.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/pyproject.toml +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/src/c3/__main__.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/src/c3/_excludes.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/src/c3/_terminal.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/src/c3/adapters.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/src/c3/cli.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/src/c3/cli_ask.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/src/c3/cli_doctor.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/src/c3/cli_init.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/src/c3/cli_list.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/src/c3/cli_plan.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/src/c3/cli_recall.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/src/c3/cli_update.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/src/c3/embedding.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/src/c3/gitutil.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/src/c3/mcp_server.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/src/c3/migrate.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/src/c3/migrations/001_initial.sql +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/src/c3/migrations/002_agent_cost_runs.sql +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/src/c3/migrations/003_tier_cost.sql +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/src/c3/migrations/004_agent_outcomes.sql +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/src/c3/migrations/README.md +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/src/c3/migrations/__init__.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/src/c3/paths.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/src/c3/plan_validator.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/src/c3/platforms.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/src/c3/pricing.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/src/c3/question.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/src/c3/recall_chunker.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/src/c3/recall_index.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/src/c3/usage_ingester.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/__init__.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/conftest.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/fixtures/usage/README.md +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/fixtures/usage/mainline.jsonl +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/fixtures/usage/subagents/agent-deadbeef.jsonl +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/fixtures/usage/subagents/agent-deadbeef.meta.json +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/hooks/__init__.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/hooks/test_check_agent_invocation.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/hooks/test_consolidate_memory.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/hooks/test_hook_utils.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/hooks/test_permission_handler.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/hooks/test_permission_handler_toast.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/hooks/test_pip_reinstall_reminder.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/hooks/test_planner_check.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/hooks/test_planner_check_dev.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/hooks/test_post_tool.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/hooks/test_pre_tool.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/hooks/test_recall_autorebuild.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/hooks/test_recall_inject.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/hooks/test_record_review_decision.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/hooks/test_restore_session.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/hooks/test_review_hint_inject.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/hooks/test_select_tier.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/hooks/test_session_utils.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/hooks/test_settings_local_absolute_paths.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/hooks/test_similarity_boost.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/hooks/test_statusline.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/hooks/test_statusline_template_sync.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/hooks/test_sync_check.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/hooks/test_template_guard.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/skills/__init__.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/skills/_skill_helpers.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/skills/test_dev_workflow_no_task_type.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/skills/test_init_session_no_task_type.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/skills/test_planner_lightweight.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/skills/test_recall_skill.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/skills/test_session_backlog_reconciliation.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/skills/test_session_guard.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/skills/test_setup_templates.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/skills/test_start_skill_bugfix_flow.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/skills/test_start_skill_new_flow.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/skills/test_start_skill_security_audit_phase.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/test_adapters.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/test_check_deletions.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/test_cli_ask.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/test_cli_doctor.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/test_cli_entry.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/test_cli_init.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/test_cli_list.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/test_cli_plan.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/test_cli_recall.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/test_cli_update_breaking_changes.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/test_cli_update_deletions.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/test_docstring_consistency.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/test_embedding.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/test_excludes.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/test_extract_breaking_changes.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/test_gitutil.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/test_mcp_server_elicit.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/test_paths.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/test_plan_validator.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/test_pre_tool_hook.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/test_precompact_toctou_fixes.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/test_pricing.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/test_recall_chunker.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/test_recall_index.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/test_references_migration.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/test_session_utils_additional.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/test_skill_no_builtin_conflict.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/test_statusline.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/test_stop_additional.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/test_stop_hook.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/test_stop_precompact_fixes.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/test_sync_template_stop.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/test_template_pre_tool_hook.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/tests/test_usage_ingester.py +0 -0
- {claude_code_conductor-2.42.0 → claude_code_conductor-2.44.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).|
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""PreCompact hook: append checkpoint marker (デバウンス付き)。
|
|
3
|
+
|
|
4
|
+
直近 DEBOUNCE_WINDOW_SECONDS 秒以内に PreCompact checkpoint が既に存在する場合は、
|
|
5
|
+
checkpoint の追記をスキップする(PreCompact の連続起動による重複追記を防ぐ
|
|
6
|
+
デバウンス機構)。
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import json
|
|
10
|
+
import os
|
|
11
|
+
import re
|
|
12
|
+
import sys
|
|
13
|
+
from datetime import datetime, timedelta, timezone
|
|
14
|
+
|
|
15
|
+
sys.stdout.reconfigure(encoding='utf-8')
|
|
16
|
+
sys.stderr.reconfigure(encoding='utf-8')
|
|
17
|
+
|
|
18
|
+
from session_utils import SESSION_JSON_MARKER, append_checkpoint, is_worktree, SESSIONS_DIR
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
# デバウンス窓幅(秒)。直近の PreCompact checkpoint からこの秒数以内の再実行は
|
|
22
|
+
# 追記をスキップする(4連続起動の重複防止)。
|
|
23
|
+
DEBOUNCE_WINDOW_SECONDS = 10
|
|
24
|
+
|
|
25
|
+
# checkpoint 行抽出のため splitlines() に渡す前に除去する行区切り文字パターン。
|
|
26
|
+
# stop.py::_INHERIT_SANITIZE_RE / session_utils._VALUE_SANITIZE_RE と同一範囲(対称)。
|
|
27
|
+
# str.splitlines() は \n 以外に \v / \f / \x1c-\x1e / \x85 / U+2028 / U+2029 でも
|
|
28
|
+
# 行分割する。append_checkpoint が書き込む summary body(未サニタイズの trigger 等)に
|
|
29
|
+
# これらの文字+checkpoint 行に酷似する文字列が混入すると、splitlines() が偽の行を
|
|
30
|
+
# 生成し _PRECOMPACT_CHECKPOINT_RE が誤マッチしてデバウンスの偽陽性を起こし得る。
|
|
31
|
+
# stop.py の _inherit_pending_tasks と同趣旨で、分割前に事前除去する。
|
|
32
|
+
# raw string は \uXXXX を解釈しないため U+2028 / U+2029 は chr() で連結する。
|
|
33
|
+
_LINE_SEPARATOR_SANITIZE_RE = re.compile(
|
|
34
|
+
r'[\x00-\x08\x0b-\x1f\x7f-\x9f' + chr(0x2028) + chr(0x2029) + r']'
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
# checkpoint 行の固定プレフィックス。PreCompact ラベルへのアンカーとして使う
|
|
38
|
+
# (他ラベル、例えば Wave checkpoint を除外する)。
|
|
39
|
+
_PRECOMPACT_CHECKPOINT_PREFIX = '## [Checkpoint: PreCompact:'
|
|
40
|
+
|
|
41
|
+
# checkpoint 行として許容する最大長(fix-cycle-2, security-review-report-20260704-075817.md
|
|
42
|
+
# [SR-NEW])。正規の checkpoint ヘッダ行は数十〜数百文字で十分なため、これを超える行は
|
|
43
|
+
# パース対象から除外する(regex 撤去後の belt-and-suspenders ガード)。
|
|
44
|
+
MAX_CHECKPOINT_LINE_LEN = 512
|
|
45
|
+
|
|
46
|
+
# parse 成功した timestamp が `now` をこの秒数を超えて上回る場合、構造的異常値として
|
|
47
|
+
# 棄却する(fail-open)。checkpoint の timestamp は append_checkpoint が同一ホストの
|
|
48
|
+
# UTC 実時刻で書くため、書き込み時刻は必ず読み取り時刻以前になるはず。
|
|
49
|
+
#
|
|
50
|
+
# 60 秒は独立したセキュリティ判断としての保守値である。正当な checkpoint 行の
|
|
51
|
+
# timestamp が読み取り時刻をわずかに上回り得る唯一の現実的経路は、NTP による
|
|
52
|
+
# クライアント時計の後方ステップ補正(書き込み時点で実時刻より進んでいた時計が、
|
|
53
|
+
# 読み取り時点までに巻き戻される)であり、この巻き戻し幅を吸収するために許容する。
|
|
54
|
+
# 通常の NTP ステップ補正は秒〜十数秒規模のため 60 秒あれば十分に吸収できる。
|
|
55
|
+
#
|
|
56
|
+
# この値を大きく取り過ぎると、許容スキュー以内の未来日時 checkpoint を注入された
|
|
57
|
+
# 場合に、実時刻がその timestamp に追いつくまでデバウンスが効き続け、checkpoint 追記
|
|
58
|
+
# が最大で許容秒数ぶん停止する([SR-V-001])。60 秒に
|
|
59
|
+
# 抑えることで、悪意ある注入・データ破損いずれの場合も最大デバウンス停止時間を
|
|
60
|
+
# 60 秒以内に限定する。
|
|
61
|
+
#
|
|
62
|
+
# 未来スキューを跨いだ許容/棄却境界はテスト側で module.FUTURE_SKEW_TOLERANCE_SECONDS
|
|
63
|
+
# を参照した相対時刻テストとして固定しており、テストは now= を明示指定して壁時計に
|
|
64
|
+
# 依存しない(値をテストフィクスチャ都合で膨らませる必要はない)。
|
|
65
|
+
FUTURE_SKEW_TOLERANCE_SECONDS = 60
|
|
66
|
+
|
|
67
|
+
# parse 失敗時の stderr 診断ログに出す捕捉テキストの最大長
|
|
68
|
+
# (fix-cycle-2, security-review-report-20260704-075817.md [SR-R-001])。
|
|
69
|
+
DIAGNOSTIC_MAX_LEN = 64
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def _last_precompact_checkpoint_dt(session_file, now=None):
|
|
73
|
+
"""session_file 内の最後の PreCompact checkpoint 行から aware datetime を返す。
|
|
74
|
+
|
|
75
|
+
ファイル無し・PreCompact 行無し・parse 不能・naive datetime・未来日時(許容
|
|
76
|
+
スキュー超)など、あらゆる異常系で None を返す(fail-open の中核)。
|
|
77
|
+
|
|
78
|
+
`now` は未来日時ガードの基準時刻(省略時は呼び出し時点の UTC 実時刻)。
|
|
79
|
+
呼び出し元(main)と判定基準を一致させたい場合は明示的に渡すこと。
|
|
80
|
+
"""
|
|
81
|
+
if now is None:
|
|
82
|
+
now = datetime.now(timezone.utc)
|
|
83
|
+
|
|
84
|
+
try:
|
|
85
|
+
with open(session_file, encoding='utf-8') as f:
|
|
86
|
+
content = f.read()
|
|
87
|
+
except (OSError, ValueError, TypeError):
|
|
88
|
+
# 「ファイル無し」は初回起動時の通常ケース。ほぼ毎日 1 回 stderr へ
|
|
89
|
+
# 出すとスパムになるため、ここでは無音のまま fail-open する(CR-L-003)。
|
|
90
|
+
return None
|
|
91
|
+
|
|
92
|
+
# splitlines() が特殊行区切り文字(\x85 / U+2028 / U+2029 等)で偽の checkpoint
|
|
93
|
+
# 行を生成しないよう、分割前に除去する(stop.py と対称なガード / CR-NEW Medium)。
|
|
94
|
+
lines = _LINE_SEPARATOR_SANITIZE_RE.sub('', content).splitlines()
|
|
95
|
+
|
|
96
|
+
for line in reversed(lines):
|
|
97
|
+
# regex(`.* - (.+)`)の二重ワイルドカードによる多項式時間バックトラッキング
|
|
98
|
+
# (ReDoS)を根絶するため、手続き的パースに置き換える
|
|
99
|
+
# (fix-cycle-2, security-review-report-20260704-075817.md [SR-NEW])。
|
|
100
|
+
stripped = line.rstrip()
|
|
101
|
+
if len(stripped) > MAX_CHECKPOINT_LINE_LEN:
|
|
102
|
+
# 行長ガード。異常に長い行は正規の checkpoint ではあり得ないため
|
|
103
|
+
# 以降のパース処理(rfind 等)に進む前にスキップする。
|
|
104
|
+
continue
|
|
105
|
+
if not stripped.startswith(_PRECOMPACT_CHECKPOINT_PREFIX):
|
|
106
|
+
continue
|
|
107
|
+
if not stripped.endswith(']'):
|
|
108
|
+
continue
|
|
109
|
+
# プレフィックスと末尾 `]` を除いた内側の文字列から、最後の ` - ` を
|
|
110
|
+
# timestamp との区切りとみなす(旧 greedy regex `.* - (.+)]` の「最後の
|
|
111
|
+
# ` - ` フィールドを timestamp とする」挙動と等価。label 内の偶発的な
|
|
112
|
+
# ` - ` があっても安全側に倒れる)。
|
|
113
|
+
# 旧 regex は `(.+)` が 1 文字以上を要求するため、timestamp 欄が完全空文字の
|
|
114
|
+
# 行(例: `## [Checkpoint: PreCompact: manual - ]`)を非マッチとして扱い、
|
|
115
|
+
# より古い有効な checkpoint 行を探し続けていた。空 ts_text を continue で
|
|
116
|
+
# スキップすることで、この空文字境界でも旧 regex と等価に振る舞う。
|
|
117
|
+
inner = stripped[len(_PRECOMPACT_CHECKPOINT_PREFIX):-1]
|
|
118
|
+
sep_idx = inner.rfind(' - ')
|
|
119
|
+
if sep_idx == -1:
|
|
120
|
+
continue
|
|
121
|
+
ts_text = inner[sep_idx + len(' - '):].strip()
|
|
122
|
+
if not ts_text:
|
|
123
|
+
# 空文字 timestamp は旧 greedy regex `(.+)` の非マッチに相当する。
|
|
124
|
+
# 診断ログは出さず(破損ではなく単なる欠落のため)、より古い有効行の
|
|
125
|
+
# 探索を継続する。
|
|
126
|
+
continue
|
|
127
|
+
try:
|
|
128
|
+
dt = datetime.fromisoformat(ts_text)
|
|
129
|
+
except (ValueError, TypeError):
|
|
130
|
+
# 「timestamp が壊れている」のは本来発生しない想定外の破損ケース。
|
|
131
|
+
# ファイル無しの通常ケースと異なり、将来のトラブルシュートのため
|
|
132
|
+
# このケースに限り stderr へ診断ログを 1 行出す(CR-L-003・非対称仕様)。
|
|
133
|
+
# 捕捉テキストは固定長に切り詰めて出力する(SR-R-001)。
|
|
134
|
+
# 戻り値は引き続き None(fail-open で追記継続)。
|
|
135
|
+
print(
|
|
136
|
+
'[PreCompact] 診断: checkpoint 行の timestamp を parse できませんでした'
|
|
137
|
+
f'(fail-open で追記を継続します): {ts_text[:DIAGNOSTIC_MAX_LEN]!r}',
|
|
138
|
+
file=sys.stderr,
|
|
139
|
+
)
|
|
140
|
+
return None
|
|
141
|
+
if dt.tzinfo is None:
|
|
142
|
+
return None
|
|
143
|
+
if dt > now + timedelta(seconds=FUTURE_SKEW_TOLERANCE_SECONDS):
|
|
144
|
+
# 未来日時(許容スキュー超)は構造的異常値として棄却する(fail-open)。
|
|
145
|
+
# 悪意ある注入・データ破損いずれの場合も、デバウンスの恒久停止を
|
|
146
|
+
# 招かないよう None を返して追記を継続する
|
|
147
|
+
# (fix-cycle-2, security-review-report-20260704-075817.md [SR-V-001])。
|
|
148
|
+
return None
|
|
149
|
+
return dt
|
|
150
|
+
|
|
151
|
+
return None
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
def main():
|
|
155
|
+
try:
|
|
156
|
+
payload = json.loads(sys.stdin.read())
|
|
157
|
+
except (json.JSONDecodeError, ValueError):
|
|
158
|
+
payload = {}
|
|
159
|
+
|
|
160
|
+
cwd = os.getcwd()
|
|
161
|
+
if is_worktree(cwd):
|
|
162
|
+
sys.exit(0)
|
|
163
|
+
|
|
164
|
+
trigger = payload.get('trigger', 'unknown')
|
|
165
|
+
context_items_before = payload.get('context_items_before')
|
|
166
|
+
context_items_before_str = 'N/A' if context_items_before is None else str(context_items_before)
|
|
167
|
+
|
|
168
|
+
now = datetime.now(timezone.utc)
|
|
169
|
+
# 既知の構造的限界(CR-NEW Low・修正しない): session_file は now の UTC 日付から
|
|
170
|
+
# 算出する。PreCompact の連続起動(実測 約1.2 秒スパン)が UTC 00:00:00 ちょうどを
|
|
171
|
+
# またぐ極稀ケースでは、前後の呼び出しが別日の session_file を参照するため
|
|
172
|
+
# デバウンス判定が効かず checkpoint が二重追記され得る。発生確率は極小のため
|
|
173
|
+
# コードでは対処せず既知の限界として許容する。
|
|
174
|
+
date_str = now.strftime('%Y%m%d')
|
|
175
|
+
session_file = os.path.join(SESSIONS_DIR, f'{date_str}.tmp')
|
|
176
|
+
|
|
177
|
+
last = _last_precompact_checkpoint_dt(session_file, now=now)
|
|
178
|
+
if last is not None and (now - last) < timedelta(seconds=DEBOUNCE_WINDOW_SECONDS):
|
|
179
|
+
print('[PreCompact] debounce: 直近の checkpoint を検出したため追記をスキップしました', file=sys.stderr)
|
|
180
|
+
return
|
|
181
|
+
|
|
182
|
+
# セキュリティ非対称性の記録(fix-cycle-2, security-review-report-20260704-121824.md
|
|
183
|
+
# [SR-V-001]・情報提供・現状は対応不要): 以下の summary(body)は
|
|
184
|
+
# session_utils.append_checkpoint の設計上 sanitize_value() 非適用で書き込まれる
|
|
185
|
+
# (複数行 Markdown を保持するための承認済み設計判断・session_utils.py L147 参照)。
|
|
186
|
+
# そのため body に埋め込む trigger(L164)は未サニタイズのまま checkpoint に書かれる。
|
|
187
|
+
# 一方 label(下の f'PreCompact: {trigger}')は append_checkpoint 内で
|
|
188
|
+
# sanitize_value() を通るため、body と label で sanitize 適用範囲に非対称性がある。
|
|
189
|
+
# 現状 trigger は Claude Code ハーネスが設定する列挙的な値(manual/auto 等)で、
|
|
190
|
+
# 外部入力・LLM 自由記述からの直接汚染経路が無いため実害の確信度は低い。
|
|
191
|
+
# 【将来の拡張時の注意】trigger の由来をハーネス以外(プラグイン・カスタムフック
|
|
192
|
+
# 連携等)に拡張する場合は、偽 checkpoint 注入経路化を防ぐため body 側にも
|
|
193
|
+
# sanitize_value() 適用を検討すること。
|
|
194
|
+
summary = (
|
|
195
|
+
f"- trigger: {trigger}\n"
|
|
196
|
+
f"- context_items_before: {context_items_before_str}\n"
|
|
197
|
+
f"- このポイント以前の詳細な文脈は圧縮により失われます。"
|
|
198
|
+
)
|
|
199
|
+
append_checkpoint(session_file, f'PreCompact: {trigger}', summary)
|
|
200
|
+
|
|
201
|
+
print(f'[PreCompact] セッション状態を {session_file} に保存しました', file=sys.stderr)
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
if __name__ == '__main__':
|
|
205
|
+
main()
|
|
@@ -16,8 +16,8 @@ MVP スコープ(ユーザー承認済み・tier-routing 自動適用フェー
|
|
|
16
16
|
学習データ:
|
|
17
17
|
- 結果は ``.claude/state/tier_selection.json`` に直近 1 件のみ書き込む
|
|
18
18
|
- dev-workflow の各フェーズ承認ゲート(並列タスク単位を含む)で
|
|
19
|
-
``record_agent_outcome.py``
|
|
20
|
-
|
|
19
|
+
``record_agent_outcome.py`` が結果を ``agent_outcomes`` イベントログに記録し、
|
|
20
|
+
bandit params(α/β)は読み取り時に ``read_agent_tier_params`` が導出集計で計算する
|
|
21
21
|
|
|
22
22
|
入力 / 出力:
|
|
23
23
|
- stdin: UserPromptSubmit payload(``prompt`` フィールドを参照)
|
|
@@ -505,8 +505,8 @@ def write_tier_selection(
|
|
|
505
505
|
) -> None:
|
|
506
506
|
"""直近の選択結果を ``tier_selection.json`` に書く。
|
|
507
507
|
|
|
508
|
-
record_agent_outcome.py
|
|
509
|
-
|
|
508
|
+
record_agent_outcome.py が結果を ``agent_outcomes`` イベントログに記録し、
|
|
509
|
+
α/β は読み取り時に導出される。既存ファイルは上書きされる(最新 1 件のみ保持)。
|
|
510
510
|
|
|
511
511
|
``suggested_model`` を併せて書く。tier 名と model の短縮名は同一とする。
|
|
512
512
|
(PO 廃止前は runner.py が読んで ``claude --agents`` 用に使っていたが、v2.0.0 以降は
|
{claude_code_conductor-2.42.0 → claude_code_conductor-2.44.0}/.claude/skills/dev-workflow/SKILL.md
RENAMED
|
@@ -41,6 +41,11 @@ user-invocable: false
|
|
|
41
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
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
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
|
+
|
|
44
49
|
---
|
|
45
50
|
|
|
46
51
|
## フェーズ A: ヒアリング
|
|
@@ -488,6 +493,13 @@ Agent ツールで `developer` エージェントを起動する(`model:` に
|
|
|
488
493
|
Glob で `.claude/reports/debug-needed-*.md` の最新を確認する。
|
|
489
494
|
|
|
490
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
|
+
```
|
|
491
503
|
1. Agent ツールで `systematic-debugger` を起動する。プロンプトに debug-needed ファイルのパスのみを含め、内容は agent 側で Read させる(プロンプトに直接展開しない)[SR-AI-001]
|
|
492
504
|
2. 生成された `.claude/reports/debug-analysis-*.md` を Glob で取得してパスのみコンテキストに保持する(内容は次段で agent に Read させる)
|
|
493
505
|
3. D-2 の developer を再実行する(`model:` に推奨 Tier を指定・上記「tier-routing 結果記録の運用」節参照)。プロンプトに debug-analysis の**ファイルパスのみ**を含め、内容は agent 側で Read させる(プロンプトに展開しない)[SR-AI-001]
|
|
@@ -44,9 +44,10 @@ Usage:
|
|
|
44
44
|
- --tier を明示した場合は TIERS(haiku/sonnet/opus) に含まれるか検証し、
|
|
45
45
|
含まれなければ警告 + 記録スキップとする。ただし --execution=persona かつ
|
|
46
46
|
--tier unknown は明示的な escape 値として許容する。
|
|
47
|
-
-
|
|
48
|
-
|
|
49
|
-
|
|
47
|
+
- 両 execution モードとも agent_outcomes イベントログに記録する。bandit params は
|
|
48
|
+
読み取り時に agent_outcomes から導出計算される(agent_tier_bandit 削除・
|
|
49
|
+
ADR-25-4)。--execution=persona は親 Claude ペルソナ実行のため frontmatter
|
|
50
|
+
model が効かず tier="unknown" で記録される。
|
|
50
51
|
- dedupe: 同一 (session_id, gate, role, outcome, task) が直近 5 分以内に
|
|
51
52
|
記録済みなら 2 回目は skip。--task は任意引数で、省略時同士は従来通り
|
|
52
53
|
(session_id, gate, role, outcome) のみで判定する(後方互換)。task の
|
|
@@ -632,19 +633,10 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
632
633
|
note = _compose_note(note_body, task)
|
|
633
634
|
|
|
634
635
|
try:
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
c3_db.record_agent_outcome_event(
|
|
640
|
-
role=role, complexity=complexity, tier=tier, success=success,
|
|
641
|
-
gate=gate, note=note, session_id=session_id, db_path=db_path,
|
|
642
|
-
)
|
|
643
|
-
else: # persona
|
|
644
|
-
c3_db.record_agent_outcome_event(
|
|
645
|
-
role=role, complexity=complexity, tier=tier, success=success,
|
|
646
|
-
gate=gate, note=note, session_id=session_id, db_path=db_path,
|
|
647
|
-
)
|
|
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
|
+
)
|
|
648
640
|
except Exception as exc: # noqa: BLE001
|
|
649
641
|
print(
|
|
650
642
|
f"[record_agent_outcome] recording failed: {type(exc).__name__}",
|
|
@@ -1,5 +1,39 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [2.44.0] - 2026-07-04
|
|
4
|
+
|
|
5
|
+
### 修正
|
|
6
|
+
|
|
7
|
+
- **PreCompact checkpoint の多重発火をデバウンスで冪等化**: Claude Code ハーネスは 1 回の `/compact` で PreCompact hook を複数回起動することがあり(実測 2〜4 回・payload 違い・公式 docs 非記載の undocumented 挙動)、セッションファイルに同一 checkpoint ブロックが堆積していた(実測で 1 日分ファイルの約 8 割がノイズ化し、翌セッション復元時の読み込みコンテキストを浪費)。`pre_compact.py` が追記前に当日セッションファイル末尾の PreCompact checkpoint timestamp を読み、10 秒以内の再起動なら追記をスキップする。timestamp 不在・parse 不能時は fail-open(従来どおり追記)。実装には ReDoS 対策(行長 512 上限・正規表現を使わない手続きパース)・未来日時 checkpoint の棄却(スキュー許容 60 秒・デバウンス恒久停止の防止)・行区切り文字サニタイズ・stderr 診断ログの切り詰め(64 字)を含む。実機 E2E で 1 compact = 1 ブロックを確認済み。
|
|
8
|
+
- **PreCompact hook の仕様外 additionalContext stdout 出力を撤去**: PreCompact は公式仕様上 `hookSpecificOutput.additionalContext` をサポートしない(サポートされるのは top-level `decision: "block"` + `reason` のみ)。C3 は従来この仕様外 JSON を stdout に出力しており、現行ハーネスの `/compact` で「PreCompact hook JSON output validation failed」警告を誘発していた(additionalContext の注入自体もモデルに届いていた保証がない)。`pre_compact.py` を checkpoint 追記専念に変更し、JSON stdout 出力と `SAVE_INSTRUCTION` 定数を削除。セッションファイルの更新は運用ルール(現在地の常時更新・タスク完了ごとの更新)で担保されているため機能上の後退はない。実機で警告の消滅を確認済み。
|
|
9
|
+
|
|
10
|
+
### 後方互換
|
|
11
|
+
|
|
12
|
+
- `.claude/hooks/pre_compact.py` とそのテストのみの変更で `src/c3/` に変更なし。**破壊的変更なし**。`session_utils.append_checkpoint()` の契約(parallel-agents の wave checkpoint と共用)・`settings.json` の hook 登録は不変。
|
|
13
|
+
|
|
14
|
+
## [2.43.0] - 2026-07-03
|
|
15
|
+
|
|
16
|
+
### 変更
|
|
17
|
+
|
|
18
|
+
- **tier-routing 学習シグナルの客観化と bandit のイベントログ導出化(フェーズ2.5)**: v2.42.0 ソフト適用の実運用で確定した 2 つの構造問題(escalation×ソフト適用による sonnet 探索閉塞デッドロック・レビュー指摘由来の失敗シグナルがモデル能力とタスク難度と レビュワー厳しさの混合物になる問題)を解消する。
|
|
19
|
+
- **失敗シグナルの客観化**: bandit(推奨算出)と escalation の failure rate に集計されるのは `BANDIT_GATES`(D-2.5 / D-3 / D-5 / D-2.5-stuck)の客観ゲートのみになった。E-1/E-2 レビュー指摘由来の記録は**イベントログとして保存を継続**しつつ、集計からは成功・失敗とも対称に除外する(developer の仕事は「動く実装」であり「レビュワーに指摘されない実装」ではない、というシグナル哲学)。
|
|
20
|
+
- **bandit のイベントログ導出化**: `read_agent_tier_params` は `agent_outcomes` イベントログからの導出集計(gate フィルタ付き GROUP BY・placeholder は `len(BANDIT_GATES)` から動的生成)になった。シグナル定義の変更が**過去ログへ遡及適用**されるため、今後の調整で学習データのリセットが不要になる。戻り値契約は不変で select_tier.py / `c3 tier stats` は無改修。
|
|
21
|
+
- **失敗率の時間ベース窓**: `read_agent_failure_rate` の窓が「直近 N 件」から「時間ベース」(`C3_FAILURE_WINDOW_DAYS`・既定 14 日)になった。古い失敗が失効 → サンプル 5 件未満で escalation 停止 → 敗者復活が自然に働き、sonnet 閉塞が解消される(実機で `(None, 1)`・escalation 非発動を確認済み)。
|
|
22
|
+
- **stuck failure の新設**: dev-workflow D-2.5 が `debug-needed-*.md` 検出時(削除前)に `--gate D-2.5-stuck` で developer failure を記録する。「その tier が自力で完走できなかった」という最も客観的な能力シグナル。
|
|
23
|
+
- `record_agent_outcome.py` はイベント記録のみに簡素化(bandit 更新呼び出しを削除)。
|
|
24
|
+
|
|
25
|
+
### 破壊的変更
|
|
26
|
+
|
|
27
|
+
- **旧学習テーブル `agent_tier_bandit` を DROP**(migration 005 が `c3 update` 後の session 開始時に自動適用)。累積 α/β は `agent_outcomes` からの導出に置き換わるため**学習データ自体は失われない**(イベントログから新ルールで即再計算される)。
|
|
28
|
+
- **`src/c3/db.py` の `update_agent_tier_params` を削除**(bandit は書き込み更新されず読み取り時導出になったため)。
|
|
29
|
+
- **v2.41.0 で deprecated 化したシム 5 関数を削除**: `read_tier_params` / `read_tier_failure_rate` / `update_tier_params` / `record_tier_recent_outcome` / `sync_tier_bandit_cost`(予告どおりの削除。直接呼んでいるカスタマイズは移行が必要)。
|
|
30
|
+
- **`read_agent_failure_rate` のシグネチャ変更**: `last_n` 引数を撤去し `window_days`(時間窓)に置換。
|
|
31
|
+
|
|
32
|
+
### 後方互換
|
|
33
|
+
|
|
34
|
+
- `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 日)。
|
|
35
|
+
- 集計対象 gate の限定により `c3 tier stats` の trials 表示は従来より少なくなる(正しいデータでの数え直しであり意図した挙動)。レビュワー系 role(E gate の記録しか持たない role)は bandit 上恒久 uniform 表示になる。
|
|
36
|
+
|
|
3
37
|
## [2.42.0] - 2026-07-03
|
|
4
38
|
|
|
5
39
|
### 追加
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: claude-code-conductor
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.44.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
|
|