## ADDED Requirements

### Requirement: Import is reached from the guest list (P1)
Bulk CSV import SHALL be reached from the guest-management screen as a modal dialog opened by
an Import control placed with the screen's other list-building actions, and SHALL NOT have a
screen of its own. The control SHALL be shown only to an admin holding the import permission,
and the previous standalone import address SHALL send an admin who reaches it to the guest
list rather than failing.

#### Scenario: Opening import
- **WHEN** an admin with import permission activates the Import control on the guest screen
- **THEN** the import flow opens in a modal over the guest list, with the list still visible behind it

#### Scenario: Without import permission
- **WHEN** an admin who lacks the import permission views the guest screen
- **THEN** no Import control is offered, and the import endpoints continue to refuse them on their own authority

#### Scenario: Following an old import link
- **WHEN** an admin opens the address the standalone import screen used to occupy
- **THEN** they arrive at the guest list, from which import is reachable

#### Scenario: Dismissing without importing
- **WHEN** an admin closes the modal before committing, whether by the close control, the backdrop, or Escape
- **THEN** nothing is written, and the guest list is unchanged

### Requirement: Import destination comes from the screen (P0)
The event a CSV imports into SHALL be the event selected on the guest screen. The import
control SHALL be unavailable while no event is selected, and SHALL state that an event must be
chosen first. The modal SHALL name the destination event and SHALL NOT offer a second control
for choosing it, so the destination an admin reads on the list is the destination that is
written. An `events` column in the sheet remains ignored.

#### Scenario: No event selected
- **WHEN** the guest screen is showing records across all events
- **THEN** the Import control is disabled and explains that an event must be chosen, because a guest belongs to exactly one event

#### Scenario: Event selected
- **WHEN** an admin selects an event in the filter and opens import
- **THEN** the modal names that event as the destination and every valid row joins that event's list

#### Scenario: Destination cannot be contradicted
- **WHEN** an uploaded sheet contains an `events` column naming other events
- **THEN** the column is ignored and all rows still join the event selected on the screen

### Requirement: Import outcome is reflected in the list behind it (P1)
A committed import SHALL report what it did — counts of created, merged and skipped rows, with
the per-row reasons for skipped rows — and the guest list underneath SHALL be refreshed so the
imported rows are visible without the admin reloading the screen.

#### Scenario: Successful import
- **WHEN** an admin commits an import of valid rows
- **THEN** the result counts are reported and the guest list behind the modal shows the imported guests under the current filters

#### Scenario: Partially valid file
- **WHEN** a committed file contained rows that could not be imported
- **THEN** the skipped rows and their reasons remain readable after the commit, and the valid rows are present in the refreshed list

### Requirement: Import validation is unchanged by its new surface (P0)
Moving import into the guest screen SHALL NOT change what import does: the mandatory
pre-commit validation report, per-row error reporting, within-event duplicate merging, the
accepted column set, and the two-step preview-then-commit behaviour all SHALL behave as they
do today.

#### Scenario: Preview before write
- **WHEN** a file is chosen in the modal
- **THEN** it is validated and reported on without anything being written, and no rows are created until the admin confirms

#### Scenario: Merge reporting
- **WHEN** rows match guests already on the selected event's list by phone or email
- **THEN** the report says they will be merged rather than duplicated, and matches on other events' lists are not counted
