APS-1 event envelope

Every ingested record is a versioned JSON object, canonicalized and signed with Ed25519 before POST. Field names below are required unless marked optional.

Core fields

FieldTypeRequiredDescription
schema_versionnumberYesAlways 1 for current APS draft
event_idstringYesUnique id, e.g. evt_…
organization_iduuidYesTenant scope
trace_idstringYesGroups related events in one workflow
agent_idstringYesRegistered agent
key_idstringYesSigning key used
emitted_atISO8601YesAgent clock at emission
actor_typeenumYesagent | human | system
actor_principalstringYesService account or user label
action_kindenumYesllm_invocation | policy_decision | tool_call | human_approval | result
policy_decisionenumYesallow | deny | allow_with_obligation | allow_retro_audit
payloadobjectYesAction-specific JSON — see Payload conventions
tool_namestringNoStable tool id for policy matching
parent_event_idstringNoLinks child steps in a trace
policy_idstringNoSet when policy engine attributed a rule
sig_algstringYesed25519 (after signing)
sig_value_b64stringYesBase64 signature (after signing)

action_kind usage

  • llm_invocation — model read/generate; put data_touched in payload
  • policy_decision — emitted by wrapFetch before tool execution
  • result — HTTP outcome after allowed tool call
  • human_approval — console approval action

Minimal example (pre-signature)

json
{
  "schema_version": 1,
  "event_id": "evt_001",
  "organization_id": "00000000-0000-0000-0000-000000000001",
  "trace_id": "trc_001",
  "agent_id": "agt_001",
  "key_id": "key_001",
  "emitted_at": "2026-05-21T12:00:00.000Z",
  "actor_type": "agent",
  "actor_principal": "worker-1",
  "action_kind": "llm_invocation",
  "policy_decision": "allow",
  "tool_name": "openai.chat",
  "payload": { "purpose": "summarize" }
}