Skip to content

Airtable is retired fleet-wide; DSN Postgres is the structured-data substrate

Date: 2026-08-10 Status: open Supersedes: none Superseded-by: none — current

Airtable had accumulated across the fleet as the default structured-data store: business metrics in rocky-hq/console, council and optimisation records in so1-io/zoid, seed content in v01t-io/server, an n8n logging node in so1-io/doc-generator, plus eight environment variables across three Vercel projects (cloud-hubble, eva, host-skuld).

A read of the actual call sites showed most of it was never live. rocky-hq/console/src/lib/workbench/engine.ts:10-14 documents its own pipeline as stubbed — including step 5, “Write to Airtable via RELAY”. Every pebble.airtable.list_records:* in templates.ts is a string literal that is never resolved; data-dir.ts:11 says the local data-dir “migrates to Airtable via RELAY as data sources come online”, and RELAY never came online. so1-io/zoid is Status: draft (standalone/zoid/README.md:26) and its AIRTABLE_COUNCIL_BASE_ID / AIRTABLE_OPTIM_BASE_ID exist in no environment — a scan of all 72 Vercel projects returned zero, and the n8n vars at hab.so1.io were never set per that checklist’s own “Add all of these” step.

So the question was not “what breaks if Airtable goes away” — nothing read it at runtime — but “what should these systems name as their substrate instead”. The answer already existed: SPEC-DSN-09 sets the pattern of a dedicated Postgres schema on the panel-1 host with a read-only Grafana role, and OPTIM-N8N-SUITE.md:87 already said “Grafana dashboards track optimisation health”. Airtable was only ever the record store under a Grafana read path.

Airtable is retired fleet-wide as a structured-data substrate. Systems that named it now name DSN Postgres (devarno-cloud/deep-space-network), each in its own schema following the SPEC-DSN-09 pattern — isolated from operational databases, read by Grafana through a read-only role. All Airtable environment variables are removed from Vercel.

Plausible is explicitly not a replacement. Plausible is pageview analytics, not a record store, and cannot serve MRR, subscriber counts, campaign spend, or grace_traces quality scores. It appears nowhere live in the fleet.

  • Plausible as the replacement — wrong product class; it cannot hold records, only pageviews.
  • Keep Airtable — a recurring cost and a third data plane for a substrate no runtime path read.
  • Per-repo ad-hoc stores — fragments the read path away from the single Grafana surface these systems already assume.

For code:

Seven PRs across five repos, all merged:

RepoPRWhat changed
rocky-hq/console#5315 files — writeToAirtable/airtableTable fields and plugin/airtable-snapshot removed; source: identifiers rewritten to DSN/Postgres; both ROCKY-*-CORPUS.yml substrate lines rewritten
so1-io/zoid#545 files — agent corpus, OPTIM-N8N-SUITE.md, COUNCIL-WORKFLOWS.md
devarno-cloud/atlas#38zoid deployment runbook + 2 skills
so1-io/doc-generator#1n8n node + docs at source
devarno-cloud/atlas#39broken sync-so1-docs.yml path + stale apps/so1/** content
v01t-io/server#234 missed airtable: null seed files
rocky-hq/rocky#126console submodule pointer bump to d57bf31

Three parts were not a find-and-replace, and a reader should not assume they were:

  • Three n8n-nodes-base.airtable nodes became n8n-nodes-base.postgres. The parameter shapes differ (application/table/fieldsschema/table/ columns, typeVersion 2.6, postgres credential), so a rename alone would have shipped workflows that fail on import.
  • Five Grafana panels used a pseudo-query (FROM airtable.optimisation_runs SELECT SUM(cost_usd) GROUP BY date) that no datasource speaks. These are now real SQL.
  • Four base/table definitions became Postgres DDL (zoid_council, zoid_optim), with enum types replacing Airtable single-selects.

For environments:

Eight Vercel environment variables deleted: cloud-hubble 23→20, eva 8→6, host-skuld 12→9. A fleet-wide re-scan of all 72 projects returns zero Airtable variables.

Vercel applies environment variables at build time and a running deployment keeps the values it was built with. eva and host-skuld therefore keep working now; the loss lands on their next deploy. Recorded here so that failure is not later misdiagnosed as a new bug.

Three distinct API tokens remain live at Airtable and are revoked on the operator’s schedule, not by this decision: the cloud-hubble token (nothing reads it — safe to revoke now), the EVA queue token, and the kalops token (until SKULD C3).

What deliberately still carries Airtable, each for a stated reason:

  • The EVA task queue — live by owner choice (eva-hq, skyflow-me/bin/seed-eva-queue.sh, stratt-hq). Scrubbing the docs would make them describe a system that does not exist.
  • SKULD fold archives — editing them fights C1’s history-preserving extraction.
  • Postgres enum values in cloud-hubble and v01t-io/server — there is no ALTER TYPE … DROP VALUE. Annotated RETIRED, read-compatibility only.
  • Applied migrations — history, not configuration.
  • Dated historical recordlearnings/, campaigns/, findings/, doctrines/, decisions/. Rewriting these would falsify what was true then.
  • reactr-dev and atlas’s reactr//v01t/ — separate products whose catalog substrate needs its own decision. Out of scope here by choice, not by oversight.

Open risk — the replacement is not built:

SPEC-DSN-09 is status: DRAFT. Grafana, Prometheus, and Loki on panel-1 are live per the 2026-07-06 rebuild runbook, but the analytics collector and the Postgres schemas are specified, not built. Every dsn.postgres:* identifier written by these PRs resolves to nothing today — exactly as the Airtable ones did. This decision changed which substrate those systems wait on, not whether they wait. Nothing here should be read as working wiring.

For docs:

devarno-cloud/atlas’s sync-so1-docs.yml sparse-checked docs/atlas, a path none of the seven SO1 repos has — all use docs/choco (verified via the contents API: seven 404s, seven populated docs/choco). The workflow has zero recorded runs, and every commit touching apps/so1/** is hand-authored. That content was an orphaned copy, not a mirror; nothing would have overwritten it, and the references there would have persisted indefinitely. #39 fixes both the workflow path and the content.

For in-flight phases:

  • SKULD C1 remains gated on five owner credential rotations; unchanged by this.
  • SKULD C3 gates revocation of the kalops Airtable token.

For invariants:

None. No MR-N added, modified, or repealed.

  • SPEC-DSN-09-null0-analytics.yaml (status: DRAFT) — the schema + read-only Grafana role pattern this adopts.
  • 2026-07-06 panel-1 rebuild runbook — Grafana / Prometheus / Loki liveness.
  • PRs: rocky-hq/console#53, so1-io/zoid#5, devarno-cloud/atlas#38, so1-io/doc-generator#1, devarno-cloud/atlas#39, v01t-io/server#23, rocky-hq/rocky#126.
  • docs/decisions/2026-08-06-petrova-host-apex-re-root.md — Sign-off convention followed below.
  • Subagent: petrova-control-plane (2026-08-10)
  • Human countersign — the fleet-wide retirement, the eight env-var deletions, and the deliberate exceptions listed above.

The countersign is left unchecked deliberately. An attestation is not an agent’s to write.

Appended 2026-08-10, same day. This doc was merged at Status: closed with the note that closed meant “work landed and verified, not countersigned” — the same shape as 2026-08-06-petrova-host-apex-re-root.md, which flagged that combination as an open question. The operator has since ruled it a contradiction: see 2026-08-10-countersign-gates-closed-status.md. **Status:** is changed closedopen accordingly, and petrova validate now enforces it. The retirement itself is unchanged and remains verified; open denotes the missing countersign, nothing more.