## Why

The product is owner-facing and working (Phases 1–3). What's missing is the **admin layer**: Where Woof needs a dashboard where the operator manages users, tags, products/orders, and sees what's happening (scans, alerts, lapsed payments). The 2014 system had this via `product_accounts`/`online_orders`; the schema for it (products, orders, tag linkage) was built in Phase 2.5 — Phase 4 delivers the management UI on top, as the long-planned **Laravel + Filament** system.

## What Changes

- **New Laravel app** (`admin/`) running via **Docker** on .27 for dev (php:8.3 + composer), connecting to the **shared Postgres** on `.13:5434` (same DB as the GOAT frontend — one source of truth).
- **Auth**: admin login (Laravel session auth) gated to admin users; new `users.is_admin` flag (idempotent ALTER) so the same `users` table serves both owners and admins.
- **Admin users**: list/search owner accounts, view details (tags, scans), suspend.
- **Admin tags**: list all tags (registry + owned), view each tag's scans/alerts, **assign `product_id` + `order_id`** (the Phase 2.5 linkage), suspend/unsuspend.
- **Products & orders**: CRUD product templates; record orders (status lifecycle pending/paid/lapsed/cancelled).
- **Dashboard**: stats — tags by status, scans in last 24 h, recent scans, lapsed orders.
- **No change** to the GOAT frontend or the shared schema beyond `users.is_admin`.

## Capabilities

### New Capabilities

- `admin-auth`: admin login + gate; `users.is_admin`.
- `admin-users`: manage owner accounts.
- `admin-tags`: manage tags incl. product/order assignment + suspend.
- `admin-products-orders`: CRUD products + orders.
- `admin-dashboard`: operational stats.

### Modified Capabilities

- `database`: ADDED — `users.is_admin` column (idempotent).

## Impact

- **New**: `admin/` Laravel app (Filament panel), `admin/docker-compose.yml`, models (User, Tag, Scan, Product, Order), Filament resources, `.env` for the shared DB.
- **Schema**: idempotent `ALTER TABLE users ADD COLUMN IF NOT EXISTS is_admin BOOLEAN NOT NULL DEFAULT FALSE;`
- **Secrets**: `DB_*` env in `admin/.env` (gitignored); no real secrets committed.
- No changes to the GOAT frontend code paths.
