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.
Files changed (309) hide show
  1. package/CLAUDE.md +26 -59
  2. package/_shared/pr-loop/scripts/_claude_permissions_common.py +84 -0
  3. package/_shared/pr-loop/scripts/code_rules_gate.py +6 -3
  4. package/_shared/pr-loop/scripts/code_rules_gate_parts/CLAUDE.md +12 -2
  5. package/_shared/pr-loop/scripts/code_rules_gate_parts/baseline_import_isolation.py +309 -0
  6. package/_shared/pr-loop/scripts/code_rules_gate_parts/staged_test_regression.py +540 -0
  7. package/_shared/pr-loop/scripts/code_rules_gate_parts/staged_test_running.py +206 -70
  8. package/_shared/pr-loop/scripts/code_rules_gate_parts/tests/__init__.py +1 -0
  9. package/_shared/pr-loop/scripts/code_rules_gate_parts/tests/_repo_test_helpers.py +76 -0
  10. package/_shared/pr-loop/scripts/code_rules_gate_parts/tests/test_baseline_import_isolation.py +248 -0
  11. package/_shared/pr-loop/scripts/code_rules_gate_parts/tests/test_staged_test_regression.py +309 -0
  12. package/_shared/pr-loop/scripts/code_rules_gate_parts/tests/test_staged_test_running.py +91 -58
  13. package/_shared/pr-loop/scripts/grant_project_claude_permissions.py +306 -306
  14. package/_shared/pr-loop/scripts/pr_loop_shared_constants/claude_permissions_constants.py +44 -0
  15. package/_shared/pr-loop/scripts/pr_loop_shared_constants/code_rules_gate_constants.py +202 -0
  16. package/_shared/pr-loop/scripts/pr_loop_shared_constants/copilot_quota_constants.py +24 -24
  17. package/_shared/pr-loop/scripts/pr_loop_shared_constants/stale_worktree_rule_sweep_constants.py +107 -107
  18. package/_shared/pr-loop/scripts/revoke_project_claude_permissions.py +290 -48
  19. package/_shared/pr-loop/scripts/tests/test_claude_permissions_common.py +42 -2
  20. package/_shared/pr-loop/scripts/tests/test_claude_permissions_constants.py +36 -0
  21. package/_shared/pr-loop/scripts/tests/test_code_rules_gate.py +100 -1
  22. package/_shared/pr-loop/scripts/tests/test_fix_hookspath.py +497 -497
  23. package/_shared/pr-loop/scripts/tests/test_revoke_project_claude_permissions.py +311 -2
  24. package/_shared/pr-loop/scripts/tests/test_stale_worktree_rule_sweep.py +301 -301
  25. package/_shared/pr-loop/scripts/tests/test_stale_worktree_rule_sweep_constants.py +85 -85
  26. package/_shared/pr-loop/worker-spawn.md +1 -1
  27. package/agents/CLAUDE.md +3 -2
  28. package/agents/caveman.md +0 -1
  29. package/agents/clasp-deployment-orchestrator.md +0 -1
  30. package/agents/clean-coder.md +0 -1
  31. package/agents/code-advisor.md +0 -1
  32. package/agents/code-quality-agent.md +1 -2
  33. package/agents/code-verifier.md +36 -8
  34. package/agents/deep-research.md +0 -1
  35. package/agents/docs-agent.md +0 -1
  36. package/agents/git-commit-crafter.md +0 -1
  37. package/agents/issue-tracker.md +42 -0
  38. package/agents/plan-packet-validator.md +0 -1
  39. package/agents/pr-description-writer.md +0 -1
  40. package/agents/test_agent_frontmatter.py +67 -18
  41. package/audit-rubrics/category_rubrics/category-o-docstring-vs-impl-drift.md +143 -141
  42. package/bin/CLAUDE.md +68 -5
  43. package/bin/codex-compat.mjs +104 -0
  44. package/bin/codex-compat.test.mjs +51 -0
  45. package/bin/ever-shipped-skills.mjs +1 -0
  46. package/bin/install-constants.mjs +88 -0
  47. package/bin/install.mjs +1138 -114
  48. package/bin/install.prune.test.mjs +869 -19
  49. package/bin/install.test.mjs +906 -2
  50. package/codex-capability-map.json +13 -0
  51. package/commands/implement.md +1 -1
  52. package/commands/right-size.md +1 -1
  53. package/docs/CLAUDE.md +1 -0
  54. package/docs/CODE_RULES.md +2 -0
  55. package/docs/codex-compatibility.md +25 -0
  56. package/docs/host-pool-health-monitor.md +102 -0
  57. package/docs/nas-ssh-invocation.md +96 -12
  58. package/docs/references/CLAUDE.md +4 -2
  59. package/docs/references/advisor-tool.md +13 -0
  60. package/docs/references/code-review-enforcement.md +35 -0
  61. package/docs/references/team-advisor-skill.md +14 -0
  62. package/hooks/blocking/CLAUDE.md +4 -0
  63. package/hooks/blocking/code_review_pr_create_gate.py +7 -3
  64. package/hooks/blocking/code_review_push_gate.py +9 -4
  65. package/hooks/blocking/code_review_stamp_directory_write_blocker.py +8 -0
  66. package/hooks/blocking/config/__init__.py +5 -5
  67. package/hooks/blocking/config/code_review_enforcement_constants.py +40 -7
  68. package/hooks/blocking/config/test_code_review_enforcement_constants.py +58 -0
  69. package/hooks/blocking/config/verified_commit_constants.py +160 -159
  70. package/hooks/blocking/eli11_reply_enforcer.py +479 -0
  71. package/hooks/blocking/gh_body_arg_blocker.py +1 -1
  72. package/hooks/blocking/nas_ssh_binary_enforcer.py +8 -46
  73. package/hooks/blocking/orchestrator_refresh_reschedule_gate.py +256 -0
  74. package/hooks/blocking/pre_tool_use_dispatcher.py +24 -24
  75. package/hooks/blocking/shell_substitution_blocker.py +129 -0
  76. package/hooks/blocking/state_description_blocker.py +1 -1
  77. package/hooks/blocking/stop_dispatcher.py +1 -1
  78. package/hooks/blocking/test_bash_pre_tool_use_dispatcher.py +2 -3
  79. package/hooks/blocking/test_code_review_pr_create_gate.py +14 -0
  80. package/hooks/blocking/test_code_review_push_gate.py +16 -0
  81. package/hooks/blocking/test_code_review_stamp_directory_write_blocker.py +19 -0
  82. package/hooks/blocking/test_eli11_reply_enforcer.py +457 -0
  83. package/hooks/blocking/test_orchestrator_refresh_reschedule_gate.py +231 -0
  84. package/hooks/blocking/test_pre_tool_use_dispatcher.py +10 -1
  85. package/hooks/blocking/test_shell_substitution_blocker.py +124 -0
  86. package/hooks/blocking/test_stop_dispatcher.py +23 -0
  87. package/hooks/blocking/test_unscoped_search_blocker.py +102 -0
  88. package/hooks/blocking/test_verdict_directory_write_blocker.py +804 -808
  89. package/hooks/blocking/test_verification_verdict_store.py +54 -0
  90. package/hooks/blocking/test_verified_commit_gate.py +581 -581
  91. package/hooks/blocking/test_verified_commit_message_accuracy_blocker.py +131 -131
  92. package/hooks/blocking/unscoped_search_blocker.py +391 -0
  93. package/hooks/blocking/verdict_directory_write_blocker.py +687 -687
  94. package/hooks/blocking/verification_verdict_store.py +1039 -1036
  95. package/hooks/blocking/verified_commit_message_accuracy_blocker.py +167 -167
  96. package/hooks/blocking/verifier_verdict_minter.py +280 -280
  97. package/hooks/git-hooks/CLAUDE.md +3 -0
  98. package/hooks/git-hooks/conftest.py +30 -0
  99. package/hooks/git-hooks/gate_utils.py +2 -2
  100. package/hooks/git-hooks/git_hooks_constants/__init__.py +41 -2
  101. package/hooks/git-hooks/pre_push.py +75 -4
  102. package/hooks/git-hooks/pre_push_base_reference.py +166 -0
  103. package/hooks/git-hooks/test_config.py +0 -15
  104. package/hooks/git-hooks/test_gate_utils.py +3 -15
  105. package/hooks/git-hooks/test_pre_commit.py +1 -15
  106. package/hooks/git-hooks/test_pre_push.py +257 -23
  107. package/hooks/git-hooks/test_pre_push_base_reference.py +339 -0
  108. package/hooks/hooks.json +10 -12
  109. package/hooks/hooks_constants/CLAUDE.md +7 -2
  110. package/hooks/hooks_constants/bash_pre_tool_use_dispatcher_constants.py +4 -4
  111. package/hooks/hooks_constants/eli11_reply_enforcer_constants.py +101 -0
  112. package/hooks/hooks_constants/enter_worktree_prefetch_constants.py +18 -18
  113. package/hooks/hooks_constants/nas_ssh_binary_enforcer_constants.py +2 -8
  114. package/hooks/hooks_constants/orchestrator_refresh_reschedule_gate_constants.py +48 -0
  115. package/hooks/hooks_constants/ruff_integration_constants.py +16 -0
  116. package/hooks/hooks_constants/shell_command_segments.py +82 -0
  117. package/hooks/hooks_constants/shell_substitution_blocker_constants.py +67 -0
  118. package/hooks/hooks_constants/stop_dispatcher_constants.py +1 -0
  119. package/hooks/hooks_constants/test_bash_pre_tool_use_dispatcher_constants.py +5 -6
  120. package/hooks/hooks_constants/test_stop_dispatcher_constants.py +1 -0
  121. package/hooks/hooks_constants/unscoped_search_blocker_constants.py +153 -0
  122. package/hooks/lifecycle/enter_worktree_origin_prefetch.py +163 -146
  123. package/hooks/lifecycle/test_enter_worktree_origin_prefetch.py +185 -178
  124. package/hooks/pyproject.toml +1 -0
  125. package/hooks/validators/CLAUDE.md +1 -0
  126. package/hooks/validators/config/__init__.py +0 -0
  127. package/hooks/validators/config/directory_exemption_constants.py +183 -0
  128. package/hooks/validators/config/test_directory_exemption_constants.py +21 -0
  129. package/hooks/validators/conftest.py +4 -0
  130. package/hooks/validators/ruff_integration.py +49 -5
  131. package/hooks/validators/run_all_validators.py +206 -9
  132. package/hooks/validators/test_directory_exemption_constants.py +185 -0
  133. package/hooks/validators/test_python_antipattern_checks.py +110 -5
  134. package/hooks/validators/test_ruff_integration.py +92 -1
  135. package/hooks/validators/test_run_all_validators.py +115 -68
  136. package/hooks/validators/test_run_all_validators_pretooluse.py +159 -1
  137. package/package.json +13 -3
  138. package/rules/CLAUDE.md +17 -22
  139. package/rules/agent-spawn-protocol.md +6 -6
  140. package/rules/anti-corollary-tests.md +1 -1
  141. package/rules/bdd.md +1 -1
  142. package/rules/cleanup-temp-files.md +10 -4
  143. package/rules/code-standards.md +7 -0
  144. package/rules/conservative-action.md +1 -5
  145. package/rules/context7.md +0 -4
  146. package/rules/destructive-commands.md +47 -0
  147. package/rules/doc-inventory-integrity.md +48 -0
  148. package/rules/doc-prose-cuts.md +58 -0
  149. package/rules/docstring-prose-matches-implementation.md +53 -44
  150. package/rules/durable-post-artifacts.md +0 -4
  151. package/rules/eli11-replies.md +31 -0
  152. package/rules/explore-thoroughly.md +4 -4
  153. package/rules/falsify-before-green.md +68 -0
  154. package/rules/file-global-constants.md +1 -1
  155. package/rules/filesystem-search.md +51 -0
  156. package/rules/gh-cli-conventions.md +27 -0
  157. package/rules/git-workflow.md +26 -0
  158. package/rules/hedging-claims.md +9 -0
  159. package/rules/long-horizon-autonomy.md +0 -4
  160. package/rules/measurement-denominators.md +48 -0
  161. package/rules/nas-ssh-invocation.md +23 -5
  162. package/rules/parallel-tools.md +2 -2
  163. package/rules/plain-illustrative-docstrings.md +3 -7
  164. package/rules/plain-language.md +2 -0
  165. package/rules/proof-of-work-pr-comments.md +0 -4
  166. package/rules/re-stage-before-commit.md +2 -0
  167. package/rules/research-mode.md +10 -0
  168. package/rules/shell-invocation.md +21 -0
  169. package/rules/testing.md +4 -0
  170. package/rules/verified-commit-gate-skip.md +3 -27
  171. package/rules/verify-before-asking.md +5 -0
  172. package/rules/windows-filesystem-safe.md +1 -1
  173. package/rules/workers-done-before-complete.md +4 -0
  174. package/scripts/CLAUDE.md +1 -0
  175. package/scripts/Capture-PoolHealth.ps1 +410 -0
  176. package/scripts/Migrate-ShellPolicy.ps1 +1 -1
  177. package/scripts/_code_review_test_support.py +404 -0
  178. package/scripts/claude_chain_runner.py +141 -1
  179. package/scripts/codex_capability_bridge.py +171 -0
  180. package/scripts/codex_compat_materializer.py +1087 -0
  181. package/scripts/codex_compat_watcher.py +502 -0
  182. package/scripts/conftest.py +16 -1
  183. package/scripts/dev_env_scripts_constants/CLAUDE.md +1 -1
  184. package/scripts/dev_env_scripts_constants/claude_chain_constants.py +9 -0
  185. package/scripts/dev_env_scripts_constants/code_review_constants.py +37 -0
  186. package/scripts/invoke_code_review.py +11 -4
  187. package/scripts/resolve_worker_spawn.py +626 -626
  188. package/scripts/spawn_grok_batch.py +672 -672
  189. package/scripts/sync_to_cursor/rules.py +0 -10
  190. package/scripts/test_claude_chain_runner.py +131 -0
  191. package/scripts/test_invoke_code_review.py +85 -908
  192. package/scripts/test_invoke_code_review_chain.py +70 -0
  193. package/scripts/test_invoke_code_review_cli.py +192 -0
  194. package/scripts/test_invoke_code_review_contract.py +256 -0
  195. package/scripts/test_invoke_code_review_git.py +123 -0
  196. package/scripts/test_invoke_code_review_mode.py +99 -0
  197. package/scripts/test_resolve_worker_spawn.py +1014 -1014
  198. package/scripts/tests/test_code_review_constants.py +80 -0
  199. package/scripts/tests/test_codex_capability_bridge.py +91 -0
  200. package/scripts/tests/test_codex_compat_materializer.py +632 -0
  201. package/scripts/tests/test_codex_compat_watcher.py +599 -0
  202. package/scripts/tests/test_sync_to_cursor.py +0 -1
  203. package/skills/CLAUDE.md +2 -0
  204. package/skills/auditing-claude-config/SKILL.md +114 -114
  205. package/skills/autoconverge/SKILL.md +427 -427
  206. package/skills/autoconverge/reference/convergence.md +24 -3
  207. package/skills/autoconverge/workflow/CLAUDE.md +1 -0
  208. package/skills/autoconverge/workflow/converge.clean-audit.test.mjs +3 -3
  209. package/skills/autoconverge/workflow/converge.contract.test.mjs +1263 -1263
  210. package/skills/autoconverge/workflow/converge.mjs +168 -1
  211. package/skills/autoconverge/workflow/converge.p2-advance.test.mjs +202 -0
  212. package/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a11d903476b803493.jsonl +2 -2
  213. package/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a26213978adeef6fb.jsonl +2 -2
  214. package/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a3def0d15ed9d9110.jsonl +2 -2
  215. package/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a41f41b1b708ee3b7.jsonl +2 -2
  216. package/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a758b880abecc3ff7.jsonl +2 -2
  217. package/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a8897b89656b1bd16.jsonl +2 -2
  218. package/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-abd463d744a1437bc.jsonl +2 -2
  219. package/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-ad19d027ae8ee1816.jsonl +2 -2
  220. package/skills/autoconverge/workflow/fixtures/wf_run/workflows/wf_881252e6-700.json +265 -265
  221. package/skills/bugteam/reference/copilot-gap-analysis.md +1 -1
  222. package/skills/closeout/SKILL.md +33 -50
  223. package/skills/codex-review/scripts/codex_review_scripts_constants/run_constants.py +8 -0
  224. package/skills/codex-review/scripts/run_codex_review.py +233 -1
  225. package/skills/codex-review/scripts/test_run_codex_review.py +189 -0
  226. package/skills/condensing-instructions/SKILL.md +72 -0
  227. package/skills/copilot-review/SKILL.md +119 -119
  228. package/skills/e-code-review/SKILL.md +52 -0
  229. package/skills/e-code-review/reference/fix.md +54 -0
  230. package/skills/e-code-review/reference/loop.md +43 -0
  231. package/skills/e-code-review/reference/low.md +57 -0
  232. package/skills/e-code-review/reference/medium.md +153 -0
  233. package/skills/e-code-review/reference/xhigh.md +182 -0
  234. package/skills/e-simplify/SKILL.md +97 -0
  235. package/skills/fresh-branch/CLAUDE.md +1 -1
  236. package/skills/fresh-branch/SKILL.md +5 -6
  237. package/skills/fresh-branch/scripts/create_fresh_branch.py +42 -24
  238. package/skills/fresh-branch/scripts/fresh_branch_scripts_constants/fresh_branch_cli_constants.py +1 -3
  239. package/skills/fresh-branch/scripts/test_create_fresh_branch.py +30 -126
  240. package/skills/issue-tracker/SKILL.md +92 -0
  241. package/skills/issue-tracker/reference/epic-and-sub-issue-model.md +55 -0
  242. package/skills/issue-tracker/reference/handoff-schema.md +64 -0
  243. package/skills/issue-tracker/reference/operation-matrix.md +41 -0
  244. package/skills/orchestrator/SKILL.md +177 -22
  245. package/skills/orchestrator/scripts/status_gate.py +625 -0
  246. package/skills/orchestrator/scripts/status_gate_constants/__init__.py +1 -0
  247. package/skills/orchestrator/scripts/status_gate_constants/config/__init__.py +1 -0
  248. package/skills/orchestrator/scripts/status_gate_constants/config/constants.py +47 -0
  249. package/skills/orchestrator/scripts/test_status_gate.py +439 -0
  250. package/skills/orchestrator-refresh/SKILL.md +129 -35
  251. package/skills/plan-to-pr/SKILL.md +155 -0
  252. package/skills/plan-to-pr/reference/final-validation-tasks.md +15 -0
  253. package/skills/plan-to-pr/reference/model-routing.md +36 -0
  254. package/skills/plan-to-pr/reference/packet-contract.md +43 -0
  255. package/skills/plan-to-pr/reference/packet-schema.json +57 -0
  256. package/skills/plan-to-pr/reference/process-inventory.md +22 -0
  257. package/skills/plan-to-pr/reference/review-loop.md +33 -0
  258. package/skills/plan-to-pr/reference/run-record.schema.json +27 -0
  259. package/skills/plan-to-pr/reference/self-audit-tasks.md +15 -0
  260. package/skills/plan-to-pr/reference/task-seeds.md +14 -0
  261. package/skills/plan-to-pr/reference/task-ticket.md +38 -0
  262. package/skills/plan-to-pr/scripts/config/__init__.py +1 -0
  263. package/skills/plan-to-pr/scripts/config/constants.py +193 -0
  264. package/skills/plan-to-pr/scripts/create_packet.py +173 -0
  265. package/skills/plan-to-pr/scripts/test_create_packet.py +102 -0
  266. package/skills/plan-to-pr/scripts/test_validate_packet.py +256 -0
  267. package/skills/plan-to-pr/scripts/test_validate_protocol.py +135 -0
  268. package/skills/plan-to-pr/scripts/test_validate_run.py +158 -0
  269. package/skills/plan-to-pr/scripts/validate_packet.py +655 -0
  270. package/skills/plan-to-pr/scripts/validate_protocol.py +622 -0
  271. package/skills/plan-to-pr/scripts/validate_run.py +173 -0
  272. package/skills/plan-to-pr/test_skill_contract.py +207 -0
  273. package/skills/plan-to-pr/test_task_ticket_contract.py +151 -0
  274. package/skills/pr-converge/SKILL.md +472 -469
  275. package/skills/pr-converge/reference/examples.md +3 -3
  276. package/skills/pr-converge/reference/fix-protocol.md +1 -1
  277. package/skills/pr-converge/reference/ground-rules.md +7 -4
  278. package/skills/pr-converge/reference/multi-pr-orchestration.md +4 -1
  279. package/skills/pr-converge/reference/per-tick.md +5 -5
  280. package/skills/pr-converge/reference/progress-checklist.md +1 -1
  281. package/skills/pr-converge/scripts/check_convergence_gates.py +279 -279
  282. package/skills/pr-converge/scripts/test_check_convergence_codex.py +507 -507
  283. package/skills/pr-converge/scripts/test_check_convergence_gates.py +84 -84
  284. package/skills/pr-converge/test_step5_host_branch.py +1 -1
  285. package/skills/pr-fix-protocol/SKILL.md +1 -1
  286. package/skills/privacy-hygiene/SKILL.md +68 -68
  287. package/skills/privacy-hygiene/reference/sweep-procedure.md +1 -1
  288. package/skills/prototype/workflows/promotion.md +1 -1
  289. package/skills/release-notes-html/SKILL.md +164 -0
  290. package/skills/session-log/SKILL.md +1 -1
  291. package/skills/task-build/CLAUDE.md +8 -7
  292. package/skills/task-build/SKILL.md +16 -8
  293. package/skills/task-build/reference/tool-routing.md +19 -0
  294. package/rules/claude-md-orphan-file.md +0 -28
  295. package/rules/cleanup-command-forms.md +0 -23
  296. package/rules/code-reviews.md +0 -11
  297. package/rules/env-var-table-code-drift.md +0 -10
  298. package/rules/gh-body-file.md +0 -5
  299. package/rules/gh-paginate.md +0 -3
  300. package/rules/hook-prose-matches-detector.md +0 -15
  301. package/rules/no-historical-clutter.md +0 -26
  302. package/rules/no-inline-destructive-literals.md +0 -9
  303. package/rules/no-justification-noise.md +0 -61
  304. package/rules/package-inventory-stale-entry.md +0 -25
  305. package/rules/right-sized-engineering.md +0 -28
  306. package/rules/self-contained-docs.md +0 -17
  307. package/rules/shell-invocation-policy.md +0 -5
  308. package/rules/tdd.md +0 -7
  309. 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 the
36
- refresh loop is already running, do not schedule a second one; reuse
37
- the live advisor bind and go to step 4.
38
- 2. **Register the discipline reminder.** Schedule it with
39
- `ScheduleWakeup` at `delaySeconds: 2700`, prompt
40
- `/orchestrator-refresh`, where each refresh re-schedules the next one.
41
- 3. **Bind the shared advisor before any executor.** Follow
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
- 4. **Write the run artifacts** (next section) before the first spawn.
52
- 5. **Orchestrate.** Hold the plan and the user conversation. Spawn each
53
- task with a ticket (Spawn ticket section), keep driving while
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
- 6. **Consult the advisor at hard decisions.** The trigger list, consult
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` | `opus` |
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 that maps to `clean-coder` on `opus` is not
131
- served by a `general-purpose` Sonnet spawn — the table is the
132
- contract, not a cost suggestion.
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
- reminder loop.
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: design rule, process, run artifacts, spawn ticket, routing table, reuse rules, ledger invariants, constraints. |
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` — complete orchestrator workflow instructions. Advisor
201
- policy lives in
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).