0.6.2

A turn that failed no longer reports success

The second cohort from the weekly maintenance sweep, and the first one whose headline is a bug we shipped rather than a peer that moved. One wrong mapping is corrected, four upstream signals get a lossless home, and the @openai/agents peer ceiling opens so installing the latest no longer warns. The wire vocabulary is untouched — AGJSON_VERSION stays 1.0.0-draft.3.

Fixed: a failed OpenAI response could close as a successful turn

@silverprotocol/openai-agents declared the response.completed event’s status as "completed" | "incomplete". The wire is wider than that: openai-node types ResponseStatus as completed, failed, in_progress, cancelled, queued or incomplete, and a response.completed event carries a whole Response object, status included. A response that reported status: "failed" or "cancelled" therefore fell past every error branch and closed the turn as turn.done with outcome: {type: "success"}.

From 0.6.2 an unsuccessful terminal status closes as turn.error, carrying the status as the error code. The branch sits last, so refusal, content_filter and response.incomplete keep their exact prior precedence and output; a response.completed with an absent or "completed" status is byte-identical to 0.6.1. One refinement beyond the literal fix: if a producer sends the self-contradictory combination of status: "incomplete" and an incomplete_details.reason, the sharper reason wins, so code reads the same as it would have from a correctly-labelled response.incomplete.

This is worth an explicit check if you persist turn outcomes. @openai/agents 0.17.1 began rejecting unsuccessful terminal states upstream, but it forwards the raw event to normalizers before it throws — so on 0.6.1 and earlier the success close was already emitted by the time the run aborted. Rows written by an older version cannot be repaired from the AgJSON alone; the status only survives in the provider-raw payload.

Four upstream signals that no longer fall on the floor

  • narration_block_indexes (Claude Agent SDK 0.3.272) names which of a frame’s content blocks are user-facing narration rather than private reasoning — the progress updates Anthropic’s thinking.display: "updates" mode returns between tool calls. Without it a client cannot tell a thinking block meant to be shown from one usually hidden, so it rides the block’s providerMetadata verbatim. It appears in no SDK type declaration; only a live capture surfaced it.
  • resume_reason (0.3.268) says why a turn is the automatic re-run of one a worker restart interrupted. On such a re-run user_message_uuid names the interrupted turn’s prompt, so without this a consumer cannot distinguish the re-run’s first reply from the original attempt’s. It joins user_message_uuid and user_message_uuids as the third leg of one turn-binding family, on the same channels under the same once-per-message rule.
  • resultIndex (from result_index, 0.3.268) is the delivery sequence of a result within a run. A result whose write fails still consumes its number, so a gap in the sequence is how you detect a result that was lost in transit. It rides ext.anthropic.result-meta beside queuedTurnCount.
  • localCommand (from local_command, 0.3.268) marks a turn that ran a slash command without entering the model loop. Its presence is the signal — it is the only thing separating that from an empty turn. Note the value is coarse by design upstream: every user, project or third-party command reports custom, and every MCP command reports mcp.

@openai/agents 0.18.0’s new toolSearchAgentName is carried on the tool lifecycle alongside the existing executionStatus. All five are additive: absent, every stream is byte-identical to 0.6.1.

Errored Vercel turns now report the tokens they burned

ai 7.0.94 made streamText enforce toolChoice, closing a violating run as finish{finishReason: "error"} with totalUsage populated. The facet’s error close discarded that usage even though AgTurnError has a usage slot the OpenAI facet already fills. It now forwards it through the same mapper the success close uses. Absent usage stays absent.

@openai/agents 0.18.0 is in range

The declared peer range moves from >=0.2.0 <0.18 to >=0.2.0 <0.19, so installing the current @openai/agents beside this facet no longer produces an npm peer warning. The typed streaming surface is unchanged across the whole 0.17.0 → 0.18.0 span: identical event and result declarations, identical stream-event and protocol-item inventories. 0.18.0’s headline changes — Docker file APIs moving inside the container, sandbox file-I/O protection, image-generation actions — are all off the path this facet normalizes.

Peer sweep and security

  • @anthropic-ai/claude-agent-sdk 0.3.261 → 0.3.272 (nine published versions). The SDKAssistantMessageError union widened to include verification_required and cloud_credential_error; both are non-retriable, which is what the facet already reported, now recorded deliberately rather than by omission. All six Claude seeds were re-captured.
  • ai 7.0.100 with @ai-sdk/openai 4.0.66 and @ai-sdk/mcp 2.0.49; @google/genai 2.22.0 with @google/adk unchanged at 2.0.0. Both Vercel and both OpenAI seeds re-captured.
  • adm-zip 0.6.1. A medium-severity advisory (CVE-2026-76845) covers every published version through 0.6.0: archive extraction followed symlinks in the destination, allowing writes outside it. 0.6.1 adds the guard and fixes six further issues. It reaches this workspace only as a transitive of @google/adk’s skills loader and is not a runtime dependency of any published @silverprotocol package, so no consumer was exposed through us — but the floor is now pinned so it cannot regress.

Also

The site’s spec badge had been serving 1.0.0-draft.1 since 0.5.0 — two revisions stale — because the shields URL escapes the hyphen and no search for the plain string ever matched it. The version is now generated from the SDK’s AGJSON_VERSION and checked by the same gate that guards the compatibility tables, as is the machine-readable peer list in llms.txt.

The compatibility tables on each npm page carry the dated evidence.