claude-dev-env 2.4.0 → 2.7.0
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.
- package/CLAUDE.md +26 -59
- package/_shared/pr-loop/scripts/_claude_permissions_common.py +84 -0
- package/_shared/pr-loop/scripts/code_rules_gate.py +6 -3
- package/_shared/pr-loop/scripts/code_rules_gate_parts/CLAUDE.md +12 -2
- package/_shared/pr-loop/scripts/code_rules_gate_parts/baseline_import_isolation.py +309 -0
- package/_shared/pr-loop/scripts/code_rules_gate_parts/staged_test_regression.py +540 -0
- package/_shared/pr-loop/scripts/code_rules_gate_parts/staged_test_running.py +206 -70
- package/_shared/pr-loop/scripts/code_rules_gate_parts/tests/__init__.py +1 -0
- package/_shared/pr-loop/scripts/code_rules_gate_parts/tests/_repo_test_helpers.py +76 -0
- package/_shared/pr-loop/scripts/code_rules_gate_parts/tests/test_baseline_import_isolation.py +248 -0
- package/_shared/pr-loop/scripts/code_rules_gate_parts/tests/test_staged_test_regression.py +309 -0
- package/_shared/pr-loop/scripts/code_rules_gate_parts/tests/test_staged_test_running.py +91 -58
- package/_shared/pr-loop/scripts/grant_project_claude_permissions.py +306 -306
- package/_shared/pr-loop/scripts/pr_loop_shared_constants/claude_permissions_constants.py +44 -0
- package/_shared/pr-loop/scripts/pr_loop_shared_constants/code_rules_gate_constants.py +202 -0
- package/_shared/pr-loop/scripts/pr_loop_shared_constants/copilot_quota_constants.py +24 -24
- package/_shared/pr-loop/scripts/pr_loop_shared_constants/stale_worktree_rule_sweep_constants.py +107 -107
- package/_shared/pr-loop/scripts/revoke_project_claude_permissions.py +290 -48
- package/_shared/pr-loop/scripts/tests/test_claude_permissions_common.py +42 -2
- package/_shared/pr-loop/scripts/tests/test_claude_permissions_constants.py +36 -0
- package/_shared/pr-loop/scripts/tests/test_code_rules_gate.py +100 -1
- package/_shared/pr-loop/scripts/tests/test_fix_hookspath.py +497 -497
- package/_shared/pr-loop/scripts/tests/test_revoke_project_claude_permissions.py +311 -2
- package/_shared/pr-loop/scripts/tests/test_stale_worktree_rule_sweep.py +301 -301
- package/_shared/pr-loop/scripts/tests/test_stale_worktree_rule_sweep_constants.py +85 -85
- package/_shared/pr-loop/worker-spawn.md +1 -1
- package/agents/CLAUDE.md +3 -2
- package/agents/caveman.md +0 -1
- package/agents/clasp-deployment-orchestrator.md +0 -1
- package/agents/clean-coder.md +0 -1
- package/agents/code-advisor.md +0 -1
- package/agents/code-quality-agent.md +1 -2
- package/agents/code-verifier.md +36 -8
- package/agents/deep-research.md +0 -1
- package/agents/docs-agent.md +0 -1
- package/agents/git-commit-crafter.md +0 -1
- package/agents/issue-tracker.md +42 -0
- package/agents/plan-packet-validator.md +0 -1
- package/agents/pr-description-writer.md +0 -1
- package/agents/test_agent_frontmatter.py +67 -18
- package/audit-rubrics/category_rubrics/category-o-docstring-vs-impl-drift.md +143 -141
- package/bin/CLAUDE.md +68 -5
- package/bin/codex-compat.mjs +104 -0
- package/bin/codex-compat.test.mjs +51 -0
- package/bin/ever-shipped-skills.mjs +1 -0
- package/bin/install-constants.mjs +88 -0
- package/bin/install.mjs +1138 -114
- package/bin/install.prune.test.mjs +869 -19
- package/bin/install.test.mjs +906 -2
- package/codex-capability-map.json +13 -0
- package/commands/implement.md +1 -1
- package/commands/right-size.md +1 -1
- package/docs/CLAUDE.md +1 -0
- package/docs/CODE_RULES.md +2 -0
- package/docs/codex-compatibility.md +25 -0
- package/docs/host-pool-health-monitor.md +102 -0
- package/docs/nas-ssh-invocation.md +96 -12
- package/docs/references/CLAUDE.md +4 -2
- package/docs/references/advisor-tool.md +13 -0
- package/docs/references/code-review-enforcement.md +35 -0
- package/docs/references/team-advisor-skill.md +14 -0
- package/hooks/blocking/CLAUDE.md +4 -0
- package/hooks/blocking/code_review_pr_create_gate.py +7 -3
- package/hooks/blocking/code_review_push_gate.py +9 -4
- package/hooks/blocking/code_review_stamp_directory_write_blocker.py +8 -0
- package/hooks/blocking/config/__init__.py +5 -5
- package/hooks/blocking/config/code_review_enforcement_constants.py +40 -7
- package/hooks/blocking/config/test_code_review_enforcement_constants.py +58 -0
- package/hooks/blocking/config/verified_commit_constants.py +160 -159
- package/hooks/blocking/eli11_reply_enforcer.py +479 -0
- package/hooks/blocking/gh_body_arg_blocker.py +1 -1
- package/hooks/blocking/nas_ssh_binary_enforcer.py +8 -46
- package/hooks/blocking/orchestrator_refresh_reschedule_gate.py +256 -0
- package/hooks/blocking/pre_tool_use_dispatcher.py +24 -24
- package/hooks/blocking/shell_substitution_blocker.py +129 -0
- package/hooks/blocking/state_description_blocker.py +1 -1
- package/hooks/blocking/stop_dispatcher.py +1 -1
- package/hooks/blocking/test_bash_pre_tool_use_dispatcher.py +2 -3
- package/hooks/blocking/test_code_review_pr_create_gate.py +14 -0
- package/hooks/blocking/test_code_review_push_gate.py +16 -0
- package/hooks/blocking/test_code_review_stamp_directory_write_blocker.py +19 -0
- package/hooks/blocking/test_eli11_reply_enforcer.py +457 -0
- package/hooks/blocking/test_orchestrator_refresh_reschedule_gate.py +231 -0
- package/hooks/blocking/test_pre_tool_use_dispatcher.py +10 -1
- package/hooks/blocking/test_shell_substitution_blocker.py +124 -0
- package/hooks/blocking/test_stop_dispatcher.py +23 -0
- package/hooks/blocking/test_unscoped_search_blocker.py +102 -0
- package/hooks/blocking/test_verdict_directory_write_blocker.py +804 -808
- package/hooks/blocking/test_verification_verdict_store.py +54 -0
- package/hooks/blocking/test_verified_commit_gate.py +581 -581
- package/hooks/blocking/test_verified_commit_message_accuracy_blocker.py +131 -131
- package/hooks/blocking/unscoped_search_blocker.py +391 -0
- package/hooks/blocking/verdict_directory_write_blocker.py +687 -687
- package/hooks/blocking/verification_verdict_store.py +1039 -1036
- package/hooks/blocking/verified_commit_message_accuracy_blocker.py +167 -167
- package/hooks/blocking/verifier_verdict_minter.py +280 -280
- package/hooks/git-hooks/CLAUDE.md +3 -0
- package/hooks/git-hooks/conftest.py +30 -0
- package/hooks/git-hooks/gate_utils.py +2 -2
- package/hooks/git-hooks/git_hooks_constants/__init__.py +41 -2
- package/hooks/git-hooks/pre_push.py +75 -4
- package/hooks/git-hooks/pre_push_base_reference.py +166 -0
- package/hooks/git-hooks/test_config.py +0 -15
- package/hooks/git-hooks/test_gate_utils.py +3 -15
- package/hooks/git-hooks/test_pre_commit.py +1 -15
- package/hooks/git-hooks/test_pre_push.py +257 -23
- package/hooks/git-hooks/test_pre_push_base_reference.py +339 -0
- package/hooks/hooks.json +10 -12
- package/hooks/hooks_constants/CLAUDE.md +7 -2
- package/hooks/hooks_constants/bash_pre_tool_use_dispatcher_constants.py +4 -4
- package/hooks/hooks_constants/eli11_reply_enforcer_constants.py +101 -0
- package/hooks/hooks_constants/enter_worktree_prefetch_constants.py +18 -18
- package/hooks/hooks_constants/nas_ssh_binary_enforcer_constants.py +2 -8
- package/hooks/hooks_constants/orchestrator_refresh_reschedule_gate_constants.py +48 -0
- package/hooks/hooks_constants/ruff_integration_constants.py +16 -0
- package/hooks/hooks_constants/shell_command_segments.py +82 -0
- package/hooks/hooks_constants/shell_substitution_blocker_constants.py +67 -0
- package/hooks/hooks_constants/stop_dispatcher_constants.py +1 -0
- package/hooks/hooks_constants/test_bash_pre_tool_use_dispatcher_constants.py +5 -6
- package/hooks/hooks_constants/test_stop_dispatcher_constants.py +1 -0
- package/hooks/hooks_constants/unscoped_search_blocker_constants.py +153 -0
- package/hooks/lifecycle/enter_worktree_origin_prefetch.py +163 -146
- package/hooks/lifecycle/test_enter_worktree_origin_prefetch.py +185 -178
- package/hooks/pyproject.toml +1 -0
- package/hooks/validators/CLAUDE.md +1 -0
- package/hooks/validators/config/__init__.py +0 -0
- package/hooks/validators/config/directory_exemption_constants.py +183 -0
- package/hooks/validators/config/test_directory_exemption_constants.py +21 -0
- package/hooks/validators/conftest.py +4 -0
- package/hooks/validators/ruff_integration.py +49 -5
- package/hooks/validators/run_all_validators.py +206 -9
- package/hooks/validators/test_directory_exemption_constants.py +185 -0
- package/hooks/validators/test_python_antipattern_checks.py +110 -5
- package/hooks/validators/test_ruff_integration.py +92 -1
- package/hooks/validators/test_run_all_validators.py +115 -68
- package/hooks/validators/test_run_all_validators_pretooluse.py +159 -1
- package/package.json +13 -3
- package/rules/CLAUDE.md +17 -22
- package/rules/agent-spawn-protocol.md +6 -6
- package/rules/anti-corollary-tests.md +1 -1
- package/rules/bdd.md +1 -1
- package/rules/cleanup-temp-files.md +10 -4
- package/rules/code-standards.md +7 -0
- package/rules/conservative-action.md +1 -5
- package/rules/context7.md +0 -4
- package/rules/destructive-commands.md +47 -0
- package/rules/doc-inventory-integrity.md +48 -0
- package/rules/doc-prose-cuts.md +58 -0
- package/rules/docstring-prose-matches-implementation.md +53 -44
- package/rules/durable-post-artifacts.md +0 -4
- package/rules/eli11-replies.md +31 -0
- package/rules/explore-thoroughly.md +4 -4
- package/rules/falsify-before-green.md +68 -0
- package/rules/file-global-constants.md +1 -1
- package/rules/filesystem-search.md +51 -0
- package/rules/gh-cli-conventions.md +27 -0
- package/rules/git-workflow.md +26 -0
- package/rules/hedging-claims.md +9 -0
- package/rules/long-horizon-autonomy.md +0 -4
- package/rules/measurement-denominators.md +48 -0
- package/rules/nas-ssh-invocation.md +23 -5
- package/rules/parallel-tools.md +2 -2
- package/rules/plain-illustrative-docstrings.md +3 -7
- package/rules/plain-language.md +2 -0
- package/rules/proof-of-work-pr-comments.md +0 -4
- package/rules/re-stage-before-commit.md +2 -0
- package/rules/research-mode.md +10 -0
- package/rules/shell-invocation.md +21 -0
- package/rules/testing.md +4 -0
- package/rules/verified-commit-gate-skip.md +3 -27
- package/rules/verify-before-asking.md +5 -0
- package/rules/windows-filesystem-safe.md +1 -1
- package/rules/workers-done-before-complete.md +4 -0
- package/scripts/CLAUDE.md +1 -0
- package/scripts/Capture-PoolHealth.ps1 +410 -0
- package/scripts/Migrate-ShellPolicy.ps1 +1 -1
- package/scripts/_code_review_test_support.py +404 -0
- package/scripts/claude_chain_runner.py +141 -1
- package/scripts/codex_capability_bridge.py +171 -0
- package/scripts/codex_compat_materializer.py +1087 -0
- package/scripts/codex_compat_watcher.py +502 -0
- package/scripts/conftest.py +16 -1
- package/scripts/dev_env_scripts_constants/CLAUDE.md +1 -1
- package/scripts/dev_env_scripts_constants/claude_chain_constants.py +9 -0
- package/scripts/dev_env_scripts_constants/code_review_constants.py +37 -0
- package/scripts/invoke_code_review.py +11 -4
- package/scripts/resolve_worker_spawn.py +626 -626
- package/scripts/spawn_grok_batch.py +672 -672
- package/scripts/sync_to_cursor/rules.py +0 -10
- package/scripts/test_claude_chain_runner.py +131 -0
- package/scripts/test_invoke_code_review.py +85 -908
- package/scripts/test_invoke_code_review_chain.py +70 -0
- package/scripts/test_invoke_code_review_cli.py +192 -0
- package/scripts/test_invoke_code_review_contract.py +256 -0
- package/scripts/test_invoke_code_review_git.py +123 -0
- package/scripts/test_invoke_code_review_mode.py +99 -0
- package/scripts/test_resolve_worker_spawn.py +1014 -1014
- package/scripts/tests/test_code_review_constants.py +80 -0
- package/scripts/tests/test_codex_capability_bridge.py +91 -0
- package/scripts/tests/test_codex_compat_materializer.py +632 -0
- package/scripts/tests/test_codex_compat_watcher.py +599 -0
- package/scripts/tests/test_sync_to_cursor.py +0 -1
- package/skills/CLAUDE.md +2 -0
- package/skills/auditing-claude-config/SKILL.md +114 -114
- package/skills/autoconverge/SKILL.md +427 -427
- package/skills/autoconverge/reference/convergence.md +24 -3
- package/skills/autoconverge/workflow/CLAUDE.md +1 -0
- package/skills/autoconverge/workflow/converge.clean-audit.test.mjs +3 -3
- package/skills/autoconverge/workflow/converge.contract.test.mjs +1263 -1263
- package/skills/autoconverge/workflow/converge.mjs +168 -1
- package/skills/autoconverge/workflow/converge.p2-advance.test.mjs +202 -0
- package/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a11d903476b803493.jsonl +2 -2
- package/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a26213978adeef6fb.jsonl +2 -2
- package/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a3def0d15ed9d9110.jsonl +2 -2
- package/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a41f41b1b708ee3b7.jsonl +2 -2
- package/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a758b880abecc3ff7.jsonl +2 -2
- package/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a8897b89656b1bd16.jsonl +2 -2
- package/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-abd463d744a1437bc.jsonl +2 -2
- package/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-ad19d027ae8ee1816.jsonl +2 -2
- package/skills/autoconverge/workflow/fixtures/wf_run/workflows/wf_881252e6-700.json +265 -265
- package/skills/bugteam/reference/copilot-gap-analysis.md +1 -1
- package/skills/closeout/SKILL.md +33 -50
- package/skills/codex-review/scripts/codex_review_scripts_constants/run_constants.py +8 -0
- package/skills/codex-review/scripts/run_codex_review.py +233 -1
- package/skills/codex-review/scripts/test_run_codex_review.py +189 -0
- package/skills/condensing-instructions/SKILL.md +72 -0
- package/skills/copilot-review/SKILL.md +119 -119
- package/skills/e-code-review/SKILL.md +52 -0
- package/skills/e-code-review/reference/fix.md +54 -0
- package/skills/e-code-review/reference/loop.md +43 -0
- package/skills/e-code-review/reference/low.md +57 -0
- package/skills/e-code-review/reference/medium.md +153 -0
- package/skills/e-code-review/reference/xhigh.md +182 -0
- package/skills/e-simplify/SKILL.md +97 -0
- package/skills/fresh-branch/CLAUDE.md +1 -1
- package/skills/fresh-branch/SKILL.md +5 -6
- package/skills/fresh-branch/scripts/create_fresh_branch.py +42 -24
- package/skills/fresh-branch/scripts/fresh_branch_scripts_constants/fresh_branch_cli_constants.py +1 -3
- package/skills/fresh-branch/scripts/test_create_fresh_branch.py +30 -126
- package/skills/issue-tracker/SKILL.md +92 -0
- package/skills/issue-tracker/reference/epic-and-sub-issue-model.md +55 -0
- package/skills/issue-tracker/reference/handoff-schema.md +64 -0
- package/skills/issue-tracker/reference/operation-matrix.md +41 -0
- package/skills/orchestrator/SKILL.md +177 -22
- package/skills/orchestrator/scripts/status_gate.py +625 -0
- package/skills/orchestrator/scripts/status_gate_constants/__init__.py +1 -0
- package/skills/orchestrator/scripts/status_gate_constants/config/__init__.py +1 -0
- package/skills/orchestrator/scripts/status_gate_constants/config/constants.py +47 -0
- package/skills/orchestrator/scripts/test_status_gate.py +439 -0
- package/skills/orchestrator-refresh/SKILL.md +129 -35
- package/skills/plan-to-pr/SKILL.md +155 -0
- package/skills/plan-to-pr/reference/final-validation-tasks.md +15 -0
- package/skills/plan-to-pr/reference/model-routing.md +36 -0
- package/skills/plan-to-pr/reference/packet-contract.md +43 -0
- package/skills/plan-to-pr/reference/packet-schema.json +57 -0
- package/skills/plan-to-pr/reference/process-inventory.md +22 -0
- package/skills/plan-to-pr/reference/review-loop.md +33 -0
- package/skills/plan-to-pr/reference/run-record.schema.json +27 -0
- package/skills/plan-to-pr/reference/self-audit-tasks.md +15 -0
- package/skills/plan-to-pr/reference/task-seeds.md +14 -0
- package/skills/plan-to-pr/reference/task-ticket.md +38 -0
- package/skills/plan-to-pr/scripts/config/__init__.py +1 -0
- package/skills/plan-to-pr/scripts/config/constants.py +193 -0
- package/skills/plan-to-pr/scripts/create_packet.py +173 -0
- package/skills/plan-to-pr/scripts/test_create_packet.py +102 -0
- package/skills/plan-to-pr/scripts/test_validate_packet.py +256 -0
- package/skills/plan-to-pr/scripts/test_validate_protocol.py +135 -0
- package/skills/plan-to-pr/scripts/test_validate_run.py +158 -0
- package/skills/plan-to-pr/scripts/validate_packet.py +655 -0
- package/skills/plan-to-pr/scripts/validate_protocol.py +622 -0
- package/skills/plan-to-pr/scripts/validate_run.py +173 -0
- package/skills/plan-to-pr/test_skill_contract.py +207 -0
- package/skills/plan-to-pr/test_task_ticket_contract.py +151 -0
- package/skills/pr-converge/SKILL.md +472 -469
- package/skills/pr-converge/reference/examples.md +3 -3
- package/skills/pr-converge/reference/fix-protocol.md +1 -1
- package/skills/pr-converge/reference/ground-rules.md +7 -4
- package/skills/pr-converge/reference/multi-pr-orchestration.md +4 -1
- package/skills/pr-converge/reference/per-tick.md +5 -5
- package/skills/pr-converge/reference/progress-checklist.md +1 -1
- package/skills/pr-converge/scripts/check_convergence_gates.py +279 -279
- package/skills/pr-converge/scripts/test_check_convergence_codex.py +507 -507
- package/skills/pr-converge/scripts/test_check_convergence_gates.py +84 -84
- package/skills/pr-converge/test_step5_host_branch.py +1 -1
- package/skills/pr-fix-protocol/SKILL.md +1 -1
- package/skills/privacy-hygiene/SKILL.md +68 -68
- package/skills/privacy-hygiene/reference/sweep-procedure.md +1 -1
- package/skills/prototype/workflows/promotion.md +1 -1
- package/skills/release-notes-html/SKILL.md +164 -0
- package/skills/session-log/SKILL.md +1 -1
- package/skills/task-build/CLAUDE.md +8 -7
- package/skills/task-build/SKILL.md +16 -8
- package/skills/task-build/reference/tool-routing.md +19 -0
- package/rules/claude-md-orphan-file.md +0 -28
- package/rules/cleanup-command-forms.md +0 -23
- package/rules/code-reviews.md +0 -11
- package/rules/env-var-table-code-drift.md +0 -10
- package/rules/gh-body-file.md +0 -5
- package/rules/gh-paginate.md +0 -3
- package/rules/hook-prose-matches-detector.md +0 -15
- package/rules/no-historical-clutter.md +0 -26
- package/rules/no-inline-destructive-literals.md +0 -9
- package/rules/no-justification-noise.md +0 -61
- package/rules/package-inventory-stale-entry.md +0 -25
- package/rules/right-sized-engineering.md +0 -28
- package/rules/self-contained-docs.md +0 -17
- package/rules/shell-invocation-policy.md +0 -5
- package/rules/tdd.md +0 -7
- package/skills/closeout/reference/issue-body-templates.md +0 -108
|
@@ -30,15 +30,97 @@ The moment it edits a file or runs a test itself, the pairing breaks —
|
|
|
30
30
|
its own tool use stays orchestration, run-artifact writes, and light
|
|
31
31
|
verification reads.
|
|
32
32
|
|
|
33
|
+
## status_gate (deterministic — not optional)
|
|
34
|
+
|
|
35
|
+
**Prose does not keep the loop alive.** Re-arm and terminate are gated by
|
|
36
|
+
`scripts/status_gate.py` (and, on Claude, the PreToolUse hook
|
|
37
|
+
`orchestrator_refresh_reschedule_gate`). The gate is host-agnostic: a
|
|
38
|
+
single pending re-arm latch in the status file, not host product names.
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
python scripts/status_gate.py set --status active|done [--run-slug SLUG] [--status-file PATH]
|
|
42
|
+
python scripts/status_gate.py begin-firing [--run-slug SLUG] [--status-file PATH]
|
|
43
|
+
python scripts/status_gate.py should-reschedule [--run-slug SLUG] [--status-file PATH]
|
|
44
|
+
python scripts/status_gate.py claim-rearm [--run-slug SLUG] [--status-file PATH]
|
|
45
|
+
python scripts/status_gate.py release-rearm [--run-slug SLUG] [--status-file PATH]
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
| Exit / output | Meaning |
|
|
49
|
+
|---|---|
|
|
50
|
+
| `set` → 0 | Status written (`active`/`done`); `done` clears latch; re-asserting `active` preserves it |
|
|
51
|
+
| `begin-firing` → 0 | Active; clears `rearm_pending` (start of a refresh firing) |
|
|
52
|
+
| `begin-firing` → 1 | Stop — missing/invalid/done (fail closed) |
|
|
53
|
+
| `should-reschedule` → 0 | Active and `rearm_pending` is false (read-only) |
|
|
54
|
+
| `should-reschedule` → 1 | Stop — inactive, missing, invalid, or slot already pending |
|
|
55
|
+
| `claim-rearm` → 0 | Slot latched (`rearm_pending` true) after a successful create |
|
|
56
|
+
| `claim-rearm` → 1 | Slot already pending or inactive — cancel any just-created schedule |
|
|
57
|
+
| `release-rearm` → 0 | Cleared pending (recovery if a latch stuck after create) |
|
|
58
|
+
| `release-rearm` → 1 | Stop — missing/invalid/done; nothing to release |
|
|
59
|
+
|
|
60
|
+
Default status path: `.orchestrator-run-status.json` under the repo plans
|
|
61
|
+
directory, or `$ORCHESTRATOR_RUN_STATUS_FILE`. With `--run-slug SLUG`,
|
|
62
|
+
under the slug plans subdirectory. When using a slug, every refresh
|
|
63
|
+
schedule prompt must carry it: `/orchestrator-refresh --run-slug SLUG`.
|
|
64
|
+
|
|
65
|
+
### Single-pending re-arm protocol (all hosts)
|
|
66
|
+
|
|
67
|
+
**The re-arm never interrupts the run.** Every "stop" in the five steps
|
|
68
|
+
below ends the *re-arm* and nothing else: the session returns to
|
|
69
|
+
orchestrating in the same turn. Arming a delayed wake schedules a later
|
|
70
|
+
reminder; it neither ends the turn nor pauses in-flight executors, and
|
|
71
|
+
the session never waits for the refresh to fire before it carries on.
|
|
72
|
+
When a create fails, keep orchestrating and re-arm at the next natural
|
|
73
|
+
break. When the denial is `rearm_already_pending`, a refresh is already
|
|
74
|
+
queued — keep orchestrating and arm nothing further this turn; the next
|
|
75
|
+
refresh firing clears the latch and arms again.
|
|
76
|
+
|
|
77
|
+
Exactly one delayed refresh may be outstanding. **Create then claim**
|
|
78
|
+
(order matters on Claude: PreToolUse denies `ScheduleWakeup` when the
|
|
79
|
+
slot is already pending).
|
|
80
|
+
|
|
81
|
+
1. **Cancel matching schedules** only when the host can list and cancel
|
|
82
|
+
schedules by prompt. Drop every schedule whose prompt targets
|
|
83
|
+
`/orchestrator-refresh` (and the same `--run-slug` when used).
|
|
84
|
+
Replace, never stack. On Claude, there is no selective cancel for a
|
|
85
|
+
sibling `ScheduleWakeup` — the status-file latch
|
|
86
|
+
(`should-reschedule` / `claim-rearm`) is the sole stacking
|
|
87
|
+
enforcement there.
|
|
88
|
+
2. **`should-reschedule`** (same path args as activate). Exit 1 → stop;
|
|
89
|
+
do not create. Exit 0 → continue.
|
|
90
|
+
3. **Create exactly one non-recurring delayed wake** (~1200–2700s) with
|
|
91
|
+
prompt `/orchestrator-refresh` (plus `--run-slug` when used). Use the
|
|
92
|
+
host's one-shot delayed schedule tool (on Claude: `ScheduleWakeup`).
|
|
93
|
+
Never recurring, never cadence, never a second create in the same
|
|
94
|
+
firing.
|
|
95
|
+
4. **`claim-rearm`** immediately after a successful create. Exit 0 →
|
|
96
|
+
done. Exit 1 → cancel the schedule just created and stop (race /
|
|
97
|
+
already latched).
|
|
98
|
+
5. **On create failure:** do not claim; stop or retry once from step 1.
|
|
99
|
+
|
|
100
|
+
On Claude, the PreToolUse hook also denies when inactive, already
|
|
101
|
+
pending, or when the tool is `CronCreate`.
|
|
102
|
+
|
|
103
|
+
**Rules:**
|
|
104
|
+
|
|
105
|
+
- **Activate only with open work.** After the first ledger task exists,
|
|
106
|
+
`set --status active` (same `--run-slug` for the whole run if used).
|
|
107
|
+
- **Done is a script.** When every ledger task is completed/cancelled and
|
|
108
|
+
no executor is running: `set --status done`, cancel matching host
|
|
109
|
+
schedules, stop. Do not re-arm.
|
|
110
|
+
- **Invocation guard.** If `should-reschedule` is already exit 1 for
|
|
111
|
+
`rearm_already_pending`, a refresh is already queued — do not arm again.
|
|
112
|
+
|
|
33
113
|
## Process
|
|
34
114
|
|
|
35
|
-
1. **Invocation guard.** One `/orchestrator` per session. When
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
115
|
+
1. **Invocation guard.** One `/orchestrator` per session. When a refresh
|
|
116
|
+
one-shot is already queued (`should-reschedule` exits 1 with
|
|
117
|
+
`rearm_already_pending`), do not stack a second: reuse the live
|
|
118
|
+
advisor bind, skip step 4 and the re-arm half of step 5, and carry on
|
|
119
|
+
from step 5's dispatch — status is already active and a re-arm is
|
|
120
|
+
already latched, so a second registration would stack a duplicate
|
|
121
|
+
host schedule. (Re-asserting `set --status active` preserves
|
|
122
|
+
`rearm_pending` when already active, but still do not re-arm.)
|
|
123
|
+
2. **Bind the shared advisor before any executor.** Follow
|
|
42
124
|
[`_shared/advisor/advisor-protocol.md`](../../_shared/advisor/advisor-protocol.md)
|
|
43
125
|
end to end: detect the host profile, compute the floor from the
|
|
44
126
|
orchestrator consumer set — this session plus every tier in the
|
|
@@ -48,16 +130,29 @@ verification reads.
|
|
|
48
130
|
message the warm agent or report here, and an executor that finds the
|
|
49
131
|
advisor unreachable reports that upward — it never spawns a
|
|
50
132
|
replacement itself.
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
133
|
+
3. **Write the run artifacts** (next section) before the first spawn.
|
|
134
|
+
4. **Activate status_gate** when the first open ledger task exists:
|
|
135
|
+
`python scripts/status_gate.py set --status active`.
|
|
136
|
+
5. **Dispatch the first task with its ticket** (Spawn ticket section),
|
|
137
|
+
**then register the discipline reminder** via the single-pending
|
|
138
|
+
re-arm protocol (cancel matching → `should-reschedule` → one
|
|
139
|
+
non-recurring delayed wake → `claim-rearm`; default delay about
|
|
140
|
+
2700s). Spawn before you arm, so the run is already moving, and go
|
|
141
|
+
straight on to step 6 in the same turn — the armed wake is a later
|
|
142
|
+
reminder, not the next thing to wait for.
|
|
143
|
+
6. **Orchestrate.** Hold the plan and the user conversation. Spawn each
|
|
144
|
+
remaining task with a ticket (Spawn ticket section), keep driving while
|
|
54
145
|
executors work, and keep the ledger reconciled (Task ledger
|
|
55
146
|
discipline).
|
|
56
|
-
|
|
147
|
+
7. **Consult the advisor at hard decisions.** The trigger list, consult
|
|
57
148
|
format, and reply handling live in the protocol's "Consulting the
|
|
58
149
|
warm agent" section; both this session and every executor are
|
|
59
150
|
consumers. Replies open with one of ENDORSE, CORRECTION, PLAN, or
|
|
60
151
|
STOP — `agents/session-advisor.md` defines each signal.
|
|
152
|
+
8. **Terminate when done.** When every ledger task is completed or
|
|
153
|
+
cancelled and no executor is running: run
|
|
154
|
+
`set --status done`, cancel matching host schedules, report
|
|
155
|
+
completion, and stop. Do not re-arm.
|
|
61
156
|
|
|
62
157
|
## Run state lives in artifacts
|
|
63
158
|
|
|
@@ -76,6 +171,9 @@ in the repo the run works on (working files, not committed):
|
|
|
76
171
|
may write — and its reply is thin: status, artifact paths, blockers.
|
|
77
172
|
The orchestrating session records each result into the run's result
|
|
78
173
|
files as it reconciles the ledger.
|
|
174
|
+
- **Run status file** — written only by `status_gate.py`
|
|
175
|
+
(`active` / `done`, plus `rearm_pending`). Source of truth for
|
|
176
|
+
reschedule and the single-pending latch.
|
|
79
177
|
|
|
80
178
|
Correctness never rides on any agent's private context: when an executor
|
|
81
179
|
dies or hangs, point a fresh spawn at the same assignment file plus its
|
|
@@ -101,6 +199,18 @@ Return: status, artifact paths, blockers — nothing else.
|
|
|
101
199
|
fit gets split in the plan — never padded into a longer prompt.
|
|
102
200
|
Explore fan-outs run tiny; a `clean-coder` assignment can carry a
|
|
103
201
|
whole scoped feature.
|
|
202
|
+
- **Focused tickets are the house convention.** One mechanical done-check
|
|
203
|
+
per ticket; thick context lives in the assignment file, not the ticket
|
|
204
|
+
prose. The orchestrator owns splitting a big task into tickets and
|
|
205
|
+
synthesizing the results — an executor never does either. Two
|
|
206
|
+
anti-patterns to avoid: an epic ticket that bundles several
|
|
207
|
+
deliverables behind one done-check, and micro-thrash — a run of tickets
|
|
208
|
+
so thin each spawn pays more in setup than the work itself takes. See
|
|
209
|
+
Anthropic's coordinator-pattern cookbook:
|
|
210
|
+
https://github.com/anthropics/claude-cookbooks/blob/main/managed_agents/CMA_plan_big_execute_small.ipynb.
|
|
211
|
+
- **Resume with a thin next-slice ticket.** A warm agent already holds
|
|
212
|
+
the assignment's thick context, so its next ticket names only the next
|
|
213
|
+
slice of work and the done-check — it does not restate the assignment.
|
|
104
214
|
- **Do not restate what the agent definition carries.** The routing
|
|
105
215
|
table picks the definition, and `clean-coder` already holds the code
|
|
106
216
|
discipline. The ticket adds the task, the pointers, and the Advisor
|
|
@@ -117,19 +227,38 @@ workflow resume is available.
|
|
|
117
227
|
|
|
118
228
|
| Work | Agent type | Model |
|
|
119
229
|
|---|---|---|
|
|
120
|
-
| Feature, bug, and refactor coding | `clean-coder` | `
|
|
121
|
-
| Verification passes | `code-verifier` | `sonnet` |
|
|
122
|
-
| Script runs, GitHub posting, and backfill driving | `general-purpose` runner | `sonnet` |
|
|
230
|
+
| Feature, bug, and refactor coding | `clean-coder` | `sonnet` on a Claude host; the sonnet-equivalent id the worker-model resolver prints on a third-party host |
|
|
231
|
+
| Verification passes | `code-verifier` | `sonnet` on a Claude host; the sonnet-equivalent id the worker-model resolver prints on a third-party host |
|
|
232
|
+
| Script runs, GitHub posting, and backfill driving | `general-purpose` runner | `sonnet` on a Claude host; the sonnet-equivalent id the worker-model resolver prints on a third-party host |
|
|
123
233
|
| PR descriptions | `pr-description-writer` | `haiku`, with file-list grounding check |
|
|
124
234
|
| Fan-out searches and checklist verification reads | `Explore` | `haiku`; use `sonnet` when judgment-heavy |
|
|
125
235
|
|
|
236
|
+
Every row that edits code, runs a build, or runs a test is a coding row.
|
|
237
|
+
The per-spawn Agent call's `model:` field carries the routing.
|
|
238
|
+
`CLAUDE_CODE_SUBAGENT_MODEL` and other environment variables do not set
|
|
239
|
+
the worker model; the per-spawn `model:` field does.
|
|
240
|
+
|
|
126
241
|
Routing rules:
|
|
127
242
|
|
|
128
243
|
- Each row spawns workflow-backed with a ticket; the routing row and the
|
|
129
244
|
ticket together carry the agent type, model, task, and return
|
|
130
|
-
contract. A task category
|
|
131
|
-
|
|
132
|
-
|
|
245
|
+
contract. A coding task category is never served by a different tier
|
|
246
|
+
as a cost call — the table is the contract.
|
|
247
|
+
- **Fail closed on a Claude host.** When `sonnet` cannot be spawned, use
|
|
248
|
+
the Claude chain failover for `sonnet` when the session has one
|
|
249
|
+
configured; otherwise stop the coding spawn and report the failure —
|
|
250
|
+
never fall back in silence to `opus` or the session's own model.
|
|
251
|
+
- **Fail closed on a third-party host.** Before each coding spawn, the
|
|
252
|
+
orchestrator runs a deterministic worker-model resolver that prints
|
|
253
|
+
the sonnet-equivalent model id for that host. A non-zero exit stops
|
|
254
|
+
the coding spawn; the orchestrator reports the failure rather than
|
|
255
|
+
picking a model itself. This section states the resolver's contract
|
|
256
|
+
only; a host where no resolver is available fails closed the same
|
|
257
|
+
way — the coding spawn stops and the orchestrator reports it.
|
|
258
|
+
- Host detection follows
|
|
259
|
+
[`_shared/advisor/advisor-protocol.md`](../../_shared/advisor/advisor-protocol.md)
|
|
260
|
+
(Host profiles section, `detect_host_profile`) — the sole detection
|
|
261
|
+
system, with no second one.
|
|
133
262
|
- Resume a warm workflow agent before creating a new workflow run when
|
|
134
263
|
the warm agent holds the relevant context.
|
|
135
264
|
- `clean-coder` owns code edits. `code-verifier` owns verification. The
|
|
@@ -175,12 +304,16 @@ the live agents at any moment. Four invariants hold at all times:
|
|
|
175
304
|
`blockedBy` links, updated the moment the plan changes.
|
|
176
305
|
|
|
177
306
|
Reconcile on every state change (spawn, completion notification, plan
|
|
178
|
-
change) and on every `/orchestrator-refresh` firing.
|
|
307
|
+
change) and on every `/orchestrator-refresh` firing. After reconcile, if
|
|
308
|
+
no open work remains, run `set --status done` before any re-arm attempt.
|
|
179
309
|
|
|
180
310
|
## Constraints
|
|
181
311
|
|
|
182
312
|
- One `/orchestrator` per session; the invocation guard blocks a second
|
|
183
|
-
|
|
313
|
+
stacked one-shot while one is already queued.
|
|
314
|
+
- Reschedule is mechanical: status file + `claim-rearm` /
|
|
315
|
+
`should-reschedule` exit codes; never a recurring host schedule; at
|
|
316
|
+
most one pending re-arm latch.
|
|
184
317
|
- The orchestrating session never edits code or runs a build or test
|
|
185
318
|
itself — executors do that. Its own tool use stays orchestration,
|
|
186
319
|
run-artifact writes, and light verification reads.
|
|
@@ -189,14 +322,36 @@ change) and on every `/orchestrator-refresh` firing.
|
|
|
189
322
|
- One shared advisor per orchestrated session, owned by this session per
|
|
190
323
|
the protocol; executors never spawn, respawn, or shut it down.
|
|
191
324
|
|
|
325
|
+
## Gotchas
|
|
326
|
+
|
|
327
|
+
- **Stacking re-arms.** Creating a second delayed wake while one is
|
|
328
|
+
already queued (or using a recurring host schedule) multiplies loops
|
|
329
|
+
on each refresh. Always cancel matching → `should-reschedule` → one
|
|
330
|
+
create → `claim-rearm`. A second create while pending is denied on
|
|
331
|
+
Claude by PreToolUse; elsewhere `should-reschedule` / `claim-rearm`
|
|
332
|
+
exit 1 is a hard stop.
|
|
333
|
+
- **Claim before create on Claude.** If you `claim-rearm` first, the
|
|
334
|
+
PreToolUse hook sees `rearm_pending` and denies `ScheduleWakeup`.
|
|
335
|
+
Create first, then claim.
|
|
336
|
+
- **Forgetting `begin-firing` on refresh.** The latch stays pending;
|
|
337
|
+
later re-arms are denied forever until a firing clears it. Refresh
|
|
338
|
+
must run `begin-firing` first.
|
|
339
|
+
- **Create without claim.** If create succeeds and you skip
|
|
340
|
+
`claim-rearm`, a second create can stack. Always claim immediately
|
|
341
|
+
after a successful create.
|
|
342
|
+
|
|
192
343
|
## File Index
|
|
193
344
|
|
|
194
345
|
| File | Purpose |
|
|
195
346
|
|---|---|
|
|
196
|
-
| `SKILL.md` | Orchestrator strategy
|
|
347
|
+
| `SKILL.md` | Orchestrator strategy; pointers to run-control scripts. |
|
|
348
|
+
| `scripts/status_gate.py` | Status file, latch, and re-arm gate (exit codes). |
|
|
349
|
+
| `scripts/status_gate_constants/config/constants.py` | Named constants for status_gate. |
|
|
350
|
+
| `scripts/test_status_gate.py` | Gate tests. |
|
|
197
351
|
|
|
198
352
|
## Folder Map
|
|
199
353
|
|
|
200
|
-
- `SKILL.md` —
|
|
201
|
-
|
|
354
|
+
- `SKILL.md` — orchestration process and routing.
|
|
355
|
+
- `scripts/` — deterministic status_gate.
|
|
356
|
+
- Advisor policy:
|
|
202
357
|
[`_shared/advisor/advisor-protocol.md`](../../_shared/advisor/advisor-protocol.md).
|