App plan

app_plan is a pipeline-layer request type that turns an initial project-definition document — an idea, an SOW, another framing document — into a well-segmented set of executable job intakes for an application that does not yet exist. It reads the document, settles the stack, inventories the capabilities, decomposes them into a dependency-ordered job DAG, and writes the intakes into jobs/0_new/ — optionally putting that proposed set in front of you first, via the before_execution gate.

All request types

The generated jobs are the deliverable; any document it writes is a by-product. Its mechanics live once in the shared recipe _processes/_shared/recipes/app_plan.md, which the clarify, brainstorm, plan, execute, and validate stages read through a thin type-conditional pointer. The preset _processes/_shared/presets/app_plan.md seeds the JOB.md defaults.

It writes job intakes, not application code. An app_plan run produces descriptions of future jobs. Nothing it emits is executed by the run itself — you pick the emitted intakes up one at a time afterwards, in their numbered order, and run each through the orchestrator as its own job.

The flow

As a pipeline type, app_plan runs the orchestrator's staged lifecycle. Per the preset, five stages are enabled out of the box — clarify → brainstorm → plan → execute → validate — and test, document, and review are disabled by default because no application code is produced. clarify ingests the source document read-only and builds a quote-and-attribute claim ledger; brainstorm runs two independent writers at the stack and architecture question; plan owns the capability inventory, the job DAG, and the proposed job-set table; execute is the only stage that writes into jobs/0_new/; validate re-verifies the set from the files as written.

Underneath the stage set, the recipe drives one continuous pipeline from the untrusted source document to the emitted files. It runs unattended by default — every approval gate is no, as on almost every other preset, and genuine open questions come back to you mid-stage through the orchestrator's question relay rather than through a gate. Two checkpoints are worth opting into, each a one-line flip in the intake form: after_clarify, where you ratify the normalized mandate (clarify is the one stage allowed to rewrite it, and its input is the untrusted document — so this is the type's single injection channel), and before_execution, the pre-emission checkpoint where you review the proposed job set in 03_plan/PLAN.md before any file is written into your queue. before_execution is the one to reach for first.

What lands

Dependencies are declarative, and you are the enforcer. Each emitted intake states what it depends on, and the numbering sorts the queue into plan order automatically. Nothing in the workflow blocks you from picking up 040 before 030 — ordered pickup is not a v1 feature. Work the queue in number order unless you have a reason not to. Pipeline jobs additionally carry a best-effort precondition check their own clarify stage reads — a guard, not a scheduler — while action jobs, which run no clarify, are instead admitted only when an early pickup cannot produce a plausible-but-wrong artifact.

What it is for

Reach for app_plan at the moment you have a document describing an application and an empty (or nearly empty) repository, and what you need is not the app but the plan of jobs that builds the app. It answers the question "what are the five to fifteen jobs, in what order, with what boundaries?" — and answers it as files you can immediately run, rather than as prose you then have to hand-transcribe into intakes.

The type owns three levels of a four-level ladder — Initiative → Wave → Job — and deliberately stops at the job level. It never slices a job into execution phases; that is each emitted job's own plan stage's work, and duplicating it here would produce a plan that is stale before the first job starts.

Close calls — is this really the type I want?
  • app_plan (this type, pipeline): many jobs out, for an app that does not exist yet. Input is a whole project-definition document; output is a queue.
  • feature (pipeline): one capability, built end-to-end, in an app that already exists. If you already know the single thing you want built, file a feature — do not route it through a planner. Most of the jobs app_plan emits are themselves feature jobs. See feature.
  • brainstorm (pipeline): explore options and converge on an approach, report-only — it produces a recommendation and reaches 4_done/ without emitting anything into your queue. Use it when the decision is still open and you are not ready to commit to a job set. app_plan contains a brainstorm stage, but its output is a backlog, not a report. See brainstorm.
  • doc_create (action, the Create mode of Doc HTML): generate a documentation set. The overlap is superficial — both read a project and write markdown-ish artifacts — but doc_create documents what is, into a docs folder, and app_plan specifies what should be built, into the job queue.
Rule of thumb: if the answer to "how many jobs should exist when this finishes?" is one, you want feature. If it is zero, but I will know more, you want brainstorm.

The logic

After pickup, the orchestrator reads JOB.md → Type and looks up app_plan in the registry: layer pipeline, shape pipeline. It therefore runs the normal staged lifecycle on the single shared pipeline route — it does not hand off to an action prompt, and it needed no new dispatch branch. The five enabled stages enrich their work by reading the shared recipe through a type-conditional pointer in their ## Inputs.

Select-and-go — the identity half only. doc_revalidate established the select-and-go pattern (D-50) by hiding both the identity and mandate sections. app_plan takes half of it and parameterizes the other half: it hides identity and keeps mandate. The slug derives from the source document's filename rather than from a constant — so a second run on a different document on the same day does not collide — and the mandate is auto-filled from the recipe's prose with your source path interpolated into it. The mandate box stays on screen, repurposed as the optional free-prose companion to that path: whatever you type is appended to the auto-filled body under its own ## Additional constraints heading, and the heading is omitted entirely when you leave it blank.

One mandatory structured input, and no configuration knobs. The type ships exactly two form inputs — the required source-document path and the optional free-prose box — and that is deliberate. Every other policy is a recipe default you override in words: "cap at 20 jobs", "plan waves 0-2 only", "plan §§4-9 only", "do not emit the initial-plan record". The wave subset is the one to reach for on a large source document: the whole set is planned and emitted at once by default, and on a document carrying a long phase outline the 15-job cap binds — planning a subset of the waves is the sanctioned way through, rather than shrinking the jobs to fit. A pipeline job carries no ## Action block, so the source path is not emitted as a structured config line at all; it is interpolated into the mandate prose. The path is also the workflow's first genuinely enforced mandatory form field — leaving it empty blocks the emit with an error rather than passing a placeholder downstream.

An action-config field on a pipeline row — the first of its kind. Form-section visibility is driven purely by each registry row's sections array with no layer check, so listing "action-config" on a pipeline row makes the field render with no new plumbing. Any future pipeline type whose recipe-defined work needs one mandatory structured per-run input may do the same. What stays layer-bound is where the value lands: never as an ## Action line, always in the mandate prose.

The source document is untrusted input. A real framing document is full of imperative prose aimed at a human reader, and a naive ingestion would launder those directives into an executable mandate. The recipe fences clarify to quote and attribute (<source> §N says X) rather than adopt source imperatives into mandate voice, and two opt-in gates put a human on that boundary when you want one — after_clarify on the rewritten mandate, before_execution on the proposed job set. Both default no; enabling before_execution is the single highest-value flip for an untrusted source. That is the quarantined/privileged split current prompt-injection guidance prescribes, arrived at structurally rather than bolted on.

The fields

The intake form shows action-config, mandate, stage-config, approval-gates, and git for this type — identity is hidden and auto-filled. The table below records the defaults the preset seeds into JOB.md.

app_plan field defaults (source: _processes/_shared/presets/app_plan.md)
BlockFieldDefaultNotes
## IdentitySlugauto, from the source filenameHidden in form; no constant-slug collision on a second same-day run.
## Action configSource document pathrequired — no defaultThe type's only structured input: the initial project-definition document to read. Empty blocks the emit.
# MandateMandate bodyauto, with the path interpolatedVisible, optional. Your free prose is appended under ## Additional constraints; omitted entirely when blank. This is where per-run policy overrides are written in words.
## StagesclarifyenabledIngests the source read-only; builds the claim ledger; validates the current state (does the path exist, is this repo really pre-code).
brainstormenabled — dual_consolidateThe stack and architecture are the one genuine per-run design fork; two independent writers, then a consolidator.
planenabledOwns the capability inventory, the job DAG, the proposed job-set table, the sizing decisions, and the pre-emission checklist.
executeenabledThe only stage that may write into jobs/0_new/. Renders and self-checks the whole set, emits it, then writes the initial-plan record.
testdisabledNo application code is produced — there is nothing to test.
documentdisabledThe document stage maps code changes onto docs via app.md; in a pre-code repository neither exists. Filling app.md belongs to the emitted 000- job's own document stage.
reviewdisabledAdversarial code review, and this type writes intake markdown. Available, not free — remove the marker for a second pass.
validateenabledRe-verifies the emitted set from the files as written: completeness, DAG re-derivation, contract-validity.
## Approval gatesafter_creationnoThe mandate is auto-filled from the recipe — nothing to review the form did not already show.
after_clarifynoWorth opting into when the source document is one you do not fully trust: it is the human checkpoint on clarify's mandate rewrite — this type's one injection channel. Off by default; the mandate-rewrite fence and the structural backstops stand either way.
after_brainstormnoThe most defensible extra gate after before_execution: ratifying the stack before the DAG is built avoids a full re-plan on a rejected stack.
before_planno—
before_executionnoThe recommended opt-in. Turn it on and you review the proposed job set in 03_plan/PLAN.md before any file is written into jobs/0_new/ — the pre-emission checkpoint. Off by default so the run is unattended, like almost every other preset.
before_commitnoRenders inside the Git section; Git is all-off.
before_prnoRenders inside the Git section; Git is all-off.
## GitCreate branchnoOff, and the recipe refuses to be talked out of it. This type writes intake markdown, not code. Even if a job hand-flips Commit: yes or PR: yes, the recipe declines, records a note, and continues — so the one commit-worthy artifact, the initial-plan record, stays in the working tree for you to land yourself.
Validate against mainno
Commitno
Pushno
PRno
PR target branch(blank)
## Per-stage configBrainstorm → Mode / Agents / Consolidatordual_consolidate / claude, codex / claudeBest-practice web research: yes — choosing a stack is the load-bearing-external-fact case that flag exists for.
Plan → Multi-phaseyesThe emission work splits across execute sessions — not one phase per emitted job.
Execute → Delegate research to sub-agentsyesRendering N intakes against a large source document is read-heavy.
Validate → Cross-check against mandate / Agentyes / claudeOverride Agent to codex per-job for Codex validation.
Loop-back → Max iterations3Read by the loop-back engine on a validate FAIL reopen; per-job tunable.
Runtime requirement: this type needs both claude and codex by default. The orchestrator computes required runtimes from the enabled stages, and Brainstorm → Mode: dual_consolidate makes Codex a hard pre-flight requirement. A Claude-only install sets Mode: solo, Agents: claude in the intake form. The defaults are otherwise as runtime-modest as the design allows (Validate → Agent: claude, review disabled), so the Codex brainstorm writer is the only runtime beyond claude. Note that a ## Bootstrap carve-out lets the run start in a repository with no app.md and no config.json — it does not conjure a runtime.

How to run it

In the intake form, pick App plan, fill in the source document path (repo-relative — the idea, SOW, or framing document to read), optionally add free prose in the mandate box for any per-run policy override, adjust stage-config / approval-gates if you want, and submit. The slug and the mandate body are filled in for you. Then start the orchestrator by sending it the prompt path:

Copy this path
_processes/02_orchestrator/orchestrator.prompt.md

The orchestrator picks up the job and runs the five enabled stages. Expect to be stopped twice: once after clarify, to ratify the normalized mandate, and once before execute, to approve the proposed job set. The second stop is the one that matters — read the job-set table in 03_plan/PLAN.md, because approving it is what causes files to appear in your queue.

Running the app in a brand-new repository

The usual target for this type is a repository with a framing document and nothing else — no app.md, no config.json. Every workflow agent normally refuses to run in that state. To start anyway, the intake's # Mandate carries a ## Bootstrap carve-out block declaring the bypass; the auto-filled mandate includes one. The emitted 000- foundation job carries the same block, so it can run before the project context exists, and its own document stage is what authors a real app.md — after which the rest of the set runs with no bypass at all.

Afterwards

  1. Read the emitted intakes in jobs/0_new/ — they are ordinary intake files and you can edit them before running any of them.
  2. Read the initial-plan record in project/ and commit it yourself if you want it in history. Nothing reads it back; it is a snapshot of intent, not a contract.
  3. Work the queue in number order. Run 000- first; run same-decade siblings (030 / 031 / 032) in any order once their shared predecessor is done.
  4. Expect drift. A later job's brainstorm can invalidate an assumption a not-yet-run intake was written against — edit or cancel that intake by hand when it happens. This is a known, honest limitation the run's own report names.

See also