Skip to content

fix(security): reject inherited writes at Windows creation parents - #803

Closed
luvs01 wants to merge 37 commits into
devfrom
codex/propose-fix-for-inherited-acl-race
Closed

luvs01 wants to merge 37 commits into
devfrom
codex/propose-fix-for-inherited-acl-race

Conversation

@luvs01

@luvs01 luvs01 commented Oct 30, 2026 •

Copy link
Copy Markdown
Owner

Summary

Reject inherited write/create grants at Windows child-creation parents before a new child can be hardened. Keep inherit-only templates permitted on existing trusted ancestors, so a standard volume-root template does not reject an otherwise private descendant chain. Private leaf/directory validation remains unchanged.

Integrated upstream dev 261131d3726d95b4ad3335cf416254a868963e08 at 966a1d78efab1499558c7e356e5940b61b614120. Relative to that upstream snapshot, the change remains four files. The upstream sync/async recovery drivers still assign write-private to actual creation parents and private to created directories/leaves; independent review found no conflicting caller contract.

Verification

Windows 11 x64, Bun 1.4.4:

  • All 83 distinct cases across windows-codex-cli-job-store.test.ts, codex-cli-update-parent-async.test.ts, and codex-cli-update-windows-pending.test.ts have passing evidence across bounded runs. The first run passed 75 cases with no assertion failure before its 15-minute outer limit; the follow-up passed 13 / 58 assertions, comprising the eight unfinished cases and five core rechecks. This is not a claim that one uninterrupted three-file run passed.
  • The native follow-up verifies asynchronous ACL recovery, pending-inode adoption, publication refusal, and real child/Job lifetime fencing. The two new policy regressions pass. The earlier original-code RED/current-code GREEN evidence remains separate.
  • Typecheck: 2,252 files, no errors. Structure, privacy, file-size, and diff checks passed. File-size initially encountered sparse-checkout omissions; only that check was repeated after materializing the exact missing tracked roots.
  • Tests use isolated homes. Explicit real-home deny-list handoff was added to the task-local runner before the 13-case follow-up and separately verified without writes; the first run is not evidence of that handoff. Native Job exit, EOF, and supervisor reap were confirmed.
  • Native fixtures substitute trusted ancestry above their private root. Cross-account and ARM64 behavior remain unverified. Earlier read-only C: root comparison and prior-head CI are not represented as new-head execution evidence.

Exact-head Cross-platform CI 41064991735, Catalog 41064991412, Service lifecycle 41064991559, and React Doctor 41064991509 passed. The full import-graph suite ran in hosted CI because of local Windows execution cost.

Two inherited-baseline findings outside the four-file ACL delta have verified separate proposals: #805 (e618338f4cc, feature-toggle selection ownership; CI 41073379934) and #806 (ed1cf087109, direct hosted-tool Meta eligibility; CI 41074030463). Both are Ready with passing exact-head CI and remain unmerged. Their fixes are not part of this ACL head and require separate integration; the review threads record that disposition. No host ACL, live config, account, service, or permission mode was changed. Maintainer/security merge acceptance remains separate.


Codex Task


Devin Review

@coderabbitai

coderabbitai Bot commented Oct 30, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 250 files, which is 150 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 966a1d7.

Files ignored due to path filters: 1
  • desktop/src-tauri/Cargo.lock is excluded by !**/*.lock
Files selected for processing: 250
  • 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/reference/configuration/providers.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/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/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-owner-acl.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/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/remote-control/workspace-codex-runtime.ts
  • src/responses/custom-tool-compat.ts
  • src/responses/item-provenance.ts
  • src/responses/namespace-tool-compat.ts
  • src/router.ts
  • src/routing/analytics.ts
  • src/routing/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-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/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-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-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-codex-cli-job-store.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

@github-actions

github-actions Bot commented Oct 30, 2026 •

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
devin-ai-integration[bot]

This comment was marked as resolved.

dependabot Bot and others added 5 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>
@luvs01 luvs01 changed the title fix(security): reject unsafe inherited Windows grants fix(security): reject inherited writes at Windows creation parents Oct 30, 2026
devin-ai-integration[bot]

This comment was marked as resolved.

0disoft and others added 3 commits October 30, 2026 20:25
…#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>
@luvs01
luvs01 marked this pull request as ready for review October 30, 2026 11:38
…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.
luvs01 and others added 9 commits October 30, 2026 20:41
* 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>
luvs01 and others added 17 commits October 30, 2026 21:10
…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>
…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>
@luvs01
luvs01 marked this pull request as draft October 30, 2026 13:38

@devin-ai-integration devin-ai-integration 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.

Devin Review found 4 new potential issues.

Devin Review

Comment thread src/routing/history/integrity.ts Resolved
@luvs01

luvs01 commented Oct 30, 2026

Copy link
Copy Markdown
Owner Author

No description provided.

@luvs01

luvs01 commented Oct 31, 2026

Copy link
Copy Markdown
Owner Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Oct 31, 2026 •

Copy link
Copy Markdown
Action not completed

Review skipped: 250 files exceed the limit of 100.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@luvs01 luvs01 closed this Oct 31, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

aardvark bug Something isn't working codex

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants