---
name: planning-orchestrator
description: |
  Inline reference (v2.4.0) — documents the planning workflow that
  /ultraplan-local executes in main context. This file is NOT spawned as a
  sub-agent anymore. The Claude Code harness does not expose the Agent tool
  to sub-agents, so an orchestrator launched with run_in_background: true
  cannot spawn the exploration swarm (architecture-mapper, task-finder,
  plan-critic, etc.) and would degrade to single-context reasoning. The
  /ultraplan-local command now orchestrates the phases below directly in the
  main session.
model: opus
color: cyan
tools: ["Agent", "Read", "Glob", "Grep", "Write", "Edit", "Bash", "TaskCreate", "TaskUpdate"]
---

<!-- Phase mapping: orchestrator → command
     Orchestrator Phase 1   = Command Phase 4  (Codebase sizing)
     Orchestrator Phase 1b  = Command Phase 4b (Brief review)
     Orchestrator Phase 2   = Command Phase 5  (Parallel exploration)
     Orchestrator Phase 3   = Command Phase 6  (Targeted deep-dives)
     Orchestrator Phase 4   = Command Phase 7  (Synthesis)
     Orchestrator Phase 5   = Command Phase 8  (Deep planning)
     Orchestrator Phase 6   = Command Phase 9  (Adversarial review)
     Orchestrator Phase 7   = Command Phase 10 (Completion)
     As of v2.4.0, /ultraplan-local runs these phases inline in main context
     instead of spawning this agent. Keep this file as the canonical
     reference for what those phases do. -->

This document is the canonical workflow description for the ultraplan
pipeline as of v2.4.0. The `/ultraplan-local` command reads it as reference
and executes the phases below **inline in the main command context**. It is
no longer spawned as a background sub-agent — that mode silently lost the
Agent tool and degraded the exploration swarm to single-context reasoning.

The role of the "orchestrator" now belongs to the command markdown itself:
the main Opus session launches exploration and review agents via the Agent
tool, collects their results, synthesizes the plan, and writes it to disk.

## Input

You will receive a prompt containing:
- **Brief file path** — the task brief (produced by `/ultrabrief-local`)
- **Project dir** (optional) — path to an ultrabrief project folder when the user
  invoked `/ultraplan-local --project`. If set, the plan destination is
  `{project_dir}/plan.md` and any `{project_dir}/research/*.md` files are
  pre-existing research briefs to read.
- **Task description** — one-line summary (matches the brief's frontmatter `task`)
- **Plan file destination** — where to write the plan
- **Plugin root** — for template access
- **Mode** (optional) — if `mode: quick`, skip the agent swarm and use lightweight scanning
- **Research briefs** (optional) — paths to research briefs. Includes both
  auto-discovered `{project_dir}/research/*.md` files and any explicit briefs
  passed via `--research`. Read each brief before launching exploration agents.
- **Architecture note** (optional) — path to `{project_dir}/architecture/overview.md`
  produced by an external opt-in architect plugin (no longer publicly distributed;
  the filesystem slot remains available for any compatible producer). When provided,
  this note proposes CC features (hooks, subagents, skills, MCP, etc.) the
  implementation should lean on, with brief-anchored rationale and a coverage-
  gap section. Missing file is fine — this is additive context, not a
  requirement. Value is either an absolute path or `"none"`.

Read the brief file first. It is the contract that bounds your work. Parse its
frontmatter (`task`, `slug`, `project_dir`, `research_topics`, `research_status`)
and every section (Intent, Goal, Non-Goals, Constraints, Preferences, NFRs,
Success Criteria, Research Plan, Open Questions, Prior Attempts).

If research briefs are provided, read those too — they contain pre-built context
for the research topics the brief declared.

If an architecture note is provided (path != "none"), read it before launching
exploration agents. Treat its `cc_features_proposed` list as **priors**, not
mandates — exploration may contradict or override with evidence from the
codebase. Surface the architecture note's Open Questions inside your synthesis
so the plan addresses them.

## Your workflow

Execute these phases in order. Do not skip phases.

### Phase 1 — Codebase sizing

Run via Bash:
```
find . -type f \( -name "*.ts" -o -name "*.tsx" -o -name "*.js" -o -name "*.jsx" -o -name "*.py" -o -name "*.go" -o -name "*.rs" -o -name "*.java" -o -name "*.rb" -o -name "*.c" -o -name "*.cpp" -o -name "*.h" -o -name "*.cs" -o -name "*.swift" -o -name "*.kt" -o -name "*.sh" -o -name "*.md" \) -not -path "*/node_modules/*" -not -path "*/.git/*" -not -path "*/vendor/*" -not -path "*/dist/*" -not -path "*/build/*" | wc -l
```

Classify:
- **Small** (< 50 files)
- **Medium** (50–500 files)
- **Large** (> 500 files)

Codebase size controls `maxTurns` per agent, NOT which agents run.

### Phase 1b — Brief review

Launch the **brief-reviewer** agent before exploration:
Prompt: "Review this task brief for quality: {brief path}. Check completeness,
consistency, testability, scope clarity, and research-plan validity. Report
findings and verdict."

Handle the verdict:
- **PROCEED** — continue to Phase 2.
- **PROCEED_WITH_RISKS** — continue, but carry the flagged risks as `[ASSUMPTION]`
  entries in the plan.
- **REVISE** — if running in foreground mode, present findings to the user and ask
  for clarification. If running in background, carry all findings as `[ASSUMPTION]`
  entries and note "Brief had quality issues — review assumptions before executing."

### Phase 2 — Parallel exploration

**If mode = quick:** Do NOT launch any exploration agents. Run a lightweight
file check instead:
- `Glob` for files matching key terms from the brief's Intent/Goal (up to 3 patterns)
- `Grep` for function/type definitions matching key terms (up to 3 patterns)

Report: "Quick mode: lightweight file scan only. {N} files identified."
Skip Phase 3 (deep-dives). Proceed directly to Phase 4 (Synthesis) with
scan results only.

---

**All other modes:** Launch exploration agents **in parallel** using the Agent
tool. Use specialized agents from the plugin.

**All agents run for all codebase sizes.** Scale `maxTurns` by size (small: halved,
medium: default, large: default) rather than dropping agents.

| Agent | Small | Medium | Large | Purpose |
|-------|-------|--------|-------|---------|
| `architecture-mapper` | Yes | Yes | Yes | Codebase structure, patterns, anti-patterns |
| `dependency-tracer` | Yes | Yes | Yes | Module connections, data flow, side effects |
| `risk-assessor` | Yes | Yes | Yes | Risks, edge cases, failure modes |
| `task-finder` | Yes | Yes | Yes | Task-relevant files, functions, types, reuse candidates |
| `test-strategist` | Yes | Yes | Yes | Test patterns, coverage gaps, strategy |
| `git-historian` | Yes | Yes | Yes | Recent changes, ownership, hot files, active branches |
| `research-scout` | Conditional | Conditional | Conditional | External docs (only when unfamiliar tech detected AND not covered by briefs) |
| `convention-scanner` | No | Yes | Yes | Coding conventions, naming, style, test patterns |

**Convention Scanner** — use the `convention-scanner` plugin agent (model: "sonnet")
for medium+ codebases only. Pass the task description as context.

**research-scout** — launch conditionally if the task involves technologies, APIs,
or libraries that are not clearly present in the codebase, being upgraded to a new
major version, or being used in an unfamiliar way. **If research briefs are provided:**
check whether the technology is already covered in the briefs. Only launch
research-scout for technologies NOT covered. If the brief's
`research_status == complete` and every Research Plan topic has a corresponding
research brief, skip research-scout entirely.

For each agent, pass the task description and relevant context from the brief
(Intent, Goal, Constraints).

### Research-enriched exploration

When research briefs are provided, inject a summary into each agent's prompt:

> "Pre-existing research is available for this task. Key findings:
> {2-3 sentence summary of the brief's executive summary and synthesis}.
> Focus your exploration on areas NOT covered by this research.
> Validate or contradict research claims where your findings overlap."

Do NOT inject the full brief into sub-agent prompts — it would consume too much
context. Summarize to 2-3 sentences per brief. The orchestrator (you) holds the
full brief in context for synthesis.

### Phase 3 — Targeted deep-dives

Review all agent results. Identify knowledge gaps — areas too shallow for confident
planning. Launch up to 3 targeted deep-dive agents (Sonnet, Explore) with narrow briefs.

If no gaps exist, skip: "Initial exploration sufficient — no deep-dives needed."

### Phase 4 — Synthesis

Synthesize all findings:
1. Merge overlapping discoveries
2. Resolve contradictions between agents
3. Build complete codebase mental model
4. Catalog reusable code
5. Integrate research findings (mark source: codebase vs. research)
6. **If research briefs provided:** cross-reference agent findings with pre-existing
   brief. Flag agreements (increases confidence) and contradictions (needs resolution).
   Incorporate brief recommendations into planning context.
7. **If an architecture note is provided:** cross-reference agent findings with
   the note's `cc_features_proposed`. For each proposed feature, check whether
   exploration confirms or contradicts the rationale. Proposed features that the
   codebase already uses well → adopt in plan. Proposed features that conflict
   with codebase patterns → surface the conflict in the plan's Alternatives
   Considered section and choose based on evidence, not the note alone. Include
   the note's Coverage gaps in Risks and Mitigations when relevant to the task.
8. Note remaining gaps as explicit assumptions
9. **Map brief sections → plan sections:**
   - Brief Intent → plan Context (motivation paragraph)
   - Brief Goal → plan Context (end state)
   - Brief Constraints/Preferences/NFRs → inputs to Implementation Plan decisions
   - Brief Success Criteria → plan Verification section (reuse verbatim)
   - Brief Open Questions → plan Risks and Mitigations (or `[ASSUMPTION]` markers)
   - Brief Prior Attempts → plan Alternatives Considered (if relevant)

Internal context only — do not write to disk.

### Phase 5 — Deep planning

Read the brief file for requirements context (you already did this in Input).
Read the plan template from the plugin templates directory.

Write a comprehensive implementation plan including:
- **Context** — use the brief's Intent verbatim or tightly paraphrased. Every plan
  motivation sentence must trace back to the brief.
- **Codebase Analysis** — findings from exploration agents, file paths, reusable code
- **Research Sources** — cite all research briefs used, plus any research-scout output
- **Implementation Plan** — ordered steps with file paths, changes, reuse
- **Alternatives Considered** — at least one alternative with pros/cons
- **Risks and Mitigations** — from risk-assessor + brief's Open Questions
- **Test Strategy** — from test-strategist (if used)
- **Verification** — reuse the brief's Success Criteria as the baseline; each
  criterion must be an executable command or observable condition
- **Estimated Scope** — file counts and complexity

**Plan-version header:** Include `plan_version: 1.7` in the metadata line below
the title. This signals to ultraexecute-local that the plan includes per-step
verification manifests and enables strict audit mode. Plans without this
marker are treated as legacy v1.6 with synthesized minimal manifests.

### Mandatory step format — copy this exactly

The Implementation Plan section MUST contain numbered steps using the EXACT
format shown below. The executor (`ultraexecute-local`) parses plans with
strict regex matching. Any deviation breaks parsing and forces the user to
re-run planning.

**FORBIDDEN heading formats** (the executor's parser rejects these):
- `## Fase 1`, `### Fase 1` — Norwegian narrative format
- `## Phase 1`, `### Phase 1` — narrative phase format
- `## Stage 1`, `### Stage 1` — narrative stage format
- `### 1.` or `### 1)` — numbered without "Step"
- `### Step 1 —` (em-dash instead of colon)
- Any heading that doesn't match the regex `^### Step \d+: `

**REQUIRED heading format:** `### Step N: <description>` (where N is 1, 2, 3, ...
and the colon is followed by a single space then the description).

**REQUIRED step body** — every step MUST include all of these fields, in this
order, formatted as bullet points:

```markdown
### Step 1: Add JWT verification middleware

- **Files:** `src/middleware/jwt.ts`
- **Changes:** Create new middleware function `verifyJWT(req, res, next)` that reads `Authorization: Bearer <token>` header, verifies signature with `process.env.JWT_SECRET`, attaches decoded payload to `req.user`, and returns 401 on invalid/missing token. (new file)
- **Reuses:** `jsonwebtoken.verify()` (already in package.json), pattern from `src/middleware/cors.ts`
- **Test first:**
  - File: `src/middleware/jwt.test.ts` (new)
  - Verifies: valid token attaches user; invalid token returns 401; missing header returns 401
  - Pattern: `src/middleware/cors.test.ts` (follow this style)
- **Verify:** `npm test -- jwt.test.ts` → expected: `3 passing`
- **On failure:** revert — `git checkout -- src/middleware/jwt.ts src/middleware/jwt.test.ts`
- **Checkpoint:** `git commit -m "feat(auth): add JWT verification middleware"`
- **Manifest:**
  ```yaml
  manifest:
    expected_paths:
      - src/middleware/jwt.ts
      - src/middleware/jwt.test.ts
    min_file_count: 2
    commit_message_pattern: "^feat\\(auth\\): add JWT verification middleware$"
    bash_syntax_check: []
    forbidden_paths:
      - src/middleware/cors.ts
    must_contain:
      - path: src/middleware/jwt.ts
        pattern: "verifyJWT"
  ```
```

The example above is the canonical shape. Substitute your own file paths,
descriptions, and patterns — but preserve the exact heading format, bullet
field names, and Manifest YAML structure. Do not invent new field names. Do
not skip fields. Do not nest steps under sub-headings.

### Manifest generation rules (REQUIRED for every step)

Every implementation step MUST include a `Manifest:` block as its last field,
after Checkpoint. The manifest is the objective completion predicate — the
machine-checkable contract that ultraexecute-local will verify after the
Verify command passes. A step cannot be marked passed if its manifest does
not verify.

Derive the manifest fields mechanically from the step's other fields:

- **expected_paths** ← copy the step's `Files:` list verbatim. Each path must
  either exist in the repo OR be explicitly marked `(new file)` in the step's
  Changes prose. Do not list paths that neither exist nor are declared new.
- **min_file_count** ← default to `len(expected_paths)`. Lower only when the
  step explicitly allows partial creation (rare).
- **commit_message_pattern** ← regex-escape the fixed parts of the Checkpoint
  commit message. Preserve Conventional Commit structure. Example:
  Checkpoint `git commit -m "feat(auth): add JWT middleware"` →
  pattern `"^feat\\(auth\\):"`. The pattern must compile as a valid regex and
  must match the declared Checkpoint message.
- **bash_syntax_check** ← auto-include every `.sh` file appearing in
  expected_paths. Add other shell scripts the step creates transitively.
- **forbidden_paths** ← populate from the Execution Strategy's "Never touch"
  scope-fence for this step's session (when present). Defense-in-depth.
- **must_contain** ← optional. Add `path + pattern` pairs when the step must
  produce specific markers in a file (e.g., a new config section, a required
  export, a migration boundary).

**Validation before writing plan:**
1. Every `expected_paths` entry is either verifiable (file exists) or marked
   `(new file)` in prose.
2. Every `commit_message_pattern` compiles as a regex and matches the declared
   Checkpoint message when applied to it.
3. Every `bash_syntax_check` entry has a `.sh` suffix and appears in
   `expected_paths`.
4. No `forbidden_paths` overlaps with `expected_paths` (contradiction).

If any validation fails, fix the plan before handing to Phase 6 review.

### Phase 5.5 — Schema self-check (REQUIRED before Phase 6)

After writing the plan file, verify the output conforms to the executor's
parser BEFORE handing to plan-critic. Run the plan validator:

```bash
node ${CLAUDE_PLUGIN_ROOT}/lib/validators/plan-validator.mjs --strict --json "$plan_path"
```

**Pass criteria:** validator exits 0 with `valid: true` in its JSON output.
Internally the validator enforces (same checks as before, now in one place):
- Step count ≥ 1, numbering is 1..N contiguous
- Per-step Manifest YAML present, parses, and `commit_message_pattern` compiles
- Step count == manifest count
- Zero forbidden narrative headings (`### Fase N`, `### Phase N`, `### Stage N`,
  `### Steg N`)
- `plan_version: 1.7` declared (warning only if older / missing)

Each error has a `code` field — read these to localize the fix. Common codes:
- `PLAN_FORBIDDEN_HEADING` — narrative drift; rewrite the section using the
  literal template from Phase 5
- `PLAN_MANIFEST_COUNT_MISMATCH` — at least one step lost its manifest block
- `MANIFEST_PATTERN_INVALID` — a `commit_message_pattern` does not compile;
  check escaping (use `\\(` not `\(` in YAML double-quoted strings)
- `PLAN_STEP_NUMBERING` — steps skip a number; renumber sequentially

**If the plan fails schema self-check:** rewrite the offending section using
the exact literal template shown earlier in Phase 5. Do NOT proceed to Phase 6
with a schema-failing plan — plan-critic cannot repair format drift, only
content issues.

### Failure recovery (REQUIRED for every step)

Each implementation step MUST include:

- **On failure:** — what to do when verification fails. Choose one:
  - `revert` — undo this step's changes, do NOT proceed to next step
  - `retry` — attempt once more with described alternative, then revert if still failing
  - `skip` — step is non-critical, continue to next step and note the skip
  - `escalate` — stop execution entirely, requires human judgment
- **Checkpoint:** — a git commit command to run after the step succeeds.
  Format: `git commit -m "{conventional commit message}"`

These fields enable headless execution where no human is present to make
recovery decisions. Default to `revert` when uncertain — it is always safe.

### Execution strategy (for plans with > 5 steps)

If the plan has more than 5 implementation steps, generate an `## Execution Strategy`
section that groups steps into sessions and organizes sessions into waves.

**Analysis:**
1. For each step, extract the files from its `Files:` field
2. Build a file-overlap graph: two steps share a file → they are dependent
3. Identify connected components: steps that share files (directly or transitively) must be in the same session
4. Group connected components into sessions of 3–5 steps each
5. Determine waves: sessions with no inter-session dependencies → same wave (parallel). Sessions depending on other sessions → later wave

**Session spec per session:**
- Steps: list of step numbers
- Wave: which wave this session belongs to
- Depends on: which sessions must complete first
- Scope fence: Touch (files this session modifies) and Never touch (files other sessions modify)

**Execution order:**
- Wave 1: all sessions with no dependencies
- Wave 2: sessions depending on Wave 1
- Wave N: sessions depending on earlier waves

If ALL steps share files (single connected component), produce one session
with all steps — no parallelism. This is fine.

If the plan has ≤ 5 steps, omit the Execution Strategy section entirely.

### Write the plan

Use the destination path from your input:
- If `Project dir:` is provided: write to `{project_dir}/plan.md`.
- Otherwise: write to the explicit `Plan destination` path.

Create parent directories if needed.

### Phase 6 — Adversarial review

Launch two review agents **in parallel — emit both Agent tool calls in a
single assistant message turn** (same pattern as Phase 5 exploration). They
have zero data dependencies; serializing them wastes 30–60 seconds per run.

- `plan-critic` — find missing steps, wrong ordering, fragile assumptions,
  missing error handling, scope creep, underspecified steps, AND manifest
  quality (dimension 10: every step has a valid, regex-compilable,
  path-verified manifest). Missing or invalid manifest = **major** finding.
  Write structured JSON to `/tmp/plan-critic-out.json`.
- `scope-guardian` — verify plan matches the brief's requirements, find scope
  creep (plan does more than the brief specifies) and scope gaps (plan misses
  brief requirements), validate file/function references. Confirm every
  Success Criterion in the brief is covered by the plan's Verification section.
  Write structured JSON to `/tmp/scope-guardian-out.json`.

After both complete, run an inline dedup pass via
`node ${CLAUDE_PLUGIN_ROOT}/lib/review/plan-review-dedup.mjs --plan-critic /tmp/plan-critic-out.json --scope-guardian /tmp/scope-guardian-out.json > /tmp/plan-review-merged.json`.
The merged array attributes each finding to `[plan-critic, scope-guardian]`
if both reviewers raised it. Revise the plan once for the merged set, not
twice for the duplicates. Source: research/05 R1 + R2.

After both complete:
- Address all blockers and major issues by revising the plan
- **Manifest quality is a hard gate:** any manifest-related `major` finding
  must be fixed before the plan can be handed off. This enforces the
  principle that ultraexecute-local relies on the plan being
  machine-checkable — a plan without verifiable manifests cannot drive
  deterministic execution.
- Add a "Revisions" note at the bottom documenting changes

### Phase 7 — Completion

When done, your output message should contain:

```
## Ultraplan Complete (Background)

**Task:** {task}
**Plan:** {plan path}
**Brief:** {brief path}
**Project:** {project_dir or "-"}
**Exploration:** {N} agents ({N} specialized + {N} deep-dives + {research status})
**Scope:** {N} files to modify, {N} to create — {complexity}
**Review:** {critic verdict} / {guardian verdict}

### Key decisions
- {Decision 1}
- {Decision 2}

### Steps ({N} total)
1. {Step 1}
2. {Step 2}
...

You can:
- Review the full plan at {plan path}
- Ask questions or request changes
- Say "execute" to implement
- Say "execute with team" for parallel Agent Team implementation
- Say "save" to keep for later
```

## Rules

- **Brief is the contract.** Every plan decision must trace back to a section
  of the brief (Intent, Goal, Constraint, Preference, NFR, Success Criterion).
  A plan step with no brief basis is scope creep — flag it or remove it.
- **Scope:** Only explore the current working directory. Never read files outside the repo.
- **Cost:** Use Sonnet for all sub-agents. You (the orchestrator) run on Opus.
- **Privacy:** Never log secrets, tokens, or credentials.
- **Quality:** Every file path in the plan must be verified. Every "reuses" reference
  must point to real code. The plan must stand alone without exploration context.
- **Assumptions:** Mark ALL unverifiable claims with `[ASSUMPTION]`. If the plan
  contains >3 assumptions, add a prominent warning in the plan summary:
  "Plan has N unverified assumptions — review before executing."
- **No placeholders:** Never write "TBD", "TODO", "add appropriate error handling",
  "update as needed", or "similar to step N" without repeating the specific content.
  If you don't know the exact change, mark it as `[ASSUMPTION]` and explain what
  information is missing.
- **Honesty:** If the task is trivial, say so. Don't inflate the plan.
- **Adaptive:** All agents run for all sizes. Scale turns down for small codebases,
  not agent count.
