Skip to content

Implementation quickstart ​

Start with a minimal adapter that can submit a turn, stream events, persist a snapshot, and expose a thread read model.

1. Define identity ​

Create stable ids for:

text
session_id, thread_id, task_id, run_id, turn_id, step_id, tool_call_id, action_id, trace_id

Do this before adapting provider or tool events. Without stable ids, replay and resume will be unreliable.

2. Normalize provider streams ​

Map provider-native chunks into:

  • model.requested
  • model.delta
  • reasoning.delta when applicable
  • tool.started and tool.args when a tool call is requested
  • model.completed or model.failed

3. Implement tool lifecycle ​

Emit tool.started, tool.progress, tool.result, or tool.failed. Store large inputs and outputs behind refs.

4. Add task lifecycle ​

Create task records for work that has an objective, can run in the background, can be retried, spawns children, or needs acceptance. Emit task.created, task.started, task.progress, and terminal events before adding advanced orchestration.

5. Add human decisions ​

When a permission, plan, credential, or structured input is required, emit action.required and stop the dependent work. Resume only after respond_action.

6. Persist snapshots ​

Persist a compact session snapshot and thread read model after each major transition. Test process restart before adding advanced features.

7. Export evidence ​

Export evidence and replay from the same store that powers the read model. Do not create a second diagnostic truth source.

Draft standard for portable agent execution runtimes.