Execution
What is an Execution?
class TaskStatus(enum.StrEnum):
REQUESTED = "requested"
ACCEPTED = "accepted"
RUNNING = "running"
COMPLETED = "completed"
FAILED = "failed"
CANCELLED = "cancelled"
TIMED_OUT = "timed_out"
class ExecutionRecord(BaseModel):
id: str
run_id: str
task_id: str
agent_id: str
status: TaskStatus
input_artifact_refs: list[str]
output_artifact_refs: list[str]
latency_ms: int
trace_id: str
error: str | None = None
An execution record captures everything that happened when a node ran: which agent handled it, what went in, what came out, how long it took, and whether it succeeded or failed.
How It Works
The task lifecycle follows a fixed state progression:
requested → accepted → running → completed
↓
failed / timed_out / cancelled
When the runtime dispatches a node to its agent, it creates an ExecutionRecord in REQUESTED status. The adapter accepts the task, transitions it to RUNNING, and on completion writes the final status (COMPLETED or FAILED). If the node exceeds its deadline_ms, the status becomes TIMED_OUT.
Execution records are persisted in .binex/binex.db (SQLite) via SqliteExecutionStore. Each record links to its artifacts through input_artifact_refs and output_artifact_refs, and is grouped by run_id and trace_id for replay and debugging.
Example
Query past executions from the CLI:
binex replay list
binex replay show <run-id>
The replay commands read from the SQLite store and display the execution history with status, latency, and error details.