Classifies the ask, loads the context, routes or resumes. Always lands on a concrete next action. Capability metadata (route triggers, prerequisites, load map, artifact contract) lives in routing.yaml.
When To Use
- Vague ask: "help me launch this", "what should I work on?", "where do I start?"
- Resume: "continue", "pick up where I left off"
- New to the stack and don't know which skill to call.
- Want to see what's in flight across initiatives.
When NOT To Use
- You already know the right skill — call it directly.
- Deep multi-perspective debate — use
/debate-agents. - Full scoping conversation — use
/discover.
Operating Contract — 5 steps
Every invocation does exactly these five steps. No skipping, no looping.
Step 1 — State snapshot. Prefer the forsvn MCP server: call enter_workspace to load TRUTH / OUTPUT / MEMORY + the graph-derived next (one act, same data the disk walk produces). When the server is unavailable (no mcp__forsvn__* tools), fall back to the inline disk snapshot — graceful degradation, never a hard dependency. Full procedure + shell-bang fallback in references/procedures/state-snapshot.md.
Step 2 — Resume check. If .forsvn/routing/last-session.md exists AND status: awaiting-user AND timestamp < 7 days:
You were last working on: <intent>
Initiative: <slug>
Next action: <next-action>
Open question: <first open question if any>
Resume? (yes / no / new)
Default to resume if the current ask is empty or "continue" / "resume". Otherwise classify fresh per Step 3.
Step 3 — Classify intent. Pick exactly one intent class. The classifier dispatches to the right leaf via the per-domain chain file (references/chains/<domain>.md) — read it before dispatching.
| User says | Intent class | Route |
|---|---|---|
| "audience", "ICP", "competitors", "market", "diagnose", "prioritize", "funnel", "targets" | research | leaf via references/chains/research.md |
| "brand", "campaign", "copy", "headline", "landing page", "LP", "ad", "SEO", "video", "TikTok", "reel", "short", "cold email", "outreach", "humanize", "humanmax", "VN tone" | marketing | leaf via references/chains/marketing.md |
| "user flow", "tech stack", "architecture", "schema", "API", "code", "refactor", "machine cleanup", "docs", "README" | product | leaf via references/chains/product.md — forsvn-dev pkg |
| "scope this", "clarify", "what should we build", "requirements unclear" | scope | /discover |
| "debate this", "multiple perspectives", "poll", "consensus" | debate | /debate-agents |
| "decompose", "task list", "break down", "implementation order" | decompose | /breakdown-tasks (forsvn-dev pkg) |
| "review my work", "second opinion", "did I miss anything" | review | /review-work |
| "improvement loop", "track metric", "experiment ledger" | loop | /run-pipeline |
| Empty + no resume offer | summary | print state summary, exit |
| Ambiguous, multi-domain, "launch this", "ship this" | multi | scaffold a gated plan.md, stop for approval |
Rules:
- Single-domain → read the matching chain file and dispatch to its leaf.
- Multi-domain → scaffold a gated
.forsvn/runs/<slug>/plan.md(status: proposed) viabin/plan.ts init, render its steps table, and stop for human approval before step 1 (the plan-preview trust contract). No step runs until a human approves (status: approved). Schema + helper:references/plan-spec.md. - Unclear (in-scope) → at most 2 clarifying questions. Hard cap. Then hand off to
/discover. - Unclear AND capability-shaped AND no index match → emit the gap line per
references/procedures/nearest-match.md(terminal state b, not a clarify). - Brand-gate: marketing/launch intent with
brand/BRAND.mdmissing → route through/create-brandfirst. - forsvn-dev gate:
productintent and thedecomposeroute resolve to the separate forsvn-dev package (engineering skills carved out 2026-06-16). If it isn't installed, tell the user to addforsvn-devrather than dispatching into a missing skill.
Terminal-state rule. Every /forsvn turn ends in exactly one of three states — never a fourth "answered it myself" path:
- invoke — recorded → announced → invoked ≥1 capability (Steps 4–5).
- gap — the ask is capability-shaped (an imperative to produce / evaluate / plan a marketing, research, or product job) but matches no Step-3 row, no
chains/<domain>.mdrule, and no index entry → do not answer from general knowledge; emit the gap line perreferences/procedures/nearest-match.md. - clarify — in-scope but ambiguous → ≤2 bundled questions, then
/discover.
A pure factual question ("what's a good CTR?") is answered normally — not a miss. A capability-shaped ask answered from general knowledge, or dropped, is the silent miss.
Steps 4 + 5 — Load context, then dispatch: record → announce → invoke. Full procedure in references/procedures/dispatch.md. Loading context includes the foundation pre-flight (Step 4.5): for research/marketing/product intent, a cold repo (no ICP.md, no prior session, no named deliverable) triggers the infer-and-draft First-Run flow — read the repo and draft ONE tailored artifact with labeled assumptions, never an intake form; a partial (or thin-with-prior-session) foundation warns before a generic run and offers /research-icp first, non-blocking. Write the routing record BEFORE invoking (status: dispatched, dispatched-by: forsvn), announce in one line (→ Dispatching /<skill> — <why>), then invoke the leaf via the Skill tool with args. Confident classification auto-dispatches; two close candidates → present both (counts toward the 2-question cap), never auto-fire. An explicit /forsvn dispatch supersedes any router-hook hint. The dispatcher owns the session execution-profile ask (references/_shared/execution-policy.md); dispatched leaves inherit it.
Pre-Dispatch — the classify flow IS the cold start
Needed dimensions: intent class (Step 3 table), initiative slug (Step 2 resume check / last-session.md), domain chain rule (the matching chains/<domain>.md row). Unresolved after reading state → at most 2 bundled clarifying questions (the Step 3 hard cap; close-candidate presentations count toward it); still unclear → hand off to /discover. A capability-shaped ask that resolves to no intent class is terminal state gap (not a clarify) — name the nearest 1–2 caps via references/procedures/nearest-match.md. Dispatched leaves warm-start and skip their own pre-dispatch steps 1–2.
Quality Gate
Instantiates references/_shared/thin-critic-rubric.md as a per-dispatch self-check (fast tier — no sub-agent):
- Classification — intent matches a Step 3 row or a chain-file rule; two close candidates were presented, never coin-flipped.
- Sequencing — routing record written (
status: dispatched) BEFORE the Skill invocation. - Announcement — the one-line
→ Dispatching /<skill> — <why>preceded the invocation. - Coverage — the turn ended in invoke / gap / clarify; no capability-shaped ask was answered from general knowledge or dropped.
Auto-fail: silent dispatch (no announcement), record-after-invoke, or answering a capability-shaped ask without invoking, naming the gap, or clarifying — redo the step per references/anti-patterns.md.
Worked Example
"Brief the landing page first, then build" → marketing chain → brief-landing-page: record → announce → invoke → warm handoff, with the gate self-check: references/examples/dispatch-walkthrough.md [EXAMPLE].
Anti-Patterns
references/anti-patterns.md — 11 rules covering clarifying-question cap, silent dispatch, hand-off-and-stop, coin-flip auto-fire, routing-record sequencing, chain-file read, experience grep, brand-gate bypass, the silent miss, the cold-repo intake form. Re-read before dispatch.
Durable Rules (protected)
Completion Status
- DONE — classified intent, wrote routing record, announced + invoked the leaf (or presented candidates / state summary).
- DONE_WITH_CONCERNS — dispatched on a thin/partial foundation (no
ICP.md/ unratified / stale product context); the Step 4.5 pre-flight warned the user and recordedfoundation:. - BLOCKED — could not read project state AND could not bootstrap
.forsvn/. - NEEDS_CONTEXT — ask was empty, no prior session, no canonical sources. Printed state summary and exited.
Next Step
After dispatch, the routed leaf skill owns the work. Re-invoke /forsvn with resume to pick up the next action from last-session.md.
References
.forsvn/README.md— state root contract.references/knowledge-ledger.md— the.forsvn/memory/knowledge.jsoncache of project facts (loaded at dispatch so the front door never re-asks a known fact or re-runs a known producer;bin/knowledge.ts).references/chains/{research,marketing,product,meta}.md— per-domain dispatch chains.references/procedures/{state-snapshot,dispatch,nearest-match}.md— Step 1, 4, 5, bootstrap, gap line.references/anti-patterns.md.