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.
Fields and variants
Section titled “Fields and variants”action— ExperimentalagentPathapprovalIdargsattachmentsbackgroundbackgroundInitiatorbackgroundStatus— ExperimentalblockingcallIdchildPromptRefschildSessionIdchildSessionLogPathchildrencommandIdcommandTextcontrolStatuscutOffdeclaredPhasedepthdisplayLabeldisplayTextdurationMsentryIdeventexitCodeexitSignalfailureKindfailureReasonfallbackTextfinalSummarygenerationIdhookKeyitemIdkindlabelmessagemessagePhasemodelVisibleContentmonitorDescriptionmonitorIdobjectiveoutcomeoutputRefpatchRefpatchSummarypattern— ExperimentalpausedproviderItemIdproviderStatus— Experimentalquery— ExperimentalrawItem— ExperimentalreasonrecordedAtreminderAgentIdresultresults— ExperimentalresumeFromRunIdretractedrevisionrolerunStatusscriptIdselector— ExperimentalsideSessionIdsource— ExperimentalstatusstatusAttemptstatusChildrenstatusHealthstatusLinestatusPhasestatusProgressstatusStepsteeredstopAvailablestrategyIdsubagentIdsummarizedThroughsummarytaskIdtexttokenBudgettokensAftertokensBeforetooltoolReceipttriggertriggerSourcetruncatedturnIdurl— ExperimentalusagevisibleOutputworkflowRunId
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"}