Skip to content

fix(combo): exclude Meta for direct hosted tool choices - #806

Open
luvs01 wants to merge 42 commits into
devfrom
codex/fix-forced-hosted-tool-choice-20261030
Open

luvs01 wants to merge 42 commits into
devfrom
codex/fix-forced-hosted-tool-choice-20261030

Conversation

@luvs01

@luvs01 luvs01 commented Oct 30, 2026 •

Copy link
Copy Markdown
Owner

Summary

Skip Meta Responses destinations before sending when a combo request directly selects a known hosted tool, including web_search or an MCP selector with a nonempty server_label. Previously these selectors bypassed the mandatory-choice eligibility check and failed with a local Meta 400 even when a compatible backup was available.

Direct choices and required allowed-tools entries now share the same selector validation. Malformed and unknown selectors retain their ordinary provider-error path. The original selector is preserved for the eligible destination. Direct hosted choices retain their existing terminal owner; this does not add a new completion guard that would reject valid hosted terminal forms.

This separately addresses the inherited-baseline finding on #803. The base is upstream dev 8e58c9683d7d1e0fd2dbb3604cf05dca62b02b99; the fork's older dev comparison includes already-landed upstream changes. The unique delta is five files: one classifier, its existing regression file, two owning documents and the combo guide.

Verification

  • Seven new regression cases fail on the old code and pass on the fix: buffered/streaming web-search and MCP routing, all-Meta exhaustion, malformed selectors and terminal-owner preservation. Final focused run: 7 pass / 49 assertions.
  • Full buffered and hosted-stream contract files: 80 pass / 372 assertions. The initial command named a nonexistent third file and Bun ran only these two; the actual stream-required file was then executed separately: 30 pass / 123 assertions. No missing-file execution is counted as a pass.
  • Bun 1.4.4 typecheck: 2,252 files, no errors. Structure, privacy, file-size and diff checks passed.
  • Docs build: 633 pages / 91,435 internal links using a verified matching dependency lock and existing installation.
  • Tests use isolated homes, loopback upstream fixtures and an injected Meta transport. They prove selection and preserved wire behavior, not a live Meta/provider request. Native Job exit, output EOF and supervisor reap were verified.
  • Independent read-only review found no semantic regression or terminal-owner change. The repository-supported owner waiver records that the authored upstream-relative delta has no GUI change; inherited GUI paths in the older fork-base comparison do not need a new screenshot.

Exact-head Cross-platform CI 41074030463, Catalog 41074029966, Service lifecycle 41074030053, and React Doctor 41074030215 passed at ed1cf0871099245d2f49f8d8357c8bac2927e501. The broader suite ran in hosted CI under the documented local-resource exception; policy-skipped platform lanes are not native-platform evidence. The scope-specific screenshot waiver was evaluated successfully by Enforce 41074954248. No live model settings, accounts, or service were changed.

dependabot Bot and others added 30 commits October 30, 2026 20:10
lidge-jun#7942)

* release: v2.33.0-preview.20260825

* release: v2.34.0-preview.20260827

* release: v2.36.0-preview.20260829

* fix(release): pass the bump job's permissions through the reusable-workflow call (lidge-jun#3262)

Both v2.40.0 release dispatches (33615174183 preview, 33615177849 main) died
at startup_failure: a workflow_call cannot grant its callee more than the
calling job holds, and dev-version-bump.yml's job declares contents+pull-
requests write. lidge-jun#3129 wired the call but never dispatched a release, so this
is its first live run. The caller job now declares exactly the callee's two
permissions; no other job in release.yml gains anything.

Co-authored-by: jun <jun@lidge.dev>
(cherry picked from commit 7ce0ba5)

* release: set preview channel version 2.48.0-preview.20260908

* release: set main channel version 2.48.0

* chore(release): promote 2.55.0-preview.20260914 to preview

Promotes the dev product snapshot 62f0222 to the preview train.

The 2.55.0 line carries the lidge-jun#4546 cost-guard work: one send budget per logical request with a
shared final-recovery reserve, zero-is-zero refusals with a typed error rather than a synthetic
502, compact and the Kiro inner retries admitted against that budget, a finite send ceiling per
root workflow with an interactive reserve a fan-out cannot take, and a healthy detour promoted on
transient-hold expiry instead of released cold.

The previous preview tip 2.54.0-preview.20260914 is already tagged and published and is outranked
by v2.54.0, so it could not be re-released; this is a new candidate rather than a re-cut.

* chore(release): promote the verified 2.55.0 product tree to main

Same product tree as preview 7bdd1b2 / 2.55.0-preview.20260914, which published successfully with its registry smoke green. Only package.json version differs.

* ci(release): expose Linux bundler diagnostics for stable artifacts

* fix(release): prepare stable platform bundles

* fix(desktop): carry native sidecar packaging repair to main (lidge-jun#5532)

* chore(ci): refresh main release verification (lidge-jun#5534)

* fix(release): carry lipo argument fix to main (lidge-jun#5537)

* fix(release): carry checksum and signature repair to main (lidge-jun#5546)

* fix(release): carry Windows checksum record support to main (lidge-jun#5552)

* fix(release): publish the GitHub release only after its verified assets attach (lidge-jun#5555) (lidge-jun#5558)

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.

* release: prepare 2.63.0 version metadata (lidge-jun#5612)

* release: prepare 2.69.0 version metadata

* fix(release): sign the packaged macOS keyring addons before notarization (lidge-jun#6271)

* fix(release): sign the packaged macOS keyring addons before notarization

Notarization rejected the 2.73.0 preview app: Resources/keyring/*.node, bundled
since lidge-jun#6161, were unsigned or ad-hoc and had no secure timestamp, and Tauri does
not sign files under Resources. Sign each darwin addon in place with the
Developer ID identity, hardened runtime and timestamp after the certificate
import and before tauri build, verify the result, and fail a real release that
lacks signing material.

* fix(release): match keyring signature fields without a pipe

(cherry picked from commit 11782ee)

* chore(release): 2.74.0

* fix(deps): bump proxy-addr, fast-uri, ip-address and source-map-js for new advisories

release.yml's dependency audit refused 2.79.0 on a critical advisory
published after the candidate was cut: proxy-addr <2.0.8 is vulnerable to
IP spoofing via IPv4-mapped IPv6 trust subnets (GHSA-jqcg-44mw-7w3h),
reached through @modelcontextprotocol/sdk > express. gui/ reports
source-map-js <1.2.2 (GHSA-68fv-2mgg-jv7q, vite > postcss).

bun audit fix, lockfiles only, every bump inside its declared range:
proxy-addr 2.0.7 -> 2.0.8, fast-uri 3.1.7 -> 3.1.8, ip-address 10.4.0 ->
10.7.1, and in gui/ source-map-js 1.2.1 -> 1.2.2. Both audits now report
no vulnerabilities at --audit-level=high.

* fix(deps): bump @modelcontextprotocol/sdk to 1.31.0 for GHSA-6qxp-vccf-f47h

* fix(deps): clear high-severity audit findings blocking the 2.90.0 release (lidge-jun#7481)

Raise @modelcontextprotocol/sdk to ^1.32.1 (GHSA-22jm-h49p-29qw, GHSA-46jr-4wx8-v453)
and lock gui vite at 8.2.4 (GHSA-587h-7wmj-h5pm). release.yml runs bun run audit:high
before publishing, and both advisories made it fail.

* fix(deps): pin zod 4.6.6 and body-parser 2.4.0 for 2.92.0 (lidge-jun#7643)

GHSA-mrhx-c7xc-m3w5 and GHSA-27r3-jxmh-p828 blocked the 2.92.0 publish.
Leave the package version at 2.92.0 so Release can republish that version.

Co-authored-by: Cursor Agent <cursoragent@cursor.com>

* fix(deps): bump gui happy-dom to 21.0.4 for GHSA-834v-8h66-3h79 (2.92.0) (lidge-jun#7645)

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

* build(deps): bump rustls from 0.23.45 to 0.23.46 in /desktop/src-tauri

Bumps [rustls](https://github.com/rustls/rustls) from 0.23.45 to 0.23.46.
- [Release notes](https://github.com/rustls/rustls/releases)
- [Changelog](https://github.com/rustls/rustls/blob/main/CHANGELOG.md)
- [Commits](rustls/rustls@v/0.23.45...v/0.23.46)

---
updated-dependencies:
- dependency-name: rustls
  dependency-version: 0.23.46
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: JUN <bitkyc08@gmail.com>
Co-authored-by: jun <jun@junui-MacBookPro.local>
Co-authored-by: jun <jun@lidge.dev>
Co-authored-by: lidge-jun <243035832+lidge-jun@users.noreply.github.com>
Co-authored-by: t <a@b.com>
Co-authored-by: JUN <jun@lidgeai.com>
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: lidge-jun <lidge-jun@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Epinephrine <luvs01@hanmail.net>
…#7977)

* fix(ci): distinguish install failures from owned deadlines

* fix(ci): probe required timeout foreground support
* test(xai): cover encrypted Responses tool continuation

* test(xai): assert immutability of the adapter request body
…un#7944)

* fix(volcengine): preserve empty Kimi K3.1 Pro tool continuations

* fix(volcengine): cover Kimi continuation contracts

---------

Co-authored-by: zhangyu.34 <zhangyu.34@bytedance.com>
…#7972)

Validate persisted indexes once per handle and every five minutes in a
read-only worker while preserving automatic corruption repair. Bound read
retries, keep operational failures nondestructive, and drain old scanners
before replacing files. Cover warm reads, real B-tree corruption, analytics,
routing evidence, ingestion and worker lifetime races with native Bun tests.

Refs lidge-jun#7966
… and dashboard (lidge-jun#7960)

* fix(workflow-budget): make per-task ceilings configurable from config and dashboard

The root-workflow count ceilings (8 concurrent turns, 256 sends and 64
distinct children per 10-minute window) were module constants. An install
that legitimately runs more parallel subagents had no way to raise them
short of patching the package, and every hit surfaced as a local 429.

Add an optional workflowBudget config block for the three count ceilings,
bound to the live config and read per decision by HTTP admission and the
pre-dispatch send ceiling. Absent block keeps today's policy object
unchanged. Window, interactive reserve and tracked-root bound stay fixed.

GET/PUT /api/workflow-budget/settings expose effective values, defaults
and bounds; the Subagents page gets a panel to edit them.

* docs(workflow-budget): record deferred live settings CLI

---------

Co-authored-by: Robin Bially <robin.bially@iits-consulting.de>
…n#7987)

maxPhysicalSends is compared when a request is admitted (workflowSendCeilingReached); sends are charged afterwards without a further check, so retries inside an admitted request and concurrent admissions can exceed it. The row added in lidge-jun#7960 read as a strict cap.
* fix(windows): snapshot ACL failure diagnostics

* docs(structure): record the single-read ACL diagnostic snapshot

---------

Co-authored-by: JUN <243035832+lidge-jun@users.noreply.github.com>
* fix(cli): explain tracked runtime stop refusals

* fix(cli): state only what the identity probe proves

A cached identity mismatch shows only that the recorded process does not match the expected start command, not that the PID was reused by another process.

---------

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

* fix(router): decode routed slugs via modelDisplayNames ids

* fix(router): use display names only as a last-resort slug decode

* fix(router): keep concrete policy and combo targets exact

* fix(router): keep retained ids ahead of display-name decode

* docs(structure): record the modelDisplayNames slug-decode fallback

* fix(router): try retained ids before display-name keys in the slug fallback

An encoded slash-valued retainModels id now decodes ahead of a stale
modelDisplayNames key, and the structure contract states the narrower
guarantee that concrete policy, combo and redirect targets skip the
display-name fallback.

Co-authored-by: NoRain211 <170875756+NoRain211@users.noreply.github.com>

* fix(router): let an ambiguous retained claim end the display-name fallback

Co-authored-by: NoRain211 <170875756+NoRain211@users.noreply.github.com>

* docs(providers): note the modelDisplayNames slug-decode fallback

Co-authored-by: NoRain211 <170875756+NoRain211@users.noreply.github.com>

---------

Co-authored-by: NoRain211 <170875756+NoRain211@users.noreply.github.com>
…se (lidge-jun#7985)

* fix(responses): normalize Codex tool catalogs and include for Meta Muse

* test(muse): assert web search after public catalog projection

* fix(meta): preserve catalog precedence and validate all input forms

* fix(responses): skip validation of historical Muse catalogs

Co-authored-by: nobrainer-tech <445466+nobrainer-tech@users.noreply.github.com>

---------

Co-authored-by: nobrainer-tech <arkadiusz@nobrainer.tech>
Co-authored-by: nobrainer-tech <445466+nobrainer-tech@users.noreply.github.com>
…Switch F3 WAL handles (lidge-jun#7986)

* fix(windows): compare runtime preflight directory identity as bigint

NTFS file IDs exceed 2^53, where adjacent IDs are equal as JS numbers. The owned-probe check could then mistake a replacement directory for its own probe and remove it, and the replacement-root test failed on windows 2/11 of run 41021347487 with ino 10696049116378316.

* test(cc-switch): finalize the F3 WAL writer statements before cleanup

Unfinalized prepare().run() statements keep the SQLite db, -wal and -shm open past close(), so Windows refused to remove the temp tree (EBUSY on windows 10/11 of run 41021347487).

---------

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

* fix(combo): skip Meta for mandatory tool choices

* fix(combo): resolve effective wire before Meta eligibility
Carries lidge-jun#7962.

Co-authored-by: oocheol <86232509+oocheol@users.noreply.github.com>
…e-jun#7988)

Carries lidge-jun#7953. Closes lidge-jun#7952.

Co-authored-by: x3M3x <98298256+x3M3x@users.noreply.github.com>
…idge-jun#7876)

* fix(codex): validate CLI and desktop launcher execution boundaries

* docs(cli): describe internal command validation contract

* fix(chatgpt): retain discovered bundle root at every launch

* fix(cli): validate renamed app bundles before Codex launch

Check the canonical enclosing app bundle for every ocx codex handoff,
including PATH aliases and recorded shim backings. Verify nested layouts
against their outer root while preserving ordinary non-bundle launches
and the Desktop launcher's strict recorded-root path.

Add portable CLI revocation, renamed-bundle and alias regressions and
document the launch policy in the shared contract and CLI references.

Co-authored-by: Epinephrine <luvs01@hanmail.net>

* fix(codex): retain lexical app bundle containment

* test(codex): cover nested bundle aliases and canonical handoff

* docs(cli): clarify internal helper argument checks

* fix(codex): keep the install hint when the selected CLI disappears

Pre-spawn verification now resolves the executable, so a target that vanished after selection surfaced as a raw ENOENT instead of the install hint the spawn path prints.

---------

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

* fix(credentials): stop Windows ancestor-watch feedback loops

* test(credentials): settle writes before hardlink replacement

* fix(credentials): fold watcher names the way the volume resolves them

A case-insensitive volume reports a notification under the writer's
spelling. With same-identity ancestor ticks now ignored, an event for
AUTH.JSON no longer had an incidental reconcile path. Compare target,
ancestor and residue names case-insensitively with trailing dots and
spaces removed, and always reconcile an 8.3 short name.

* fix(credentials): identity-check ancestors whose names look like short names

An ancestor such as OPENCODEX_HOME=C:\ocx~1 took the unconditional short-name reconcile, so the observer's own save could re-arm the loop. Only an unmatched alias is ambiguous.

* fix(credentials): identity-check ancestors whose names look like write residue

OPENCODEX_HOME=C:\config.json.ocx.home matched the residue pattern before the ancestor lookup, so the observer's own save re-armed the reconcile. Residue and short-name shapes now only decide names that match no target or ancestor.

* fix(credentials): resolve unmatched short names to tracked ancestors by identity

A Windows 8.3 alias such as OPENC~1 for a tracked ancestor took the unconditional short-name reconcile, so the observer's own save could re-arm the loop. A change that resolves to a tracked ancestor's recorded directory is that ancestor's tick; any other short name still reconciles.

* fix(credentials): resolve unmatched short names against the install snapshot

Windows may report either name of an entry, and a removed entry's short name cannot be looked up. An unmatched 8.3-shaped name now reconciles only when it aliases a target, when a target or ancestor of that parent lost its install identity, or when it renames a tracked ancestor; the observer's own metadata save under a short spelling is ignored.

* docs(structure): state the transient short-name residual of the credential observer

---------

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

* fix(discovery): name the invalid model row and the static-list workaround

Invalid upstream model rows still reject the whole discovery response, but the
diagnostic now names the failing row index and reason without its contents.
The catalog warning and the connection-test error explain that a new
provider's selection stays pending and point at a static models list with
liveModels: false.

* fix(discovery): qualify the pending-selection hint for login connections

* docs(structure): scope the invalid-row diagnostic to generic discovery
…unt (lidge-jun#7994)

A known weekly or monthly score no longer counts a 5-hour reading whose valid reset has elapsed, so a higher-priority pool account is selected again without waiting for a WHAM re-probe. Missing or invalid resets keep the reading. Routing and the dashboard warning share hasElapsedShortWindow. Refs lidge-jun#7896.
…lidge-jun#7995)

The routing-health integrity case corrupted idx_requests_model and expected the health query to hit it. The query can be served by the provider, model or timestamp index, and macOS's system SQLite picks a different one than Bun's bundled SQLite, so macOS 1/4 of lane=all run 41050393474 read healthy rows. Ask EXPLAIN QUERY PLAN which index this build uses and corrupt that one.

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

A complete, valid WHAM probe without a burst window now retires a pool account's carried 5-hour tuple, so a Plus to Pro upgrade no longer keeps the account at a stale limit. Retirement requires a live captured pool writer for the account, credential generation and history identity; partial or header observations, invalid or unparseable readings and an explicit allowed:false keep the tuple. Main behaviour is unchanged. Closes lidge-jun#7961.

Co-authored-by: SupernovaTitanium <12254451+SupernovaTitanium@users.noreply.github.com>
…idge-jun#7991)

* fix(claude): preserve native search without sidecar

* fix(claude): preserve search probe affinity and cancellation

* fix(claude): stop the search probe when refresh wraps a cancellation
…ly restamped (lidge-jun#7992)

The Pool aggregation part of the provider quota report cache key hashed each account's quota updatedAt, which every proxied Codex response restamps, so the cache never committed and a transient probe failure dropped the last-good row. The key now carries the fresh/stale verdict instead, plus shortObservedAt only for an exhausted reset-less short window whose blocking verdict depends on it. Closes lidge-jun#7956.
…nd strict gateways (lidge-jun#7983)

Carries lidge-jun#7637.

Co-authored-by: Omar <13569609+omar391@users.noreply.github.com>
…rned off (lidge-jun#7993)

* fix(claude): prune generated agents when the Claude integration is turned off

The integrations toggle persisted claudeCode.enabled=false but left ~/.claude/agents/ocx-*.md in place, so a native Claude Code session kept loading proxy-only agents whose placeholder model resolves to Haiku. Reconcile the definitions after the toggle persists, and again on a repeated Off. Closes lidge-jun#7968

* fix(claude): restore the in-memory block when the toggle save fails

Otherwise a retry on the same config read the unsaved Off, took the repeated-Off branch and pruned agents while the saved integration was still on. Docs now describe the prune as best effort.

* fix(claude): keep a published toggle value when post-publication bookkeeping fails

ConfigWritePublishedError means the new value is on disk; restoring the old block in memory would make a later toggle report the wrong state.

* fix(claude): reconcile agents only when the toggle turns Claude off

Turning it on ran a model discovery request against the upstream from a settings toggle; On keeps its launch and startup sync, and only the Off prune is needed for lidge-jun#7968.

---------

Co-authored-by: JUN <243035832+lidge-jun@users.noreply.github.com>
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 lidge-jun#7984
…dge-jun#8000)

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 lidge-jun#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>
…e-jun#7931)

* 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 lidge-jun#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>
LilMGenius and others added 7 commits October 30, 2026 22:11
…idge-jun#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>
lidge-jun#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>
…lidge-jun#8002)

Like F3 (lidge-jun#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 (lidge-jun#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 lidge-jun#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 (lidge-jun#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 lidge-jun#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 (lidge-jun#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>
@coderabbitai

coderabbitai Bot commented Oct 30, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 260 files, which is 160 over the limit of 100.

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

Upgrade to a paid plan to raise the limit.

This review couldn't start because sufficient usage credits or metered capacity aren't available. Add credits or update usage-based reviews in the billing tab, then retry.

Run configuration
Commits

Reviewing files that changed from the base of the PR and between 3ea8965 and c486a73.

Files ignored due to path filters: 1
  • desktop/src-tauri/Cargo.lock is excluded by !**/*.lock
Files selected for processing: 260
  • devlog/_fin/260915_workflow_budget_window/030_wfc_diff_plan.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/combos.md
  • docs-site/src/content/docs/guides/integrations.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/combos.md
  • docs-site/src/content/docs/ja/reference/configuration/providers.md
  • docs-site/src/content/docs/ko/guides/combos.md
  • docs-site/src/content/docs/ko/guides/sidecars.md
  • docs-site/src/content/docs/ko/reference/cli/agents.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/configuration/agents.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/combos.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/reference/configuration/providers.md
  • docs-site/src/content/docs/zh-cn/guides/combos.md
  • docs-site/src/content/docs/zh-cn/reference/configuration/providers.md
  • docs-site/src/content/docs/zh-tw/reference/configuration/providers.md
  • gui/src/codex-quota-utils.ts
  • gui/src/components/WorkflowBudgetPanel.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/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/pages/Subagents.tsx
  • gui/tests/workflow-budget-panel.test.tsx
  • scripts/ci/bun-install-frozen.sh
  • scripts/test-layout/layout-clients.json
  • scripts/test-layout/layout-codex-collision.json
  • scripts/test-layout/layout-exec-boundary.json
  • scripts/test-layout/layout-providers.json
  • scripts/test-layout/layout.json
  • src/adapters/kiro/adapter.ts
  • src/adapters/openai-chat/messages.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/chatgpt/app-server-shim/bundle-trust-policy.ts
  • src/chatgpt/app-server-shim/launcher.ts
  • src/cli/account-main.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/restart-scope.ts
  • src/cli/root.ts
  • src/cli/stop-approval.ts
  • src/cli/v2.ts
  • src/client/machine-api.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/catalog/provider-models.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/desktop-app-restart.ts
  • src/codex/desktop-app/handoff.ts
  • src/codex/exec-boundary.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.ts
  • src/config/diagnostics.ts
  • src/config/load-degrade.ts
  • src/config/process-state.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/lib/bun-runtime-preflight.ts
  • src/lib/state-store-registrations.ts
  • src/lib/windows-secret-acl.ts
  • src/lib/workflow-budget-config.ts
  • src/local-credentials/generation.ts
  • src/local-credentials/inventory.ts
  • src/providers/account-quota-disk.ts
  • src/providers/model-discovery-diagnostic.ts
  • src/providers/model-discovery.ts
  • src/providers/model-rename-fields.ts
  • src/providers/quota.ts
  • src/providers/quota/report-cache.ts
  • src/providers/reasoning-metadata.ts
  • src/remote-control/workspace-codex-runtime.ts
  • src/responses/custom-tool-compat.ts
  • src/responses/item-provenance.ts
  • src/responses/namespace-tool-compat.ts
  • src/responses/parser-tools.ts
  • src/responses/schema.ts
  • src/router.ts
  • src/routing/analytics.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/auth-cors.ts
  • src/server/claude-messages.ts
  • src/server/configured-credentials.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/provider-overwrite-carry.ts
  • src/server/management/provider-routes.ts
  • src/server/management/route-registry.ts
  • src/server/management/workflow-budget-routes.ts
  • src/server/messages-native-eligibility.ts
  • src/server/responses-snapshot-repair.ts
  • src/server/responses-undeclared-tool-guard.ts
  • src/server/responses/combo-required-tool-contract.ts
  • src/server/responses/core-combo.ts
  • src/server/responses/passthrough-dispatch.ts
  • src/server/responses/request-send-budget.ts
  • src/server/workflow-refusal.ts
  • src/types/config.ts
  • src/types/provider.ts
  • src/update/job.ts
  • src/update/worker-launch.ts
  • src/web-search/parse.ts
  • structure/cli-management.md
  • structure/clients/chatgpt-desktop.md
  • structure/codex-cli-update.md
  • structure/config.md
  • structure/dashboard-and-usage.md
  • structure/data-planes/protocol-paths.md
  • structure/data-planes/search.md
  • structure/gui-and-management-api.md
  • structure/ops/service-and-sidecars.md
  • structure/providers-and-adapters.md
  • structure/providers/chat-compat.md
  • structure/providers/kiro.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-workspace.md
  • structure/runtime.md
  • structure/subagents.md
  • structure/transports/byte-accounting.md
  • structure/transports/response-citations.md
  • structure/transports/responses-citations.md
  • structure/transports/responses-combo-boundaries.md
  • structure/transports/responses-wire-shapes.md
  • structure/transports/responses.md
  • tests/adapters/routed-agent-messages.test.ts
  • tests/ci-workflows/ci-bun-install-frozen.test.ts
  • tests/claude-integration/claude-first-party-agent-sync.test.ts
  • tests/claude-integration/claude-translated-server-tools.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-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/codex-integration/codex-cli-update-parent-async.test.ts
  • tests/codex-integration/codex-cli-update-windows-pending.test.ts
  • tests/codex-integration/codex-credits-probes.test.ts
  • tests/codex-integration/codex-routing-elapsed-short-reset.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/multi-agent-keep-native-v1.test.ts
  • tests/codex-integration/reasoning-metadata.test.ts
  • tests/codex-integration/slug-codec.test.ts
  • tests/config/config-workflow-budget.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/lib/bun-runtime-preflight.test.ts
  • tests/oauth/anthropic2-discovery-ownership.test.ts
  • tests/providers/azure-adapter.test.ts
  • tests/providers/cc-switch-import.test.ts
  • tests/providers/kiro/kiro-single-final.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/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/zed-hosted-provider.test.ts
  • tests/responses/messages-native-bridge-policy.test.ts
  • tests/responses/openai-responses-passthrough.test.ts
  • tests/responses/responses-muse-tool-choice.test.ts
  • tests/responses/responses-parser.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/management-provider-compat-carry.test.ts
  • tests/server/server-combo-required-tool-contract.test.ts
  • tests/server/server-workflow-budget-settings.test.ts
  • tests/server/server-xai-responses-streaming.test.ts
  • tests/server/update-async-routes.test.ts
  • tests/service/process-state.test.ts
  • tests/update/update-worker-launch.test.ts
  • tests/usage/request-history-integrity.test.ts
  • tests/web-search/web-search-eof.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

✅ Deterministic PR hygiene checks passed.

@github-actions github-actions Bot added the bug Something isn't working label Oct 30, 2026
@github-actions

github-actions Bot commented Oct 30, 2026 •

Copy link
Copy Markdown

✅ READY

  • all PR quality gates passed.

UI screenshot waived by a maintainer comment.

Hygiene

✅ Deterministic PR hygiene checks passed.

@luvs01

luvs01 commented Oct 30, 2026

Copy link
Copy Markdown
Owner Author

For this fork review, no GUI screenshot is required for the authored change. Relative to the intended upstream base 8e58c9683d7d1e0fd2dbb3604cf05dca62b02b99, this PR changes only five classifier/test/documentation files and makes no GUI change: exact comparison.

The GUI paths in the older fork-dev comparison are already-landed upstream content, byte-identical to that upstream base. This is the repository-supported owner-comment screenshot waiver for this specific review; it does not waive tests, code review, or any upstream maintainer decision.

@luvs01

luvs01 commented Oct 31, 2026

Copy link
Copy Markdown
Owner Author

No description provided.

This branch has not been deployed

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

Labels

bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants