Skip to content

fix(release): clear 12 base-reds of release/v3.8.51 (opencode retry, tool-map side channel, audio id, CI cache key, stale contracts) - #15112

Merged
diegosouzapw merged 6 commits into
release/v3.8.51from
fix/release-v3.8.51-basereds-r3-0929
Sep 29, 2026
Merged

diegosouzapw merged 6 commits into
release/v3.8.51from
fix/release-v3.8.51-basereds-r3-0929

Conversation

@diegosouzapw

Copy link
Copy Markdown
Owner

Clears the 12 unit reds of release PR #11442 (shards 5/8 and 6/8, CI run of 2026-09-29). Every red reproduced deterministically on the origin/release/v3.8.51 tip (9bbf6ef) before the fix.

Red Cause (culprit) Fix Proof
every postinstall helper imported by postinstall.mjs is in the cache key #12961 made postinstall.mjs import betterSqlitePrebuildTarget.mjs; the npm-ci-retry cache key did not hash it (a stale node_modules could survive a helper change) add the file to the hashFiles key in .github/actions/npm-ci-retry/action.yml red → green
DefaultExecutor.execute does not produce duplicate anthropic-version header… #14627 intentionally bumped the Claude Code client to 2.1.280; the test hard-coded 2.1.258 assert against CLAUDE_CODE_CLIENT_BILLING_VERSION (the exact value stays pinned in claude-codex-identity-version-sync.test.ts) red → green
tools declared by the client are never removed, even for a title prompt #14156 intentionally appends the required placeholder names after client tools assert the client's tool goes out first and intact (no longer "verbatim list") red → green
OpencodeExecutor free-tier refusal retry… / retries once with observed names appended… #14156 × #14464: the first dispatch now already carries the resolved names, so the observed-tools retry could re-send the exact body the upstream just refused production: opencodeFreeTierRetry.ts skips the retry when the merged body adds no name beyond the first dispatch; test aligned to #14156 (configures bash so the retry adds something) + new regression test new test red without the fix, green with it
Qwen Cloud Token Plan remains a flat-rate provider with chat models only #14273 intentionally registered qwen3.8-flash and deepseek-v4.1-flash expected list updated red → green
gemini: / antigravity: both namespace identities and sanitizer aliases survive chatCore extraction #14751 made extractRequestToolIdentityMap keep _toolNameMap next to namespace identities; #12839's extractRequestToolMetadata (the chatCore entry point) must consume both side channels production: extractRequestToolMetadata deletes _toolNameMap after capturing the alias ledger it returns (the standalone extractor keeps #14751's behavior) red → green; #14751's gemini-responses-custom-roundtrip + tool-name suites green
handleAudioTranscription rejects invalid HuggingFace model paths #15067 made the registry parser refuse unsafe ids, which surfaced as "No transcription provider found" production: handler answers 400 Invalid model ID up front for hasUnsafeModelIdSyntax ids red → green; model-id-path-injection green
chatCore retains exact quota resets from intermediate rotated Codex 429s #14959 (bisected) skips same-account intra-retries for a Retry-After: 60 hint; the test's calls.length < 4 counted those retries 429 keyed on the first account's token instead of a call count red → green
Fix A: getAccessToken invokes onPersist INSIDE the per-connection mutex closure / serialized refresh re-checks rotation inside the lane… #15002 intentionally moved the closure into const work = (async…)() raced by entry.promise, and added a log arg (prettier wraps the call) regexes accept the new shape (and assert entry.promise races work); whitespace-tolerant serializeRefresh( red → green

Gates: typecheck:core clean, check:open-sse-typecheck OK, ESLint clean on changed files, check-file-size OK (measured after commit).

Not touched (outside this list): opencode-geo-block-rotation (3) and opencode-transient-retry-delay (1) fail on the pure tip locally too but not in CI (environment); issue-11912 passes in isolation.

…e refused shape

Since #14156 the free-tier contract appends the resolved placeholder names to
client tools on the first dispatch too, so the #14464 observed-tools retry could
re-send a byte-identical body. Skip it when the merged body adds no new name, and
align the two tests to the #14156 contract (client tools first and intact, required
placeholders appended).
…metadata extractor

#14751 made extractRequestToolIdentityMap keep a string alias ledger next to
namespace identities; #12839's extractRequestToolMetadata already captures and
returns that ledger, so it now strips the side channel itself as its contract
(and the roundtrip test) require.
#15067 made the registry parser refuse unsafe ids, which surfaced as a misleading
"No transcription provider found". Reject them up front with the precise message.
… too

#12961 made postinstall.mjs import the helper; a change to it must invalidate the
cached node_modules like every other postinstall helper.
…rtions

- executor-default-base: cc_version follows the canonical constant (#14627 -> 2.1.280)
- alibaba-provider-regions: qwen3.8-flash / deepseek-v4.1-flash leaves (#14273)
- chatcore-codex-account-pool: key the 429 on the first account, since #14959 skips
  intra-retries for a Retry-After: 60 hint
- token-refresh-race-comprehensive: mutex closure is now the raced const work (#15002)
@diegosouzapw
diegosouzapw merged commit ed664fc into release/v3.8.51 Sep 29, 2026
11 of 16 checks passed
@diegosouzapw diegosouzapw mentioned this pull request Sep 29, 2026
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