Spec Tiering — match spec depth to stakes; trade spec-rigor against review-rigor
Thesis
Total delivery safety ≈ spec rigor + review rigor. You can trade between them.
Depth is not a virtue by default — it is ambiguity insurance whose value scales with the
cost of being wrong. Over-specifying trivial, cheaply-verified work wastes effort. Under-specifying
high-stakes work defers ambiguity into the expensive phase (implementation), where a wrong turn means
wrong code, tests that encode the wrong contract, and a review with no spec to check against.
Two corollaries drive this skill:
- Don't predict iteration count (
n); assess stakes. n (how many attempts a task takes) is
non-deterministic and fat-tailed — most tasks converge in 2–3, the bad ones blow up to 8–10 with
regressions, and you can't tell which upfront. A detailed spec's real job is collapsing the variance
of n. So decide by the input you can assess upfront (stakes), not the one you can't (n).
- Brevity ≠ better output. A thinner spec makes the model guess more, and non-determinism makes
those guesses vary run-to-run. On high-stakes work, brevity trades control for variance. The lever is
not "less depth" — it is who pays for the depth: let AI draft the spec and let a different model
adversarially review it, so the human cost of depth drops while the depth stays.
Step 1 — Score the stakes (before writing the plan)
Rate each factor Low / Med / High:
| Factor |
Low |
High |
| Blast radius |
one file, one consumer |
many files/projects, cross-cutting, public surface |
| Cost of being wrong |
trivially reversible |
hard-to-reverse: migration, public API, security, customer/data |
| Verification cost |
compiler / a unit test / obvious repro catches a mistake |
failure is emergent, integration-only, or judgment-laden |
| Executor context |
you (expert, holds the context) |
mid-level dev, or an unattended AI agent |
| Novelty / ambiguity |
well-trodden pattern |
green-field, unfamiliar seam, multiple valid designs |
Routing (worst-factor-dominates):
- Any factor at High — especially cost-of-being-wrong or hard-to-reverse — → HIGH.
- All factors Low → LOW.
- Otherwise → MEDIUM.
State the score and the resulting tier at the top of the plan. That one line is the audit trail for why
the plan is as deep (or as light) as it is.
Step 2 — Produce to the tier
| Tier |
Spec depth |
Review gates |
Executor |
| Low |
Problem + the one change + the test that proves it. No cycle list, no review-response table. |
Optional. TDD + compiler carry it. |
anyone |
| Medium |
Design summary + locked key decisions + test-first cycle list + scope fence + acceptance. Skip the review-response table unless review surfaces findings. |
Adversarial code-review caboose REQUIRED (cross-harness). Adversarial plan review strongly recommended. |
mid-level dev or AI agent |
| High |
Full anatomy (below). |
Adversarial plan review and code-review caboose and author's personal review. |
executor-agnostic |
HIGH spec anatomy (the mechanics live in plan-workflow / writing-plans — that skill is
authoritative; this is the checklist to hit):
- Frontmatter —
type/status/author/supersedes + parent links (finding/slice/meta-plan); status
encodes state (ready-for-execution, revised-post-review).
- Code-grounded throughout —
file.cs:line anchors, "verified against source," and real code
(signatures, jsonc schemas), never pseudocode.
- Decisions locked with rationale — mark author-overrides vs defaults; justify what's dropped
(cite the simplicity / surgical-change standards), not only what's kept.
- Design ("what") separated from build order ("how") — a RED → GREEN → REFACTOR cycle list is
the spine, each cycle naming the exact test seam/file + assertions and the mutant it must survive
(see
test-filter-development).
- Hard scope fence — Non-goals / Out-of-scope, restated "for the executor."
- Review Response table — finding · severity · disposition · code-grounded rationale · what-changed
(the record of surviving the adversarial pass).
- Executable close — verifiable acceptance, mandatory live-cred integration gate, warnings-as-errors
build gate, effort estimate (flag the "long tail"), critical-files-for-the-executor list.
The throughline at every tier is spec-as-contract: everything the implementer needs to execute
without re-deriving, reasoning preserved so it can be reviewed and defended.
Step 3 — Review gates are non-negotiable per tier
- Adversarial plan review =
plan-send-review → reviewed by a different harness before code. This
is the cheapest catch point (fixes ambiguity before a line is written).
- Adversarial code-review caboose = the code-review workflow (
code-review-plan-create /
-execute, or code-send-review) → reviewed by a different harness after implementation.
Same-model review is theater — it shares the author's blind spots by construction. The independent gate
must run on a different model. Where the spec is lighter (Low→Medium→High spec effort decreases per
reader capability), the review requirement increases to hold total safety constant.
Step 4 — Calibrate (close the loop, make tiering empirical)
Instrument two signals per delivered spec:
- Review real-findings count — adversarial findings that were genuinely under-specified upstream.
- Impl-decisions-not-in-spec count — every "the spec didn't say, so I chose X" during build.
- Both ≈ 0 on a HIGH spec repeatedly → you over-specified that class; drop it a tier next time.
- Several on a MEDIUM spec → under-specified; thicken it or bump to HIGH.
Over a handful of cycles this self-corrects tier assignment instead of guessing. Over-spec smell:
you're documenting what the compiler / type-system / test already guarantees, or restating idioms the
reader already holds — that's dead weight; trim it. Everything else earns its place.
Adoption / teaching (easing non-expert readers in)
- Don't start anyone at HIGH. A HIGH spec is the output of expert skim-reading judgment plus a
review round-trip — not a starting point. It intimidates because it's an endpoint.
- Team default = MEDIUM spec + mandatory code-review caboose. The review is the safety net that lets
the spec be lighter than an expert's — and it is the teaching mechanism: every real finding shows a
dev exactly what they under-specified. Their MEDIUM specs tighten over time with no hand-teaching, and
the strong ones graduate toward HIGH when stakes demand it.
- Expert configuration (HIGH spec / low review) is valid but has no independent check. It is safe only
while the author's judgment is the ceiling. On genuinely irreversible/high-stakes work, run the
adversarial pass anyway — cheap insurance against the blind spot you can't see by construction.
Composition with existing skills
- Invoke
spec-tier first — it sets how much depth; plan-workflow / writing-plans then produce
it and manage the kanban lifecycle.
test-filter-development — always on at Medium+; it is the cycle spine of the plan. It supersedes
test-driven-development as the call-out: the ordering is not the load-bearing part, the filter is
(captured RED output, and a seeded mutant after GREEN).
csharp-quality-developer — for any C# the plan drives (StyleCop, this., LoggerMessage, CRLF).
plan-send-review — the adversarial plan gate (Medium recommended, High required).
- code-review workflow — the adversarial caboose (Medium+ required).
prompt-dotnet already chains using-superpowers → test-filter-development → csharp-quality-developer;
spec-tier sits in front of it to fix the depth and the review obligation before that chain runs.
Skills are the portable source of truth; this one only routes and gates — defer to each governing skill
for its mechanics.
1---2name: spec-tier3description: Route a task to a Low/Medium/High spec tier by stakes, then enforce the matching spec depth, review gates, and calibration. Use when starting any plan or spec, deciding how much detail a plan needs, onboarding developers to the planning standard, or when unsure whether a spec is over- or under-specified. Invoke BEFORE plan-workflow so it sets the depth plan-workflow then produces.4---56# Spec Tiering — match spec depth to stakes; trade spec-rigor against review-rigor78## Thesis910**Total delivery safety ≈ spec rigor + review rigor. You can trade between them.**1112Depth is not a virtue by default — it is *ambiguity insurance* whose value scales with the13**cost of being wrong**. Over-specifying trivial, cheaply-verified work wastes effort. Under-specifying14high-stakes work defers ambiguity into the *expensive* phase (implementation), where a wrong turn means15wrong code, tests that encode the wrong contract, and a review with no spec to check against.1617Two corollaries drive this skill:18191. **Don't predict iteration count (`n`); assess stakes.** `n` (how many attempts a task takes) is20 non-deterministic and fat-tailed — most tasks converge in 2–3, the bad ones blow up to 8–10 with21 regressions, and you can't tell which upfront. A detailed spec's real job is *collapsing the variance22 of `n`*. So decide by the input you *can* assess upfront (stakes), not the one you can't (`n`).232. **Brevity ≠ better output.** A thinner spec makes the model *guess more*, and non-determinism makes24 those guesses vary run-to-run. On high-stakes work, brevity trades control for variance. The lever is25 not "less depth" — it is **who pays for the depth**: let AI draft the spec and let a *different* model26 adversarially review it, so the human cost of depth drops while the depth stays.2728## Step 1 — Score the stakes (before writing the plan)2930Rate each factor Low / Med / High:3132| Factor | Low | High |33|---|---|---|34| **Blast radius** | one file, one consumer | many files/projects, cross-cutting, public surface |35| **Cost of being wrong** | trivially reversible | hard-to-reverse: migration, public API, security, customer/data |36| **Verification cost** | compiler / a unit test / obvious repro catches a mistake | failure is emergent, integration-only, or judgment-laden |37| **Executor context** | you (expert, holds the context) | mid-level dev, or an unattended AI agent |38| **Novelty / ambiguity** | well-trodden pattern | green-field, unfamiliar seam, multiple valid designs |3940**Routing (worst-factor-dominates):**41- **Any factor at High** — especially *cost-of-being-wrong* or *hard-to-reverse* — → **HIGH**.42- **All factors Low** → **LOW**.43- **Otherwise** → **MEDIUM**.4445State the score and the resulting tier at the top of the plan. That one line is the audit trail for why46the plan is as deep (or as light) as it is.4748## Step 2 — Produce to the tier4950| Tier | Spec depth | Review gates | Executor |51|---|---|---|---|52| **Low** | Problem + the one change + the test that proves it. No cycle list, no review-response table. | Optional. TDD + compiler carry it. | anyone |53| **Medium** | Design summary + locked key decisions + **test-first cycle list** + scope fence + acceptance. Skip the review-response table unless review surfaces findings. | **Adversarial code-review caboose REQUIRED** (cross-harness). Adversarial plan review strongly recommended. | mid-level dev or AI agent |54| **High** | **Full anatomy** (below). | Adversarial **plan** review **and** code-review caboose **and** author's personal review. | executor-agnostic |5556**HIGH spec anatomy** (the mechanics live in `plan-workflow` / `writing-plans` — that skill is57authoritative; this is the checklist to hit):581. **Frontmatter** — `type/status/author/supersedes` + parent links (finding/slice/meta-plan); status59 encodes state (`ready-for-execution`, `revised-post-review`).602. **Code-grounded throughout** — `file.cs:line` anchors, "verified against source," and *real* code61 (signatures, jsonc schemas), never pseudocode.623. **Decisions *locked* with rationale** — mark author-overrides vs defaults; justify what's *dropped*63 (cite the simplicity / surgical-change standards), not only what's kept.644. **Design ("what") separated from build order ("how")** — a **RED → GREEN → REFACTOR cycle list** is65 the spine, each cycle naming the exact test seam/file + assertions **and the mutant it must survive**66 (see `test-filter-development`).675. **Hard scope fence** — Non-goals / Out-of-scope, restated "for the executor."686. **Review Response table** — finding · severity · disposition · code-grounded rationale · what-changed69 (the record of surviving the adversarial pass).707. **Executable close** — verifiable acceptance, mandatory live-cred integration gate, warnings-as-errors71 build gate, effort estimate (flag the "long tail"), critical-files-for-the-executor list.7273The throughline at every tier is **spec-as-contract**: everything the implementer needs to execute74without re-deriving, reasoning preserved so it can be reviewed and defended.7576## Step 3 — Review gates are non-negotiable per tier7778- **Adversarial plan review** = `plan-send-review` → reviewed by a **different harness** before code. This79 is the cheapest catch point (fixes ambiguity before a line is written).80- **Adversarial code-review caboose** = the code-review workflow (`code-review-plan-create` /81 `-execute`, or `code-send-review`) → reviewed by a **different harness** after implementation.8283Same-model review is theater — it shares the author's blind spots by construction. The independent gate84must run on a *different* model. Where the spec is lighter (Low→Medium→High spec effort decreases per85reader capability), the review requirement *increases* to hold total safety constant.8687## Step 4 — Calibrate (close the loop, make tiering empirical)8889Instrument two signals per delivered spec:901. **Review real-findings count** — adversarial findings that were genuinely under-specified upstream.912. **Impl-decisions-not-in-spec count** — every "the spec didn't say, so I chose X" during build.9293- Both ≈ 0 on a **HIGH** spec repeatedly → you over-specified that *class*; drop it a tier next time.94- Several on a **MEDIUM** spec → under-specified; thicken it or bump to HIGH.9596Over a handful of cycles this self-corrects tier assignment instead of guessing. **Over-spec smell:**97you're documenting what the compiler / type-system / test already guarantees, or restating idioms the98reader already holds — that's dead weight; trim it. Everything else earns its place.99100## Adoption / teaching (easing non-expert readers in)101102- **Don't start anyone at HIGH.** A HIGH spec is the *output* of expert skim-reading judgment plus a103 review round-trip — not a starting point. It intimidates because it's an endpoint.104- **Team default = MEDIUM spec + mandatory code-review caboose.** The review is the safety net that lets105 the spec be lighter than an expert's — *and* it is the teaching mechanism: every real finding shows a106 dev exactly what they under-specified. Their MEDIUM specs tighten over time with no hand-teaching, and107 the strong ones graduate toward HIGH when stakes demand it.108- **Expert configuration (HIGH spec / low review) is valid but has no independent check.** It is safe only109 while the author's judgment is the ceiling. On genuinely irreversible/high-stakes work, run the110 adversarial pass anyway — cheap insurance against the blind spot you can't see by construction.111112## Composition with existing skills113114- **Invoke `spec-tier` first** — it sets *how much* depth; `plan-workflow` / `writing-plans` then produce115 it and manage the kanban lifecycle.116- **`test-filter-development`** — always on at Medium+; it is the cycle spine of the plan. It supersedes117 `test-driven-development` as the call-out: the ordering is not the load-bearing part, the filter is118 (captured RED output, and a seeded mutant after GREEN).119- **`csharp-quality-developer`** — for any C# the plan drives (StyleCop, `this.`, LoggerMessage, CRLF).120- **`plan-send-review`** — the adversarial plan gate (Medium recommended, High required).121- **code-review workflow** — the adversarial caboose (Medium+ required).122- **`prompt-dotnet`** already chains `using-superpowers → test-filter-development → csharp-quality-developer`;123 `spec-tier` sits in front of it to fix the depth and the review obligation before that chain runs.124125Skills are the portable source of truth; this one only routes and gates — defer to each governing skill126for its mechanics.