Skip to content

chore: refresh the pin to upstream v2.0.32 - #465

Merged
Blind-Striker merged 4 commits into
masterfrom
chore/refresh-pin-v2.0.32
Oct 17, 2026
Merged

Blind-Striker merged 4 commits into
masterfrom
chore/refresh-pin-v2.0.32

Conversation

@Blind-Striker

@Blind-Striker Blind-Striker commented Oct 17, 2026 •

Copy link
Copy Markdown
Collaborator

The SDK's OpenAPI pin moves from opencode v2.0.29 to v2.0.32 (843a6c514e606b436a7fe713422ace0a93ad3d61). It goes through spec/SNAPSHOT.md's refresh procedure: a reviewed refresh-spec receipt, --apply, curation, one generate. ExperimentalClient gains CreateVoiceSessionAsync. No existing public member is removed or renamed.

Part of #462. This is REFRESH-232 PR B; it builds on PR A (#459), without which generation crashes on VoiceWebRTCTransportInput.dcid.

The receipt

  • Operations: 142 → 143. The only addition is experimental.voice.session; none are removed or changed.
  • The Restore patch: 001-restore-sse-payloads still applies, and its preimages are retained.
  • Watched sources: all 84 anchors match, and 11 hashes moved: routes.ts, api.ts, server-process.ts, service-config.ts, terminal-pane.tsx, four package.json files (Bun stays at 1.4.2), and two service tests.
  • Verify: refresh-spec --verify reproduces the accepted identity.

Curation

Five rows, each with its reason:

Section Row Why
operationNames experimental.voice.session → CreateVoiceSessionAsync "session" is not a naming verb
modelOwners Voice* → Experimental the voice transports belong to the one experimental operation; the prefix covers exactly the six reported types
schemaNames Config.Model.Reasoning supported=false → ConfigModelReasoningUnsupported names the capability, not its boolean literal
schemaNames supported=true → ConfigModelReasoningSupported as above; it carries toggle, effort and budget
schemaNames its budget → ConfigModelReasoningBudget otherwise it generates as ConfigModelReasoningTrueBudget

tools/generation-profile.txt selects the voice operation, so 141 operations are selected, 0 pending and 2 transport-owned, and the "incomplete" marker clears. The existing experimental group supplies the client and the OPENCODE001 diagnostic, which the voice types carry like their siblings. Generation demanded no new descriptions, so there's no new curated summary.

Maintainer decisions, 2026-10-18: the voice door's name and slice, the two arm names, and the budget name.

The public surface

The API baseline gains 176 lines and loses none: 16 new public types, plus five members on existing types.

  • New members on existing types:
    • ExperimentalClient.CreateVoiceSessionAsync(ExperimentalVoiceSessionRequest, OpenCodeRequestOptions?, CancellationToken);
    • ConfigModelCapabilities.Reasoning (IConfigModelReasoning?) and .Temperature;
    • ModelCapabilities.Temperature;
    • ConfigModel.ReleaseDate.
  • The reasoning union: IConfigModelReasoning, with ConfigModelReasoningUnsupported, ConfigModelReasoningSupported (Toggle, Effort, Budget), ConfigModelReasoningBudget (Min, Max) and the UnknownConfigModelReasoning carrier.
  • Voice:
  • Secrets: VoiceWebSocketTransport.ToString() prints ("Token", RecordPrinter.Redact(Token)), because token is on the upstream redaction floor. UnknownVoiceTransport also masks its preserved payload, since an unknown arm may carry the same token. No other new member is credential-shaped.

A widened existing suppression (maintainer-approved 2026-10-18)

VoiceWebSocketTransport.Url is a string because upstream declares url: Schema.String with no format: uri. So VoiceWebSocketTransport joins the existing CA1056 brace list in .editorconfig, under the comment "The pinned OpenAPI schemas declare these wire members as plain strings without format: uri". It adds no new section, and the suppression ledger's aggregate stays at editorconfig: 150. I edited the ledger snapshot's glob line by hand; it was not auto-accepted.

Hand-written changes

  • Env precedence, wording only. ServiceElection.OverlayAsync stays, and its code is unchanged. At v2.0.32, packages/cli/src/server-process.ts:75 runs Object.assign(process.env, config.env) on every service-mode start, after bootstrap. Its comment names Desktop launches as the motive. So:

    • the caller's entries still win over the saved env at spawn;
    • the saved env wins for everything the service reads after startup.

    Three places now say exactly that: OverlayAsync's summary, the public OpenCodeServerEnsureOptions.Environment XML doc, and the Environment row in docs/guide/connection-modes.md. The guide row also adds "set a key in one place". Keeping the overlay keeps the CLI's own spawn-time behaviour for the startup keys.

  • The test harness's real-daemon guard refuses both 45278 (the new Windows default, 0xB0DE in service-config.ts) and 49374 (kept by explicit configuration on the maintainer's machine). It is renamed RefuseRealDaemonPort, since it guards a port and doesn't reserve one.

  • Canon: docs/architecture/protocol-and-generation.md now names tools/generation-profile.txt as the selected-operation list. Admitting an upstream operation adds its id there, along with its naming and owner rows.

  • CHANGELOG: two entries under [Unreleased]:

    • ### ✨ Added: the pin, the voice door, and the reasoning, temperature and release-date members;
    • ### 🔧 Changes: the consumer-visible env-precedence change, as its own entry.
  • The persistent-simulation fixture stays unchanged: its contract doesn't require a complete mirror of the server's config block.

Tests

  • dcid contract rows (OpenCodeJsonContextTests), through the generated context:
    • absent (omitted on write), explicit null, 7.25, and "NaN", "Infinity" and "-Infinity", each written back as the same JSON;
    • a separate row for the lowercase "nan" refusal.
  • Port guard (EnsureServiceContextTests): both protected ports are refused with the full message, and the four neighbouring ports pass. The old 49374-only rule is a mutant that the 45278 row kills.
  • net472: runtime evidence comes from CI's Windows leg, which runs the dcid rows on net472. dev-01 compiles netstandard2.0 and net472 in the root Release build but cannot run net472.

Budget (against #459's merge)

  • Hand-written production: 36 added lines, against a cap of 160 (curation, the summary, .editorconfig, the canon clause).
  • Tests: 63 added lines, against a cap of 110.
  • Generated output and spec/ are exempt.

Local check and review

  • Local check at this head on dev-01, on a quiet host, after a root Release build: slopwatch 0 issues; the Release build with 0 warnings; both format passes; verify-clones passing; --help; generate --verify and refresh-spec --verify current; Tools.Tests 2086/0; Sdk.Tests 2825/0 on net10.0 and on net11.0 (ServiceElection excluded; CI runs that pass).
  • Merged with master ([TST-E4] test: thirteen more declared-error doors become table rows, each area's rows in its own slice #460, [TST-E4] test: twelve more declared-error doors become table rows, each door defined once per area #463, the declared-error door rows): root build 0 warnings, Sdk.Tests 2875/0 on net10.0, clone gate 0 new clones (tests 4.98%). CI is the full gate..
  • Process: three dispatched runs, the Sol guide template. Runs 1 and 2 were justified stops:
    • run 1 lacked tools/generation-profile.txt in its scope, the coordinator's miss;
    • run 2 hit the CA1056 wall above.
  • Review: the coordinator's Claude review, a fresh cross-family review, and the runtime lane's review of the env part. The runtime review approves the env part after its findings were fixed here: the env change gets its own Changes entry; the internal summary names no version; the guide row adds the "one place" advice; and the public XML doc names the opencode version rather than the repository's pin.
  • Earlier reviews: the Claude review and the cross-family review. The cross-family review found nothing. The Claude review's findings are fixed here:
    • the CHANGELOG section (Added, not Fixes);
    • the guard's name;
    • the dcid rows' shape (fragments, not a sentinel, and the refusal split out).

Provenance: Generator lane / opencode dispatch harness (openai/gpt-6.1-sol-1m, review on gpt-6.1-sol-fast-1m), coordinated, reviewed and finished in Claude Code.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant