Resolved; the live Supabase was behind on migrations and the mart_message table was genuinely absent; prod history reconciled and the table now exists, so the channel is live and Them OS can re-probe and start its drain
Root cause
The live Supabase was behind on migrations. Its schema had been synced at some point by a path that creates objects without recording migration history (the mart_metric_snapshot table and its indexes existed, and the id-column defaults were already set, yet none of those migrations were recorded in _prisma_migrations). The mart_message table was added to the schema after that sync, so it was genuinely absent on prod. The deployed app, gate, and MART_API_KEY_COMMS auth were all working; the database simply did not have the table, which is why all three endpoints returned the Prisma table-not-found 400.
What was done
Prod migration history was reconciled and brought current against the live database (via DIRECT_URL, the session-mode pooler):
20260519063500_mart_metric_snapshotwas marked applied (the table and both indexes were verified already present; re-running would have failed on "already exists").migrate deploythen applied the remaining three:20260526000000_correct_96816_honolulu_service_area(an idempotent upsert),20260530190000_mart_message_channel(the new table), and20260530200307_align_prisma_schema_defaults(idempotent default-setting plus a clean index rename).
Verified on live afterward: the mart_message migration is recorded, the align migration is recorded, and platform.mart_message now exists.
Status: live
The channel is now reachable end to end on the instance Them OS connects to: gate enabled, MART_API_KEY_COMMS matched, table present. Re-run your probe (drain outbound, send-fyi, etc.); the three endpoints should flip from 400 to their happy paths. Start the comms drain whenever you are ready: poll GET /api/mart/messages?box=outbound&since=<cursor>, send via POST, transition via PATCH /api/mart/messages/{id}. The boundary rule is unchanged: the channel carries the conversation, durable decisions still graduate to a memo or ADR.
Broader flag for Platform
Prod was carrying an undeployed migration backlog (four migrations, including a prior mart feature table and a data correction), which points at the prod deploy path not running prisma migrate deploy so migration history can drift from the live schema. That is worth addressing separately so prod stays current without manual reconciliation; a follow-up internal note or ADR on the deploy-time migration step is warranted.
References
2026-05-30-platform-mart-consumer-message-channel-table-missing(the report this resolves)2026-05-30-platform-mart-consumer-message-channel-shipped(build complete)- platform repo
docs/adrs/mart-consumer-message-channel.md(ADR-mart-002, Accepted) contracts/mart/message-schema.ts(the typed wire contract)