Rebuild prototype · built from Fabian's concept spec · 2026-09-11
The concept spec's one sentence, built as a working thing you can click through on your phone. One continuous path, one forward action at a time, and real interactive versions of the two hero moments the spec grounds most concretely.
It runs on fixture state: the comparable listings, the search queries, the anchors and the identity blocks are copied out of the app's own live-run fixtures — real responses the API actually returned on 2026-08-22 and 2026-08-31. No model is called. No photograph leaves your device. No price is real.
Best judged on your phone. On a desktop it draws itself inside a 390 × 844 device frame; the Prototype tab at the top right switches that, and everything else.
The brief was explicit about this: where the spec leaves a decision open, the prototype uses a reasonable placeholder and says so on the surface rather than picking quietly. Every open decision carries a dashed OPEN badge naming who holds it, and the Prototype drawer lets you switch most of them live and look at both answers.
render() switching on the spec's own state table. Ten
states, each with one forward action, a state name in mono above the item title, and the Photos
material demoted to a quiet disclosure instead of a peer tab.identity_string,
identity_confidence, identity_evidence and
identity_alternates — all four computed today, none shown to anybody. Rendered from
the real fixture, including the hard case where the model returned category_only.Places where building it surfaced something the spec did not have, or got wrong. Each is flagged on the surface too, not just here.
Spec 5.2 asks for the identity line "in the poster face, sitting slightly out of register." Built literally, that is the exact treatment Lance reported as "blury vision" on 2026-08-30, after which the shipped stylesheet pulled the echo off all running headline copy and wrote the rule down. So the misregistration moved off the letterforms and onto the plate and two registration crosshairs. Same device, same choreography, and it stops fighting the app's own legibility floor. The spec should be amended, or this overruled.
Spec 5.2 lists the stamp as four tags: Greater Victoria, Island, Mainland, Elsewhere. "Elsewhere" would put United States comparables in the same row as Canadian ones, and the pipeline's hardest rule is that CA and US never blend. The prototype stamps four Canadian bands and then a separate US row behind its own fence line.
The wheels run's real identity refinement is a 300-character sentence. The vision pass's own schema asks for a short search phrase, so P1 output is usually fine — but nothing enforces it, and the card has no good behaviour when it is not. The prototype shows the long case and flags it rather than truncating quietly. It wants a length constraint in the P1 prompt.
| Open | Holder | Where to look |
|---|---|---|
| Welcome headline, one of four | Lance | Welcome screen · drawer |
| The hero number: ask or sells-at | Lance | Any ready item · drawer |
| Premium versus Playful | Lance | The colour picker |
| Swatch trigger on drill-in screens | Lance | Kept on every screen, per the standing instruction |
| The product name | Lance · Kahua | Drawer · five candidates |
| Plates, contact sheet, print: warm or re-inked | Linnea | Capture screen · drawer |
| Ledger coin: circle or Ticket | Linnea | On the Table · drawer |
| Confidence as shape or as echo | Linnea | Price hero · drawer |
| Retention facts: window, access, deletion | Adisa | Confirming screen · the one keepwarn |
| Preview card's distance from Facebook trade dress | Adisa | Ready screen · "Before you go" |
| Every string in spec 9.2, and the retention sentence | Auden | Everywhere a marker appears |
| Sequencing this rebuild against the D-499 payment spec | Kwitonda | Not touched by this pass |
Two further open items the build pass created rather than
inherited: the sharpness threshold is not calibrated and has to be set from real shots of the
real first items on the actual phones; and the search log's per-search result counts and timings
are fixture-shaped, not captured, because there is nowhere to log them until the
events_json migration lands.
Lifted from spec 12 so it is on one screen. All additive; no existing column changes meaning.
0022research_runs.events_json — the capped event array the press run readsitems.rail_json — the rail's step and copied set, so the rail survives a device changeusers.town — a plain municipality string, never a streetGET /reference returns each profile's full angles array, not just {key, name}POST /items/:id/vision carries plan.identity to the clientGET /items/:id/package carries run.events while a run is livePUT /items/:id/recompose — P3 only, never P1 or P2consumeStream() gains an onEvent hook, best-effort like onHeartbeat