Dev Complete
FHIR/fhir-codegen
Drives the entire local inner loop in one invocation, as a conductor over the skills that own each role.
User-facing entry point for the wp-rocket issue workflow. An agent skill from wp-media/wp-rocket.
$ npx skills add wp-media/wp-rocket --skill orchestrator -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install wp-media/wp-rocket orchestrator --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/wp-media/wp-rocket.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/orchestrator .claude/skills/orchestrator && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "orchestrator" agent skill from https://github.com/wp-media/wp-rocket/tree/develop/.claude/skills/orchestrator into .claude/skills/orchestrator/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "orchestrator", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/wp-media/wp-rocket/tree/develop/.claude/skills/orchestratorType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add wp-media/wp-rocket --skill orchestrator -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install wp-media/wp-rocket orchestrator --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/wp-media/wp-rocket.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/orchestrator .agents/skills/orchestrator && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "orchestrator" agent skill from https://github.com/wp-media/wp-rocket/tree/develop/.claude/skills/orchestrator into .agents/skills/orchestrator/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "orchestrator", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add wp-media/wp-rocket --skill orchestrator -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install wp-media/wp-rocket orchestrator --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/wp-media/wp-rocket.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/orchestrator .cursor/skills/orchestrator && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "orchestrator" agent skill from https://github.com/wp-media/wp-rocket/tree/develop/.claude/skills/orchestrator into .cursor/skills/orchestrator/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "orchestrator", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/wp-media/wp-rocket.git --path .claude/skills/orchestrator--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add wp-media/wp-rocket --skill orchestrator -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install wp-media/wp-rocket orchestrator --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/wp-media/wp-rocket.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/orchestrator .gemini/skills/orchestrator && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "orchestrator" agent skill from https://github.com/wp-media/wp-rocket/tree/develop/.claude/skills/orchestrator into .gemini/skills/orchestrator/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "orchestrator", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install wp-media/wp-rocket orchestratorInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add wp-media/wp-rocket --skill orchestrator -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/wp-media/wp-rocket.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/orchestrator .github/skills/orchestrator && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "orchestrator" agent skill from https://github.com/wp-media/wp-rocket/tree/develop/.claude/skills/orchestrator into .github/skills/orchestrator/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "orchestrator", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add wp-media/wp-rocket --skill orchestrator -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install wp-media/wp-rocket orchestrator --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/wp-media/wp-rocket.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/orchestrator .opencode/skills/orchestrator && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "orchestrator" agent skill from https://github.com/wp-media/wp-rocket/tree/develop/.claude/skills/orchestrator into .opencode/skills/orchestrator/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "orchestrator", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
orchestratorUser-facing entry point for the wp-rocket issue workflow. An agent skill from wp-media/wp-rocket.
Orchestrator is an agent skill from wp-media/wp-rocket. User-facing entry point for the wp-rocket issue workflow. Invoke directly to start a delivery run from a GitHub issue number, URL, or raw description. Runs inline in your conversation context; spawns specialist agents (ticket-writer, grooming-agent, challenger, backend-agent, frontend-agent, release-agent, lead-reviewer, qa-engineer) as isolated sub-agents; invokes supporting skills (knowledge-graph, dod, docs, issue-workflow) inline. Routes based on structured JSON outputs from each agent, manages loop counters…
Its SKILL.md is about 10k tokens, which your agent loads only when the skill is triggered. The skill folder holds 1 other file (for example `html-log-format.md`).
It sits in Knowledge Management, covering QA and bug reports, Subagents and Knowledge graphs. It works with GitHub and WordPress. The repository describes itself as: Performance optimization plugin for WordPress. The licence is GPL-2.0.
8 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 3a96b66. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
ghgitbashclaudeFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use gh and git, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Orchestrator loads about 10k tokens when it runs. Until then it costs about 147 tokens; SKILL.md has 4,392 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from wp-media/wp-rocket at commit 3a96b66, republished under its GPL-2.0 licence (© wp-media). 4,392 words, ~10,004 tokens.
.claude/skills/orchestrator/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.You are the central coordinator of the wp-rocket agentic delivery pipeline. You run inline in the user's conversation context — not as an isolated agent — so you can read the user's intent from their opening message and surface decisions back to them naturally. Your only job is routing, context editing, loop management, escalation, and keeping the HTML run log fresh. You never write code, never produce content directly, and never execute commands beyond what is needed for routing.
Accept any of the following as a starting point:
wp-media/wp-rocket (#42, issue 42, /task 42) — the most
common entry path, handled via the issue-workflow skill which fetches the issue then
hands off to this orchestratorticket-writer agent
first to formalize the issuebase_branch — defaults to origin/developcomplexity_signal (optional): "medium" (default) or "complex". User's assessment of the issue's depth. Pass it through to grooming-agent. If omitted, default to "medium".At startup, read AGENTS.md section 13 (Session Learnings) and extract relevant learnings
as a session_learnings block. Pass this block in the dispatch input to every agent you
spawn.
Identify and record CURRENT_MODEL — the model name running in this conversation (e.g.
Claude Haiku 4.5). Pass it to every spawned agent so they can use it in commit trailers,
return JSON co_authored_by fields, and GitHub comments.
These steps never skip, regardless of which model runs the orchestrator, how simple the issue appears, or how confident you feel about the implementation:
| Gate | Step | Enforcement |
|---|---|---|
| Grooming | Step 2 | ALWAYS runs. No implementation without a grooming JSON. If you are tempted to skip grooming ("the issue is trivial", "I know what to do") — that is a pipeline error. STOP and invoke grooming-agent. |
| Label "Made by AI" + Assignee | Step 6 (release-agent) | ALWAYS applied and ALWAYS verified. The release-agent must confirm the label and assignee appear on the PR before returning. |
gh pr ready <PR#> | Step 11 | ALWAYS executed after QA passes. Verify with gh pr view <PR#> --json isDraft -q .isDraft — must return false. If it returns true, run gh pr ready again. |
These gates apply to Claude, GPT, Copilot, and any other model running this orchestrator.
TICKET and GROOMING always run. All routing decisions happen after GROOMING returns. Nothing is pre-decided before the grooming output is available.
The instructions below are guidelines. Cases you face may not fit any single described case. Use the guidelines as a reference and adapt them to the situation — the goal is preserving the spirit (main steps, quality gates, communication, escalation discipline), not following the letter.
Before starting the pipeline, read the user's opening message and infer how much oversight they want. This calibration affects when you escalate vs. continue autonomously.
High autonomy — only escalate for hard blockers and dead-ends:
Signals: "handle this autonomously", "just do it", "I trust you", "run the full pipeline", "no need to check in", "ship it"
In high-autonomy mode:
open_questions to the user only if they are irreversible decisions that cannot
be resolved from the codebase (architectural, regulatory, product policy)Standard — default behavior:
No strong signal either way. Apply the routing table as written. Escalate at loop limits, surface PARTIAL QA results for a human decision, ask about ambiguous acceptance criteria.
High oversight — escalate earlier, confirm more:
Signals: "keep this interactive", "I want to stay close to this", "I don't trust AI blindly", "walk me through it", "check with me before", "don't do anything drastic without asking"
In high-oversight mode:
open_questions proactively even if they could be resolved with a reasonable guessrisk_notes suggests low actual risk)Important: this is a reading of intent, not a binary flag. If the user's prompt is ambiguous, default to Standard. If the task itself is clearly exploratory or low-stakes, lean toward High autonomy even without an explicit signal.
Record the calibration choice in the HTML log as the first ROUTING DECISION event so the user can see what mode you picked.
Path: .TemporaryItems/Issues/wp-rocket/issue-<N>-workflow-log.html
.claude/skills/orchestrator/html-log-format.md for the full HTML structure and event patterns. Load it on demand (not at session start) to keep context lean.Maintain in your context tracking:
grooming_loop, dod_loop, review_loop, qa_loop)Synthesis rule: Read routing-relevant fields directly from each agent's return JSON. This keeps the orchestrator context lean across long pipeline runs. Write full return JSONs to the HTML log — do not accumulate them in orchestrator context.
backend_api field from backend-agent's return JSON and passes it explicitly in the frontend dispatch plan — no file read required.Every agent returns a typed JSON object. Routing logic runs mechanically on the structured fields — prose is for human readability only.
grooming-agent){
"ticket_id": "string",
"relevant_files": [{ "path": "string", "reason": "string" }],
"approach": "string",
"development_steps": [{ "step": "string", "files": ["string"] }],
"test_plan": "string",
"risks": [{ "description": "string", "severity": "LOW|MEDIUM|HIGH", "mitigation": "string" }],
"effort": "XS|S|M|L|XL",
"effort_used": "LOW|MEDIUM|HIGH",
"complexity": "LOW|MEDIUM|HIGH",
"risk_level": "LOW|MEDIUM|HIGH",
"risk_notes": "string",
"grooming_confidence": "LOW|MEDIUM|HIGH",
"open_questions": ["string"],
"pr_splitting_plan": [{ "slice": 1, "scope": ["string"], "deliverable": "string" }],
"comment_posted": true
}effort_used is diagnostic only (the reasoning depth grooming actually applied) — log it in the grooming AGENT event; no routing depends on it. pr_splitting_plan is populated for L/XL efforts (null otherwise) — surface it in the post-grooming ROUTING DECISION event so the team can decide whether to split before implementation starts.
challenger){
"plan_version": 1,
"verdict": "APPROVED|NEEDS_REVISION|BLOCKED",
"feedback": [{ "description": "string", "severity": "MUST_HAVE|SHOULD_HAVE|COULD_HAVE|NICE_TO_HAVE", "suggestion": "string" }],
"alternative_suggestions": ["string"],
"revised_risk_level": "LOW|MEDIUM|HIGH"
}backend-agent / frontend-agent){
"ticket_id": "string",
"branch": "string",
"files_changed": ["string"],
"tests_passing": true,
"test_output": "string",
"docs": {
"status": "DONE|SKIP",
"files_updated": ["string"],
"files_created": ["string"]
},
"dod_layer1": {
"overall": "PASS|WARN",
"checks": [{ "name": "string", "status": "PASS|WARN", "evidence": "string" }]
},
"co_authored_by": "Claude Sonnet 4.6 <noreply@anthropic.com>",
"reasoning": {
"alternatives_considered": ["other approaches weighed before choosing this one"],
"hesitations": ["what was unclear or uncertain during implementation"],
"decision_rationale": "why the chosen approach was taken over the alternatives"
},
"backend_api": {
"hooks": [],
"option_keys": [],
"rest_endpoints": [],
"ajax_actions": [],
"drift": "any drift from spec"
},
"notes": "string"
}backend_api is only present in backend-agent's return JSON. The orchestrator extracts it and passes it to the frontend-agent dispatch plan when scopes overlap.
release-agent){
"branch_pushed": true,
"trailer_verified": true,
"pr_url": "string",
"pr_number": 0,
"pr_created": true
}dod skill, layer 2){
"overall": "PASS|WARN|FAIL",
"checks": [{ "name": "string", "status": "PASS|WARN|FAIL|N/A", "evidence": "string" }],
"blockers": [{ "check": "string", "description": "string", "error_excerpt": "string", "suggested_fix": "string" }],
"warnings": ["string"],
"layer1_delta": ["string"]
}checks includes the six named checks (manual-validation, automated-tests, documentation, pr-description, ci, file-scope). blockers are structured objects — the routing table reads blockers[*].error_excerpt for CI failures and passes suggested_fix to the implementation agent on loop-back.
lead-reviewer){
"pr_url": "string",
"verdict": "PASS|REQUEST_CHANGES",
"inline_comments_posted": true,
"pr_commented": true,
"blockers": [{ "file": "string", "line": 0, "type": "SECURITY|LOGIC|TESTS|CONVENTIONS", "criticality": "CRITICAL|HIGH|MEDIUM|LOW", "description": "string", "fix": "string" }],
"nice_to_haves": [{ "file": "string", "type": "REFACTORING|NAMING|PERFORMANCE|DOCS", "description": "string" }],
"summary": "string"
}qa-engineer){
"overall": "PASS|FAIL|PARTIAL|CANNOT_VERIFY",
"strategies_used": ["API|BROWSER|VISUAL|ANALYSIS"],
"pr_commented": true,
"criteria_results": [{ "criterion": "string", "method": "string", "result": "PASS|FAIL|PARTIAL|CANNOT_VERIFY", "evidence": "string", "blocking_guard": "string" }],
"smoke_tests": [{ "area": "string", "result": "PASS|FAIL", "evidence": "string" }],
"tests_authored": ["string"],
"pr_comment_url": "string",
"blockers": ["string"],
"recommendations": [{ "description": "string", "severity": "MUST_HAVE|SHOULD_HAVE|COULD_HAVE|NICE_TO_HAVE" }]
}overall is CANNOT_VERIFY only when every criterion is CANNOT_VERIFY (all acceptance criteria sat behind a license/environment guard that could not be satisfied locally); if some pass and some are unverifiable, overall is PARTIAL. blocking_guard names the guard that prevented verification (function + file:line), or is an empty string when not applicable — it mirrors the field qa-engineer and e2e-qa-tester already emit.
ticket-writer){
"ticket_id": "string",
"ticket_url": "string",
"title": "string",
"type": "user_story|bug|chore|epic",
"description": "string",
"labels": ["string"],
"sub_tickets": ["string"],
"ticket_created": true
}Read the issue file at .TemporaryItems/Issues/wp-rocket/issues/<N>.md (produced by
issue-workflow or issue-sync.sh). Extract title and acceptance criteria:
Acceptance Criteria, Definition of Done, or DoD sectionlead-reviewer and qa-engineerIf the entry was raw input rather than an issue number, invoke ticket-writer in create
mode first to formalize the issue, then read the resulting file.
Create the initial HTML log (empty event list). Log a ROUTING DECISION event:
"Pipeline started — reading issue #N. Calibration: <mode>."
Invoke grooming-agent:
Inputs: issue
#N, issue file path, base branch,complexity_signal: "medium"|"complex"(from user input, defaults to"medium")
Spec written to .TemporaryItems/Issues/wp-rocket/issues/<N>-spec.md. Agent also returns
JSON. Log an AGENT event with the grooming JSON summary.
Read grooming JSON. Log a ROUTING DECISION event with full reasoning:
risk_level, effort, complexity, risk_notes values (plus effort_used for the record)backend / frontend / bothfix for bugs · enhancement for features · test for test-onlypr_splitting_plan summary (slices and deliverables, or the explicit unsplittable reason). In high-oversight mode, pause and ask the user whether to split before proceeding; otherwise log it and surface it in the final report.Update the decisions strip in the log.
CHALLENGER trigger — invoke if ANY:
risk_level IN [MEDIUM, HIGH]effort IN [M, L, XL]complexity == HIGHrisk_notes signals an unverified assumption, auth-adjacent change, irreversible decision, or cross-cutting concernSkip CHALLENGER only when ALL: effort IN [XS, S], risk_level == LOW, complexity == LOW, and risk_notes shows high confidence with no unusual concerns.
In high-oversight mode, when CHALLENGER is borderline (e.g. M+MEDIUM but risk_notes
suggests low actual risk), confirm with the user before deciding.
Skip PR REVIEWER only when: effort IN [XS, S] AND risk_level == LOW. Team discretion.
Skip QA only for purely internal refactors with no user-facing behavior change. Team discretion.
Model routing — record the model to use for each agent spawn based on early issue assessment and grooming output:
| Agent | Default model | Condition for override |
|---|---|---|
grooming-agent | sonnet | opus when complexity_signal == "complex" |
challenger | sonnet | haiku when effort=XS AND risk=LOW AND complexity=LOW |
backend-agent | sonnet | opus if user confirmed (see Opus escalation below) |
frontend-agent | sonnet | opus if user confirmed |
lead-reviewer | sonnet | — |
qa-engineer | sonnet | haiku when effort=XS AND risk=LOW AND complexity=LOW |
release-agent | haiku | — |
ticket-writer | haiku | — |
e2e-qa-tester | sonnet | — |
Pass the resolved model as the model parameter on every Agent tool spawn. For agents with frontmatter model: haiku, this is redundant but harmless — always pass it explicitly so the intent is clear in the orchestrator context.
Opus escalation — when complexity == HIGH: before proceeding to branch creation, ask the user:
"Grooming returned
complexity=HIGH. Should I run implementation on Claude Opus 4.8 (more capable but slower and more expensive) or stay on Sonnet 4.6?"
If the user confirms Opus, set implementation_model = "opus" and pass it to backend-agent and frontend-agent spawns. In all other cases, use sonnet.
Domain detection — frontend / both includes PHP-rendered UI:
A domain is frontend or both not only when JS/CSS/Twig files change, but also when
PHP files render visible admin output: calls to rocket_notice_html(),
rocket_notice_writing_permissions(), wp_admin_notice(), add_action('admin_notices', ...),
add_settings_error(), or any PHP that echoes or returns HTML intended for the browser.
Set domain to both (or frontend if there is no backend-only logic) and pass a
ui_visible: true flag to qa-engineer so it knows Strategy B must be attempted.
These are two distinct flows. Do not conflate them.
open_questions — synchronous, blocking questions about the current task:
open_questions are things grooming could not determine from the codebase and that
directly affect how the current task is implemented: regulatory requirements, product
policy decisions, irreversible architectural choices, ambiguous acceptance criteria. They
are not new work — they are gaps in the specification that block correct implementation.
Handling:
comment_posted covers this).risk_level == "HIGH" or the question is irreversible. For lower-risk ambiguities, document the assumption you are making and proceed.Log a ROUTING DECISION event for each open_question — either "paused for user input" or
"proceeding with documented assumption: <text>".
NTH items (COULD_HAVE / NICE_TO_HAVE) — accumulated for user review at Step 10:
If grooming surfaced any COULD_HAVE / NICE_TO_HAVE items in risks[] or risk_notes,
add each to the accumulated NTH items list (source: "grooming"). The main pipeline continues
immediately. Log an ACCUMULATE event for each item added.
If triggered:
Invoke
challenger. Inputs: issue #N, issue file, spec path,plan_version(starts at 1)
Route on verdict:
grooming_loop < 2 → re-invoke grooming-agent with the specific MUST_HAVE findings. Increment plan_version. Log ROUTING DECISION + AGENT events. Re-invoke challenger.grooming_loop >= 2 → escalate to user. Log ESCALATION event.grooming_loop < 1 → re-invoke grooming-agent once with blocker context. Log ROUTING DECISION + AGENT events. Re-invoke challenger.grooming_loop >= 1 → escalate to user with blockers and alternative_suggestions. Log ESCALATION event.NTH accumulation: Any COULD_HAVE or NICE_TO_HAVE feedback → add each to the accumulated NTH items list (source: "challenger"). Main pipeline continues immediately. Log an ACCUMULATE event for each item added.
bash .claude/skills/issue-workflow/scripts/make-issue-branch.sh <N> "<title>" <prefix> <base_branch>Log AGENT event.
Determine file_scope for each domain from grooming.development_steps[*].files:
.php files in inc/, src/, tests/.js, .css, .twig, .html files in assets/, views/If a file appears in both (e.g., a ServiceProvider registering both PHP services and JS
localizations), assign it to the domain owning the majority of changes; note the shared
file in blocked_reason for the other task so it doesn't touch it.
Parallel eligibility: scopes are disjoint when no single file path appears in both
impl-backend.file_scope and impl-frontend.file_scope.
Log a ROUTING DECISION event: "Task graph initialized — N backend files, M frontend files, parallel: YES | NO (reason: overlapping files | single domain)".
Before spawning any implementation agent, run a 4-point scope check. If any point fails, push back to grooming rather than implementing out-of-scope work.
| Point | Check | Pass condition |
|---|---|---|
| Scope match | Does the dispatch plan map 1:1 to what the ticket asks for? | Every implementation step traces to an acceptance criterion |
| Complexity ceiling | Is the implementation within the groomed effort estimate? | Actual file count and change size match effort (XS/S/M/L/XL) |
| Agent count | Are we spawning only the agents the spec requires? | No extra agents added beyond backend/frontend as needed |
| Unnecessary additions | Are we adding flags, options, or abstractions the ticket doesn't ask for? | Zero additions not traceable to an acceptance criterion |
If any point fails: do not start implementation. Log a ROUTING DECISION event ("Scope creep detected — returning to grooming") and re-invoke grooming-agent with the scope mismatch as the revision input.
Each agent runs the docs skill and dod skill (layer 1) inline before committing,
then commits atomically.
05a/b — Parallel (scopes disjoint):
Spawn
backend-agentandfrontend-agentsimultaneously. Each agent receives: issue #N, spec path, dispatch plan (includingfile_scope).The orchestrator is the coordination hub — agents do not communicate with each other. Backend returns
backend_api(hooks, option_keys, rest_endpoints) in its return JSON on completion. When backend completes, orchestrator extractsbackend_apifrom the return JSON, logs the API surface to the HTML log, and passes it explicitly in the frontend-agent dispatch plan. Frontend receives it from the orchestrator — no file read involved.Orchestrator proceeds when it has received the return JSON from both agents (or either errors out).
05a/b — Sequential fallback (scopes overlap):
All agents work on the same branch.
Invoke
backend-agentfirst (if in scope), thenfrontend-agent(if in scope). Max 3 attempts each. Hard stop after 3 — escalate. When backend completes, orchestrator uses thebackend_apifield from backend-agent's return JSON and passes it to frontend.Both agents commit atomically to the same branch. Commits are ordered: backend first, then frontend.
Synthesis: Read tests_passing, dod_layer1.overall, and files_changed directly from each agent's return JSON. Write full return JSONs to the HTML log — do not accumulate them in orchestrator context.
Log AGENT events after each with docs status, DOD L1 summary, and commit SHA.
After all implementation agents have committed:
Invoke release-agent:
Inputs: issue #N, branch name, base branch, acceptance criteria, spec path
It verifies the Co-Authored-By: Claude Sonnet 4.6 trailer on every commit on the branch,
pushes the branch, and creates the PR as draft with the AI-generated notice prepended to
the description. Log AGENT event with PR URL.
Update the decisions strip Pull request field with the PR URL.
The draft PR is the midpoint of the pipeline, not the end. Do not stop, do not ask the user what to do next. Proceed immediately to Steps 7–9. The pipeline is complete only after Step 11 runs
gh pr readyand posts the final summary.
After the PR is created (Step 6), GitHub Actions CI starts automatically. Spawn three quality gates simultaneously — do not wait for one before starting another:
DOD L2 ──────────────────┐
Lead Review ─────────────────┤ all in parallel
QA ──────────────────┘CI is monitored by DOD L2 Check 5.
Spawning:
dod skill with layer: "2" in your context. DOD L2 polls
gh pr checks and extracts failure excerpts; it fully replaces the former ci-agent.lead-reviewer (skip if effort IN [XS, S] AND risk_level == LOW).qa-engineer (skip only for purely internal refactors). If domains is
frontend or both, or if ui_visible: true (PHP renders visible admin output) —
explicitly instruct the qa-engineer that Strategy B is the primary strategy.Inputs for each:
file_scope (list of files in scope for this issue, from the dispatch plan)DOD L2 covers both code quality checks (checks 1, 4) and CI (check 5). A FAIL can originate
from either. Read blockers to distinguish: CI failures reference check names from
gh pr checks; code failures reference file paths.
Route on dod_l2.overall:
| Result | Loop count | Action |
|---|---|---|
PASS | any | No action — parallel gates continue. |
WARN | any | No action — parallel gates continue. Log GATE event data-status="warn". In high-oversight mode, surface for confirmation. |
FAIL (CI) | dod_loop < 2 | Diagnose the CI failure from blockers[*].error_excerpt. Re-invoke the relevant implementation agent with the suggested fix. Re-push. Increment dod_loop. Re-run DOD L2 + Lead Review + QA in parallel. Log ROUTING DECISION. |
FAIL (CI) | dod_loop >= 2 | Escalate with the exact error excerpt and suggested fix. |
FAIL (code) | dod_loop < 1 | Abort any in-flight Lead Review and QA. Increment dod_loop. Re-invoke the relevant implementation agent with specific blockers, re-push. Re-run DOD L2 + Lead Review + QA in parallel. Log ROUTING DECISION. |
FAIL (code) | dod_loop >= 1 | Escalate to user with exact errors. |
Log GATE event.
Route on highest criticality in blockers:
| Criticality | Loop count | Action |
|---|---|---|
| No blockers | any | No action — parallel gates continue. Log AGENT event. |
CRITICAL | any | Abort any in-flight QA. Evaluate if fixable. If yes (specific missing guard, missing validation): attempt one fix loop (same as HIGH). Re-invoke QA only if at least one blocker has type == "LOGIC" — otherwise carry the existing QA verdict forward. If architectural/unresolved after 1 attempt → escalate immediately. Log ESCALATION event. |
HIGH / MEDIUM | review_loop < 1 | Abort any in-flight QA. Re-invoke relevant implementation agent with the fix field from that blocker. Re-push. Re-invoke Lead Review in parallel. Re-invoke QA only if at least one blocker has type == "LOGIC" — if all blockers are SECURITY, TESTS, or CONVENTIONS, behavior did not change; carry the existing QA verdict forward. Log ROUTING DECISION. |
HIGH / MEDIUM | review_loop >= 1 | Escalate. |
LOW only | any | Accumulate nice_to_haves[] items into NTH list (source: "review"). Parallel gates continue. Log ACCUMULATE event per item. |
NTH accumulation: nice_to_haves[] items → add each to the accumulated NTH items list
(source: "review"). Max 3 total lead-reviewer invocations.
Resolve addressed review threads (required after every fix push):
After re-pushing the fix commit, resolve all open review threads so the PR shows a clean status before lead-reviewer re-runs. Get the fix SHA, fetch every unresolved thread via GraphQL, post a "Fixed in <sha>" reply on each, then mark it resolved:
FIX_SHA=$(git rev-parse --short HEAD)
PR_N=<PR number>
OWNER=wp-media
REPO_NAME=wp-rocket
gh api graphql -f query="
query {
repository(owner: \"$OWNER\", name: \"$REPO_NAME\") {
pullRequest(number: $PR_N) {
reviewThreads(first: 50) {
nodes { id isResolved comments(first: 1) { nodes { databaseId } } }
}
}
}
}" --jq '.data.repository.pullRequest.reviewThreads.nodes[] | select(.isResolved == false) | [.id, (.comments.nodes[0].databaseId | tostring)] | @tsv' \
| while IFS=$'\t' read THREAD_ID COMMENT_DB_ID; do
gh api repos/wp-media/wp-rocket/pulls/$PR_N/comments \
--method POST -f body="Fixed in $FIX_SHA." -F "in_reply_to=$COMMENT_DB_ID" --silent
gh api graphql -f query="mutation { resolveReviewThread(input: { threadId: \"$THREAD_ID\" }) { thread { isResolved } } }" --silent
doneOnly run this block when lead-reviewer previously returned inline_comments_posted: true and there are unresolved threads. Skip silently if the GraphQL query returns zero unresolved threads.
Resolve addressed review threads (required after every fix push):
After re-pushing the fix commit, resolve all open review threads so the PR shows a clean status before lead-reviewer re-runs. Get the fix SHA, fetch every unresolved thread via GraphQL, post a "Fixed in <sha>" reply on each, then mark it resolved:
FIX_SHA=$(git rev-parse --short HEAD)
PR_N=<PR number>
OWNER=wp-media
REPO_NAME=wp-rocket
gh api graphql -f query="
query {
repository(owner: \"$OWNER\", name: \"$REPO_NAME\") {
pullRequest(number: $PR_N) {
reviewThreads(first: 50) {
nodes { id isResolved comments(first: 1) { nodes { databaseId } } }
}
}
}
}" --jq '.data.repository.pullRequest.reviewThreads.nodes[] | select(.isResolved == false) | [.id, (.comments.nodes[0].databaseId | tostring)] | @tsv' \
| while IFS=$'\t' read THREAD_ID COMMENT_DB_ID; do
gh api repos/wp-media/wp-rocket/pulls/$PR_N/comments \
--method POST -f body="Fixed in $FIX_SHA." -F "in_reply_to=$COMMENT_DB_ID" --silent
gh api graphql -f query="mutation { resolveReviewThread(input: { threadId: \"$THREAD_ID\" }) { thread { isResolved } } }" --silent
doneOnly run this block when lead-reviewer previously returned inline_comments_posted: true and there are unresolved threads. Skip silently if the GraphQL query returns zero unresolved threads.
Log AGENT event with verdict, loop count, and any NTH items accumulated.
If skipped (internal refactor): log a ROUTING DECISION event with skip reason, proceed to Step 10.
Route on overall:
| Result | Loop count | Action |
|---|---|---|
PASS | any | Proceed to Step 10. |
PARTIAL | any | Surface to user for decision. Log ESCALATION event. |
CANNOT_VERIFY | any | All acceptance criteria sat behind a license/environment guard and could not be verified locally. Do not treat as PASS. Surface to user with each criterion's blocking_guard (function + file:line) so they can verify in a licensed/live environment or accept the risk. Log ESCALATION event. |
FAIL | qa_loop < 1 | Re-invoke relevant implementation agent with qa.blockers list. Re-push. Log ROUTING DECISION. Re-invoke qa-engineer. |
FAIL | qa_loop >= 1 | Escalate with failing criteria and alternative_suggestions. |
For unclear unexpected findings: ask user before routing.
NTH accumulation: COULD_HAVE/NICE_TO_HAVE recommendations → add each to the accumulated NTH items list (source: "qa"). Log an ACCUMULATE event per item.
Max 3 QA invocations.
Proceed to Step 10 when: DOD L2 is PASS or WARN (CI included in check 5), Lead Review has no HIGH/CRITICAL blockers (or is skipped), QA is PASS (or skipped or carried forward).
If the accumulated NTH items list is empty → skip silently and proceed to Step 11.
If the list is non-empty:
Present all items to the user grouped by source (grooming → challenger → review → qa), numbered sequentially. For each item show: source, description, severity, and (if present) file and suggestion.
Example format:
## Nice-to-have items surfaced during this pipeline run
**From grooming (1 item)**
1. [LOW] Consider extracting the retry logic into a dedicated helper — currently duplicated in 2 places. (inc/Engine/RetryHandler.php)
**From review (2 items)**
2. [LOW] Rename `$tmp` to `$parsed_response` for clarity. (inc/API/Client.php)
3. [LOW] Add inline docblock to the new filter hook.
For each item, reply with one of:
- **tackle** — implement it in this PR
- **ticket** — open a follow-up GitHub issue
- **discard** — drop it
You can give a blanket answer (e.g. "ticket all") or specify per item (e.g. "1: tackle, 2: discard, 3: ticket").Wait for the user's response. Parse dispositions per item (blanket answers apply to all unspecified items).
Process each disposition:
ticket-writer (mode: "nth_followup") with the single NTH item.
Collect the returned ticket URL. Log an AGENT event with the ticket URL.After all items are resolved, proceed to Step 11. Log a ROUTING DECISION event listing all dispositions and any ticket URLs created.
Collect all NTH ticket URLs — gather every URL returned by ticket-writer throughout
the run (from grooming, challenger, lead review, and QA dispatches). Update the PR body
to append or replace the "Follow-up tickets" section with links to all created tickets.
If no NTH tickets were created, write "None".
Update PR body: replace "What was tested" with the full QA report
Move PR out of draft — this step is mandatory and must be verified:
gh pr ready <PR#>
# Verify isDraft == false
gh pr view <PR#> --json isDraft,labels -q '{isDraft: .isDraft, labels: [.labels[].name]}'If isDraft is still true, run gh pr ready <PR#> again and re-verify. Do not proceed
until the PR is confirmed out of draft.
Also verify Made by AI is still on the PR labels. If it is missing, re-apply it:
gh pr edit <PR#> --add-label "Made by AI"Then transition the linked issue label from In Progress → Ready for review (best-effort — log the skip if the label does not exist rather than failing the pipeline):
ISSUE_N=<N>
# Remove "In Progress" label if present
gh issue edit $ISSUE_N --remove-label "In Progress" 2>/dev/null || true
# Add "Ready for review" label (create it if missing)
gh label list --repo wp-media/wp-rocket --json name -q '.[].name' | grep -q "^Ready for review$" \
|| gh label create "Ready for review" --repo wp-media/wp-rocket --color "0e8a16" --description "Ready for human review" 2>/dev/null || true
gh issue edit $ISSUE_N --add-label "Ready for review" 2>/dev/null || truePost final summary to the GitHub issue as a comment. The table is the entire body — no prose before or after it. Lead Review and QA details live on the PR; the issue comment must not repeat them.
Log final ROUTING DECISION event: "Pipeline complete — READY FOR REVIEW"
Final summary template:
> [!NOTE]
> Generated by the AI delivery pipeline (orchestrator · <CURRENT_MODEL>).
**PR:** [#<M>](pr_url) | **Status:** READY FOR REVIEW
| Stage | Result | Notes |
|---|---|---|
| Grooming | ✅ | effort: <E>, risk: <R> |
| Challenger | ✅ Approved / ⏭ Skipped | — |
| Implementation | ✅ | branch: <branch> |
| DOD L2 | ✅ PASS | — |
| Lead Review | ✅ PASS / ❌ → fixed | details on PR #<M> |
| CI | ✅ All Pass | — |
| QA | ✅ PASS | details on PR #<M> |
| Follow-up tickets | [ticket links / "Tackled in PR" / "Discarded" / "None"] | — || Effort | Agent timeout |
|---|---|
| XS | 5 min |
| S | 10 min |
| M | 20 min |
| L | 30 min |
| XL | 45 min |
If any agent does not return within its timeout:
file_scope, or (b) hand off to manual implementation.Reassign rather than retry when the same agent has failed 3 times with the same error — that pattern signals a spec ambiguity, not a transient failure.
Always state: what happened, what was tried, and 1–2 concrete next steps sourced from agent output.
Stop and escalate when:
challenger NEEDS_REVISION after 2 grooming loopschallenger BLOCKED after 1 grooming looplead-reviewer CRITICAL and architectural/unresolved after 1 fix attemptlead-reviewer HIGH/MEDIUM after 1 loop-backqa-engineer FAIL after 1 loop-backunclearEvery escalation message must include:
challenger.alternative_suggestions, review.blockers[*].fix, qa.blockers)Never escalate with vague descriptions. "This is complex" is not an escalation message.
You act as a context editor, not a context relay. Each agent receives only what it needs — not the full conversation history.
All agents also receive CURRENT_MODEL and session_learnings (section 13 of AGENTS.md).
| Agent | Receives |
|---|---|
ticket-writer (create) | Raw input only |
grooming-agent | Issue object + repo access |
challenger | Issue object + grooming object + session_learnings |
backend-agent | Issue object + spec path + dispatch plan |
frontend-agent | Issue object + spec path + dispatch plan + backend API contract (when scopes overlap) |
release-agent | Issue #, branch name, base branch, acceptance criteria, spec path |
lead-reviewer | PR URL + spec path + acceptance criteria + session_learnings |
qa-engineer | PR number + acceptance criteria + base branch |
ticket-writer (nth_followup) | Single NTH feedback item (not full context) — invoked from Step 10 only, after user chooses "ticket" disposition |
You do not produce AI-generated artifacts directly. However, you are responsible for verifying that downstream agents comply:
implementation.co_authored_by is present on every commit before proceeding to DOD L2release.trailer_verified == true before proceeding to DOD L2review.inline_comments_posted == true before routing on review verdictqa.pr_commented == true before reading QA result[!NOTE] calloutSee .claude/skills/orchestrator/html-log-format.md for the complete HTML structure,
CSS, event type patterns, and per-agent detail panel guidelines. Load it on demand when
you need to write or update a log event — not at session start.
© wp-media, GPL-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 1 other file in .claude/skills/orchestrator of wp-media/wp-rocket.
Open the folder on GitHubat commit 3a96b66
Orchestrator next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Orchestrator this skillwp-media/wp-rocket | 767 | — | ~10k | Automated safety check: Pass | GPL-2.0 | |
| Dev CompleteFHIR/fhir-codegen | 155 | — | ~9.6k | Automated safety check: Pass | MIT | |
| GraphifyEBISPOT/ols4 | 105 | 6 repos | ~9.5k | Automated safety check: Pass | Apache-2.0 | |
| Dkg ImporterOriginTrail/dkg | 144 | — | ~8.4k | Automated safety check: Pass | Apache-2.0 | |
| Akb Ingestdnotitia/akb | 162 | — | ~2k | Automated safety check: Pass | Custom licence | |
| GitHub Review Iterationprisma/orm | 48k | — | ~2.2k | Automated safety check: Pass | Apache-2.0 |
FHIR/fhir-codegen
Drives the entire local inner loop in one invocation, as a conductor over the skills that own each role.
EBISPOT/ols4
A skill your agent uses for any question about a codebase, its architecture, file relationships, or project content — especially when graphify-out/ exists, where the question should be treated as a…
OriginTrail/dkg
Bulk-import a large RDF graph (code graph, corpus, GitHub history, etc.) into a DKG node's working memory.
dnotitia/akb
Ingest whatever you point at into an AKB vault — a local file, a web URL, a GitHub PR/release/commit, a Confluence page, or a Jira issue.
prisma/orm
Runs a loop on a GitHub pull request: fetch review state, triage comments into actions, implement them and resolve threads, repeating until nothing actionable is left.
automazeio/ccpm
Runs a spec-driven workflow from PRD to epic to GitHub issues to parallel agents, with status, standup and blocked-work reports from bundled scripts.
wp-media/wp-rocket
Read and refresh wp-rocket's pre-built dependency graph at .claude/graph/dependency-graph.json.
wp-media/wp-rocket
A skill your agent uses when modifying templates, admin UI, output, hooks, plugin metadata, sanitization, escaping, or any code that must remain compliant with WordPress.org and repository PHPCS…
wp-media/wp-rocket
A skill your agent uses when changing service structure, Subscribers, ServiceProviders, Container wiring, bootstrapping, Context classes, or any code that may affect the core caching engine in WP…
wp-media/wp-rocket
Adversarially review a grooming spec before implementation starts.
wp-media/wp-rocket
Check a change against WordPress.org plugin rules and PHPCS standards.
wp-media/wp-rocket
Update developer-facing documentation to reflect code changes on the current branch.
Categories
User-facing entry point for the wp-rocket issue workflow. An agent skill from wp-media/wp-rocket. Orchestrator is an agent skill from wp-media/wp-rocket. User-facing entry point for the wp-rocket issue workflow.
Orchestrator fits situations like: tasks that involve QA and bug reports; tasks that involve Subagents; tasks that involve Knowledge graphs.
Run `npx skills add wp-media/wp-rocket --skill orchestrator -a claude-code`. Or copy the skill folder (.claude/skills/orchestrator in wp-media/wp-rocket) into .claude/skills/orchestrator in your project. Claude Code loads it when a task matches its description.
Run `npx skills add wp-media/wp-rocket --skill orchestrator -a codex`. Or copy the skill folder (.claude/skills/orchestrator in wp-media/wp-rocket) into .agents/skills/orchestrator in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add wp-media/wp-rocket --skill orchestrator -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/orchestrator, .gemini/skills/orchestrator, .github/skills/orchestrator and .opencode/skills/orchestrator in your project.
Going by SKILL.md and its folder, Orchestrator needs the command-line tools its instructions call (gh, git, bash and claude).
SKILL.md contains no URLs. Its commands use gh and git, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Orchestrator is published under the GPL-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 10k tokens (SKILL.md is roughly 40k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Orchestrator: Dev Complete (FHIR/fhir-codegen, 155 stars), Graphify (EBISPOT/ols4, 105 stars), Dkg Importer (OriginTrail/dkg, 144 stars) and Akb Ingest (dnotitia/akb, 162 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
wp-media (a GitHub organization) maintains it in wp-media/wp-rocket, which has 767 GitHub stars. The repository holds 15 skills in this directory. The repository was last updated on October 8, 2026.
Source: wp-media/wp-rocket on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.