---
name: prototype
description: Run a pre-PRD validation through the prototype lane (D60) — the PM gives a QUICK brief, an agent produces 2–3 divergent specimens in whatever format fits the work (lookable UI options, a worked sample output, call/response transcripts, a schema sketch with example rows), a grilling sharpens them (dialogue, never a score), and the PM disposes promote/iterate/kill. Use when an idea's rightness cannot be settled by a description and the PM needs an INSTANCE in front of them — whether or not the work has a user interface; requires the artifact class's conventions (blocking — author them first if absent).
version: 1.1.0
owner: wawan
risk: low
category: design
scope: read:okf, write:prototype, write:planning
---

# prototype — Run a leg-A validation through the prototype lane

The [D60](/okf/products/pmos/adr/d60-prototype-loop.md) lane skill. The division of labour is the
point: **the PM briefs; the agent builds the specimen.** The PM should never have to author a design
system, a convention set, or a prototype to validate an idea.

> **Format note:** three-level progressive disclosure ([SKILL-FORMAT](/skills/SKILL-FORMAT.md)).
> Level 1 above is the trigger; this body is Level 2.
> **Scope note (2026-07-24 amendment):** this lane is **no longer gated on the work being a user
> interface**. D60's mechanism — *make it examinable, then grill it, before committing to a spec* —
> is general; it was only ever *expressed* visually. The visual path below is unchanged and stays
> first-class; it is now one shape among several.

## When to use vs. not

**The entry rule is the specimen test:**

> **Can the PM judge this from a description, or do they need an instance of it in front of them?**

- **Use** when no description settles it. The measured cost of skipping this is the
  console-redesign series: four post-build rejections that a lookable artifact would have caught
  pre-spec — a *visual* judgement that could only be made once the thing existed. The class is wider
  than the instance: *does this skill's output actually teach?*, *does this API feel right to call?*,
  *does this rubric actually discriminate?*, *does this error message actually help?* are the same
  judgement in a different medium.
- **Do not use** when a description does settle it — which is most feature work. An MCP tool, a
  migration, a CI gate: the PM can read what it will do and decide. Those go straight to their PRD.
  **A lane that fires on everything has failed as surely as one that fires on nothing**; over-firing
  twice running is a D41 tripwire on the test's wording.
- **Do not use** for leg B (the post-PRD, high-fidelity design reference — that is the
  [design loop](/okf/core/concepts/design-loop.md): design-brief → design → reconcile, open to new
  surfaces per D60's D48 amendment).
- **Do not use** when you hold a *question* rather than a *candidate* — that is the
  [discovery lane](/skills/discovery.skill):

  | | You hold | Deliverable | Closes on |
  |---|---|---|---|
  | **discovery** | a **question** with an unknown answer, findable by investigation | a **learning** | the timebox — "inconclusive" is a recordable outcome |
  | **prototype** | a **candidate** whose rightness no description settles | a **validated direction** | a disposition against a specimen |

  Widening `discovery` to cover this was considered and **rejected** in D60 and stays rejected:
  "discovery" is not the word a PM reaches for when they want to *see* something, and
  discoverability was the whole failure.

## Procedure

1. **Open the lane.** `create_initiative({id, title, parent_kr, type:'prototype', stage:'intake'})` —
   anchored like all work (D21/D59). Branch `initiative/<id>`.
1b. **Improving something that already exists? Understand it first.** If the specimen will replace
   or alter an existing surface, run an [explain-surface](/skills/explain-surface.skill) pass on
   it — fresh context, **before** the brief. Divergent options against a surface nobody has
   characterised diverge from a guess, and the PM cannot grill them honestly. Brand-new → skip.
2. **Take the quick brief.** The PM fills the
   [prototype-brief template](/okf/core/templates/prototype-brief-template.md) — minutes not hours —
   into `prototype/<id>/brief.md`; set it as `prd_path`. It declares **the judgement being
   exercised** and **the specimen format chosen** (step 4), because those are what the grilling and
   the disposition hang on. **`rubric_path` stays null by design** (grilled, never scored). If the PM
   starts writing requirements, stop them: that detail belongs in the PRD that *follows*.
3. **Precondition check — BLOCKING (D60(c), generalised).** A specimen built against no shared
   vocabulary produces something nobody can consistently build from. Before producing anything, confirm
   the artifact class has **conventions** and **craft knowledge** to reason from:

   | Class | Its conventions live in |
   |---|---|
   | A user interface | the product's **design system** — tokens, type scale, components (PMOS's own app: [D38](/DECISIONS.md); tenants checked at onboarding) |
   | A skill | [SKILL-FORMAT](/skills/SKILL-FORMAT.md) — three-level progressive disclosure |
   | A tool or API | [D19](/okf/products/pmos/adr/d19-aci-design.md)'s ACI principle |
   | A knowledge doc | the OKF spec + [frontmatter-format](/okf/core/concepts/frontmatter-format.md) |
   | A schema | the repo's migration + RLS conventions |

   In PMOS most already exist, so this usually passes on inspection. **Where a class has neither,
   authoring them is the first initiative** — propose a minimal set, get the PM's approval, record it
   in the product's namespace, and only then prototype. Never silently invent per-prototype
   conventions; that is how inconsistent products happen.
4. **Retrieve the craft, and choose the format.** `get_okf_concepts` the class's craft — for a user
   interface, `core/concepts/design-craft` (perception/cognition evidence, craft moves, accessibility
   floors, recorded anti-patterns); for other classes, the conventions named in step 3. **Reason from
   principles to THIS brief; two briefs must not produce the same specimen.** D60(e) is explicit that
   without a craft layer to reason from, an agent told to "apply practice" produces generic output —
   if you cannot name what you are reasoning from, you are in the blocking case above.

   Then choose the format by the principle — **the cheapest specimen that lets the PM exercise the
   judgement in question**. A starting vocabulary, deliberately **not a closed enum**; an unlisted
   shape takes whatever actually fits, named in the brief:

   | Work shape | A specimen might be |
   |---|---|
   | A user interface | a low-fidelity lookable artifact (static HTML is usually right) |
   | A skill / agent capability | a worked sample output on real input |
   | A tool or API shape | sample call + response transcripts |
   | A data model | a schema sketch with example rows |
   | An eval rubric | the rubric scored against 2–3 real past artifacts |
   | Error text, CLI, protocol | the actual strings, or a session transcript |

5. **Produce divergent specimens** into `prototype/<id>/` — low-fidelity, self-contained, examinable
   (whatever renders or reads fastest). **2–3 genuinely different directions, not one safe one with
   variants** — divergence is the point in any medium. **Real draft content, never placeholder**
   (D60: copy rides the prototype — [copywriting.skill](/skills/copywriting.skill) craft
   applies in-loop; claim-sourcing waits for the content lane at production). The non-visual analogue
   is the same rule: real inputs and real outputs, because fake ones hide exactly the friction the
   specimen exists to surface. Respect the accessibility floors even at low fidelity.
6. **Grill — dialogue, never a score. Dispatch
   [`prototype-grill`](/skills/prototype-grill.skill).** A craft-grade critic (fresh context,
   default-to-refute stance, the class's craft loaded) interrogates each specimen: *why this
   structure? what job does the focal element serve? what would the best practitioner in this class
   say is wrong? what was NOT tried?* It writes `prototype/<id>/grilling.md`. Sharpen the specimens
   from it. **Produces no score, no verdict, no threshold, no `evals` row** — re-introducing scoring
   here under any name is a D60 violation.

   **The critic must be a DIFFERENT agent from the one that produced the specimens.** This was prose
   here from the day the lane existed, with nothing to dispatch and nothing to check it — so the
   cheapest path was to grill your own work, and a dialogue with one party is a monologue with extra
   steps. It stopped being hypothetical on 2026-07-29, when
   [`r2-free-zone-baseline.md`](/prototype/pmos-autonomous-drive/r2-free-zone-baseline.md) grilled
   its own specimens and flagged itself for it. If no second agent is available, **report that as a
   blocker** and let the PM knowingly accept a self-grilling — a recorded compromise, never a
   fabricated dialogue.
7. **PM disposition** (the only gate on leg A, and it is the PM's):
   - **promote** → open a **new feature-lane initiative**; its PRD and rubric are **derived from the
     validated specimen** (what was seen and chosen becomes the spec's substance). Leg B, where the
     work has a surface, then runs inside that initiative's Build.
   - **iterate** → back to step 5 with the PM's reaction folded in.
   - **kill** → record one honest line on the initiative, **file the concept into
     [planning/out-of-scope/](/README.md)** (decision, reasoning, what would
     reopen it) so it is not re-prototyped from scratch, and close. A cheap kill is this lane
     *succeeding*.
8. **Log.** `log_agent_run` with the disposition; friction to discoveries.md (`#friction`).

## Hard rules

- Artifacts live in **`prototype/<id>/` only** — never `web/`, never a tenant app. The `web-ci`
  quarantine assertion enforces this for the visual case; it is the *instance* of D01's general rule,
  which binds every medium. Do not fight it, and do not read "the assertion only covers `web/`" as
  permission to let a non-visual specimen leak into product code.
- **A prototype never ships.** Promote produces a *spec*, not a deploy. Quality bars are suspended in
  `prototype/` precisely because nothing there can reach production (D01).
- **No score on leg A, no skipped grilling on leg A.** Both PM rules bind; **neither may be satisfied
  by dropping the other**. This holds for non-visual specimens too, where the temptation is sharper:
  a schema or an API *looks* like it has objective criteria, and that is exactly the argument that
  produces safe, scoreable output — the criteria you can score are the ones you already know to look
  for. A technically correct schema can still be the wrong one to live with, and *fit* is what leg A
  is for. (The console log's twin: the evaluator graded *correct* design; the PM judged *desirable*
  design.)
- If the PM stops looking and promotes on autopilot, say so — an unreviewed disposition is the
  [meta-watermelon](/okf/core/concepts/watermelon-flag.md) in a new place.
