## Why

Anti-scam requires that only **preset, manufactured tag IDs** can be claimed — no user-created codes. The 100 real preset product IDs were recovered from the manufacturer list (`Where_woof_0_100.xls` → `db/preset_tag_ids.txt`) and confirmed as the actual tags (URLs sent to the manufacturer). This change (1) seeds that real registry so those IDs are claimable, and (2) adds the **products/orders schema** so each tag can be linked to a sold product and order — the stronger validation model the 2014 system had (`products` / `online_order_product_details` / `product_id_hashes`).

## What Changes

- **Registry seeding**: a `seed-registry` command (Makefile target) reads `db/preset_tag_ids.txt` and inserts the 100 real product IDs into `tags` (status `unset`), idempotently. DEV `TEST000001..25` codes remain for local testing; production seeding uses the real registry.
- **Products table**: `products` (sku unique, name, item_type, timestamps) — the product template (old `products` / `id_products`).
- **Orders table**: `orders` (account reference, status lifecycle pending/paid/lapsed/cancelled, timestamps) — sales record (old `online_orders`).
- **Tag linkage**: `tags` gains nullable `product_id` and `order_id` FKs — linking each tag to what it is and who bought it (old `online_order_product_details` + `product_id_hashes` mapping). No change to the claim flow yet (binding remains registry-by-code); the linkage is populated by the Laravel admin (Phase 4) and powers billing (Phase 5).
- No app behaviour change to auth/tags/scan in this change.

## Capabilities

### New Capabilities

- `tag-registry`: real preset IDs are seedable into the registry; binding remains registry-only; unknown/self-made codes stay rejected.
- `product-orders`: products + orders tables and the tag→product→order linkage exist for admin/billing (Phase 4/5).

### Modified Capabilities

- `database`: ADDED — `products`, `orders` tables; `tags.product_id`, `tags.order_id` columns.

## Impact

- **New**: `frontend/cmd/seed-registry/main.go` (reads `db/preset_tag_ids.txt`), Makefile `seed-registry` target, `db/preset_tag_ids.txt` (already committed, `833c292`).
- **Schema**: `db/schema.sql` gains `products`, `orders` + two `ALTER TABLE tags ADD COLUMN IF NOT EXISTS` lines (idempotent); sqlc regenerated (new models; no new queries needed yet).
- **No change** to handlers, templates, or the scan flow.
