← All stories

BRANCH · ef-004-address-book-contacts

Address Book contacts

EF-004Persona: Organizer adminRoots in: admin-shell-accessMatrix: Partial

Contact creation and reuse exist as guest substrate, but reusable Address Book UI and contact-level event invitation history are incomplete. This branch locks the admin-level contact management contract and its gap probe.

Preconditions

Organizer admin can access tenant Address Book; fixture includes duplicate email contacts, tagged contacts, and contacts with event activity.

Happy path

  1. Open Address Book contacts.

    A searchable, filterable table lists reusable contacts independently of a single event.

  2. Create or edit a contact.

    The form captures identity, email, phone, address, tags, notes, privacy fields, and custom fields.

  3. Merge duplicate contacts and inspect history.

    Duplicate email merge preserves event invitation and attendance history with auditable before/after state.

Failure modes

Permission denied at the right boundary

Trigger: viewer edits a contact.

Resolution: 403, edit controls disabled, no hidden PII leaks.

Cross-tenant isolation

Trigger: tenant A user guesses tenant B contact id.

Resolution: 404 masks contact existence.

Soft-delete leaves audit trail

Trigger: organizer deletes a reusable contact.

Resolution: contact is soft-deleted with actor, timestamp, and prior state.

Archive vs delete distinction

Trigger: organizer archives a contact versus deletes it.

Resolution: archive hides from default invite flows; delete is destructive and separately confirmed.

Edit lock during concurrent operations

Trigger: contact merge starts while edit drawer is open.

Resolution: stale save gets conflict modal and cannot unmerge data.

Audit log row on every state change

Trigger: contact identity, tags, notes, merge, archive, or delete changes.

Resolution: contact audit row records field-level before/after.

Two organizers concurrent

Trigger: two organizers edit the same contact.

Resolution: version conflict prevents silent overwrite.

Undo window for destructive actions

Trigger: contact archive, delete, or merge is submitted.

Resolution: 10 second undo restores the exact prior contact set when permitted.

Duplicate email merge loses event history

Trigger: same email appears in two reusable contacts.

Resolution: merge keeps all invitation, attendance, RSVP, and note lineage.

Contact history missing or incomplete

Trigger: organizer opens activity panel for a reused contact.

Resolution: gap panel stays visible until event invitation and attendance history render by contact.

Tag and note privacy bleed

Trigger: private note exists on a contact reused across events.

Resolution: note visibility follows tenant/admin role and never appears on public registration.

Capability gap: full Address Book UI missing

Trigger: matrix marks EF-004 partial.

Resolution: visible gap panel remains until reusable contact UI and contact-event history are complete.

Stable test attributes

Visibility teeth. Each attribute must be effectively visible when active.

address-book-contacts-pagePageContacts root
address-book-contact-tablePageContacts table
address-book-contact-searchToolbarSearch and filters
address-book-contact-paginationFooterPagination
address-book-contact-bulk-barToolbarBulk actions
address-book-contact-formDrawerCreate/edit form
address-book-contact-email-inputFormEmail input
address-book-contact-delete-ctaDrawerDelete contact
address-book-contact-merge-modalModalMerge duplicates
address-book-contact-history-panelDrawerEvent history
address-book-contact-gap-panelPagePartial gap
address-book-contact-undo-toastToastUndo destructive action

Agent test plan

- contacts-table-renders
- contact-create-or-edit
- contact-merge-history
- permission-denied-boundary
- cross-tenant-404
- soft-delete-audit
- archive-delete-distinction
- merge-edit-lock
- audit-row-every-change
- concurrent-organizers-conflict
- destructive-undo-window
- duplicate-merge-preserves-history
- contact-history-gap
- tag-note-privacy
- contacts-gap-probe
- evaluate-address-book-contacts