## ADDED Requirements

### Requirement: Seed real preset tag registry
The system SHALL provide a `seed-registry` command that reads `db/preset_tag_ids.txt` and inserts each ID as a `tags` row (status `unset`), skipping IDs that already exist. Re-running SHALL be safe (idempotent).

#### Scenario: First run
- **WHEN** `make seed-registry` runs against an empty tags table
- **THEN** all IDs from `db/preset_tag_ids.txt` exist as `unset` tags

#### Scenario: Re-run
- **WHEN** `make seed-registry` runs again
- **THEN** no duplicate `tag_code` errors occur and the registry is unchanged

### Requirement: Registry-only claimable codes
Only codes present in the `tags` table (the registry) SHALL be claimable. A code not in the registry SHALL be rejected (existing bind behaviour). Tag codes SHALL be treated as case-sensitive (preset base64 IDs are mixed-case; the bind handler SHALL NOT normalise case).

#### Scenario: Real ID claimed
- **WHEN** an owner enters one of the 100 real preset IDs
- **THEN** the tag binds to their account (if unset)

#### Scenario: Unknown code
- **WHEN** an owner enters a made-up code
- **THEN** binding is rejected with "Tag not found, or already claimed"

#### Scenario: Mixed-case ID not uppercased
- **WHEN** an owner enters a preset ID containing lowercase letters
- **THEN** the bind matches the exact (case-sensitive) registry row

### Requirement: DEV test codes coexist
The existing `TEST000001..25` seed SHALL remain available for local development, separate from the real registry seed.

#### Scenario: Both seeds applied
- **WHEN** `make seed` and `make seed-registry` have both run
- **THEN** both TEST codes and real IDs exist and are claimable in dev
