Skip to content

Item

One transcript item at one revision. item/started, item/updated, and item/completed carry the full object; item/delta appends to it by field path.

  • action — Experimental
  • agentPath
  • approvalId
  • args
  • attachments
  • background
  • backgroundInitiator
  • backgroundStatus — Experimental
  • blocking
  • callId
  • childPromptRefs
  • childSessionId
  • childSessionLogPath
  • children
  • commandId
  • commandText
  • controlStatus
  • cutOff
  • declaredPhase
  • depth
  • displayLabel
  • displayText
  • durationMs
  • entryId
  • event
  • exitCode
  • exitSignal
  • failureKind
  • failureReason
  • fallbackText
  • finalSummary
  • generationId
  • hookKey
  • itemId
  • kind
  • label
  • message
  • messagePhase
  • modelVisibleContent
  • monitorDescription
  • monitorId
  • objective
  • outcome
  • outputRef
  • patchRef
  • patchSummary
  • pattern — Experimental
  • paused
  • providerItemId
  • providerStatus — Experimental
  • query — Experimental
  • rawItem — Experimental
  • reason
  • recordedAt
  • reminderAgentId
  • result
  • results — Experimental
  • resumeFromRunId
  • retracted
  • revision
  • role
  • runStatus
  • scriptId
  • selector — Experimental
  • sideSessionId
  • source — Experimental
  • status
  • statusAttempt
  • statusChildren
  • statusHealth
  • statusLine
  • statusPhase
  • statusProgress
  • statusStep
  • steered
  • stopAvailable
  • strategyId
  • subagentId
  • summarizedThrough
  • summary
  • taskId
  • text
  • tokenBudget
  • tokensAfter
  • tokensBefore
  • tool
  • toolReceipt
  • trigger
  • triggerSource
  • truncated
  • turnId
  • url — Experimental
  • usage
  • visibleOutput
  • workflowRunId
Source

schema/msp/experimental/msp.schema.json#/types/Item

{
"description": "One transcript item at one revision. `item/started`, `item/updated`, and `item/completed`\ncarry the full object; `item/delta` appends to it by field path.",
"properties": {
"action": {
"description": "`webSearch`: the search action as an open-enum string — `search` |\n`openPage` | `findInPage`, else tolerated unknown. Absent while the call is open (the action is not\nfinal until the item completes).",
"type": "string",
"x-msp-descriptor": "Item.action",
"x-msp-stability": "experimental"
},
"agentPath": {
"description": "`subagent`: agent definition path.",
"type": "string"
},
"approvalId": {
"description": "`toolCall`: the approval that gated this call; join key for\nthe approval view events.",
"type": "string"
},
"args": {
"description": "`toolCall`: the model-authored argument JSON, **verbatim**; clients\nparse. Verbatim keeps the fold byte-deterministic and survives\nmodel-emitted almost-JSON.",
"type": "string"
},
"attachments": {
"description": "`userMessage`: image attachment metadata only — base64 payloads are\nnot echoed back on the view.",
"items": {
"$ref": "#/$defs/MessageAttachment"
},
"type": "array"
},
"background": {
"description": "`toolCall`: `true` once the task was durably backgrounded; delivered\nvia `item/updated`.",
"type": "boolean"
},
"backgroundInitiator": {
"$ref": "#/$defs/BackgroundInitiator",
"description": "`toolCall`: who backgrounded the task; absent on pre-split records —\nnever inferred."
},
"backgroundStatus": {
"$ref": "#/$defs/BackgroundStatus",
"description": "`toolCall`: the backgrounded-row payload for a running\nbackgrounded item (ADR 50041 D1) — auto-yield or an explicit\nuser/timeout background; may appear with or without\n`background`/`backgroundInitiator`. Experimental, delivered via\n`item/updated`. Presentation only — never a durability claim.",
"x-msp-descriptor": "item/updated.backgroundStatus",
"x-msp-stability": "experimental"
},
"blocking": {
"description": "`reminderChild`: `true` when this child is a blocking reminder (it holds\nthe turn open until it settles); absent otherwise, never `false` (ADR\n41191 D4). The status word stays off the wire; clients name the\nreminder from `reminderAgentId`.",
"type": "boolean"
},
"callId": {
"description": "`toolCall`: the provider call id (`call_...`), opaque.",
"type": "string"
},
"childPromptRefs": {
"description": "`workflow`: one `outputRef`-shaped link per recorded child spawn\nwith an objective (`kind: \"workflow_child_prompt\"`), fetched via\n`item/readOutput`.",
"items": {
"$ref": "#/$defs/OutputRef"
},
"type": "array"
},
"childSessionId": {
"description": "`subagent`/`reminderChild`: the child's own session id, readable via\n`session/read`/`view/page` — child transcript drill-down without a\nsecond protocol.",
"type": "string"
},
"childSessionLogPath": {
"description": "`reminderChild`: parent-session-dir-relative child log path; absent\nwhen no filesystem log.",
"type": "string"
},
"children": {
"description": "`workflow`: folded per-child state, keyed by `(childId, attempt)`,\nre-emitted whole on every change — the item `revision` is the\nordering guard.",
"items": {
"$ref": "#/$defs/WorkflowChild"
},
"type": "array"
},
"commandId": {
"description": "`userMessage`/`userShell`: the submitting command — multi-client UIs\nde-duplicate their local echo on it.",
"type": "string"
},
"commandText": {
"description": "`userShell`: the command text as submitted.",
"type": "string"
},
"controlStatus": {
"$ref": "#/$defs/SubagentControlStatus",
"description": "`subagent`: camelCased `SubagentControlStatus` (open enum); `status`\nstays the generic item vocabulary."
},
"cutOff": {
"description": "`agentMessage`: `true` when the provider stream died mid-reply and\nthe run failed with this partial text committed (ADR 50063 D2) —\nthe wire mark for the gate-off \"incomplete response\" rule. Absent otherwise; never cleared once set.",
"type": "boolean"
},
"declaredPhase": {
"description": "`workflow`: the run-level declared-phase label — the last `Phase`\ndetail-row label of the reconciled projection; terminal-only, absent\nwhile live.",
"type": "string"
},
"depth": {
"description": "`subagent`: nesting depth.",
"type": "integer"
},
"displayLabel": {
"$ref": "#/$defs/ToolDisplayLabel",
"description": "`toolCall`: the tool's own words for this call; absent = none."
},
"displayText": {
"description": "`userMessage`: presentation form; absent when the client\nsent none.",
"type": "string"
},
"durationMs": {
"description": "`userShell`/`subagent`: observed wall-clock duration. `workflow`: the\nrun's wall time from launch to reconciliation, set only on the\nsettling `item/completed` — never a sum of child durations.",
"type": "integer"
},
"entryId": {
"description": "`workflow`: launched entry identity.",
"type": "string"
},
"event": {
"$ref": "#/$defs/HookEventName",
"description": "`hookRun`: the hook event in Q2 camelCase vocabulary."
},
"exitCode": {
"description": "`userShell`: the process exit code, when it exited by code.",
"type": "integer"
},
"exitSignal": {
"description": "`userShell`: the terminating signal NUMBER, when signalled (e.g. 9) —\nthe durable payload verbatim; nothing maps numbers to names, and the\nfold never invents one.",
"type": "integer"
},
"failureKind": {
"description": "`toolCall`: machine-readable failure class (`TaskFailureKind`, snake_case verbatim — durable runtime vocabulary, the casing exemption).",
"type": "string"
},
"failureReason": {
"description": "`toolCall`/`subagent`: `Failed`/`Rejected`/`Cancelled` reason text,\nverbatim.",
"type": "string"
},
"fallbackText": {
"description": "Server-provided one-line human summary any kind MAY carry, for\ngeneric rendering of kinds a client does not recognize; new kinds\nSHOULD carry it during their first release cycle.",
"type": "string"
},
"finalSummary": {
"description": "`workflow`: the human terminal summary projected from the reconciled\nLaunch envelope, bounded at the 64 KiB surface budget; terminal-only.",
"type": "string"
},
"generationId": {
"description": "`reminderChild`: the reminder generation.",
"type": "integer"
},
"hookKey": {
"description": "`hookRun`: the durable `hook_key`.",
"type": "string"
},
"itemId": {
"description": "Bare UUIDv7; the item's identity across its whole lifecycle. Identity\nrule: the task id for task-backed kinds\n(`toolCall`, `subagent`), the pre-minted commit `message_id` for\ndelta-streamed kinds (`agentMessage`, `reasoning`), and the opening\ndurable record's event id for everything else. Opaque to clients.",
"type": "string"
},
"kind": {
"$ref": "#/$defs/ItemKind",
"description": "The item kind (open enum): clients MUST render unknown kinds\ngenerically — kind name plus `status` plus `fallbackText`."
},
"label": {
"description": "`hookRun`: capped display label.",
"type": "string"
},
"message": {
"description": "`workflow`: the reconciled terminal message, set on completion.",
"type": "string"
},
"messagePhase": {
"$ref": "#/$defs/MessagePhase",
"description": "`agentMessage`: the phase the model declared on the commit; see [`MessagePhase`]."
},
"modelVisibleContent": {
"description": "`toolCall`: rich content the model saw beyond text; base64 is not\ninlined on the view.",
"items": {
"$ref": "#/$defs/ModelVisibleContent"
},
"type": "array"
},
"monitorDescription": {
"description": "`monitorFeed`: the monitor's arm-time description with the\ndurable `\"Monitor event: \"` summary prefix stripped; model-\ncontrolled tool input under the 64 KiB per-surface budget —\nsanitize before render (ADR 50058-monitor-feed-wire D1/D3).",
"type": "string"
},
"monitorId": {
"description": "`monitorFeed`: the monitor task id — the same value as that\nmonitor's `toolCall` `itemId` (ADR 50058-monitor-feed-wire D1).",
"type": "string"
},
"objective": {
"description": "`subagent`: objective as spawned, bounded on the wire at the 64 KiB\nretained-text budget; a cut sets\n`truncated`. The durable record stays verbatim.",
"type": "string"
},
"outcome": {
"$ref": "#/$defs/CompactionOutcome",
"description": "`compaction`: terminal only — folds installed/fallback status."
},
"outputRef": {
"$ref": "#/$defs/OutputRef",
"description": "`toolCall`/`userShell`: stored-output reference; fetch the full bytes\nvia `item/readOutput`."
},
"patchRef": {
"$ref": "#/$defs/OutputRef",
"description": "`toolCall`: stored structured-patch reference (`kind: \"tool_patch\"`,\n`mediaType: \"application/json\"`); the body is fetched via\n`item/readOutput` with `patchRef.id`, and the ref survives the\n elided-snapshot rung exactly like `outputRef` without ever\nbeing an elision trigger."
},
"patchSummary": {
"$ref": "#/$defs/PatchSummary",
"description": "`toolCall`: server-authored edit-family diff summary\n— always beside `patchRef`; absent = no diff available."
},
"pattern": {
"description": "`webSearch`: the in-page pattern, verbatim — present iff\n`action == \"findInPage\"`.",
"type": "string",
"x-msp-descriptor": "Item.pattern",
"x-msp-stability": "experimental"
},
"paused": {
"description": "`workflow`: `true` only while a durable pause fact is in force for\nthe run's generation; absent otherwise, never `false`.",
"type": "boolean"
},
"providerItemId": {
"description": "`reasoning`: provider reasoning item id (e.g. `rs_...`), for\nprovider-side correlation.",
"type": "string"
},
"providerStatus": {
"description": "`webSearch`: the provider's terminal status, verbatim\n(`\"completed\"` | `\"failed\"` | `\"cancelled\"` | other) — present on\nthe completed item.",
"type": "string",
"x-msp-descriptor": "Item.providerStatus",
"x-msp-stability": "experimental"
},
"query": {
"description": "`webSearch`: the search query, verbatim — present iff\n`action == \"search\"` with a query to carry.",
"type": "string",
"x-msp-descriptor": "Item.query",
"x-msp-stability": "experimental"
},
"rawItem": {
"description": "`webSearch`: the verbatim raw provider JSON frame under the 64 KiB\nper-surface budget; past-budget frames cut here and ride whole\nbehind `outputRef`.",
"type": "string",
"x-msp-descriptor": "Item.rawItem",
"x-msp-stability": "experimental"
},
"reason": {
"description": "`compaction`: noop/failure reason, verbatim (snake_case durable\nvocabulary, e.g. `\"no_compactable_history\"`). `hookRun`: terminal-only\ncapped terminal reason.",
"type": "string"
},
"recordedAt": {
"description": "RFC3339 timestamp of the item's driving durable record. Absent on\nephemeral-opened items until first durable re-emission.",
"type": "string"
},
"reminderAgentId": {
"description": "`reminderChild`: the reminder agent's id.",
"type": "string"
},
"result": {
"$ref": "#/$defs/SubagentResult",
"description": "`subagent`: the result envelope from `ResultReady`."
},
"results": {
"description": "`webSearch`: the typed result hits, verbatim, never truncated —\nclients read `results.length` for the count.",
"items": {
"$ref": "#/$defs/WebSearchHit"
},
"type": "array",
"x-msp-descriptor": "Item.results",
"x-msp-stability": "experimental"
},
"resumeFromRunId": {
"description": "`workflow`: set on resumed launches.",
"type": "string"
},
"retracted": {
"description": "`userMessage`: `true` after an accepted retract;\nre-emitted via `item/updated`.",
"type": "boolean"
},
"revision": {
"description": "Integer >= 1, strictly monotonic per item; apply rule is\nreplace-iff-higher. `item/delta` never bumps it.",
"type": "integer"
},
"role": {
"description": "`subagent`: role as spawned.",
"type": "string"
},
"runStatus": {
"$ref": "#/$defs/HookRunStatus",
"description": "`hookRun`: terminal-only durable outcome; stays `blocked` when the\nitem settles `rejected`."
},
"scriptId": {
"description": "`workflow`: launched script identity.",
"type": "string"
},
"selector": {
"description": "`skillRead`: the read skill's catalog selector (matches the\n`skill/list` row; the raw observed id when the read resolved to\nno catalog row). Set on every `skillRead` item (ADR 33401 D10);\nold clients render it beside the kind name.",
"type": "string",
"x-msp-descriptor": "Item.selector",
"x-msp-stability": "experimental"
},
"sideSessionId": {
"description": "`sideChat`: the side's own session id, readable via\n`session/read`/`view/page` — drill-down without a second protocol.",
"type": "string"
},
"source": {
"description": "`skillRead`: the catalog source (matches the `skill/list` row);\nempty when the host could not resolve the read to a catalog row\n(replay without the tool result, context-only evidence). Set on\nevery `skillRead` item (ADR 33401 D10); each client composes the\nnotice line from `selector` + `source`.",
"type": "string",
"x-msp-descriptor": "Item.source",
"x-msp-stability": "experimental"
},
"status": {
"$ref": "#/$defs/ItemStatus",
"description": "Open enum; terminal = anything other than `\"inProgress\"`. Unknown\nvalues MUST be treated as terminal-unknown and rendered generically."
},
"statusAttempt": {
"$ref": "#/$defs/StatusAttempt",
"description": "`toolCall`: the latest external-attempt facet, field-for-field —\ncountdown inputs the client renders the tick from; absent when the\nlatest detail carries none."
},
"statusChildren": {
"$ref": "#/$defs/StatusChildren",
"description": "`toolCall`: the latest child-summary facet, field-for-field; absent\nwhen the latest detail carries none."
},
"statusHealth": {
"$ref": "#/$defs/StatusHealth",
"description": "`toolCall`: the latest health facet, field-for-field; absent when\nthe latest detail carries none."
},
"statusLine": {
"description": "`toolCall`: the task's visible latest-status line — the latest\n`Status` message through the shared detail normalization; absent\nwhen no status folded or nothing displayable remains.",
"type": "string"
},
"statusPhase": {
"description": "`toolCall`: the latest detail's phase row, verbatim; absent when the\nlatest detail carries none.",
"type": "string"
},
"statusProgress": {
"$ref": "#/$defs/StatusProgress",
"description": "`toolCall`: the latest progress facet, field-for-field; absent when\nthe latest detail carries none."
},
"statusStep": {
"$ref": "#/$defs/StatusStep",
"description": "`toolCall`: the latest active-step facet, field-for-field; absent\nwhen the latest detail carries none."
},
"steered": {
"description": "`userMessage`: `true` when injected mid-turn via `turn/steer` or\n`ifBusy: \"steer\"`; absent otherwise.",
"type": "boolean"
},
"stopAvailable": {
"description": "`workflow`: display-only stop affordance — `true` while the run is\nopen, `false` once settled; stopping rides `workflow/cancel`. Authorizes nothing.",
"type": "boolean"
},
"strategyId": {
"description": "`compaction`: summarizer strategy (installed only).",
"type": "string"
},
"subagentId": {
"description": "`subagent`: durable child identity (`subagent_id`).",
"type": "string"
},
"summarizedThrough": {
"description": "`compaction`: opaque provenance string naming the compaction\nboundary. A compaction-anchored read anchor since (2026-08-12):\naccepted by `session/resume` and `view/page`. Still opaque — clients relay it,\nnever parse it.",
"type": "string"
},
"summary": {
"description": "`reasoning`: one entry per summary part; part *n* streams via\n`item/delta` field `\"summary.n\"` (part boundary = index change).",
"items": {
"type": "string"
},
"type": "array"
},
"taskId": {
"description": "`reminderChild`: the linked task id.",
"type": "string"
},
"text": {
"description": "`userMessage`: the prompt text as submitted. `agentMessage`: the\naccumulated reply, streamed via `item/delta` field `\"text\"`.\n`reasoning`: raw committed reasoning text where the provider exposes\nit.",
"type": "string"
},
"tokenBudget": {
"$ref": "#/$defs/WorkflowTokenBudget",
"description": "`workflow`: the run's launch token budget, set from the launch fact; absent when the launch carried none."
},
"tokensAfter": {
"description": "`compaction`: token budget snapshot after, when measured.",
"type": "integer"
},
"tokensBefore": {
"description": "`compaction`: token budget snapshot before, when measured.",
"type": "integer"
},
"tool": {
"description": "`toolCall`: tool name.",
"type": "string"
},
"toolReceipt": {
"$ref": "#/$defs/ToolReceipt",
"description": "`toolCall`: the shared semantic receipt — what the operation did, as\nmachine-readable fact. Optional and\nadditive: absence is always valid and is never an error (D3). When\npresent, a server serves the **same** receipt on every item path —\n`item/completed`, `view/page`, seeded snapshots and resume (D3).\nObservation only; carries no control authority (D4), and no field in\nit enters model-visible content (D7)."
},
"trigger": {
"$ref": "#/$defs/CompactionTrigger",
"description": "`compaction`: what initiated the compaction."
},
"triggerSource": {
"description": "`workflow`: camelCased `WorkflowLaunchTriggerSource`, verbatim\n(durable runtime vocabulary, e.g. `\"modelProposal\"`).",
"type": "string"
},
"truncated": {
"description": "`true` when the server's per-surface text budget saturated a streamed\nsurface (`agentMessage.text`, `reasoning.summary[*]`,\n`toolCall.visibleOutput`, `userShell.visibleOutput`), cut a\n`subagent` surface (`objective`, `fallbackText`, `result.summary`,\n`result.text`), or cut a `monitorFeed` surface (`text`,\n`fallbackText`, `monitorDescription`) (ADR 50058-monitor-feed-wire\nD3). On a `subagent` item the flag is item-level and never\ncleared: once any of those four is cut, every later update keeps it,\neven when `result.text` arrives whole (ADR 35691 D9). The durable full\ntext remains in the log.",
"type": "boolean"
},
"turnId": {
"description": "The owning turn. `null` for the kinds outside a turn: `userShell` always, `hookRun` for session-boundary runs, `monitorFeed`\nalways (ADR 50058-monitor-feed-wire D1).",
"type": [
"string",
"null"
]
},
"url": {
"description": "`webSearch`: the page URL, verbatim — present iff\n`action == \"openPage\"` or `\"findInPage\"`.",
"type": "string",
"x-msp-descriptor": "Item.url",
"x-msp-stability": "experimental"
},
"usage": {
"$ref": "#/$defs/TokenUsage",
"description": "`subagent`: **transitive** observed usage — the child and its own\ndescendants; updated in place, absent until first observation; never\nfolded into `session/tokenUsage.cumulative`."
},
"visibleOutput": {
"description": "`toolCall`/`userShell`: bounded transcript-visible result text; streams via `item/delta` field `\"output\"`.",
"type": "string"
},
"workflowRunId": {
"description": "`subagent`/`workflow`: the owning durable workflow run id (opaque\nstring — not a UUID family).",
"type": "string"
}
},
"required": [
"itemId",
"kind",
"revision",
"status"
],
"type": "object"
}