Why: A separately exported ContextSection is unused inside the UI package and pushes the knip ratchet over its baseline.
Evidence: UI knip reported 56 unused exports against baseline 55. The section shape stays on ContextObservation.sections.
Impact: Generated frontend and UI contracts drop the extra export. JSON field names are unchanged.
Refs: .task/feature-sillytavern-review.md
Co-authored-by: Cursor <cursoragent@cursor.com>
Why: Labeled secrets, excluded turns, and candidate replies need fields on the shared message contract, and context snapshots need a section breakdown plus a stable prefix hash.
Evidence: go test ./... in agent-system-core. New fields use omitempty, so existing golden JSON stays the same.
Impact: Clients that ignore unknown fields keep working. Assemblers can now mark a message excluded or as one candidate in a group.
Refs: docs/records/2026-10-04-sillytavern-review.md
Why: a fallback chain can answer with a different model than the one that was requested, and usage has to name the model that actually served.
Evidence: go test .
Impact: the field is omitted when empty, so existing usage JSON stays the same.
Refs: feature/durable-rewind
Co-authored-by: Cursor <cursoragent@cursor.com>
Why: The product needs a session mode and a place to show tool arguments on a confirmation card without inventing a second card type.
Evidence: GOWORK=off go test . passed. New fields use omitempty, so existing golden JSON stays the same.
Impact: Empty permission mode still means the profile policy. Clients that ignore unknown fields keep working.
Refs: feature/permission-hooks
Co-authored-by: Cursor <cursoragent@cursor.com>
Why: The final reply is composed after the work loop, and the automatic end check needs its own part and event so the timeline can show it without mixing it into the user-facing text.
Evidence: go test ./...
Impact: New RunPhase finalizing, PartType check, and run.check. Existing payloads are unchanged.
Refs: feature/final-reply-compose
Co-authored-by: Cursor <cursoragent@cursor.com>
Why: The client only learned about a tool call once execution started, so long argument generation looked like a frozen cursor.
Evidence: go test ./...
Impact: New tool.call.delta and tool.output events; tool.result may include durationMs. Unknown event types stay ignored.
Refs: feature/stream-display-overhaul
Co-authored-by: Cursor <cursoragent@cursor.com>
Why: The workflow executor needs a shared contract for subagent profiles, plugin scripts, and per-step plus whole-run retry caps.
Evidence: go test ./... passed, including the new workflow_def golden.
Impact: New fields are omitempty, so existing workflow JSON still decodes. Kind script is additive.
Refs: feature/agent-harness-p4
Co-authored-by: Cursor <cursoragent@cursor.com>
Why: User overrides of a subagent profile need a place on the shared contract, and empty fields must stay omitted so older modules keep their meaning.
Evidence: go test ./... passed, including the new prompt_module_subagent golden.
Impact: Existing modules serialize the same. Frontend and UI contracts still need a copy of the type.
Refs: feature/agent-harness-p3b
Co-authored-by: Cursor <cursoragent@cursor.com>
Why: Downstream repositories need a versioned public manifest for skills, MCP, knowledge, parsers, agents, channels, and pages without forking the base.
Evidence: go test ./... passed after omitzero on empty scope and backend so the golden plugin_manifest stays stable.
Impact: apiVersion 1.0 remains accepted. New provides fields are optional. Scope and backend are omitted when zero.
Refs: docs/proposals/2026-10-01-plugin-contract-v2.md
Co-authored-by: Cursor <cursoragent@cursor.com>
Why: The chat timeline needs a persisted thinking duration, and tool duration already lives on the tool call, so the thinking part had nowhere to put it.
Evidence: go test ./... passes; the message golden now includes durationMs on the thinking part.
Impact: Additive JSON field with omitempty. Existing clients ignore unknown fields.
Refs: feature/chat-timeline-preview
Co-authored-by: Cursor <cursoragent@cursor.com>
Why: cross-session transcript reading needs per-conversation outbound
(allowCrossRead, default true) and inbound (crossPrivate, default false)
flags alongside the project-level gate; see the approved proposal.
Evidence: go test ./... passes with golden conversation.json regenerated
to exercise both wire fields.
Impact: additive contract fields (omitempty), wire-compatible for
existing clients that ignore unknown fields.
Refs: Agent-System-Documents proposals/2026-09-30-cross-session-reading.md
(Dev task feature/cross-session-reading).
Why: plugins and the host need one shared avatar primitive for member/
owner displays in cards, messages, and admin surfaces (user decision
2026-09-30: avatars, cards, settings become base capabilities plugins
reuse directly).
Evidence: go test green with regenerated golden (single avatar with
sub/tone plus a stacked group); omitempty keeps existing wire samples
byte-stable.
Impact: additive optional UINode field + type; unknown-type consumers
ignore it (forward compat). Renderers gain 'avatar' via the ui repo.
Refs: Agent-System-Documents proposal 2026-09-30-ui-redesign-and-auth.md
Why: the approved task-centric sidebar (proposal 2026-09-30, option A) needs
server-authoritative pin and archive state on conversations; client-side
storage would be fake state against the event-sourced model.
Evidence: go test ./... passes; omitempty keeps wire format and golden
samples byte-identical for zero values (backward compatible).
Impact: additive optional fields; consumers ignoring unknown fields are
unaffected (forward-compat principle). Backend consumes via submodule bump.
Refs: Agent-System-Documents docs/proposals/2026-09-30-ui-redesign-and-auth.md (P6/P8, R1)
Why: prompts are moving from code into a data library; core needs the
PromptModule/Trigger/Block contract and profiles need an ordered
promptModules reference (empty = default base+env set).
Evidence: unit-covered via backend prompts package tests over this
contract; composite make test green.
Impact: additive contract fields only; no behavior change in core.
Refs: feature/prompt-library task card.
Why: Contract foundation for the inbox/command-bus/workspaces phase (proposal
D28/D30): ActivityCard as the first-class state object behind the right-rail
inbox, card.* stream events, inline-confirm anchoring (anchorMessageId +
blocked/blockReason) on HITL, seven new UI schema vocabularies, plugin
provides.commands/workspaces, workflow card step and workspace declarations.
Evidence: go vet clean; conformance goldens regenerated and verified — new
activity_card / hitl_card_blocked / event_card_created / event_card_resolved /
ui_vocabularies samples plus extended plugin_manifest; CardStatus.Terminal
helper unit-covered via build; ts/types.ts mirrors all additions.
Impact: Additive only (omitempty fields, new types, new event types) — existing
consumers ignore unknown values per forward-compat rule; vocabulary spec types
carry a Spec suffix to avoid const-name collisions.
Refs: modules/documents docs/proposals/2026-09-30-ui-inbox-command-workspace.md