← All stories

BRANCH · ef-042-guest-list-views

Guest list status views and actions

EF-042Persona: OrganizerRoots in: event-setup

The guest list is shippable in the matrix: status and search filters live at workers/events/src/routes/guests.ts:320 and CSV-style export fields at workers/events/src/routes/guests.ts:374. The branch locks down tabs, sorting, searching, pagination, export scope, and Cluster B safety behavior.

Preconditions

Organizer can view guest list with invited, confirmed, declined, waitlisted, and cancelled guests.

Happy path / Lifecycle

  1. Open Guest List from Event Setup.

    Status tabs, search, sort, table, pagination, and export are visible without losing orientation.

  2. Filter and sort.

    URL state updates as filters change; row count and status pills update in place.

  3. Export.

    Organizer chooses current page or full match set before export request.

Failure modes

Permission denied at the right boundary

Trigger: viewer/support attempts organizer-only operation.

Resolution: the write request returns 403, the editable surface remains closed or read-only, and the response does not leak hidden guest, event, or tenant fields.

Cross-tenant isolation

Trigger: tenant-A user guesses tenant-B resource id.

Resolution: the server returns 404 instead of 403, masks existence, and the UI renders a generic not-found state.

Soft-delete leaves audit trail

Trigger: organizer removes or deactivates the configured object.

Resolution: the row is marked inactive/deleted with actor, timestamp, and prior state preserved in audit.

Archive vs delete distinction

Trigger: organizer chooses between reversible archive and destructive delete.

Resolution: archive stays reversible and copy/export labels it archived; delete requires separate destructive confirmation and changes copy behavior.

Edit lock during publish

Trigger: publish snapshot begins while an edit is open.

Resolution: publish wins; stale save receives a deterministic conflict modal and does not mutate the published snapshot silently.

Audit log row written on every state change

Trigger: organizer saves any state transition.

Resolution: each state mutation writes an audit row with actor, timestamp, entity id, and before/after payload.

Two organizers concurrent

Trigger: two organizers edit the same state from stale versions.

Resolution: the second save gets conflict UI, both sessions refresh to the same final state, and there is no silent overwrite.

Undo window for destructive actions

Trigger: organizer deletes, cancels, or clears the object.

Resolution: a visible undo affordance lasts 10 seconds and restores the exact prior state when used.

Filter state preserved in URL

Trigger: organizer applies status, search, sort, and page filters.

Resolution: URL query string preserves the full state for reload/share and satisfies the SPA-state mandate.

Pagination preserved across status tab switch

Trigger: organizer moves from page 4 confirmed to invited and back.

Resolution: each status tab restores its own page cursor instead of snapping silently to page 1.

Export during pagination scopes correctly

Trigger: organizer exports while viewing page 2 of a filtered result.

Resolution: export copy states whether it exports the current page or full match set, and the API receives the selected scope.

Stable test attributes

Visibility teeth. Each attribute must be effectively visible when active and must match the agent probes.

data-testWherePurpose
guest-list-views-pagesurfacepage
guest-list-views-tablesurfacetable
guest-list-views-status-tabssurfacestatus tabs
guest-list-views-search-filterssurfacesearch filters
guest-list-views-paginationsurfacepagination
guest-list-views-export-ctasurfaceexport cta
guest-list-views-export-scope-controlsurfaceexport scope control
guest-list-views-save-view-ctasurfacesave view cta
guest-list-views-archive-view-ctasurfacearchive view cta
guest-list-views-delete-selection-ctasurfacedelete selection cta
guest-list-views-undo-toastsurfaceundo toast
guest-list-views-conflict-modalsurfaceconflict modal

Agent test plan

- guest-list-views-opens
- guest-list-views-saves
- guest-list-views-audit-visible
- permission-denied-boundary
- cross-tenant-404
- soft-delete-audit
- archive-delete-distinction
- publish-edit-lock
- audit-row-every-change
- concurrent-organizers-conflict
- destructive-undo-window
- filter-state-preserved-url
- pagination-preserved-across-tabs
- export-pagination-scope
- evaluate-guest-list-views