Skip to content

sync: upstream main 2026-10-11b (105 commits → v1.4.224 line) - #18

Merged
karlorz merged 111 commits into
fork-mainfrom
sync/upstream-2026-10-11b
Oct 11, 2026
Merged

karlorz merged 111 commits into
fork-mainfrom
sync/upstream-2026-10-11b

Conversation

@karlorz

@karlorz karlorz commented Oct 11, 2026

Copy link
Copy Markdown
Owner

ELI5

This branch copies 105 new commits from upstream stablyai/orca main onto the fork's working branch fork-main, so the fork can later cut the next desktop tag on the 1.4.224 line. It does not merge itself, does not cut a tag, and does not deploy.

What Changed

Before: fork-main (079420eab9d, PR #17) was 105 commits behind stablyai/orca main. upstream/main was not an ancestor of fork-main, so fork-next-desktop-tag.mjs --write refused.

After: sync/upstream-2026-10-11b is a --no-ff merge of upstream/main @ 92fb883cf25 into fork-main. Seven conflicts were resolved; fork features (pet speech ownership, automation agentFlags, terminal navigation capabilities, Linux in-app folder picker, daemon pid-file tests) stay. Upstream wins for SSH target-management, the deleted Docker-SSH e2e-gate tests, and files the fork does not customize.

Mechanism: merge commit a34d8b949d9 plus notes in SYNC-NOTES-2026-10-11b.md.

Why

The daily fork-sync cannot fast-forward when upstream is not an ancestor. A follow-up merge (this PR) is the same path as #15/#17: keep fork deltas, take upstream product changes, record resolutions, let GitHub CI run the full matrix.

Linked Issue

N/A — fork maintainer sync; no upstream issue.

Visual Proof

N/A — no user-facing UI change beyond ingesting upstream commits (including the already-shipped server-owned SSH folder picker). Conflict resolutions preserve existing fork picker/local browse behavior.

Testing

  • tsc --noEmit -p config/tsconfig.tc.cli.json clean via heavy-run

  • vitest --maxWorkers=1 on e2e-gate contract, host-operation-ownership, electron-process-shutdown, repo RPC, runtime SSH target-management (all passed)

  • listing-hook unit file not run to completion locally (@/ alias transform miss on this box; same class as other renderer tests here). Full unit matrix is GitHub CI.

  • No local electron-builder / full suite

  • Automated tests added/updated, or explained why not below

  • I manually tested these changes locally

AI Disclosure

Review

Agent skill upstream boundary

  • Not applicable, or this change copies or mechanically translates no upstream skill-installer source, tests, fixtures, registry entries, path tables, comments, or documentation.

Notes

Coolify HOLD / no auto-deploy. Do not merge this PR from CI. Do not cut v1.4.224-0 from this PR. Do not touch Coolify.

Conflict resolutions (see SYNC-NOTES-2026-10-11b.md):

Path Resolution
.gitignore Union; drop leftover orphan comments; keep upstream .build/preflight-benchmark/ and .local/static-analysis-research/
pr-e2e-gate-contract.test.mjs Upstream (SSH docker source-routing tests removed with those jobs)
protocol-version.ts Fork capability spread + upstream ssh.target-management.v1
RemoteFileBrowser.tsx Keep fork local picker; allow both ids set
use-remote-file-browser-listing.ts local / server-SSH / client-SSH / server-disk
use-remote-file-browser-listing.test.ts Upstream SSH cases + fork local case
electron-process-shutdown.unit.test.ts Fork pid-file cases + upstream POSIX daemon cleanup

Checklist

  • This PR is small and focused
  • I explained what changed and why (ELI5, the user-facing before/after, the mechanism, and why over the alternatives)
  • Before/after screenshots or videos attached for UI changes, or N/A with reason
  • Self-reviewed for correctness, security, and performance
  • Cross-platform, SSH/remote, and path/shortcut impact considered (or N/A)
  • pnpm lint, pnpm typecheck, pnpm test, and pnpm build pass (or CI will cover; local preferred)

OrcaWin and others added 30 commits October 10, 2026 10:27
…-read ratchet (stablyai#27275)

* refactor(runtime): owner transports, the creation default and a focus-read ratchet

Adds runtimeTargetForOwnerEnvironment, runtimeTargetForOwnerHostId and
runtimeTargetForWorkspaceOwner so routed call sites can get a transport from
the resource's owner, and defaultCreationHost as the one sanctioned reader of
the Active Server setting for creation flows with no source row.

The owner-routing ratchet gains a second per-file counter for reads of the
setting (member reads, the focus-routing helpers and defaultCreationHost), so
swapping a helper for a direct read can no longer lower a count. Baseline rows
may carry a trailing note that survives --prune.

* chore(lint): pin defaultCreationHost's own read in the focus-read baseline

* fix(lint): the focus-read ratchet counts shared focus helpers and destructuring reads

* fix(lint): discover functions that read the default host instead of hand-listing them

A hand list let a look-alike such as getAutomationListTarget replace
getActiveRuntimeTarget and lower both ratchets. Every exported top-level
function whose body reads the setting or calls a seed helper now counts as a
reader, and nested destructuring reads count too.

* fix(lint): readers are found through imports and returned values

Readers are keyed by defining file and resolved through imports and
re-exports, so a same-named function elsewhere is not mistaken for one, and
a function that returns a reader's result (a wrapper of a wrapper) is found
too. Components are not readers, and a declaration ends at the next
top-level statement.

* fix(lint): a reader called through a namespace or dynamic import still counts

* fix(lint): renamed, parenthesized and .then() dynamic imports bind readers too

---------

Co-authored-by: m4air <m4air@Mac.localdomain>
…he task source (stablyai#27276)

GitHub PR and issue dialogs, task-page cells, Project boards, slug metadata,
the repo slug index, hosted-review actions, GitLab MR base resolution and the
Settings API-budget panels now carry a RuntimeClientTarget derived from the
repo row, the row-less task source, the board row's cache key or the Settings
host scope, instead of settings-shaped objects resolved through
getActiveRuntimeTarget. A repo row with no owner stamp is local; an untracked
Project row edits on the host that loaded it.

Owner-routing ratchet 209 -> 165; focus-read ratchet 401 -> 352.

Co-authored-by: m4air <m4air@Mac.localdomain>
…lyai#27278)

* refactor(files): file reads and edits route by the file's owner

The runtime file clients took a settings object and turned its Active Server
field into a connection, so any caller that passed raw settings silently read
or wrote on the focused server. They now take `target: RuntimeClientTarget`,
and every caller derives it from the owner: the tab's stamped owner, else its
worktree's owner (getRuntimeTargetForFileOwner / getRuntimeTargetForWorktreeOwner),
the file-explorer operation owner, or an already captured owner id.

Behavior: single-host (local-only) users see no change. An editor tab opened
without an owner stamp, a terminal link with no PTY owner, an OS file drop and
a notebook link now go to the workspace's owner instead of whichever server is
focused when the read happens.

Removes getEditorFileDropSettingsForWorktree and the native-chat settings clone
cache; settingsForWorktreeOperationRoute loses its editor caller.

* fix(files): file owner targets come from the rows, never the focused server

getRuntimeTargetForWorktreeOwner/getRuntimeTargetForFileOwner move to
lib/file-owner-runtime-target.ts and resolve through the focus-free
resolveOwner. A workspace with no row yet stays on this app (tabs and drops
stamp a server owner when one exists); rows that disagree return null, and
callers with an error path refuse via requireRuntimeTargetForFileOwner.

* test: keep the editor content-state fixture within the line limit

* fix(files): an unresolved document owner blocks local image reads

A null owner target became runtimeContext undefined, which image readers take
as a plain local file, so a server-owned document's images were read from this
machine. It is now runtimeContext null, the readers' do-not-load sentinel, in
the rich editor and the preview, and prewarm skips it.

* fix(files): read the image node view's storage through a named type

---------

Co-authored-by: m4air <m4air@Mac.localdomain>
… owner (stablyai#27279)

* refactor(terminals): terminal input and inspection route by the PTY's owner

A remote PTY id already names the server that owns it. inspect, confirm,
send, verified send and the data subscription took settings only to fall
back to the focused server for an id without an owner segment, so an old
ownerless id could reach a server that does not own it. They now route by
the id alone: an ownerless remote id is never dialed and never confirmed
locally.

Dropping the parameter removes the settings plumbing the native chat,
agent draft paste and follow-up paths carried only for this, including the
raw focused-settings default in sendBracketedPasteToAgent, and deletes
getSettingsForAgentTabRuntimeOwner.

* test(e2e): native chat SSH delivery and remote completion follow the narrower terminal signatures

---------

Co-authored-by: m4air <m4air@Mac.localdomain>
…ace owner (stablyai#27283)

Agent note sends, background agent and terminal launches, structured chat
reveal and activation, and the tab strip's Windows shell probe take their
transport from the workspace owner's environment instead of building
owner-shaped settings for getActiveRuntimeTarget. The automation observer and
the Codex selection lane read the owner from the PTY id alone, so an
ownerless remote id is never assigned the focused server. Local
advertised-URL events always rescan this computer, even when a server is
the default host.

Co-authored-by: m4air <m4air@Mac.localdomain>
…tablyai#27289)

getRuntimeRepoTarget takes the transport its caller already routed by
instead of reading the Active Server setting (with a raw focus default).
Work-item, comment, check and review-thread requests get it from
getGitHubSourceTarget (task source host, else the repo's owner); PR
lookups from the repo row; PR refreshes from the candidate's owner.
Hosted-review fetches route by hostedReviewRepoOwnerTarget. An unknown
repo stays on this computer instead of following the focused server.
Cache keys are unchanged. Deletes settingsForHostedReviewRepoOwner,
settingsForGitHubFocusedRepoOwner and getGitHubWorkItemSourceSettings.

Co-authored-by: m4air <m4air@Mac.localdomain>
… host (stablyai#27290)

* refactor(sources): row-less sources and host-less surfaces name their host

Linear and Jira clients take a RowLessSource: a task-source context, an
explicit host, or defaultScopeSource(settings) when no Tasks source is
chosen, so raw settings no longer compile. defaultScopeHost joins
defaultCreationHost as the second sanctioned reader of the default-host
setting (both behind one private read, both ratchet seeds), and the status-bar
account switchers, settings navigation and the settings host picker's initial
default use it. Skill discovery routes by the owner id its install terminal
resolves, and the workspace-board Linear sync by the workspace owner.

* fix(lint): count the default scope source and assign-then-return readers

defaultScopeSource is a sanctioned read of the default host, so its call
sites count. A function that assigns a reader's result to a local and returns
that local is a reader too, which keeps the skill-discovery hook counted.

---------

Co-authored-by: m4air <m4air@Mac.localdomain>
…e by their owner (stablyai#27288)

Catalog fetches, path-status probes, project and group mutations, nested
scans and imports now take the owner's host explicitly instead of falling
back to the Active Server setting. A new project with no picked host still
goes to the default host, through defaultCreationHost.

Co-authored-by: m4air <m4air@Mac.localdomain>
Combine related chat, worker-release, and filesystem tests while retaining their contracts. Replace fixed Codex terminal waits with observed readiness and hook completion. Keep runtime database contracts under Node.

Local measurements and all CI lifecycle costs are documented in PR stablyai#27297.
* refactor(git): git calls route by the worktree's owner

RuntimeGitContext carries the owner's transport (target) instead of a
settings object, so raw focus settings no longer compile at a git call.
Source control, the checks panel, diff loaders, fork sync, lineage,
worktree metadata, review push targets and diff-comment persistence derive
it from the repo or worktree rows (resolveOwner) or a captured owner.
Editor-slice remote actions take an explicit runtimeTarget and otherwise
resolve the worktree owner; an unresolved owner is refused, never sent to
the focused server. Generation preferences ride a separate prefs field.

* fix(work-items): one owner row routes direct-launch preflight, PR start point and create

* fix(review): PR dialog effects key on the host, not the target object

A fresh target literal per render re-ran base-ref discovery forever and ran the
test worker out of memory.

---------

Co-authored-by: m4air <m4air@Mac.localdomain>
…7308)

* [CI] Reduce repeated test setup and remove source text checks

* [CI] Consolidate transcript tests and preserve fixture-only CI routing

* [CI] Retarget reliability gate to consolidated transcript suite
…ref reads route by their owner (stablyai#27298)

* refactor(worktrees): worktree create, listing, removal and repo hook/ref reads route by their owner

Worktree create, prefetch, detected listings and missing-terminal teardown,
preserved-branch cleanup and removal follow the repo or workspace owner.
Repo hook and base-ref reads take the repo's host id instead of settings.
Composer, settings panes and the setup guide pass the selected repo's host.

* test(hooks): build the duplicate-row state without a cast

---------

Co-authored-by: m4air <m4air@Mac.localdomain>
* chore(lint): delete the focus-routing helpers; bypassing owner routing fails lint

The last six renderer sites (Settings visibility defaults, preflight readiness,
Linear key dialog copy) mirror the default scope host and now say so through
defaultScopeHost. getActiveRuntimeTarget and settingsForRuntimeOwner are
deleted with their re-exports, the unused settings-fabrication helpers go with
them, and the owner-routing baseline is empty, so any new use fails lint. The
provider dispatch rationale is rewritten in neutral, shorter terms.

* test(preflight): keep the existing cast's rationale on the edited line

---------

Co-authored-by: m4air <m4air@Mac.localdomain>
…ects" (stablyai#27286)

* chore(settings): rename "Active Server" to "Default host for new projects"

The setting (still activeRuntimeEnvironmentId) now only picks the host for new
projects with no source and the initial host of the Settings host picker, so
the copy says that. Refusal and help text say existing projects stay on their
own host, the provider-scope hints point at the Settings Host menu, and the
Remote Orca Servers search entry keeps "active server" as a keyword.

* fix(settings): credential hints point at the setting that still scopes them

---------

Co-authored-by: m4air <m4air@Mac.localdomain>
…ons (stablyai#26934)

Co-authored-by: kambarakun <kambarakun@gmail.com>
stablyai#26937)

Preserve names entered after selecting a work item in desktop, mobile and folder creation. Reuse the existing source and last-generated-name state, and avoid repeating source naming when a delayed base lookup finishes.

Verified the current-main merge composition: 70 focused tests and renderer typecheck pass; newer execution-host routing and folder launch checks remain intact. The reviewed PR head has no failed or pending CI checks and no unresolved review threads.
…tablyai#27317)

* docs(rpc): paired workspace access runs commands as the user; pairing dialogs say so

* docs(rpc): mobile is gated by its allowlist, not by tier

* docs(rpc): wrap comment

---------

Co-authored-by: m4air <m4air@Mac.localdomain>
… switch state (stablyai#27058)

Rebased onto main as one commit after its parent squash-merged.
Co-authored-by: Luchong <lu740528977@gmail.com>
Co-authored-by: GuanBear <guanbear@users.noreply.github.com>
…econd later (off) (stablyai#27048)

Rebased onto main as one commit after its parent squash-merged.
Automatic inactive Claude account refreshes now reuse each account’s existing retry deadline before sending requests. Healthy accounts keep refreshing, and manual forced refresh retains its current behavior.

Partially addresses stablyai#26588.

Co-authored-by: Tauri-EPO <enrico.pin@gmail.com>
…ep-5 census, inert) (stablyai#27046)

Rebased onto main as one commit after its parent squash-merged.
A failed plaintext replacement can publish the new key before file
restriction is confirmed. If restoring the previous key fails before it
replaces that file, delete only the rejected envelope so a completed
restore is left intact.
A restored plaintext envelope can match the rejected replacement byte for
byte. Do not delete that file, since it is the previous key rather than a
new secret.
abruption and others added 23 commits October 10, 2026 21:11
* fix(i18n): correct Korean CI check translations

* fix(i18n): clarify Korean GitLab pipeline requirement
…stablyai#27374)

The macOS helper serves each sidecar connection on a dedicated thread
that lives as long as the connection, and the sidecar keeps one
connection open while the helper runs. Encoding a screenshot with
NSBitmapImageRep leaves autoreleased objects that keep the captured
image alive, and that thread never drained its pool, so every
screenshot kept a window-sized buffer in WindowServer until the helper
restarted.

Drain an autorelease pool around each request.
…tablyai#27375)

Follow-up to stablyai#27342: the existing tests also pass on the old module-level
Error, so add one that fails if a single error object is reused.
…yai#27376)

Follow-up to stablyai#27344. isTerminalPreviewLineControl now gates on
isTerminalPreviewLineControlFinal, so the normalizeTerminalChunk
pre-filter cannot drop a final the predicate accepts. Add a test over
every CSI final 0x40-0x7e and replace String.prototype.charCodeAt spies
with behavior assertions.
…rer (stablyai#27372)

The renderer imports quick-open-listing-limits for the result cap, but the
same module also held a Buffer-backed accumulator that imports the CommonJS
@orca/process-host dist. Vite dev serves that dist as raw ESM, so the named
import failed and the workspace workbench and right sidebar crashed. Move the
accumulator to its own main-only module.
…ai#27343)

* perf(worktrees): preserve Git scans when saving sort order

Credit @mmarabel for identifying the repeated scans and the host-only approach in stablyai#27271.

Co-authored-by: mmarabel <166927047+mmarabel@users.noreply.github.com>

* perf(worktrees): skip Git scan invalidation for order saves on desktop hosts too

The desktop window notifier ran the worktree-change invalidators unconditionally,
so a desktop (or paired-host) Orca still cleared Git scan caches on every sidebar
order save. Carry the invalidateGitScans flag through the notifier; every other
caller keeps the default.

---------

Co-authored-by: mmarabel <166927047+mmarabel@users.noreply.github.com>
* fix(claude): register a short PostCompact hook command

Claude Code echoes every PostCompact hook's full command into the
post-compact transcript, so Orca's ~3KB portable wrapper landed in the
model's context after every /compact. On POSIX hosts (local macOS/Linux and
SSH remotes) PostCompact now gets only the POSIX branch of the wrapper;
every other event, and Windows, keep the full wrapper.

Fixes stablyai#25209

* fix(claude): guard runtime home and verify hook process identity

---------

Co-authored-by: Neil <neil@stably.ai>
…yai#27346)

* fix(clipboard): paste a macOS image copied beside its file URL

When a screenshot tool saves a file and also copies the image, the
pasteboard holds public.png and public.file-url, and Chromium reports
only text/uri-list from availableFormats(). readClipboardImageSource()
then saw no image and Cmd+V dropped the paste, although readImage()
returns it. On macOS, also check public.png and public.tiff with
clipboard.has() before giving up.

Fixes stablyai#27345

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HzCzr11hHmaEhiUoGJCrDy

* test(clipboard): cover macOS file URL image paste safety

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-authored-by: Neil <neil@stably.ai>
…ai#27366)

* fix(vm): a recipe VM's SSH root runs on a managed Orca server

A recipe VM's hidden SSH target was counted as owned by another runtime, so
every connect refused to deploy a managed server and fell back to the relay.
Its runtime owner only records when the VM is created and destroyed, so it no
longer blocks the deploy. The VM's workspace then lives on that server: the
server adopts the provisioned root as its main worktree, and removing the
project destroys the VM and forgets its server.

* fix(vm): release the server of a relay-era VM that converted on connect

* fix(vm): resume reconnects an SSH VM's server; removal stays on its own VM

* fix(vm): removal and the remove dialog find a VM's server before the catalog loads

* fix(vm): a catalog refresh failure never blocks a VM create

---------

Co-authored-by: m4air <m4air@Mac.localdomain>
)

* Require pointer rest before opening activity hover cards

Defer hover card open until pointer stops moving, preventing accidental
popover display on rapid mouse movement. Add progress indicator showing
rest duration. Keyboard focus still opens the card immediately.

* refactor to keep file small
…yai#26412)

* test(e2e): add a paired phone client helper and phone-mirror baseline specs

Later phone-mirror slices need one oracle that drives a real mobile-scoped device with the
phone's own capabilities against a serve host or a paired desktop. Pins stablyai#26022 across a serve
restart and today's gap: a desktop's phone does not list the desktop's server workspaces.

Claude-Session: https://claude.ai/code/session_01JNnE9qzUZMMnqpZWCqM3nb

* test(e2e): compose the phone-mirror topology and check the cold snapshot

Slices need one composer for host, desktop and phone with a single teardown, so specs stop
copying setup. The serve-restart spec now reads the first tab-stream snapshot after the cold
start, which is what the phone builds its tab strip from.

Claude-Session: https://claude.ai/code/session_01JNnE9qzUZMMnqpZWCqM3nb

* test(e2e): keep phone-mirror teardown errors from masking test failures

Teardown failures become a test attachment instead of replacing the real failure, and the
cold-snapshot poll reports stream errors together with the PTY list.

Claude-Session: https://claude.ai/code/session_01JNnE9qzUZMMnqpZWCqM3nb
…relay client path (stablyai#27214)

* wip: connect fails for hosts the managed server can't serve; remove relay session, deploy and relay UI

* wip: delete relay-only client modules left unreachable, prune their tests and gates

* wip: format

* wip: exhaustive unserved message

* wip: drop relay attestation test for the deleted ownership proof

* fix: prune stale baselines; type the test transport stub

* fix(ssh): census proves leftover relay leases; name the remedy for older terminals; translate every connect-failure surface

* test(ssh): leftover leases defer to the host census

* test(e2e): remove relay-path SSH e2e specs and their CI lanes

* test(e2e): drop the auto-convert case that built its relay era through a live relay

* test(e2e): mark relay-era browser and catalog journeys fixme until they seed a profile

* test(e2e): seed relay-era browser and catalog journeys from a saved profile

The three journeys built their old-version state through a connect without an orcad template, which now refuses the host. They now start from a seeded relay-era profile, so the first connect converts the host as an upgrading user's would.

* chore(ci): drop shard timings for the deleted relay tests

* test(e2e): carry a relay-era login cookie across the browser conversion; own every launch

* test(ci): drop the deleted SSH layout oracle from its route

* test(e2e): open the retained browser after conversion, retrying a pre-connect card

* test(e2e): bind the relay-era browser partition before seeding its cookie

A relay-era build always recorded the partition binding before a page stored
data in it. Seeding the cookie into an unbound partition made the binding store
refuse it (browser_route_partition_binding_store_invalid), so the retained tab
showed the generic routing card and Retry could never clear it.

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

---------

Co-authored-by: m4air <m4air@Mac.localdomain>
Co-authored-by: Claude <noreply@anthropic.com>
)

* [CI] Reduce test teardown and scope server qualification

* [CI] Retain raw platform paths in server qualification
…ablyai#27384)

* perf(worktrees): skip unchanged lineage after sidebar order saves

Mark order-only remote events and skip redundant lineage downloads only
after a successful current-host read. Preserve independent cold, failed,
pending and structural refreshes, including reconnect and re-pair.

Addresses stablyai#27268.

Co-authored-by: mmarabel <166927047+mmarabel@users.noreply.github.com>

* fix(worktrees): notify after recording SSH-created worktree lineage

Paired clients now skip lineage refetch on sort-order-only events, so the
pre-lineage create notify on the SSH route could leave lineage stale until
the next structural change.

---------

Co-authored-by: mmarabel <166927047+mmarabel@users.noreply.github.com>
…27383)

* perf: avoid retransferring unchanged paired-runtime session history

Keep selected finite-depth history refreshes content-conditional while preserving scans, full old-peer replies, force refreshes and the existing cache lifetime.

Co-authored-by: mmarabel <166927047+mmarabel@users.noreply.github.com>

* perf(ai-vault): keep full host list behind unchanged replies for cache readers

---------

Co-authored-by: mmarabel <166927047+mmarabel@users.noreply.github.com>
…sts (stablyai#27215)

* wip: delete the SSH relay server and its build, assets and tests

* wip: drop main/relay plugin conformance; WSL reader lookup test

* fix: drop the emptied relay bench; prune baselines

* test: keep the native halves of tests that also covered the relay

* chore(ci): drop shard timings for the deleted relay server tests

* fix: keep the directory listing budget that darwin terminal names now import

---------

Co-authored-by: m4air <m4air@Mac.localdomain>
* fix(agent-status): keep nested models off the parent pane

Preserve the parent's model when the existing identity fence retains an
active parent for a nested CLI hook. Exercise native SessionStart and Stop
bodies alongside model updates and legitimate pane takeovers.

Adapted from PR stablyai#25687, with real native-hook and hidden renderer proof.

Co-authored-by: Regis <92858615+Regis-RCR@users.noreply.github.com>

* chore: record original authorship for Parent-pane model ownership

Records the retained adapted contribution from stablyai#13602 in replacement PR stablyai#26846.

Co-authored-by: Brennan Benson <79079362+brennanb2025@users.noreply.github.com>

* test: drop redundant single-agent model case

---------

Co-authored-by: Regis <92858615+Regis-RCR@users.noreply.github.com>
Co-authored-by: Brennan Benson <79079362+brennanb2025@users.noreply.github.com>
Co-authored-by: m4air <m4air@Mac.localdomain>
…ablyai#27382)

* perf(ci): skip unnecessary alias scans and compare preflight compilers

* perf(ci): overlap measured Bun typechecking with static checks

* perf(ci): use measured Bun lint runtime and strengthen compiler parity checks
…tablyai#27381)

The headless split and move-to-group handlers answered {moved:true} when the
target group did not exist, hiding desktop/server group-id drift (stablyai#26522).
They now refuse with target_group_not_found, as reorder already does.

Claude-Session: https://claude.ai/code/session_01JNnE9qzUZMMnqpZWCqM3nb
Sync 2026-10-11b: merge stablyai/orca main into fork-main.
Conflict resolutions will be recorded in SYNC-NOTES-2026-10-11b.md.

# Conflicts:
#	.gitignore
#	config/scripts/pr-e2e-gate-contract.test.mjs
#	src/renderer/src/components/sidebar/RemoteFileBrowser.tsx
#	src/renderer/src/components/sidebar/use-remote-file-browser-listing.test.ts
#	src/renderer/src/components/sidebar/use-remote-file-browser-listing.ts
#	src/shared/protocol-version.ts
#	tests/e2e/helpers/electron-process-shutdown.unit.test.ts
The PR root-directory guard rejects new top-level files. Same content as
SYNC-NOTES-2026-10-11b.md, next to the previous sync notes.
@karlorz

karlorz commented Oct 11, 2026

Copy link
Copy Markdown
Owner Author

Root-directory guard: moved SYNC-NOTES-2026-10-11b.md to docs/audits/sync-notes-2026-10-11b.md (same as #17 ed9b1bb7). No other new root-level entries vs fork-main.

…eletion

Upstream stablyai#27215 dropped src/relay/ from CROSS_HOST_PREFIXES. The change-scope
tests still used src/relay/ paths for full-host qualification. Use src/main/ssh/
instead.
CI failed on native-chat-zcode-transcript because the chat root never
mounted after toggleTabViewMode. The SessionStart resume hook types
zcode --resume into the PTY; without a zcode binary that side effect
drops the live pane off chat eligibility. Re-bind providerSession on
the current pane after the hook, persist Chat UI through settings.set,
and cover zcode in the local-transcript availability tests.
The follow-up CI run still lost the chat root. Traces show ZCode waiting
at toggle time, then `zcode --resume` exiting with command-not-found and
native chat leaving the pane. Seed providerSession on the renderer like
the original spec instead of posting SessionStart resume, which launches
a TUI CI does not install.
@karlorz
karlorz merged commit e51d0a0 into fork-main Oct 11, 2026
102 of 104 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.