## Why

Physical tags break (the user has a broken tag to test with). Owners need to **close** a tag (deactivate it, keeping data) and **move** a tag's details to a new tag (replacement tag) without re-entering everything. Also, the user's physical tags from the old system print URLs in the old format (`?x=5&productid=…`) — those need to redirect to the new `/t/{code}` pages so old tags work as-is.

## What Changes

- **`closed` tag status**: `tags.status` gains `closed` (constraint updated idempotently). Owner can close their own tag → public page shows "closed by its owner", data kept. Admin sees it in the status options.
- **Move**: owner enters a new tag code → the new tag (must exist in the registry, be unset) is bound and **copies all details** (item type, description, photo, phone, address, notes, sms toggle) from the old tag; the old tag is closed. Ideal for broken-tag replacement.
- **Old-URL redirect**: `/` with a `productid` query param redirects to `/t/{productid}` (legacy physical QR URLs).

## Capabilities

### New Capabilities

- `tag-lifecycle`: owner close + move actions.

### Modified Capabilities

- `database`: ADDED — `closed` in the tags status CHECK.
- `tag-management`: ADDED — close + move handlers; account UI actions.
- `public-tag-page`: ADDED — closed state renders "unavailable".

## Impact

- **Schema**: status CHECK gains `closed` (drop/re-add idempotent).
- **Go**: `CloseTag`, `MoveTag` handlers; Home compat redirect; account panel + tag-list template actions.
- **Admin**: TagResource status options + badge include `closed`.
- No changes to the alert pipeline (closed tags are gated by status via existing suspended/closed page behaviour — note: alert gating currently keys on `sms_enabled`/order; a closed tag should also stop alerts — add a closed check in shouldAlert).
