← Ledger

Erid domain adoption — design

Context

Rocky-hq's named subsystems all draw from Project Hail Mary lore — rocky, eva, petrova, cairnet, lore, hearth, ralph, pebble. The operator console currently lives at rocky.devarno.cloud (per ADR 0005), and every subsystem either lives inside the console (console/src/lib/<ss>/) or is a Railway service under the devarno.cloud apex.

The acquisition of erid.tech provides a lore-faithful umbrella: Erid is the homeworld of the Eridians (Rocky's species). Promoting the rocky-hq pantheon to *.erid.tech makes the conceptual map and the DNS map agree — each subsystem becomes a first-class citizen of Erid rather than a path inside rocky.devarno.cloud or a peer Railway service under devarno.cloud.

This spec defines the citizen-name layout, the cutover for the only currently-live surface (the operator console), and the reservations for citizens whose surfaces will be activated in later ADRs.

Goal

Land:

  1. ADR 0009-erid-domain-adoption opening and ratifying the citizen-name layout below.
  2. DNS zone for erid.tech with reserved CNAMEs for every citizen, plus active records for the apex, www, and rocky.
  3. Hard cutover of the operator console from rocky.devarno.cloud to rocky.erid.tech, including Airlock TRUSTED_ORIGINS replacement and Vercel domain rebind.
  4. Static pantheon-directory page at the apex (erid.tech) that lists citizens with one-liners and links.
  5. Static docs.erid.tech reader rendering docs/decisions/ and docs/specs/ from the rocky-hq superproject (read-only).
  6. Repo-wide search-and-replace from rocky.devarno.cloudrocky.erid.tech (README, env examples, CLAUDE.md files, BRAND_ASSETS, registry.yaml).

Out of scope

Citizen layout

Citizen Subdomain Role State after this ADR
rocky rocky.erid.tech Operator console Live — production target. Replaces rocky.devarno.cloud.
eva eva.erid.tech EVA evidence/cycles surface Reserved (placeholder CNAME).
petrova petrova.erid.tech Phase-close & drift-check dashboards Reserved.
cairnet cairnet.erid.tech Public stone browser Reserved.
lore lore.erid.tech LORE narrative reader Reserved.
hearth hearth.erid.tech Phase-5 fleet manager Reserved.
ralph ralph.erid.tech Worker / run API Reserved.
pebble pebble.erid.tech CAIRNET write API Reserved.
airlock airlock.erid.tech BetterAuth SSO boundary Reserved (today on Railway, devarno.cloud).
hatch hatch.erid.tech HATCH audit-ledger surface Reserved.
relay relay.erid.tech Webhook ingress (Phase 7+) Reserved.
docs docs.erid.tech Public ADR + spec ledger reader Live — static, read-only.
www www.erid.tech Apex companion Live — 301 → apex.
<apex> erid.tech Pantheon directory Live — static landing listing citizens.

Tenant-naming rule: tenant-scoped names live one level deeper — <tenant>.rocky.erid.tech — so they cannot collide with the reserved citizen names above. The reserved citizen list is the canonical "do-not-claim" set; future ADRs may extend it but never narrow it.

Cutover (hard cut)

Executed inside a single ADR-gated window in this order. Each step is reversible up to step 5.

  1. DNS. Cloudflare zone erid.tech. Records:
    • erid.tech → static apex project (Vercel)
    • www301 https://erid.tech
    • rockycname.vercel-dns.com. (target: existing rocky-console Vercel project)
    • docs → static docs project (Vercel)
    • All other citizen names from the table above → CNAME to a coming-soon Vercel static project (prevents accidental claim, costs nothing).
  2. Vercel — rocky-console rebind. Add rocky.erid.tech and www.rocky.erid.tech as production domains on the existing rocky-console project; mark rocky.erid.tech as the canonical production domain. Do not unbind rocky.devarno.cloud yet.
  3. Vercel env. Set NEXT_PUBLIC_APP_URL=https://rocky.erid.tech on rocky-console production via vercel env add. Trigger a production deploy so the new value is live before sign-in starts pointing at the new origin.
  4. Airlock TRUSTED_ORIGINS. Atomic replace on the Railway airlock service: https://rocky.devarno.cloud,https://www.rocky.devarno.cloudhttps://rocky.erid.tech,https://www.rocky.erid.tech. Restart airlock. (Replace, not append — that is the "hard cut".)
  5. Vercel — unbind old. Remove rocky.devarno.cloud and www.rocky.devarno.cloud from the rocky-console Vercel project. After this point, the old origin returns Vercel's "domain not found" page.
  6. Repo sweep. Search-and-replace rocky.devarno.cloudrocky.erid.tech across the rocky-hq superproject (README, console/.env.example, console/CLAUDE.md, BRAND_ASSETS.md, registry.yaml, this spec). Land as a separate commit referenced from the ADR.

In-flight cookies on the old origin are sacrificed by step 4 — sessions reissue on next sign-in against the new TRUSTED_ORIGINS. That is the explicit cost of "hard cut".

Rollback lever. If the cutover wedges between steps 4 and 5, both domains are still bound on rocky-console. Reversing step 4 (restore the old TRUSTED_ORIGINS value) restores the old origin within one airlock restart. After step 5, rollback requires re-adding the domain to Vercel — still possible (the domain remains in the Vercel team account) but takes one DNS-propagation cycle. The ADR records the exact pre-cutover TRUSTED_ORIGINS value verbatim so a rollback isn't reconstructive.

Apex page

Static, single-page, server-rendered or pre-built. Contents:

The apex page is not the operator entry point — rocky.erid.tech is. The apex is a directory and identity surface.

docs.erid.tech

Static site that renders docs/decisions/*.md and docs/specs/*.md from the rocky-hq superproject. Read-only. No auth. Generated on push to main. Justification for shipping now (vs. deferring): the ADR ledger is already public-facing in spirit (referenced from CLAUDE.md as a "projection source"), the toolchain is cheap (any markdown-to-static generator pinned to the repo), and having a stable public URL for ADRs makes the cross-links from cairnet/CAIRNET_UXUI_SPEC.md and future per-citizen surfaces resolvable from outside the repo.

ADR shape

Single ADR docs/decisions/0009-erid-domain-adoption.md:

Verification

What this unlocks