A turn, end to end
One line typed, one answer back. Each column is a separate process, and each hop can fail.
What is on a clock, and what is not
| hop | clock | if it fails |
|---|---|---|
| recall | yes — a short deadline | the turn proceeds with nothing recalled. Memory is never on the critical path. |
| observe | no — queued, never awaited | the entry is still in the window; only the durable record is lost. |
| ask | no — a turn takes as long as it takes | there is no answer, and the session says so. |
| a tool call | per tool | the failure is handed back to the model as the result, not raised. |
| outcome | no | balthasar learns nothing from this turn. Nothing else changes. |
The model never reaches anything
It emits a request naming a tool. magi decides whether it may run, and magi is the one that runs it. Nothing the model says becomes an action without passing the ledger — see what may run.
What the model is actually sent
Not the transcript verbatim. A turn assembles, in order:
- the system message — what magi is, plus this session's own facts: directory, platform, what is installed.
- every tool declaration the registry holds, as a schema the model can call.
- a framed preface, when balthasar recalled anything that cleared the floor. One user message that says what it is — never slipped in as though the conversation had contained it.
- the conversation, capped. Output from a tool is bounded before it ever lands here.
A recall that found only weak matches still says so. The frame line is written first, because a hedged recall that is presented as certainty is worse than no recall at all.