Skip to content

chore(integration-builds): 同步上游 8cd6a7e5ee(3216 个提交) - #78

Merged
Fartown merged 3241 commits into
fork/integrationfrom
sync/upstream-20261102
Nov 3, 2026
Merged

Fartown merged 3241 commits into
fork/integrationfrom
sync/upstream-20261102

Conversation

@Fartown

@Fartown Fartown commented Nov 3, 2026 •

Copy link
Copy Markdown
Owner
Files Added Deleted Net
Test 788 $\color{#1a7f37}{\Huge{\mathbf{+}}}$​37532 $\color{#cf222e}{\Huge{\mathbf{−}}}$​61619 $\color{#cf222e}{\Huge{\mathbf{−}}}$​24087
Prod 2212 $\color{#1a7f37}{\Huge{\mathbf{+}}}$​110259 $\color{#cf222e}{\Huge{\mathbf{−}}}$​185754 $\color{#cf222e}{\Huge{\mathbf{−}}}$​75495

把上游 stablyai/orca 从 2eae220b2e 同步到 8cd6a7e5ee,共 3216 个上游提交,所有已登记的 fork 功能都保留。这次同步主要是为了带进上游 stablyai#36315:手机端从历史恢复一个正被聊天占用的会话时,不再只留下一个空终端。

Important

合并时不要 squash,也不要 rebase,否则上游合并提交会丢,下次同步会重新冲突一遍。CI 通过后用 merge commit 合入,或者把同一批提交直接快进推到 fork/integration。

冲突怎么解的

  • 179 个冲突(其中 15 个是 fork 改过、上游删掉的),按功能分 7 组解完。之后 pnpm sync:upstream 又无冲突地自动合进了两批上游提交。
  • 下线 cli-writer-login-shell:上游现在只在确认 CLI 写入进程还活着时才拒绝。
  • 上游搬走的接缝已重新登记,并同步更新了架构策略。
  • 11 个超出行数上限的上游文件,把其中的 fork 代码移进了功能自己的模块。
  • 各功能检查里有些测试因上游的有意改动而过时,已按功能逐个修正,每个功能一个提交。

推送前的复核

对每个冲突文件,比较旧基准、合并前的 fork、上游、最新上游和合并结果,找出 fork 新增后来没了的行、上游新增后来没了的行。84 个文件有疑似丢失,逐个核对后确认两处真丢了,都已修好:

  • fix(session-tabs-publication-lineage):浏览器标签退役时改用上游 fix(mobile): keep unmounted desktop browser tabs visible and closable stablyai/orca#31665 的 epoch 规则。之前合并保留了 fork 的旧写法,丢了上游对 headless 发布的处理。
  • ci(integration-builds):上游新加的两个缓存预热任务用了 blacksmith runner 却没判断仓库,在 fork 的定时任务里会一直排队。现在只有 stablyai/orca 才用 blacksmith。

其余都是代码搬了位置、改了写法,或已被上游的同类实现取代。

推送前跑 check:changed 时,又发现两处是上游新加的约束碰上了 fork 已有的代码,也已修好:

  • fix(local-tasks):上游新加了「memo 组件里的翻译要订阅语言版本」的规则,LocalTaskList 和 LocalTaskRow 没有订阅,切换语言后文字不刷新。
  • fix(terminal-launch-diagnostics):上游新加的单测要求冷恢复重试的工作量有上限,fork 的启动诊断每次重试都扫两遍全部标签。现在每个窗格只扫一次,上游文件里的这段调用也从 11 行收成了 1 行。

验证

  • pnpm tc、check:fork-features、check:fork-docs、check:architecture-policies 通过。
  • 桌面端 3 项、手机端 2 项本地化门禁通过,运行时英文目录检查也通过。
  • 各功能登记的检查共 46 条,45 条通过。唯一失败的 win32-test-lane-registration 是被本机 git 忽略的 tmp/tasks 干扰,CI 上没有这个目录。
  • 用当前上游复查过,这次合并没有丢掉上游测试。
  • 以 Fartown/main 为基准跑了一遍 check:changed,范围是 fork 相对上游改动的 1575 个文件:
    • 通过:类型检查、格式、oxlint、各项 ratchet、本地化。
    • 代码质量:报出 132 条类型断言和设计系统规则的问题。逐行追溯过,每条都是同步之前就有的 fork 代码,没有一条是这次引入的。PR 里 fork 专用的那步扫描不包含这两类规则。
    • 单测:跑满 30 分钟上限被截断,没有全部跑完。修掉上面那条重试工作量的问题之后,剩下的失败都在不涉及 fork 代码的测试里:编出来的 CLI 是 10 月的旧产物、macOS 启动器、开发模式重编译监听。另有两条是负载下超时,单独重跑能过。全量单测以本 PR 的 CI 为准。
  • 最后一次修改后,又对最新提交增量跑了 check:changed,29 项全部通过。
  • 上游新加的全量 lint 本机也跑过。它的 ast-grep 那项已被后面的修正提交修好;代码质量那项就是上面这批同步前就有的问题。

还没做

  • 打包后逐屏截图(富文本回退横幅、本地任务标签、手机端圆角等),以及在 SSH 主机上实机验证。
  • 全量单测由本 PR 的 CI 来跑。
  • 上游已经覆盖了一部分作用、是否下线待定的功能:mobile-terminal-surface-recovery、remote-host-path-open。
  • 疑似问题,需要实机确认:合并后,remote-host-path-open 打开的标签读文件用的是 fork 的 grant,保存时会换成上游新发的 grant。保存后再用旧 grant 读,可能因为文件已变而失效。
  • feat(local-tasks): 统一任务工作流、总管与会话速览 #76 合入前需要基于新的 fork/integration 更新。

🤖 Generated with Claude Code

brennanb2025 and others added 30 commits November 1, 2026 10:26
…tablyai#37095)

Reading an agent on the desktop rebuilt notification ids for turns that
never alerted (every chat pane, silenced workers) and forwarded each one
to the phone as a silent dismiss push plus a dismissal-store record.
Only forward a clear when the store holds a live delivery for that id.
…dev watch shot pendingRequests (stablyai#37090)

- shot <key|dir> --scenario <name> renders the panel in that check scenario through the check
  runner (a separate Node process on a mock host and mounted worker), sends the validated drawn
  tree to a new plugins.shotReplay, and captures it in a throwaway preview surface: no guest,
  no live host, no real storage or settings, no real worker, images as placeholders. Window
  hidden or minimized only; --act, --environment and bridged shells refused; an older host
  answers method_not_found (runtime_unsupported) rather than doing a live shot.
- dev watch's shot event carries pendingRequests.
…stablyai#37050)

The Commits list now stops where the branch left its base. It groups
commits into Not pushed (hollow dots, with Push) and On origin, ends at
"Branched from <base>" with Update branch, and loads more past 50. A
commit opens its own page: message, author, date, pushed state, files
with +/-, and Copy SHA / Open on GitHub in the menu.

Older hosts ignore the new params, so the list falls back to the full
history without groups or the base marker.
… the diff screen (stablyai#37073)

* feat(mobile): GitHub threads, viewed sync and line comments on the diff screen

Committed files of a GitHub pull request now show its review threads under
their lines with Reply and Resolve, take their viewed state from GitHub and
sync the checkbox and Viewed · next file back through setPRFileViewed. A tap
or a long-press drag picks lines and opens a sheet that sends the note to
the workspace's agent through the existing send path, or posts it as a
review comment. Threads and GitHub comments appear only while the local
branch is at the PR head, the same contents desktop shows them on;
otherwise the file says to push. openDiffForFile takes an optional line for
a thread's Open in diff.

* test(mobile): use a type import for the line-mutations recording adapter

* fix(mobile): name the staged or unstaged side in the jump sheet's file labels
…new tabs (stablyai#37102)

* fix(browser): open target=_blank links from streamed server pages as tabs

Headless serve pages have no renderer, so a page's new-tab request was
denied. The runtime now opens the link as a tab beside the page, in front
only for the paired client whose click or key press opened it.

* test: add the offscreen tab opener to browser manager fakes

* test(e2e): drive the blank-link check through the host client

* fix(browser): credit a link only to the client whose input opened it

A click waiting in the page's command queue keeps its client until it is
delivered, input with no paired client clears an older one, and an
unattributed link no longer moves the agent's tab.

* refactor(browser): credit link opens from the page's command queue

Record the paired client at the bridge's per-page command lease, which
sees the resolved page and every command kind, instead of in four RPC
handlers. A page without a workspace keeps denying new-tab links.

* fix(browser): credit a link to the client whose click reached the page

Credit at the guest's activating input, under the popup owner's tab, to
the command delivering it, so a watcher's scroll can't claim an agent's
link. Announce a background tab at once since bridge selection no
longer does.

* fix(browser): credit a phone's DOM-activated tap before it runs

A tap with a touch radius clicks the element through Runtime.evaluate,
which fires no guest input event, so credit the tapping client first.

* test(e2e): assert the blank-link tab through the page, not the store

* refactor(browser): simplify page-link credit and tab opening

The queue owns the page command credit instead of the agent lease, the
credit skips work while idle and shares the gesture's freshness rule,
one opener serves both link paths, and one opensPageLink marker replaces
the paired follows/leavesAgentTab flags.

* test(e2e): give the blank-link spec's timeout its reason
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
…simulators in the picker (stablyai#37122)

Same-named simulators on different iOS runtimes looked identical, and records whose runtime is gone could be picked and then failed to connect. The pane already received runtime and isAvailable from simctl; the toolbar ignored both.
Tapping a file on the commit page now opens the shared diff screen for
that file in that commit (openDiffForFile kind 'commit'), in today's
Commits tab and inside the hub's Commits page.
)

* Preserve rich Markdown viewport through bare focus returns

* Retire viewport ownership on editor remount

* Complete no-op navigation and body Tab coverage

* Keep patch metadata keys separate from dependency snapshots

* Retire the viewport before root detach callbacks

* Give the engine writer fixture its native selection

* Keep native focus navigation current in Markdown

* fix: leave smooth Markdown scrolling to native focus cancellation

* Cover focus wrapper removal and routed Markdown writers

* Type the viewport scroll spy and mark the focus-recovery wait as deliberate

* Scope Markdown viewport wheel and touch guards to the editor scroller
* Route hosted review refreshes to their owning host

* Route remote review operations to their owning host

- Refresh the correct hosted review after remote git operations
- Scope comment mutations and AI acknowledgements to the owner cache

* Route legacy paired SSH reviews through their server owner

- Recover proxied runtime owners for older SSH worktree listings
- Preserve direct and ambiguous host routing safeguards

* Preserve review ownership across remote workspace operations

- Route checks, comments, and linked-review clears through the selected repository owner
- Reject ambiguous or mismatched host context to prevent cross-machine mutations

* Keep check detail tabs scoped to their remote owner

* Preserve remote worktree ownership across reconstructed check tabs

* Preserve direct SSH check tabs when proxy listings overlap

* Scope PR refresh ownership state and safely roll back comment mutations

- Preserve linked-review clear scopes beyond cache eviction and clean them up on expiry
- Handle failed or refused comment reactions and thread resolutions without stale optimistic UI

* Preserve remote review ownership when SSH copies overlap

* Fix review routing for overlapping remote repository hosts

- Preserve server-owned review refreshes when a direct SSH copy exists
- Fail comment mutations and refetches safely when ownership becomes invalid
- Resolve check and sidebar data through the workspace’s owning host

* Relax cache-sensitive test expectations

* Route check refreshes to runtime owners and isolate restored requests

* Scope reconstructed check detail tabs by execution owner

* Fix review refresh ownership for shared remote hosts

- Prefer explicit execution owners when matching worktrees.
- Avoid repeated tab scans when restoring check details.

* Fix hosted review polling for workspaces on multiple hosts

* test: trim redundant review ownership scenarios
…i#34913)

* fix(emulator): preserve iOS helpers when ps output overflows

* fix(emulator): preserve orphan helper cleanup

* refactor(emulator): read helpers with one ps call at the shared buffer ceiling

---------

Co-authored-by: Kelvin Amoaba <97001695+AmoabaKelvin@users.noreply.github.com>
* feat(chat): show split shortcut in pane header tooltip

* Show split chat shortcuts clearly in tooltip
* Make the empty omnibox caret thicker and faster

* Soften the empty omnibox caret contrast

* Fix moved structured session imports in lifecycle test
…tablyai#36848)

* Show a card in the chat when its agent hands work to another agent

An agent that hands work off with 'orca agent launch' from a native chat
now leaves a 'Handed off to agent' card there, linking to the new chat or
terminal, the way a supervised worker-start leaves 'Started worker'.

The CLI names its chat on agent launches (same-host only); the host records
a display-only agent-handoff item after a successful launch with a submitted
prompt, once per launch operation. Nothing about the card can refuse or delay
the launch.

Tracked in STA-13209.

* Keep orca commands working in a native chat that has no terminal handle

The launch-caller evidence read the host stamp off an absent evidence object, so every orca command from an ordinary native chat threw before sending. Adds CLI tests for which requests name the launching chat, restores the lockfile to the base, and fixes the Korean heading.

* Read a card's heading from its creation flags together

A caller passing only the started flag drew a handoff as Started worker; the heading now takes the message's flags as one argument.

* Show the handoff card for every agent a chat launches

A launch without a delivered task now records the card too, with no task text, as the common pattern records every agent a chat creates. The handoff tests now run the real chat host and journal: one card per launch operation, none on replay, a removed card stays removed across a restart, and the clock is fixed.

* Head a launch card Started agent when no task reached the new agent

Handed off to agent now appears only when the card carries a task; a card for an agent started with no task (no prompt, a draft, or a prompt that wasn't delivered) reads Started agent. The heading is derived from the card's text, so nothing new is saved. Also drops a self-launch check the launch path already refuses first.

* Show the handoff headings on the phone's agent cards

The phone card passed only the started flag, so with the new heading rules it would draw every creation card as a plain message. It now passes the message and has a heading for every case, so a missing one fails the build. The heading function now requires the message's creation facts, so no caller can leave them out. Adds the phone strings in every language, and the Japanese "Started agent" now uses the catalog's term for agent.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…blyai#37128)

* fix(emulator): detect Android devices with only adb installed

SDK discovery required both adb and the emulator binary under an SDK
root, so hosts with platform-tools only, or a standalone adb such as a
distro android-tools package, saw no Android devices at all. Discovery
now needs only adb, falls back to adb on PATH, and AVD listing and boot
are skipped when the emulator package is missing.

Fixes stablyai#32126

Co-authored-by: s546126 <268420947+s546126@users.noreply.github.com>

* test(emulator): drop type assertion in adb-only inventory test

---------

Co-authored-by: s546126 <268420947+s546126@users.noreply.github.com>
…yai#37104)

* feat(mobile): one next-step bar under both Source Control tabs

Changes and Pull request are the only segments. A bar at the foot of both
shows the branch's one next action: the commit box, push or pull, create
the review, resolve or fix with the workspace's agent, merge when ready,
merge, or why it can't. Commits opens as a pushed screen.

* fix(mobile): keep Merge reachable and show bar failures on both tabs

* test(mobile): expect the two Source Control segments in the page render test
…i#37139)

The pane's keyboard only sent serve-sim HID frames over the iOS WebSocket.
Android sessions have no serve-sim socket, so every key was dropped and every
paste failed with "device is not ready".

Android panes now send typed characters, paste and editing keys over a new
emulator:scrcpyKeyboard IPC beside emulator:scrcpyTouch, keyed by the streamed
serial. Main writes them straight to the live scrcpy control socket (text
injection, and keycodes with SHIFT_LEFT held for Shift), so keys keep their
order with touches. iOS keeps the HID path.
…ai#37118)

* fix(chat): move forward readers to the covered tip after a no-op save

A write whose fold changes nothing stores no outcome record, so its
sequence never appears in a forward read. Readers placed themselves at
the last returned row and stayed behind the live cursor, so open chats
re-read an empty page and recomputed the prompt projection on every
later delivery until the next real save.

Forward journal reads now report the highest sequence they covered.
History pages move there when the read was complete, prompt reuse and
native responses compare against it, and a read cut short by its limit,
byte budget or damage still stops at the last returned row.

* fix(chat): append unlimited outcome reads without spreading, and report coverage from the mobile journal fake

* fix(chat): skip the retention scan for batches that change no journal items
…fault (stablyai#37043)

* fix(wsl): the Codex quota poll gates the distro it probes, not the default

The poll's gate asked whether the wsl -l default was running, then the
home lookup resolved its own default (and could name an account home in
another distro), so the probe could start a stopped distro the gate never
read. The distro is now resolved once, gated, and pinned for the home
lookup; a home in any other distro skips the poll.

* fix(wsl): pin the gated distro for paths only; keep the account lane

Pinning the resolved default into the target also moved the account
lookup off the default lane, so a default-lane account read the system
home. The distro is now pinned for paths and probes only: the account is
that distro's lane, then the default lane the target named. The default
distro comes from resolveWslDefaultDistro, as the exec gate's does.

* fix(wsl): the pinned quota poll reads the account lane launch reads

Drop the default-lane fallback: a pin names the distro, so the account is
that distro's lane, exactly as launch reads its named target. The test now
asserts the poll and launch's own home lookup agree.
…tablyai#36999)

The PR tab now leads with the PR's identity, one row per merge gate
(checks, unresolved threads, approvals, conflicts) that opens the screen or
sheet that resolves it, a changes card and a collapsed description. Close,
Unlink, Auto-merge, Edit title and Copy link move into the ⋯ menu.

Checks and Comments become pushed screens: failures open with their
annotation and Fix / Rerun / Open / Log on the failure, running checks
next, passed folded; comments filter by Unresolved / All / Hide bots with
Resolve and Reply on each thread and a comment box at the bottom.

Merge opens a sheet that lists only the methods the repo allows, starting
on its default. Reviewers move into a sheet with search to add and remove.

Every Create PR entry point opens one sheet: title and description seeded
from the branch's commits (shared seed rule in src/shared, GitHub's own
default), Write with AI, base picker and draft. It pushes first when
needed, works for all five providers and lands on the PR tab for GitHub.
* docs: add a Risk section to the PR template

* docs: keep the change to the PR template
* Allow automation CLI setup choices for new workspaces

* Explain automation --setup refusals and read back the saved choice

Name why --setup is refused and what to pass, show the setup choice in
text output, document --setup in the CLI guide, fail when a host drops
the choice, and cover the app-open Terminal dispatch.

* Refuse automation --setup on hosts that can't keep it, and fence the edit's mode

Explicit --setup now needs the host's new setup-choice capability, checked
before any write; commands without --setup are unchanged. An edit whose
setup choice relies on the current new-per-run mode sends a mode
precondition the store checks against the saved record, so a concurrent
switch to an existing worktree refuses the whole edit. Text output shows
the saved choice or "not set", the existing-workspace refusal offers a
remedy that works for every input, and the after-write readback is gone.

* Make the too-old --setup message true for edit and cover a saved setup edit

Omitting --setup on edit keeps the saved choice, so the refusal now says
to run the command without --setup. A new test saves a --setup run edit
through the controller into the store and reads it back after reload.
…he agent to fix bot findings (stablyai#37023)

The PR tab and the Checks and Comments screens refresh by themselves while
they are open and the app is in the foreground, on desktop's checks-panel
cadence (policy moved to src/shared). A failed background read keeps the
PR on screen and backs off instead of replacing it with an error.

Review threads show the lines they are about: the host forwards the tail
of each thread root's diff hunk, and mobile numbers it back from the
thread's line. Bot findings get "Ask <agent> to fix", which launches
desktop's Resolve comments prompt (moved to src/shared) for that thread.
Fix and Ask buttons name the agent that would start.
…rking Connect (stablyai#37146)

* fix(emulator): show a dead Android preview as disconnected so Connect restarts it

When the scrcpy session ended, the video registry dropped its subscribers silently and a later subscribe was a no-op, so the pane kept saying Connected over a blank 'Stream disconnected' screen with no way to retry. The registry now tells subscribers the session ended, the IPC relays it on the stream error channel, and the pane marks the session disconnected so the toolbar's Connect button restarts scrcpy.

* fix(emulator): retry a lost Android preview by AVD name and keep stale errors off new streams

* fix(emulator): keep a live emulator serial and fall back to its AVD name only once it is gone

* fix(emulator): keep the AVD target across failed reconnects and reused serials

* fix(emulator): reboot a vanished emulator by AVD name only when the host no longer finds its serial

Replaces the pre-attach device refresh: the live serial always goes first, and the AVD name is tried only after the host answers emulator_device_not_found.

* refactor(emulator): read the host error code plainly in the AVD fallback

* refactor(emulator): type the attach result without a cast and derive WebCodecs support in render

* fix(emulator): type the fallback test's attach result and allowlist the WebCodecs diagnostic
OrcaWin and others added 29 commits November 2, 2026 04:50
* test: remove low-value renderer and terminal tests

* test: align floating tab geometry with content-fit sizing
Merge stablyai/orca main a444233 (3201 commits since 2eae220) into
fork/integration. 179 conflicts resolved feature by feature on top of the
upstream code; every feature in config/fork-features.jsonc keeps working.

- Seams follow upstream file moves (native-chat/, worktree-jump/,
  agent-status/, mobile-web-app/, ipc/pty/spawn-execute, skill-guides
  artifacts.md); registry and architecture policies updated to match.
- Retire cli-writer-login-shell: upstream now refuses only a CLI writer
  process observed live, so the login-wrapper root-pid misjudgement is gone.
- Fork code adapted to renamed upstream modules and APIs; catalogs, RPC
  params and bundled skill guides regenerated.
- Fork mobile strings localized for upstream's new mobile i18n gates.
- Keep files under max-lines by moving fork lines out of listener-state.ts
  and NativeChatStructuredSession.tsx without changing behavior.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Mobile catalogs, adapted upstream tests, skill-sharing copy and protected copy keys now carry fork changes; register them as seams and in the diff budget. Keep upstream's mobile runtime catalog: the fork never needed to change it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ce after upstream sync

Activity ranks a native chat's host-saved name as a manual name (REQ-025); skip the fork owner probe when upstream already probed it. Adapt tests to upstream's deliberate Codex thread and push payload changes, and register the adapted upstream test as a seam.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…llback

Upstream 4597d3f falls back to preview instead of source for unsupported rich Markdown; Open anyway now sits in that banner. REQ-401 and TC-601 follow the upstream default.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…upstream now provides

Upstream stablyai#33978 binds a later recorded leaf into the restored tab, closing residual P2-4; the test now asserts one tab with both original leaves.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Upstream stablyai#36772 made the production home guard reach orcad-idle-exit, whose module-level zod schema landed in the LaunchServices preflight bundle; mark in-repo imports side-effect free so only the guard's real modules are bundled. Record the upstream sync in the journal.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…pstream sync

Upstream added files.readDocPreviewChunk beside the fork's chunked files.readDocPreview; mock both and assert the 20 MiB guarantee over bounded replies.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ites

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…pers

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Mock the ActiveWorkspaceSyncGate upstream mounted in background services, and find the link entry by upstream's new Add reference button.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…worktree block reason

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…m's reveal reads

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…d TTL checks

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… bump

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…browser tab retirement

The 2026-11-02 sync resolved the retireRuntimeOwnedBrowserSessionTab conflict by
keeping the fork's snapshot.publicationEpoch, dropping upstream stablyai#31665's
getMobileSessionPublicationEpochAfterHeadlessBrowserClose. Upstream's method
already keeps a renderer generation's epoch (REQ-701) and only re-stamps a
host-built publication, which has no renderer generation to fence.

The file now matches upstream, so its seam and budget entry are retired; a new
case pins the host-built re-stamp so this branch cannot drop silently again.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…n forks

Upstream added an unguarded blacksmith-4vcpu-ubuntu-2404 leg to the warm job in
ci-cache-warmup.yml and to warm-linux-package-fixtures. fork/integration is the
Fartown default branch, so every 6-hour scheduled warmup would leave a leg
queued until GitHub drops it; main's mirror already shows three such runs.

Both matrices now follow warm-linux-runtime: Blacksmith only for stablyai/orca.
The portability test covers every job in both warmup workflows instead of one.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Upstream's new memo-translate-subscription ratchet flags memoized components
that call translate() without subscribing to the language revision. LocalTaskList
and LocalTaskRow are memoized, so a language switch left their labels stale.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e session

Upstream's new "bounds unknown retry work" test caps the tab-row reads a
host-kept-asleep restore may do per retry. The cold-restore-resume breadcrumb's
candidate evidence scanned the workspace's tabs twice on every retry, so 100
tabs read 800 rows against a 600 bound.

The breadcrumb now lives in the feature's cold-restore-origin.ts: the first
attempt of a pane session carries candidate evidence, retries record origin
and launch evidence only. The upstream call site shrinks to one line.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Upstream's orcad entry build now rejects non-ASCII characters in the server
bundle. The low-information prompt regex spelled its Chinese replies literally,
which failed every orcad build in CI. The same characters are now \uXXXX escapes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… ASCII-only orcad bundle

The Windows reserved-name regex spelled the superscript digits literally; the
orcad entry build rejects non-ASCII source. They are now \uXXXX escapes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@Fartown
Fartown merged commit d12875f into fork/integration Nov 3, 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.