Skip to content

sync: upstream fbc48858f6 into swaplabs/main - #75

Closed
kiwidream wants to merge 187 commits into
swaplabs/mainfrom
main
Closed

kiwidream wants to merge 187 commits into
swaplabs/mainfrom
main

Conversation

@kiwidream

@kiwidream kiwidream commented Oct 31, 2026 •

Copy link
Copy Markdown

ELI5

Upstream Orca moved forward 187 commits since yesterday's sync (#74). This PR proposes merging them into swaplabs/main straight from the fork's mirror main.

What Changed

Upstream range c610633ed0..fbc48858f6, 187 commits (compare). The head is the fork's mirror main, so the PR adds no fork commit.

A read-only git merge-tree of fbc48858f6 into swaplabs/main (0d270950b7) reports 13 content conflicts and 2 modify/delete conflicts, so this PR is expected to be CONFLICTING; the automation then moves the merge to a sync/upstream-20261031 branch and closes this PR as superseded:

  • src/cli/specs/orchestration-worker-specs.ts
  • src/main/runtime/orchestration/mailbox-pointer-submit.ts
  • src/main/runtime/rpc/methods/orchestration/federation/federated-worker-release-host.ts
  • src/main/runtime/rpc/methods/orchestration/federation/federated-worker-release.ts
  • src/main/runtime/rpc/methods/orchestration/federation/federation-control.ts
  • src/main/runtime/rpc/methods/orchestration/worker/worker-release-completion.ts
  • src/main/runtime/terminal/wait/terminal-wait-settlements.ts
  • src/main/startup/codex-hook-startup-wiring.test.ts (deleted upstream, modified by the fork)
  • src/main/window/main-window-updater.ts
  • src/renderer/src/components/settings/RemoteServerUpdateDialog.test.tsx (deleted upstream, modified by the fork)
  • src/renderer/src/components/terminal-pane/pty-connection/pane-agent-identity.ts
  • src/shared/orchestration-fleet-projection.test.ts
  • src/shared/orchestration-fleet-worker-projection.ts
  • src/wsl-guest/agent-hook-request.ts
  • src/wsl-guest/agent-hook-server.ts

Why

Daily upstream sync.

Linked Issue

N/A: daily upstream sync.

Visual Proof

N/A: upstream code only.

Testing

None on this head: main is the mirror and takes no commits. Validation happens on the sync branch.

AI Disclosure

Prepared by the "Orca upstream sync" automation (Claude Code, Claude Opus 5.5).

Agent skill upstream boundary

  • Not applicable: this PR merges upstream's history; it adds no agent skill.

Notes

orca-fork-ops status for swaplabs/main (0d270950b7) against upstream fbc48858f6:

No upstream release tag was missing from the fork this run.

🤖 Generated with Claude Code


View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need.

OrcaWin and others added 30 commits October 30, 2026 03:09
Unstaging a staged rename from the Source Control row or diff review
reset only the new path, leaving the old path staged as a deletion.
Send both paths through git.bulkUnstage, matching desktop.

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
…#35682)

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
…tablyai#34997)

for-each-ref %(refname:short) prefixes a branch with heads/ when a same-named tag exists, so the mobile branch picker sent heads/<name> to checkout and detached HEAD. Use %(refname:lstrip=2) to return the branch name itself.

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
Read .gitmodules with config -z so a submodule name or path containing a
space (the default when 'git submodule add' targets a spaced path) keeps
its real path instead of being split at the first space.

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
Route resolveLocalGitUsernameDetailed's config lookups through createGitConfigSnapshotRunner so one resolution runs a single 'git config --list -z' instead of up to five 'config --get' children.

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
* fix(git): read literal submodule gitlink paths

* test(git): trim gitlink pathspec regression to the bracket case

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
…blyai#34991)

* fix(source-control): hide discard for present submodule gitlinks

Parent git restore --worktree without --recurse-submodules leaves a dirty or moved submodule untouched, so Discard reported success while the row stayed. Hide row/section discard for present gitlinks and submodule children; deleted submodule dirs and staged gitlink discard (which unstages) keep working.

* fix(source-control): keep submodule discard when submodule.recurse is on

Plain git restore recurses into active submodules when submodule.recurse=true, so status now stamps restoreRecurses on gitlink entries and the shared discard guards keep those rows discardable.

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
)

* fix(editor): bound inactive combined diff body retention

* refactor(editor): isolate reloadable diff body sizing

* refactor(editor): share reloadable-section predicate for combined diff body budget

Fold the body-size calculation into the view cache so invalidation and budget
accounting use one predicate, drop the checked-in benchmark, and trim tests.

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
…ablyai#35053)

Buffered gitExecFileAsync reads now always fence login-shell rc output, and
non-zero exits de-fence error.stdout. The per-call captureWslLoginShellOutput
opt-in is removed since it is no longer meaningful.

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
…34779)

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
…mit (stablyai#34791)

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
* test: remove 40 low-value test suites

* test: preserve historical reliability command mapping

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
…tablyai#35010)

isFullGitObjectId only matched 40-hex IDs, so a saved 64-hex commit base in a SHA-256 repo was treated as missing, triggering an unneeded origin fetch and a fallback to the default branch.

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
…nce probe (stablyai#35350)

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
…browser error" (stablyai#36246)

* fix(browser): return every step of an exec batch and stop a bare batch waiting on stdin

* fix(browser): keep a passthrough batch's steps when it stops at the first one

* fix(browser): bind refs to the page an exec batch snapshotted
* fix(git): stop sweeping unattributed per-ref locks during maintenance

An old packed-refs.orca-owner marker with a dead pid does not prove ownership of empty refs/**/*.lock files. A live git update-ref transaction can hold an empty lock, so deleting it let competing writers change the ref mid-transaction. Remove the sweep; keep packed-refs marker recovery.

* test(git): drop ref-lock tests made redundant by sweep removal

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
…a guide that keeps browser work in Orca (stablyai#36257)

* feat(browser): typed snapshot flags and screenshots saved as files for agents

orca snapshot takes --interactive, --compact, --depth, --selector, --urls,
--delta and --full, passed to agent-browser on every route. The header
now shows the page title and URL. orca screenshot and full-screenshot save
the image where the CLI runs and print its path, in CSS pixels, with
--if-changed and --annotate. Flag help for exec, wait and download is
written for those commands, and the orca-cli guide sends web pages to
Orca's browser unless the user picked another tool.

* fix(browser): scale screenshots by the scrollbar-free axis and keep snapshot metadata behind SSH admission

* fix(browser): upscale low-DPR screenshots and wrap a torn-down tab's screenshot error

* fix(browser): give each screenshot its own file and keep typed screenshot errors

* refactor(browser): share the agent-browser screenshot reader between Electron and orcad

* refactor(browser): move snapshot and screenshot params under the line cap
…tablyai#36253)

* feat(browser): let agents drive popup windows like OAuth sign-in as pages

window.open popups that keep their opener stay native windows, but the
agent bridge now lists each one in tab list as popup-<n> with its opener,
so --page, tab switch and tab close reach it. When a popup the agent
switched into closes, its next command lands on the opener.

* fix(browser): reach popups over SSH, through the Electron sidecar, and by implicit tab close

* fix(browser): keep sidecar popups ordered after tabs and handing back to their opener

* fix(browser): skip the tab wake-up wait for popups and keep the agent's claim when a popup hands back

* fix(browser): refresh the opener's claim on hand-back and settle tab close after the popup is gone

* refactor(browser): share routing retarget and idle-window helpers for popup hand-back

* refactor(browser): move popup routing helpers into bridge state to keep tabs under its line cap

* test(browser): expect the popup's url and title in its snapshot result
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
…ding cross-origin iframes (stablyai#36390)

* feat(browser): upload through picker buttons in any frame

* fix(browser): catch pickers the page opens for a frame button and click SVG controls

* docs(cli): note server-hosted pages need the file input ref for upload

* test(browser): assert both picker interceptions are released

* refactor(browser): flatten picker upload and arm frame sessions in parallel

* test(browser): emit picker events through a real emitter instead of Reflect.apply
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
…d half-fold layout (stablyai#35177)

Carries over stablyai#33221 and stablyai#33210. Replaces our stablyai#34484 Duo support with the community design, on top of main's rebuilt terminal key bar (stablyai#36166).

Fixes stablyai#33200

Co-authored-by: Takeshi Matsumoto <zytakeshi520@gmail.com>
Co-authored-by: Lars Keggenhoff <lars@kghf.io>
…6382)

* fix(computer): preserve synthetic Unicode typing on Linux

* fix(computer): bound typing across xdotool versions

* fix(computer): hold Linux keymaps through text delivery

* test(computer): verify missing Linux keys through requests
… --path (stablyai#36397)

* fix(browser): save target=_blank attachments from agent downloads to --path

A new-tab link opened while an agent download claim is armed is downloaded on the claiming page, so the file lands at --path instead of ~/Downloads and no empty tab is left behind.

* fix(browser): keep agent download claims made on popup pages

A claim made through --page popup-N was stored under the popup's id while will-download looks it up under the opener tab's, so the file went to ~/Downloads.

* fix(browser): refuse a second agent download claim on the same tab

A tab and its popups share one claim, so a second concurrent orca download would take the first one's file.

* test(browser): name the popup claim test after both rules it checks

* test(browser): share popup guest fakes and target=_blank setup

* fix(browser): convert only the clicked page's new-tab links during an agent download

A sibling popup's new-tab link no longer takes the tab's claim; it opens as a tab as before.
…and load them on switch (stablyai#35563)

* feat(browser): list restored tabs in tab list and load them on demand

After a restart Orca restores browser tabs lazily: a tab gets a page only once
the user opens it. tab list only reported tabs with a live page, so an agent in
a worktree with 26 restored tabs saw one and concluded there were none.

tab list now reads the tab bar from the session snapshot the renderer already
publishes on every tab change, and reports every tab in tab-bar order. Tabs
without a page carry loaded: false. tab switch and tab close --index resolve
indexes against the same list, and switching to an unloaded tab loads it in
the background first. Waking a page now also waits for its first load to
finish, so the next command does not read a blank page.

Headless serve keeps every page live, so it lists as before.

* fix(browser): list the tab bar even when Orca has no window open

With the window closed the app keeps running and its restored tabs still exist,
so tab list should report them. Headless snapshots are built from live pages
only, and the merge dedupes those, so dropping the window check lists nothing
extra there.

* fix(browser): list an id held by a live page and a client page once

* fix(browser): wait for the first load of a tab headless serve wakes

Headless serve starts a restored page and returned at once, so the next
command could read a blank page mid-load. It now waits for the first load,
as the window path already did.

* refactor(browser): keep the tab listing beside the browser tab catalog

Main moved the runtime browser commands into runtime/browser/ since this was
written. Also drops a window lookup the catalog no longer uses, and corrects the
headless note: those snapshots list saved pages that have not started yet.

* fix(browser): keep paired-server mirrors out of tab list and close indexed rows like --page

A window also publishes the browser tabs it mirrors from paired runtimes,
which this host can never load, so the tab bar is read only for workspaces
this host owns. tab close --index now closes the listed row exactly as
--page does, keeping its worktree, so an unstarted headless tab is retired
instead of reported closed and left saved. With nothing active, the first
live page is marked current again, matching where a pageless command goes.

* fix(browser): wait for first load only on tab switch, and show tab indexes from the listing

Every --page command wakes an unloaded page, including the tab show a
remote browser pane awaits before streaming, so waiting up to 10 s for the
first load there held the stream back. Only tab switch waits now. tab show
reports a tab's index from the same listing tab list and close use.

* fix(browser): list restored tabs in an SSH host's bridged workspace, and reject fractional close indexes

An SSH host's workspace can have no repo row on the desktop, yet its pages
render in the desktop window, so the bridge's scoped workspace counts as
this host's own. A non-integer --index no longer falls through to closing
the active tab.

* test(browser): give the restored-tabs e2e's timeout and lease wait their reasons

* test(browser): read restored-tabs RPC results through the shared e2e reader

Reuses the browser e2e rpc helper instead of a local Reflect.get copy, and
types the listing test's snapshot rows.

* fix(browser): index tab show in the caller's scope, as tab list does

* fix(browser): report an out-of-range close index as browser_tab_not_found

Matches tab switch, so agents can recover by re-listing. The restored-tabs
e2e now asserts the raw loaded value instead of coercing a missing one.

---------

Co-authored-by: fanzzzd <fanzzzd@outlook.com>
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
brennanb2025 and others added 23 commits October 30, 2026 23:43
Concise task-list rows carry id, status, title and ids only; specs and results stay in --full (407 KB to 11.5 KB text on a 138-task Run). Concise gate-list rows drop resolutions and timestamps.
…6617)

* test: remove low-value suites and cases

* test: shrink flaky-pattern counts after case removals

* test: remove empty suite and stale release workflow fixture
…i#36614)

* perf(terminal): submit at once to a shell idle at its prompt

* test: name the captured app transcript by role

* fix(terminal): require host shell-foreground proof and a clean prompt cycle before skipping the submit settle

* fix(terminal): keep the settle for a pane without an identity

* fix(terminal): count a failed idle proof toward the submit settle

* fix(terminal): refuse a fast submit cancelled during the idle proof

* fix(terminal): time the idle proof with a monotonic clock

* test: settle writer idle proofs by hand instead of timed promises
…n WSL 1 and empty distro lists (stablyai#36615)

* feat(wsl): offer a \\wsl.localhost project's distro as a host, and explain WSL 1 and empty distro lists

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

* fix(wsl): restore the WSL hosts setting when accepting the host offer fails

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

* test(wsl): type the settings update stub with GlobalSettings

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

---------

Co-authored-by: Claude <noreply@anthropic.com>
…tablyai#35509) (stablyai#36616)

On some WSL 3.0.3 hosts `wsl.exe --list` exits 0 with nothing on a
redirected stdout. Orca read that as no distros installed and none running,
so the project runtime lost WSL and the background-read gates reported a
running distro as stopped.

When the installed list comes back empty, read the registered distros from
the Lxss registry (default first). If the registry has distros, this host
loses list output, so running distros are read through a console instead,
where wsl.exe still writes them. Only a painted registered name counts: a
blank console or the localized none-running text leaves the answer
unverifiable, never stopped. Only list calls run, so no distro starts.
…rom the newest (stablyai#36024)

* Save native chat state and restore only its journal tail

Publish versioned reducer checkpoints atomically, checkpoint through the chat write queue, and backfill closed chats without retiring journal rows.

Co-Authored-By: Codex <noreply@openai.com>

* Keep checkpoint recovery durable and skip unchanged captures

* Keep journal timer and restart fixtures compatible with checkpoints

* Keep checkpoint performance tests focused on operation contracts

* Remove unused benchmark import

* Restore journal append interception and control Stop fixture time

* Compare saved reducer state without a key assertion

* Supply thread scope in checkpoint test appends

* Prove restored journal consumer paths

* test: exercise restored consumer backward pagination

* fix: pace journal backfill with a monotonic clock

* refactor: keep journal opening cursor checks together

* refactor: project chat journal state in the append transaction

Track isolated reducer mutations and persist keyed changes under a savepoint before adopting committed state. Keep appends working through projection lag and repair coverage on the write lane, including legacy bootstrap.

Co-Authored-By: Codex <noreply@openai.com>

* fix: keep reducer objects live across journal commits

The draft isolates every write until COMMIT, then writes each dirty copy back
onto its original, so submissions, items and queue cards handed out before a
commit keep reading current values as they did with in-place folding. A failed
COMMIT still leaves live state untouched. Also replaces banned Reflect.get uses
and adds braces the lint rule requires.

* fix: bound projection repair and check the invariant after notification

Failed publications and savepoints back off from 1 s up to an hour, reset by a
healthy incremental write or a reopen. open() no longer waits for a legacy
chat's publication; the scheduled repair publishes it on the write lane. A
failed open closes its handle. The equality check runs after commit
notification, only when projection tests opt in or, log-only and sampled, in
development, and it requires the saved coverage to match. Removes the unused
streamed commit argument.

* fix: keep the background projection pass proportional to chats

The orphan sweep reads one state row per chat and clears orphans by session
key. A chat whose fold cannot publish stops at its first damage and is skipped
until its epoch or newest row changes.

* fix: version the keyed projection layout as codec 2

This branch's earlier whole-state layout used version 1; it now decodes to null
and the chat replays.

* test: follow the append-with-fold contract and deferred publication

A submission whose fold throws now rolls back with its receipt before any
dispatch, so those sends are refused and nothing is recorded. The unconfirmed
continuation outcome is pinned through its real cause: the agent admits the
message and no delivery proof arrives. Tests that need saved state right after a
chat opens publish it explicitly, the history reload clears the saved state
covering its edited row, and the codex stream bound matches its capture.

* test: pin projection repair backoff, background pass and N/10N costs

Covers the production repair timer under a persistent failure, a legacy open
that publishes after it resolves, a failed open leaving no timer, a damaged
closed chat skipped until a new row, and equal per-write, reopen, sweep and
closed-chat publication work at N and 10N. Projection tests opt into the
per-commit equality check.

* refactor: inline draft write-back helpers

The repo lint bans object-typed parameters; the copy and write-back now run in
the closure that already holds the wrapped value.

* fix: write a new epoch's saved state in its own transaction

New chats, rollovers and rewinds publish the new epoch's projection beside its
rows, inside the same statement-only savepoint the append path uses, so they
start covered instead of waiting a second for a repair. A projection failure
there still keeps the epoch and leaves the scheduled repair to publish it.

* fix: keep the sampled development check log-only on any failure

A read failing inside the check must not reject an append that already
committed and notified.

* fix: typecheck the draft copy without closure narrowing

Assign the lazily created copy through a local so strict programs that do not
narrow a captured variable after ??= still see an object.

* test: catch whole-table sweeps and an undecodable projection

The sweep contract now records exec statements too and pins its exact keyed
statement list, so a NOT EXISTS scan through exec fails it. A projection whose
item stops decoding fails the per-commit check on coverage although a full
replay still matches. Also fixes two test lint findings.

* refactor: drop draft casts the types can carry

Overlay maps and sets finish from their own typed touched keys, and present map
entries are read through one helper. The two remaining generic boundaries, a
draft standing for its object and finishing back to it, carry the repo's SAFETY
directive.

* test: show a parked damaged chat publishes after a clean epoch replaces it

The replacement ends at the parked chat's newest sequence, so only the epoch in
the skip key re-arms it.

* test: give the seeded queued card its enqueue cursor

Production records queuedAt as the cursor before the queue row; the fixture
now does too.

* fix: catch lagging saved chat state up in atomic pages

Repair of a legacy, lagging or undecodable chat, open or closed, no longer
republishes the whole chat. One runner folds the rows after the saved coverage
onto a private copy of the saved prefix, at most 32 rows or about 1 MiB of row
text per page, and commits each page's changed entries with the new coverage in
one FULL transaction. That transaction first checks the chat's epoch and the
exact saved row the page was folded from, so a page from a retired epoch or a
stale base writes nothing. Pages rest between slices, and the saved prefix is
decoded in pages too.

An open chat runs the pages on its write lane; sends keep committing between
them and skip the projection until coverage reaches the tip, then project
incrementally again. The background pass hands a chat over to its open owner at
a page boundary. Damage parks the chat after the pages before it, and a failed
page keeps the committed ones and retries from them on the existing backoff.
Whole-chat publication now runs only inside epoch transactions.

* test: pin the draft layer's tracked nodes per streamed revision and acceptance

A transition now reports how many objects and collections its fold reached. The
scaling chat gains accepted sends (receipts and aliases) and waiting, dispatched
and returned queue cards at N and 10N. A streamed revision's only growing term
is the card scan, one node per card plus each returned card's body; an echo
also reads every item with its body and every submission.

* test: append the between-pages send by item identity

appendItem takes the provider identity, not its key.

* test: check every catch-up prefix of the recorded Claude and Codex streams

A runner can page single rows, so the recorded streams' aliases, Stop settlement
and per-row timestamps are each checked at a committed prefix against a full
replay.

* test: measure each backfill pass's row reads on its own

The parked-chat test counted its own replay checks: 64 pass rows plus 68, 68
and 100 oracle rows made the 300 CI saw. Each timer window is now measured
alone, and coverage is read from its saved row, so the unchanged pass reads 0
rows and the re-armed one reads one page.

* fix: bound catch-up reads, release the finished prefix, and keep unreadable views

- A catch-up page now stops reading rows at the row whose text reaches about
  1 MiB, so rows past the budget are never fetched and fetched again; saved-view
  item and entry pages use the same budget.
- An open chat drops its private prefix once coverage reaches the tip and keeps
  it only across a failed or parked page.
- A present current-epoch view this build cannot read (another codec version or
  corrupt content) is no longer cleared by the first page. Its whole history
  must fold cleanly through the tip first; otherwise it parks untouched. A
  storage error while reading the view fails with backoff instead of reading
  as a missing view.
- The pace charges only the runner's own work units, so time spent waiting on
  an open chat's catch-up or the write lane no longer lengthens the next rest.

* test: cover takeover, epoch replacement and stop in the middle of a pass

A chat opened while the pass rests is caught up by its own runner from the
committed page; the pass pages it no further and does not charge the wait to
its pace. A replacement leaves its new view untouched, and a stopped pass
resumes after its last committed page.

* test: fail the takeover test without the handover break, and the replacement test without the stale-runner guard

The takeover test asserts the pass asks the open owner only twice for the
handed-over chat, and pins performance.now so the open runner's pace never
waits on a fake timer. The replacement now lands while the open runner is
resting in its saved-view decode, so its page reaches the lane after the
replacement; the test asserts no transaction opens.

* test: read saved-view pages with the page budget, and await database closes

The paged-decode round trip passes the row-and-text budget and checks the
view decoded. Projection, scaling and ACP launch tests await the now-async
test database close, so a closing checkpoint worker cannot close the next
test's database.

* Persist native chat outcomes with a rebuildable cache

Store immutable keyed transition results with canonical ordering, fence outcome epochs, and convert legacy inputs through paced invisible generations. Rebuild disposable caches from validated outcomes and read sparse logical sequence groups without changing the wire.

Co-Authored-By: Codex <noreply@openai.com>

* test: repair the split suites so they parse, lint clean and find their setup

Restores the describe blocks the split truncated, the loop variable it renamed, the
fixture references and imports it dropped, and a stray argument pair. Moves the
grandfathered flaky-pattern counts with the code that moved.

* test: read outcome epochs as outcomes where the adapted assertions read input rows

A replaced epoch restates its Stop in the saved pause marks, the sparse-group batch
test needs an outcome epoch rather than the input-format fixture, and a revised item
keeps its first place, so the held-write order is read from the replayed groups.

* test: expect saved queue cards as whole values in the queue-history assertions

The adapted helpers read card outcomes, which store each card's whole state, so an
import or refusal shows as the card's own state change rather than as an input row.

* style: format the files this PR changed

* test: import each module once in two journal suites

* fix: decode saved outcomes with a frozen format-1 schema, independent of the cache codec

Outcome values decode through a versioned format-1 schema that never follows the live reducer type; an unknown field reads as saved by a newer Orca, and the cache codec only delegates to it, so a codec bump rebuilds the cache and nothing else.

* fix: key outcomes by an integer generation and keep the cache stamp in its state row

Each outcome row names its generation, the attempt's id, instead of repeating the chat id, epoch and a UUID; the cache stamp is a column of the cache's own state row, so there is one stamp to keep in step; cache ordinals are text like the outcomes they copy. Orphaned caches are swept from the per-chat state row with indexed per-chat deletes. The WSL census lists both schema files.

* fix: finalize queue ownership before publishing a new epoch, and reject unreadable outcome rows

Epoch replacement and rollover adopt the committed state, keep attachment claims and finalize the queue receipt before the fallible publication step, as before outcomes. Every persisted outcome row is read back through the row reader, so a row it rejects fails as journal_row_rejected. Publishing an epoch checks the epoch it replaces is still current. A key deleted and re-created in one write moves to the end of the pending changes, matching its new ordinal.

* fix: open a chat synchronously and unpaced, and classify read failures by cause

A user's open reads the cache or rebuilds from outcomes in one synchronous pass, like replay on main, so no background rebuild can interleave with it and nothing paces or bills it. Only an outcome decode failure is damage; a value from a newer format is refused as newer; storage errors propagate as unavailable. Writes derive cache currency from the stamp instead of a latch and ask the maintenance runner when it lags.

* fix: run all journal maintenance through one paced runner per database

One runner serves requested chats first, then lagging ones, one catch-up at a time, open or closed, so an open chat keeps its conversion's progress. A busy or replaced chat is skipped and the pass continues; content that cannot convert parks until the chat's rows change; storage failures back off. Background work alone pays the duty cycle. Conversion verifies the whole input once, then only the outcome tail; cache rebuilds copy outcome pages to the moving tip and stamp from the scalar outcomes.

* test: adapt journal suites to generation-keyed outcomes, the merged cache stamp and the publication order

Queries read outcomes by generation; the bootstrap test expects the queue receipt to finalize before publication; queue-import-scaling states the reopen's constant two key visits when it retries a failed import; append-delivery reads the outcome change index's item ids.

* test: pin outcome format 1 with checked-in rows, and cover open consistency, transient reads and re-created keys

A golden fixture of format-1 outcome rows covering every field and scalar must restore to the pinned chat; a cache codec bump only rebuilds the cache; an unknown field reads as newer. An open between two pages of a cache rebuild reads the whole chat from outcomes. A transient read error during open is unavailable, not damage, and the next open loads the chat. A key deleted and re-created around a new key in one row keeps live order, written or converted.

* refactor: check a converting chat's epoch once, in the catch-up step that runs each page

The catch-up reads the chat's epoch in the same synchronous step as the page's transaction, for conversion and cache rebuild alike, so the conversion's second copy of the check is dropped.

* test: drive the maintenance runner over a real database, each guard killed by a mutation

Startup sweeps, closed chats converted one at a time with a busy chat skipped, an open chat writing between conversion pages, a stop between pages, an epoch replaced mid-conversion, content parked until the chat writes again and then delivered, and a storage failure backed off rather than parked.

* test: N/10N contracts for outcome appends, opens, conversion, publication, idle passes, sweeps, tail verify and wire catch-up

Each counts statements through prepare and exec, rows read per table and rows and bytes written, never time, and requires the same work for a chat ten times larger: a streamed revision, a Codex plan update and an acceptance; a cached open reads no outcome; a conversion page reads one page of input and publication none; an idle background pass reads no history; a retired generation and an orphaned cache are deleted one indexed page at a time; a second verify reads only the new outcomes; a wire catch-up reads only the groups asked for.

* test: shipped builds keep a new or converted outcome chat untouched

The newest release refuses the chat as a newer Orca's and leaves every byte of the database as it was; a build from before that reason opens it read-only with nothing shown, refuses writes, and changes no saved row.

* test: an epoch publication over an epoch the caller did not see is refused, and damage at row 1 still yields to a newer row

Publishing a new epoch checks, inside its transaction, the epoch the caller last saw, and writes nothing when it changed. A chat whose first row is unreadable keeps reading for a newer build's row, as main does, and is refused as a newer Orca's.

* test: old-build probes fold input rows only, and the interrupted-call probe writes inputs

* test: import the state layout once in the cache test support

* fix: type the tail verify's live lookups per collection, and two test call shapes

The tail verify looked keys parsed from stored JSON up in a union of live maps, which does not typecheck; each format-1 collection now has a typed lookup that narrows the parsed key first, and the table is checked complete against the format's collection list.

* fix: wake the maintenance runner for a request or a due retry ahead of the periodic pass

One timer now wakes the runner at the earlier of the next periodic pass and the first due request or storage retry, re-derived from the waiting chats after each pass, so a request after the first pass is served within a second and a backoff retry is no longer replaced by the six-hour pass. A chat whose load swept a retired page keeps its turn instead of waiting for the next pass. Tests drive start(), requests and timers on fake time.

* test: pin the draft's tracked nodes per streamed revision and acceptance at N and 10N

The scaling chat gains dispatched and returned queue cards. A streamed revision's only growing term is the queue card scan, one node per card plus each returned card's body; an acceptance echo also reads every item with its body and every submission. Main's reducer makes the same scans on these rows; the draft adds one node per value reached.

* test: cross-version probes read a new chat's turn end as one outcome sequence, and the kept-card downgrade uses an unconverted chat

* fix: store every new write as format-tagged outcome records after an existing chat's rows, with no conversion

An existing chat keeps its input rows byte for byte; its first write appends one marker row that
shipped builds refuse, and its records follow. New chats hold only their marker and records. Each
record carries its own format and the epoch keeps the highest format it holds, checked before a
cache is used or anything is written. Opening a chat with an input prefix folds the prefix as main
does and applies the records over it, deletions included, keeping prefix keys in place; catch-up
pages the prefix rows, then the record groups. Background conversion and its attempts, staging,
verification and publication are gone; the maintenance runner rebuilds only caches of chats without
a prefix, parks a rebuild on its epoch's records rather than the newest sequence, and looks a
requested chat up by its key.

* test: pin the marker, prefix-plus-records reopen, record admission before the cache, cache-only runner parking and N/10N work

Input fixtures stand for a chat an older build wrote: their input epoch keeps taking input rows, so
the input reader still meets writer-made rows; epochs this build founds are written as it writes
them. Conversion tests give way to a mixed chat whose prefix keys are deleted, recreated and updated
in place, the runner's rebuild parking that later writes never re-arm, and contracts for writing
to, opening and rebuilding chats at N and 10N.

* fix: refuse a chat whose outcome marker is a newer version as a newer Orca's, not as damage

* test: shipped builds refuse an existing chat at its appended marker, its input rows unchanged, and this build reads it whole again

The probe writes three items as input rows the way an older build did, then this build's writes
append one marker and outcome records; the newest release refuses the chat as a newer Orca's with
every byte unchanged, the writable baseline latches read-only at the marker, and the re-upgraded
build reads all six items with the prefix rows as they were.

* test: read the runner's rebuild instances as rebuilds, so the parked-chat test typechecks

* fix: admit saved outcome records and the cache only through a strict storage schema

A saved record or cached value holding a key or union tag this build does not declare, at any depth, now refuses the chat as a newer Orca's before the cache is used or anything is written. The storage schema reuses the wire's shared definitions, completes the keys they leave out (failure facts, senders, edit patches and the rest), and closes every object and open union; string vocabularies and opaque payloads keep the wire's meaning. A compile-time check fails CI when a persisted type gains a key storage does not declare, and a checked-in corpus of every declared shape replaces the schema fingerprint, so an added optional key needs no new format.

* fix: refuse an input row or legacy card holding a key this build does not declare before folding it

Restating a chat on a new epoch is safe only if the open chat holds nothing this build half understands. An input row of a known kind (an existing chat's frozen prefix, with or without outcome records after it) is now checked key by key against what this build declares before main's reader normalizes it, and refuses the chat as a newer Orca's; values keep main's checks and execution options their legacy meaning. A legacy queued card whose saved body holds an undeclared key stays on disk, unadopted, as an unreadable card does. Client sends already arrive through strict request schemas, and their options through a reader that drops choices this build does not use.

Main's tests that kept a newer build's unknown body kind, subject or key readable and writable now expect the refusal; the three that drove a newer Orca's approval or item through this build's own writers are removed, since this build can no longer hold one. A checked-in input prefix pins how this build folds older rows, and every value it folds into is one storage admits.

* test: a persisted type holding a key storage does not declare, nested included, fails to compile

* test: this build refuses a newer build's body or subject kind as a newer Orca's, keeping the row an older build deletes

* fix: fold each outcome write from the row a reload reads, so an annotation the reader drops never fails the strict record write

An ACP usage report with size 0 (allowed by the protocol) reached the model as an unusable window, the strict encoder refused it, and the agent was stopped mid-turn. Main writes that row and drops the annotation on reload; folding the read-back row keeps live state equal to that reload for every annotation the reader drops.

* test: an echo declared without a known original is stored as null, the shape a reload reads

* test: probe the downgrade refusal on both releases in the downgrade window, not only the newest

* test: both releases in the downgrade window write a Claude and a Codex chat through their own writers, and this build admits every row and opens the chat as that release had it

* test: rewind, replacement and rollover of a chat holding old rows, the marker and records keep what the user kept and delete the retired epoch whole

* test: phone and paired catch-up over a chat holding old rows then records, from a cursor inside the old rows, draws as the clients render it

* test: ACP launch decisions read an outcome chat from its cache and from its records alone, and a newer one as unreadable

* Open new and mixed chats from each key's newest record and drop the saved-state cache

The cache copied each key's newest record into a second set of tables and needed stamps, a paced
rebuild, a savepoint fallback and a repair runner to stay usable. The records' key index already
answers the same read: an open seeks from one key to the next, taking each key's newest record
(deletions included) and never reading superseded revisions. A mixed chat still folds its frozen
input prefix first. A send now writes only its records, the epoch's coverage and its receipt, so
any failure among them refuses the send as main's row insert does.

The background runner keeps only the paced sweep of retired generations, its one remaining job.
The cache tables are no longer created; they never shipped.

* Derive an outcome chat's last sequence from its coverage instead of recording it

Every write recorded the sequence scalar beside its own records, about half the records on
streamed paths. The epoch's coverage already holds it, so a read supplies it from there and a write
no longer stores it. Records an earlier build stored still decode.

* test: count strict admission per open, catch-up page and write of an existing chat at N and 10N

Admission walks each input row it reads once (on top of main's parse), and each outcome record it
reads or writes once: the open of a mixed chat walks exactly its prefix rows and admits one record
per key, a catch-up page walks one row per input row it returns, and a write walks its row's
read-back and admits each record it inserts. Linear in what is read, with a constant of one.

* Keep a record that updated a prefix key when a later prefix fold no longer yields that key

A tail record with the prefix ordinal is the key's newest value. If a later
build's reducer reads the old rows differently and no longer produces that
key, the value is appended instead of refusing the whole chat as damaged;
only that key's place can change.

* Resume each sweep page at the generation it is deleting

After a page of records the sweep went back to its start position, so every
later page rescanned every live chat's generation numbered below the retired
one. It now resumes at that generation; a contract at N and 10N live chats
pins that only a pass's first page walks them.

* test: the sweeper rests nine times each page's work

* Start the retired-record sweep from the chat database the attachments already take

The sweep was wired through an optional parameter, so dropping it at the one
production caller would have left retired records forever with every test
passing. It now runs on the required journal database, and a wiring test
checks that installing starts it and stopping ends it.

* test: an existing chat whose first write fails keeps no marker, and the newest release still opens and writes it

* test: chats the window's releases and the oldest release with this chat database wrote are edited, sent to and rewound by this build as the newest release does

Each release writes a Claude and a Codex chat through its own writers. This
build opens it, edits a card the old rows hold (its first write: the marker
and an in-place update), sends, rewinds (every kept message and card saved
again through the strict encoder) and reopens, with every commit restoring
to the live chat. The result equals the newest release's after the same
steps. The oldest release is resolved from tags, as the window is.

* test: the released-chat writer resumes the queue after every Stop it records, and the probe reads each step's result once

* test: the released-chat probe checks this build's edit, send and rewind on its own result

Comparing the carried chat with the newest release's would fail the required
cross-version check for any legitimate main change to those flows until the
next release ships. The probe still admits every released row, opens the chat
as the release and the newest release do, keeps the release's rows byte for
byte with one marker, and restores to live after every commit; after that it
checks the edited card, the accepted send and the rewind's survivors. The
oldest release with the per-host database is named directly: it never changes.

* test: the golden input prefix holds data in every keyed collection

Six collections folded empty, so a change to how old rows derive their keys
went unnoticed there. Eight rows v1.4.245 wrote through its own journal (an
item with an execution owner, a declared echo, a removed turn, and a queued
card handed over with carried history, then cancelled in doubt) follow the
existing rows unchanged, and the test now requires every collection to be
non-empty.

* Say once, beside the marker version, that the reading of old rows under it is frozen

The fold comment claimed an unheld prefix-ordinal value only moves that key;
a prefix read differently can also show a key twice or bring back one the
tail deleted. The marker version now states the rule: a build that reads old
rows into different keys or values keys that reading off a new marker
version, and duplication or resurrection is never intended.

* test: the released-chat probe compares what the release wrote, not fields this build adds

The open check compared whole snapshots, so a field main starts setting would
fail the required cross-version job until a release ships it. It now compares
the release's items, sends and cards, in order and by value, allowing added
fields; the byte-identity and restore-equals-live checks are unchanged.

* test: say why the first-write-failure downgrade test needs a longer timeout

* Type the open-union fallback check by schema, not a bare object

* Check each outcome-format key set separately so no check reads as a redundant union member

* Read an open or branded string as a value in the storage key check, not as an object

* Decode each newest outcome record from the value admission parsed, without parsing or walking it again or keeping its text

* Match each encoded record to its change by position, so a settlement batch's encode stays linear in its mutations

* Encode each changed value as the draft holds it, without reading it through the draft's tracking

* test: rewind, replacement and rollover restate a chat with fixed statements and work linear in what they restate

---------

Co-authored-by: Codex <noreply@openai.com>
…6625)

One table-driven test keeps every concise orchestration list row short when stored text is huge. Concise run-list cuts each Run's objective to one line of at most 160 characters; --full is unchanged.
…everywhere they render (stablyai#36575)

Markdown preview, the rich editor and .mmd/.mermaid files now get the same
expand button that comment diagrams already had.

Co-authored-by: Claude <noreply@anthropic.com>
…non-official plugin (stablyai#36271)

* plugins: ask "Make sure you trust <publisher>" before installing any non-official plugin

* plugins: show the derived publisher in the install trust dialog

* plugins: rebase install trust dialog onto main; register its copy as protected
…blyai#36522)

* Make explicit hosted review refresh read current provider state

* Name the right provider and keep GitHub's own copy when a Checks refresh fails

A failed manual refresh now names the repo's provider (from the review, its link, or the remote), clears once a newer read lands for the panel, never stops GitHub checks and comments from refreshing, and gives way to GitHub's classified sign-in or rate-limit copy. The copy is one interpolated line in every locale.

* Read after the write when Orca merges, closes, reopens or edits a GitLab MR

Every GitLab merge request write now drops the host's cached review lookups for the repository, and the Checks panel's follow-up read can't join a poll that began before the write, so merging in Orca shows Merged and Delete Workspace without a manual Refresh. A user refresh also forgets Gitea's shared repository scan before reading.

* Clear a failed Checks refresh only on a real provider read

The host now tells the desktop store, when asked, whether its answer came
from a provider read it stored as current or from a cache or last-good
fallback. The Checks panel keeps a failed Refresh until such a read lands,
a click succeeds, or the context changes. On GitHub the PR read owns the
refresh status, so a failed review-card read no longer raises the generic
failure.

* Don't let a joined host lookup clear a failed Checks refresh

A poll that joins a lookup already running for an earlier request didn't
start that read, so its answer can't show the provider recovered after the
failure. Only the request that started the stored lookup reports a provider
read now. The host read also uses the shared reply outcome directly, and the
renderer writes the provider-read generation where it publishes the entry.

* Type the Checks refresh breadcrumb for every review provider

The breadcrumb already received Bitbucket, Azure DevOps and Gitea values; its
annotation now says so. Tests build typed fixtures instead of asserting types.

* Test the read-outcome reply at IPC, RPC and runtime, and the post-merge read

The flag reaches the runtime, and only a caller that asks gets the envelope,
including for a definitive null. After Orca merges, the card read starts after
the write, and its failure leaves the merge reported as done.

* Use a boolean for the empty-state fixture's remote-operation flag

* Trim redundant hosted-review refresh tests

* Keep the signed-out GitHub empty-state test
…#36629)

* test: remove low-value suites and cases

* test: shrink flaky-pattern counts after case removals
…yai#36637)

Drop the hand-written per-language samples. Try it now opens an empty
untitled<first extension> through the existing untitled-file flow, so the
grammar highlights what the user types. Custom editors with newFiles keep
their template-seeded new file.
…yai#36642)

Adds the README link (stablyai#36527) and 'Show all N plugins' strings, plus every
other plugin UI string still falling back to English, to de, es, fr, ja,
ko, pt, ru, tr, zh and zh-Hant.

Co-authored-by: Claude <noreply@anthropic.com>
* fix(native-chat): release idle completion feed owners

* Add braces to completion feed lifecycle checks

* Cover completion feed attention and mounted consumer lifetimes
* Share chat option writes across desktop and phone

* Restore main's failure notice scope for chat option picks

Held launch refusals toast again while the transport is still closed, desktop
notices follow only the chat's presentation scope so a fence or status change
on the same chat still reports, and the phone banner no longer depends on the
read record.
…, Settings toggle, Cmd/Ctrl+Enter to send one now) (stablyai#36588)

* Advertise mid-turn queueing as queued-messages.v2

Released clients read the v1 name with an unfinished queue UI; they never
see v2 and keep sending immediately.

(cherry picked from commit f39382e)

* Let each desktop send choose queue or steer while the agent works

The follow-up choice is now a Queue / Steer setting saved under
nativeChatFollowUpBehavior, Steer by default; the old
nativeChatQueueFollowUps switch, which every install saved as true
while queueing was dark, is retired on load. Every reader goes through
native-chat-follow-up-behavior.

While the agent works, Enter follows the setting and Cmd/Ctrl+Enter
sends the draft the other way; the alternate flips the setting before
the queue's own rules (a waiting command still queues, prompts no one
here can answer still send now) and never applies while Stopping.
Cmd/Ctrl+Shift+Enter steers the head card only and leaves the draft.
An idle agent's card reads Send, and the card menu no longer offers
"Turn off queueing".

(cherry picked from commit 55b4869)

* Hold Send on the phone to queue or steer a message mid-turn

While the agent works on a host that queues, holding Send opens a
Queue / Steer sheet; a choice other than the host's setting sends the
alternate, resolved against the chat as it is when it lands, by the
desktop's rule. Release and dismiss send nothing. The phone reads the
host's new follow-up setting (absent reads as Steer), and an idle
agent's card reads Send.

(cherry picked from commit db87cf5)

* Read the follow-up default from one place on desktop and phone

(cherry picked from commit 8e1438b)

* Keep phone follow-up choices aligned with live host state

(cherry picked from commit dc9215b)

* Update stream and wire fixtures for live follow-up preferences

(cherry picked from commit e4d038c)

* Document minimal runtime test fixture assertions

(cherry picked from commit 254f751)

* Keep mobile preference tests in the mobile compiler project

(cherry picked from commit ae2aa89)

* feat(native-chat): queue follow-ups by default with a toggle

(cherry picked from commit 70969d6)

* test(mobile): assert shared preference renders on real changes

(cherry picked from commit 3f50de9)

* Remove obsolete follow-up option translations

(cherry picked from commit b87b360)

* Describe Cmd/Ctrl+Enter relative to the Queue follow-ups switch

The Settings description said Cmd/Ctrl+Enter sends into the running
turn, which is wrong while the switch is off. Describe it as doing the
opposite for one message, in every language.

* Show what a mid-turn phone Send does, and offer the other way only when it differs

While the agent works, the phone's Send button now shows Queue or Steer.
Holding it lists that action first with a check and the other second,
each with a one-line description, and appears only when both choices
would actually lead to different sends. A waiting command or prompts
nobody here can answer make a hold behave like a tap.

* Steer the head card once while its shortcut is held

Holding Cmd/Ctrl+Shift+Enter auto-repeats the key, which steered each
card that became the head in turn. Ignore the repeats.

* Show beside Stop what Enter does while the agent works

While a turn runs and the draft has something to send, a send control
now sits beside Stop. Its icon and label say whether Enter queues the
message or steers it into the running turn, and its tooltip names Enter
and, when it would send differently, Cmd/Ctrl+Enter. Clicking it sends
as Enter does. Stop keeps its place and nothing changes while Stopping,
with an empty draft, or before the host says it queues.

The phone and desktop now read what a send does from one shared helper
over the send's own resolver.

* Test the send keys and Queue follow-ups search against real wiring

One desktop test drives Enter and Cmd+Enter through the real composer,
transport and session to the outgoing send and checks its delivery with
queueing on and off. Settings search is checked against the capability
list this build's host advertises.

* Move the composer's send-hold check into its own helper

The pane had grown past the file length limit after the main merge.

* Disable the mid-turn Queue/Steer button whenever Send would be disabled

While an image is still loading, another device holds the input, or a send is blocked for a stated reason, the button beside Stop is now disabled and says why, the same way the idle Send button does. Before, it stayed clickable and a click did nothing.

* Hide the mid-turn Queue/Steer button in goal mode

In goal mode Enter sets the goal, so a button promising to queue or steer the message was wrong. It is now hidden there, as it already is while editing a queued message.

* Fix the Russian queue hint to say the message runs after this turn

It read as queueing until the end of this turn.

* Stub window.api without a type assertion in the Queue follow-ups settings search test

* Pass sendHeld to the composer field in tests and drop an unknown setting from the German Queue test

* Let Cmd-click (Ctrl-click elsewhere) on the mid-turn Queue/Steer button send the other way, like Cmd/Ctrl+Enter

The button shows the other action while the modifier is held, and its tooltip names the click. Only when the other way would send differently; otherwise a modified click is a plain send.

* Merge the duplicate composer-types import and give the composer's round buttons a Button size instead of restyling them

The focused code-quality check rejects importing one module twice, and the design-system check rejects rounded-full on a <Button>, which the new Queue/Steer button copied from Send. Both composer buttons now use a round icon size on the Button primitive and render as before.

* Share one window key listener across every chat's Queue/Steer button, and count Cmd/Ctrl as held only from its own key press

Each mounted chat with a mid-turn draft used to add its own window key listeners, so every keystroke did work per chat, hidden tabs included. One shared listener set now serves them all and wakes a button only when the held state really changes.

Other keys can now only clear the held state, so a dictation paste that leaves the Cmd flag on later key events no longer flips the button with Cmd up. Also tests the Ctrl-click on Windows and Linux.

* Remove the desktop Queue/Steer button shown beside Stop while the agent works

While the agent works, the desktop composer goes back to its usual
controls: Stop, with Enter and the send shortcuts doing what they did.
Enter still follows the queue setting, Cmd/Ctrl+Enter still sends one
message the other way, and Cmd/Ctrl+Shift+Enter still steers the first
queued card.

This also removes what only that button used: its Cmd/Ctrl-click
alternate, the shared Cmd/Ctrl key listener, the extra round Button
size, the send-preview value the desktop session passed to the
composer, and the button's text in every language. The phone is
unchanged.

* Put the composer's send-hold checks back inline in the pane

The separate send-hold helper only existed because the removed mid-turn
Queue/Steer button pushed the pane over the file-length limit. Without the
button the pane fits again, so it goes back to main's inline code.
…can stop (stablyai#36612)

* fix(windows): stop each WSL host's server on uninstall so its distro can stop

Uninstall released the holders but left orcad and any live terminals
running, which kept the distro (and its VM) up indefinitely. The existing
--orca-uninstall-release-wsl-holders preflight now also runs Remove host's
teardown for every recorded host whose distro is confirmed running, driven
through orcad's own CLI inside the distro: close terminals, count, then the
instance-checked decommission that retires an idle daemon. Stopped distros
are skipped, each stop is bounded at 15 s, and nothing changes the exit
code. NSIS now also launches the preflight when WSL host records exist.
Grok removal also cleans the rolling .bak of Orca's hook file.

* fix(windows): list up to 1000 terminals when uninstall stops a WSL host

* fix(windows): leave WSL host servers running while another Orca install remains

The HKCU/HKLM twin shares this userData, its WSL host records and each
distro's server. NSIS now adds --orca-uninstall-stop-wsl-servers only when
ORCA_OTHER_INSTALL_STATE is none, as the agent-hooks removal already does;
the preflight stops servers only with that flag. Holder release is unchanged.

* fix(grok): clean the hook backup without sync fs on the quit path
…kouts (stablyai#36657)

* fix(test): keep unit-test tooling inside the repo root in nested checkouts

Vitest's oxc tsconfig auto-discovery walks past the repo for files no
in-repo tsconfig owns, so a worktree nested in another checkout loaded
the enclosing checkout's tsconfig. Pin the transform tsconfig to an
explicit solution file listing the same projects auto-discovery finds.

The local module cache policy hash failed on esbuild warnings from an
ancestor package.json; only warnings located inside the root now fail.

* fix(test): guard the pinned transform tsconfig against project drift

Drop docs/site (no unit test transforms it) so its tsconfig cannot break
every transform, and fail when a project tsconfig is added or removed
without updating the pinned solution.
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 31, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-31T10:07:31.695223Z fbc4885 PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: fbc48858f6

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@kiwidream

Copy link
Copy Markdown
Author

CONFLICTING, as predicted. The automation resolved all 15 conflicted paths and three hidden breaks on a local sync/upstream-20261031 branch. It then stopped before committing, for one operator decision: #76, upstream's helper-ID session binding (stablyai#36324, stablyai#36349) vs #30's retained rows. Three new upstream tests fail on the merge and pass on pristine upstream, and every way of making them pass changes what #30's retained rows do.

Nothing was committed or pushed, and swaplabs/main is unchanged at 0d270950b7. This PR stays open until a sync branch replaces it. #76 lists every resolution, the validation run on it, and the commands that finish the merge once the decision is made.

@kiwidream

Copy link
Copy Markdown
Author

Superseded by #78 (sync/upstream-20261031), which merges the same upstream commit fbc48858f6 after the operator's decision on #76. This PR's head is the mirror main, which takes no commits.

@kiwidream kiwidream closed this Nov 2, 2026
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.