Skip to content

release: promote the verified 2.62.0 tree to main - #5603

Merged
lidge-jun merged 29 commits into
mainfrom
codex/260923-release-main-2.62.0
Sep 22, 2026
Merged

lidge-jun merged 29 commits into
mainfrom
codex/260923-release-main-2.62.0

Conversation

@lidge-jun

Copy link
Copy Markdown
Owner

Summary

Maintainer promotion of the verified dev candidate a077087b74 to main for 2.62.0. The owner explicitly requested the stable release.

The branch starts at the candidate and merges origin/main with the ours strategy, so the promoted tree is exactly the verified candidate. Everything main carried that the candidate lacked is release-fix carries already on dev under other SHAs, earlier version metadata, and promotion merges; no product change is dropped.

Verification

  • Candidate a077087b74 passed a full-platform Cross-platform CI workflow_dispatch run with every job executed and green, including all nine Windows shards, both macOS shards, the widget bundle and the desktop shell: https://github.com/lidge-jun/opencodex/actions/runs/35778197810
  • Version sources checked with bun scripts/release-version-sources.ts check 2.62.0.
  • The push-event Cross-platform CI and Service lifecycle runs on the main merge SHA gate release.yml before publication.
  • Local test suite, typecheck and build: NOT RUN (hosted CI only).

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.

Owner-controlled promotion using repository admin authority; no rulesets changed.

github-actions Bot and others added 29 commits September 22, 2026 19:05
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* fix(release): name standalone checksums after their archives

* fix(release): verify Tauri prehashed minisign signature boxes
…ts attach (#5555)

GitHub freezes a release when it is published, so the attach step's upload
came back HTTP 422 "Cannot upload assets to an immutable release". Every
release from v2.55.0 to v2.60.0 therefore shipped with zero assets and the
desktop updater had nothing to download.

Create the release as a draft and flip it to published in attach-release,
after the verified bundle is uploaded. Release notes still come from the
validated notes file written at creation.
…5567)

* ci: scope macOS, Rust and app-bundle jobs to the shipping boundary

An ordinary source pull request started the full cross-platform matrix: two
macOS suite shards, the macOS widget plus Tauri app-bundle build, the Linux
Rust toolchain job, and the macOS legs of the keyring and npm-global matrices.
A proxy-logic change under src/ paid a Rust build and an app bundle it cannot
affect, and dev pushes started the same matrix a second time after the pull
request had already proven the change.

Add a native path filter to the changes job and gate platform-macos, widget and
desktop-shell behind it, so those jobs run on the promotion pushes to main and
preview, on explicit dispatch, and on a pull request only when the inputs they
build actually moved. The keyring and npm-global matrices take their leg list
from a validated JSON output of the same job, keeping ubuntu and windows
unconditional while the macOS leg follows the native selection. Drop dev from
the push trigger: its integration evidence is the pull request run, and
workflow_dispatch covers anything a maintainer wants proven by hand.

main and preview stay on the push trigger because release.yml requires a
successful push-event Cross-platform CI run for the exact release SHA and
states that a pull-request run does not qualify.

The aggregate ci gate learns the native dimension so a deliberately unselected
job reads as not-requested while a job that was requested and then skipped
still fails by name. An empty matrix include list would report success over
zero legs, so the emitter validates both JSON outputs before they are consumed.

Accepted coverage loss: a green pull request no longer proves the macOS suite,
the Rust toolchain, or the app bundle. Those reach publication only through the
promotion push, which still runs them.

Local checks: NOT RUN.

* test(ci): feed the aggregate gate the results shape needs actually has

The new harness passed a flat job-to-string map as RESULTS, but the gate reads
.value.result out of it, so jq failed on the first entry and the heredoc
feeding the check loop came back empty. The loop never ran, which made the
requested-then-skipped assertion fail with an empty accumulator and — worse —
made the green-path assertion pass over nothing.

Shape the map the way the needs context serializes it.

Local checks: NOT RUN.
* fix(cursor): bound output quarantine and retain adjacent echo findings

Carries #5476, including same-line marker attribution and upstream-error ordering regressions.

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>

* fix(cursor): replace duplicate replay entries in constant time

Partially carries #5474. Preserve complete-history turn and invocation fidelity; defer the raw-message cutoff because it can discard the initiating instruction. Add long-history regression coverage.

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>

* fix(cursor): bound invocation argument restoration allocations

Carries #5458. Reuse serialized arguments, probe UTF-8 length within the remaining envelope budget, and preserve final encoded-cost validation.

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>

* test(cursor): pin bounded oversized-frame classification

Document the intentional per-frame prefix boundary and verify late matches pass through without corrective retry while leading-match regressions remain intact.

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>

---------

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>
…Lite catalogs (#5508)

* fix(responses): bound native steering routes and replay memory

Native steering and injection accepted requests on routes that were never
meant to carry them, and their replay buffers grew without an upper bound,
so a long-lived WebSocket exchange could retain an unbounded amount of
app-owned memory. Restrict steering to the routes that declare it, cap the
replay and body sizes, and release the stores when an exchange settles.
Preexisting negative route tests are retained, and the injection docs now
cross-link the steering contract.

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>

* fix(responses): enforce native injection tool authorization

Carry #5470 onto the bounded native-control path. Configure the resolved request-local catalog before attachment, reject undeclared added/done/terminal items before relay, and preserve structured rejection codes. Retain declared rich-result continuations and the existing size and rollback controls.

Local checks: NOT RUN by instruction. Hosted CI remains required.

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>

* fix(subagents): recognize Responses Lite plaintext V2 catalogs

Carry #5492. Recognize the first developer additional_tools catalog only when top-level tools is absent. Preserve opt-in, canonical destination, explicit catalog precedence, conflict checks and response restoration. Include unit and server-boundary regressions and clarify the Chinese catalog wording.

Local checks: NOT RUN by instruction. Hosted CI remains required.

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>

* fix(responses): reject oversized injection before enqueueing

Validate the serialized injection before reserving call identities or queue bytes. A result exceeding the configured body limit is refused synchronously even when another result awaits acknowledgement, leaving the retained socket usable for corrected input.

Add a two-call regression on subscription and public API routes covering the typed refusal, unchanged replay retention, first acknowledgement, corrected second result and final cleanup. Preserve immediate refusal and authorization coverage, and align the public and structure contracts.

Independent static review: PASS. Local checks: NOT RUN by instruction; revised-head hosted CI remains required before integration.

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>

---------

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
* fix(config): preserve concurrent edits across refresh and desktop apply

Carry #5478 with detached snapshot reconciliation, committed Claude subtree adoption, and cached asynchronous policy probes.

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>

* fix(codex): reject conflicting retained provider tables

Carry #5450 while keeping its end-to-end compensation regression in a focused sibling below the file-size limit. Register the sibling additively in both layout authorities.

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>

* fix(doctor): bound live catalog reads and verify fallback behavior

Carry #5433 with behavioral default-transport coverage for byte caps and redirects, exact row and identifier limits, and malformed-row fallback.

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>

* docs(claude): record asynchronous desktop policy probe contract

Document the nonblocking single-flight and cache contract carried from #5478, as identified in the final static review.

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>

* fix(claude): adopt committed gateway state before policy probes

Rebase the live Claude subtree to the durable gateway transaction and retain pending disjoint edits. Cover hand edits, failed adoption, and a first-party switch while an earlier policy probe is pending.

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>

* fix(config): capture persisted deletion intent before detached rebasing

Apply current disk tombstones after reconciliation without allowing a temporary stale value to erase deletion intent. Cover persisted discovery deletion, explicit reintroduction, and unchanged live precedence.

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>

* fix(codex): preserve multiline TOML in retained provider comparisons

Share lossless structural lines with the native defaults editor, capture separated provider spans, and compare isolated parsed provider values. Preserve raw values and the document BOM while rejecting malformed or ambiguous definitions.

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>

* fix(claude): pin committed gateway leaves after live adoption

---------

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>
…c and config output (#5573)

* fix(lab): combine host-redaction hardening for socket markers and connect-to failures

Combines three fork PRs into one change on current dev: bare destinations after resolver/socket markers are redacted only where grammar proves the position (sole argument or after 'lookup'), connect-to failures redact the bare target when a failure term follows, and rewrites splice at the tail offset so a marker word that repeats the destination cannot take the [host] itself.

bun test tests/lab/lab-evidence-sanitization.test.ts: 31 pass

(cherry picked from commit 69990d9)

Source: #5538 commit b90139f

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>

* fix(lab): redact socket destinations carrying a sentence-final period

Classify the token without its trailing period and leave the period outside the mask: ECONNREFUSED redis. -> ECONNREFUSED [host]. Previously the punctuation defeated host classification and leaked the destination.

(cherry picked from commit a74038c)

Source: #5538 commit d8042a5

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>

* fix(config): avoid logging operator-supplied credential/group identifiers in credentialGroups diagnostics

(cherry picked from commit 0354bd9)

Source: #5538 commit fc57a55

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>

* fix(config): align comments with indexed messages and cover every issue shape

(cherry picked from commit f8a67b3)

Source: #5538 commit 038c0fa

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>

* fix(cli): redact proxy credentials in config output

(cherry picked from commit 73946f3)

Source: #5538 commit b31732a

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>

* fix(cli): keep non-secret proxy values readable in config output

Mask only credential-bearing proxy URLs (userinfo stripped via redactUrlForLog, host/port kept); direct and credential-less values print unchanged. Clarify that config export stays raw for restore.

(cherry picked from commit acdbb1c)

Source: #5538 commit dc4d273

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>

* fix(quota): sanitize Anthropic quota labels

(cherry picked from commit ee716bf)

Source: #5538 commit 4a04458

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>

* fix(quota): drop unrecognized Anthropic display_name from quota labels

Per review on #5463: stripping terminal control characters still left attacker-chosen residue on the quota line. parseClaudeLimit now returns null unless the name reduces to a recognized model (Fable, Opus, Sonnet); the test asserts the residue is not emitted and adds a recognized-name positive case.

(cherry picked from commit a9a6bac)

Source: #5538 commit aaffe75

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>

* docs(providers): state canonical quota label boundary

Source: #5538 commit 62c677c

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>

* fix(diagnostics): preserve redaction across path aliases and resolver prose

Use normalized config keys for get and mutation output. Preserve direct
resolver destinations when explanatory text follows, while retaining socket
prose exclusions. Add focused regressions and align output contracts.

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>

* docs(structure): keep runtime doc within its line budget

---------

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>
Co-authored-by: Epinephrine <luvs01@hanmail.net>
…nect trailers (#5574)

* fix(devin): suppress untrusted Connect trailer text

Connect-RPC EOS trailers propagated upstream-controlled error.message text into adapter error events, API responses, and diagnostic logs, and that text can reflect the credential carried by the request. Parse trailers with an allowlist for known Connect codes, keep the raw message inside the parser for quota/opaque-denial detection, and throw content-free errors carrying only the allowlisted code and hex trace id.

(cherry picked from commit 50eab5a)
(cherry picked from commit 6efc759)

* fix(devin): preserve stated reset delay on content-free trailer errors

The trailer suppression left the thrown CloudChatError without the upstream "limit will reset in N" sentence that streamChatEventsWithResetRetry scraped for its cooldown, so a stated-reset 429 failed immediately instead of waiting out the quota window. Parse the delay inside the trailer parser while the raw text still exists and carry it as a typed retryAfterSeconds field; the retry prefers that field and keeps the message scrape for errors whose text still carries a hint. Adds a regression test that drives the real Connect EOS trailer path.

(cherry picked from commit 7b7a8b8)
(cherry picked from commit b841abd)

* fix(devin): carry the stated reset delay in the outward trailer error

(cherry picked from commit 4b723ef)
(cherry picked from commit 82d452c)

* fix(devin): prevent reset waits from holding active-turn capacity

(cherry picked from commit df07bc6)
(cherry picked from commit 98c9298)

* fix(devin): pin the adapter's zero reset wait and correct the surface comment

(cherry picked from commit 0e73736)
(cherry picked from commit a2936ca)

* test(devin): prove the zero reset wait through the adapter's own sends

The module-mock spy leaked into sibling test files in the same bun test process, so devin-stated-reset-retry and devin-stated-reset-hardening saw a stubbed helper. Drive the real runTurn with a stubbed fetch returning a Connect EOS-trailer refusal instead: the asserted signals are the surfaced error text and the physical GetChatMessage count, which fail fast under the 5s abort signal if the adapter's maxWaitMs: 0 pin is removed or weakened. Register the file in the test layout map and fixture.

(cherry picked from commit 1abc035)
(cherry picked from commit 2c4bf00)

* fix(devin): bind alias tenant host to credential key

(cherry picked from commit d225fc2)
(cherry picked from commit 9b54aeb)

* test(devin): verify sanitized reset refusals across bound tenants

Reconcile #5455 zero-wait coverage with #5143 content-free Connect diagnostics: retain 429 and generated retry timing while proving reflected credentials do not escape and only one inference send occurs. Exercise a matching deprecated alias credential through tenant dispatch and the same refusal path. Preserve the zero wait pin, host allowlist, credential binding, and typed reset field. Document the safe typed retry delay and opt-in helper replay contract.

(cherry picked from commit 6f2901b)

* fix(devin): select tenant host from the account that owns the transmitted key

The consolidated fix bound alias-slot tenant hosts to the transmitted key but
still returned the active literal slot's host for any key. Devin keeps several
accounts per provider id and the request path injects the admitted account's
token, which need not be the active one, while a configured key, a forwarded
bearer, or a test token is not stored at all. Each of those could inherit
another account's EU or FedStart tenant.

resolveDevinApiServer now looks up the stored credential whose access token is
exactly the transmitted key, in the configured provider id first and then its
deprecated alias, active account first. Only that owner's validated host is
used; an owner with an unusable host, an unmatched key, or no key falls back to
the validated configured base URL and then the US default. The lookup uses
getCredential and listAccounts, which store mocks elsewhere in the suite leave
real.

Tests pass the owning key where a stored tenant is expected, so the invalid
alias-host case now reaches the host validator. New cases cover a mismatched
literal slot, an alias owner beside an occupied literal slot, a key neither
slot owns, a missing key, a non-active owning account, and a configured key at
the adapter boundary.

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>

---------

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>
Co-authored-by: Epinephrine <luvs01@hanmail.net>
…#5509)

* chore(dev): retire automatic pre-push validation (#5500)

Carry #5500 and align both draft enforcement prompts with scoped validation. Clarify that inherited Git override isolation belongs to the fixture harness.

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

* ci: root macOS discovery and diagnose owned process waits (#5483)

Carry the rooted sharded suite and read-only stall observer without changing control-lane batching, suite budgets, or failure propagation.

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>

* test: isolate Windows runtime discovery and reservation fixtures (#5484)

Carry #5484 while avoiding the unnecessary parent LOCALAPPDATA mutation. Preserve real SQLite contention, atomic publication, reservation assertions, and existing deadlines.

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>

* fix(ci): bound translation email scanning (#5454)

Carry the at-sign-anchored sanitizer scan, explanatory rationale, and long-token regression without changing mention-defusing semantics.

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>

* fix(ci): redact diagnostic paths and align localized command lists

Capture and redact sample output before bounded emission, retain diagnostic child ownership and regression fixtures, and add the missing test:changed command to six locale inventories. Local runtime validation remains NOT RUN by owner instruction.

* fix(ci): preserve legacy checklist bodies with durable re-attestation

Require author clear-and-retick saves bound to real head/base and persisted server-time checkpoints. Preserve pending state across events, invalidate stale evidence, and refresh live PR and saved proof before readiness. Keep body writes out of migration handling and cover mutation failures and sequential races.

Local runtime validation: NOT RUN by owner instruction. Independent static review passed; hosted verification and explicit maintainer security review remain pending.

* fix(ci): require saved attestation evidence before readiness promotion

The pre-ready readback compared the saved gate comment with the run's
expected state, but the gate mutated the listed comment object in place,
so a readback that shared it observed this run's own write. Replace the
object instead and require the saved state to be a finalized attestation
of the live head, base and body before any ready side effect.

A wording-only save that keeps its ticks now gets a specific action, so
the rejected shortcut is acknowledged in the gate comment instead of
being skipped as a byte-identical update.

Record the readback as a reviewed read, and move the self-contained
exhaustive-deps suppression block byte for byte into a sibling file to
keep ci-workflows.test.ts under its size cap.

Local runtime validation: NOT RUN by owner instruction; hosted CI verifies.

---------

Co-authored-by: JUN <243035832+lidge-jun@users.noreply.github.com>
Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>
…wers, and sidecar sends (#5575)

* fix(web-search): combine replay-cache isolation with deadline-safe quota evidence

Combines two fork PRs on the web-search path: isolate the replay cache by request context (#563) and preserve quota evidence when Retry-After would outlive the sidecar deadline (#568), rebased onto current dev. The #568 test's unrecorded-destination case is adapted to the current foldDeveloperRoleToSystem fixture semantics.

bun test: web-search-bridge-replay + web-search-sidecar-429 + server-key-failover-e2e + chat-inline-document-bytes: 65 pass

* fix(web-search): scope replay cells to key-resolved loopback principals

* fix(retries): refuse transient 5xx after an operator-authorized reset replacement

* fix(retries): word the replay refusal for the post-response path too

* test(responses): keep the inline-document role fixture on its dev contract

The carried replay-isolation commit also rewrote this fixture. It is unrelated to replay or retry behavior and the dev version already covers the current role contract, so it stays as dev has it.

* fix(web-search): fail closed when a replay caller has no principal

A loopback caller that presents no opencodex API key has no caller identity, but the replay
scope gave every such caller the shared principal "loopback". Two local processes with the
same conversation id and serving route then shared bridged-search replay cells, and a
client-visible cell id was enough to recover another caller's retained search result.

The scope now carries a principal only when resolveContextPrincipal finds one. Without it
bridgeSearchReplayScope yields no scope, so nothing is recorded or restored for that caller.
The key-switch regression now seeds under a real key-derived principal, with a positive
control that the same seed restores and a keyless case that must leave the cell untouched.

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>

* fix(retries): keep every resend-inducing answer under replay suppression

After an ambiguous reset spends the operator-authorized replacement, the first send may already
have run the turn. The fence only covered the gateway statuses in isTransientUpstreamStatus, so a
replacement that answered 429 or 529 reached the client and the proxy's quota rotation unmarked,
and either could send the turn a third time.

The fence now covers what actually resends: the client retry table (408, 409, 429, every 5xx)
and proxy credential and quota recovery (401, 402). Those settle as the refusal with the
replacement body released. Any other error keeps its real status for the caller but is marked
non-replayable, so recovery loops such as the opaque-blob rebuild of a 400 cannot resend it.
Successful answers are returned unchanged.

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>

* fix(web-search): clear a stale replay principal and document its absence

Rewrite the principal field on every request so an absent principal also clears one a reused
holder carried, and describe the field as absent for keyless callers instead of naming a
shared loopback lane.

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>

* fix(retries): refuse a redirect that would resend a spent replacement

A client that follows a 307 or 308 sends the same POST body again, so after a spent replacement
those settle as the refusal as well. The regression tables now cover every 5xx class seen in
the field and assert that a kept status is never mistaken for a proxy-synthesized refusal.

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>

* fix(web-search): share one physical-send budget across sidecar reset and 429 recovery

Every sidecar 429 replay called fetchWithResetRetry with a fresh default allowance of three
sends, so resets in front of each of the three quota legs could reach nine paid upstream
requests. The sidecar now holds one three-send budget for the whole search: each helper call
receives what is left and reports every send it makes, reset retries included.

The budget is checked before the 429 body is released, so an exhausted budget ends with the
observed 429 as the recorded outcome instead of a send-budget error recorded as a connection
failure. The deadline-safe 429 handling from the carried change is unchanged.

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>

* docs(structure): record replay ownership, the sidecar send budget, and the replacement fence

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>

* fix(codex): keep a non-replayable 400 out of the gated-model account retry

The answer to a spent operator replacement is marked non-replayable, and every recovery loop
was meant to stop on that marker. The Codex pool's unsupported-model check did not read it, so a
marked 400 from a gated model could still rebuild the turn and send it from another account.
It now refuses a marked response, like the quota and transient ladders beside it.

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>

* fix(combos): stop on a spent replacement's answer instead of hopping

The answer to a spent ambiguous-reset replacement can keep its real status with only an
in-memory non-replayable marker. A combo rebuilds a failed attempt as a new response, which
dropped that marker, so a context overflow or a 413 read as target-local and the combo sent the
same turn to its next target although the first send may already have run it.

The consumed failure now records that the attempt was non-replayable, carries the marker onto the
rebuilt response, and the combo loop stops on it. A 413 also joins the refusal set, because it is
answered to the client as a context overflow the client compacts and resends. A two-target combo
regression counts physical sends: the second target must receive none.

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>

* fix(errors): match the whole replay refusal sentence

The refusal wording became shorter and more generic, so a provider message containing the phrase
could have been labelled as this proxy's refusal in the request log. Match the full sentence the
proxy writes.

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>

* docs: state that bridged-search replay needs a caller key

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>

* docs(structure): add 413 and the combo stop to the replacement fence

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>

---------

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>
* feat(anthropic): add Claude Opus 5.5 pricing, 1M context and catalog rows

Live Anthropic discovery listed claude-opus-5-5 (released 2026-09-22) before any
static row existed, so the picker showed it with no price, no max output, no
input modalities and no effort ladder, and every logged request was unpriced.

- Anthropic seed: claude-opus-5-5 with a 1M window, which also gives it the
  low..max effort ladder and text+image input.
- Metadata snapshot + regenerated table: anthropic, six Bedrock ids (regional
  1.1x), openrouter/vercel/kilo anthropic/claude-opus-5.5 (+ vercel -fast),
  venice claude-opus-5-5; all 1M context / 128K output.
- Price overlays at 4 / 20 / 0.20 cache read (0.05x) / 5.00 cache write for
  anthropic, anthropic-apikey, cursor (Cursor model page), devin and devin-cli
  (derived: live catalog lists it, Devin's cost table does not yet).
- Opus 5 overlays now cite the published Anthropic price instead of the
  maintainer confirmation; the tuple is unchanged.
- Cursor capability, effort tiers and thinking families for claude-opus-5-5,
  mirroring the measured Opus 5 ladders; Devin seed and context window.

Sources: platform.claude.com pricing, models overview, Opus 5.5 overview,
effort and migration pages; cursor.com/docs/models/claude-opus-5-5;
models.dev, OpenRouter and Vercel model APIs. Plan and audit:
devlog/_plan/260923_opus_5_5_catalog/.

* docs(devlog): record Opus 5.5 catalog unit outcome

* feat(providers): extend Claude Opus 5.5 to Opper and GitHub Copilot

Opper's public catalogue lists a claude-opus-5-5 pool (anthropic, aws eu,
vertex, vertex-eu; all 1M / 128K, vision), so the Opper seed carries it
beside claude-opus-5. GitHub Copilot announced Opus 5.5 GA on 2026-09-22 at
$4 / $20 / $0.20 cached / $5 cache write; the metadata snapshot gains a
claude-opus-5-5 row cloned from its claude-opus-5 row with that price.

Command Code lists claude-opus-5-5 live but has no static seed; its price,
like Opper's and Copilot's, resolves through the Anthropic vendor row, now
pinned by the Opus 5.5 usage test. Kiro, opencode-zen/go and the
OpenRouter/Venice/Kilo fast tiers publish no Opus 5.5 yet and stay unchanged.
Classification: devlog/_plan/260923_opus_5_5_catalog/040_plan_providers.md.

* docs(devlog): record Opus 5.5 provider rollout outcome
…fast tiers (#5581)

These providers had not published Opus 5.5 on 2026-09-23; the rows are added
preemptively, mirroring each provider's Opus 5 entry.

- Kiro: claude-opus-5.5 in the model list at 1M, with the output_config
  native effort field Opus 5 uses. Calls fail upstream until Kiro ships it.
- Snapshot rows: opencode-zen claude-opus-5-5 (list price), OpenRouter and
  Kilo anthropic/claude-opus-5.5-fast (Anthropic fast 8 / 40 / 0.4 / 10),
  Venice claude-opus-5-5-fast (its 1.2x markup, 9.6 / 48 / 0.48 / 12).
- opencode-go carries no Claude model at all and stays unchanged.

Plan: devlog/_plan/260923_opus_5_5_catalog/060_plan_preemptive.md.
The Models tab opened with a three-row card of fixed sentences whose middle row
read "not reported" on every standalone install, because catalogSyncedAt only
exists for ocx connect clients. Replace it with a closed <details> line that names
the real delivery steps for the current mode (standalone: save -> Codex loads it
on restart; client: save on hub -> sync -> Codex loads it on restart) and expands
to a per-step explanation plus a pointer to the Reload Codex models button.

Trim the subtitle sentences the disclosure now covers and make the save toast
mode-neutral. All ten locale catalogs updated.
…984 (#5579)

* fix(codex): re-pin the upstream model snapshot to openai/codex 6cfe29984

The pinned catalog still described GPT-5.6-Sol as the "Latest frontier agentic coding
model" and ranked it first, while upstream now ships GPT-6-Astra as the listed flagship
(priority 1) and describes Sol as the "Reliable agentic workhorse for everyday tasks."
(openai/codex #47085). The re-pin also brings 272k/872k 5.6 windows, 0.144.0 client floors,
the hidden gpt-5.4 row with its Terra upgrade, the Daybreak rows, and drops the retired
gpt-5.4-mini and gpt-5.2 rows (#44250).

Upstream stopped shipping top-level base_instructions (#43604), so the pinned-row
projection now derives it from model_messages.instructions_template for every row, as it
already did for gpt-6-astra. The JSON stays byte-identical to upstream.

* test(codex): expect the re-pinned Sol priority (4) in catalog order oracles
* feat(codex): list GPT-6 Sol and Luna, gate GPT-6 Astra Minor

OpenAI announced GPT-6 Sol and Luna on 2026-09-22, and the authenticated ChatGPT Codex
roster already serves both as full native rows. codex-rs has not bundled them yet, so
opencodex never listed them and users could not pick them.

The two roster rows (captured 2026-09-23 at client_version 0.155.0) are pinned verbatim in
a sibling file, src/codex/data/roster-pinned-models.json, merged after the codex-rs snapshot
so a later snapshot re-pin wins automatically. Sol and Luna are self-described flagship
natives listed unconditionally, like gpt-6-astra; opencodex does not forward the caller's
`version` header, so older Codex clients can use them too. Luna keeps its low..max ladder
instead of inheriting ultra.

gpt-6-astra-minor appeared only in an Azure playground config and is not served by any
roster; it is registered as an account-gated alias of gpt-6-astra, hidden and refused until
an authenticated roster lists it.

* test(codex): raise the sync-hardening spawnSync buffer for GPT-6 roster rows
…ovider except Cursor (#5584)

OpenAI released GPT-6 Sol and Luna on 2026-09-22 (API list price: Sol $2 / $0.20 cached /
$10, Luna $0.10 / $0.01 cached / $0.50). Most providers had not published them on
2026-09-23; the rows are added preemptively, mirroring each provider's GPT-5.6 Sol/Luna
entry, the same way Opus 5.5 was added in #5581. Cursor is deliberately untouched.

- Metadata snapshot + regenerated table: gpt-6-sol / gpt-6-luna for amazon-bedrock,
  cloudflare-ai-gateway, github-copilot, kilo, openai, openai-codex, opencode-zen,
  openrouter, vercel-ai-gateway and zenmux, at list price (fields a provider bills at 0,
  such as Kilo's subscription rows, stay 0). opencode-go has no GPT-5.6 Sol and is skipped.
- Registry: OpenAI API key (1,050,000 / 922,000 / 128K and low..max, mirroring
  gpt-6-astra's API seed), OpenRouter models/windows/service tier, GitHub Copilot models
  and Responses wire, BizRouter, DigitalOcean, Devin/Devin CLI seeds.
- Kiro, CodeBuddy and Devin static rosters, with Kiro's native reasoning field.
- Price overlays: verified OpenAI API rows, derived rows for ChatGPT login and Devin;
  long-context tier rows for both.
…son (#5585)

* fix(release): keep the desktop version sources in step with package.json

package.json on dev moved to 2.62.0 while desktop/src-tauri/tauri.conf.json,
Cargo.toml and the opencodex-desktop Cargo.lock entry stayed at 2.61.0. The
desktop build reads its version from those files and the updater manifest from
the dispatch input, so a release from this line would ship an app reporting
2.61.0 under a 2.62.0 manifest and the updater would re-offer it forever.

Sync the three desktop sources to 2.62.0, and route every version move through
scripts/release-version-sources.ts: bump-dev-version.ts and release.ts rewrite
all four files, dev-version-bump.yml stages exactly those four and rejects a
reused bump branch touching anything else, and release.yml checks all four in
package-desktop before building and again before publishing.

* fix(release): restore the version sources before validating a reused bump branch

The decide step leaves its rewrite in the working tree, so git checkout -B refused to switch to an existing bump branch, and a successful switch would have let the check read this run's edits instead of the branch's commit. Restore the four paths first.

* test(release): anchor the workflow slices on whole lines
@lidge-jun
lidge-jun requested a review from Ingwannu as a code owner September 22, 2026 20:31
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 22, 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-09-22T20:39:28.001237Z 3c663e4 PR opened
ℹ️ 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 Sep 22, 2026

Copy link
Copy Markdown
Contributor

Review in Change Stack →

Navigate logical layers of code changes, visualize relationships, and explore their blast radius.

Note

Currently processing new changes in this PR. This may take a few minutes, please wait...

⚙️ Run configuration

Configuration used: Repository: lidge-jun/opencodex/.coderabbit.yaml

Review profile: ASSERTIVE

Plan: Advanced

Run ID: 2ed0d223-2003-47a0-b916-c27844b6ca13

📥 Commits

Reviewing files that changed from the base of the PR and between 2f82167 and 3c663e4.

⛔ Files ignored due to path filters (4)
  • desktop/src-tauri/Cargo.lock is excluded by !**/*.lock
  • devlog/_plan/260923_models_catalog_delivery_disclosure/evidence/ko-collapsed.png is excluded by !**/*.png
  • devlog/_plan/260923_models_catalog_delivery_disclosure/evidence/ko-expanded.png is excluded by !**/*.png
  • src/generated/model-metadata.ts is excluded by !**/generated/**
📒 Files selected for processing (231)
  • .github/AGENTS.md
  • .github/CODEOWNERS
  • .github/scripts/issue-translation.cjs
  • .github/scripts/issue-translation.test.cjs
  • .github/scripts/pr-quality-messages.test.cjs
  • .github/scripts/pr-quality-state.cjs
  • .github/scripts/pr-quality-state.test.cjs
  • .github/scripts/pr-quality.cjs
  • .github/scripts/pr-quality.test.cjs
  • .github/scripts/pr-readiness-reattest.cjs
  • .github/scripts/pr-sponsored-surface.cjs
  • .github/workflows/ci.yml
  • .github/workflows/dev-version-bump.yml
  • .github/workflows/enforce-pr-target.yml
  • .github/workflows/issue-quality-tests.yml
  • .github/workflows/release.yml
  • .github/workflows/service-lifecycle.yml
  • AGENTS.md
  • CONTRIBUTING.md
  • MAINTAINERS.md
  • desktop/src-tauri/Cargo.toml
  • desktop/src-tauri/tauri.conf.json
  • devlog/_plan/260923_gpt6_catalog_lanes/000_plan.md
  • devlog/_plan/260923_gpt6_catalog_lanes/010_phase1_upstream_repin.md
  • devlog/_plan/260923_gpt6_catalog_lanes/020_phase2_roster_admission.md
  • devlog/_plan/260923_gpt6_catalog_lanes/030_phase3_gpt6_rows.md
  • devlog/_plan/260923_models_catalog_delivery_disclosure/000_plan.md
  • devlog/_plan/260923_models_catalog_delivery_disclosure/010_architect.md
  • devlog/_plan/260923_models_catalog_delivery_disclosure/020_done.md
  • devlog/_plan/260923_opus_5_5_catalog/010_plan.md
  • devlog/_plan/260923_opus_5_5_catalog/020_audit.md
  • devlog/_plan/260923_opus_5_5_catalog/030_done.md
  • devlog/_plan/260923_opus_5_5_catalog/040_plan_providers.md
  • devlog/_plan/260923_opus_5_5_catalog/050_done_providers.md
  • devlog/_plan/260923_opus_5_5_catalog/060_plan_preemptive.md
  • docs-site/src/content/docs/contributing.md
  • docs-site/src/content/docs/contributing/pr-quality.md
  • docs-site/src/content/docs/fr/contributing.md
  • docs-site/src/content/docs/fr/contributing/pr-quality.md
  • docs-site/src/content/docs/guides/codex-integration.md
  • docs-site/src/content/docs/ja/contributing.md
  • docs-site/src/content/docs/ko/contributing.md
  • docs-site/src/content/docs/reference/cli/agents.md
  • docs-site/src/content/docs/reference/configuration/agents.md
  • docs-site/src/content/docs/reference/configuration/providers.md
  • docs-site/src/content/docs/reference/configuration/server.md
  • docs-site/src/content/docs/ru/contributing.md
  • docs-site/src/content/docs/tr/contributing.md
  • docs-site/src/content/docs/tr/contributing/pr-quality.md
  • docs-site/src/content/docs/zh-cn/contributing.md
  • docs-site/src/content/docs/zh-cn/reference/configuration/agents.md
  • docs-site/src/content/docs/zh-tw/contributing.md
  • docs-site/src/content/docs/zh-tw/contributing/pr-quality.md
  • gui/src/App.tsx
  • 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/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/pages/Models.tsx
  • gui/src/pages/models-catalog-state.tsx
  • gui/src/styles-models-workspace.css
  • gui/tests/models-catalog-delivery.test.tsx
  • package.json
  • scripts/AGENTS.md
  • scripts/build-gui-if-changed.ts
  • scripts/bump-dev-version.ts
  • scripts/ci/sample-macos-stall.sh
  • scripts/doctor-gui-if-changed.ts
  • scripts/lint-gui-if-changed.ts
  • scripts/model-metadata.source.json
  • scripts/pre-push.sh
  • scripts/release-version-sources.ts
  • scripts/release.ts
  • scripts/setup-hooks.ts
  • scripts/test-layout/layout.json
  • src/adapters/cursor.ts
  • src/adapters/cursor/catalog.ts
  • src/adapters/cursor/effort-map.ts
  • src/adapters/cursor/envelope-echo.ts
  • src/adapters/cursor/protobuf-request.ts
  • src/adapters/devin.ts
  • src/adapters/devin/cloud-direct/chat.ts
  • src/adapters/devin/cloud-direct/stated-reset-retry.ts
  • src/adapters/devin/live-models.ts
  • src/adapters/kiro/reasoning.ts
  • src/adapters/openai-responses/passthrough.ts
  • src/adapters/openai-responses/tool-output-recovery.ts
  • src/claude/desktop-gateway-state.ts
  • src/claude/desktop-policy.ts
  • src/cli/config-command.ts
  • src/cli/doctor.ts
  • src/codex/catalog-auto-refresh.ts
  • src/codex/catalog/effort.ts
  • src/codex/catalog/metadata.ts
  • src/codex/catalog/native-models.ts
  • src/codex/catalog/pinned-models.ts
  • src/codex/data/roster-pinned-models.json
  • src/codex/data/upstream-models.json
  • src/codex/inject/provider-table.ts
  • src/codex/inject/remove.ts
  • src/codex/model-entitlements.ts
  • src/codex/subagent-defaults.ts
  • src/codex/toml-source-lines.ts
  • src/config.ts
  • src/config/live-reconcile.ts
  • src/config/load-degrade.ts
  • src/lab/artifacts/sanitize.ts
  • src/lib/app-owned-memory-stores.ts
  • src/lib/app-owned-memory.ts
  • src/lib/errors.ts
  • src/lib/upstream-retry.ts
  • src/oauth/devin.ts
  • src/providers/codebuddy-models.ts
  • src/providers/kiro-models.ts
  • src/providers/quota/vendor-probes-oauth.ts
  • src/providers/registry/entries-core.ts
  • src/providers/registry/entries-extended.ts
  • src/providers/registry/model-seeds.ts
  • src/responses/bridge-search-replay-cache.ts
  • src/responses/plaintext-v2-agent-messages.ts
  • src/routing/identity-domains.ts
  • src/server/index/websocket-handler.ts
  • src/server/management/agent-settings-routes.ts
  • src/server/management/context.ts
  • src/server/responses/codex-ws-exchange.ts
  • src/server/responses/core-codex-account.ts
  • src/server/responses/core-combo-failure.ts
  • src/server/responses/core-combo.ts
  • src/server/responses/core-options.ts
  • src/server/responses/native-injection-replay.ts
  • src/server/responses/native-injection.ts
  • src/server/responses/native-response-control.ts
  • src/server/responses/native-steering-replay.ts
  • src/server/responses/native-steering.ts
  • src/server/responses/passthrough-delivery.ts
  • src/server/responses/passthrough-dispatch.ts
  • src/server/responses/request-prepare.ts
  • src/server/responses/request-transport.ts
  • src/server/responses/ws-upstream.ts
  • src/server/ws-bridge.ts
  • src/types/request.ts
  • src/usage/expected-prices.ts
  • src/web-search/executor.ts
  • structure/adapters/compatibility-lab.md
  • structure/adapters/registry.md
  • structure/catalog.md
  • structure/clients/claude-desktop.md
  • structure/codex-home.md
  • structure/config.md
  • structure/desktop-shell.md
  • structure/ops/docs-and-release.md
  • structure/providers-and-adapters.md
  • structure/providers/cursor.md
  • structure/providers/openai-tiers.md
  • structure/runtime.md
  • structure/subagents.md
  • structure/transports/responses.md
  • structure/transports/streaming-health.md
  • tests/ci-workflows/bump-dev-version.test.ts
  • tests/ci-workflows/ci-scope-reduction.test.ts
  • tests/ci-workflows/ci-structure-gate.test.ts
  • tests/ci-workflows/ci-workflows.test.ts
  • tests/ci-workflows/exhaustive-deps-suppression.test.ts
  • tests/ci-workflows/macos-serial-lanes.test.ts
  • tests/ci-workflows/pr-readiness-reattest.test.ts
  • tests/ci-workflows/release-version-sources.test.ts
  • tests/ci-workflows/setup-hooks.test.ts
  • tests/ci-workflows/zz-pr-coderabbit-readiness-revalidation.test.ts
  • tests/claude-integration/claude-desktop-first-party.test.ts
  • tests/claude-integration/claude-desktop-policy.test.ts
  • tests/cli/cli-config-command.test.ts
  • tests/cli/cli-connect-readiness.test.ts
  • tests/codex-integration/app-owned-memory.test.ts
  • tests/codex-integration/catalog-auto-refresh-scheduler.test.ts
  • tests/codex-integration/catalog-full-picker-order.test.ts
  • tests/codex-integration/codex-catalog-golden.test.ts
  • tests/codex-integration/codex-catalog-model-picker-order.test.ts
  • tests/codex-integration/codex-catalog-sync-hardening.test.ts
  • tests/codex-integration/codex-catalog.test.ts
  • tests/codex-integration/codex-inject-retained-table.test.ts
  • tests/codex-integration/codex-inject.test.ts
  • tests/codex-integration/codex-model-denial-evidence.test.ts
  • tests/codex-integration/codex-model-entitlements.test.ts
  • tests/codex-integration/codex-provider-table-retention.test.ts
  • tests/codex-integration/codex-reset-credit-auto-redeem.test.ts
  • tests/codex-integration/doctor.test.ts
  • tests/codex-integration/gpt6-native-rows.test.ts
  • tests/codex-integration/native-claude-desktop-toggle.test.ts
  • tests/codex-integration/native-model-toggle.test.ts
  • tests/codex-integration/reserve-catalog-lifecycle.test.ts
  • tests/config/config-load-degrade.test.ts
  • tests/config/config-user-edits.test.ts
  • tests/fixtures/macos-stall-observer.sh
  • tests/fixtures/test-layout-expected.json
  • tests/helpers/enforce-pr-target-harness.ts
  • tests/lab/lab-evidence-sanitization.test.ts
  • tests/lib/upstream-retry.test.ts
  • tests/providers/cursor/cursor-envelope-echo-retry.test.ts
  • tests/providers/cursor/cursor-repetition-breaker.test.ts
  • tests/providers/cursor/cursor-tool-result-invocation.test.ts
  • tests/providers/devin-adapter-reset-wait.test.ts
  • tests/providers/devin-adapter.test.ts
  • tests/providers/devin-hardening.test.ts
  • tests/providers/devin-login.test.ts
  • tests/providers/devin-stated-reset-retry.test.ts
  • tests/providers/digitalocean-scaleway-provider.test.ts
  • tests/providers/github-copilot/github-copilot-wire-defaults.test.ts
  • tests/providers/kiro/kiro-adapter.test.ts
  • tests/providers/provider-quota-label-sanitize.test.ts
  • tests/providers/provider-registry-parity.test.ts
  • tests/responses/plaintext-v2-agent-messages.test.ts
  • tests/responses/ws-native-injection.test.ts
  • tests/responses/ws-native-result-continuations.test.ts
  • tests/responses/ws-native-steering.test.ts
  • tests/responses/ws-steering-completion.test.ts
  • tests/routing/subagent-model-fallback.test.ts
  • tests/server/memory-watchdog.test.ts
  • tests/server/plaintext-v2-agent-messages-server.test.ts
  • tests/server/replay-refusal-parity.test.ts
  • tests/server/server-key-failover-e2e.test.ts
  • tests/service/service-tier-capability.test.ts
  • tests/usage/request-log.test.ts
  • tests/usage/usage-cost.test.ts
  • tests/web-search/web-search-bridge-replay.test.ts
  • tests/web-search/web-search-sidecar-429.test.ts
 __________________________________________________________________
< Ah yes, the classic pattern: 'parse first, ask questions never'. >
 ------------------------------------------------------------------
  \
   \   \
        \ /\
        ( )
      .( o ).
✨ Finishing Touches
📝 Generate docstrings
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR

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.

@lidge-jun
lidge-jun merged commit fca5134 into main Sep 22, 2026
11 of 18 checks passed
@lidge-jun
lidge-jun deleted the codex/260923-release-main-2.62.0 branch September 22, 2026 20:32

@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: 3c663e427c

ℹ️ 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 thread .github/workflows/ci.yml
Comment on lines 32 to +33
push:
branches: [main, preview, dev]
branches: [main, preview]

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 Restore exact-head CI for dev pushes

Keep dev in the push.branches list, or add an equivalent post-merge exact-SHA gate. When two PRs pass against different base states and are then merged, their combined dev tree can violate the file-size ratchet, an exhaustive union, or another integration invariant even though both PR runs were green; with only main and preview here, that merged SHA receives no automatic Cross-platform CI run, while workflow_dispatch is merely manual. The repository explicitly documents this union-failure mode and prior incidents, so PR evidence is not a substitute for validating the resulting integration head.

AGENTS.md reference: AGENTS.md:L248-L251

Useful? React with 👍 / 👎.

Comment thread .github/workflows/ci.yml
Comment on lines +250 to +255
native:
- 'app/**'
- 'desktop/**'
- 'src/service/**'
- 'src/cli/index.ts'
- 'src/lib/bun-runtime.ts'

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 Run macOS shards for platform-sensitive source and test changes

Do not gate the full platform-macos suite on this narrow native filter. For example, a PR changing src/routing/** or the Darwin-only cases in tests/routing/subagent-fallback-handle-responses.test.ts sets ci=true but native=false, so the macOS job is skipped and those cases are skipped on Linux as well; the same applies to other platform-dependent runtime areas and tests outside the listed paths. Gate only the widget/desktop packaging jobs this way, or broaden the macOS test input filter to the complete runtime and test surface.

AGENTS.md reference: .github/AGENTS.md:L18-L18

Useful? React with 👍 / 👎.

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