← Ledger

0009 — Erid domain adoption: promote the rocky-hq pantheon to erid.tech

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 ADR amends ADR 0005: rocky-console remains the production Vercel project and is NOT retired. Only the domain binding changes — rocky.devarno.cloud is replaced with rocky.erid.tech as the canonical production domain for the operator console.

Decision

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 sequence

The cutover executes in this fixed, reversible order inside a single ADR-gated window. Each step is reversible up to step 5.

  1. DNS. Create Cloudflare zone erid.tech. Add records:

    • erid.tech → static apex project (Vercel erid-apex). Post-condition: dig +short erid.tech resolves.
    • www.erid.tech → CNAME cname.vercel-dns.com. (301 to apex via Vercel redirect). Post-condition: curl -sI https://www.erid.tech returns 301.
    • rocky.erid.tech → CNAME cname.vercel-dns.com. (target: rocky-console). Post-condition: dig +short rocky.erid.tech resolves.
    • docs.erid.tech → CNAME cname.vercel-dns.com. (target: erid-docs). Post-condition: dig +short docs.erid.tech resolves.
    • All other reserved citizen names → CNAME cname.vercel-dns.com. (target: erid-coming-soon). Post-condition: no NXDOMAIN for any reserved name.
  2. Vercel — rocky-console rebind. Add rocky.erid.tech and www.rocky.erid.tech as production domains on the existing rocky-console Vercel project; mark rocky.erid.tech as the canonical production domain. Do not unbind rocky.devarno.cloud yet. Post-condition: https://rocky.erid.tech and https://rocky.devarno.cloud both serve the console.

  3. Vercel env — NEXT_PUBLIC_APP_URL. Set NEXT_PUBLIC_APP_URL=https://rocky.erid.tech on rocky-console production. Trigger a production deploy. Post-condition: the served page's canonical URL references rocky.erid.tech.

  4. Airlock TRUSTED_ORIGINS. Atomic replace on Railway airlock service (project DEVARNO • CLOUD, env production): https://rocky.devarno.cloud,https://www.rocky.devarno.cloudhttps://rocky.erid.tech,https://www.rocky.erid.tech. Preserve all other entries verbatim. Restart airlock. Wait until /health returns 200. Post-condition: BetterAuth sign-in resolves to rocky.erid.tech without 302-loop. This is the "hard cut" — in-flight sessions on the old origin are sacrificed.

  5. Vercel — unbind old. Remove rocky.devarno.cloud and www.rocky.devarno.cloud from rocky-console. Post-condition: curl -sI https://rocky.devarno.cloud returns Vercel's "domain not found" response.

  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, cairnet/CAIRNET_UXUI_SPEC.md). Land as a separate commit referenced from this ADR. Post-condition: git grep 'rocky\.devarno\.cloud' returns matches only in docs/decisions/0005-rocky-domain-cutover.md and this ADR.

Rollback lever

If the cutover wedges between steps 4 and 5, both domains are still bound on rocky-console. Reversing step 4 (restoring the old TRUSTED_ORIGINS value below) restores sign-in against rocky.devarno.cloud within one airlock restart. After step 5, rollback additionally requires re-adding rocky.devarno.cloud to Vercel (still possible — the domain stays in the team account) and waiting one DNS-propagation cycle.

The pre-cutover TRUSTED_ORIGINS value is recorded verbatim here so a rollback is not reconstructive:

Pre-cutover Airlock TRUSTED_ORIGINS (verbatim)

Captured 2026-05-08T15:25Z from Railway service airlock, environment production, project DEVARNO • CLOUD, before the swap.

TRUSTED_ORIGINS=https://airlock.devarno.cloud,https://hubble.devarno.cloud,https://hatch.devarno.cloud,https://rocky.devarno.cloud,https://www.rocky.devarno.cloud

Cutover state captured

These subsections are appended during the cutover (Tasks 5–8); they are empty here at ADR open time. Task 9 (ratification) confirms all are filled.

DNS zone

Vercel project bindings and deploy SHAs

Airlock TRUSTED_ORIGINS rollout

TRUSTED_ORIGINS=https://airlock.devarno.cloud,https://hubble.devarno.cloud,https://hatch.devarno.cloud,https://rocky.erid.tech,https://www.rocky.erid.tech

rocky.devarno.cloud unbind

Consequences

What this decision does NOT do

References

Amendments

(None yet — append future per-citizen activation entries as ### YYYY-MM-DD: <citizen>.erid.tech bound to <project> subsections.)