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

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 is in money-flow/ and core-loop/ — it does not currently trigger there, but it is the same latent bug, and the fix should travel with the shell when it is extracted.

Components this found

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.