Airtable is retired fleet-wide; DSN Postgres is the structured-data substrate
Date: 2026-08-10 Status: open Supersedes: none Superseded-by: none — current
Context
Section titled “Context”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.
Decision
Section titled “Decision”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.
Alternatives considered
Section titled “Alternatives considered”- 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.
Consequences
Section titled “Consequences”For code:
Seven PRs across five repos, all merged:
| Repo | PR | What changed |
|---|---|---|
rocky-hq/console | #53 | 15 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 | #5 | 45 files — agent corpus, OPTIM-N8N-SUITE.md, COUNCIL-WORKFLOWS.md |
devarno-cloud/atlas | #38 | zoid deployment runbook + 2 skills |
so1-io/doc-generator | #1 | n8n node + docs at source |
devarno-cloud/atlas | #39 | broken sync-so1-docs.yml path + stale apps/so1/** content |
v01t-io/server | #23 | 4 missed airtable: null seed files |
rocky-hq/rocky | #126 | console 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.airtablenodes becamen8n-nodes-base.postgres. The parameter shapes differ (application/table/fields→schema/table/columns,typeVersion2.6,postgrescredential), 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-hubbleandv01t-io/server— there is noALTER TYPE … DROP VALUE. AnnotatedRETIRED, read-compatibility only. - Applied migrations — history, not configuration.
- Dated historical record —
learnings/,campaigns/,findings/,doctrines/,decisions/. Rewriting these would falsify what was true then. reactr-devand atlas’sreactr//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.
References
Section titled “References”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.
Sign-off
Section titled “Sign-off”- 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 closed → open accordingly, and petrova validate now enforces it.
The retirement itself is unchanged and remains verified; open denotes the
missing countersign, nothing more.