# Data Model: Watch Event

**Feature**: 017-watch-event
**Date**: 2026-03-12

## Entities

### StoredEvent (existing — localStorage)

No schema change. The existing `StoredEvent` interface already supports the watcher state:

```
StoredEvent {
  eventToken: string        # Required — event identifier
  organizerToken?: string   # Present → organizer role
  title: string             # Required — display in event list
  dateTime: string          # Required — grouping/sorting
  rsvpToken?: string        # Present → attendee role
  rsvpName?: string         # Present with rsvpToken
}
```

**Watcher state**: A `StoredEvent` with only `eventToken`, `title`, and `dateTime` populated (no `organizerToken`, no `rsvpToken`). This state already occurs naturally after RSVP cancellation.

## Role Hierarchy

```
organizerToken present  →  "Organizer"  (highest precedence)
rsvpToken present       →  "Attendee"
neither present         →  "Watching"   (new label, lowest precedence)
```

## State Transitions

```
                    ┌──────────────┐
         watch()    │              │   un-watch()
  (not stored) ───► │   Watching   │ ───► (not stored)
                    │              │
                    └──────┬───────┘
                           │ RSVP
                           ▼
                    ┌──────────────┐
                    │              │
                    │  Attending   │
                    │              │
                    └──────┬───────┘
                           │ Cancel RSVP
                           ▼
                    ┌──────────────┐
                    │              │   un-watch()
                    │   Watching   │ ───► (not stored)
                    │              │
                    └──────────────┘
```

Note: Organizer state is set at event creation and cannot be removed through this feature. The bookmark icon is non-interactive for organizers.

## No Backend Changes

This feature does not introduce any new database entities, API endpoints, or server-side logic. All data is stored in the browser's localStorage.
