Skip to content

Nothing waits for a model

The platform's gateway ends every response, streams included, at fifteen seconds. A model call takes a few seconds on a good day and longer on a bad one. So no route that a browser waits on ever calls the model: the route records what it was given, starts a workflow, and answers 202 with an id the caller reads later.

A turn

POST /me/conversations/{conversation}/messages records the participant's message on the conversation and starts the conversation-turn workflow, whose id is the conversation and the message's sequence number. Its one step opens the sealed transcript for this call, hands it to the concern-extraction agent, and records the reply and any proposal on the conversation as events. The reply is { "turn": "cnv-…:turn-3", "message": … }.

The caller then either polls GET /me/conversations/{conversation}/turns/{turn}, which answers Thinking, Replied with the reply and proposal, or CouldNotInterpret, or holds GET /me/conversations/{conversation}/stream, a server-sent event stream of messages, proposals and turns as they are recorded. The gateway closes the stream at its bound; the interface reconnects with after set to the last sequence it saw, and misses nothing, because every event is also on the conversation.

The agent has no memory of its own. The transcript lives on the conversation, sealed, and is handed to the model per turn, so the model holds nothing between calls and erasure has one place to act.

A research run

POST /staff/issues/{issue}/research starts the research workflow and answers 202 with a run id. Its one step calls the research-assistant agent with read-only tools over the issue, its evidence and the reasoning service, and records the suggestions: sources, questions and investigations, each with the agent's reason and the records it read. A suggested investigation is recorded as an investigation in the state suggested, labelled so everywhere, until a representative opens it. GET /staff/research/{run} answers the run's state and, when done, the suggestions.

A review

disclosure-review is a workflow too, keyed by the contribution. Its first step runs the deterministic privacy detectors and then the privacy-flagging agent, and records the flags. Then it pauses, waiting for a reviewer's command, and for a second one when flagged. The reviewer's routes answer at once; the publication they cause happens in the workflow.

A delivery

A development on an issue is picked up by the developments consumer, which starts one update-delivery workflow per development and waits for its end. The workflow renders the update from the record, with no model in the step, and prepares one notification per follower. A browser holds GET /me/inbox/stream or polls GET /me/inbox.

Retries

A workflow step that fails is retried at once, with no backoff, a bounded number of times, and then the workflow records the failure. A step that waits for something outside Voice, a reviewer or an operator, pauses instead, and a command resumes it.