sizing · git:20260922.abb039e · 2026-09-22 · sha256 bfe27b1fca170742

sizing git:20260922.abb039eA

Immutable. This exact content never changes and is served at /api/v1/blob/bfe27b1fca170742.

---
name: sizing
description: "The EM's first move on any PM ask — size it, then route to plan, shape, roadmap, or dispatch. Fires whenever novel engineering work is asked of the EM, by any combination of words: this is a shape test, not a phrase list. Mutually exclusive with pickup."
description-budget: 260
allowed-tools: ["Read", "Grep", "Glob", "Bash"]
argument-hint: "[PM ask text | nothing — describe the ask inline]"
---

# Sizing — the Fleet Routing Lobby

Novel work enters via this sizing lobby, not directly into plan/shape/dispatch.

The EM's first move on any PM ask that isn't a mid-workstream continuation — before
`coordinator:plan`, `coordinator:shape`, or direct dispatch. Full framing and every worked
incident: `coordinator/docs/wiki/sizing-lobby.md`.

**Dispatch authorization — invoking this skill IS the request.** The dispatches named below are constitutive steps of this skill, not a separate thing to get cleared: invoking a skill requests the actions that skill performs. A harness line permitting dispatch "unless the user requested it" is therefore **satisfied here, not overridden** — no precedence claim is needed and none is made. Re-asking spends the very context the dispatch exists to protect. The rule attaches to skill entry and dissolves no PM-authored gate: keyword-gated skills gate entry, and every gate a skill names for itself still binds — per-session cross-repo-commit assent, ask-before-external-action, and any other this skill's own body names. Tripwire: `UNATTRIBUTED-HARNESS-LINE-IS-NOT-PM`.

Reuses `loe.tshirt` (XS–XXL) one altitude earlier than chunk-sizing, to pick a ROOM, not a
plan-body cost. No appetite question ahead of the size.

---

## The flow

**1. Form a t-shirt read** (XS–XXL) of engineering complexity only, never appetite. Calibration
table and the tentativeness guard: wiki. A confident XS/S with a clear PM express-lane signal
skips to Step 3.

**1a. Size what the performer must HOLD, not only how much work it is once held.** A credential, an
authenticated session, a mounted store, a guard-fenced path, an operator at a keyboard: an unnamed
held capability looks exactly like small work until the dispatch returns INCOMPLETE having touched
nothing, and re-scouting reproduces the same empty. Measured: one read-only query sized XS, and no
dispatched executor holds a hosted-tier session. Name the capability in the sizing so a blitz can
SKIP rather than discover. **Name the capability, never the route you happened to try** — the same
baton was then gated on "an authenticated hosted-tier session" and answered locally in ten minutes,
because the question was over served BYTES and only the runtime confirm needed the session. Both
errors are one missing discipline in opposite directions. Ask once, at gate-writing time: what is
the question, and what else would answer it? Tripwire:
`A-SCOPE-FIELD-NAMES-A-SUBJECT-NOT-A-BLAST-RADIUS`.

**1b. Premise-provenance, every non-express-lane sizing.** Does the ask rest on a mechanism
EXECUTED, one only READ, or no mechanism claim at all (`not-applicable`, narrow)? Pass
`--premise-provenance executed|read|not-applicable`; there is no `--evidence` flag — the written
justification goes in the sizing-object's own `premise.evidence` at Step 4. The engine's
`next_move` carries the discharge text, never hand-derive it.

**2. Substrate probe — L/XL/shaky reads, mandatory on XXL.** Reuse cartography output
(`architecture-survey`/`-audit`); for judgment the engine can't emit, dispatch the
`internet-research-scout` payload. Feed `--probe-signal collapse|raise`,
`--scout-evidence-kind mention-count|change-set|site-count`, and on any `raise`,
`--probe-raise-basis ask-scope|substrate-condition|breadth` — the engine applies only `ask-scope`;
a finding about the *area's* condition, or a uniform touchpoint count, is not a size signal
(discriminator detail: wiki). Chain `coordinator:spike` first if the probe surfaces an unproven
mechanism.

**3. Compute the route — never hand-derive the table.**
Invoke `sizing-assemble` per the ladder in `${CLAUDE_PLUGIN_ROOT}/snippets/resolve-coordinator-bin.md` — rung 0 (Shape W,
the `.exe` launcher through the call operator) on a PowerShell host:

    `& "$env:COORDINATOR_SETTINGS_HOME\bin\sizing-assemble.exe" --tshirt <XS|S|M|L|XL|XXL>`
`--tshirt` is the only required flag; never pass/invent `--appetite` unless the PM volunteered one
verbatim. Always pass `--intent "<PM's words>"` (`--intent-source em-elaborated` if it's your own
restatement), `--precedent shipped-before|novel`, `--boundary-in-notch yes|no` (§ Appetite guards
has the discriminator), the Step 1b/2 flags as answered, and
`--jtbd-unclear`/`--well-trodden-step-change`/`--express-lane` as the ask warrants. Push the
returned `route`/`detents`/`next_move` verbatim — it already carries the discharge text.

**4. Scaffold the sizing-object** (`coordinator-doc-new --type sizing-object`) for any
non-express-lane sizing, populating `intent`/`estimate`/`route`/`detents`/`scout_evidence` and the
property-attests verbatim from the returned fields. Undecided direction-class items go in
`surfaced_to_pm`, never folded into `fork`/`xl_exit`. Optionally populate `name` — a few words,
whiteboard length; never a slice of `intent`.

**`status`.** An XS routes to dispatch and has no plan: stamp it `shipped` yourself the moment the
work lands, citing the commit. S and above route into a plan, where the terminal cascade owns the
sizing-object stamp: never pre-empt it, and never hand-stamp instead of triggering it. The cascade
fires from the terminal stamp the close-out ceremony produces (`d-stamp-plan-implemented` /
`close_out_and_stamp`) — **from the stamping op, not from the landing**. A plan whose `status: implemented` was hand-edited and committed directly never fires
it. **Then read `status` back** — that is the field the cascade writes, and the only one that
answers whether it fired. A sizing still `routed` under a plan stamped through the op is a finding.
Under a hand-landed plan it is expected, and the repair is to run the close-out that stamps the
plan (`/workstream-complete`'s `d-stamp-plan-implemented`), not to hand-write the sizing row. Hand-write ONLY on a
status that did not advance under a plan stamped through the op, citing the landing commits and
this rule inline. Never hand-write on one that did — that races a live writer and loses unsafely.
Do not read `acted`: it belongs to a different op and is empty either way. Tripwire:
`ACTED-IS-BLIND-TO-THE-DELIVERABLE-CASCADE`.

**4b. Open the flight recorder on the resolved route — every route, before anything downstream.**
`TaskCreate`: one session-goal task naming the ask and the sizing-object path, then **one task per
remaining stage of the chain the route implies, through its terminal**. The chain is the route's,
not your judgment: `dispatch` → the work → `quick-wrap`. `spec-dispatch` → light plan → `/execute-plan` (claims the
plan) → scoped `code-reviewer` + `review-integrator` → `quick-wrap`. `plan` → plan → plan review
→ `execute-plan` → `/workstream-complete`. `shape`/`roadmap`/`pm-decision` → the named room owns
its own chain; record the entry task and stop. Direct executor dispatch on a `spec-dispatch` plan
skips the plan claim only `/execute-plan` makes, so the plan is never stamped done -- route through
`/execute-plan` even for a light plan. **Terminal by size, not by feel: XS/S close at
`quick-wrap`, M and above at `/workstream-complete`.** Where the harness tool is absent, the
`coordinator-tasks-mirror` fallback carries it.

The point is that the whole chain is visible from the lobby — a PM or an EM can see at a glance
what a route commits the session to, and a stage nobody reached is a pending row rather than a
thing everyone forgot. **Downstream steps ADD to this list, they do not restart it**: `execute-plan`
Phase 2 and the `spec-dispatch` light terminal open per-chunk tasks beneath these stage rows, and a
second session-goal task means one of them re-created a recorder that was already open.

**5. `post_size_prompt_pending` (M+) — ask once, in the PM's register, and stop:** *"Looks like an
X — go with that, split it, cut it, what's up?"* Never a closed fork. Record the answer in
`pm_resolution` (and `fork` when cut/raise-shaped). Expires at plan ratification.

**5b. `route: pm-decision` bundles into the same ask** — the M+ prompt and the XL exit question
are ONE combined PM ask when both fire, mirroring the engine's existing combined-`next_move`
precedence. `xl_exit` stays `null` (open, never
"accept") until the PM actually picks one, by test: `shape` (JTBD not stated, or the EM can't
falsifiably restate the problem in the PM's words), `roadmap` (spans ≥2 named workstreams, or
carries/needs an initiative FK — `split` is retired into this exit), or `accept_multi_session`
(neither above holds — one coherent job, clear JTBD, one workstream, simply large — **and** the PM
has explicitly assented; writing `xl_exit: accept_multi_session` IS that record, never a silent
fallthrough default).

**6. Hard gate — the only override that exists.** The t-shirt→route map binds absolutely; no
named-reason override, no ratifier. If a route feels wrong, the size read was wrong: fix the size
with evidence (symmetric resize, or the `plan⇄sizing` return edge) and let the table re-resolve.
`pm-decision` is a routed outcome, not an exception.

---

## Appetite guards — judgment the engine's flags cannot resolve alone

`appetite` is the PM's stated budget, populated only after the size lands. Rationale and
incidents: wiki § `appetite`, § The newer guard flags.

- **A volunteered appetite never moves the estimate.** Size from the work alone.
- **A cross-team dependency is a gate, not a size.** The boundary *ceremony* goes in
  `blocked_by`/`awaiting_gate`, never the t-shirt. Joint design is process, not size — neither a
  memo nor negotiated co-design moves the notch. Answer `--boundary-in-notch no`.
- **A touchpoint count is not a depth read** (`--probe-raise-basis breadth`, § Step 2).

## Shape is a conditional room, not a second lobby

`route=shape` fires only when the size is large AND the JTBD is unclear, or the space is
well-trodden and the ask wants a step-change — both engine-resolved from
`--jtbd-unclear`/`--well-trodden-step-change`, never an EM gut-call.