# Example prompts

Worked prompts of the shape this system is built for: **a whole product**, generated as a
`templates/<slug>/` folder. Each one names the domain, the shell, the destinations and the
awkward part of the data — because those are the four things that decide whether the output
is a product or a default assembly.

Read `AGENTS.md` before using any of these. What follows each prompt is the shape of the
answer it should get, not a transcript.

---

## How a good prompt here is built

Five things, in any order:

1. **A domain with real arithmetic** — money, capacity, deadlines, entitlement. A domain
   where nothing sums gives the derivation rules nothing to hold.
2. **The people** — who is signed in, what they may not do, and who they are waiting on.
3. **The destinations** — roughly how many and what each one's primary content is
   (table, board, calendar, list-detail, chart-led, thread, matrix, canvas).
4. **One or two hostile facts** — the thing that breaks a naive fixture: a record with no
   date, a permission denied, a figure that only reconciles if you sum the cleared lines.
5. **What must be visibly different** from the last product built. Shell mode, content
   frame, and primary display axis are the three axes that carry it.

Leaving the shell unnamed is legitimate — destination count is the tie-breaker and the
handover says it was inferred. Leaving the *arithmetic* unnamed is not.

---

## 1 — Fleet maintenance desk

> Build a `templates/fleet-desk/` product: the maintenance office of a 140-vehicle
> commercial fleet. Sidebar shell, labelled groups. Destinations: today's board, vehicles,
> defects, scheduled services, parts, workshops, drivers, costs, settings.
>
> The arithmetic: a vehicle is off-road if it has an open safety-category defect or an
> overdue statutory inspection — that predicate drives the nav badge, the board's count and
> the row tone, and nothing stores it. Service intervals are whichever falls first, distance
> or date, so a vehicle's next service is derived from two clocks. Cost per vehicle is the
> sum of its **closed** job lines, never a stored total.
>
> Hostile fixtures: two vehicles with no odometer reading in six weeks; one workshop whose
> quotes always exceed the approval limit of the signed-in service manager, so those rows
> are disabled with the reason named; a defect reported by a driver who has since left.
>
> Make it not look like Finance Desk: flush column on the page colour, hairline rules, and a
> board — not a table — as the primary display on the opening destination.

**The answer.** `enums.js` and `nav.js` written before any screen. `VEHICLE_STATUS`,
`DEFECT_CATEGORY`, `JOB_STATUS` with tone groupings and reasons; `off_road` deliberately
absent and noted as derived. Nine registered routes plus a `/vehicles/new` form route and
the auth namespace. A shell comment naming shell, density, separation, active-state
signature and each destination's primary content. The off-road predicate written once in
`VEHICLE_FLAGS` and called by the badge, the board header and the row.

---

## 2 — Grant-giving desk

> A `templates/grants-desk/` product for a foundation that awards about 300 grants a year.
> Top-nav shell — five destinations only: applications, awards, payments, grantees,
> reports. Fewer destinations, wider canvases.
>
> An application moves through a seven-step assessment, and the same stepper appears
> wherever an application does. An award's committed amount is the sum of its payment
> schedule lines; what has actually left the building is the sum of the **cleared** ones,
> and the award's status follows that arithmetic rather than being set.
>
> The evidence gate: no award decision is available until the safeguarding check and the
> latest accounts are both on file. Where they aren't, the decision action is absent — not
> disabled — and the record says which document is owed and by whom.
>
> Reports are chart-led, not tabular. Every chart's own aggregates obey the derivation
> rules.

**The answer.** Top-nav with one row of five, exactly one active from the route, one
menu-only destination at most. Reports as the named exception to a table-everywhere product,
with the shell comment saying why. The evidence gate as one predicate read by the section
count, the record alert and the action set. A staged dialog for the two-field actions, a
registered route for the real form.

---

## 3 — Studio scheduling desk (shell left open)

> `templates/studio-desk/` — a recording studio's booking office. Rooms, engineers,
> sessions, clients, invoices, rates, settings. Calendar as the primary display on sessions;
> list-detail on clients.
>
> Utilisation is booked hours over available hours, and available hours come from the
> opening times in Settings — change them and every utilisation figure moves. An engineer
> cannot be double-booked, and the conflict is derived at render, never stored.
>
> Invoices are raised from sessions: an invoice's total is the sum of its session lines at
> the rate that applied on the session date, so the rate table is historical, not current.
>
> Pick the shell yourself and say why in the handover.

**The answer.** Seven destinations → sidebar shell, inferred and stated. Settings that
bite: opening times as the denominator of every utilisation figure. A rate lookup by date,
one function, called by the invoice line and the session row alike. Conflict detection as a
derived flag with the clock injected.

---

## 4 — A screen added to an existing product

> Add a **payout approval queue** to `templates/finance-desk/`. It goes in the existing
> nav group, uses the existing `enums.js`, and if the status field it needs lacks a value,
> stop and tell me rather than adding one.

**The answer.** The refusal path taken seriously: if `PAYOUT_STATUS` has no value for what
the screen needs, the work stops and reports the field and the values wanted. Otherwise: one
route added to `FINANCE_NAV`, one data state, the queue's figures summing the exact rows it
renders, and the approval limits from Settings actually enforced — the known gap named in
the changelog is not repeated.

---

## 5 — An audit rather than a build

> Read `templates/talent-desk/` and report which `AGENTS.md` rules it breaks, by name.
> Don't fix anything yet.

**The answer.** A list, rule by rule, with the file and line where each break lives:
figures that can't name their array, a fixed action set on a detail view, two data states on
one screen, a status literal passed to a badge, a breadcrumb resolving nowhere, a count that
doesn't count the thing its label names. No fixes, no rewrite, and no praise padding.
