Skip to content

[WRONG BRANCH] release: promote frozen tip c68885b5f1 to main as 2.95.0 - #8034

Merged
lidge-jun merged 85 commits into
mainfrom
release/promote-main-2.95.0
Oct 31, 2026
Merged

lidge-jun merged 85 commits into
mainfrom
release/promote-main-2.95.0

Conversation

@lidge-jun

Copy link
Copy Markdown
Owner

Summary

Promotes the frozen dev candidate c68885b5f16a2a36d8eaa9877ffcae7235128c1b to main as stable 2.95.0. The promotion head 0c9edcb46e merges in main ancestry (d844ff4af6, v2.94.0) with the ours strategy, so its tree is exactly the candidate tree (git diff c68885b5f1 0c9edcb46e is empty). Candidate version sources already say 2.95.0; dev moves to 2.96.0 through #8033, which merges before publication.

The candidate carries 84 commits since the 2.94.0 candidate dc75a3e51: 47 fixes, 10 features and the rest tests, perf and docs. Highlights: measured-capability role auto-assign (#7624), CC-Switch provider import (#7935), per-provider "test all models" (#7742), Kiro IAM Identity Center login (#7690), history integrity scans off the serving thread (#7972/#7997), pool 5-hour window fixes (#7980/#7994/#7992), Windows credential observer and ACL fixes (#7976/#7970/#7931/#7998), bigint file-identity comparison on Windows (#8019/#8023/#8031), provider compatibility fixes for xAI, Azure, Meta Muse, Kiro, Volcengine and sidecars (#7979–#7991), and rustls 0.23.46 (#7942, fixes 4 GHSAs).

Verification

  • Batch c68885b5f1: workflow_dispatch Cross-platform CI lane=all 41149878845 concluded success: 31 jobs succeeded, including all four macOS shards, macOS control and all eleven Windows shards; the 7 skipped jobs are PR-only gates and unexpanded matrix placeholders.
  • Every PR in this window landed with exact-head required CI success and a maintainer-integration record; security-boundary PRs carry a dedicated security review on the PR.
  • bun scripts/release-version-sources.ts check 2.95.0 on the candidate: all 4 version sources carry 2.95.0. v2.95.0 has no tag and no npm publication. origin/main is an ancestor of this head.
  • Push-event Cross-platform CI and Service lifecycle on the merged SHA gate release.yml.

Checklist

  • Scope stays focused and avoids unrelated cleanup.
  • Docs or release notes were updated when needed.
  • Security-sensitive changes were reviewed for secrets, auth, and unsafe defaults.

github-actions Bot and others added 30 commits October 29, 2026 11:52
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
…ew (#7939)

* feat(gui): show distinct first-response states on the provider overview

Distinguish provider configuration saved, model discovery and selection readiness, client routing application in Connect, and completion probe verification on the provider overview instead of labeling every configured provider Connected. Select newly added providers in the workspace when none is open, show the raw provider config ID next to the display name when they differ, and join per-provider discovery status into the revision-bound model snapshot.

* fix(gui): align overview Status row with effective OAuth state and expand guidance tests

* fix(gui): prefer settled model snapshot over stale pending config and preserve probe state on cancel
…7881)

Native Opus 5.5 on api.anthropic.com always forced display "updates"
plus the updates beta. An explicit reasoning.summary of "concise" or
"detailed" now selects display "summarized" without the beta, and the
selected display drives beta and response classification on every
request, including adapter reuse. "auto" (the Codex default), "none"
and an omitted summary keep the #7143 updates default.

Closes #7728

Co-authored-by: JUN <243035832+lidge-jun@users.noreply.github.com>
* fix(codex): report main-pool affinity decisions in request logs (#7799)

The selection that resolves the main login rotating as main-pool already
computes a CodexAffinityDecision, but only the stored-pool context carried
it, so request preparation logged affinity/affinityReason for pool
selections alone. Carry the same decision on the main-pool context and copy
it into the existing log fields. Selection, binding and credential ownership
are unchanged.

* test(codex): expect the main-pool affinity decision and keep auth-context under its cap

Two exact-shape main-pool assertions in codex-main-rotation now include the
carried affinity decision. Fold two main-pool type comments so
src/codex/auth-context.ts stays at its 1999-line size and below the
2000-line ratchet threshold.

* test(codex): cover the main-pool affinity request-log copy

Move the request-log copy of the selection's affinity decision into
noteCodexSelectionAffinity (src/server/request-log.ts) and test it for
stored-pool, main-pool, missing-decision and request-owned main contexts. The
auth-context regression now uses a bindable thread identity and checks
new_bind followed by reused.

---------

Co-authored-by: JUN <243035832+lidge-jun@users.noreply.github.com>
#7854) (#7885)

The ancestry guard test bounded its PowerShell child at 10s and failed on a
hosted Windows shard with empty stdout/stderr (killed at the deadline). On a
busy Windows host the script body finished in under 0.7s even with 24 copies
running at once, while the PowerShell process around it took 2-8s to start
and exit, so the bound was measuring process lifecycle, not the guard.

Replay the same probe once in a beforeAll through warmColdSpawn, as the
sibling desktop-compatibility trust and launch tests already do, and keep the
measured 10s bound unchanged. The script now writes phase markers to stderr,
which survive a deadline kill and name the last completed step; PowerShell
only flushes the JSON verdict at exit.

Closes #7854

Co-authored-by: JUN <243035832+lidge-jun@users.noreply.github.com>
Co-authored-by: JUN <243035832+lidge-jun@users.noreply.github.com>
…ets (#7887)

* fix(codex): bound combo backoff for local account cooldowns

Carry process-local Response provenance for ordinary account cooldown refusals
through combo failure reconstruction. Use capped local target backoff without
changing client retry advice or account admission and policy state.

Keep upstream retry directives and all policy subclasses unchanged; cover
account recovery, wire-copy forgery, the 24-hour ceiling and hard-lock behavior.

* fix(codex): mint local cooldown provenance at the Responses auth-error mapper

Move the exact-class provenance mark from cooldownErrorResponse into
mapCodexAuthContextErrorToResponse, the single mapping every combo child's local
auth refusal goes through. This keeps src/codex/auth-context.ts at its 1999-line
size, below the 2000-line file-size ratchet threshold, and the tests now mint the
refusal through that mapper.

* fix(codex): keep local cooldown provenance through response lifetime wrappers

Retained compaction v2 delivers each child response through finalizeAccountLease,
which re-creates the Response and dropped the process-local cooldown mark, so a
late local refusal could again record the account's long Retry-After against the
combo target. Carry the mark in both core-lifetime wrappers and cover the lease
boundary with a regression.

---------

Co-authored-by: JUN <243035832+lidge-jun@users.noreply.github.com>
…ost candidates (#7893)

* fix(messaging): reserve SSH forward ports and recover lost candidates

* fix(messaging): preserve initiating forward failures through pair shutdown

Keep intrinsic I/O and pre-cleanup exit failure provenance on each helper.
Join diagnostic output and pair cleanup before classifying readiness failures,
so cleanup-induced sibling rejection cannot mask an explicit lost forward port.
Independent failures, cancellation and incomplete cleanup remain terminal.

Add deterministic L/R delayed-stderr recovery and exhaustion regressions plus
terminal-failure controls. Keep reservation handoff, setup deadline and the
three-attempt ceiling unchanged.

Validation: regression 11 pass/4 fail before, 15 pass/0 fail after; requested
eight focused files 85 pass/15 skip/0 fail; test:changed 769 pass/112 skip/0 fail;
typecheck, structure:check, privacy:scan and git diff --check passed.

---------

Co-authored-by: JUN <243035832+lidge-jun@users.noreply.github.com>
…ion (#7891)

* fix(config): re-arm atomic writer ACL timeout memos

Reimplement the intent of #7843 on the current dev atomic writer. Opt normal
sync, streamed and async writes into the existing destination-keyed recovery
policy while keeping both residual cleanup paths from consuming recovery.
Required hardening, identity checks and publication ordering remain intact.

Cover all five harden calls, cooldown boundaries, continued stalls, permission
denial and cleanup with deterministic runner/clock regressions. Document the
recovery behavior and retain the current config-root ACL settlement boundary.

Fixes #7834
Co-authored-by: JohnnyXu <xubenqiang@users.noreply.github.com>

* fix(config): retain destination ACL admission until child reap

Reserve default atomic-writer destinations across active writes and retained
Windows ACL children. Refuse overlapping sync, streamed and async writers
without spending timeout recovery or relinquishing removal ownership.

Cover repeated re-arm windows, mixed writers and recovery after actual reap.
Restore both principal runners before resetting regression identity state so
subsequent native ACL tests use the real account.

* test(config): require atomic ACL timeout recovery admission

Keep the exact required/destination assertion and require the explicit
retryTimedOutOnce opt-in added for #7834. The old exact options object
rejects the intended recovery contract during test:changed.

* fix(config): allow healthy overlapping Windows atomic writes

---------

Co-authored-by: JUN <243035832+lidge-jun@users.noreply.github.com>
Co-authored-by: JohnnyXu <xubenqiang@users.noreply.github.com>
Co-authored-by: JUN <243035832+lidge-jun@users.noreply.github.com>
…7908)

* test: add offline fixtures for claude-cli schema-constrained output (Issue #6469)

* test: fix claude-cli offline fixtures per CodeRabbit review

* test: fix claude-cli offline fixtures per CodeRabbit review round 2

* test(claude-cli): exercise real abort and two-turn tool replay

Complete authoritative tool stops, assert matching and mismatched replayed
IDs on stdin, and observe tool callbacks before terminal completion. Abort
through the request signal and assert process/input/prompt cleanup.

Co-authored-by: Aditya Rawat <246880058+adirwt852-cloud@users.noreply.github.com>

---------

Co-authored-by: JUN <243035832+lidge-jun@users.noreply.github.com>
* fix(openai-responses): drop the include entry xAI rejects

`xai/grok-4.7` over the Responses path answers HTTP 400 with `Argument not
supported: "output.encrypted_content" in "include" field`. Codex Desktop asks
for that OpenAI reasoning blob on every turn, and xAI rejects the request
instead of ignoring the unknown entry, so the model only works when the user
maps it to the `openai-chat` adapter.

Strip exactly that entry for xAI Responses destinations. Other include entries
(and the key itself when something remains) are preserved, and every other
destination is untouched.

* fix(xai): recognize the US Responses endpoint for include normalization

Cover the regional request body and exact HTTPS host matching, including
lookalike and nonstandard-port rejection. Document the include compatibility.

Co-authored-by: xubenqiang <30436552+xubenqiang@users.noreply.github.com>

* docs(xai): keep Responses wire contract within its line budget

Co-authored-by: xubenqiang <30436552+xubenqiang@users.noreply.github.com>

---------

Co-authored-by: xubenqiang <xubenqiang@users.noreply.github.com>
Co-authored-by: JUN <243035832+lidge-jun@users.noreply.github.com>
* fix(gui): preserve Muse reset countdown after quota exhaustion

* fix(gui): drop an expired Muse refusal observation at its reset time

The summary bar now re-renders at the observed reset and builds rows without an observation whose window has reset, so the exhausted row leaves without another successful poll and stays gone after a failed one. Native Muse quota reports are unchanged.

Co-authored-by: stephen-drew <98895569+stephen-drew@users.noreply.github.com>

* fix(gui): read the observed Muse reset through the typed quota parser

ProviderQuotaReportView.quota is unknown; reading customWindows directly failed the GUI type build.

Co-authored-by: stephen-drew <98895569+stephen-drew@users.noreply.github.com>

* docs(structure): record the observed Muse quota row and its reset-time expiry

Co-authored-by: stephen-drew <98895569+stephen-drew@users.noreply.github.com>

* fix(gui): select Muse observation by request start time

Read the server-bounded retained matching history instead of its last finalized
row, then select the greatest valid start timestamp for the active final account.
Keep native reports and the existing subscription-refusal gate authoritative.

Four regressions fail before the fix: overlapping success/refusal completion
orders, more than fifty older finalizations, and malformed/cross-account rows.
Update the provider and dashboard contracts without changing the visual layout.

Co-authored-by: stephen-drew <98895569+stephen-drew@users.noreply.github.com>

---------

Co-authored-by: JUN <243035832+lidge-jun@users.noreply.github.com>
…ld usage after commit (#7433)

* Kiro usage: log what Kiro reports, on every inbound wire

Problem 1. A combo child logs into its own context. The combo copies
that context into the request context once, when the child commits.
The bridge binds the adapter usage later, at the terminal frame, so the
request context never learned that usage came from the bridge. The
request log then re-read the bridged Responses wire. That wire has no
providerCredits, zero-fills the cache detail, and derives the input
count from the context checkpoint. The log row showed a high input
count, zero cache and no credits on /v1/messages, /v1/responses and
/v1/chat/completions alike.

Problem 2. Every Kiro row was marked estimated and raised to the local
input estimate, even when Kiro sent a tokenUsage block.

Fix 1. The combo passes each child onBridgeUsageBound. The transport
calls it when it binds bridge usage. After the child commits, the combo
sets usageFromBridge and usage on its own context.

Fix 2. The Kiro parser marks usage read from tokenUsage as
upstreamReported. A two-leg turn keeps the mark only when both legs have
it. usageForFinalLog and finalizedUsage skip the provider-wide estimated
mark and the input floor for marked usage. Usage without the mark, and
usage read off a wire, stays estimated.

The wire that the client receives is unchanged.

Tests: new tests/server/server-kiro-usage-log-e2e.test.ts replays one
Kiro stream (metering and tokenUsage, then no tokenUsage, then two legs
with tools) through /v1/responses, /v1/messages (stream and non-stream)
and /v1/chat/completions, on a direct route and on a combo route. A unit
test in request-log-estimate-cap.test.ts covers the mark. The Kiro
stream test now expects the mark. 15 of the 21 new cases fail without
the fix.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* Combo: forward child usage only after the child commits

The combo forwarded bridge usage to the request context when the child
set childCommitted. The flag was set before callbackGate.commit(). If
the commit threw, a later usage binding of that child still reached the
request context.

The combo now keeps two flags for each target: childCommitted, set after
the commit, and childUsageBound, set by the callback. It forwards only
when both are true. A binding that comes before the commit waits for the
commit. A target that fails or never commits forwards nothing. The
callback takes no argument now, because the combo already holds the
child context.

Tests: new tests/responses/responses-combo-bridge-usage.test.ts drives
executeComboResponses with a fake dispatcher. It covers a binding after
the commit, a binding before the commit, a refused first target with a
committed second target, and a commit that throws. A new case in
request-log-estimate-cap.test.ts pins the aggregate rule: the
upstreamReported mark needs usage on every attempt, and an empty list or
attempts without usage give no mark.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

---------

Co-authored-by: bylinelog-bot <bylinelog-bot@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-authored-by: JUN <243035832+lidge-jun@users.noreply.github.com>
#7769)

* feat(claude-desktop): per-client model visibility for the Desktop list

Claude Desktop's gateway list carried every available model, and the only
dashboard levers (tier moves, family defaults) did not hide anything. Add
claudeCode.desktopModelVisibility, an include or exclude list of routes that
narrows only the Desktop 3P inferenceModels list.

- The generator filters emitted rows by route after building the full alias
  registry, so a running session holding a just-hidden alias still routes.
  A hidden family default hands its role to a remaining member; a selection
  that would empty the list falls back to the full list.
- Every writer reads it through desktop3pModelOptions: local apply, catalog
  refresh, and the hub's Desktop export.
- PUT /api/claude-desktop accepts visibility (omit keeps, null clears) and
  refuses a selection with no visible available model. GET returns it with
  per-model visible flags and the list the next apply writes; status returns
  the applied list.
- Dashboard: per-model checkboxes, search, provider filter, bulk select,
  new-model policy, selected/available/applied counts, an added/removed
  preview, and a "saved, not applied" status. The two status strings that
  read as contradictory now name their scope.
- Invalid hand-edited values fail validation at their own path and salvage
  drops only that field.

Closes #7702

* fix(claude): preserve Desktop visibility intent and projection state

Keep saved-versus-applied status independent of draft edits, match the next-apply DTO to the existing writer fallback, and refuse concurrent visibility replacement during discovery. Isolate lifecycle locks and await fixture background work on Windows.

* docs: describe Desktop visibility save conflicts

Co-authored-by: ljluestc <63439129+ljluestc@users.noreply.github.com>

* fix(gui): describe stale Desktop configuration without assuming external edits

Cover saving a changed family default without applying, including cleared applied state and unchanged Desktop models. Use neutral wording in every locale.

Co-authored-by: ljluestc <63439129+ljluestc@users.noreply.github.com>

* fix(gui): clarify Desktop visibility scope and profile observations

Name all matching rows in bulk actions and describe matching IDs as an on-disk profile observation. Update all locales, regression coverage, fallback docs, required profile writes, and nullable status shape.

Co-authored-by: ljluestc <63439129+ljluestc@users.noreply.github.com>

* fix(gui): clarify Desktop deselection and apply order

Co-authored-by: ljluestc <63439129+ljluestc@users.noreply.github.com>

---------

Co-authored-by: JUN <243035832+lidge-jun@users.noreply.github.com>
* fix(oauth): sanitize Antigravity discovery failure diagnostics

* fix(oauth): surface sanitized Antigravity discovery failures

* fix(oauth): end Antigravity onboarding explicitly on a null body

A JSON null onboardUser body threw a TypeError on data.done. Without a
loadCodeAssist account that onboarding call has no catch, so the TypeError
replaced the recorded discovery error with generic OAuth text. Return no
project instead, keeping the existing one-poll budget.

---------

Co-authored-by: JUN <243035832+lidge-jun@users.noreply.github.com>
* feat(kiro): add IAM Identity Center login to dashboard

* test(kiro): preserve IAM product name in locale guards

* fix(kiro): address IAM login review findings

* fix(kiro): preserve accepted device commits across expiry

* test(kiro): budget repeated device credential writes

Use the existing STORE_BUDGET_MS for the 40-flow retention test. The case
performs real protected credential/config writes; retain every iteration and
assertion. The Windows default 5s budget expired after 5.05s. Retaining both
the completed flow and config snapshot still fails at the cleanup assertion
under the store budget (0 pass, 1 fail in 0.71s).

Co-authored-by: Martin Becerra <197874+martinbcg@users.noreply.github.com>

* test(kiro): budget the IAM credential-write pressure scenario

Apply STORE_BUDGET_MS to the other repeated protected-write case after its
5s default timeout under Windows contention. Keep all 14 completions, the
active-flow cap and owner-scoped profile-selection assertions. Ablating
terminal-only eviction fails at the preserved live-flow assertion (0 pass,
1 fail in 2.31s) within the store budget.

Co-authored-by: Martin Becerra <197874+martinbcg@users.noreply.github.com>

---------

Co-authored-by: JUN <243035832+lidge-jun@users.noreply.github.com>
Co-authored-by: Martin Becerra <197874+martinbcg@users.noreply.github.com>
#7891 brought scripts/test-layout/layout.json to 2000 lines on dev, which the ratchet rejects as NEW_OVERSIZED. Move its registration onto the preceding windows line; the mapping is unchanged.

Co-authored-by: JUN <243035832+lidge-jun@users.noreply.github.com>
* fix(providers): move Moonshot API default and retired K2.5 to K3.1 Pro

Follow the vendor's current successor recommendation, retain the still-served
K2.6/K2.7 API seeds, and preserve coding-plan and reseller catalogs.
Refresh only exact legacy capability seeds and keep the pre-K3.1 roster repair
working after the retired-id migration. Cover saved-config persistence,
custom destination/metadata preservation, registry parity and catalog output.

Refs #7653

* fix(providers): keep explicit K3.1 Pro values when migrating Moonshot K2.5

The K2.5 rename refreshed any successor value equal to the legacy seed, including values a user had saved under kimi-k3.1-pro before the migration. The registry never seeded K3.1 Pro with those values, so the Moonshot rename now refreshes only metadata carried over from K2.5 (targetSeedRefresh.onlyTransferred). The Kimi coding renames keep their existing behavior.

* fix(providers): keep an explicit K3.1 Pro no-reasoning classification in the Moonshot migration

The no-reasoning cleanup still dropped kimi-k3.1-pro when its saved efforts matched the legacy seed, even with no K2.5 left in the config. With onlyTransferred it now removes only the retired id.

---------

Co-authored-by: JUN <243035832+lidge-jun@users.noreply.github.com>
* fix(openai-chat): normalize LM Studio instructions to one leading system message

Add a preset-scoped, typed singleLeadingSystemMessage compatibility policy.
Preserve outbound instruction text, user/tool ordering, and input immutability
for translated and native Chat requests. Keep every other preset unchanged.

Validate and preserve the optional boolean through config/editor boundaries;
document the chronology tradeoff and existing IR system-message hoisting.

Refs #7761

* docs(providers): count nine carried settings in the save table

* fix(openai-chat): preserve developer documents with single-system policy

---------

Co-authored-by: JUN <243035832+lidge-jun@users.noreply.github.com>
* feat(catalog): opt in to omitting disabled native models

* fix(catalog): advance omitted native templates through upgrades

* fix(catalog): pass the upgrade rule into the native template instead of importing metadata

native-template.ts importing shouldUpgradeToUpstreamEntry from metadata.ts closed a load-time cycle metadata -> bundled -> native-template that the import-cycle ratchet rejects. Both writers already import the rule and now pass it in.

* fix(catalog): address review on disabled-native omission

- Leave control-plane rows in place when an omission pass drops nothing,
  so the opt-in flag cannot change a catalog it did not filter.
- Drop the copied "descriptions below" sentence from seven locale tables.
- Add the catalog reference page to the Configuration sidebar.
- Map src/types/config.ts to structure/config.md and regenerate INDEX.md.
- Register the new test on the inline layout line so layout.json keeps
  its line count under the file-size cap.

---------

Co-authored-by: JUN <243035832+lidge-jun@users.noreply.github.com>
…le domain (#7697) (#7745)

* fix(service): recognize headless GUI-domain launchctl exit 125 as a domain answer

On a headless macOS session launchctl print gui/<uid>/<label> exits 125
("Domain does not support specified action") before ever looking at the
label. The probe returned unknown at that point, skipping the user-domain
query and the plist checks, so absence could never be proven and every
admission-gated write was fenced on a machine with nothing installed.

125 from the gui/ domain is now counted like 112 - a label-independent
answer about the domain - and the probe continues to the user domain and
the on-disk definition checks. A user-domain 125 stays unknown: the
fallback must be able to answer, so its failure is a failure to ask.

* docs(structure): record the headless GUI-domain launchctl 125 rule

Co-authored-by: chenyb999-zhcn <chenyb999-zhcn@users.noreply.github.com>

* fix(service): corroborate launchctl GUI 125 with session evidence

Require a bounded read of the complete IOConsoleUsers UID roster before
treating GUI-domain 125 as unreachable. Keep matching, malformed, unreadable
and timed-out evidence unknown, including switched-out GUI sessions.

Preserve the independent user-domain and plist checks, and clarify that
113 is service-scoped. Cover the probe and downstream write admission with
Windows-portable injected runners; sync the owning structure clause.

* test(service): make the GUI-125 fixture exercise the ioreg to plutil contract

ioreg now returns a plist holding 0.IOConsoleUsers, and plutil answers only the exact extraction of that input. Mutating the production extraction key turns four positive cases red.

---------

Co-authored-by: chenyb999-zhcn <chenyb999-zhcn@users.noreply.github.com>
Co-authored-by: JUN <243035832+lidge-jun@users.noreply.github.com>
Co-authored-by: JUN <243035832+lidge-jun@users.noreply.github.com>
…ngth (#7892)

* fix: fail over combo context-length refusals (#7443)

* fix(combos): ignore quoted caller values in context-overflow evidence

A parameter validation error that quotes the caller's own value, such as
Invalid 'tools[0].function.name': 'prompt is too long', matched the
context-overflow phrase list. The combo then hopped to a backup target and
relabelled the validation failure as context_length_exceeded on exhaustion.

Strip quoted spans that open after a boundary before matching, so in-word
apostrophes (model's, you're) still read as provider prose.

* fix(combos): judge validation provenance instead of stripping quotes

Stripping quoted spans missed values with an embedded apostrophe and
removed genuine verdicts that an SDK error wrapper quotes. Refuse context
evidence when the provider record is a parameter validation (code
invalid_value/invalid_type, or a param naming a field other than the
conversation) or the message opens with Invalid '<param>' syntax, and
keep reading quoted SDK-wrapped verdicts as evidence.

* fix(combos): refuse validation markers anywhere and accept budget params

A Python SDK error wrapper that serializes a parameter validation record
bypassed the prefix check and hopped. Read validation markers (invalid_value,
invalid_type, a non-conversation param, Invalid '<x>', Invalid tool/function
...) anywhere in plain-text evidence. Accept context refusals whose param
names a token budget (max_tokens, max_completion_tokens, max_output_tokens)
or vLLM's input_tokens/input_text.

* fix(combos): anchor the new context verdicts to provider positions

The three phrases added for #7443 are short enough for a validation error
to echo them as the caller's value (Invalid value: '...', Invalid value at
'...', Pydantic input_value='...'). Accept them only at the start of the
leaf message or right after an SDK wrapper's message key, and Anthropic's
only with its token counts; the phrases dev already matched keep their
substring behavior, so nothing new can hop that dev would not. Also treat
Invalid value, input_value= and Pydantic "validation error for" as
validation markers.

* fix(combos): read anchored verdicts only from the leaf or an SDK wrapper

Accepting a quoted message key anywhere let a schema error that echoes the
caller's object ({'message': 'Please reduce the length ...'}) hop. The
anchored verdicts now match only at the start of the leaf message, or at
the start of the first message value when the leaf is a recognized
"Error code: NNN - {" SDK wrapper.

* fix(combos): count the new context verdicts only at the start of the leaf message

SDK-wrapper recognition let a caller-controlled message key authorize a hop. The three verdicts added for #7443 now count only at the start of the unwrapped provider message; dev's existing substring phrases keep reading SDK-wrapped OpenAI verdicts. Document the anchoring and validation exclusions.

* fix(combos): retain context refusal on replay exhaustion

* docs(combos): limit the exhaustion promise to confirmed HTTP 400 context refusals

Context refusals sent with 413 or 422 also advance, but only a confirmed HTTP 400 refusal is retained and returned on exhaustion (core-combo.ts). Align the English failure table and its seven locales.

---------

Co-authored-by: JUN <243035832+lidge-jun@users.noreply.github.com>
* fix(advisor): support manual consultations during web search

* docs(advisor): document web-search sidecar contracts

* fix(advisor): remove exhausted tool for anthropic workers

* fix(advisor): account bounded search worker legs once

Cover streaming and buffered search ownership, separate consultation and search bounds, hidden calls, real-tool precedence, incomplete calls and usage accounting. Register the regression and align the documented fetch loop allowance.

* docs(advisor): remove dangling limitations reference

State the retained run-turn and image/video restrictions without referring to
an English section that does not describe the image/video sidecar limitations.

Co-authored-by: auroraflux-jhkim <126220202+auroraflux-jhkim@users.noreply.github.com>

---------

Co-authored-by: JUN <243035832+lidge-jun@users.noreply.github.com>
Co-authored-by: JUN <243035832+lidge-jun@users.noreply.github.com>
…cleanup paths (#7945)

The writer resolves the destination's real parent, and macOS tmpdir() is a symlink, so the unlink fixture never matched and the residual case failed on macOS (dev batch 40819570452).

Co-authored-by: JUN <243035832+lidge-jun@users.noreply.github.com>
…ts (#7946)

* test(windows): budget hosted fixture phases without weakening contracts

* test: drain gated metadata fixture before cleanup

---------

Co-authored-by: JUN <243035832+lidge-jun@users.noreply.github.com>
read() pushed and scheduled another abort on every call, flooding the stream until the abort landed; the SIGTERM case took ~1.3s idle and timed out in loaded full-suite jobs. It now takes ~12ms.

Co-authored-by: JUN <243035832+lidge-jun@users.noreply.github.com>
…ry fixture (#7949)

A reused exited-child PID made the recovery parent look alive, so recovery fenced before the publication stage the failure-fence cases inject into (dev batch 40824593871).

Co-authored-by: JUN <243035832+lidge-jun@users.noreply.github.com>
lidge-jun and others added 17 commits October 30, 2026 21:57
Treat a request-history integrity check that has not answered within 30 s as an operational failure: dispose the worker, apply the failure cooldown, and release waiting async readers with a bounded error, while index replacement still waits for the worker's actual exit.

Closes #7984
)

The routing-health case read the index before corrupting it and relied on PRAGMA shrink_memory to evict the cached pages. macOS's system SQLite kept them, so the read after corruption was served from cache (macOS 2/4 of lane=all run 41056253802, after #7995). Reopen the index after the pre-check so the corruption lands on a connection that has not cached it, like the other corruption cases.

Co-authored-by: JUN <243035832+lidge-jun@users.noreply.github.com>
* fix(codex): await recovery ACL checks in async parent admission

Hold an exact generation across fresh Windows recovery inspection and revalidate pinned identity after awaits. Migrate asynchronous parent callers with a root-bound synchronous commit scope and keep stale-result checks on both admission success and denial.

Preserve synchronous compatibility exports and document native validation and remaining synchronous publication boundaries. Follow-up for #7872 item 2; not a completion claim.

* test(cli): align async recovery consumers and assert awaited preflight

Fix stale mocks, spies and source oracles behind the 11 failures in run 40797643817, plus five reproduced failures in related consumers. Preserve refusal, ordering, timeout and handover assertions. Add three held-promise preflight ordering regressions.

Tests: 280 passed across all seven affected test files; typecheck, structure, privacy and layout/size gates passed. No production source changes.

* test: keep async parent registration mergeable

Relocate the existing async parent test mapping in the registry and
independent golden table without changing either mapping or the
four-shard execution plan. Preserve the layout size cap.

* fix(cli): revalidate ocx v2 state once the awaited admission enters

Recovery admission can now wait on ACL checks. Read the native feature state and the OpenCodex config inside the admitted callback, recheck the hybrid-pin guard there, and save that fresh config, so a change made meanwhile is neither overruled nor overwritten. Also restores the executable mode of src/cli/index.ts.

* fix(cli): save ocx v2 config changes inside the admitted callback

The admission is released before the awaiting command resumes, so a save made after the callback could overwrite a competing write with the read copy.

---------

Co-authored-by: JUN <243035832+lidge-jun@users.noreply.github.com>
…7624)

Tier Codex role auto-assign candidates by measured capability in the role's task domain, using the operator's own Artificial Analysis key, with configured tiers and price rank as fallback. The Hugging Face LMArena parquet source and the hyparquet dependency were removed before merge. The Artificial Analysis key joins configured-credential coverage.

Co-authored-by: LilMGenius <97161055+LilMGenius@users.noreply.github.com>
#8001)

The refused scenarios only required some error, so a setup failure before the policy read was indistinguishable from the refusal (windows 10/11 of lane=all run 41056253802: reads 0, error unknown). Each scenario now names its expected refusal and the child reports message, cause and code.

Co-authored-by: JUN <243035832+lidge-jun@users.noreply.github.com>
…#8002)

Like F3 (#7986), F1/F2 inserted with unfinalized prepare().run() statements, which keep the SQLite file open past close() on Windows and make the temp-tree cleanup fail with EBUSY. Use db.run(sql, ...params).

Co-authored-by: JUN <243035832+lidge-jun@users.noreply.github.com>
…does not own (#7996)

* fix(update): refuse dashboard restart under a systemd unit OpenCodex does not own

Refuse before package mutation when the worker cannot leave the service cgroup or the proxy is not run by OpenCodex's own user unit, and settle a dead worker's job on status reads. Part of #7967.

* fix(update): refuse unsupervised dashboard updates with or without restart

The update stops the proxy before replacing the package, so restart:false was not a safe fallback. Detect a systemd service from its cgroup too, accept a delegated child cgroup of the own unit, write the settled status from the compared record, and add hard spawn barriers to the refusal test.

* fix(update): report a dead worker's job as failed on status without writing it

A status poll that wrote the settled record could overwrite a job another process started between its read and its rename. The poll now returns a failed view; the next run's existing stale recovery settles the persisted record.

* fix(update): judge the innermost systemd unit and refuse only an update that would run

A desktop terminal runs in a scope below user@<uid>.service, which the component check took for a service, and the CI runner's own service preempted the source-checkout refusal. Read the innermost unit of the systemd hierarchy, and consult the supervisor only when an update is available.

* fix(update): let the observed cgroup win over an inherited INVOCATION_ID

A shell moved into its own systemd-run scope keeps INVOCATION_ID; only a missing cgroup observation falls back to the variable.

* docs(structure): state that the observed cgroup unit decides before INVOCATION_ID

---------

Co-authored-by: JUN <243035832+lidge-jun@users.noreply.github.com>
…g-root ACL flight (#7998)

* fix(windows): admit config-root cache writes after the optional config-root ACL flight

The provider and Codex account quota caches, the reasoning support cache and the models.dev refresh wrote under the config root while an optional config-root ACL flight could still run, so parent inheritance could race the fresh file's explicit grant. Each write now goes through withConfigDirHardeningSettled with its snapshot built inside the callback. Part of #7815.

* fix(windows): invalidate waiting cache writes on cancel and report refused refreshes to joiners

A fired cache write waiting for config-root ACL admission now checks a generation that cancel, clear and reset bump; the reasoning support flush seam is admitted too; a joined models.dev refresh receives the shared outcome instead of a coalesced success.

* fix(windows): drop a reasoning support flush invalidated while it waited for admission

---------

Co-authored-by: JUN <243035832+lidge-jun@users.noreply.github.com>
…line (#8003)

* test(cli): name the pinned-port holder when a sibling misses its deadline

A pinned sibling start that misses its record deadline is ambiguous: the port was taken between probe and bind, the child bound without writing its record, or it never bound. Report whether the port is bindable and, on Windows, the netstat owners of that port (windows 5/11 of lane=all run 41061583113).

* test(cli): keep the port-holder diagnostic best effort and read-only while the child lives

Review: a missing netstat threw over the original timeout, and the bind probe ran while the child was alive. List sockets before the kill with a bounded, non-throwing netstat, then probe bindability after the child exits.

* test(cli): bound the post-kill wait in the port-holder diagnostic

* test(cli): skip the bind probe while the killed child may still be alive

---------

Co-authored-by: JUN <243035832+lidge-jun@users.noreply.github.com>
#7998 made the provider account quota cache write wait for config-root ACL admission, so the deferred-persistence test read the file before it existed on Windows (ENOENT, windows 9/11 of lane=all run 41068188012). Expose the admitted write like settleQuotaPersistenceForTests and await it.

Co-authored-by: JUN <243035832+lidge-jun@users.noreply.github.com>
…ly suite (#8016)

* test(claude): report the hardened local-CA ACL in the first-party apply suite

The local-CA ACL inspection spawns PowerShell under the shared 30 s principal budget, which a loaded hosted Windows runner exhausted (windows 1/11 of lane=all run 41073826161: local_ca_path_unsafe after 30095 ms). This suite covers first-party apply; inject the private ACL for the real current SID through the existing seam. Native inspection stays covered by claude-intercept-local-ca-windows.test.ts.

* test(claude): read the cached SID inside the injected ACL runner and reset it in finally

Review: no separate principal lookup before the environment snapshot; reset the seam even if the hardening drain throws.

---------

Co-authored-by: JUN <243035832+lidge-jun@users.noreply.github.com>
* fix: compare file identity with bigint stat

NTFS file IDs can exceed 2^53, where adjacent IDs are equal as JS numbers. Take dev/ino from stat calls made with { bigint: true } wherever a module compares file identity, and add a shared FileIdentity helper.

* test: register file-identity tests in a layout shard and scan stat calls with balanced parentheses

* test: resolve guard scopes by declaration and ignore strings and comments

* test: mask template text and regex literals, require same-line method bodies and an exact bigint options argument

* test: recognize regex literals after keywords in the identity tripwire

* fix(oauth): name the best-effort catches on the rewritten lock line

* fix(oauth): name the best-effort metadata parse catch beside the lock line

---------

Co-authored-by: JUN <243035832+lidge-jun@users.noreply.github.com>
#8023)

* fix: compare Codex and remote workspace file identity with bigint stat

NTFS file IDs can exceed 2^53, where adjacent IDs are equal as JS numbers. Take dev/ino from bigint stats in the Codex home, coordinator, main-account, native-main, residue, history, shim runtime and remote-workspace identity checks. Persisted shim state keeps its numeric fields.

* fix: keep stat millisecond values exact and compare shim runtime identity as bigint

Derive *Ms from bigint *Ns with the runtime's own formula so values still match numeric and persisted stats; carry bigint identity through the shim wrapper ownership and inspection checks; fingerprints without identity compare unequal.

* test: pin the stat millisecond formula with a deterministic case

---------

Co-authored-by: JUN <243035832+lidge-jun@users.noreply.github.com>
Regression tests from #8019/#8023 matched the spied path by raw string; code under test stats canonical paths (/private/var on macOS, long names for an 8.3 short TEMP on hosted Windows), so the injection never applied (lane=all run 41136081084). Add tests/helpers/same-path.ts and use it for every target selection.

Co-authored-by: JUN <243035832+lidge-jun@users.noreply.github.com>
#8031)

* fix: compare CLI install and update artifact identity with bigint stat

* test: honor bigint stat options in the CLI install fakes

---------

Co-authored-by: JUN <243035832+lidge-jun@users.noreply.github.com>
…get (#8032)

* test: give the Windows apply x64 fixture compile the shared spawn budget

* test: report the compile deadline state on the reap assertion too

---------

Co-authored-by: JUN <243035832+lidge-jun@users.noreply.github.com>
Merge main ancestry with the ours strategy: the tree is exactly dev candidate c68885b.
@lidge-jun
lidge-jun requested a review from Ingwannu as a code owner October 31, 2026 01:37
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 31, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-31T02:09:20.545515Z 0c9edcb Draft marked ready
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@coderabbitai

coderabbitai Bot commented Oct 31, 2026 •

Copy link
Copy Markdown
Contributor

Important

Review skipped

Too many files!

This PR contains 609 files, which is 309 over the limit of 300.

To get a review, reduce the PR to 300 files or fewer by splitting it into smaller PRs or changing its base branch.

Usage-priced reviews support at most 300 files.

Run configuration
Commits

Reviewing files that changed from the base of the PR and between d844ff4 and 0c9edcb.

Files ignored due to path filters: 2
  • desktop/src-tauri/Cargo.lock is excluded by !**/*.lock
  • tests/codex-integration/__snapshots__/catalog-omit-disabled-native.test.ts.snap is excluded by !**/*.snap
Files selected for processing: 609
  • desktop/src-tauri/Cargo.toml
  • desktop/src-tauri/tauri.conf.json
  • devlog/_fin/260915_workflow_budget_window/030_wfc_diff_plan.md
  • docs-site/astro.config.mjs
  • docs-site/src/content/docs/fr/guides/claude-code.md
  • docs-site/src/content/docs/fr/guides/codex-app-models.md
  • docs-site/src/content/docs/fr/guides/combos.md
  • docs-site/src/content/docs/fr/guides/providers.md
  • docs-site/src/content/docs/fr/guides/web-dashboard.md
  • docs-site/src/content/docs/fr/reference/cli/providers-accounts.md
  • docs-site/src/content/docs/fr/reference/configuration/advisor.md
  • docs-site/src/content/docs/fr/reference/configuration/providers.md
  • docs-site/src/content/docs/guides/chatgpt-desktop.md
  • docs-site/src/content/docs/guides/claude-code.md
  • docs-site/src/content/docs/guides/codex-app-models.md
  • docs-site/src/content/docs/guides/combos.md
  • docs-site/src/content/docs/guides/integrations.md
  • docs-site/src/content/docs/guides/lm-studio.md
  • docs-site/src/content/docs/guides/providers.md
  • docs-site/src/content/docs/guides/sidecars.md
  • docs-site/src/content/docs/guides/sub-agent-surface.md
  • docs-site/src/content/docs/guides/web-dashboard.md
  • docs-site/src/content/docs/ja/guides/claude-code.md
  • docs-site/src/content/docs/ja/guides/codex-app-models.md
  • docs-site/src/content/docs/ja/guides/combos.md
  • docs-site/src/content/docs/ja/guides/integrations.md
  • docs-site/src/content/docs/ja/guides/providers.md
  • docs-site/src/content/docs/ja/guides/web-dashboard.md
  • docs-site/src/content/docs/ja/reference/adapters.md
  • docs-site/src/content/docs/ja/reference/cli/providers-accounts.md
  • docs-site/src/content/docs/ja/reference/configuration/advisor.md
  • docs-site/src/content/docs/ja/reference/configuration/providers.md
  • docs-site/src/content/docs/ko/guides/claude-code.md
  • docs-site/src/content/docs/ko/guides/codex-app-models.md
  • docs-site/src/content/docs/ko/guides/combos.md
  • docs-site/src/content/docs/ko/guides/integrations.md
  • docs-site/src/content/docs/ko/guides/providers.md
  • docs-site/src/content/docs/ko/guides/sidecars.md
  • docs-site/src/content/docs/ko/guides/web-dashboard.md
  • docs-site/src/content/docs/ko/reference/adapters.md
  • docs-site/src/content/docs/ko/reference/cli/agents.md
  • docs-site/src/content/docs/ko/reference/cli/providers-accounts.md
  • docs-site/src/content/docs/ko/reference/configuration/advisor.md
  • docs-site/src/content/docs/ko/reference/configuration/providers.md
  • docs-site/src/content/docs/ko/reference/configuration/routing.md
  • docs-site/src/content/docs/reference/adapters.md
  • docs-site/src/content/docs/reference/cli/agents.md
  • docs-site/src/content/docs/reference/cli/messaging.md
  • docs-site/src/content/docs/reference/cli/providers-accounts.md
  • docs-site/src/content/docs/reference/configuration/advisor.md
  • docs-site/src/content/docs/reference/configuration/agents.md
  • docs-site/src/content/docs/reference/configuration/catalog.md
  • docs-site/src/content/docs/reference/configuration/keychain.md
  • docs-site/src/content/docs/reference/configuration/providers.md
  • docs-site/src/content/docs/reference/configuration/routing.md
  • docs-site/src/content/docs/reference/configuration/server.md
  • docs-site/src/content/docs/reference/management-api.md
  • docs-site/src/content/docs/ru/guides/claude-code.md
  • docs-site/src/content/docs/ru/guides/codex-app-models.md
  • docs-site/src/content/docs/ru/guides/combos.md
  • docs-site/src/content/docs/ru/guides/integrations.md
  • docs-site/src/content/docs/ru/guides/providers.md
  • docs-site/src/content/docs/ru/guides/web-dashboard.md
  • docs-site/src/content/docs/ru/reference/adapters.md
  • docs-site/src/content/docs/ru/reference/cli/providers-accounts.md
  • docs-site/src/content/docs/ru/reference/configuration/advisor.md
  • docs-site/src/content/docs/ru/reference/configuration/providers.md
  • docs-site/src/content/docs/tr/guides/chatgpt-desktop.md
  • docs-site/src/content/docs/tr/guides/claude-code.md
  • docs-site/src/content/docs/tr/guides/codex-app-models.md
  • docs-site/src/content/docs/tr/guides/combos.md
  • docs-site/src/content/docs/tr/guides/providers.md
  • docs-site/src/content/docs/tr/guides/web-dashboard.md
  • docs-site/src/content/docs/tr/reference/adapters.md
  • docs-site/src/content/docs/tr/reference/cli/providers-accounts.md
  • docs-site/src/content/docs/tr/reference/configuration/advisor.md
  • docs-site/src/content/docs/tr/reference/configuration/providers.md
  • docs-site/src/content/docs/troubleshooting/windows-acl-timeouts.md
  • docs-site/src/content/docs/zh-cn/guides/claude-code.md
  • docs-site/src/content/docs/zh-cn/guides/codex-app-models.md
  • docs-site/src/content/docs/zh-cn/guides/combos.md
  • docs-site/src/content/docs/zh-cn/guides/integrations.md
  • docs-site/src/content/docs/zh-cn/guides/providers.md
  • docs-site/src/content/docs/zh-cn/guides/web-dashboard.md
  • docs-site/src/content/docs/zh-cn/reference/adapters.md
  • docs-site/src/content/docs/zh-cn/reference/cli/providers-accounts.md
  • docs-site/src/content/docs/zh-cn/reference/configuration/advisor.md
  • docs-site/src/content/docs/zh-cn/reference/configuration/providers.md
  • docs-site/src/content/docs/zh-tw/guides/claude-code.md
  • docs-site/src/content/docs/zh-tw/guides/codex-app-models.md
  • docs-site/src/content/docs/zh-tw/guides/combos.md
  • docs-site/src/content/docs/zh-tw/guides/providers.md
  • docs-site/src/content/docs/zh-tw/guides/web-dashboard.md
  • docs-site/src/content/docs/zh-tw/reference/cli/providers-accounts.md
  • docs-site/src/content/docs/zh-tw/reference/configuration/advisor.md
  • docs-site/src/content/docs/zh-tw/reference/configuration/providers.md
  • gui/src/codex-quota-utils.ts
  • gui/src/components/ClaudeDesktopVisibility.tsx
  • gui/src/components/KiroDeviceLoginDialog.tsx
  • gui/src/components/KiroIamLoginForm.tsx
  • gui/src/components/KiroLoginChooser.tsx
  • gui/src/components/ProviderModelsNotice.tsx
  • gui/src/components/WorkflowBudgetPanel.tsx
  • gui/src/components/provider-workspace/ProviderBulkCompletionTest.tsx
  • gui/src/components/provider-workspace/ProviderCompletionTest.tsx
  • gui/src/components/provider-workspace/ProviderDetails.tsx
  • gui/src/components/provider-workspace/ProviderOverview.tsx
  • gui/src/components/provider-workspace/ProviderWorkspaceShell.tsx
  • gui/src/components/provider-workspace/provider-completion-test.css
  • gui/src/components/provider-workspace/types.ts
  • gui/src/components/provider-workspace/use-provider-probe-state.ts
  • gui/src/components/quota-summary-bar/QuotaSummaryBar.tsx
  • gui/src/components/use-kiro-device-login.ts
  • gui/src/i18n/de.ts
  • gui/src/i18n/en.ts
  • gui/src/i18n/fr.ts
  • gui/src/i18n/ja.ts
  • gui/src/i18n/ko.ts
  • gui/src/i18n/pt.ts
  • gui/src/i18n/ru.ts
  • gui/src/i18n/tr.ts
  • gui/src/i18n/vi.ts
  • gui/src/i18n/zh-TW.ts
  • gui/src/i18n/zh.ts
  • gui/src/kiro-device-login-helpers.ts
  • gui/src/muse-limit-observation.ts
  • gui/src/pages/ClaudeDesktop.tsx
  • gui/src/pages/Logs.tsx
  • gui/src/pages/Providers.tsx
  • gui/src/pages/Subagents.tsx
  • gui/src/pages/claude-desktop-visibility.ts
  • gui/src/pages/logs-failure-summary.ts
  • gui/src/pages/providers-shared.ts
  • gui/src/provider-workspace/catalog.ts
  • gui/src/provider-workspace/model-inventory.ts
  • gui/src/styles/claude-page.css
  • gui/src/styles/kiro-device-login.css
  • gui/tests/claude-desktop-visibility-card.test.tsx
  • gui/tests/claude-desktop-visibility.test.ts
  • gui/tests/fr-localization.test.ts
  • gui/tests/kiro-device-login.test.tsx
  • gui/tests/locale-parity.test.ts
  • gui/tests/logs-upstream-faults.test.tsx
  • gui/tests/muse-limit-expiry.test.tsx
  • gui/tests/muse-limit-observation.test.ts
  • gui/tests/provider-bulk-completion-test.test.tsx
  • gui/tests/provider-failure-fix-reverify.test.tsx
  • gui/tests/provider-first-response-guidance.test.tsx
  • gui/tests/workflow-budget-panel.test.tsx
  • package.json
  • scripts/ci/bun-install-frozen.sh
  • scripts/test-layout/layout-adapters.json
  • scripts/test-layout/layout-agent-assertion.json
  • scripts/test-layout/layout-clients.json
  • scripts/test-layout/layout-codex-collision.json
  • scripts/test-layout/layout-config.json
  • scripts/test-layout/layout-exec-boundary.json
  • scripts/test-layout/layout-file-identity.json
  • scripts/test-layout/layout-kiro-usage.json
  • scripts/test-layout/layout-providers.json
  • scripts/test-layout/layout-responses.json
  • scripts/test-layout/layout-usage.json
  • scripts/test-layout/layout.json
  • skills/ocx/references/01_management_surface.md
  • skills/ocx/references/01_surface_providers-models.md
  • src/adapters/anthropic.ts
  • src/adapters/command-code-project-context.ts
  • src/adapters/kiro-events.ts
  • src/adapters/kiro/adapter.ts
  • src/adapters/kiro/stream.ts
  • src/adapters/openai-chat/messages.ts
  • src/adapters/openai-chat/passthrough.ts
  • src/adapters/openai-chat/single-system.ts
  • src/adapters/openai-responses/muse-tool-catalog.ts
  • src/adapters/openai-responses/passthrough.ts
  • src/adapters/openai-responses/prompt-cache.ts
  • src/adapters/openai-responses/request-strips.ts
  • src/adapters/openai-responses/tool-output-recovery.ts
  • src/adapters/openai-responses/tool-schema.ts
  • src/adapters/opencode-go-additional-tools.ts
  • src/adapters/routed-agent-messages.ts
  • src/adapters/xai-web-search.ts
  • src/adapters/zed-additional-tools.ts
  • src/adapters/zed.ts
  • src/advisor/consult.ts
  • src/advisor/runtime.ts
  • src/bridge/max-output-completion.ts
  • src/bridge/response-json.ts
  • src/bridge/sse.ts
  • src/chatgpt/app-server-shim/bundle-trust-policy.ts
  • src/chatgpt/app-server-shim/launcher.ts
  • src/claude/compatibility.ts
  • src/claude/desktop-3p.ts
  • src/claude/desktop-model-visibility.ts
  • src/claude/desktop-remote-store-io.ts
  • src/claude/inbound-content-options.ts
  • src/claude/intercept/proxy-auth.ts
  • src/cli/account-main.ts
  • src/cli/capabilities-provider-models.ts
  • src/cli/chatgpt-command.ts
  • src/cli/codex-launcher.ts
  • src/cli/codex-shim-autorestore.ts
  • src/cli/dispatch.ts
  • src/cli/doctor.ts
  • src/cli/index.ts
  • src/cli/init.ts
  • src/cli/internal-command.ts
  • src/cli/provider-cc-switch-import.ts
  • src/cli/provider.ts
  • src/cli/registry.ts
  • src/cli/restart-scope.ts
  • src/cli/root.ts
  • src/cli/stop-approval.ts
  • src/cli/v2.ts
  • src/client/machine-api.ts
  • src/clients/config-export.ts
  • src/codex/account-cooldown-response.ts
  • src/codex/app-server-restart-service.ts
  • src/codex/auth-api/login-flow.ts
  • src/codex/auth-api/pool-quota-probe.ts
  • src/codex/auth-context.ts
  • src/codex/catalog/bundled.ts
  • src/codex/catalog/metadata.ts
  • src/codex/catalog/native-omission.ts
  • src/codex/catalog/native-template.ts
  • src/codex/catalog/parsing.ts
  • src/codex/catalog/provider-models.ts
  • src/codex/catalog/retained-sync.ts
  • src/codex/catalog/write-audit.ts
  • src/codex/cli-install-provenance.ts
  • src/codex/cli-update-artifacts.ts
  • src/codex/cli-update-job-store-windows.ts
  • src/codex/cli-update-job-worker.ts
  • src/codex/cli-update-recovery.ts
  • src/codex/cli-update-selection-gate.ts
  • src/codex/cli-windows-plan-provenance.ts
  • src/codex/codex-home-owner.ts
  • src/codex/convergence.ts
  • src/codex/coordinator-doctor.ts
  • src/codex/desktop-app-restart.ts
  • src/codex/desktop-app/handoff.ts
  • src/codex/exec-boundary.ts
  • src/codex/history-provider.ts
  • src/codex/inject/bounded-config-reader.ts
  • src/codex/main-account.ts
  • src/codex/native-main-lock-file.ts
  • src/codex/native-residue.ts
  • src/codex/orca-auth-source.ts
  • src/codex/quota-types.ts
  • src/codex/quota.ts
  • src/codex/role-auto-assign.ts
  • src/codex/role-capability.ts
  • src/codex/role-sizing.ts
  • src/codex/routing/cooldown-math.ts
  • src/codex/runtime.ts
  • src/codex/shim-fingerprint.ts
  • src/codex/shim-inspect.ts
  • src/codex/shim-restore-lock.ts
  • src/codex/shim-state-file.ts
  • src/codex/shim-wrapper-write.ts
  • src/codex/shim.ts
  • src/codex/transition-state.ts
  • src/combos/failover.ts
  • src/config/atomic-write.ts
  • src/config/diagnostics.ts
  • src/config/initialize.ts
  • src/config/load-degrade.ts
  • src/config/process-state.ts
  • src/config/salvage.ts
  • src/config/schema/config-schema.ts
  • src/config/schema/leaf-validators.ts
  • src/config/schema/workflow-budget.ts
  • src/config/tracked-runtime-inspection.ts
  • src/integrations/aside-profile-context.ts
  • src/integrations/droid-settings.ts
  • src/integrations/hermes-profiles.ts
  • src/lib/bounded-file-read.ts
  • src/lib/bun-runtime-preflight.ts
  • src/lib/file-identity.ts
  • src/lib/local-chat-completion.ts
  • src/lib/local-destinations.ts
  • src/lib/redact-folding.ts
  • src/lib/spend-pool-alias-validation.ts
  • src/lib/state-store-registrations.ts
  • src/lib/test-home-guard.ts
  • src/lib/windows-secret-acl.ts
  • src/lib/workflow-budget-config.ts
  • src/local-credentials/generation.ts
  • src/local-credentials/inventory.ts
  • src/messaging/remote-forward-failure.ts
  • src/messaging/remote-ports.ts
  • src/messaging/remote-process.ts
  • src/messaging/remote-tunnels.ts
  • src/oauth/antigravity-discovery-diagnostics.ts
  • src/oauth/google-antigravity.ts
  • src/oauth/index.ts
  • src/oauth/kiro-device-login.ts
  • src/oauth/kiro-iam-identity-center.ts
  • src/oauth/store.ts
  • src/providers/account-quota-disk.ts
  • src/providers/cc-switch-import-bytes.ts
  • src/providers/cc-switch-import-source.ts
  • src/providers/cc-switch-import.ts
  • src/providers/derive.ts
  • src/providers/model-discovery-diagnostic.ts
  • src/providers/model-discovery.ts
  • src/providers/model-rename-fields.ts
  • src/providers/model-rename-migration.ts
  • src/providers/quota.ts
  • src/providers/quota/report-cache.ts
  • src/providers/reasoning-metadata.ts
  • src/providers/registry/entries-core.ts
  • src/providers/registry/entries-extended.ts
  • src/providers/registry/model-ids.ts
  • src/providers/registry/model-seeds.ts
  • src/providers/registry/types.ts
  • src/providers/resolved-model-policy.ts
  • src/providers/routed-config.ts
  • src/providers/stale-model-roster-migration.ts
  • src/providers/xai-transport.ts
  • src/remote-control/workspace-codex-runtime.ts
  • src/remote-control/workspace-executor.ts
  • src/responses/custom-tool-compat.ts
  • src/responses/item-provenance.ts
  • src/responses/namespace-tool-compat.ts
  • src/router.ts
  • src/routing/analytics.ts
  • src/routing/fallback-policy.ts
  • src/routing/health.ts
  • src/routing/history/build-file.ts
  • src/routing/history/indexer.ts
  • src/routing/history/ingest.ts
  • src/routing/history/integrity.ts
  • src/routing/history/rebuild-job.ts
  • src/routing/history/rebuild-protocol.ts
  • src/routing/history/rebuild-worker.ts
  • src/routing/history/sqlite-errors.ts
  • src/server/admission-model-scope.ts
  • src/server/advisor-admission-scope.ts
  • src/server/auth-cors.ts
  • src/server/capture-admission-policy.ts
  • src/server/chat-completions.ts
  • src/server/claude-messages.ts
  • src/server/codex-model-list.ts
  • src/server/configured-credentials.ts
  • src/server/index/serve-options.ts
  • src/server/index/websocket-handler.ts
  • src/server/management/agent-settings-routes.ts
  • src/server/management/codex-agent-role-routes.ts
  • src/server/management/codex-role-auto-assign.ts
  • src/server/management/config-routes.ts
  • src/server/management/context.ts
  • src/server/management/native-integration-routes.ts
  • src/server/management/oauth-account-routes.ts
  • src/server/management/provider-overwrite-carry.ts
  • src/server/management/provider-routes.ts
  • src/server/management/route-registry.ts
  • src/server/management/shared.ts
  • src/server/management/workflow-budget-routes.ts
  • src/server/messages-native-eligibility.ts
  • src/server/messages-native-scope.ts
  • src/server/messages-shared.ts
  • src/server/persistent-gui-session.ts
  • src/server/request-log.ts
  • src/server/responses-snapshot-repair.ts
  • src/server/responses-undeclared-tool-guard.ts
  • src/server/responses/adapter-delivery.ts
  • src/server/responses/advisor-plan-slot.ts
  • src/server/responses/advisor-slot.ts
  • src/server/responses/codex-auth-error.ts
  • src/server/responses/combo-required-tool-contract.ts
  • src/server/responses/compact.ts
  • src/server/responses/core-combo-failure.ts
  • src/server/responses/core-combo.ts
  • src/server/responses/core-lifetime.ts
  • src/server/responses/core-options.ts
  • src/server/responses/core.ts
  • src/server/responses/jev-model-invoke.ts
  • src/server/responses/passthrough-dispatch.ts
  • src/server/responses/policy-fallback.ts
  • src/server/responses/request-prepare.ts
  • src/server/responses/request-send-budget.ts
  • src/server/responses/request-sidecar-auth.ts
  • src/server/responses/request-transport.ts
  • src/server/responses/run-turn-execution.ts
  • src/server/responses/sidecar-execution.ts
  • src/server/workflow-refusal.ts
  • src/service-manager-probe.ts
  • src/service/state-lock.ts
  • src/types.ts
  • src/types/admission-policy.ts
  • src/types/config.ts
  • src/types/provider.ts
  • src/types/request.ts
  • src/update/job.ts
  • src/update/worker-launch.ts
  • src/usage/log.ts
  • src/vision/index.ts
  • src/vision/plan.ts
  • src/vision/routed-describe.ts
  • src/web-search/loop.ts
  • src/web-search/parse.ts
  • structure/INDEX.md
  • structure/advisor.md
  • structure/catalog.md
  • structure/cli-management.md
  • structure/clients/chatgpt-desktop.md
  • structure/clients/claude-desktop-config-reads.md
  • structure/clients/claude-desktop-model-visibility.md
  • structure/clients/claude-desktop.md
  • structure/clients/omo-export-dialect.md
  • structure/codex-cli-update.md
  • structure/config.md
  • structure/dashboard-and-usage.md
  • structure/data-planes/claude-tool-loading.md
  • structure/data-planes/protocol-paths.md
  • structure/data-planes/search.md
  • structure/fallback-policy.md
  • structure/gui-and-management-api.md
  • structure/manifest.json
  • structure/ops/service-and-sidecars.md
  • structure/provider-completion-diagnostic.md
  • structure/providers-and-adapters.md
  • structure/providers/anthropic-account-pool.md
  • structure/providers/anthropic-progress.md
  • structure/providers/chat-compat.md
  • structure/providers/kiro.md
  • structure/providers/lm-studio-chat.md
  • structure/providers/openai-accounts.md
  • structure/providers/openai-tiers.md
  • structure/providers/opengateway.md
  • structure/providers/xai-grok.md
  • structure/remote-link.md
  • structure/remote-messaging.md
  • structure/remote-workspace.md
  • structure/runtime.md
  • structure/subagents.md
  • structure/transports/byte-accounting.md
  • structure/transports/max-output-completion.md
  • structure/transports/policy-fallback.md
  • structure/transports/response-citations.md
  • structure/transports/responses-citations.md
  • structure/transports/responses-combo-boundaries.md
  • structure/transports/responses-failover.md
  • structure/transports/responses-spend.md
  • structure/transports/responses-wire-shapes.md
  • structure/transports/responses.md
  • tests/adapters/anthropic/anthropic-progress-updates.test.ts
  • tests/adapters/anthropic/anthropic-ratelimit-headers.test.ts
  • tests/adapters/google/google-antigravity-oauth.test.ts
  • tests/adapters/openai/openai-chat-single-system.test.ts
  • tests/adapters/routed-agent-messages.test.ts
  • tests/advisor/advisor-caller-policy-compact.test.ts
  • tests/advisor/advisor-caller-policy-host-key.test.ts
  • tests/advisor/advisor-caller-policy-http.test.ts
  • tests/advisor/advisor-caller-policy-ingress.test.ts
  • tests/advisor/advisor-caller-policy-jev.test.ts
  • tests/advisor/advisor-caller-policy-replay.test.ts
  • tests/advisor/advisor-caller-policy-routing.test.ts
  • tests/advisor/advisor-caller-policy-self-fetch.test.ts
  • tests/advisor/advisor-caller-policy-sidecar-authority.test.ts
  • tests/advisor/advisor-caller-policy-vision.test.ts
  • tests/advisor/advisor-caller-policy.test.ts
  • tests/advisor/advisor-responses-wiring.test.ts
  • tests/advisor/advisor-scope-transport.test.ts
  • tests/advisor/advisor-web-search.test.ts
  • tests/ci-workflows/ci-bun-install-frozen.test.ts
  • tests/ci-workflows/docs-developer-role-policy.test.ts
  • tests/ci-workflows/test-home-guard.test.ts
  • tests/claude-integration/claude-compatibility.test.ts
  • tests/claude-integration/claude-desktop-first-party.test.ts
  • tests/claude-integration/claude-desktop-model-visibility.test.ts
  • tests/claude-integration/claude-first-party-agent-sync.test.ts
  • tests/claude-integration/claude-messages-endpoint.test.ts
  • tests/claude-integration/claude-native-passthrough.test.ts
  • tests/claude-integration/claude-translated-server-tools.test.ts
  • tests/claude-integration/claude-translated-tool-restrictions.test.ts
  • tests/claude-integration/messages-shared-sse.test.ts
  • tests/cli/cli-capability-operation-workflows.test.ts
  • tests/cli/cli-head.test.ts
  • tests/cli/cli-headless-parity.test.ts
  • tests/cli/cli-help-recovery.test.ts
  • tests/cli/cli-provider-cc-switch-import.test.ts
  • tests/cli/cli-ready.test.ts
  • tests/cli/cli-start-journal-order.test.ts
  • tests/cli/cli-stop-json.test.ts
  • tests/cli/cli-sync-expect-link.test.ts
  • tests/cli/cli-version-skew.test.ts
  • tests/clients/desktop-app-server-exec-boundary.test.ts
  • tests/clients/desktop-app-server-shim-launcher.test.ts
  • tests/clients/desktop-compatibility-build-probe.test.ts
  • tests/clients/integrations-writer.test.ts
  • tests/clients/omo-client.test.ts
  • tests/clients/omo-responses-loop.test.ts
  • tests/clients/remote-workspace.test.ts
  • tests/codex-integration/catalog-omit-disabled-native.test.ts
  • tests/codex-integration/codex-auth-context.test.ts
  • tests/codex-integration/codex-catalog-write-audit.test.ts
  • tests/codex-integration/codex-cli-install-provenance.test.ts
  • tests/codex-integration/codex-cli-update-artifacts.test.ts
  • tests/codex-integration/codex-cli-update-parent-async.test.ts
  • tests/codex-integration/codex-cli-update-windows-apply-shared.test.ts
  • tests/codex-integration/codex-cli-update-windows-pending.test.ts
  • tests/codex-integration/codex-cli-windows-plan.test.ts
  • tests/codex-integration/codex-coordinator-doctor.test.ts
  • tests/codex-integration/codex-credits-probes.test.ts
  • tests/codex-integration/codex-history-provider.test.ts
  • tests/codex-integration/codex-main-account-refresh.test.ts
  • tests/codex-integration/codex-main-rotation.test.ts
  • tests/codex-integration/codex-native-residue.test.ts
  • tests/codex-integration/codex-routing-elapsed-short-reset.test.ts
  • tests/codex-integration/codex-service-manager-probe.test.ts
  • tests/codex-integration/codex-shim-windows-revision.test.ts
  • tests/codex-integration/codex-transition-state.test.ts
  • tests/codex-integration/exec-cli-bundle-containment.test.ts
  • tests/codex-integration/exec-cli-renamed-app-bundle.test.ts
  • tests/codex-integration/exec-launcher-boundary.test.ts
  • tests/codex-integration/exec-renamed-app-bundle.test.ts
  • tests/codex-integration/main-quota-provenance.test.ts
  • tests/codex-integration/messaging-remote-enrollment-gaps.test.ts
  • tests/codex-integration/messaging-remote-forward-failure.test.ts
  • tests/codex-integration/messaging-remote-lifecycle.test.ts
  • tests/codex-integration/messaging-remote-port-reservation.test.ts
  • tests/codex-integration/multi-agent-keep-native-v1.test.ts
  • tests/codex-integration/native-main-owner-lifetime.test.ts
  • tests/codex-integration/reasoning-metadata.test.ts
  • tests/codex-integration/slug-codec.test.ts
  • tests/config/config-mutation-lock.test.ts
  • tests/config/config-removed-opencode-free.test.ts
  • tests/config/config-workflow-budget.test.ts
  • tests/config/lmstudio-system-policy.test.ts
  • tests/config/local-credential-generation.test.ts
  • tests/fixtures/parent-stop-runner.ts
  • tests/fixtures/test-layout-expected.json
  • tests/gui/gui-codex-usage-score-parity.test.ts
  • tests/helpers/codex-cli-apply-admission.ts
  • tests/helpers/codex-cli-content-fs.ts
  • tests/helpers/combo-context-overflow-cases.ts
  • tests/helpers/kiro-device-fixture.ts
  • tests/helpers/same-path.ts
  • tests/lib/bun-runtime-preflight.test.ts
  • tests/lib/file-identity-callers.test.ts
  • tests/lib/file-identity.test.ts
  • tests/lib/redact.test.ts
  • tests/oauth/anthropic2-discovery-ownership.test.ts
  • tests/oauth/oauth-login-cli-errors.test.ts
  • tests/providers/azure-adapter.test.ts
  • tests/providers/cc-switch-import.test.ts
  • tests/providers/claude-cli-adapter.test.ts
  • tests/providers/codebuddy-adapter.test.ts
  • tests/providers/command-code-project-context.test.ts
  • tests/providers/kiro/kiro-device-iam.test.ts
  • tests/providers/kiro/kiro-device-social.test.ts
  • tests/providers/kiro/kiro-single-final.test.ts
  • tests/providers/kiro/kiro-stream.test.ts
  • tests/providers/model-rename-migration.test.ts
  • tests/providers/muse-spark-web-search-compat.test.ts
  • tests/providers/provider-account-quota-persistence.test.ts
  • tests/providers/provider-model-discovery-contract.test.ts
  • tests/providers/provider-quota.test.ts
  • tests/providers/provider-registry-parity.test.ts
  • tests/providers/volcengine-ark-assistant-content.test.ts
  • tests/providers/xai/xai-additional-tools.test.ts
  • tests/providers/xai/xai-loaded-tool-provenance.test.ts
  • tests/providers/xai/xai-replay-provenance.test.ts
  • tests/providers/xai/xai-responses-adjacency.test.ts
  • tests/providers/xai/xai-transport.test.ts
  • tests/providers/zed-hosted-provider.test.ts
  • tests/responses/chat-native-combo.test.ts
  • tests/responses/graceful-max-output-tokens-exclusions.test.ts
  • tests/responses/graceful-max-output-tokens.test.ts
  • tests/responses/messages-native-bridge-policy.test.ts
  • tests/responses/openai-responses-passthrough.test.ts
  • tests/responses/responses-combo-bridge-usage.test.ts
  • tests/responses/responses-combo-exhausted-error.test.ts
  • tests/responses/responses-muse-tool-choice.test.ts
  • tests/responses/responses-snapshot-scaling.test.ts
  • tests/routing/codex-role-auto-assign.test.ts
  • tests/routing/codex-role-capability-consent.test.ts
  • tests/routing/codex-role-capability-redirects.test.ts
  • tests/routing/codex-role-measured-ties.test.ts
  • tests/routing/codex-role-sizing.test.ts
  • tests/routing/policy-execution.test.ts
  • tests/server/codex-role-auto-assign-routes.test.ts
  • tests/server/codex-role-configured-credentials.test.ts
  • tests/server/config.test.ts
  • tests/server/loopback-listener-admission.test.ts
  • tests/server/management-provider-compat-carry.test.ts
  • tests/server/management-route-registry.test.ts
  • tests/server/server-combo-cooldown-recording.test.ts
  • tests/server/server-combo-reasoning-replay-eligibility.test.ts
  • tests/server/server-combo-required-tool-contract.test.ts
  • tests/server/server-kiro-device-login.test.ts
  • tests/server/server-kiro-usage-log-e2e.test.ts
  • tests/server/server-workflow-budget-settings.test.ts
  • tests/server/server-xai-responses-streaming.test.ts
  • tests/server/spend-instrumentation-log.test.ts
  • tests/server/update-async-routes.test.ts
  • tests/service/process-state.test.ts
  • tests/service/service-ownership-state.test.ts
  • tests/update/update-worker-launch.test.ts
  • tests/usage/request-history-integrity.test.ts
  • tests/usage/request-log-estimate-cap.test.ts
  • tests/usage/request-log-normalization.test.ts
  • tests/usage/request-outcome-agreement.test.ts
  • tests/usage/usage-ledger-scanner.test.ts
  • tests/web-search/web-search-eof.test.ts
  • tests/windows/windows-atomic-write-acl-rearm.test.ts
  • tests/windows/windows-secret-acl-diagnostics.test.ts

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

Copy link
Copy Markdown
Contributor

✅ Deterministic PR hygiene checks passed.

@github-actions github-actions Bot changed the title release: promote frozen tip c68885b5f1 to main as 2.95.0 [WRONG BRANCH] release: promote frozen tip c68885b5f1 to main as 2.95.0 Oct 31, 2026
@github-actions

github-actions Bot commented Oct 31, 2026 •

Copy link
Copy Markdown
Contributor

⏳ DRAFT

  • wrong target branch (main); retarget to dev. UI screenshot required.

What to do

  • Retarget this PR to dev — all contributions go to dev.
  • Add a screenshot of the UI change to the PR description.

Its title has been prefixed with [WRONG BRANCH].
Automatic draft conversion failed (token cannot change draft status). Please convert this pull request to a draft manually. The required enforce-target check will keep failing until every issue above is resolved.

@github-actions
github-actions Bot marked this pull request as draft October 31, 2026 01:37

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 0c9edcb46e

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +176 to +178
if (isClaudeWebSearchToolName(choice.name)
&& (!Array.isArray(body.tools) || !body.tools.some(tool => isRec(tool) && tool.type === "web_search"))) {
throw new AnthropicRequestError("Restricted web search cannot be forced on a translated route without an available search declaration");

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Defer restricted-search rejection until the delivery lane is known

For a Messages request that declares restricted web search (for example, allowed_domains) and forces it with tool_choice: { type: "tool", name: "web_search" }, this throws even when the destination can receive the original request natively. In handleClaudeMessages, messagesToResponsesTranslation runs before managed-native eligibility is evaluated, so an Anthropic route with managedMessagesNative: true and the search sidecar disabled returns HTTP 400 before reaching native dispatch. That lane preserves the original restricted declaration and previously accepted this request. Defer this rejection until the route is known to require the lossy translation, and add coverage for forced restricted search on the managed-native lane.

Useful? React with 👍 / 👎.

const captured: { url: string; body: any }[] = [];
const fetch = (async (url: RequestInfo | URL, init?: RequestInit) => {
captured.push({ url: String(url), body: JSON.parse(String(init?.body)) });
if (String(url).includes("api.anthropic.com")) {
@lidge-jun

Copy link
Copy Markdown
Owner Author

Maintainer release integration for stable 2.95.0.

  • Exact promotion head: 0c9edcb46e6e3c6eb6e60167b4b7246fedfd3c29. Its tree is byte-identical to frozen candidate c68885b5f16a2a36d8eaa9877ffcae7235128c1b; candidate Cross-platform CI lane=all run 41149878845 succeeded on every macOS and Windows leg.
  • All other PR checks are green. enforce-target fails only because this is the maintainer-controlled main promotion and the cumulative promotion diff includes GUI paths; this is the same expected disposition as earlier release promotions.
  • CodeQL disposition: independent delta review compared the paginated PR-head and main alert sets (261 vs 260). The only alert absent from main is fix(kiro): keep progress text nonterminal #369 in tests/claude-integration/claude-translated-tool-restrictions.test.ts:45, a test-local mocked fetch substring check that selects a synthetic 503 response; it is not production URL validation. .github/workflows/ci.yml is byte-identical between main and this head, so its cache-poisoning annotations are inherited, not introduced here. No new exploitable production alert was identified. Pre-existing main alerts remain tracked in code scanning and are not being dismissed by this merge.
  • dev has already advanced to 2.96.0 via chore(release): open dev at 2.96.0 before releasing 2.95.0 #8033. Push-event Cross-platform CI and Service lifecycle on the merged main SHA remain mandatory before release.yml is dispatched.

@lidge-jun
lidge-jun marked this pull request as ready for review October 31, 2026 02:07
@lidge-jun
lidge-jun merged commit 9df4f6a into main Oct 31, 2026
40 of 42 checks passed
@lidge-jun
lidge-jun deleted the release/promote-main-2.95.0 branch October 31, 2026 02:07
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.