Skip to content

Commit 2fe30c0

Browse files
committed
fix: keep orchestrator skill updates in root
1 parent 15af4c5 commit 2fe30c0

4 files changed

Lines changed: 41 additions & 27 deletions

File tree

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ summary: Timeline of guardrail helper changes mirrored from Sweetistics and rela
44

55
# Changelog
66

7+
## 2026-07-02 — Orchestrator Ownership
8+
- Kept `maintainer-orchestrator` skill maintenance in the root orchestration session and enforced exactly one Codex app thread per project, removing project-to-task thread fan-out including the OpenClaw exception.
9+
710
## 2026-07-01 — Isolated Skill Audits
811
- Added `skill-cleaner --root-only` for auditing only explicitly supplied skill roots without Codex inventory noise. Thanks @its-How.
912

scripts/test-maintainer-orchestrator-policy

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,11 @@ metadata = File.read(File.expand_path("../skills/maintainer-orchestrator/agents/
66

77
requirements = {
88
"Codex app workers only" => "a worker is an owned Codex app thread, never a collaboration subagent",
9+
"one project thread per repository" => "Use exactly one owned Codex app project thread per repository",
10+
"root-owned skill maintenance" => "Maintain this canonical `maintainer-orchestrator` skill in the current root orchestrator session, never in a project thread or collaboration subagent.",
11+
"no project task fan-out" => "project threads never create task threads",
912
"pre-spawn classification" => "Before spawning a collaboration subagent, classify the task",
10-
"mutating work routing" => "Any task that can mutate repository, GitHub, or external state",
13+
"mutating work routing" => "Any repository task that can mutate repository, GitHub, or external state",
1114
"support-only subagents" => "Use collaboration subagents only for orchestration support",
1215
"subagent mutation ban" => "Collaboration subagents must never edit repository files, create commits, run implementation proof as the owner, push, mutate PRs/issues, approve workflows, merge, release, deploy, or perform live product/account proof.",
1316
"preservation-first recovery" => "Snapshot and preserve its state, patches, refs, logs, and evidence; hand them to the proper Codex app thread; reconcile ownership; never discard work.",
@@ -16,15 +19,23 @@ requirements = {
1619
"permission propagation check" => "verify its effective permission profile",
1720
"no repeated permission prompts" => "Do not retry the same denied action or repeatedly prompt the owner.",
1821
"single heartbeat inspection" => "inspect the existing heartbeat first",
19-
"private concurrency invariant" => "Hard concurrency invariant: private investigation, implementation, current-main replay, testing, proof, and review continue independently",
20-
"single public mutation slot" => "Exactly one worker at a time may mutate a public PR head",
22+
"private concurrency invariant" => "Hard concurrency invariant: private investigation, implementation, current-main replay, testing, proof, and review continue independently across qualified project threads for distinct repositories.",
23+
"single public mutation slot" => "Exactly one project thread at a time may mutate a public PR head",
2124
"frozen means public only" => "means public-mutation-frozen unless the instruction explicitly freezes all private work",
22-
"decision wait does not idle" => "Keep all other qualified private lanes active while that answer is pending.",
25+
"decision wait does not idle" => "Keep all other qualified private project lanes active while that answer is pending.",
2326
}
2427

2528
missing = requirements.reject { |_label, text| skill.include?(text) }
2629
abort "Missing maintainer-orchestrator policy: #{missing.keys.join(', ')}" unless missing.empty?
2730
abort "Ambiguous task subthread terminology" if skill.match?(/\bsubthreads?\b/i)
28-
abort "Stale maintainer-orchestrator default prompt" unless metadata.include?("dedicated Codex app threads") && metadata.include?("collaboration subagents read-only and support-only")
31+
forbidden_fan_out = [
32+
"may create direct Codex app task threads",
33+
"A project thread may create",
34+
"Use one isolated Codex worktree thread per selected task",
35+
"root → project → task",
36+
"Workers may review, implement, test, and monitor concurrently",
37+
]
38+
abort "Task-thread fan-out remains" if forbidden_fan_out.any? { |text| skill.include?(text) }
39+
abort "Stale maintainer-orchestrator default prompt" unless metadata.include?("one Codex app thread per project") && metadata.include?("skill maintenance in the root session") && metadata.include?("collaboration subagents read-only and support-only")
2940

3041
puts "Validated maintainer-orchestrator worker boundary."

0 commit comments

Comments
 (0)