๐Ÿ†• New on stage โ€” 2026-06-19 โ†’ 2026-06-29. This TC covers three features shipped after the prior guide freeze: the guest profile's "Guest" type label (#368), the guest roster's server-side CSV export with formula-injection guard (#340), and PII redaction on the guest-registration roster response (#486). See the Test Plan banners and the Jun 19 / Jun 29 release notes.

Module: Guest Portal โ€” Data Handling & Security

Primary Test Users: guest@demo.membervu.com / Guest123! (Guest) ยท admin@rcme.membervu.com / Admin123! (Admin, privileged) ยท events@demo.membervu.com / Events123! (Events Manager, privileged) ยท testmember@rcme.membervu.com / Member123! (Member, non-privileged for #486)

Priority: P1 (security-adjacent โ€” #486 is a PII-exposure fix, #340 is a formula-injection fix)

Objectives

  1. Log in as the seeded guest and confirm the profile card's TYPE row displays exactly "Guest" โ€” not blank, not "Member".
  2. As an admin, export the guest roster and confirm the download comes from the server endpoint (GET /api/admin/guests/export.csv), not a client-assembled blob.
  3. Confirm a CSV cell whose source value starts with = (or +/-/@) is neutralized with a leading ' in the exported file โ€” it does not execute as a formula when opened in a spreadsheet app.
  4. Confirm a non-privileged caller's view of the event guest-registration roster omits invitedBy.email, attendee/member/guest emails, checkInCode, displayTicketCode, and the invoice sub-object for rows that are not their own โ€” while a privileged caller (or the row's own owner) still sees the full data.

Scenario summary

IDScenarioKey data assertion
GUEST3-01Guest profile card shows "Guest" typeLogin as guest@demo.membervu.com โ†’ dashboard's Profile Card TYPE row renders the exact text "Guest" (not empty, not "Member").
GUEST3-02Admin guest export is server-sideClicking "Export CSV" on /admin/guests triggers a network request to GET /api/admin/guests/export.csv that returns Content-Type: text/csv and a Content-Disposition: attachment header โ€” no client-side CSV string assembly in the page's JS.
GUEST3-03Formula-injection guard on exportA guest record with a name/email starting with = produces a CSV cell of the literal form "'=..." (leading single-quote inside the quoted cell) โ€” opening in Excel/Sheets shows it as text, not a formula.
GUEST3-04Non-privileged roster view redacts PIIAs a plain MEMBER with no EVENTS:VIEW:registrations, GET /api/events/:eventId/registrations/guests response rows for OTHER attendees/guests have attendeeEmail/memberEmail/guestEmail/checkInCode/displayTicketCode absent and invoice: null; the caller's own row keeps them.
GUEST3-05Inviter email redacted for non-privilegedSame non-privileged call: a GUEST row's invitedBy object keeps id/firstName/lastName but has NO email property.
GUEST3-06Privileged caller sees full rosterAs Events Manager (EVENTS:VIEW:registrations), every row โ€” including other attendees' and guests' โ€” has checkInCode, emails, displayTicketCode, invoice, and invitedBy.email populated.

โžก๏ธ Full click-by-click steps: TC-GUEST-003 (Detailed).