The app

One prototype, one Organisation, one shell — walk between destinations the way a user would. Nothing is saved, nothing is real.

Built: Calendar (STORY-014) · Events and guests (EPIC-002, EPIC-003) · Venues (STORY-013) · People (STORY-015) · Money (EPIC-004) · Inventory (EPIC-006) · Tasks (EPIC-005) · Settings → Currencies and Timezones (STORY-041).
Every destination in the navigation is now real. The "not prototyped" screen stays wired up for the next one: a destination is marked unbuilt in one place, and that is what keeps a scope boundary visible on screen rather than only written down.
Signing up happens before this shell exists, so it stays a separate prototype: signup-flow.

390 × 860 — phone
desktop — drag the bottom-right corner to resize

What merging the four prototypes found

None of these were visible while the prototypes were separate. Each one looked internally consistent.

What the Calendar found

The two numbers

What differs between the two

Try this

Settled here

Forty rows, answered by paging

Still unanswered

The question this exists to answer

What it measured

FlowTaps
Take three items to an event, from the item list6
Pack down — mark a four-item loadout returned1
Mark one item returned1
Typing the same three item names into a message~20

Three ticks plus event plus confirm is N + 3 for any loadout, and packing down is one. That clears the bar the epic set. The number to defend in review is the +3, not the ticks.

The decisions that make it fast

Try this

Raised by building it — not yet in a story

Two bugs worth recording

Presenting a second panel over a first deleted the first from the document. The panel-in-two-homes pattern moves one element between a phone view and the dialog. Presenting swapped the modal slot's contents with replaceChildren(), which does not put the displaced panel anywhere — it drops it. Opening a loadout and then “Add equipment” therefore destroyed the loadout panel, and the next lookup inside it returned null. That is a crash on the one path the whole module is built around. Presenting now returns the current panel to its own home first.

dialog.close() does not fire its close event synchronously — the event is queued. So “dismiss this panel, then immediately present the next one” (which is what confirming a loadout does) races: by the time the queued handler runs, it restores the new panel to its off-screen home and the dialog goes blank. A programmatic dismiss now marks its own close as handled; Escape and the backdrop still fall through, which is the case the handler exists for. The same dismiss/present pattern was also in money-flow/ and core-loop/, where it had not yet triggered; those prototypes are gone and the fix travelled with the shell when it was merged, which is the whole argument for there being one.

Components this found

Members — what building it settled

Account — closing one is not a confirmation

General — the last screen, and the most destructive

Two sweeps, run once, worth more than the clicking

Both are things design.md and i18n.md ask for and the prototype had never had. Between them they found three defects that months of clicking had not, because all three look correct on screen.

Turkish found one more, in our own patterns

A greedy capture ate a separator. The translation layer matches whole strings first and only then splits meta lines on · , so the pattern for “Free includes 1 seat” — written with (.+) — matched “1 Member · Free includes 1 seat” with the plan name captured as “1 Member · Free”. Half the line came back translated and half did not, with no error anywhere. The fix is [^·] rather than . in any pattern whose text can sit second in a joined line, and the item cost added the same day had the same bug. It is the fragment-joining hazard i18n.md names, arriving from the one direction nobody watches: the translation catalogue itself.

Tasks — what building it settled

Try this

Raised by building it — not yet in a story

What differs between the two

Try this

Still unanswered

The three figures

The amount field

Telling the currencies apart

The dashboard

What differs between the two

Try this

Nothing here is gated

Settled here

Raised by building it — not yet in a story

Settled by clicking it — now in STORY-041

Components this found

Two chart-spec deviations, on purpose

Both mark colours were measured, not eyeballed: --color-accent is 4.62:1 light / 7.13:1 dark against the card, --color-danger 5.44 / 7.48, and the zero baseline in --color-border-strong 3.23 / 3.01 — all clear of the 3:1 floor for a meaningful boundary.