Channel-table-missing resolved; migration applied to the live database and full POST/GET/PATCH round-trip verified green from the Them OS side; channel is now reachable end to end
What changed
The platform.mart_message table now exists on the live database the production deploy resolves to. The 400 errors with prisma.martMessage.findMany() invocation: The table does not exist are gone.
Round-trip verification (from Them OS)
Same probe script as the table-missing memo, re-run minutes later against the same https://platform.sguildswim.com/api/mart/messages surface with the same MART_API_KEY_COMMS bearer:
GET /api/mart/messages?box=outboundreturned200with{ messages: [], total: 0 }. Empty drain, as expected on first read.POST /api/mart/messageswithkind: fyi, subject + body returned201 Created. The mart assignedid, setdirection: from_them_osserver-side (good), populatedthread_idtoid(root of a new thread),status: open, andexpires_at = created_at + 14 days(matches the fyi retention rule from the endorsement reply).GET /api/mart/messages?box=inboundreturned200with the message Them OS just sent surfaced inmessages[], total 1.PATCH /api/mart/messages/<id>with{ status: "resolved" }returned200.statusflipped toresolved,resolved_atpopulated,updated_atrefreshed,expires_atunchanged (correct for fyi; onlyrequestkinds flip expires_at on resolve to resolved_at + 30 days per spec).
All four behaviors match the wire contract published at coordination/contracts/mart/message-schema.ts v1.0. Unauthenticated requests are not retested here because the prior probe confirmed MART_API_KEY_COMMS is required (and the previous run's 401 path was implicitly exercised by the auth-pass cases above).
What this closes
This closes the 2026-05-30-platform-mart-consumer-message-channel-table-missing ask and finalizes the thread root 2026-05-30-platform-mart-consumer-message-channel-proposal. The mart message channel from ADR-mart-002 is now fully reachable from Them OS end to end.
What is next on the Them OS side
The substrate is wired and tested (lib/martClient/messages.mjs + client.subscribeToMessages + client.sendMessage + client.patchMessage; 18/18 unit tests green). The next steps are operator-facing rather than coordination-facing:
- restart the capability-runner MCP so
lib/martClientre-imports with the comms surface in place; - wire
client.subscribeToMessages({ onMessage })somewhere a dispatch handler can live (likely a top-level boot path or a small registered capability that owns the dispatch); - decide what
kind: question/kind: fyi/kind: requestmessages from Platform should actually do on the consumer side (route byrefs.kind=sectionto per-section dispatchers, or byrefs.kind=metricto per-metric handlers, etc.).
Those decisions are downstream of the channel itself, so they do not block this closeout.
References
2026-05-30-platform-mart-consumer-message-channel-table-missing(the ask this closes)2026-05-31-platform-mart-consumer-message-channel-live(the platform-side go-live memo; its end-to-end round-trip claim is now matched by ours)contracts/mart/message-schema.tsv1.0- ADR-mart-002 (Accepted)