0.11.0

AgJSON draft.8: the closing draft freezes the vocabulary for major 1

A minor release that ships spec revision 1.0.0-draft.8 (AGJSON_VERSION), the closing draft before the release candidate. It fixes the vocabulary for major 1: §12 now lists every closed set and its class, a new block type reaches only a client that declares support for it, and after 1.0 a change to what a field or fold means is a major. On the wire, 0.11.0 adds optional fields only, and every recorded stream serializes byte-identically to 0.10.0.

What the reference producers emit for now

Until every deployed consumer runs a draft.4 or later reader, the reference producers emit no event type, closed-set value or block type beyond draft.3’s vocabulary except ext.<vendor>.*. A reader from before draft.4 drops an event type it doesn’t know and parks on the gap, while a draft.4 or later reader stubs it in place and keeps its seq slot (§12).

Upgrading from 0.10.x

  • AgReasoningConfig.effort is an open string. "minimal", "low", "medium" and "high" stay documented, and any other string now passes. A receiver on an earlier core still rejects an undocumented value as unknown-value, so upgrade the receiving side before you send one. A non-string effort is still malformed, and mode stays a closed set.
  • A memory record keeps the write’s _meta. AgMemoryRecord gains an optional _meta, copied from memory.write._meta. A stream whose memory.write carried _meta re-folds with it, where 0.10.0 dropped it. A reader that stores a strict parse’s output drops the field; the reference reader keeps unknown fields (§0.2).

Spec: AgJSON 1.0.0-draft.8

  • Closed sets for major 1. §12’s table is the normative list of closed sets, each with its class. Within major 1, a set classed FROZEN gains no value; new vocabulary for it lands only as an optional open-string companion where the table names one, as turn.done.finishReasonRaw does for the finish reason. AgBlock has 16 kinds.
  • New block types. A later minor may define a new AgBlock type together with an additive AgClientCapabilities field that declares support for it. A producer must not emit that block type to a client whose declared capabilities omit it.
  • Version acceptance. A consumer rejects a different major and should accept any same-major version, including any prerelease tag of that major (-draft.*, -rc.*). The per-client version gate and its 1.0.0-draft.3 default are withdrawn. No producer implemented them, and a receiver already rejects an absent version as malformed, so nothing changes in practice.
  • After 1.0, a change to what an existing field or fold means is a major.
  • ext.<vendor>.<key>: §12 states the grammar the schema enforces. The vendor is one dot-free token that the emitter owns, and the key may carry dots. The reversed-domain recommendation is retired.
  • Built records. A record the fold builds carries only the members its type declares (§5). The reference reducer already does.
  • Fold changes, both additive record fields (§12): AgMemoryRecord._meta (above), and prompt.blocked.reasonRaw carried onto AgTurnRecord.promptBlocked (below). 0.10.0 dropped both.
  • prompt.blocked.reasonRaw, an optional open-string companion that carries a native block reason the mapping reports as "other" (§4, §10 item 23).
  • Recalled memory has no AgJSON event. The Claude Agent SDK’s memory_recall frame rides ext.anthropic.frame, byte-preserved, and a host-executed memory-tool read reports on that call’s tool.done (§13.11). This draft neither adds nor reserves a memory.read event.
  • Housekeeping, text only:
    • §10 now reads as a conformance definition: each framework-specific item states whom it binds.
    • §11 is resolved.
    • §13.11 no longer offers ADK user:/app: keys as a memory.write example; they ride state.delta for all of 1.x (§8.0 item 30).
    • The draft notes move to a new §15, Revision history, with an errata policy. An erratum corrects the text of a published revision, never what a field, event or fold means. It’s applied in place and doesn’t move the version.
  • No golden changes. draft.7 envelopes remain accepted (same major, §12).

@silverprotocol/core

  • prompt.blocked.reasonRaw, folded onto AgTurnRecord.promptBlocked, as turn.done.finishReasonRaw is carried. An event without it lands a record without it.
  • AgMemoryRecord._meta. A value write replaces the record whole, _meta included, so a write without one lands a record without one. A patch replaces _meta only when the write carries one, as it does reason and durable. A messages.snapshot’s memory elements declare the same field, and toPersistable() keeps it.
  • AgReasoningConfig.effort is typed string, so checkAgInput() no longer reports an undocumented effort as unknown-value.
  • AGJSON_VERSION is 1.0.0-draft.8.

Google ADK

  • An unmapped prompt block reason rides prompt.blocked.reasonRaw. SAFETY, BLOCKLIST and PROHIBITED_CONTENT map to their reasons and carry no reasonRaw. Any other promptFeedback.blockReason maps to "other" and now rides reasonRaw verbatim. On @google/adk 2.1.0, no ADK-built event carries promptFeedback, because ADK turns a prompt block into an error code and message. So this serves events built elsewhere.

Wire version

1.0.0-draft.8, with optional fields only. Replaying the 77 recorded streams through the 0.10.0 and 0.11.0 packages, output is byte-identical for every one: Claude Agent SDK 30 of 30, Google ADK 24 of 24 (with and without the host-completion event), OpenAI Agents SDK 15 of 15 and Vercel AI SDK 8 of 8. The new optional fields appear in no recorded stream. The other framework packages change only their READMEs’ wire-version line, and @silverprotocol/richtext is unchanged apart from its version.

The v0.11.0 release is tagged at typescript-sdk commit d24faaaf, the commit npm’s provenance for all six 0.11.0 packages attests.