Documentation — Events and metrics reference
Reference · Runtime

Events and metrics reference

This page lists what a running agentd writes about itself: the JSON-lines log events on stderr, the Prometheus metrics on /metrics, the health surfaces, the OTLP export and the audit record. It is for operators building dashboards and alerts, and for integrators parsing the stream. It covers a binary built with every release feature; to learn how to use these signals, read Monitor in production.

Log line format

agentd writes one JSON object per line to stderr. stdout carries only a job's result. Every line starts from the same envelope, and the event's own fields are merged into it.

FieldAlwaysMeaning
tsyesRFC 3339 UTC with milliseconds, for example 2026-10-11T18:35:54.388Z
levelyestrace, debug, info, warn or error
eventyesThe dotted event name, for example run.done
run_idyesThe instance's run id: --run-id, or a ULID minted at start. Every process in the tree carries the same value.
agent_idyessup for the supervisor; for a child, the same value as its agent_path
agent_pathyesWhich unit of work wrote the line (see below)
compyessupervisor for the supervisor process, agent for turn workers and subagents
pidyesThe OS process id, which joins the log to ps and pstree
trace_idyesThe W3C trace id: adopted from observability.traceparent, else derived from run_id

Rules a parser can rely on:

  • Keys are written in alphabetical order. Parse by name, not position.
  • An event's own field may replace an envelope key. turn.model carries the agent_path of the turn it describes, and an audit line's ts is the record's timestamp in milliseconds since the epoch, a number.
  • err is a string.
  • Levels below observability.log_level (default info) are not written. debug adds turn.round, intel.call, intel.result, loop.step, tool.reply and the A2A connection lines.
  • The --validate-config verdict lines (config.valid, config.invalid) carry no envelope. They are the tool's answer, not log events.

A supervisor line and a turn worker line from the same run:

{"acting_for":"system","agent_id":"sup","agent_path":"0","comp":"supervisor","event":"run.start","inbox_event":"01M4P4004T51G3953PXYBDCPQS","key":null,"level":"info","node":"start","pid":1845135,"run":"main-01M4P4004VPT9M256ZXBGDGV3C","run_id":"01M4P4004MMJKM81HAZA0JFGP4","trace_id":"f281fdc06f4dd1374e53be619f96e1fe","ts":"2026-10-11T18:35:54.395Z","workflow":"main"}
{"agent_id":"run/main-01M4P4004VPT9M256ZXBGDGV3C/work","agent_path":"run/main-01M4P4004VPT9M256ZXBGDGV3C/work","comp":"agent","event":"turn.done","level":"info","pid":1845136,"rounds":1,"run_id":"01M4P4004MMJKM81HAZA0JFGP4","status":"completed","tokens_in":11,"tokens_out":5,"tool_calls":0,"trace_id":"f281fdc06f4dd1374e53be619f96e1fe","ts":"2026-10-11T18:35:54.412Z","turn":"main-01M4P4004VPT9M256ZXBGDGV3C/work#1"}

agent_path values

agent_path names the unit of work, so a prefix selects all of it without a join.

ValueWritten by
0The supervisor
run/<run>/<step>The turn worker of one workflow step
turn/<ctx>The turn worker of one conversation turn
sub/<handle>A subagent
preflight/<ctx>Preflight triage of an inbound message
compact/<ctx>Compaction of a conversation
decide/<ctx>A decide call
think/<ctx>A think call

<run> is the workflow run id (<workflow>-<ULID>), <ctx> a conversation context id, <handle> a subagent handle.

Event families

An event's family is the segment before its first dot. The family list is closed: observability.runtime_events.include and .sampled accept only these names, and anything else is refused at load.

FamilyCovers
a2aThe A2A listener, peers, push notifications and tasks
adminadmin.set
agentAn instance-wide pause
auditAudit records written to the log, and audit write failures
authDisplay-client launch codes and sign-in sessions
breakerStep circuit breakers
budgetToken budgets: windows, degrade, the lifetime cap
cgroupcgroup v2 placement of children
childChild process exits and health
configValidation, reload and the config file watch
contextConversation compaction
correlatecorrelate start nodes
drainGraceful shutdown
execThe exec tool
freshnessThe instruction freshness watch
goalThe goal watchdog
httpThe http workflow node
humanQuestions to people, answers and judges
identityPrincipal id collisions
inboxThe durable inbox
instanceInstance-tier subagents
instructionThe instruction source
intelModel calls, decisions, health and model swaps
knowledgeAutomatic knowledge context
lifecycleIdle exit and the retirement signal
limitReserved; nothing writes it
loopA subagent's agentic loop
mcpMCP connections, listens, subscriptions and MCP Events
messageThe message-depth guard
metricsThe probe and scrape listener
nestedFan-out bodies
otelOTLP log export
planPlan updates
preflightPreflight triage
pressureResource pressure
procProcess start, readiness and exit
promptThe system prompt and --prompt
readbackResults withheld from a tainted reader
registryThe tool registry
restoreRestoring durable state at start
rootThe root conversation
runWorkflow runs
signalWorkflow signals
skill, skillsSkills discovery and loading
startStart nodes
stepWorkflow steps
storeThe durable store
streamStreams and the runtime-events tap
subagentSubagents
testTest hooks, compiled only into debug and internal-mocks builds, never into a release binary
timerDurable timers
toolTool calls and tool policies
turnTurn workers
waitSuspended waits
webhook, webhooksWebhook routes and the webhook listener
workflowWorkflow definitions

Events

Every event agentd writes, by family. Fields are the event's own keys beyond the envelope; a ? marks a key that is present only sometimes. "Stream fields" are the keys a stream or correlate consumer adds to say which events it holds: stream, seq and event_id for one event; from, to, events, seqs and event_ids for a batch; correlation, events, seqs and event_ids for a join. Levels separated by a comma depend on the case.

a2a

EventLevelFieldsNotes
a2a.conndebugerrA connection could not be served.
a2a.context.unavailablewarnerr, principal
a2a.delegateinfopeer, run, step
a2a.deniedwarnprincipal, rule, method, op, reason, status, sid?, suppressed?The listener refused a request. reason: unauthenticated, invalid_credential, no_role, not_permitted, rate_limited, auth_failures_limited. Refusals a stranger can cause are written once per source and reason per minute; suppressed counts the rest.
a2a.introspectioninfoenabled
a2a.listeninfoauthority, bound, device_grant, events, implicit_operator, introspection, mtls, required, tls, urlThe listener bound, with the posture it enforces.
a2a.message.deliveredinfoconversation, inbox_event
a2a.push.failedwarnerr, task
a2a.push.registeredinfoconfig, principal, task
a2a.sendinforun, step, to
a2a.task.encode.failwarnerr, task
a2a.task.evict.failwarnerr, task
a2a.task.evictedinfotask
a2a.task.persist.failwarnerr, task
a2a.tlsdebugerr
a2a.unix.deniedwarnerr, reason, uidA unix-socket peer was refused.

admin

EventLevelFieldsNotes
admin.setinfopath, valueAn operator changed a runtime-settable path.

agent

EventLevelFieldsNotes
agent.pausedinforeasonAn instance-wide admin.pause began.
agent.resumedinfo—The instance-wide pause ended.

audit

EventLevelFieldsNotes
auditinfoinstance, principal, role, action, target, outcome, request_id, trace, sid?One audit record, when observability.audit.sink includes log.
audit.emitinfoaudit, run, stepAn emit step wrote an audit record.
audit.store.failwarnaction, errAn audit record could not be stored. The audited action still stands.

auth

EventLevelFieldsNotes
auth.launch.approvedinfoclient_id
auth.launch.exchangedinfobind, client_id, sid, via
auth.launch.requestedinfoclient_id
auth.session.revokedinfo—

breaker

EventLevelFieldsNotes
breaker.closedinfobreakerThe probe succeeded; the breaker closed.
breaker.openwarnbreaker, consecutive_failures, cooldownA step circuit breaker opened after consecutive failures.
breaker.probeinfobreaker, runA run took the half-open probe slot.
breaker.reopenwarnbreaker, probe_failedThe probe failed; the breaker opened again.

budget

EventLevelFieldsNotes
budget.degradedinfoctx, model, run, stepA step was moved to the budget's degrade model.
budget.lifetime_exhaustedwarnpolicy, reasonThe instance lifetime token budget is spent; policy says what follows. Written once.
budget.refusedwarnctx, reasonA turn was refused by a token budget.
budget.waitinfoctx, node, reason, run, step, until_msA step waits for a budget window to reset.

cgroup

EventLevelFieldsNotes
cgroup.armedinfolimits_unavailable, parentcgroup v2 placement for children is set up.

child

EventLevelFieldsNotes
child.exitinfokind, node, outcome, pidA child process was reaped. outcome is Exited(<code>) or a signal.
child.unhealthywarnhealth, nodeA child was found unhealthy and is being stopped.

config

EventLevelFieldsNotes
config.invaliderrorerrorA validation error at startup.
config.reload.invalidwarnerror, triggerA reload candidate failed validation or staging; nothing changed.
config.reload.restart_requiredwarnpaths, triggerA reload touched restart-only paths; nothing changed.
config.reloadedinfochanged, triggerA reload was applied. changed lists what moved, or ["nothing"].
config.warningwarnwarningA non-fatal finding at load or reload.
config.watch.armedinfodir, glob, pathThe lifecycle.watch_config watch is set on a directory.
config.watch.errorwarndir, err, errno, path, targetThe watch failed and stopped; SIGHUP still reloads.
config.watch.firedinfofileA watched file changed; a reload follows.

context

EventLevelFieldsNotes
context.compactedinfoafter, before, ctx, fallback, folded, versionA conversation was compacted.
context.compaction.apply_failwarnctx, err
context.compaction.spawn_failwarnctx, err
context.compaction.startinfoctx, fold, node
context.compaction.think_failedwarnctx, err, status

correlate

EventLevelFieldsNotes
correlate.expiredinfocorrelation, node, stream, window_ms, workflow
correlate.overflowwarndropped, max_pending, node, stream, workflowA correlate start refused new correlation values past max_pending.
correlate.unkeyedwarnby, node, stream, subject, workflow

drain

EventLevelFieldsNotes
drain.abandonwarnchildrenThe drain overran drain_timeout plus 3 s; the remaining children were killed.
drain.doneinforeasonThe drain finished; the process exits next.
drain.startinfochildren, reason, runsA graceful drain began (SIGTERM, SIGINT, admin.drain or a policy).

exec

EventLevelFieldsNotes
exec.runinfoargc, caller, cmd, cwd, timeout_msThe exec tool ran a command.

freshness

EventLevelFieldsNotes
freshness.armedinfoevery_msThe instruction freshness watch is armed.
freshness.recoveredinfouri

goal

EventLevelFieldsNotes
goal.achievedinforeason, statement, viaThe goal check says the goal holds.
goal.armedinfoevery_ms, statement, stuck_after, via
goal.checkinfoachieved, judge, no_progress
goal.escalatewarnreason, statement
goal.idleinfonote, reason
goal.judgeinfoachieved, reason
goal.judge.errorwarnerror
goal.judge.startinfono_progress, statement
goal.replanwarnnote, reason, statement
goal.stuckwarnno_progress, reason, statement, stuck_after, viaThe goal made no progress for stuck_after checks.
goal.workflowinforeason, workflow
goal.workflow.missingwarnnote, workflow

http

EventLevelFieldsNotes
http.requestinfomethod, run, step, urlAn http workflow node made a request.

human

EventLevelFieldsNotes
human.answer.not_addressedinfoaddressee, from, task
human.answer.overridewarnaddressee, by, sid, taskAn operator answered a gate addressed to someone else.
human.answer.rejectedinfoerrors, task, via
human.answer.undeliveredwarntask, via
human.answeredinfoby, labels, sid, task, viaA person answered.
human.askinfochannel, deadline_ms, question, taskA question went to a person.
human.ask.failedwarnerr, task
human.ask.parkedinfoask, deadline_ms, note
human.ask.prunedwarnerr, task
human.ask.restoredinforun, step, task
human.auto_acceptedinfoanswer, policy, questionagent.approval: accept took an ask's recommended answer.
human.judge.startinfoask, decided, question
human.judge.withheldwarnask, origins, whyNo judge answered: the asking run carries outside input. The ask fails.

identity

EventLevelFieldsNotes
identity.collisionerror, warn—A reload declared a principal id an approved device already owns; the reload is refused.

inbox

EventLevelFieldsNotes
inbox.acceptedinfoinbox_event, kindAn event was written to the durable inbox.
inbox.done.failwarnerr, inbox_event
inbox.unknown_kindwarninbox_event, kind

instance

EventLevelFieldsNotes
instance.exitedinfohandle, pid, status
instance.killwarnhandle, note, pid
instance.meteredinfodelta_tokens, handle, total_tokens
instance.mirrorinfohandle, seq, stream
instance.mirror.failwarnerr, handle, stream
instance.op.failwarnerr, op
instance.op.orphanwarnhandle, note, op
instance.op.refusedwarnop, principal, noteA non-operator tried an instance operation.
instance.op.unknownwarnop
instance.parent_peerwarnnote
instance.respawninfohandle, pid
instance.resultinfohandle
instance.retireinfohandle, pid, why
instance.sendinfo, warnhandle, err?
instance.spawninfohandle, pid, retire_at, singleton, socket, template, untilAn instance-tier subagent started.
instance.spawn.refusedwarnreason, templateAn instance-tier subagent was refused before anything was created.

instruction

EventLevelFieldsNotes
instruction.appliedinfodelivered_digest, new_version_id, old_version_id, uri
instruction.binding.createdinfobinding_id, instruction_id, server
instruction.binding.failwarnerr, op, server
instruction.binding.reportedinfobinding_id, version_id
instruction.eventinfoevent_type, server
instruction.loadedinfobytes, dir, files, glob, layer_digest, manifest_digest, order, resolution, server, uri, version, version_idThe instruction was read.
instruction.reread.failwarnerr, reason, server, uri
instruction.subscribe.failwarnerr, server, uri
instruction.subscribe.unsupportedinfoserver, uri
instruction.unavailablewarnerr, policy, server, trust_pinned, uriThe instruction source could not be re-read before its deadline; policy is what agentd did.
instruction.updatedinfoversionA changed instruction took effect.
instruction.verifiedinfoauthor_capabilities, capabilities, delivery_checked, key_state, kid, publisher, uriA signed instruction verified against a trusted publisher.

intel

EventLevelFieldsNotes
intel.calldebugmessages, stepA subagent loop asked the model.
intel.decisioninfoanswers, escalated, model, turn, unsureA decision model or judge answered.
intel.decision.escalateinfofrom, to, turn, unsureAn unsure decision was asked again on the escalate model.
intel.healthwarnall_downA child reported every model endpoint down, or one back up. Drives /readyz.
intel.resultdebugtokens_in, tokens_out, tool_callsA subagent loop got the model's answer.
intel.swapinfoendpoint_change, kind, model_from, model_to, policyA model or endpoint change applied at a turn boundary. Names models, never URLs or credentials.
intel.swap.rejectwarnerrA pending swap was refused at the turn boundary.
intel.swap.restart_turninfodiscarded_turn
intel.swap.sentinfopolicy, subagentsA reload's model change was sent to running subagents.
intel.token_file.errorwarnerr, providerA provider's token file could not be read.

knowledge

EventLevelFieldsNotes
knowledge.auto_contextinfobytes, ctx, hit
knowledge.auto_context.argswarnerr

lifecycle

EventLevelFieldsNotes
lifecycle.idle_exitinfocode, job_shapeA job (or an idle instance) is exiting with code.
lifecycle.until_signalinfosignalThe lifecycle.until_signal signal arrived; a drain follows.
lifecycle.until_signal.refusedwarnnote, principal, signalThat signal came from a sender that may not retire the instance.

loop

EventLevelFieldsNotes
loop.errorerrorerrA subagent loop failed.
loop.finalinfo, warnstatus, steps, tokensA subagent loop ended.
loop.pausedinfo—
loop.resumedinfo—
loop.startinfodepth, max_steps, resources, servers, tools, warmA subagent loop started.
loop.stepdebugmessages, step, tokens

mcp

EventLevelFieldsNotes
mcp.connectinfoserver, tools, protocol, reason?A server connected. protocol is the negotiated MCP revision. reason marks a reload, a re-dial or a join.
mcp.connect.failwarnserver, err, reason?A server could not be connected. Not fatal: agentd retries on a backoff.
mcp.disconnectinfo, warnreason, serverA connection closed. reason: reload, reload refused, or session_lost (re-dialed).
mcp.events.arm.failerror, warnerr, event_type, retry_ms, server
mcp.events.armedinfoserver, event_type, mode, cursor_present, truncated?An MCP Events binding started polling, or its webhook subscription was made.
mcp.events.callback_failederrorevent_type, reason, server, urlThe server could not reach or verify webhooks.url.
mcp.events.delivery_suspendedwarnactive, event_type, last_error, server
mcp.events.gapwarnserver, event_type, cause, refused?Occurrences may be missing. cause: truncated, no_replay, schema_changed.
mcp.events.hook.deniedwarnevent_type, reason, serverA webhook delivery did not verify and was answered 401.
mcp.events.hook.unsavedwarnerr
mcp.events.index.failedwarnerr, subscriptions
mcp.events.list.failwarnerr, retry_ms, server
mcp.events.list_changedinfoserver
mcp.events.listedinfoserver, types
mcp.events.mode_changedwarncause, event_type, from, server, to
mcp.events.pausedwarnserver, event_type, cause, detail?A binding is held at its cursor. cause: pressure, store_degraded, rate, refusal.
mcp.events.poll.failerror, warnserver, event_type, err, code?, retry_ms
mcp.events.refusederrordetail, event_type, reason, serverA binding was refused and is not polled until a reload, re-dial or new listing allows it.
mcp.events.rejectedwarncause, event_id, event_type, server
mcp.events.removedinfoevent_type, reason, server
mcp.events.resumedinfocause, event_type, server
mcp.events.schema_mismatchwarnevent_id, event_type, server
mcp.events.subscribedinfoserver, event_type, owner, reason, subscription
mcp.events.terminatederrorcode, event_type, serverThe server ended a webhook subscription.
mcp.events.throttledinfoevent_type, retry_after_ms, server
mcp.events.unsubscribedinfoserver, event_type, owner, reason, subscription
mcp.join.refusedwarnerrors, serverA server's tools could not join the registry; it is dialed again on a backoff.
mcp.joinedinfoserverA server that was down at boot came up and its tools joined.
mcp.listen.endedinfo, warnserver, reason, detail?, retry_msA subscriptions/listen stream ended and reopens after retry_ms. Info when idle, warn otherwise.
mcp.listen.flags_refusedwarnserver, reason
mcp.listen.narrowedwarnserver, droppedA re-listen came back without some URIs; they are asked for again.
mcp.listen.resumedinfoserver
mcp.listen.unavailablewarnserver, reason, retry_msThe standing listen failed or was refused.
mcp.tool.droppedwarnreason, server, toolA tool the server listed was dropped by the client and cannot be called.
mcp.tools_changedinfonote, serverA server said its tool list changed.
mcp.tools_refresh_failedwarnerr
mcp.tools_refreshedinfotools
mcp.unsubscribe.failwarnerr, reason, server, uri
mcp.unsubscribedinforeason, server, uriA resource nobody wants any more was released.

message

EventLevelFieldsNotes
message.too_deepwarncaller, conversation, depth, max, reason, run, stepA message chain passed limits.max_message_depth.

metrics

EventLevelFieldsNotes
metrics.bound_all_interfaceswarnaddr, noteThe probe listener is reachable off-host.
metrics.serve.failwarnaddr, errThe probe listener could not bind. Not fatal.
metrics.servinginfoaddr, endpointsThe /metrics, /healthz and /readyz listener is up.

nested

EventLevelFieldsNotes
nested.items.artifact_failwarnerr, run, step

otel

EventLevelFieldsNotes
otel.logs.armedinfoendpointOTLP log export is on.

plan

EventLevelFieldsNotes
plan.updatedinfoctx, items, op, progress

preflight

EventLevelFieldsNotes
preflight.failedwarnctx, err, status
preflight.route_unsureinfochoice, confidence, ctx, model
preflight.skills_cappedwarnasked, catalogued
preflight.skills_unknownwarnctx, skills
preflight.spawn_failwarnctx, err
preflight.startinfoctx, node
preflight.unsureinfoctx, model, unsure
preflight.verdictinfoctx, intent, needs_plan, risk, route, skills

pressure

EventLevelFieldsNotes
pressure.clearedinfolevel, cause, disk_free_bytesPressure is back to normal.
pressure.shedwarnlevel, cause, disk_free_bytesBelow min_free, or memory pressure: admission stops, in-flight work drains.
pressure.warnwarnlevel, cause, disk_free_bytesFree space fell below twice store.file.min_free; low-priority work sheds.

proc

EventLevelFieldsNotes
proc.exiterror, infocode, uptime_ms, turns, tool_calls, runs, tokens_in, tokens_out, err?The process is exiting with code. At error level with err when startup fails, or when an exit policy (unavailable: exit, lifetime_exhausted: exit) ends the instance.
proc.readyinfoinbox_pending, instance, job_shape, runs, workflowsStartup finished; triggers are armed.
proc.startinfoconfig_files, instance, versionThe process started.

prompt

EventLevelFieldsNotes
prompt.builtin.failerrornote
prompt.failederrorerr, secretThe --prompt task could not be delivered.
prompt.rejectwarnerr
prompt.render.failerrorerr, template
prompt.template.missingerrorerr, template

readback

EventLevelFieldsNotes
readback.withheldinforeader, reason, viaA result that may carry outside input was withheld from a context holding sensitive and egress.

registry

EventLevelFieldsNotes
registry.warningwarnwarning
registry.workflow_toolsinfoarguments, mode, tags, tool, workflow

restore

EventLevelFieldsNotes
restore.adoptedinfoartifacts, contexts, inbox_pending, lost, runs, subagents, timersDurable state was restored from the store at start.
restore.context.lostwarnids
restore.doneinfogeneration, fresh_manifest, entities, lost, unindexed
restore.freshinfogeneration, superseded?, retired?, msg?A new generation started (first start, or --fresh).
restore.run.corruptwarnerr, id
restore.step.failedwarnon_replay, run, step
restore.step.replayinfoattempt, run, step
restore.step.skippedinfoon_replay, run, step
restore.subagent.corruptwarnerr, id
restore.task.corruptwarnerr, id
restore.timer.losterrorerr, run, step, waitA timer could not be restored.
restore.timer.repairedwarndeadline_ms, run, step, timer, wait

root

EventLevelFieldsNotes
root.finishinfoctx, exit, job_shape, statusThe root conversation called finish; exit says whether the process ends.

run

EventLevelFieldsNotes
run.breakpointinfobefore_step, run
run.create.failerrorerr, workflow
run.deadlinewarnrunA run passed its deadline; its children are cancelled.
run.doneinfoerr, output, run, status, workflowA workflow run ended with status.
run.droppedwarnreason, workflowA start event was dropped by concurrency.on_overflow: drop.
run.evict.failwarnerr, run
run.evictedinforun
run.inputs.invalidwarnerrors, workflow
run.pausedinfobefore_step, reason, runOne run was paused.
run.refusedwarnreason, runA run was refused with reason.
run.resumedinforunOne run was resumed.
run.stalledwarnblocked_by, runA run can make no progress; blocked_by says why.
run.startinfoacting_for, inbox_event, key, node, run, workflowA workflow run started. acting_for is the principal it runs for.

signal

EventLevelFieldsNotes
signal.receivedinfodelivered, inbox_event, nameA workflow signal arrived.

skill

EventLevelFieldsNotes
skill.load.refusedwarnerr, skill
skill.loadedinfoctx, hash, skill
skill.unknownwarnerr, skill

skills

EventLevelFieldsNotes
skills.discoveredinfocount, dir, server, skills
skills.file.unreadablewarnerr
skills.source.unavailablewarnserver

start

EventLevelFieldsNotes
start.a2a.firedinfocommand, conversation, node, role, workflow
start.a2a.intoinfoconversation, node, seq, stream, subject, workflow
start.a2a.into.refusedwarnerr, node, stream, workflow
start.firedinfoworkflow, node, kind, stream fieldsA start node fired.
start.frozenwarnworkflow, node, kind, cause, stream fieldsA firing was refused because the instruction source is frozen.
start.inbox.failedwarnworkflow, node, kind, err, stream fieldsA firing could not be written to the durable inbox.
start.inputs.invalidwarnworkflow, node, kind, err, stream fieldsThe start's inputs did not render; the firing is cancelled.
start.key.emptywarnnode, template, workflow
start.key.invalidwarnerr, node, workflow
start.loop.stoppedinfonode, reason, workflow
start.once.skippedinfolive, node, pending, workflow
start.schedule.armedinfonext_ms, node, workflowA schedule start is armed; next_ms is the next firing.
start.schedule.doneinfonode, note, workflow
start.schedule.invalidwarnnode, note, workflow
start.shedwarnworkflow, node, kind, cause, stream fieldsA firing was refused under resource pressure.
start.subscribe.armedinfoworkflow, node, server, uri, reason?A subscribe start is subscribed.
start.subscribe.failwarnerr, node, server, uri, workflowA subscribe failed and is retried on a backoff.
start.subscribe.no_serverwarnnode, server, workflow
start.subscribe.unsupportederrorerr, node, server, uri, workflowThe server does not support resource subscriptions; this start can never fire.
start.too_largewarnworkflow, node, kind, err, stream fieldsThe start event is larger than store.max_value_bytes.
start.unknown_workflowwarninbox_event, workflow

step

EventLevelFieldsNotes
step.cache_hitinforun, step
step.doneinfoattempt, err, run, status, step, tokensA workflow step ended with status.
step.gotoinfofrom, run, to
step.output.artifactinfoartifact, run, size, step
step.output.artifact_failwarnerr, run, step
step.rate_waitinforate, run, step, wait_ms
step.rate_wait_failwarnerr, run, step
step.retryinfoattempt, backoff_ms, run, stepA step is retried after backoff_ms.
step.startinfoattempt, kind, run, stepA workflow step started.
step.timeout_routedinforun, step, to
step.turn.spawninfonode, run, step

store

EventLevelFieldsNotes
store.checkpoint.failerrorerrA checkpoint failed.
store.config_changedwarnsections, msgState was written under a different configuration; resuming anyway.
store.conflictwarnkey, seq, latestAnother writer owns a key. Two processes share one instance identity.
store.fileinfodefaulted, generation, msg, pathThe file store's path and generation, and whether the path was defaulted.
store.nonewarnnoteNo durable store: state lives in this process only.
store.put.failwarnkey, err
store.seq_adoptedinfokey, latest

stream

EventLevelFieldsNotes
stream.consumer.skippedwarnevents, from, node, stream, to, workflowEvents a consumer had not read are gone (trimmed or unreadable).
stream.emitinforun, seq, step, stream, subject
stream.event.corruptwarnerr, node, seq, stream, workflow
stream.forward.failedwarndurable, err, peer, seq, status, stream, subject
stream.forward.refusedwarnerr, run, step, stream
stream.head.recoveredwarncomplete, from, stream, toAn append found events past the recorded head and kept them.
stream.read.failedwarnstream, seq, workflow, node, errThe store did not answer a consumer's read; the consumer holds and retries.
stream.tapinfoaudit_stream, include, queue, sampled, streamobservability.runtime_events is armed.
stream.tap.droppedwarneventsThe runtime-events queue was full; this many were dropped.
stream.tap.refusedwarnappended, events
stream.trimmedinfoevents, first, stream

subagent

EventLevelFieldsNotes
subagent.cancelinforeason
subagent.injectinfobytes
subagent.killinfohandleA subagent was stopped.
subagent.respawninfohandle, node
subagent.restore.bad_payloadwarnhandle
subagent.resultinfoerr, handle, status, tokensA subagent reported its result.
subagent.spawninfocpu_seconds, depth, handle, memory_bytes, mode, node, pid, priority, serversA subagent process started.
subagent.swap_intelinfoendpoint_change
subagent.turninfohandle, status

timer

EventLevelFieldsNotes
timer.unknown_ownerwarnid, owner

tool

EventLevelFieldsNotes
tool.callinfoid, tool, turnA turn called a tool. args only under log_content, in a subagent loop.
tool.policy.askinfocaller, rule, toolA policy rule asked a person before a tool call.
tool.policy.decidedinfoapproved, by, rule, tool
tool.policy.errorerrorcaller, rule, tool
tool.policy.refusedinfoaction, caller, rule, toolA security.policies rule refused a tool call.
tool.policy.unanswerablewarnfallback, note, question, rule, tool
tool.replydebugis_error, node, req
tool.reply.droppeddebugnode, req
tool.requestinfoargs, caller, node, req, toolA child asked the supervisor to run an internal tool. args only under log_content.
tool.resultinfois_error, ms, tool, turnA tool call returned. content only under log_content, in a subagent loop.
tool.result.schemawarnerr, tool

turn

EventLevelFieldsNotes
turn.budget_waitinfoturn, wait_ms
turn.doneinfoturn, status, rounds, tool_calls, tokens_in, tokens_out, kind?, node?, tokens?A turn ended. The child's line carries tokens_in/tokens_out; the supervisor's carries tokens.
turn.effort_ignoredwarnagent_path, effort, model
turn.failedwarnerr, kind, node
turn.modelinfoagent_path, model, provider, roleThe model a turn runs on, and the role that chose it.
turn.model_degrade_failedwarnerr, to, turn
turn.model_degradedinfofrom, provider, to, turn
turn.model_fallbackinfomodel, served_by, turnThe model was unavailable and its fallback answered (or it is back).
turn.reaskinforeason, turn
turn.refused.not_ownerwarnctx, principal, reasonA turn aimed at a conversation its principal does not own was refused.
turn.replyinfochars, ctx, deterministic, textA conversation turn replied. text only under log_content.
turn.rounddebuground, tokens_in, tokens_out, tool_calls, turnOne model round in a turn.
turn.route_removedwarnctx, model, reason
turn.routedinfoctx, modelA turn was routed to a model by intelligence.routes.
turn.spawninfoctx, inbox_event, node, turn
turn.spawn.failerrorctx, err
turn.startinfokind, messages, tools, turnA turn began in a turn worker.

wait

EventLevelFieldsNotes
wait.resolvedinfokind, run, status, step, stream, subject
wait.resubscribe.failerror, warnserver, uri, reason, err, failed?, parked?A wait could not be subscribed again. Error level when it can never be woken.
wait.resubscribedinforeason, server, uriA suspended wait on: resource was subscribed again.

webhook

EventLevelFieldsNotes
webhook.await.armedinfopath, run, step, url
webhook.await.restoredinfopath, run, step
webhook.callbackinfopath, resumed
webhook.deniedwarnkind, path, reasonA webhook request failed authentication.
webhook.duplicateinfonode, workflow
webhook.filteredinfonode, workflow
webhook.idempotency.expiredinfomarkers
webhook.idempotency.sweep.failwarnerr
webhook.idempotency.unindexedwarnerr, node, workflow
webhook.idempotency.unrecordedwarnerr, node, workflowA delivery's idempotency marker could not be written; a replay runs again.
webhook.intoinfonode, seq, stream, subject, workflow
webhook.into.refusedwarnerr, node, stream, workflow
webhook.overflowwarnaction, pathA webhook route was at its parallelism; action says what was done.
webhook.signalinfonode, resumed, signal, workflow
webhook.signal.invalidwarnerr, node, workflow

webhooks

EventLevelFieldsNotes
webhooks.listeninfoauthority, bound, routes, tlsThe webhook listener bound.
webhooks.routesinforeason, routes

workflow

EventLevelFieldsNotes
workflow.definedinfohash, name, op
workflow.deletedinfoname
workflow.durability_mixwarnworkflow, step, child, noteA durable parent waits on a non-durable child.
workflow.loadedinfoname, hash, starts, steps, durableA workflow definition went live.
workflow.lockedwarntool
workflow.pin_failwarnerr, hash, workflow
workflow.pin_missingwarnerr, hash, workflow
workflow.pin_restoredinfohash, workflow
workflow.refusedwarnconfigured, name, tool
workflow.retiringinfohash, live_runs, policy, reason, timeout_ms, workflowA workflow is being retired; its live runs drain under policy.
workflow.stored.invalidwarnname, errors, note?A definition the agent stored was not loaded; it is kept.
workflow.stored.shadowedwarn—
workflow.think.failwarnerr, run
workflow.unloadedinfohash, live_runs, reason, workflowA workflow was removed.
workflow.unsubscribe_failwarnerr, server, uri, workflow
workflow.unsubscribedinfoserver, uri, workflow

Metrics

observability.metrics_addr (--metrics-addr) serves Prometheus text format 0.0.4 at /metrics, beside /healthz and /readyz. It needs the metrics build feature, which the release binaries and image include. The surface is read-only and unauthenticated; :9090 binds every IPv4 interface and logs metrics.bound_all_interfaces.

Metric names and label keys are a stable contract: series are added, never renamed. Labels carry bounded values only. A run id, agent path or URI never appears in a label; label values outside a closed domain count under other.

The Status column says what a scrape shows:

  • live: the supervisor process writes it.
  • process-local: written only for work done inside the scraped process. Model calls run in turn-worker child processes, so these miss most calls.
  • always 0: rendered with a value, but nothing writes it.
  • marker: only the # HELP and # TYPE lines, with no sample.

Use the log events for anything a series below does not cover.

Liveness, readiness and lifecycle

MetricTypeLabelsStatusMeaning
agent_upgaugelive1 while the process answers the scrape
agent_readygaugelive1 unless draining or every model endpoint is reported down; the same verdict as /readyz
agent_pausedgaugelive1 while an instance-wide admin.pause holds
agent_drains_totalcounterphase: started, completed, forced, otherliveDrain transitions. An abandoned drain also counts completed; forced is never written.
agent_config_reload_totalcounterresult: applied, rejected, otherliveReloads. A refused reload counts under other; rejected is never written.
agent_config_generationgaugeliveApplied reloads since start, the number also stamped into the durable manifest
agent_restarts_totalcounteralways 0Reserved for supervisor restarts
agent_reactor_stalls_totalcounteralways 0Reserved; a stalled supervisor shows as a /healthz 503
agent_restarts_tripped_totalcounteralways 0Reserved for restart-breaker trips

Runs, steps and turns

MetricTypeLabelsStatusMeaning
agent_runs_started_totalcounterliveWorkflow runs started: the arrival rate
agent_runs_completed_totalcounterliveRuns that ended completed
agent_runs_failed_totalcounterliveRuns that ended in any status but completed or cancelled
agent_runs_killed_totalcounterliveRuns that ended cancelled
agent_runs_totalcounterstatus: completed, refused, exhausted_steps, exhausted_tokens, deadline, stalled, loop_detected, cancelled, crashed, otherliveRuns by terminal status. Each finished run is counted twice in this family; use the three counters above for exact counts.
agent_runs_activegaugeliveWorkflow runs not yet terminal
agent_steps_totalcounterstatus: done, failed, skipped, otherliveWorkflow steps by terminal status: the throughput signal
agent_turns_totalcounterkind: root, preflight, compaction, knowledge, otherliveConversation turns dispatched. Only root is written.
agent_turns_queuedgaugeliveConversation turns waiting for a dispatch slot
agent_inbox_pendinggaugeliveEvents in the durable inbox not yet processed, A2A messages included: the backlog
agent_reactions_totalcounteralways 0Reserved
agent_loop_steps_totalcounterprocess-localSubagent loop steps; counted in the child, so the supervisor reads 0
agent_run_duration_mshistogrammarkerReserved; derive durations from run.start and run.done

Tokens and models

MetricTypeLabelsStatusMeaning
agent_tokens_totalcountertype: in, outliveTokens reported up by direct children
agent_tokens_input_totalcounterliveInput tokens reported by direct children
agent_tokens_output_totalcounterliveOutput tokens reported by direct children
agent_context_tokensgaugeliveEstimated tokens of the largest live conversation context
agent_budget_tokens_remaininggaugealways 0Reserved for the lifetime budget balance; watch budget.lifetime_exhausted instead
agent_intel_calls_totalcounterprocess-localModel calls made by the scraped process
agent_intel_upgaugeprocess-local1 when the scraped process's last model call found its endpoint up
agent_intel_errors_totalcounterreason: unreachable, auth, timeout, 5xx, otherprocess-localModel-call errors in the scraped process
agent_intel_all_downgaugealways 0Reserved; read agent_ready or the intel.health event
agent_intel_call_duration_mshistogrammarkerReserved

Store, pressure and memory

MetricTypeLabelsStatusMeaning
agent_store_ops_totalcounterresult: ok, conflict, error, otherliveDurable store writes by result. A rising conflict means two processes share one instance identity.
agent_store_latency_ms_sumcounterliveCumulative store write latency; divide by agent_store_ops_total for the mean
agent_pressure_levelgaugelive0 ok, 1 warn, 2 shedding
agent_disk_free_bytesgaugeliveFree bytes on the file store's filesystem; absent without a file store
agent_memory_max_bytesgaugelivecgroup v2 memory.max, when the kernel exposes it
agent_memory_current_bytesgaugelivecgroup v2 memory.current, when the kernel exposes it

Subagents and children

MetricTypeLabelsStatusMeaning
agent_subagents_spawned_totalcounterliveChild processes started: turn workers and subagents
agent_subagents_exited_totalcounterstatus: same domain as agent_runs_totalliveChild exits: completed (exit 0), crashed (non-zero), cancelled (signal)
agent_active_subagentsgaugealways 0Reserved
agent_tree_depthgaugealways 0Reserved
agent_tree_breadthgaugealways 0Reserved
agent_subagent_restarts_totalcounterreason: crashed, stuck, rate, otheralways 0Reserved
agent_subagent_stuck_kills_totalcountersignal: term, kill, otheralways 0Reserved
agent_refusals_totalcounterreason: trifecta, rate, budget, depth, mcp, otheralways 0Reserved
agent_limit_exceeded_totalcounterlimit: steps, tokens, deadline, depth, tree_tokens, tokens_lifetime, restart_storm, spawn_rate, otheralways 0Reserved

MCP, tools and reactive backlog

MetricTypeLabelsStatusMeaning
agent_mcp_connect_failures_totalcounterserver (up to 15 names, then other)liveConnect failures of the supervisor's MCP connections
agent_tool_calls_totalcountermarkerReserved; count tool.result lines
agent_tool_call_duration_mshistogrammarkerReserved; use the ms field of tool.result
agent_subscriptions_activegaugenone, or kind="event", modesee noteThe unlabelled series is always 0. The kind="event" series counts active MCP Events bindings by mode (poll, webhook) and is live.
agent_pending_eventsgaugealways 0Reserved
agent_inflight_reactionsgaugealways 0Reserved
agent_reaction_lag_msgaugealways 0Reserved

Streams and MCP Events

MetricTypeLabelsStatusMeaning
agent_stream_laggaugestream, consumer (<workflow>/<node>)liveEvents on a stream its consumer has not consumed. Up to 32 consumers per start kind by name; the rest fold into one other series carrying the largest lag. No sample when no consumer is armed.
agent_mcp_events_totalcounterserver, event, mode, outcomeliveOccurrences by outcome: appended, schema_mismatch, duplicate, rejected, refused_pressure, and unauthenticated for a webhook
agent_mcp_events_requests_totalcounterserver, method, outcomeliveevents/list, events/poll, events/subscribe and events/unsubscribe requests: ok, refused, failed
agent_mcp_event_gaps_totalcounterserver, event, causeliveGaps: truncated, no_replay, schema_changed
agent_mcp_events_dedup_evicted_totalcounterserver, eventliveDedup entries dropped to stay under the 4096 cap
agent_mcp_event_lag_msgaugeserver, eventliveAppend time minus the occurrence's server-reported timestamp, at least 0

The MCP Events families take server and event from the operator's bindings (at most 256). A family past 512 series folds the rest into one series whose labels all read other.

Health surfaces

SurfaceAnswersHealthyUnhealthy
GET /healthzIs the supervisor's event loop making progress?200 ok tick_age_ms=<n>503 unhealthy draining=<bool> tick_age_ms=<n> when the last tick is 5 s old or a drain is under way
GET /readyzShould new work be routed here?200 ready503 not ready lame_duck=<bool> draining=<bool> intel_all_down=<bool>
GET /metricsThe metrics above200, text/plain; version=0.0.4

Any other path is 404. The surface binds after startup finishes, immediately before proc.ready, so a successful connection means the runtime is up. intel_all_down is the last report a child made: it turns true when a turn found every model endpoint down and false when one answers again.

observability.health_file (--health-file) names a file the supervisor rewrites once a second, atomically:

{"alive":true,"draining":false,"mode":"1","run_id":"01M4P42Z69EJ2J6XDTWTFHP0GR","supervisor_tick_age_ms":128,"ts":"2026-10-11T18:37:32.731Z"}
FieldMeaning
tsWhen this record was written
run_idThe instance's run id
modeAlways "1"; carries no meaning
supervisor_tick_age_msMilliseconds since the supervisor's event loop last made progress
alivetrue when the tick is younger than 5 s and no drain is under way
drainingtrue once a drain has begun

The file is not removed when the process exits, so a reader must check that ts is recent. A stale file with "alive":true means the writer stopped.

OTLP export

The otel build feature exports over OTLP/HTTP with JSON bodies. The collector is observability.otel.endpoint, else the OTEL_EXPORTER_OTLP_ENDPOINT environment variable. agentd appends /v1/traces or /v1/logs unless the URL already ends with it. Only a plain http:// collector is supported; an https:// endpoint exports nothing.

Traces. With a collector configured, each turn worker and subagent loop exports one batch when it finishes: an invoke_agent span with a chat child per model call and an execute_tool child per tool call. Spans share the instance's trace_id. The resource carries service.name: agentd and service.version.

SpanAttributes
invoke_agentgen_ai.operation.name, gen_ai.request.model, gen_ai.usage.input_tokens, gen_ai.usage.output_tokens
chatgen_ai.operation.name, gen_ai.request.model, gen_ai.usage.input_tokens, gen_ai.usage.output_tokens
execute_toolgen_ai.operation.name, gen_ai.tool.name

A span's status is OK or ERROR. Export is best effort: a failure is dropped and never fails the turn.

Logs. observability.otel.logs: true mirrors the supervisor process's log lines to the collector every 5 s. Each record's body is the event name, its severity the level, and the attribute log.fields the whole line as a JSON string. At most 8192 records wait between flushes; the rest are dropped.

Audit records

observability.audit.sink turns on the audit trail. A record is:

FieldMeaning
tsMilliseconds since the epoch
instanceThe instance name
principalWho acted: a principal id, operator, or system
roleThe principal's role
actionWhat was done (below)
targetWhat it was done to
outcomeok, or the refusal or failure
request_idThe A2A message id, when there is one
traceThe instance's trace_id
sidThe sign-in session, when the caller used one

The action of an A2A call is a2a.<method>, or a2a.<method>:<op> when the message carried a command: a2a.SendMessage:admin.drain, a2a.SendMessage:workflow.run. A reload is config.reload with outcome applied, invalid or restart_required. MCP Events runtime subscriptions record mcp.events.subscribed and mcp.events.unsubscribed.

SinkWhere the record goes
logAn audit line on stderr
storeA durable record in the configured store, never rewritten or listed
streamAn event on observability.audit.stream, subject audit

A failed store write logs audit.store.fail and never fails the audited action.

Runtime events stream

observability.runtime_events copies selected event families, as the supervisor process writes them, onto a declared stream, where stream start nodes consume them. The subject is the event name and the data is the log line.

KeyMeaning
streamThe declared stream the events land on
includeFamilies taken in full
sampledFamilies taken at 1 in 16
queueEvents held between ticks before new ones are dropped and counted (default 512)

Appends shed under resource pressure like any other admission, and a refused append is dropped rather than retried (stream.tap.dropped, stream.tap.refused). Lines written while the queue is being appended are not captured, so the stream never feeds on its own retention trims.

Next steps