deckhearth/.convoys/pick-a-name.md
Randall Stillwell 989b7fab29 convoy: scope pick-a-name (Deck Hearth wins, last open P1 brand decision)
Operator gate-0 ratified 2026-05-24: Deck Hearth wins (more distinctive
brand, the brand the rendered Layout header already displays). The trade
is real — already-shipped infrastructure ID is the losing name —
so this convoy is non-trivial-sed and needs architect slicing.

Scoping rules baked into the convoy file:
- Repo + Vercel rename DEFERRED to follow-up convoy
  rename-repo-and-vercel-project (auto-redirects make it low-urgency)
- Redis prefix migration IN SCOPE (lib/rate-limit.js uses
  tcgvault:auth/search/upload/generate/import; rename atomic; accept
  one-time per-15-min / per-1-hour counter reset, no user impact)
- Admin email migration IN SCOPE (admin@tcgvault.com -> proposed
  admin@deckhearth.com; needs in-DB UPDATE script)
- package.json name rename IN SCOPE (we don't publish, contained blast)
- DNS / domain OUT OF SCOPE (operator doesn't own the domain yet)
- Brand asset regen OUT OF SCOPE (favicon + OG images need design pass)

5 named decisions (D1-D5) operator-ratified at gate-1: canonical
display string, canonical kebab, canonical camel/lower, canonical admin
email, canonical Redis prefix. No architectural decisions; this is a
pure naming convoy where the architect proposes the canonical shapes
and the operator picks.

Cross-cutting smoke + visual-diff blast flagged (smoke spec text
matchers + visual baselines both predicate on current brand strings;
the adopt-playwright-smoke Decision 4 continue-on-error swallow buys
us cover but the queued seed-visual-baselines-on-linux convoy gets
harder until this lands).

Architect dispatched next on convoy/pick-a-name. No code yet.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-24 23:19:14 -05:00

141 lines
7.7 KiB
Markdown

# pick-a-name (P1 — pre-launch brand consistency)
**Status:** in-progress
**Priority:** P1 (pre-launch; not a security blocker, but a brand-consistency
blocker that touches every user-facing surface)
**Convoy owner:** parent (orchestration); `role-architect` then
`role-implementer(s)` then `role-doc-writer`
**Opened:** 2026-05-24
**Operator decision (gate-0, already ratified):** **Deck Hearth wins.**
## Problem
`AGENTS.md` line 5 has called this out since project setup: the repo, README,
seed data, package name, infrastructure, and admin email all say **"TCG
Vault"** (and the kebab `tcg-vault` / camel `tcgvault` variants), while the
actual rendered header brand in `components/Layout.js` says **"Deck Hearth"**.
Two distinct names, two distinct visual brands (the `AnimatedFireLogo.js`
component is also affected). Pre-launch this MUST be one name end-to-end.
## Operator's brand decision (gate-0)
**Deck Hearth wins.** Rationale (operator-stated): more distinctive, more
ownable, and the brand the human-facing surface (Layout header) already
renders. The trade is real: this is the higher-cost path because the
already-shipped infrastructure ID is the *losing* name. The architect's job
is to scope and minimize that cost — NOT to re-litigate the brand decision.
## Initial surface inventory (architect to expand)
Pre-architect rough hit-count from `rg`, scoped to non-vendor files:
| Surface | Files (sample) | "TCG Vault" or `tcg(-)?vault` hits |
| --- | --- | --- |
| Marketing copy | `README.md`, `pages/index.js`, `pages/login.js`, `pages/signup.js` | 4 + 5 + 4 + 1 |
| Brand components | `components/AnimatedFireLogo.js`, `components/ShareModal.js` | 4 + 1 |
| Seed scripts (admin email) | `scripts/setup-neon-db.js`, `scripts/create-test-users.js`, `scripts/seed-collections-*.js` | 2 + 7 + 6 |
| Test guides | `TESTING_GUIDE.md` | 7 |
| **Infrastructure-bound (rename has external blast)** | `package.json`, `lib/rate-limit.js` (Redis prefix), `.github/workflows/*.yml` | 1 + 5 + 3 |
| **Already-correct (Deck Hearth)** | `components/Layout.js`, `styles/globals.css`, `components/AnimatedFireLogo.js` partial | n/a (these stay) |
## Hard scoping rules
- **Strictly NO re-litigating the brand decision.** Deck Hearth wins; the
architect ratifies *how* to rename, not *whether* to.
- **Keep the repo `tcg-vault` for now.** GitHub rename is a separate concern
(auto-redirects work, but Vercel-link / `gh` configs / local remotes /
bookmarks all need touching). Track as a queued follow-up convoy
`rename-repo-and-vercel-project`. This convoy renames the **product brand
in-app**; the repo/Vercel rename is a downstream convoy.
- **Redis prefix migration is in scope.** `lib/rate-limit.js` uses
`tcgvault:auth/search/upload/generate/import` as Redis key prefixes. These
must rename to `deckhearth:*` (or similar) atomically with the convoy.
Accept the one-time rate-limit-state reset (counters are per-15-min /
per-1-hour anyway; no user-perceptible impact).
- **Admin email migration is in scope.** `admin@tcgvault.com` rename to
`admin@deckhearth.com` (or similar — architect proposes the canonical
email, operator ratifies). Includes the in-DB UPDATE for any existing
`admin@tcgvault.com` row (write a one-off `scripts/migrations/YYYY-MM-DD-
rename-admin-email.js` per the no-go-zones rule for new migrations).
- **`package.json` name field:** rename to `deck-hearth` in this convoy
(npm package name; we don't publish, so blast is contained to lockfile +
any local script reference).
- **Lockfile regeneration:** the architect ratifies whether to regenerate
`package-lock.json` in this convoy or accept the rename mismatch
short-term. (Recommended: regenerate; cheap; matches package.json shape.)
- **DNS / domain:** out of scope — separate convoy
`point-domain-at-deckhearth` (you don't own a `deckhearth.*` domain yet
per operator's pre-convoy statement; if/when acquired, that triggers DNS).
- **Favicon / OG images / social cards:** in scope IF source files exist;
defer to follow-up convoy `regenerate-brand-assets` if they need new design.
## Architect deliverables
1. **Full surface inventory** — every occurrence of `TCG Vault`, `tcgvault`,
`tcg-vault`, plus every occurrence of `Deck Hearth` / `deck-hearth` /
`deckhearth` (the latter set tells you what's *already* correct and what
shape collisions need handling, e.g., if Layout.js has `Deck Hearth` but
AnimatedFireLogo.js has `DECKHEARTH` — pick canonical casing).
2. **Canonical-string ratification:** propose the canonical product name
("Deck Hearth" with internal-cap; or "Deckhearth" one word; or other);
the canonical kebab (`deck-hearth`); the canonical camel/lower
(`deckhearth`); the canonical admin email (`admin@deckhearth.com` or
variant); the canonical Redis prefix (`deckhearth` or `dh`). Mark each as
D1-D5 (operator gate-1 for all five — they're naming choices, not
architectural ones).
3. **Slice plan:** probably 2-3 briefs. Suggested split (architect can
change): Brief 1 = in-repo string sweep + AnimatedFireLogo brand update
(mechanical); Brief 2 = Redis prefix migration in `lib/rate-limit.js` +
admin-email DB migration script + package.json rename + lockfile
regen (operationally riskier — needs careful testing). Brief 3 (if
needed) = visual baseline reset (because the smoke + visual-diff specs
will all fail with the new brand).
4. **Boot-the-brief verification** for each: confirm specs compile, lint
passes, vitest passes, smoke can still run against a preview.
5. **Out-of-scope queued follow-ups:** explicit list (repo rename, Vercel
project rename, DNS / domain acquisition, brand asset regeneration,
social card refresh).
## Known constraints
- **Cross-cutting smoke/visual diff blast.** PR-#18's Playwright smoke spec
("sign-in page renders") + the visual-diff baseline are both predicated on
the *current* brand strings. Brief 2 (or Brief 3 if split) MUST update
the smoke spec expectations and either regenerate visual baselines or
accept temporary baseline drift (the `adopt-playwright-smoke` Decision 4
`continue-on-error` swallow is still in effect, so visual-diff drift
won't fail CI — but the queued `seed-visual-baselines-on-linux` convoy
becomes harder to ship until *after* this convoy lands).
- **Smoke spec lives at `tests/smoke/app.smoke.spec.ts`.** Likely needs
one-or-two-character edits to text matchers.
- **`AGENTS.md` line 5's branding note** is the canonical historical record
of the inconsistency; the doc-writer pass MUST update it from "Pick one
before launch" to "Deck Hearth (decided 2026-05-24 in `pick-a-name`
convoy; commit X)."
- **Operator-action-required pre-merge:** smoke-test the rebranded preview
manually before merge (every public page should render "Deck Hearth";
login + register should still work; admin import UI should still
function with the renamed admin user).
## Out of scope (queued follow-ups)
- `rename-repo-and-vercel-project` — GitHub repo rename + Vercel project
rename + local git remote update. P2 polish. Auto-redirects make this
low-risk-low-urgency.
- `point-domain-at-deckhearth` — DNS / domain. Blocked on domain
acquisition (operator pre-convoy: doesn't own `deckhearth.*` yet).
- `regenerate-brand-assets` — favicon, OG images, social cards. P2
polish; requires design pass.
- `migrate-existing-user-emails` — if any existing user accounts have
`@tcgvault.com` emails (besides admin), propose a migration. Architect
to surface count via a `rg`/DB query during inventory.
## Owns
`role-architect` (decisions D1-D5, slice plan) → `role-implementer(s)`
(per brief) → `role-doc-writer` (AGENTS.md line 5 + this file's
As-shipped + ship-readiness Status summary footer).
## As-shipped
(To be appended post-merge by `role-doc-writer`.)