Voyage · EventFarm Parity Stories

User journeys, end-to-end.

Each story describes one feature of Voyage as a real organizer, attendee, or event-day staff member would experience it — including what success looks like, what failure looks like, and how the page itself supports or fails the user. Trunk stories establish the surfaces; branch stories root in trunks and exercise specific capabilities. Every story is human-audit-ready and machine-consumable by the agent harness that turns it into a Playwright fuzzing run.

Trunk stories

Surfaces of the application. Branches inherit auth + navigation from these.

TRUNK · admin-shell-access
Admin Shell access & navigation
An organizer logs in, lands in the workspace shell, and finds the part of Voyage they came for. Failure modes here are surface-level: authentication, permission, server availability, navigation discoverability.
Organizer Foundation
TRUNK · event-setup
Event Setup hub
Where the organizer configures one event end-to-end: access types, designs, audience, schedule, branding, public page. ~30 branches root here. Roots in admin-shell-access.
Organizer Setup
TRUNK · day-of-operations
Day-of Operations
Kiosk + check-in console + live attendee handling across two surfaces (kiosk.* + staff.*). Offline-mode contract, idempotent two-staff-same-guest pattern, anti-probing for invalid QRs. Roots in admin-shell-access.
Event-day staff Day-of
TRUNK · public-event-page
Public Event Page
The booking-pages app surface. Public guests, no auth shell. 6 failure modes including not-found, archived, draft-treated-as-not-found anti-probing, capacity-full, invite-only-no-token, and og-tags-present for share previews.
Public guest Public
TRUNK · native-app-shell
Native App Shell
iOS/Android event-day shell. Different physics: offline by default, intermittent network, hardware (camera, bluetooth printer, NFC), background app states, OS permission lifecycles. 7 failure modes (network drop, force-quit-preserves-queue, app-update mid-event, two-staff idempotent, camera permission revoked, sign-out with pending, encrypted-at-rest). Runner: Detox/XCUITest, not yet wired.
Event-day staff Native
TRUNK · efx-station-shell
EFx Station Shell
Live event station + organizer control + WebSocket runtime. Built on Durable Objects + the F80/F88-proven 5k-concurrent substrate. 8 failure modes (socket reconnect, out-of-order delta, results-visibility gate, 5k load stable, cross-station isolation, late-join state, idempotent vote, passcode rotation).
Station operator + attendee Live

Component stories

Design-system primitives. Tested once with all interaction edge cases. Branches that use a component inherit its contract via usesComponents and don't re-test the fiddly UX bits.

COMPONENT · ui-modal
Modal dialog
Focus trap, esc-closes, backdrop, scroll lock, layered z-index, mobile sheet behavior. The richest interaction primitive in the admin.
Component Inherited by ~50 branches
COMPONENT · ui-text-input
Text input
Validation rendering, autofill detection (no-validation-on-autofill), paste truncation, character counter, focus-ring-visible contract, label always above the field.
Component
COMPONENT · ui-checkbox
Checkbox
Label-click toggles, Space toggles + Enter doesn't, indeterminate aria-checked=mixed, disabled blocks both box and label, focus ring always visible.
Component
COMPONENT · ui-autocomplete
Autocomplete select
Debounce-and-clamp, race-stale-response discard, cursor stability by id not index, no-auto-highlight, three-state Esc, no-results-not-alert. 8 failure modes — the most failure-prone tier-1 primitive.
Component
COMPONENT · ui-form
Form
Submit lifecycle, idempotency-key wiring, busy-state lockout, error rendering (inline + summary), focus-first-error, Enter-vs-Cmd-Enter keyboard semantics.
Component
COMPONENT · ui-toast
Toast
Content-length-aware auto-dismiss timing, hover-pause / focus-pause, max 3 stacked + queue, dedup by id, no-auto-focus-steal, mobile placement that doesn't overlap workspace chrome.
Component
COMPONENT · ui-data-table
Data table
The most-used surface in the admin. Sort round-trips through parent, sticky header doesn't bleed, row-click vs inner-button delegation, page-only vs cross-page select, distinct empty/loading/error states, long-cell truncation, keyboard nav.
Component Inherited by ~30 list-view branches
COMPONENT · ui-pagination
Pagination
Page numbers + prev/next + first/last + page-size, "Showing X–Y of Z" status. Page-size change resets to page 1, current page not clickable, ellipsis non-interactive, empty list hides controls. Total is required — never "?".
Component
COMPONENT · ui-status-pill
Status pill
Closed registry of 24 statuses (draft, registered, ready, failed, bounced, …). Color is never the only differentiator, custom labels override defaults, unknown status falls back to "Unknown" with a warning, prefers-reduced-motion respected.
Component
COMPONENT · ui-search-with-filters
Search with filters
Header above every list. 300ms debounce, Enter flushes, Esc clears. Active filters always visible (no "+2 more" collapse). Clear-all wipes both search and filters. Result count goes skeleton during in-flight, never stale.
Component
COMPONENT · ui-bulk-action-bar
Bulk action bar
Appears when selection > 0. Page-scope vs all-matching scope distinction enforced. Destructive actions always confirm. Pluralization correct. Always shows absolute count, never "many". Bar persists during in-flight action.
Component
COMPONENT · ui-file-uploader
File uploader
File picker + drop zone + per-file progress. Validates size and MIME before upload starts, abort actually aborts (AbortController), retry uses idempotency-key, watchdog timeout marks stuck uploads as failed, partial-failure semantics surfaced, 0-byte and folder drops rejected.
Component
COMPONENT · ui-async-job-tracker
Async job tracker
Polls a background job's lifecycle. Progress clamps at 99% until ready, stuck-in-queued banner after 60s, polling stops on terminal state, race between cancel-and-complete handled, expired countdown never goes negative, request-id always shown on failure for support.
Component Inherited by EF-086, EF-088, EF-089, EF-093
COMPONENT · ui-destructive-confirmation
Destructive confirmation
The "are you sure?" dialog. Friction-by-design: initial focus on Cancel, Enter doesn't confirm, type-to-confirm for high-stakes ops (case-sensitive), async confirm gates the modal, dialog stays open on rejection with inline error.
Component
COMPONENT · ui-date-range-picker
Date range picker
Timezone-honest date selection. ISO strings as source of truth, never silent end-before-start swap (always prompts), DST-safe day enumeration, locale-aware text parsing (en-US vs en-GB), min/max enforced in calendar, presets show their dates before clicking.
Component
COMPONENT · ui-stepper
Stepper / wizard
Multi-step navigation. URL-state mandatory (linkBuilder), back-navigation skips validation (going back is always free), Next validates first, direct-URL-out-of-order redirects to first incomplete step, optional steps with allowSkip, async onStepChange with busy state.
Component
COMPONENT · ui-rich-text-editor
Rich text editor
Schema-bounded editor (output is JSON, never HTML). Paste-from-Word strips inline styles, merge tokens are atomic chips (cursor skips interior), undo/redo groups by operation, link URLs allow-listed (no javascript:), maxLength counts plain-text not markup.
Component
COMPONENT · ui-tabs
Tabs
WAI-ARIA-compliant tabs. Arrow keys auto-activate, disabled tabs skipped during nav, inactive panels unmounted (no display:none state leak), badge=0 hidden, overflow scrolls or wraps but never hides behind a "More" menu, URL-sync via linkBuilder.
Component
COMPONENT · ui-permissions-matrix
Permissions matrix
Subject × ability grid. Implied abilities cascade (granting "edit" implies "read"), revocation cascades when no other source, role presets apply with explicit diff preview, save shows the diff before committing (uses labels, not dot-IDs).
Component
COMPONENT · ui-progress-bar
Progress bar
Determinate / indeterminate. Value clamps to 0..100, NaN renders indeterminate, value never regresses (panic prevention), prefers-reduced-motion drops animation, tone reinforced by icon (not color alone).
Component
COMPONENT · ui-csv-import-preview
CSV import preview
Header→field mapping + per-row validation. Auto-match marked as "auto" so user can verify, commit sends only valid rows, large file commits all rows (not just preview), retry uses idempotency-key, post-commit per-row error report download.
Component

Branch stories

Each roots in a trunk and focuses on the specific feature's success + failure surface. Component-tier mechanics inherit from the component stories above. Cluster B (organizer admin) was the first codex-factory dispatch — 7 stories at 10-12 failure modes each, all lint clean.

EF-001
My Account overview
Matrix=Absent — ships entirely as gap probe. 12 failure modes describing the desired contract: usage panel (events + guests + plan-quota delta), plan/upgrade CTA, support tier, enabled-features ledger, billing snippet. Visible "EF-001 not implemented" panel.
Organizer Account
EF-002
Team selection
Switch active account/team context. 12 failure modes including persisted active-team URL state, audit-row-per-switch (compliance), prevents accidental cross-tenant operations after switch, gap probe for missing multi-account switcher.
Organizer Account
EF-004
Address book contacts
Reusable contact records + activity. 12 failure modes including contact merge (same email twice), contact-event-history, soft-delete with audit, gap probe for missing full Address Book UI.
Organizer Account
EF-005
Address book groups
Reusable groups + bulk contact upload. 12 failure modes including group-of-groups not supported by contract, bulk-add via ui-csv-import-preview, gap probes for downloadable duplicate/error reports.
Organizer Account
EF-008
Create or copy event
Organizer creates a fresh event or clones a past one. The seemingly-simple one — but the failure modes around copy-from-deleted-source and cross-tenant access have real teeth.
Organizer Planning
EF-011
Event info & settings
Metadata, URLs, language, social, revenue, waitlist, archive. 10 failure modes including audit-trail-on-soft-delete, archive-vs-delete distinction, edit-lock-during-publish, two-organizers concurrent.
Organizer Setup
EF-015
Access Types
Distribution, availability, price, capacity, transferability, FCFS, sort. 11 failure modes including payment-settlement parity gap, public-display gap, sort-collision normalization, conflict-modal pattern.
Organizer Setup
EF-014
Invitation reveal
Public email-lookup form. Email-not-on-list returns generic "no invitation found" (anti-probing — same response shape as known-not-found vs invalid format), per-email rate-limit, invite link emailed not displayed inline.
Public guest Public
EF-016
Public registration
The simplest happy-path public flow. 11 failure modes including capacity-full mid-fill race, two-tab idempotency, browser-back doesn't double-register, og-tags present for share previews, bot-fill rate-limit, already-registered show-existing record.
Public guest Public
EF-018
Invite to RSVP
Private free invitation. 12 failure modes including the dignified-rejection contract (no-leak, no-diagnostic-distinguisher, warm tone, request-invitation CTA), capacity-full waitlist, revoked-mid-flow with composed-message preserved.
Organizer + guest Setup → Public
EF-021
Ticket quantities & windows
Capacity adjustment + availability start/end windows. 11 failure modes including downstream-attendee-messaging gap probe, capacity-shrink-below-current-registrations conflict, window edits during in-flight registrations.
Organizer Setup
EF-022
Invitation transfer (public)
Recipient pastes transfer link, lands on acceptance page, can accept or decline. Idempotent (accept-twice doesn't double-register), transfer-from-deleted-source returns generic 4xx, transfer link expiry handled.
Public guest Public
EF-025
Waitlist (public)
Waitlist signup + status check. Position display ("you're #4") OR generic "we'll reach out". Promotion-from-waitlist via email channel (gap probe). Anti-probing on email-lookup.
Public guest Public
EF-027
Canvas page builder
Compose, preview, publish event pages. 10 failure modes covering undo/redo correctness across block ops, paste-from-other-page reference resolution, asset-upload failure isolated, scheduled publish atomicity, autosave recovery on refresh, two-editor conflict resolution.
Organizer Canvas
EF-028
Canvas templates
Catalog + start-from-template + team templates. 10 failure modes including team-template permission scope (uses ui-permissions-matrix), template-modified-after-use does NOT propagate to existing pages, template paginates via ui-data-table.
Organizer Canvas
EF-029
Multi-page event sites
Guest navigation across /p/:slug pages of one event. Deep-link refresh-safe per SPA-state mandate, 404 on unknown sub-slug, canonical URL resolves consistently, og-tags differ per page.
Public guest Public
EF-030
Canvas dynamic elements
Event + guest merge tokens for Canvas pages. 10 failure modes including token-rendering-fallback (missing data → fallback, never empty merge), per-token validation, resolution-at-preview vs at-render, token catalog pagination.
Organizer Canvas
EF-031
Registration button modal
The public guest's first interaction. 8 failure modes including validation-required-field, email-format-invalid, back-button-closes-modal, network-failure-retry, capacity-full-mid-fill, two-tab-race-idempotent, server-500-with-request-id, already-registered.
Public guest Public
EF-032
Canvas contact form
Matrix=Absent — entire feature ships as gap probe. 11 failure modes describing the desired contract: form block, anti-abuse rate-limit + CAPTCHA, email routing to event organizer, audit log per submission. Visible "EF-032 not implemented" panel.
Public guest Canvas
EF-033
Canvas video embeds
MP4, YouTube, Vimeo. 11 failure modes including embed-parsing strips arbitrary HTML, lazy-load below-fold, autoplay disabled by default for accessibility, video-parity-gap probe for missing provider parity.
Organizer Canvas
EF-034
Canvas countdown
Countdown to event start. 11 failure modes including timezone-honest counting, "Event in progress" mid-state, configurable post-event message, countdown-parity-gap for organizer controls.
Organizer Canvas
EF-035
Canvas navigation bar
Nav-bar block, anchor links, mobile hamburger. 11 failure modes including nav reorder via block ops (not separate config), anchor link targeting, fixed-position option, nav-parity-gap for builder + mobile parity.
Organizer Canvas
EF-036
Canvas custom code & fonts
Custom CSS allow-list, font upload + subset, JSON page-tree import/export. 11 failure modes including arbitrary JS forbidden, @import URL allow-list, custom-fonts-parity-gap.
Organizer Canvas
EF-037
Canvas style sync
Matrix=Absent — entire feature ships as gap probe. 11 failure modes describing the desired contract: shared style class registry, edits propagate across blocks using a class, inspector shows class-membership, conflict UI when local override exists.
Organizer Canvas
EF-038
Canvas external assets
Dropbox + Google Drive connector OAuth, asset picker, R2 mirroring (not hot-link). 11 failure modes including revoked-OAuth recovery + re-connect flow, no-hot-link rendering, external-assets-parity-gap.
Organizer Canvas
EF-039
Built-in guest fields
Title, company, address, phone, country. 11 failure modes including admin-field-required configuration gap probe, attendee-form rendering parity gap, audit-on-required-flag-toggle.
Organizer Setup
EF-040
Custom registration questions
Custom answer types + access-type-scoped questions. 13 failure modes including answer-type validation per registered type, preview-vs-published divergence, question-reorder concurrent edit, two-organizers conflict.
Organizer Setup
EF-041
Waiver / signature
Compliance-sensitive. 13 failure modes — waiver checkbox NOT pre-checked, evidence stored with policy version (later edits don't rewrite past consents), signature-required validation, minor/guardian copy captured, parity-gap probe (matrix=Absent).
Organizer + guest Compliance
EF-042
Guest list views
Status views, sorting, searching, export. 11 failure modes including URL-sync for filter state, pagination preserved across status-tab switches, export-during-pagination scoping (full match-set vs current page).
Organizer Guest list
EF-043
Individual invite
Add or invite one guest. 12 failure modes including contact reuse vs new contact, idempotent invite-resend within 60s, ticket-block scope enforcement, audit row per state change.
Organizer Guest list
EF-044
Group invite + upload
Bulk invite via group or upload. 14 failure modes including ui-csv-import-preview integration, partial-success commit, large-file commits ALL rows (not just preview), bulk-resend progress via ui-async-job-tracker.
Organizer Guest list
EF-045
Upload template
Generated CSV/XLSX template. 13 failure modes including all-required-fields-present, deprecated columns flagged "ignored" (not rejected), format auto-detect xlsx vs csv, commit retry with idempotency key.
Organizer Guest list
EF-046
Edit guest
Modify access type, ticket block, status, custom fields, notes. 10 failure modes including closed-event edit parity gap, cancel-with-pending warning, two-organizers concurrent on same guest, audit-on-status-change.
Organizer Guest list
EF-047
Check-in notes
Staff-only notes shown at check-in. 12 failure modes including visible-to-staff-not-guest, edit history preserved, character limit enforced server- AND client-side, native check-in display gap probe (deferred to native trunk).
Organizer + staff Guest list → Day-of
EF-048
Arrival alerts
Email/SMS on specific guest check-in. 12 failure modes including per-guest config preserved across edits, multi-recipient alert, opt-out per guest, dispatch-on-checkin gap probe (matrix flags it not implemented end-to-end).
Organizer Notification
EF-049
Resend invitations
Single + bulk resend, confirmation resend, timeframe exclusions, ticket-block resend. 12 failure modes including bulk-resend gap, confirmation-resend gap, timeframe-exclusion gap, async-job-tracker for bulk runs.
Organizer Email
EF-050
Last contacted
Last-Contacted + Last-Email-Interaction columns + filtering. 11 failure modes including delivery/open/click/bounce ingestion gap, guest-list UI parity gap, time-range filter, async-job-tracker for export.
Organizer Email
EF-051
Email designs & types
Reusable designs + 6 message types (invitation, confirmation, decline, save-the-date, manual, ops). 11 failure modes including deployed-runtime-gap (template API 404), design-list pagination, preview-vs-published divergence.
Organizer Email
EF-052
Email association
Access-type → message-type-design mapping. 11 failure modes including deployed-runtime-gap (PUT 404 on association endpoint), test-send via association preview.
Organizer Email
EF-053
Guest messaging
One-time send with audience picker. 11 failure modes including deployed-runtime-gap (mailing create 409 NO_RECIPIENTS), recipient-resolution empty-audience handling, ui-async-job-tracker for fan-out progress.
Organizer Email
EF-054
Scheduled messages
Future send_at, edit/cancel before send-due. 11 failure modes including deployed-runtime-gap (scheduled mailing 409 NO_RECIPIENTS), past-edit-window enforcement, ui-date-range-picker for schedule input.
Organizer Email
EF-055
Mobile-responsive templates
Multi-viewport preview (mobile-portrait/landscape, tablet, desktop). 11 failure modes including deployed-runtime-gap (template list 404), max-width ~600px constraint, sample-data preview.
Organizer Email
EF-056
Email dynamic elements
Token catalog + insert + per-recipient resolution. 11 failure modes including deployed-runtime-gap (token catalog 404), token-rendering-fallback, never-empty-merge contract.
Organizer Email
EF-057
QR codes in emails
QR design block + signed URL → check-in round-trip. 11 failure modes including deployed-runtime-gap (mailing send 409 NO_RECIPIENTS), inline alt text, plain-text fallback for QR-incompatible clients.
Organizer Email
EF-058
Calendar links
Google/Outlook/Yahoo/ICS preview + signed ICS link. 11 failure modes including deployed-runtime-gap (mailing send 409 NO_RECIPIENTS), HMAC-signed ICS, calendar-app round-trip.
Organizer Email
EF-059
Email images & GIFs
R2 asset upload, sizing knobs, missing-alt warning. 11 failure modes including deployed-runtime-gap (sizing PATCH 404), oversized-image warning, ui-file-uploader integration.
Organizer Email
EF-060
Email masking (SPF/DKIM)
Matrix=Absent — entire feature ships as gap probe. 11 failure modes describing the desired contract: domain verification UI, DNS TXT records to copy, verification status pill, sender enforcement at send time, suspended-domain handling.
Organizer Email
EF-066
QR reader check-in
9 failure modes including idempotent two-staff-same-guest, expired-window with permission-gated force, tampered-QR anti-probing, waitlisted-three-options decision UI, network-drop offline queue.
Event-day staff Day-of
EF-086
Generated reports
Async-job lifecycle. 11 failure modes including job-stuck-queued, job-failed-with-reason, signed-URL-expired, swept-artifact, two-organizers, large-dataset, bounce-indicator, race-window-404, permission-revoked, cancel-mid-run, permission-gated-catalog.
Organizer Closeout
EF-087
Guest list summary report
Identity, title, company, position dataset fields; CSV + PDF outputs. 12 failure modes including deployed-runtime-gap (D1 bootstrap 400), signed-URL expiry, permission-gated catalog. Inherits ui-async-job-tracker contract.
Organizer Closeout
EF-088
Activity log report
Unioned guest, scan, notification, email activity. 12 failure modes including deployed-runtime-gap (D1 bootstrap 400), paginated preview before download, time-range filter via ui-date-range-picker.
Organizer Closeout
EF-089
Email deliverability report
Email-event counts (delivered/opened/clicked/bounced/suppressed). 12 failure modes including deployed-runtime-gap (D1 bootstrap 400), per-mailing or per-event aggregation, ui-status-pill registry for status display.
Organizer Closeout
EF-090
Graphical check-in report
Check-in-over-time chart, PDF with chart embedded. 12 failure modes including deployed-runtime-gap (D1 bootstrap 400), dedupe + timeline rows, time-range filter.
Organizer Closeout
EF-091
Specialized ticketing reports
Transfer states, waitlist promotions, purchase reconciliation, ticket-block allocations. 12 failure modes including deployed-runtime-gap (D1 bootstrap 400), per-sub-report tabs, large-dataset streaming.
Organizer Closeout

Coming next

P1–P8 + P11 done. 6 trunks, 21 components, 54 branches. Cluster B + C + D + E + reports + account/admin all closed via codex-factory bulk-gen. Remaining: P12 EFx live-event modules (~16 stories — likely parallel-split), P13 integrations (~8 stories using usesIntegration envelope), then hand-written carve-outs P9 payments (~5 stories), P10 compliance (~4 stories), P14 native (~9 stories). After all phases: ~95 EF capabilities covered as ~130 stories.