claude-code-conductor 2.51.0__tar.gz → 2.52.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.52.0/.claude/docs/nul-boundary.md +232 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/hooks/consolidate_memory.py +4 -4
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/hooks/permission_handler.py +1 -1
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/hooks/planner_check.py +3 -3
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/hooks/recall_inject.py +1 -1
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/hooks/restore_session.py +5 -5
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/hooks/statusline.py +2 -2
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/hooks/stop.py +2 -2
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/dev-workflow/SKILL.md +2 -2
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/dev-workflow/scripts/review_hint_inject.py +2 -2
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/setup/SKILL.md +5 -1
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.gitignore +1 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/CHANGELOG.md +27 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/PKG-INFO +33 -12
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/README.md +32 -11
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/hatch_build.py +1 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/__init__.py +1 -1
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/_excludes.py +1 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/adapters.py +3 -3
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/cli_tier.py +1 -1
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/cli_update.py +1 -1
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/db.py +4 -4
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_adapters.py +8 -2
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_cli_run.py +30 -7
- claude_code_conductor-2.52.0/tests/test_nul_boundary_lint.py +873 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/CLAUDE.md +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/agents/architect.md +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/agents/code-reviewer.md +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/agents/design-critic.md +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/agents/developer.md +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/agents/doc-writer.md +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/agents/interviewer.md +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/agents/planner.md +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/agents/project-setup.md +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/agents/security-reviewer.md +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/agents/systematic-debugger.md +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/agents/tester.md +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/agents/wt_developer.md +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/agents/wt_systematic-debugger.md +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/agents/wt_tester.md +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/breaking-changes.txt +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/deletions.txt +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/docs/config-policy.md +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/docs/parallel-agents-setup.md +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/docs/platform-adapters.md +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/docs/settings.json.md +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/hooks/_hook_utils.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/hooks/check_agent_invocation.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/hooks/permission_handler_toast.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/hooks/post_tool.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/hooks/pre_compact.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/hooks/pre_tool.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/hooks/recall_autorebuild.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/hooks/select_tier.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/hooks/session_start.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/hooks/session_stop.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/hooks/session_utils.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/hooks/tier_autoapply.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/hooks/tier_gap_check.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/hooks/worktree_guard.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/memory/.gitkeep +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/permission_rules.json +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/rules/promoted/index.md +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/settings.json +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/brainstorm/SKILL.md +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/codex-review/SKILL.md +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/dev-workflow/references/code-review-checklist.md +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/dev-workflow/references/design-critic-rubric.md +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/dev-workflow/references/design-rubric.md +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/dev-workflow/references/interview-rubric.md +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/dev-workflow/references/plan-design-guidelines.md +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/dev-workflow/references/security-review-checklist.md +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/dev-workflow/scripts/record_agent_outcome.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/dev-workflow/scripts/record_review_decision.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/develop/SKILL.md +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/doc/SKILL.md +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/extract-lib/SKILL.md +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/init-session/SKILL.md +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/init-session/scripts/session_guard.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/mcp-config/SKILL.md +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/parallel-agents/SKILL.md +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/pattern-status/SKILL.md +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/promote-pattern/SKILL.md +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/recall/SKILL.md +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/report-timestamp/SKILL.md +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/report-timestamp/scripts/get_timestamp.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/review-phase/SKILL.md +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/setup/reference.md +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/setup/templates/coding-standards-template.md +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/setup/templates/project-conventions-template.md +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/start/SKILL.md +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/state/.gitkeep +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/ARCHITECTURE.md +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/LICENSE +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/LICENSES/fastembed-LICENSE +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/LICENSES/fastembed-NOTICE +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/LICENSES/numpy-LICENSE +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/LICENSES/onnxruntime-LICENSE +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/LICENSES/paraphrase-multilingual-MiniLM-L12-v2-LICENSE +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/pyproject.toml +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/__main__.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/_db_params.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/_terminal.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/cli.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/cli_ask.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/cli_doctor.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/cli_init.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/cli_list.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/cli_metrics.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/cli_plan.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/cli_recall.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/cli_run.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/embedding.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/gitutil.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/mcp_server.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/migrate.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/migrations/001_initial.sql +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/migrations/002_agent_cost_runs.sql +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/migrations/003_tier_cost.sql +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/migrations/004_agent_outcomes.sql +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/migrations/005_drop_agent_tier_bandit.sql +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/migrations/006_review_decisions_severity.sql +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/migrations/README.md +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/migrations/__init__.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/paths.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/plan_validator.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/platforms.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/pricing.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/question.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/recall_chunker.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/recall_index.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/src/c3/usage_ingester.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/__init__.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/_pre_compact_helpers.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/conftest.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/fixtures/usage/README.md +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/fixtures/usage/mainline.jsonl +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/fixtures/usage/subagents/agent-deadbeef.jsonl +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/fixtures/usage/subagents/agent-deadbeef.meta.json +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/__init__.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_check_agent_invocation.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_consolidate_memory.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_hook_utils.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_permission_handler.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_permission_handler_toast.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_pip_reinstall_reminder.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_planner_check.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_planner_check_dev.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_post_tool.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_pre_tool.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_recall_autorebuild.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_recall_inject.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_record_agent_outcome.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_record_review_decision.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_restore_session.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_review_hint_inject.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_select_tier.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_select_tier_escalation.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_session_start.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_session_stop.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_session_utils.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_settings_local_absolute_paths.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_settings_tier_autoapply_registration.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_similarity_boost.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_statusline.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_statusline_template_sync.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_sync_check.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_template_guard.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_tier_autoapply.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_tier_gap_check.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/hooks/test_tier_security_fixes.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/skills/__init__.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/skills/_skill_helpers.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/skills/test_dev_workflow_no_task_type.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/skills/test_init_session_no_task_type.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/skills/test_parallel_agents_skill_tier.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/skills/test_planner_lightweight.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/skills/test_recall_skill.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/skills/test_session_backlog_reconciliation.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/skills/test_session_guard.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/skills/test_setup_templates.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/skills/test_start_skill_bugfix_flow.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/skills/test_start_skill_new_flow.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/skills/test_start_skill_security_audit_phase.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_check_deletions.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_cli_ask.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_cli_doctor.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_cli_doctor_launcher.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_cli_entry.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_cli_init.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_cli_list.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_cli_metrics.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_cli_plan.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_cli_recall.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_cli_tier.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_cli_update_breaking_changes.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_cli_update_deletions.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_db.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_docstring_consistency.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_embedding.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_excludes.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_extract_breaking_changes.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_gitutil.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_mcp_server_elicit.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_migrate.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_no_bare_python_launcher.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_paths.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_plan_validator.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_pre_compact.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_pre_tool_hook.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_precompact_additional.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_precompact_toctou_fixes.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_pricing.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_recall_chunker.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_recall_index.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_references_migration.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_session_utils_additional.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_skill_no_builtin_conflict.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_statusline.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_stop_additional.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_stop_hook.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_stop_precompact_fixes.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_sync_template_stop.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_template_pre_tool_hook.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_usage_ingester.py +0 -0
- {claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/tests/test_worktree_guard.py +0 -0
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
# NUL 境界 lint — 宣言マーカーの規約
|
|
2
|
+
|
|
3
|
+
このドキュメントは、C3 配布物に含まれるコードから見かける
|
|
4
|
+
`# nul-boundary: allow(<理由>)` マーカーの意味と使い方を説明します。
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## マーカーの意味
|
|
9
|
+
|
|
10
|
+
### 標準形
|
|
11
|
+
|
|
12
|
+
```python
|
|
13
|
+
# nul-boundary: allow(なぜこの join が NUL 区切りでないのか)
|
|
14
|
+
result = "\n".join(items)
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
**意味**: この `str.join()` 呼び出しが `"\n"` や `", "` などの NUL 以外を区切りにしているのは、
|
|
18
|
+
意図的かつ妥当である、ということを宣言しています。
|
|
19
|
+
|
|
20
|
+
### 語彙は 1 種のみ
|
|
21
|
+
|
|
22
|
+
マーカーの形は **`allow(<理由>)` の 1 種だけ**です。
|
|
23
|
+
|
|
24
|
+
- ✅ `allow(人間可読な出力なので改行を維持)` — OK
|
|
25
|
+
- ❌ `human(...)` / `safe(...)` / `fixed(...)` / `legacy(...)` — これらは使いません
|
|
26
|
+
|
|
27
|
+
理由は、**マーカーは「意図的に NUL ではない」以上のことを主張しない**ためです。
|
|
28
|
+
真偽を機械が検査できない分類語を足すと、設計と実装が乖離した瞬間に嘘になります。
|
|
29
|
+
中立な 1 語に統一することで、その穴を消しています。
|
|
30
|
+
|
|
31
|
+
### 理由は 5 文字以上
|
|
32
|
+
|
|
33
|
+
理由部分(括弧の中身)は、**`strip()` 後に 5 文字以上**である必要があります。
|
|
34
|
+
|
|
35
|
+
- ✅ `allow(display output)` — 5文字
|
|
36
|
+
- ✅ `allow( 永続ファイルの後方互換性を保つ )` — strip 後で十分
|
|
37
|
+
- ❌ `allow()` / `allow( )` — 理由がない
|
|
38
|
+
- ❌ `allow(ok)` — 2文字では不足
|
|
39
|
+
|
|
40
|
+
この下限は「honor system の最小限」です。一言では説明できない程度の具体性を強制します。
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## 配置規則
|
|
45
|
+
|
|
46
|
+
マーカーは、対象となる `join` 呼び出しに結び付けられます。その結び付けは以下の順序で行われます。
|
|
47
|
+
|
|
48
|
+
### 規則 1: 同一行(行末)
|
|
49
|
+
|
|
50
|
+
マーカーが行 `L` にあり、その行に `join` 呼び出しが含まれるなら、そこに結び付きます。
|
|
51
|
+
|
|
52
|
+
```python
|
|
53
|
+
result = "\n".join(items) # nul-boundary: allow(説明)
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
これが最優先の配置方法です。
|
|
57
|
+
|
|
58
|
+
### 規則 2: 直前行
|
|
59
|
+
|
|
60
|
+
マーカーが行 `L` にあり、規則 1 が成立しない場合のみ、
|
|
61
|
+
その「直前行 `L+1`」に `join` があれば結び付きます。
|
|
62
|
+
|
|
63
|
+
```python
|
|
64
|
+
# nul-boundary: allow(説明)
|
|
65
|
+
result = "\n".join(items)
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
**重要**: 「直前」は厳密に `L+1` です。間に別の行が 1 行でも挟まると、結び付きません。
|
|
69
|
+
|
|
70
|
+
```python
|
|
71
|
+
# nul-boundary: allow(説明)
|
|
72
|
+
# このコメント行が間に挟まってしまった
|
|
73
|
+
result = "\n".join(items) # ← この join は宣言で保護されていません
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### 規則 3: 複数対象の場合は無効
|
|
77
|
+
|
|
78
|
+
マーカーが複数の `join` に結び付こうとする場合、**その宣言はどの対象も保護しません** (fail-closed)。
|
|
79
|
+
|
|
80
|
+
```python
|
|
81
|
+
x = "\n".join(items1)
|
|
82
|
+
y = "\n".join(items2) # nul-boundary: allow(説明)
|
|
83
|
+
# ← 上下両方に結び付く可能性があるため、この宣言は無効
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
この場合、**両方** の行に宣言を書く必要があります:
|
|
87
|
+
|
|
88
|
+
```python
|
|
89
|
+
x = "\n".join(items1) # nul-boundary: allow(説明)
|
|
90
|
+
y = "\n".join(items2) # nul-boundary: allow(説明)
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### 特例: f-string 内の `join`
|
|
94
|
+
|
|
95
|
+
f-string 内に `join` がある場合、マーカーを f-string の内側に置くことはできません。
|
|
96
|
+
この場合、**包含する文の どこか**(例えば末尾行の行末)にマーカーを置きます:
|
|
97
|
+
|
|
98
|
+
```python
|
|
99
|
+
result = (f"header\n"
|
|
100
|
+
f"{items.join(x)}\n"
|
|
101
|
+
f"footer") # nul-boundary: allow(説明)
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
マーカーの結び付け判定では、f-string 内の `join` の行範囲を「包含する文の行範囲」に置き換えて処理します。
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## なぜ NUL 境界則があるのか
|
|
109
|
+
|
|
110
|
+
C3 で「同じ穴を 6 回開けた」経験があります:
|
|
111
|
+
|
|
112
|
+
| # | 例 | 内容 |
|
|
113
|
+
|---|---|---|
|
|
114
|
+
| 1 | ポーセレン CLI 出力の処理 | `\n` 結合による境界偽装 |
|
|
115
|
+
| 2 | tracked ブロック | `-z` で NUL 取得したものを `\n` で再結合 |
|
|
116
|
+
| 3 | `format_ignored_manifest` | tracked を NUL 化しても manifest は `\n` のまま |
|
|
117
|
+
| 4 | 設定の指紋化 | 同型の穴が繰り返す |
|
|
118
|
+
| 5 | pytest 設定ハッシュ | 「軽量」な実装が同じ完全性を要求される |
|
|
119
|
+
| 6 | manifest の曖昧区切り | 2 スペース区切り=同型の脅威 |
|
|
120
|
+
|
|
121
|
+
**3 回を超えたら個別に直すのをやめて、ルール化+機械検査化する潮時** という教訓です。
|
|
122
|
+
|
|
123
|
+
機械可読なデータ(ログ行・ハッシュ入力・パス一覧など)がパイプラインを流れる場合:
|
|
124
|
+
|
|
125
|
+
- **区切りは NUL で切る**(`"\x00"`・1 文字ちょうど)
|
|
126
|
+
- **`\n` は人間可読出力にのみ使う**(表示・ユーザーへのメッセージ)
|
|
127
|
+
|
|
128
|
+
この分離により、外部由来の値に改行が混ざっても、機械可読側は境界を偽装されません。
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## 既知の限界
|
|
133
|
+
|
|
134
|
+
以下の 7 項目は機械検査の対象外です。
|
|
135
|
+
|
|
136
|
+
| ID | 限界 | 影響 |
|
|
137
|
+
|---|---|---|
|
|
138
|
+
| L-1 | `+` 演算子による `\n` 連結を検出しない | 例: `a + "\n" + b` |
|
|
139
|
+
| L-2 | f-string / `%` 書式による組み立てを検出しない | 行集合の構築に f-string 使用 |
|
|
140
|
+
| L-3 | `split` 側の非対称を検出しない | NUL で結合し `\n` で分割する場合など |
|
|
141
|
+
| L-4 | **宣言の内容の真偽は検査しない** | `allow(...)` の理由に嘘を書けば通る |
|
|
142
|
+
| L-5 | NUL 区切りの場合、**要素側に NUL が含まれない**ことは検査しない | 外部由来値に NUL が混ぜば偽装は成立 |
|
|
143
|
+
| L-6 | 走査対象は 4 ディレクトリに限る | `.dev/hooks` / `scripts` / `tests` は対象外 |
|
|
144
|
+
| L-7 | **`allow` で `\n` を維持した箇所、要素側に改行が混入しないことは保証しない** | `\n` 区切りを保つ以上、要素に改行が入れば境界偽装は成立 |
|
|
145
|
+
|
|
146
|
+
このうち **L-4** と **L-7** が重要です:
|
|
147
|
+
|
|
148
|
+
### L-4: 理由の真偽は検査しない
|
|
149
|
+
|
|
150
|
+
例えば:
|
|
151
|
+
|
|
152
|
+
```python
|
|
153
|
+
# nul-boundary: allow(後方互換性が要る永続形式なので)
|
|
154
|
+
# → しかし実は一度限りの出力(互換性は不要)
|
|
155
|
+
result = "\n".join(items)
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
こういった嘘は機械では検出できません。
|
|
159
|
+
**宣言の妥当性は E フェーズのレビューと `git blame` で担保します**。
|
|
160
|
+
|
|
161
|
+
### L-7: `\n` 維持時の要素側改行
|
|
162
|
+
|
|
163
|
+
`allow` で `\n` 区切りを維持した箇所については、
|
|
164
|
+
要素(区切られる側)に改行が入らないことは保証しません。
|
|
165
|
+
|
|
166
|
+
例えば:
|
|
167
|
+
|
|
168
|
+
```python
|
|
169
|
+
# nul-boundary: allow(状態ファイルなので人間可読性のため \n を維持)
|
|
170
|
+
lines = log_entries # ← このリスト要素が実は複数行テキストなら?
|
|
171
|
+
result = "\n".join(lines)
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
要素側での改行混入を防ぐのは呼び出し元の責務です。
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
## 理由文の書き方
|
|
179
|
+
|
|
180
|
+
理由には「**なぜ NUL にできない/する必要がないか**」を具体的に書きます。
|
|
181
|
+
書式は**自由記述**(ラベルの種別分けは不要)です。
|
|
182
|
+
|
|
183
|
+
### よい例
|
|
184
|
+
|
|
185
|
+
- `allow(人間が直接編集するファイルなので改行ベース)` — 用途が明確
|
|
186
|
+
- `allow(永続形式で過去バージョンとの互換性が必須)` — 制約の根拠がある
|
|
187
|
+
- `allow(正規表現の `\n` 境界に依存した処理が下流にある)` — 外部制約を示唆
|
|
188
|
+
- `allow(status/commit メッセージは`git`が改行で期待するため)` — 標準仕様に依存
|
|
189
|
+
|
|
190
|
+
### 避けるべき書き方
|
|
191
|
+
|
|
192
|
+
- `allow(human)` — 理由でなく分類語(機械検査できない)
|
|
193
|
+
- `allow(safe)` — 同上
|
|
194
|
+
- `allow(ok)` — 説明が短すぎる
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
## 検査は配布元でのみ
|
|
199
|
+
|
|
200
|
+
この `nul-boundary` 検査(`tests/test_nul_boundary_lint.py`)は、
|
|
201
|
+
C3 の配布元リポジトリでのみ実行されます。
|
|
202
|
+
|
|
203
|
+
C3 を配布先で `pip install c3-***.whl` でインストールしたユーザーは:
|
|
204
|
+
|
|
205
|
+
- マーカー `# nul-boundary: allow(...)` は、コード内のコメントとして見えます
|
|
206
|
+
- **検査ツール自体は wheel に含まれません** (`tests/` は配布対象外)
|
|
207
|
+
|
|
208
|
+
ユーザーが C3 をカスタマイズして新しい `join` を追加した場合:
|
|
209
|
+
|
|
210
|
+
1. このドキュメントを参考にして、**マーカーの配置規則に従って**宣言を書いてください
|
|
211
|
+
2. **理由は 5 文字以上、具体的に書いてください**
|
|
212
|
+
3. 配布元へ PR を送る際は、配布元の CI で `tests/test_nul_boundary_lint.py` が走り、
|
|
213
|
+
テスト出力で確認できます
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## 参照・関連
|
|
218
|
+
|
|
219
|
+
- **実装・リレビューの必須チェック**: `.claude/skills/autonomous-mode/SKILL.md` §(a)
|
|
220
|
+
- **auto-memory**: `feedback_nul_boundary_for_machine_readable_line_sets` — 一般則の背景と根拠
|
|
221
|
+
- **計画**: `plan-report-*.md` §5 T4 — 文書作成の指示と成功条件
|
|
222
|
+
|
|
223
|
+
---
|
|
224
|
+
|
|
225
|
+
## 配布物への含有確認
|
|
226
|
+
|
|
227
|
+
**3 ファイル同期の判断記録**(CLAUDE.md §2):
|
|
228
|
+
|
|
229
|
+
`.gitignore` / `src/c3/_excludes.py` / `hatch_build.py` **の変更は不要**。
|
|
230
|
+
|
|
231
|
+
理由: `src/c3/_excludes.py:33` は `docs/*` の一括除外を持たず、個別列挙のみ(`decisions.md` など明示的に除外対象の文書を明記)。
|
|
232
|
+
本ドキュメント `docs/nul-boundary.md` は除外リストに載らないため、既定で `wheel` に含まれます。
|
{claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/hooks/consolidate_memory.py
RENAMED
|
@@ -205,7 +205,7 @@ def build_summary_markdown(
|
|
|
205
205
|
lines.append("_該当エントリなし_")
|
|
206
206
|
lines.append("")
|
|
207
207
|
|
|
208
|
-
return "\n".join(lines).rstrip() + "\n"
|
|
208
|
+
return "\n".join(lines).rstrip() + "\n" # nul-boundary: allow(Markdown 文書の行組み立て。行そのものが文書構造で split 対象ではない)
|
|
209
209
|
|
|
210
210
|
|
|
211
211
|
def write_summary(
|
|
@@ -361,7 +361,7 @@ def build_promotion_candidates_section(
|
|
|
361
361
|
lines.append(f"_候補数: 0 / 最終確認: {today_str}_")
|
|
362
362
|
lines.append("")
|
|
363
363
|
lines.append("_該当エントリなし_")
|
|
364
|
-
return "\n".join(lines), candidates
|
|
364
|
+
return "\n".join(lines), candidates # nul-boundary: allow(consolidated_summary.md の昇格候補セクション本文。人間が読む Markdown で機械パースしない)
|
|
365
365
|
|
|
366
366
|
lines.append(
|
|
367
367
|
f"_候補数: {len(candidates)} / 最終確認: {today_str} / "
|
|
@@ -376,7 +376,7 @@ def build_promotion_candidates_section(
|
|
|
376
376
|
except (TypeError, ValueError):
|
|
377
377
|
trust_str = "?"
|
|
378
378
|
lines.append(f"- `{cid}` (trust {trust_str})")
|
|
379
|
-
return "\n".join(lines), candidates
|
|
379
|
+
return "\n".join(lines), candidates # nul-boundary: allow(consolidated_summary.md の昇格候補一覧本文。人間が読む Markdown で機械パースしない)
|
|
380
380
|
|
|
381
381
|
|
|
382
382
|
def _extract_candidate_fields(c: dict) -> dict:
|
|
@@ -479,7 +479,7 @@ def write_promotion_candidates_log(
|
|
|
479
479
|
lines.append(f"- {safe_desc}")
|
|
480
480
|
lines.append("")
|
|
481
481
|
|
|
482
|
-
payload = "\n".join(lines).rstrip() + "\n"
|
|
482
|
+
payload = "\n".join(lines).rstrip() + "\n" # nul-boundary: allow(promotion-candidates.md の昇格候補一覧本文。人間が読む Markdown で機械パースしない・"毎回上書き"のため後方互換制約はない)
|
|
483
483
|
return _atomic_write(output_path, payload)
|
|
484
484
|
|
|
485
485
|
|
{claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/hooks/permission_handler.py
RENAMED
|
@@ -106,7 +106,7 @@ def _glob_to_regex(pattern: str) -> str:
|
|
|
106
106
|
# ** を一時プレースホルダーに退避してから * と ** を別々に処理する
|
|
107
107
|
parts = pattern.split('**')
|
|
108
108
|
escaped = [re.escape(p).replace(r'\*', '[^/]*') for p in parts]
|
|
109
|
-
return '.*'.join(escaped)
|
|
109
|
+
return '.*'.join(escaped) # nul-boundary: allow(glob を正規表現へ変換する組み立て。区切り .* は正規表現の文法で固定)
|
|
110
110
|
|
|
111
111
|
|
|
112
112
|
def _match_file_path(raw: str, p_arg: str) -> bool:
|
{claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/hooks/planner_check.py
RENAMED
|
@@ -198,7 +198,7 @@ def _check_r4_writes_conflicts(tasks: list) -> list[str]:
|
|
|
198
198
|
if _all_pairs_transitively_ordered(claim_ids, ancestors):
|
|
199
199
|
continue
|
|
200
200
|
# claim_ids は task id の生 join のため、特殊文字を repr で逃がして安全に出力する
|
|
201
|
-
joined = ", ".join(repr(cid) for cid in sorted(claim_ids))
|
|
201
|
+
joined = ", ".join(repr(cid) for cid in sorted(claim_ids)) # nul-boundary: allow(stderr へ出す人間可読な警告文に埋め込む列挙。機械可読な行集合ではない)
|
|
202
202
|
violations.append(
|
|
203
203
|
f"R4: writes {path!r} を複数 task ({joined}) "
|
|
204
204
|
"が宣言していますが depends_on で順序付けされていません。"
|
|
@@ -272,7 +272,7 @@ def main() -> None:
|
|
|
272
272
|
if warnings:
|
|
273
273
|
# 検出されたルール名(R2/R4/R6)を抽出してデバッグログに記録
|
|
274
274
|
detected_rules = sorted({m.split(":")[0] for m in warnings if ":" in m})
|
|
275
|
-
write_debug_log(DEBUG_LOG_PATH, f"{basename} WARN {','.join(detected_rules)}")
|
|
275
|
+
write_debug_log(DEBUG_LOG_PATH, f"{basename} WARN {','.join(detected_rules)}") # nul-boundary: allow(デバッグログ 1 行に載せる検出ルール名の列挙。人間が読む log で再パースしない)
|
|
276
276
|
# 経路1: stderr に人間向けメッセージ(ターミナル表示用)
|
|
277
277
|
print("[PlannerCheck WARN] plan-report の検査で違反を検出しました:",
|
|
278
278
|
file=sys.stderr)
|
|
@@ -285,7 +285,7 @@ def main() -> None:
|
|
|
285
285
|
# LLM のコンテキストウィンドウに挿入する(公式仕様)
|
|
286
286
|
additional_context = (
|
|
287
287
|
"[PlannerCheck WARN] plan-report の検査で違反を検出しました:\n"
|
|
288
|
-
+ "\n".join(f" - {msg}" for msg in sanitized_warnings)
|
|
288
|
+
+ "\n".join(f" - {msg}" for msg in sanitized_warnings) # nul-boundary: allow(LLM へ注入する人間可読メッセージ本文。表示専用で行集合として再パースしない)
|
|
289
289
|
+ "\n\n"
|
|
290
290
|
+ "ルールの詳細は .claude/skills/dev-workflow/references/plan-design-guidelines.md を参照。"
|
|
291
291
|
+ "意図的に許容する場合はユーザーに確認を取ること。"
|
{claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/hooks/recall_inject.py
RENAMED
|
@@ -147,7 +147,7 @@ def format_additional_context(hits: Iterable[dict], *, stale: bool = False) -> s
|
|
|
147
147
|
lines.append(f" [{i}] score={score_str} {path} :: {label}")
|
|
148
148
|
if snippet:
|
|
149
149
|
lines.append(f" {snippet}")
|
|
150
|
-
return "\n".join(lines)
|
|
150
|
+
return "\n".join(lines) # nul-boundary: allow(LLM コンテキストへ注入する人間可読テキスト。表示専用で再パースしない)
|
|
151
151
|
|
|
152
152
|
|
|
153
153
|
def find_repo_root() -> Path | None:
|
{claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/hooks/restore_session.py
RENAMED
|
@@ -101,7 +101,7 @@ def _tail(text: str, n: int) -> str:
|
|
|
101
101
|
仕様として明記・固定する。
|
|
102
102
|
"""
|
|
103
103
|
lines = text.splitlines()
|
|
104
|
-
return '\n'.join(lines[-n:]) if len(lines) > n else text
|
|
104
|
+
return '\n'.join(lines[-n:]) if len(lines) > n else text # nul-boundary: allow(末尾 N 行を人間可読テキストへ戻す。呼び出し元は表示のため再 splitlines するだけ)
|
|
105
105
|
|
|
106
106
|
|
|
107
107
|
def _sanitize_genba(value: str) -> str:
|
|
@@ -175,23 +175,23 @@ def main():
|
|
|
175
175
|
# ③残タスク(- [ ] 行のみ・0件ならセクション省略)
|
|
176
176
|
if pending_todos:
|
|
177
177
|
lines.append('\n## 残タスク')
|
|
178
|
-
lines.append('\n'.join(pending_todos))
|
|
178
|
+
lines.append('\n'.join(pending_todos)) # nul-boundary: allow(stdout へ出す復元メッセージの残タスク段落。表示専用)
|
|
179
179
|
|
|
180
180
|
# ④うまくいったアプローチ(末尾 N 行に切り詰め・行単位でサニタイズ)(SR M-2)
|
|
181
181
|
if successes:
|
|
182
182
|
lines.append('\n## うまくいったアプローチ')
|
|
183
183
|
tail_text = _tail(successes, APPROACH_TAIL_LINES)
|
|
184
184
|
sanitized_lines = [_sanitize(line) for line in tail_text.splitlines()]
|
|
185
|
-
lines.append('\n'.join(sanitized_lines))
|
|
185
|
+
lines.append('\n'.join(sanitized_lines)) # nul-boundary: allow(stdout へ出す復元メッセージの成功アプローチ段落。表示専用)
|
|
186
186
|
|
|
187
187
|
# ⑤試みたが失敗したアプローチ(末尾 N 行に切り詰め・行単位でサニタイズ)(SR M-2)
|
|
188
188
|
if failures:
|
|
189
189
|
lines.append('\n## 試みたが失敗したアプローチ')
|
|
190
190
|
tail_text = _tail(failures, APPROACH_TAIL_LINES)
|
|
191
191
|
sanitized_lines = [_sanitize(line) for line in tail_text.splitlines()]
|
|
192
|
-
lines.append('\n'.join(sanitized_lines))
|
|
192
|
+
lines.append('\n'.join(sanitized_lines)) # nul-boundary: allow(stdout へ出す復元メッセージの失敗アプローチ段落。表示専用)
|
|
193
193
|
|
|
194
|
-
print('\n'.join(lines))
|
|
194
|
+
print('\n'.join(lines)) # nul-boundary: allow(stdout へ出力する復元メッセージ全体。読み手は Claude Code の表示でリポジトリ内に split 側がない)
|
|
195
195
|
|
|
196
196
|
|
|
197
197
|
if __name__ == '__main__':
|
|
@@ -127,9 +127,9 @@ def render_output(raw: str) -> None:
|
|
|
127
127
|
|
|
128
128
|
output_parts: list[str] = []
|
|
129
129
|
if header:
|
|
130
|
-
output_parts.append(' '.join(header))
|
|
130
|
+
output_parts.append(' '.join(header)) # nul-boundary: allow(ステータスライン先頭部の表示文字列。読み手は Claude Code の表示でリポジトリ内に split 側がない)
|
|
131
131
|
output_parts.extend(metrics)
|
|
132
|
-
sys.stdout.write(' | '.join(output_parts) + '\n')
|
|
132
|
+
sys.stdout.write(' | '.join(output_parts) + '\n') # nul-boundary: allow(ステータスライン 1 行の区切り表示。区切り文字が表示書式そのもの)
|
|
133
133
|
sys.stdout.flush()
|
|
134
134
|
|
|
135
135
|
|
|
@@ -113,7 +113,7 @@ def _inherit_backlog_from_latest_session(
|
|
|
113
113
|
except OSError:
|
|
114
114
|
return
|
|
115
115
|
|
|
116
|
-
inheritance_block = '\n'.join(pending_tasks) + '\n'
|
|
116
|
+
inheritance_block = '\n'.join(pending_tasks) + '\n' # nul-boundary: allow(セッション .tmp の残タスクセクションへ書く行。利用先に旧形式が既に存在する永続形式で後方互換が要る)
|
|
117
117
|
updated = new_content.replace(
|
|
118
118
|
'## 残タスク\n',
|
|
119
119
|
f'## 残タスク\n{inheritance_block}',
|
|
@@ -180,7 +180,7 @@ def _apply_session_updates(path: str, content: str, message: str = '') -> None:
|
|
|
180
180
|
# 古い応答は積極的に上書きしてよい。古い `not in updated` ガードは「最初の応答が
|
|
181
181
|
# 一日中残る」問題を引き起こしていた。
|
|
182
182
|
if message:
|
|
183
|
-
single_line = ' '.join(message.split())
|
|
183
|
+
single_line = ' '.join(message.split()) # nul-boundary: allow(最終応答を単一行へ平坦化する空白正規化。そもそも行集合ではない)
|
|
184
184
|
# サロゲート文字など UTF-8 非互換文字を除去(JSON デコード時に生成される場合がある)
|
|
185
185
|
single_line = single_line.encode('utf-8', errors='replace').decode('utf-8')
|
|
186
186
|
truncated = single_line[:MAX_LAST_MSG]
|
{claude_code_conductor-2.51.0 → claude_code_conductor-2.52.0}/.claude/skills/dev-workflow/SKILL.md
RENAMED
|
@@ -30,8 +30,8 @@ user-invocable: false
|
|
|
30
30
|
session.tmp の `モード:` 行を確認する。**有効な自律宣言**(§3-3)でなければ**以下の各ゲートを
|
|
31
31
|
記載どおり AskUserQuestion で実行する(従来動作)**。有効な自律宣言のときのみ、
|
|
32
32
|
`.claude/skills/autonomous-mode/SKILL.md` の「ゲート対応表」に従って承認ゲートを客観収束条件に
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
付け替える。**非可逆操作の関所・情報不足の質問の 2 類型は常に人間**(自律でも停止して確認する)。なお
|
|
34
|
+
`autonomous-mode` skill は配布元限定のため配布物には含まれず、**利用先では自律宣言は常に無効**=HITL で動作する。
|
|
35
35
|
|
|
36
36
|
> **skill 未 Read でも『モード行を見て skill を Read せよ』の 1 段で復帰できる** — develop / review-phase を「直接開始」した場合(init-session を経ない起動)、autonomous-mode skill の明示 Read が挟まらない可能性がある。ただし本ブロックが
|
|
37
37
|
> 各ゲートで `モード:` 行の確認を要求するため、skill 未 Read でも「モード行を見て skill を Read せよ」
|
|
@@ -162,7 +162,7 @@ def build_hint_section(
|
|
|
162
162
|
summary_parts.append(f"許容 {accepted}")
|
|
163
163
|
if deferred:
|
|
164
164
|
summary_parts.append(f"保留 {deferred}")
|
|
165
|
-
lines.append(f"- 過去 {total} 件: " + " / ".join(summary_parts))
|
|
165
|
+
lines.append(f"- 過去 {total} 件: " + " / ".join(summary_parts)) # nul-boundary: allow(人間可読なサマリ表示の断片。機械可読な行集合ではない)
|
|
166
166
|
|
|
167
167
|
# 直近の判断
|
|
168
168
|
latest = rows[0]
|
|
@@ -185,7 +185,7 @@ def build_hint_section(
|
|
|
185
185
|
lines.append(f"- `{cid}` は code-reviewer と security-reviewer の両方で指摘されています")
|
|
186
186
|
lines.append("")
|
|
187
187
|
|
|
188
|
-
return "\n".join(lines).rstrip() + "\n"
|
|
188
|
+
return "\n".join(lines).rstrip() + "\n" # nul-boundary: allow(レポート末尾へ追記する Markdown 本文。文書形式で再パースしない)
|
|
189
189
|
|
|
190
190
|
|
|
191
191
|
def append_hints_to_report(
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: 技術スタックと独自規約をヒアリングして project-setup エージェントに coding-standards.md と project-conventions.md を生成させる。プロジェクト開始時に使用する。
|
|
3
|
-
disable-model-invocation: true
|
|
4
3
|
---
|
|
5
4
|
|
|
6
5
|
# setup
|
|
@@ -8,6 +7,11 @@ disable-model-invocation: true
|
|
|
8
7
|
プロジェクトのコーディング規約を設定する。
|
|
9
8
|
ヒアリングは親 Claude が担当し、収集後に project-setup エージェントを起動する。
|
|
10
9
|
|
|
10
|
+
> **起動経路の制約**: 本 skill の起動は (a) ユーザーの `/setup` 明示呼び出し、
|
|
11
|
+
> (b) `init-session` ガード G-2 が `SETUP_NEEDED` を検出した際のチェーン起動、の 2 経路のみ。
|
|
12
|
+
> それ以外の場面で LLM の判断により自発的に起動してはならない
|
|
13
|
+
> (frontmatter で model invocation を禁止しない理由は G-2 チェーン起動を許可するため。v2.38.0 設計)。
|
|
14
|
+
|
|
11
15
|
---
|
|
12
16
|
|
|
13
17
|
## Phase 1: 技術スタックのヒアリング(親 Claude が実施)
|
|
@@ -1,5 +1,32 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [2.52.0] - 2026-07-23
|
|
4
|
+
|
|
5
|
+
### 追加
|
|
6
|
+
|
|
7
|
+
- **NUL 境界原則の機械検査を追加**: `tests/test_nul_boundary_lint.py` を新設し、AST で `str.join` の呼び出しを全件検出したうえで、宣言マーカー `# nul-boundary: allow(<理由>)`(`tokenize.COMMENT` 限定・理由 5 文字以上)が付いていない使用を違反として検出する。外部由来文字列による境界偽装(改行結合した行集合を機械パースする箇所で発生しうる)を、レビューの目視ではなくテストで恒久的に塞ぐ
|
|
8
|
+
- **`.claude/docs/nul-boundary.md` を新設(配布対象)**: 「機械可読な行集合の区切りは NUL・改行は人間可読出力のみ」という NUL 境界原則と、`allow` 宣言の書式・判断基準をまとめた規約文書
|
|
9
|
+
|
|
10
|
+
### 変更
|
|
11
|
+
|
|
12
|
+
- **配布 hook 8 本・`src/c3` 4 本の `join` 使用箇所に `allow` 宣言コメントを追記**(追跡対象 29 件)。`consolidate_memory.py` / `permission_handler.py` / `planner_check.py` / `recall_inject.py` / `restore_session.py` / `statusline.py` / `stop.py` / `dev-workflow/scripts/review_hint_inject.py`、`adapters.py` / `cli_tier.py` / `cli_update.py` / `db.py` が対象。**いずれもコメント追記のみでロジック変更はなく、原則に照らした是正が必要な箇所は 0 件だった**(既存の join は全て人間可読出力向けと確認)
|
|
13
|
+
- **dev-workflow の「運転モードによるゲート挙動の切替」ブロックの記述を更新**: 自律モード時にも常に人間が判断する関所を「非可逆操作・情報不足の質問・重量フェーズ着手前の usage 確認」の 3 類型から、**「非可逆操作・情報不足の質問」の 2 類型**へ縮退した。あわせて、`autonomous-mode` skill は配布元限定で配布物に含まれないこと・**利用先では自律宣言が常に無効(= HITL で動作)** であることを本文に明記した(配布元での自律モード規約改訂に伴う、配布物側の記述整合)
|
|
14
|
+
|
|
15
|
+
### 後方互換
|
|
16
|
+
|
|
17
|
+
- **破壊的変更なし**。`autonomous-mode` skill は wheel 非収録で利用先には存在せず、自律モードそのものを起動できない。今回の dev-workflow の変更は「有効な自律宣言があるときの説明文」に閉じており、既定の HITL 動作(各ゲートを AskUserQuestion で実行)は無変更のため、利用先の実挙動は変わらない
|
|
18
|
+
- NUL 境界 lint は配布物に対する追加検査であり、既存 hook / CLI の動作は不変(コメント追記のみ)
|
|
19
|
+
|
|
20
|
+
## [2.51.1] - 2026-07-22
|
|
21
|
+
|
|
22
|
+
### 修正
|
|
23
|
+
|
|
24
|
+
- **setup skill が Skill ツール(AI)から起動できず、init-session の自動チェーン(G-2)が機能しない defect を修正**: `setup/SKILL.md` の frontmatter `disable-model-invocation: true`(2026-05-03 の commands→skills 移行時に付与)が、v2.38.0 で導入した /start→/init-session→/setup 自動チェーン設計と矛盾していた。利用先の初回導入(`SETUP_NEEDED` 検出時)でチェーン起動がブロックされ、手動での `/setup` 実行を強いられていた(利用先プロジェクトで実地確認)。frontmatter からフラグを削除し、代わりに本文へ起動経路の制約(ユーザーの `/setup` 明示呼び出し・init-session G-2 チェーンの 2 経路のみ。それ以外の自発起動は禁止)を明記した
|
|
25
|
+
|
|
26
|
+
### 後方互換
|
|
27
|
+
|
|
28
|
+
- 既存利用先への影響なし。setup 実施済みプロジェクト(`setup_done.flag` あり)では G-2 が発火しないため挙動不変。破壊的変更なし
|
|
29
|
+
|
|
3
30
|
## [2.51.0] - 2026-07-18
|
|
4
31
|
|
|
5
32
|
### 追加
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: claude-code-conductor
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.52.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
|
|
@@ -66,14 +66,16 @@ Claude Code Conductor(C3)は「親 Claude が複数の専門エージェン
|
|
|
66
66
|
ユーザー
|
|
67
67
|
↓ /start, /develop, /review-phase, /doc, /mcp-config, /extract-lib ...
|
|
68
68
|
親 Claude(オーケストレーター)
|
|
69
|
-
├─ interviewer
|
|
70
|
-
├─ architect
|
|
71
|
-
├─ planner
|
|
72
|
-
├─
|
|
73
|
-
├─
|
|
74
|
-
├─
|
|
75
|
-
├─
|
|
76
|
-
|
|
69
|
+
├─ interviewer ← ヒアリング
|
|
70
|
+
├─ architect ← 設計
|
|
71
|
+
├─ planner ← タスク計画
|
|
72
|
+
├─ design-critic ← 設計・計画の監査
|
|
73
|
+
├─ developer ← 実装
|
|
74
|
+
├─ tester ← テスト
|
|
75
|
+
├─ code-reviewer ← コードレビュー
|
|
76
|
+
├─ security-reviewer ← セキュリティレビュー
|
|
77
|
+
├─ systematic-debugger ← デバッグ調査
|
|
78
|
+
└─ doc-writer ← ドキュメント生成
|
|
77
79
|
```
|
|
78
80
|
|
|
79
81
|
各エージェントは明確なスコープを持ち、担当外の作業は行いません。
|
|
@@ -149,7 +151,7 @@ C3 では「どのファイルをどこに置くべきか」の定義が設計
|
|
|
149
151
|
フェーズ B: 設計 architecture-report を生成
|
|
150
152
|
↓ 承認
|
|
151
153
|
フェーズ C: 計画 plan-report を生成
|
|
152
|
-
↓
|
|
154
|
+
↓ 承認(任意で design-critic が設計・計画を監査 → design-review-report)
|
|
153
155
|
フェーズ D: TDD tester → developer → tester のサイクル
|
|
154
156
|
↓ 承認(自動遷移)
|
|
155
157
|
フェーズ E: レビュー code-reviewer → security-reviewer
|
|
@@ -176,6 +178,7 @@ C3 のスラッシュコマンドはすべてスキル(`skills/{name}/SKILL.md
|
|
|
176
178
|
| `/develop` | TDD フェーズから直接開始 |
|
|
177
179
|
| `/review-phase` | レビューフェーズから直接開始(code-reviewer + security-reviewer) |
|
|
178
180
|
| `/promote-pattern` | 蓄積されたパターンを rules/ または skills/ に昇格 |
|
|
181
|
+
| `/pattern-status` | patterns.json の現状(信用度・昇格候補・期限残・既昇格)を表形式で可視化(読み取り専用) |
|
|
179
182
|
|
|
180
183
|
### ユーティリティ
|
|
181
184
|
|
|
@@ -186,17 +189,27 @@ C3 のスラッシュコマンドはすべてスキル(`skills/{name}/SKILL.md
|
|
|
186
189
|
| `/extract-lib` | 複数プロジェクトのコードを横断解析し、共通処理をライブラリとして設計・生成 |
|
|
187
190
|
| `/recall` | 過去のセッション・レポート・パターンから類似情報を意味検索(numpy ベクトル検索 + 多言語 embedding) |
|
|
188
191
|
| `/brainstorm` | 仕事・設計の相談を、資料(PDF/画像)を読み込んだ上で気軽に発散・壁打ち。視点・選択肢・論点を増やす方向(grill=詰めるとは逆)(v2.29.0〜) |
|
|
192
|
+
| `/codex-review` | Codex CLI に `.codex/agents/` の定義を読み込ませ、code-reviewer / security-reviewer ペルソナでレビューを並走実行(Codex adapter セットアップ済み環境のみ・レポート契約は C3 と共通) |
|
|
193
|
+
|
|
194
|
+
### 内部参照スキル(`/start` などから自動呼び出し)
|
|
195
|
+
|
|
196
|
+
| スキル | 役割 |
|
|
197
|
+
|---|---|
|
|
198
|
+
| `dev-workflow` | 5 フェーズのワークフロー本体 |
|
|
199
|
+
| `parallel-agents` | plan-report の wave 単位で親 Claude の Agent ツール並列起動 + isolation:worktree |
|
|
200
|
+
| `report-timestamp` | レポートファイル名のタイムスタンプ取得 |
|
|
189
201
|
|
|
190
202
|
### ターミナルで使う `c3` CLI(PyPI インストール時)
|
|
191
203
|
|
|
192
204
|
| コマンド | 役割 |
|
|
193
205
|
|---|---|
|
|
194
206
|
| `c3 init` | 利用先プロジェクトに `.claude/` を展開する |
|
|
195
|
-
| `c3 init --platform codex
|
|
207
|
+
| `c3 init --platform codex\|cursor\|opencode\|all` | `.claude/` を canonical source にしたまま Codex/Cursor/OpenCode adapter を追加 |
|
|
196
208
|
| `c3 update` | `.claude/` をパッケージ最新版へ更新する(個人ファイルはスキップ) |
|
|
197
209
|
| `c3 list-agents` / `list-skills` | 設置済みアセットを一覧表示 |
|
|
198
210
|
| `c3 doctor` | 環境診断(`.claude/`・settings.json・claude バイナリ・adapter 生成物) |
|
|
199
211
|
| `c3 ask` | Claude Code 以外で `AskUserQuestion` 互換の単一選択・複数選択を実行 |
|
|
212
|
+
| `c3 run <script.py>` / `c3 run -m <module>` / `c3 run -c <code>` | 配布物の Python スクリプトを OS 共通の起動口で実行(v2.51.0〜)。`.claude/` の hooks・skills スクリプトは無印 `python` ではなくこの経由で起動する(interpreter 探索・絶対パスの settings.json 混入を排除) |
|
|
200
213
|
| `c3 plan validate <plan-report>` | plan-report の YAML フロントマターと agent 存在を検証 |
|
|
201
214
|
| `c3 plan waves <plan-report>` | plan-report の wave 分解結果を JSON で出力 |
|
|
202
215
|
| `c3 recall search "<query>"` または `c3 recall "<query>"` | `.claude/memory/sessions/` 等から類似チャンクを意味検索 |
|
|
@@ -230,15 +243,20 @@ C3 のスラッシュコマンドはすべてスキル(`skills/{name}/SKILL.md
|
|
|
230
243
|
| interviewer | sonnet | requirements-report | 親 Claude がペルソナ採用 |
|
|
231
244
|
| architect | opus | architecture-report | 親 Claude がペルソナ採用 |
|
|
232
245
|
| planner | opus | plan-report | 親 Claude がペルソナ採用 |
|
|
246
|
+
| design-critic | opus | design-review-report | Agent ツールで起動(フェーズ C 承認後の任意監査) |
|
|
233
247
|
| developer | sonnet | 実装コード | Agent ツールで起動 |
|
|
234
248
|
| tester | sonnet | テスト・test-report | Agent ツールで起動 |
|
|
235
249
|
| code-reviewer | sonnet | code-review-report | Agent ツールで起動 |
|
|
236
250
|
| security-reviewer | sonnet | security-review-report | Agent ツールで起動 |
|
|
237
|
-
| doc-writer |
|
|
251
|
+
| doc-writer | opus | ドキュメント各種 | Agent ツールで起動 |
|
|
238
252
|
| systematic-debugger | sonnet | debug-analysis-report | Agent ツールで起動(行き詰まり時)|
|
|
253
|
+
| project-setup | opus | rules/ 規約ファイル | Agent ツールで起動(`/setup` 時)|
|
|
254
|
+
| wt_developer / wt_tester / wt_systematic-debugger | sonnet | task_id ベースのレポート | parallel-agents skill が isolation:worktree 付きで起動 |
|
|
239
255
|
|
|
240
256
|
インタラクティブな対話が必要なエージェント(interviewer・architect・planner)は親 Claude がペルソナを採用して動作します。実装・検証系エージェントはサブエージェントとして起動されます。
|
|
241
257
|
|
|
258
|
+
> **model 列は既定値です。** developer / wt_developer は tier-routing(タスク複雑度に応じた Haiku/Sonnet/Opus の自動選択・Thompson Sampling)の hook が起動時に model を自動適用するため、実際の使用 model は複雑度と学習データに応じて変わります。
|
|
259
|
+
|
|
242
260
|
---
|
|
243
261
|
|
|
244
262
|
## 既存プロジェクトへの導入
|
|
@@ -358,8 +376,11 @@ Copy-Item -Recurse claude-code-conductor\.claude your-project\
|
|
|
358
376
|
requirements-report-YYYYMMDD-HHMMSS.md
|
|
359
377
|
architecture-report-YYYYMMDD-HHMMSS.md
|
|
360
378
|
plan-report-YYYYMMDD-HHMMSS.md
|
|
379
|
+
design-review-report-YYYYMMDD-HHMMSS.md
|
|
380
|
+
test-report-YYYYMMDD-HHMMSS.md
|
|
361
381
|
code-review-report-YYYYMMDD-HHMMSS.md
|
|
362
382
|
security-review-report-YYYYMMDD-HHMMSS.md
|
|
383
|
+
debug-analysis-report-YYYYMMDD-HHMMSS.md
|
|
363
384
|
archive/ ← /start 実行時に古いレポートをここに移動
|
|
364
385
|
```
|
|
365
386
|
|