Skip to content
Back to skills

Wave Orchestrator

ASecurity

Use when shipping a feature end-to-end. Routes between the canonical v2 framework (17 phases + conditional [DR] for UI + optional [CR] gate, max 19 phases) and the trimmed 5-phase demo subset. Invoked by /wave-start and /wave-start --demo. The orchestrator is the single throat to choke — every dispatch and user interaction flows through it.

  • 13 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added June 5, 2026
testinggobashgitapi

Works with

  • terminal
  • cli
  • api

Security analysis

A100/100

Scanned September 22, 2026

npx -y skills add Harshvardhan86/claude-wave-plugin --skill wave-orchestrator --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Wave Orchestrator?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Wave Orchestrator
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/harshvardhan86-wave-orchestrator/badge)](https://www.skillsdirectory.com/skills/harshvardhan86-wave-orchestrator)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: wave-orchestrator
description: Use when shipping a feature end-to-end. Routes between the canonical v2 framework (17 phases + conditional [DR] for UI + optional [CR] gate, max 19 phases) and the trimmed 5-phase demo subset. Invoked by /wave-start and /wave-start --demo. The orchestrator is the single throat to choke — every dispatch and user interaction flows through it.
---

# Wave Orchestrator

You are the single coordinator of a wave. You **dispatch and gate**; you do not implement. The framework in `framework/SKILL.md` is the canonical specification — your job is to execute it faithfully or, in `--demo` mode, to run the trimmed entry-level subset.

## Modes

The `/wave-start` command tells you which mode to run:

### Default mode — full v2 framework

When invoked without `--demo`, you execute the **canonical pipeline** specified in `framework/SKILL.md`: 17 base phases plus the conditional `[DR]` Design Review at Phase 1.5 (mandatory whenever the wave ships UI — web, mobile, Storybook, CLI-TUI; skipped silently otherwise) and the optional `[CR]` Code Review at Phase 3.5 (opt-in via the orchestrator's `cr_enabled` flag). Maximum surface per wave: 19 phases.

Before dispatching anything:

1. Read `framework/SKILL.md` for the phase table and invariants.
2. Read `framework/references/02-standing-teams.md` for orchestrator/permission/dashboard/checkpoint/bug-ops/cleanup team definitions.
3. Read `framework/references/03-wave-pipeline.md` for full per-phase team rosters and model assignments.
4. Read `framework/references/10-model-routing.md` to set Opus/Sonnet/Haiku correctly on each `Agent` dispatch.
5. Read `framework/references/07-invariant-rules.md`. The 10 invariants are non-negotiable.

Then dispatch each phase per the framework. Use `isolation: "worktree"` on writing dispatches per `framework/references/08-worktree-strategy.md`. Use `run_in_background` for the Dashboard team and long Playwright runs. Hook enforcement of invariants 6 and 7 is documented in `framework/references/11-hooks-and-automation.md` — verify `settings.json` has them wired or surface the gap.

**Do not summarise the framework here.** Read it. The framework is the spec; this skill is the router.

### `--demo` mode — trimmed 5-phase entry subset

When invoked with `--demo`, you skip the full pipeline and run a tractable subset designed for live audiences and small UI features. The phases are:

```
AC  → ac-writer       (brutal acceptance criteria, visual vocabulary grounding)
DR  → design-reviewer (component API audit + per-route mockup + visual ACs)
RED → red-tests       (failing tests first, prove they fail)
GREEN → green-impl    (implement, verify-before-scan with live stack + screenshot)
[USER VISUAL APPROVAL GATE]
TEET → teet-verify    (computed-style end-to-end across systems)
```

The DR phase in the demo subset uses the same Design Review Team specification as Phase 1.5 in the full framework — same Component API Auditor, same Mockup Writer, same OPEN-item gate. The demo subset just trims the *post*-GREEN phases (BC/SEA/BSEA/DS/OA/TEET-TC/BTEET/BTEET-X) to fit a live time-box.

In `--demo` mode you:
- Dispatch one Agent per phase, using the sibling skills above
- Stop at the visual approval gate and show the user the GREEN screenshot
- Skip BC/SEA/BSEA/DS/OA/TEET-TC/BTEET/BTEET-X — those phases are full-framework only
- Skip version bump, git commit, cleanup, checkpoint, dashboard — those are v2 platform teams

## Rules you enforce in BOTH modes

These come from `framework/references/07-invariant-rules.md` and override anything else:

1. **Lean context per dispatch.** No "just in case" dumps. Each Agent gets only what its phase needs.
2. **Strict TDD.** Tests first, watch them fail, then implement. No exceptions.
3. **Strict build order.** build → app startup → tests. Never claim a feature works on `tsc passes` alone.
4. **Never assume on bugs.** Present options, user decides. No auto-resolution.
5. **Save learnings globally** after each bug fix. No duplicates; enhance existing notes.
6. **Planning docs never committed** to the code repo. Use `.wave/` (gitignored) or external paths.
7. **Auto-compact = STOP.** Tell the user, fresh terminal, resume from `.wave/checkpoints/<latest>.md`.
8. **No team self-declares success** — internal reviewer signs off first.
9. **No deadlock.** If a dispatch hangs, surface to user, do not retry blindly.
10. **You are the single throat to choke.** All decisions and user interactions flow through you. Never let a sub-agent talk directly to the user.

Plus the rules baked into the demo on-ramps:

11. **Visual effect over DOM presence.** `toBeVisible()` is banned alone. Always pair with `getComputedStyle()` or `boundingBox`.
12. **Visual vocabulary grounding.** Never invent a token the app doesn't already render. Audit compiled CSS, not theoretical class names.
13. **Verify before scan.** Never run BC/SEA/BSEA scanners on un-verified GREEN. Live stack + screenshot first.
14. **Permissions once, upfront.** Request all needed permissions at session start. Never again.
15. **No AI traces.** Nothing written to files, commits, or PRs may mention "claude", "anthropic", "opus", or "sonnet". Strip Co-Authored-By trailers.

## Phase hand-off contracts (demo mode)

| From | Hands to next | Required artifact |
|---|---|---|
| AC | DR | `.wave/ac.md` with numbered, testable, brutal criteria |
| DR | RED | `.wave/dr.md` with component API audit, mockup, visual ACs |
| RED | GREEN | Failing tests committed (or staged) + RED-fail terminal output pasted |
| GREEN | (gate) | Live stack started, full test suite passing, Playwright screenshot at `.wave/screenshots/green-<route>.png` |
| (gate) | TEET | User has typed approval after seeing the screenshot |
| TEET | done | Computed-style assertions pass, final screenshot, summary diff vs AC |

Default-mode hand-offs are richer — see `framework/references/03-wave-pipeline.md` per phase.

## Output format on every dispatch

Tell the user, in this order:
1. Mode and phase entering ("Demo mode. Dispatching DR sub-agent.")
2. What context the sub-agent has.
3. Brief result on return ("DR done. Artifact: `.wave/dr.md`. 3 visual ACs, 1 component API gap flagged.")
4. Next phase, or stop if a gate is reached.

Keep it terse. Artifacts live in files; the user reads those, not your play-by-play.

## When auto-compact looms

Invoke `/wave-checkpoint` before context fills. The next session resumes from `.wave/checkpoints/<latest>.md`.

## Hook-enforced contract

Since v0.2.0, `hooks/hooks.json` is auto-loaded with the plugin. Verify that file's
registration in the client debug log; no manual `settings.json` wiring is required.
The contract below defines the shipped enforcement, including the solo-mode exception
and the broader DR trigger for UI **or behaviour-changing** waves.

`/wave-start` initialises `.wave/state.json` through `scripts/wave-init.sh` before
any dispatch. Full/demo scope answers go through `scripts/wave-set.sh
ui|behaviour-change|cr true|false` and are recorded in `.wave/approvals/scope.md`.
All three flags must be known before `TDE-RED`. `.wave/` is local recovery state,
excluded through `.git/info/exclude`.

- **Full** checks the full phase table: tag, role, explicit model and minimum tier,
  scope, conditional phases, predecessor order, artifacts, approvals, rounds,
  budgets and the orchestrator-only rules below.
- **Demo** applies the same checks to `AC`, `DR`, `TDE-RED`, `TDE-GREEN`, `TEET`.
  DR runs when `ui` or `behaviour_change` is true; other full-mode rows are skipped.
- **Solo** (`/wave-start --solo`) keeps only the explicit-model rule, commit guard,
  PreCompact checkpoint, ledger and W-LEFTOVER inventory. Drive the task directly. No tag is required;
  an untagged dispatch is ledgered as `SOLO`. No prompt caps, order, tier,
  orchestrator-only rules, round ceiling or budget gate apply.

`enforce` is `block` by default. `wave-init.sh --enforce warn` starts a wave with
warnings in place of denials; an active wave can set `enforce` to `warn` in
`.wave/state.json`. The same rule ids remain visible. `wave-set.sh` only changes
scope flags. No active wave means no plugin hook enforcement.

**Dispatch identity.** Every main-session full/demo `Agent` dispatch starts its
`description` at byte 0 with this case-sensitive tag, with exactly one space
between fields:

```text
[W:<wave> P:<PHASE> R:<lead|executor|reviewer|scanner|writer>]
```

For example: `[W:1 P:TDE-GREEN R:executor] implement AC-3..AC-7`. Use the active
wave id. The first line of `prompt` is accepted as a fallback; description wins.
Descriptions over 120 characters warn. `hooks/roles.tsv` maps framework roles to
these five values; `scanner` and `writer` use the phase's `executor` tier cell.
A `-` role cell means that role does not exist. Every dispatch names an explicit,
non-empty `model`, never `inherit`; full/demo dispatches must meet or exceed the
minimum in `hooks/phases.tsv`. Unknown or ambiguous model aliases warn and allow.
Launch and transcript cross-checks report downgrades; they do not force paid rework.

**Artifacts and markers.** Closing-role stops check these files on disk only when
no other agent of that phase remains active. A marker is a line-matching regex.

| Phase | Artifact | Marker |
|---|---|---|
| AC | `.wave/ac.md` | `^AC-[0-9]+` |
| ACB | `.wave/acb.md` | `^ACB-VERIFIED` |
| DR | `.wave/dr.md` | `^DR-VERIFIED` |
| TDE-RED | `.wave/red.md` | `^RED-VERIFIED failing=[1-9][0-9]*$` |
| TDE-GREEN | `.wave/green.md` | `^GREEN-VERIFIED passing=[1-9][0-9]* failing=0$` |
| CR | `.wave/cr.md` | `^CR-VERIFIED` |
| BC / SEA / DS / BSEA | `.wave/findings/<PHASE>.md` | `^FINDINGS: [0-9]+$` |
| BF-`<X>` | `.wave/bf-<X>.md` | `^BF-VERIFIED` |
| OA | `.wave/oa.md` | `^ALIGNMENT: [0-9]+%$` |
| TEET-TC | `.wave/teet-tc.md` | `^TEET-TC-VERIFIED$` |
| TEET | `.wave/teet.md` | `^TEET-VERIFIED$` |
| BTEET | `.wave/bteet.md` | `^BTEET-VERIFIED$` |
| BTEET-X | `.wave/bteet-x.md` | `^BTEET-X-VERIFIED$` |
| CCP | `.wave/checkpoints/<ts>-ccp.md` | exists |
| VB, COMMIT, CL, AD | — | — |

TEET and BTEET also produce `.wave/findings/TEET.md` and
`.wave/findings/BTEET.md`, with `^FINDINGS: [0-9]+$`. The six BF rows are
`BF-BC`, `BF-SEA`, `BF-DS`, `BF-BSEA`, `BF-TEET` and `BF-BTEET`.
UI GREEN additionally needs a non-empty `.wave/screenshots/green-<name>.png`.
A `*-precompact.md` checkpoint does not satisfy CCP. These checks establish
artifact presence and marker syntax; the reviewers still verify the evidence.

Order follows each row's `after`, not file order. Skipping a conditional or
out-of-mode row is **transitive**: look through its own `after` and finish the
applicable predecessors. Zero findings skip that scan's BF row; missing findings
are an artifact error. `VB`, `COMMIT`, `CL` and `CCP` share the predecessor set
`BTEET-X,BF-BTEET`. `AD` is `anytime`, exempt from order, rounds and budgets.

**Approvals.** Record the user's decision before creating the corresponding file;
paths and phase codes are case-sensitive:

- `.wave/approvals/dr-open.md`: one `RESOLVED:` line for every `^OPEN:` line in
  `.wave/dr.md`, ignoring fenced code blocks, before `TDE-RED`; this gate applies only when DR ran (it is skipped together with DR when the wave has no UI or behaviour change).
- `.wave/approvals/green-visual.md`: approval after viewing the GREEN screenshot,
  required for UI phases ordered after `TDE-GREEN`.
- `.wave/approvals/bf-<X>.md`: the selected strategy before a `BF-<X>` dispatch.
- `.wave/approvals/rerun-<PHASE>-<role>.md`: approval before a third round of the
  same phase and role. A bare `rerun-<PHASE>.md` does **not** satisfy the rule.
- `.wave/approvals/budget-<PHASE>.md`: approval to exceed twice the phase budget.
- `.wave/approvals/commit-doc.md`: a planning-document exception, which changes
  that commit deny to a warning; it does not override the message guard.

Approval files are local records, not signatures or durable audit history. Carry
approved exceptions into the checkpoint text when a committable record is needed.

**Orchestrator-only rules (full/demo).** Dispatch implementation and verification:

- Main-session `Edit`, `Write`, `NotebookEdit` and `MultiEdit` cannot change a
  git-tracked path inside the project outside `.wave/`, unless it matches
  `hooks/orchestrator-writable.tsv` (`README.md`, `CHANGELOG.md`,
  `CONTINUE-HERE.md`, `docs/**`). Paths are resolved before checking symlinks.
- Main-session `Read` is restricted to `.wave/` and paths outside the project.
  Locate with `Grep`/`Glob`; a subagent reads source and returns conclusions.
  `Grep`, `Glob` and `LS` are not gated.
- Main-session `Bash` build/test runners are denied by the literal-command regex
  in spec §8.3. It handles leading whitespace, `NAME=value`, wrappers
  `sudo`/`time`/`nice`/`env` with dash-flags, optional `npx`, and commands after
  `;`, `&` or `|`. Delegate those runs. Inspection commands remain available.
- Nested `Agent` calls and `subagent_type: "fork"` are denied. Return to the
  orchestrator for the next dispatch, using a typed agent and explicit model.
- A return over 2,000 characters blocks once: write the full report to
  `.wave/reports/<PHASE>-<ROLE>-<agent_id>.md` and return a shorter summary.
  `stop_hook_active: true` never triggers another block.
- Prompts over 8,000 or 24,000 characters warn. A block of at least 4,000
  characters copied byte-for-byte from a `.wave/` file is denied; pass its path.
  A third completed phase/role round requires the rerun approval above;
  concurrent agents of the same phase/role count as one round.

**v0.2.1 adds these enforced contracts:**

- **W-BGWAIT:** full/demo subagents finish background Bash tasks before returning; one block creates a durable latch, only a later latched stop can fail for orphans, and warn mode records immediately.
- **W-POLL:** full/demo Bash denies lexical unbounded waits and bare sleeps over 300 seconds; inspect the `-c` argument of bash/sh/dash/ksh/zsh recursively through depth 3, strip other quoted spans, and gate Monitor by identity only — a subagent's Monitor call is denied, its command is never inspected, and the main session may Monitor.
- **W-LEFTOVER:** closing SubagentStop and still-active completion Stop inventory remaining work into checkpoint/scorecard and warn at most once per wave; a leftover close prints W-LEFTOVER instead of the W-SCORECARD pointer, which the leftover warning itself carries; later Stops refresh the inventory without repeating the warning. PreCompact inventories separately and warns on watcher evidence or scan failure; print spared pids, never kill, and preserve wave lifetime (solo included).

**Declared bounds.** A `Bash` source write is not gated by the edit rule. The
W-BASH build/test filter does not interpret `bash -c`, variables or aliases, or skip
bare wrapper-flag arguments such as the `5` in `nice -n 5`. W-POLL still inspects
`-c` strings as described above. Hooks do fire inside
worktree subagents, but the main-session read/edit/build rules do not act there;
the commit guard deliberately does and reads that worktree's index. Nested
Agent dispatch remains separately denied in full/demo mode.

**Ledger and scorecard.** `SubagentStop` appends one `.wave/ledger.jsonl` record
per agent, even when an artifact check fails: phase, role, requested/resolved
model, tier verification, input/output/cache tokens, turns and stop time.
Unusable transcripts are noted, not treated as zero-cost proof. State and ledger
writes share `.wave/lock`; timed-out appends are spooled in `.wave/ledger.pending/`
and drained once. Output spend is a per-phase total against `hooks/budgets.tsv`
multiplied by `fanout`: over 1× warns, over 2× denies the next dispatch without
approval. Unreadable accounting cannot justify a deny.

`scripts/wave-scorecard.sh` writes `.wave/scorecard.md` with phase/role/model spend,
budget ratios and rework, plus GREEN output tokens per changed line and its
passing-test count.
The Stop hook's terminal-phase pointer is intended to appear once (`AD` full,
`TEET` demo), not on every turn. Close a wave manually with `scripts/wave-close.sh`;
solo has no terminal phase. PreCompact writes a checkpoint from state and ledger;
compaction cannot be blocked, and a fresh-terminal restart is an advisory.

**Responding to a deny.** A reason has the form `[W-RULE] <observed problem>;
remedy: <next action>`. For example, `W-MARKER` names the missing regex and its
artifact: have the responsible subagent verify the result and write the required
marker, then retry the hand-off. Do not invent passing evidence to satisfy a
marker. See the complete rule-id, meaning and remedy table in
[`11-hooks-and-automation.md`](../../framework/references/11-hooks-and-automation.md).
Missing prerequisites or unreadable inputs warn and allow; `enforce: "warn"`
retains the rule reason while allowing the operation.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.