Skip to content

fix(build): restore ARM64 CLI support on larger-page kernels - #23443

Closed
voltcrash wants to merge 5 commits into
pingdotgg:mainfrom
voltcrash:t3/fix-issue-23433
Closed

voltcrash wants to merge 5 commits into
pingdotgg:mainfrom
voltcrash:t3/fix-issue-23433

Conversation

@voltcrash

@voltcrash voltcrash commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

Fixes #23433.

Node 26.12.1's built-in SEA injector produces Linux ARM64 executables that cannot load on 16 KiB-page kernels. Keep the security-fixed Node runtime, generate its SEA blob with the same Node version, and inject it with postject for Linux ARM64. Other targets retain the existing injector. Explicit ARM64 cross-target builds retain tsdown's runtime download and checksum verification.

Keep the executable bundle in one module and reject incompatible ARM64 executables both after injection and before archive staging. The ELF check verifies file/virtual-address congruence and disjoint LOAD pages at 64 KiB, covering 4/16/64 KiB kernels. Checking only the declared p_align would reject valid postject output: its new segment declares 4 KiB but has compatible offsets and addresses.

This is a focused fix for an obvious failure of an already-supported release target, under CONTRIBUTING.md's bug-fix exception. It restores executable loading without adding a product capability or changing product defaults. The common archive supplies npm installs, remote environments, updates, and Windows' ARM64 WSL runtime; no client, provider, or wire-contract changes are needed.

Verification on Linux aarch64 with getconf PAGESIZE reporting 16384:

  • Reproduced the failure with a minimal Node 26.12.1 --build-sea executable: exit 139 before running its entry point. readelf -lW showed the reported relocated headers and SEA note. The new ELF checker rejects that output.
  • The same entry point built through postject prints v26.12.1 on that host.
  • Built the actual T3 executable with VP_NODE_VERSION=26.12.1 node apps/server/scripts/cli.ts build-exe, then ran apps/server/dist-exe/t3 --version and --help successfully (t3 v0.1.1, the checkout's version).
  • Also built with --target linux-arm64 on the ARM64 host; its suffixed executable prints t3 v0.1.1 and passes the ELF check.
  • Five focused tests cover the reported note layout, page overlap, valid smaller declared alignment, malformed ELF headers, and native/explicit target selection.
  • vp run check:changed HEAD passes format, lint, knip, generated GraphQL checks, affected-package typechecks, and the focused tests.

Full archive startup, 64 KiB kernels, and cross-builds from other operating systems were not checked locally. Existing release archive smoke tests remain in place.

Maintainer verification: QEMU arm64 VMs on a Debian 6.12 16 KiB-page kernel and an Ubuntu 6.8 64 KiB-page kernel. The v0.1.3 release binary exits 139 on --version on both. The PR's linux-arm64 build prints t3 v0.1.3, passes __service-preflight --launcher-protocol 3, and serve returns HTTP 200 on both.

Reviewed with sol-loop: 1 round with GPT-6.1 Sol. Sol verdict: approved

Model: GPT-6.1 Sol | Harness: Codex in T3 Code
Maintainer verification: Claude Opus 5.5 | Harness: Claude Code in T3 Code

🤖 Generated with Claude Code

@github-actions github-actions Bot added vouch:unvouched Author is not yet trusted in the VOUCHED list. size:XL 500-999 changed lines (additions + deletions). labels Oct 22, 2026
@macroscopeapp

macroscopeapp Bot commented Oct 22, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs Human Approval

Macroscope's review found this PR requires human approval — This focused ARM64 build fix adds a postject-based SEA construction path, custom ELF validation, cross-target runtime resolution, and executable bundling changes. Because it alters the release pipeline that produces shipped CLI artifacts and introduces substantial new build logic, it merits human review.

You can add or adjust custom eligibility rules. Learn more.

@coderabbitai

coderabbitai Bot commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

No actionable comments were generated in the recent review.

Recent review info
Run configuration
Commits

Reviewing files that changed from the base of the PR and between ccdcba3 and 34e7142.

Files ignored due to path filters: 1
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
Files selected for processing: 5
  • apps/server/scripts/cli.ts
  • apps/server/vite.config.ts
  • scripts/lib/cli-sea.test.ts
  • scripts/lib/cli-sea.ts
  • scripts/package.json

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 1 remain after this review.

Walkthrough

The CLI build now creates Linux ARM64 SEA executables. It checks ELF page compatibility during SEA creation and archive preparation. Release guidance describes the Node version requirement for Linux ARM64 cross-target builds.

Changes: Linux ARM64 SEA build

Layer / File(s) Summary
Target selection and executable packaging
scripts/lib/cli-sea.ts, apps/server/scripts/cli.ts, apps/server/vite.config.ts
The CLI resolves the executable target and routes Linux ARM64 builds to the SEA builder. Vite omits the executable configuration for Linux ARM64 and disables code splitting for executable builds.
SEA generation and compatibility validation
scripts/lib/cli-sea.ts, scripts/lib/cli-sea.test.ts, scripts/package.json, apps/server/scripts/cli.ts, docs/operations/release.md
The builder creates and injects a SEA blob, checks the Node version and resulting ELF, and sets executable permissions. Tests cover ELF compatibility and target selection. The scripts package adds @tsdown/exe and postject. Release guidance describes the cross-target Node version requirement.
Archive compatibility checks
scripts/build-cli-archive.ts
Linux ARM64 archive preparation checks the executable's page compatibility before continuing.

Priority: Normal

Estimated code review effort: 3 (Moderate) | ~25 minutes

Change: Bug fix · Severity of issue fixed: Medium

Sequence Diagram(s)

sequenceDiagram
  participant BuildExe as build-exe
  participant SeaBuilder as buildLinuxArm64Sea
  participant NodeRuntime as Node executable
  participant Postject as postject
  participant ElfValidator as assertLinuxArm64PageCompatibility
  BuildExe->>SeaBuilder: bundle path, output path, Node version, cross-target flag
  SeaBuilder->>NodeRuntime: generate SEA blob
  NodeRuntime-->>SeaBuilder: SEA blob
  SeaBuilder->>Postject: inject blob into executable copy
  Postject-->>SeaBuilder: injected executable
  SeaBuilder->>ElfValidator: validate executable ELF
Loading

Possibly related issues

Suggested labels: bugfix

Suggested reviewers: juliusmarminge, pixpmusic

Merge Risk: Minimal · up to 34e71

No blocking issue remains in the reviewed Linux ARM64 build and archive paths; the change is ready to merge after normal checks.

Pre-merge checks: Passed 4
Check name Status Explanation
Title check Passed The title is concise, specific, and accurately describes the ARM64 CLI compatibility fix.
Linked Issues check Passed The PR addresses active issue #23433. Linux ARM64 SEA builds use the matching Node version and postject, then run assertLinuxArm64PageCompatibility after injection and before archive staging. The …
Out of Scope Changes check Passed The changes remain within issue #23433. Target resolution, single-module bundling, SEA construction, ELF validation, release guidance, dependency declarations, archive staging checks, and focused test…
Description check Passed The description is thorough and follows the template's intent. It states the problem (Node 26.12.1 SEA injector produces Linux ARM64 executables that fail on 16 KiB-page kernels, issue #23433), the ch…
Full details: Linked Issues check

Explanation

The PR addresses active issue #23433. Linux ARM64 SEA builds use the matching Node version and postject, then run assertLinuxArm64PageCompatibility after injection and before archive staging. The check validates LOAD-segment layout for larger page sizes. Focused tests cover incompatible and valid ELF layouts, malformed headers, and native or explicit target selection. The reported Linux ARM64 verification ran the built executable with --version and --help on a 16 KiB-page host.

Full details: Out of Scope Changes check

Explanation

The changes remain within issue #23433. Target resolution, single-module bundling, SEA construction, ELF validation, release guidance, dependency declarations, archive staging checks, and focused tests support the Linux ARM64 executable fix or its validation. The summary shows no client, provider, wire-contract, or product-default changes.

Full details: Description check

Explanation

The description is thorough and follows the template's intent. It states the problem (Node 26.12.1 SEA injector produces Linux ARM64 executables that fail on 16 KiB-page kernels, issue #23433), the change (same-version SEA blob plus postject injection for Linux ARM64, existing injector retained for other targets, ELF compatibility check before archive staging), and the scope justification (bug-fix exception under CONTRIBUTING.md, no new product capability). Verification is detailed: reproduction on a 16 KiB-page aarch64 host, build and run of the actual executable, explicit linux-arm64 target build, five focused tests, and a repo check command. It also states what was not checked (full archive startup, 64 KiB kernels, cross-OS builds). The 'Scope and approval' section cites the bug-fix exception but does not link the triaged issue with a maintainer approval comment. The PR body names issue #23433 only in a 'Fixes' line and does not explain the approval path beyond the exception claim. The template asks for a link to the triaged bug issue or approval discussion, so that item is only partly covered. Because the issue is referenced and the bug-fix reasoning is explicit, the description is mostly complete.

Finishing Touches
🧪 Generate unit tests (beta)
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Comment @coderabbitai help to get the list of available commands.

@Project516

Copy link
Copy Markdown
Contributor

Tested this on a Raspberry Pi 5 (6.18.50+rpt-rpi-2712, PAGESIZE 16384), using the path the description lists as unchecked: a cross-build from x86_64 Linux.

  • vp test run scripts/lib/cli-sea.test.ts: 5/5 pass.
  • node apps/server/scripts/cli.ts build-exe --target linux-arm64 under Node 26.12.1 on x86_64 Linux: builds, passes the page check. postject prints nine Can't find string offset for section name '.note.100' warnings.
  • On the Pi, the released v0.1.2 t3 --version exits 139. The PR binary loads, starts Node v26.12.1, and stops on Cannot find module '@cursor/sdk' because I copied the binary without its node_modules. So it execs; I did not run a full archive.

LOAD segments for the injected data: v0.1.2 has 0x6dad000/0x71ad000 (shares a 16 KiB page with RW) and 0x8faf000/0x1015d000 (incongruent mod 16 KiB). The PR build has one segment at 0x8f60000/0x10f60000, 64 KiB aligned.

The cause looks like nodejs/node#65564 (Node 26.9.0+), which moved --build-sea's injected segments after .bss with 4 KiB alignment. It may be worth citing that in the buildLinuxArm64Sea comment, so the postject path can be dropped once Node's output passes assertLinuxArm64PageCompatibility.

@dbjohnson

Copy link
Copy Markdown

Tested this PR on a 16 KiB-page host, including the full archive startup that the description lists as unchecked.

Host: Apple Silicon running Arch Linux ARM with the Asahi kernel (7.2.12-1-1-ARCH, getconf PAGESIZE = 16384, glibc 2.43, Node 26.12.1). PR head 702f1f0040.

I followed the release workflow's steps:

vp i
vp run --filter t3 build
node apps/server/scripts/cli.ts build-exe --verbose
node scripts/build-cli-archive.ts --platform linux --arch arm64 --version 0.1.2 \
  --resource-monitor-dir <dir> --output-dir release-cli
node scripts/smoke-cli-archive.ts --archive release-cli/t3-0.1.2-linux-arm64.tar.gz --expect-version 0.1.2

There's no Rust toolchain on this machine, so <dir> holds the prebuilt t3-resource-monitor from the 3669 release archive.

Results:

  • smoke-cli-archive.ts passes: --version passed and serve answered on 47700.
  • From the extracted archive, t3 --version prints t3 v0.1.2, and t3 --help exits 0.
  • The boot-service updater's check passes: t3 __service-preflight --database-path ~/.t3/userdata/statev2.sqlite --launcher-protocol 3 prints {"status":"ready","version":"0.1.2","launcherProtocol":3}. This is the command that fails with SIGSEGV for every release since 3512, so it's the step that has blocked t3 update and in-app server updates on these hosts.
  • vp test run lib/cli-sea.test.ts: 5/5 pass.
  • assertLinuxArm64PageCompatibility accepts the PR's executable and rejects the published 0.1.3-nightly.20261025.3669 binary with ARM64 LOAD segments overlap on a 64 KiB page (segment 6). That binary exits 139 on this host.

The postject output has its SEA note segment at file offset 0x8f60000, vaddr 0x10f60000, so offset and address agree mod 64 KiB even though it declares 0x1000 alignment, and it doesn't share a page with .bss. PT_PHDR stays inside the first R/E segment instead of getting a segment of its own, which removes the overlap that breaks the current builds.

The branch is 175 commits behind main; I tested it as is, without rebasing.

Every linux-arm64 release since 3512 is broken on 16 KiB-page hosts, including stable v0.1.2. On this host I'm currently running header-patched release binaries (see #23433), and I'd like to drop that once this merges.

@Project516

Copy link
Copy Markdown
Contributor

claude-opus-5-5 responding on behalf of project516

@voltcrash could you rebase this onto main? It no longer merges cleanly, but the only conflict is pnpm-lock.yaml, so regenerating the lockfile after the rebase should be enough. 0.1.2 and the current nightlies still fail on 16 KiB-page kernels, so Raspberry Pi 5 hosts are stuck on 0.1.1 until this lands.

maria-rcks commented Oct 26, 2026 •

Copy link
Copy Markdown
Collaborator

Note

Written by gpt-6.1-sol on behalf of Maria

@voltcrash, thanks for preserving the security-fixed node runtime and using postject only for linux arm64. i kept your implementation and both commits, merged main, and regenerated the lockfile. head: 34e7142c6917e56fb4c5c65d3ac137333ab7c9df.

i fixed one gap found during review: an inherited T3CODE_PACK_EXE_TARGET=linux-arm64 skipped both injectors and reported success without an executable. the cli and vite now share target resolution, including explicit overrides and blank targets. injector stdout is retained for actionable failures. the new regression failed first, then passed in the existing test file.

verified through blacksmith on this head:

  • vp run check:changed: format, lint, both knip passes, graphql, affected typechecks, and all six focused tests passed.
  • all five release executable targets build on linux with node 26.12.1: linux x64/arm64, darwin arm64, and windows x64/arm64. both inherited and explicit arm64 targets work.
  • the complete linux x64 archive passes scripts/smoke-cli-archive.ts, --help, and service preflight protocol 3.
  • the complete linux arm64 archive, including its arm64 native dependencies and resource monitor, passes --version, --help, service preflight, and server startup to http 200 under qemu with an empty PATH.
  • the actual t3 bundle built with main's injector is rejected by the archive builder for overlapping 64 kib load pages. the postject executable passes the same elf guard.

unverified here: native 16/64 kib kernel execution, builds hosted on macos/windows, native macos/windows execution, and release signing. qemu startup does not prove larger-page kernel loading. postject still emits the upstream .note.100 warnings; the injected output passes validation and archive startup.

all 27 ci checks pass. both independent code reviews approve this head, and the automated review reports no actionable findings on it. there are no merge conflicts. the original pr remains open for maria's review and merge.

@t3dotgg

t3dotgg commented Oct 27, 2026

Copy link
Copy Markdown
Member

Note

🤖 Claude Opus 5.5 responding on behalf of Theo

Thank you, @voltcrash and @maria-rcks. Closing this in favor of #25825. It keeps your commits and credits you both as co-authors. On top of your fix it drops the @tsdown/exe dependency, and with it linux-arm64 cross-builds. It also moves the injector choice into cli.ts. The postject approach and the ELF guard are unchanged. Verified on 16 KiB and 64 KiB page kernels.

@t3dotgg t3dotgg closed this Oct 27, 2026
t3dotgg added a commit that referenced this pull request Oct 27, 2026
…iB page kernels (#25825)

TEMPORARY workaround for an upstream Node bug: nodejs/node#67048
Node 26.9+ --build-sea writes linux-arm64 executables that 16/64 KiB page kernels cannot load.
linux-arm64 now injects with postject, and the archive build rejects incompatible ELF layouts.
One-time exception. Revert once Node ships a fix: grep for the Node issue URL and drop postject
from scripts/package.json.

Fixes #23433. Replaces #23443.

Co-authored-by: Lakshmi Tanmay <[email protected]>
Co-authored-by: maria-rcks <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
@voltcrash
voltcrash deleted the t3/fix-issue-23433 branch October 27, 2026 09:16
adampeterhiggins added a commit to adampeterhiggins/t3code that referenced this pull request Oct 27, 2026
* refactor(client): composers share one workspace snapshot refresh per provider and cwd (pingdotgg#25370)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* refactor(mobile): composer pastes and picks are cancelled by their draft, not by the composer (pingdotgg#25376)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* chore(mobile): e2e poses for current devices, Duo and landscape fixes

Poses now cover iPhone SE, iPhone 18 Pro, iPhone Duo folded and unfolded,
iPad Pro 13" in both orientations, Pixel 10 Pro, Pixel 10 Pro Fold folded,
unfolded and unfolded landscape, and Pixel Tablet in both orientations.
Landscape poses rotate once the app is up (a rotation during launch is lost)
and check that the screen really is wider than tall. Taps fall back to the
element's centre when agent-device refuses a covered ref, and a gateway
whose workers briefly reconnect is retried.

Co-Authored-By: Claude Opus 5.5 <[email protected]>

* fix(mobile): select the correct draft after adding a project (pingdotgg#24269)

* fix(mobile): mobile:install no longer requires --prepare

The --prepare flag from pingdotgg#25390 had no default, so effect/cli made it
required and every mobile:install failed with "Missing required flag".

Co-Authored-By: Claude Opus 5.5 <[email protected]>

* fix(mobile): e2e landscape poses rotate for real on tablets and folds

agent-device names rotations relative to the device's natural orientation,
which is landscape on the Pixel Tablet and an unfolded Fold, so
"landscape-left" turned them portrait. The runner now asks for a shape and
tries each rotation until the screen has it. It also prepares each platform's
dev client before leasing, rides out longer worker drops, and skips the
Duo poses by default until agent-device can fold Simlock's simulators.

Co-Authored-By: Claude Opus 5.5 <[email protected]>

* fix(server): goals stop the running turn, clear while working, no echoes (pingdotgg#25426)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* refactor(web): pull request list remembers each answer for the next start (pingdotgg#25364)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* refactor(web): HTML previews handle frame messages in one listener (pingdotgg#25456)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* refactor(web): review guide runs are watched from their answers, not from mounted components (pingdotgg#25459)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* refactor(web): resize drags, panel shells and the browser host own their listeners (pingdotgg#25464)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(web): find shows its match after a thread switch, and the timeline hears scrolling through one viewport signal (pingdotgg#25463)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(mobile): a new thread's first send no longer sticks on Starting (pingdotgg#25477)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(client): drafts for answered questions are cleared even when their thread is not open (pingdotgg#25457)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* refactor(web): terminal output no longer re-renders the drawer, theme search runs from handlers (pingdotgg#25458)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(web): stable callbacks refresh before layout effects read them (pingdotgg#25489)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* test(web): say why the useStableCallback test renders without a router (pingdotgg#25493)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(mobile): queued edits end when their run starts, wherever you are (pingdotgg#25468)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* refactor(web): root theme, toast and chrome sync start with the app (pingdotgg#25461)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* refactor(web): root theme, toast and chrome sync start with the app (pingdotgg#25461)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(mobile): editing a queued message while a question is open no longer throws (pingdotgg#25503)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(web): browser viewport resizes work without an open preview panel (pingdotgg#25462)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* test(web): attachment preview omission tests no longer time out on CI (pingdotgg#25515)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(mobile): describe when composer view commands can reject (pingdotgg#25516)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(web): browser history and titles show up again (pingdotgg#25491)

* fix(web): switching back to a thread no longer restores its tab's older title (pingdotgg#25521)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* refactor(web): pull request page reacts to turns and sweep Escape without effects (pingdotgg#25523)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(web): an armed pull request confirm no longer outlives its button (pingdotgg#25530)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(mobile): keep expanding composer text above its toolbar (pingdotgg#25396)

* fix(server): release completed PR sync sweep data from the read cache (pingdotgg#25285)

* fix(mobile): drop the unused useLayoutEffect import that fails lint on main (pingdotgg#25575)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* refactor(web): provider settings and Codex setup run as explicit flows (pingdotgg#25524)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* test(web): attachment preview omission cases check the prepared document instead of rendering each one (pingdotgg#25562)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* refactor(mobile): pull request screens use a file-jump store and handler work (pingdotgg#25525)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(mobile): label the pull request toast action View (pingdotgg#25581)

* refactor(mobile): media previews share file leases and close on blur in one place (pingdotgg#25527)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(shared): pin T3 Connect cloudflared to 2026.10.4, which drops the compromised eMudhra intermediates (pingdotgg#25572)

Co-authored-by: Theo Browne <[email protected]>

* fix(web): skill chips in chat open the same details popover as the composer (pingdotgg#25432)

* refactor(web): chat route shortcuts register once instead of rebuilding on every store change (pingdotgg#25366)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(clients): queued messages can't be edited while a question is open (pingdotgg#25593)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* docs: add an FAQ that answers what people ask every day (pingdotgg#25451)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* feat(web): warn before adding a second Claude or Codex account (pingdotgg#25475)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(server): expire new-model badges after seven days (pingdotgg#25609)

* refactor(web): running timers share one clock instead of an interval each (pingdotgg#25616)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(web): simplify the created pull request success row (pingdotgg#25613)

* fix(web): thread jump hints wait for their delay on every hold (pingdotgg#25636)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(mobile): open threads from the local cache instead of "Thread unavailable" (pingdotgg#25627)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(infra): task-cache telemetry no longer strands an event queued during a flush (pingdotgg#25653)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* refactor(web): video previews attach listeners on their element and share one visibility observer (pingdotgg#25630)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* refactor(mobile): voice input session owns recording, metering and keep-awake (pingdotgg#25631)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(web): screen readers can wrap to the first and last message of a long thread (pingdotgg#23780)

Co-authored-by: PR Batch Tester <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
Co-authored-by: nibarAhmed <[email protected]>
Co-authored-by: maria-rcks <[email protected]>

* fix(client-runtime): a slow host no longer shows settings as read-only (pingdotgg#25526)

Co-authored-by: Julius Marminge <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
Signed-off-by: Yordis Prieto <[email protected]>

* refactor(mobile): thread rows share one clock and cache SVGs instead of per-row effects (pingdotgg#25612)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(server): a thread whose worktree was deleted recovers on the next message (pingdotgg#18359)

Co-authored-by: Julius Marminge <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
Signed-off-by: Yordis Prieto <[email protected]>

* refactor(mobile): pull request list records answers where they land (pingdotgg#25373)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(mobile): keep floating status within the composer width (pingdotgg#25671)

* refactor(web): settings group by concern, with General split into focused pages (pingdotgg#25651)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(server): telemetry keeps a failed batch for 30 minutes, not 1.5 (pingdotgg#25474)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(mobile): a caret move in one composer no longer moves another draft's insert point (pingdotgg#25681)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* test(web): attachment preview Word and large-text tests no longer flake on CI (pingdotgg#25664)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* feat(evals): shared evals package and an eval for T3 tool-use mistakes (pingdotgg#24635)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* refactor(web): Cmd+O presses the Open in editor button instead of a per-picker listener (pingdotgg#25667)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(mobile): queued messages are delivered by an app service, not a render loop (pingdotgg#25678)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* test(web): PDF viewer behavior is covered by fast tests (pingdotgg#25699)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* refactor(mobile): drop the unreachable pending-task editor from new-task drafts (pingdotgg#25684)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* feat(web): thread state lives at the end of the timeline, not stacked on the composer (pingdotgg#25401)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* refactor(web): drafts promote from the draft store, not from route effects (pingdotgg#25615)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* refactor(mobile): settings use web's pages and groups (pingdotgg#25686)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* refactor(mobile): thread inspector mode is derived, not synced (pingdotgg#25682)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* refactor(mobile): pull request list, filters and viewed files without synchronizing effects (pingdotgg#25614)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(web): PDF search finds phrases that wrap across lines (pingdotgg#25702)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* feat(server): cut T3's MCP tool schemas by a third and merge 18 tools into action tools (pingdotgg#25423)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(mobile): pull request rows refresh their diff stats after a new push (pingdotgg#25713)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(workflows): keep completed workflows reachable (pingdotgg#24587)

Co-authored-by: maria-rcks <[email protected]>

* fix(web): devices agents open in background threads now show up (pingdotgg#25714)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* refactor(web): optimistic chat messages leave without a timer (pingdotgg#25710)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* feat(acp): ACP session notices show as notices, not reply text (pingdotgg#25704)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(mobile): scale and align thread list icons (pingdotgg#25668)

* refactor(mobile): new-task branch defaults are derived, not written after render (pingdotgg#25706)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* feat(provider): add Vercel fx as a provider (pingdotgg#18277)

Co-authored-by: Julius Marminge <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(mobile): usage chart bars round at the top instead of the bottom (pingdotgg#21383)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(mobile): a draft route's branch checkout runs once, even across a reconnect (pingdotgg#25712)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(web): thread details popover closes when the card moves inline (pingdotgg#25731)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* refactor(web): diff and file reveals are requests, and workspace edits refetch by construction (pingdotgg#25732)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* feat(web): Add provider leads with first-class providers (pingdotgg#25753)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* refactor(mobile): app-lifetime services install once, and the usage widget stops re-rendering on every presentation change (pingdotgg#25740)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(client-runtime): searches and refreshes no longer wait on an unreachable environment (pingdotgg#25703)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* refactor(web): command palette state lives in a store, git and branch pickers drop timer and sync effects (pingdotgg#25733)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(mobile): restore Android chat content corners (pingdotgg#23989)

Co-authored-by: maria-rcks <[email protected]>

* fix(server): agents show trends and comparisons as inline charts again (pingdotgg#25766)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(mobile): isolate file tree state by workspace (pingdotgg#24270)

* fix(mobile): finished subagents stay reachable from the Agents pill (pingdotgg#25759)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(mobile): keep segmented controls readable on cards and screens (pingdotgg#25729)

* fix(web): cancelling update everything no longer flashes the update button's focus ring and tooltip (pingdotgg#25774)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(mobile): lists end at the search field, and HTML previews start below the header (pingdotgg#25765)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(provider-cursor): bump @cursor/sdk to 1.0.38 so long-context tiers send Max Mode (pingdotgg#21074)

Co-authored-by: Julius Marminge <[email protected]>

* fix(server): Sonnet also answers trend and comparison data with inline charts (pingdotgg#25776)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(server): Claude MCP timeouts preserve the native session (pingdotgg#25660)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(server): preserve settled runs during delegated acknowledgements (pingdotgg#25672)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(mobile): align the iPad composer with workspace navigation (pingdotgg#24942)

Co-authored-by: maria-rcks <[email protected]>

* chore(evals): store eval cases as .ndjson so review tools skip them (pingdotgg#25782)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* test(server): CI fails when agent context grows past main (pingdotgg#25785)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* refactor(mobile): theme preferences reach the native runtime without a layout effect (pingdotgg#25767)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* refactor(mobile): the share inbox is a module store, presented from navigation state (pingdotgg#25744)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* refactor(web): drop the unreachable paint-only thread timeline path (pingdotgg#25787)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* chore(release): prepare v0.1.3

* refactor(mobile): notifications, quick actions and Connect onboarding navigate through the root ref (pingdotgg#25769)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* test(server): data regression test now fails when recent fetch savings regress (pingdotgg#25795)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(server): all MCP tools now send compact schemas, cutting tool context by 23% (pingdotgg#25790)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* refactor(web): the new design is the only design, with no toggle (pingdotgg#25778)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* feat(mobile): add a "Use last project" preference for new threads (pingdotgg#24741)

Co-authored-by: none23 <[email protected]>
Co-authored-by: Julius Marminge <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(mobile): round shared Android sheets and Chat settings (pingdotgg#18547)

* feat(mobile): split wide Android Settings into two panes (pingdotgg#24298)

* fix(web): keep right panel maximize available in narrow windows (pingdotgg#25389)

* fix(server): Macs without Android no longer show avdmanager discovery warnings (pingdotgg#25815)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(web): onboarding import no longer hangs when the project never arrives (pingdotgg#25805)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(mobile): Windows image paths and non-ASCII file links open like desktop (pingdotgg#25802)

Co-authored-by: Claude Opus 5.5 <[email protected]>
Co-authored-by: amv146 <[email protected]>

* fix(web,mobile): markdown previews no longer show YAML frontmatter as a giant heading (pingdotgg#25804)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(web): compact toggle shows the token count again (pingdotgg#25818)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(server): preserve interrupted Claude context after revert (pingdotgg#25695)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(web,mobile): bot approvals are visible on the PR summary (pingdotgg#25829)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(web,mobile): stopped runs no longer look like errors (pingdotgg#25830)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* refactor(mobile): share imports run outside the new-task screen (pingdotgg#25793)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(build): TEMPORARY workaround so linux-arm64 builds run on 16/64 KiB page kernels (pingdotgg#25825)

TEMPORARY workaround for an upstream Node bug: nodejs/node#67048
Node 26.9+ --build-sea writes linux-arm64 executables that 16/64 KiB page kernels cannot load.
linux-arm64 now injects with postject, and the archive build rejects incompatible ELF layouts.
One-time exception. Revert once Node ships a fix: grep for the Node issue URL and drop postject
from scripts/package.json.

Fixes pingdotgg#23433. Replaces pingdotgg#23443.

Co-authored-by: Lakshmi Tanmay <[email protected]>
Co-authored-by: maria-rcks <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>

* fix(server): preserve completed runs when accepting child deliveries (pingdotgg#25666)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(client-runtime): iOS resume keeps live sockets and drops dead ones 4x faster (pingdotgg#25824)

Co-authored-by: Omar <[email protected]>
Co-authored-by: Carlos D. Escobar-Valbuena <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>

* feat: model labels show the name you'd say out loud (pingdotgg#24205)

Co-authored-by: Claude Opus 5.5 (Claude Code) <[email protected]>
Co-authored-by: maria-rcks <[email protected]>
Co-authored-by: Julius Marminge <[email protected]>

* chore(review): CodeRabbit reviews tests against docs/internals/testing.md (pingdotgg#24204)

* refactor(mobile): showcase capture readiness is a tested pure model (pingdotgg#25816)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(mobile): a held thread move retires when a snooze wakes, even with no list open (pingdotgg#25809)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(web): switching a file between markdown and the editor no longer saves a draft twice (pingdotgg#25768)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(web,mobile): queued messages get a simpler Send now row, no reordering (pingdotgg#25846)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(mobile): Add project path survives its host dropping out and returning (pingdotgg#25819)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* refactor(mobile): opening Review or Files shows the inspector in the first commit (pingdotgg#25817)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(web): Diagnostics keeps its own settings sidebar entry

Upstream's settings regrouping made Diagnostics a detail page under
Maintenance, dropping the fork's sidebar entry.

Co-Authored-By: Claude Opus 5.5 <[email protected]>

---------

Signed-off-by: Yordis Prieto <[email protected]>
Co-authored-by: Julius Marminge <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
Co-authored-by: Theo Browne <[email protected]>
Co-authored-by: Alex Southwell <[email protected]>
Co-authored-by: Alex <[email protected]>
Co-authored-by: project516 <[email protected]>
Co-authored-by: oliver <[email protected]>
Co-authored-by: Yash Singh <[email protected]>
Co-authored-by: shivam <[email protected]>
Co-authored-by: PR Batch Tester <[email protected]>
Co-authored-by: nibarAhmed <[email protected]>
Co-authored-by: maria-rcks <[email protected]>
Co-authored-by: Yordis Prieto <[email protected]>
Co-authored-by: Bilal Bakr <[email protected]>
Co-authored-by: Andrew Gadzik <[email protected]>
Co-authored-by: Julius Marminge <[email protected]>
Co-authored-by: Aditya Vardhan Sharma <[email protected]>
Co-authored-by: gcrft123 <[email protected]>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: none23 <[email protected]>
Co-authored-by: amv146 <[email protected]>
Co-authored-by: Lakshmi Tanmay <[email protected]>
Co-authored-by: Omar <[email protected]>
Co-authored-by: Carlos D. Escobar-Valbuena <[email protected]>
incognitojam pushed a commit to incognitojam/styal that referenced this pull request Oct 31, 2026
…iB page kernels (pingdotgg#25825)

TEMPORARY workaround for an upstream Node bug: nodejs/node#67048
Node 26.9+ --build-sea writes linux-arm64 executables that 16/64 KiB page kernels cannot load.
linux-arm64 now injects with postject, and the archive build rejects incompatible ELF layouts.
One-time exception. Revert once Node ships a fix: grep for the Node issue URL and drop postject
from scripts/package.json.

Fixes pingdotgg#23433. Replaces pingdotgg#23443.

Co-authored-by: Lakshmi Tanmay <[email protected]>
Co-authored-by: maria-rcks <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>

Fork adaptation: Apply native Linux ARM64 postject injection to the fork's native-only styal build command and executable path, preserving PostHog sourcemap plugins and archive branding. Keep the fork's web build prerequisite and omit upstream cross-target configuration, which the fork does not support. The fork-owned archive workflow invokes this native build command on its ARM64 runner, so it receives the same workaround.

(cherry picked from commit c175e57)
Upstream-PR: 25825
Fork-Feature: fork-distribution-identity, fork-feature-usage, fork-server-error-reporting
Early-Import: The Node pin moves standalone builds to Node 26.12.1, which breaks linux-arm64 on 16/64 KiB page kernels without this workaround.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL 500-999 changed lines (additions + deletions). vouch:unvouched Author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: linux-arm64 CLI from nightly 20261022.3512 cannot exec on 16 KiB-page kernels (Raspberry Pi 5)

5 participants