Repository navigation
Conversation
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>
…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>
|
Important Review skippedToo 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.
|
|
✅ Deterministic PR hygiene checks passed. |
✅ READY
UI screenshot waived by a maintainer comment. Hygiene✅ Deterministic PR hygiene checks passed. |
|
For this fork review, no GUI screenshot is required for the authored change. Relative to the intended upstream base 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. |
|
No description provided. |
Summary
Skip Meta Responses destinations before sending when a combo request directly selects a known hosted tool, including
web_searchor an MCP selector with a nonemptyserver_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
dev8e58c9683d7d1e0fd2dbb3604cf05dca62b02b99; the fork's olderdevcomparison 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
Exact-head Cross-platform CI 41074030463, Catalog
41074029966, Service lifecycle41074030053, and React Doctor41074030215passed ated1cf0871099245d2f49f8d8357c8bac2927e501. 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 Enforce41074954248. No live model settings, accounts, or service were changed.