Skip to content

Merge upstream T3 Code through bb7783e295 into Lecturn - #175

Merged
Nurozen merged 164 commits into
mainfrom
upstream/batch-a12d6ed94284-2477de
Nov 7, 2026
Merged

Nurozen merged 164 commits into
mainfrom
upstream/batch-a12d6ed94284-2477de

Conversation

@Nurozen

@Nurozen Nurozen commented Nov 7, 2026 •

Copy link
Copy Markdown
Owner

Summary

True merge of pingdotgg/t3code through bb7783e295506ad423f527ed28a019836e331e8c (158 first-parent commits after a12d6ed942) into Lecturn main, including #172 and #176. 237 conflicts, no .repos commit in the range. It stops before upstream's forge-definitions refactor run (pingdotgg#23992 onward).

What changes for users

  • Web: messages from other agents fold into one-line rows; Arabic and Hebrew read right to left; Cmd+K hides subagents, favors whole words and searches messages; Cmd+B toggles the sidebar unless text is selected; provider updates stop raising launch toasts; assorted layout fixes.
  • Mobile: unified draft and thread navigation; Usage and Settings in workspace navigation; drafts swipe to discard; Android composer text no longer clips; undo toasts stay on one row above the navigation; iPhone Duo fixes (iOS, not captured).
  • Server: indexed message search (migrations 86 and 87 on the fork ledger), stale-agent and browser cleanup, managed Codex token renewal, SQLite read routing, run metrics export.
  • Build: Node 26.12.1 is pinned for development and releases.
  • Copy: the em dash lint rewrote a few fork strings (for example "Show N new decisions").

Kept or left out on purpose

Recorded in RESOLUTION_GUIDE.md: relay-preview.yml, relay-preview-cleanup.yml and stale-needs-more-info.yml are not taken (PR code on repo secrets; public issue closing). Fork reply features moved beside ThreadTimeline. Upstream's sidebar row motion is not taken on mobile. Palette queries are kept out of app and embed sessions.

Verification

  • Reviews: area reviews on the merge found 4 real regressions, all fixed with tests that fail without them: a dead installer host from the identity sweep, folded agent rows not opening on a citation, a stale mobile accountId on thread selection, and app workspaces as the Home new-thread default. Delta reviews pass with nits. Grok accepts each round.
  • Fork tests: independent AST recount of 7429 fork-added tests: all present except 4 declared obsolete with reasons.
  • Stop targets: fix(client): MCP apps can no longer trap you in full screen; it opens only after a tap pingdotgg/t3code#18548, fix(web): full-screen visual replies keep a gap from the frame edge pingdotgg/t3code#20281 and fix(server): html previews say how their browser exited pingdotgg/t3code#16872 sources and tests are unchanged.
  • Checks: required CI green on this head with Node 26.12.1. Locally: web browser 641, web unit 5387, server 7805, mobile 2956, desktop 951, packages 6499. build-exe passes on macOS.
  • Compiler hazards: AST and compiler scan of mobile and web: no useEffectEvent result in a dependency array, no provider fix needed. "Maximum update depth exceeded" never appeared in web or Android captures; the mobile inspector screen was not captured.
  • Services: no new env var, secret, relay migration, binding, Clerk, Stripe, Resend, PostHog or DNS change. A Vercel preview reached READY on the Node 26 pin; its alias step returned 400, in a script this PR does not change.

Limitations

  • Web captures ran on 3cfb765b and 75d8ac82; Android on 433ea6f7 and 3cfb765b. Since then: a mobile route param, tests, docs and docs(privacy): describe hashed analytics identifiers and the real opt-out #172/fix(ci): run the auth email test from its own package #176. No layout change.
  • No iOS captures (the route is broken), so the iPhone Duo run has no visual proof.
  • One Android phone frame showed an empty thread feed on a cold start; a rerun of the same commit showed it. Likely capture timing, not proven.
  • With no model options, a mobile draft now shows upstream's "Connect to an environment" text even when connected.
  • Not proven until they run on main: relay deploy, auth email deploy, first nightly build-exe on Linux, EAS store builds on Node 26.
  • An existing bug remains: choosing a project in the sidebar "All projects" scope crashes with "Too many re-renders", on main too.
Web evidence (48 pairs)

UI evidence: isolated synthetic fixture (web dev server, stub Codex, headless Chrome 1440x900 at 1x, dark)

Before = 0ec7aee, the tree of main 984c2a6; after = 3cfb765 and 75d8ac8, with the same web app code as head ff448b5 (see the note below).

No regressions. Every upstream UI change reached with a visible defect now behaves as intended, and the spot checks match main apart from relative times, sidebar run order and the sidebar scroll from pingdotgg#23519. "Maximum update depth exceeded" appeared 0 times on any scene.

One open bug is inherited, not added here. Choosing a project in the sidebar "All projects" scope crashes the app with "Too many re-renders" on main and on this branch, in dev and production builds.

Scene Before (0ec7aee) After Verdict
Message from another agent (pingdotgg#23135)
Real send: the stub calls Lecturn's MCP lecturn_thread_send.
before: Message from another agent (#23135) after: Message from another agent (#23135) EXPECTED pingdotgg#23135: the full bubble with "Sent by another agent" folds to one row, labeled with the sender thread.
Citation targets a folded row (3cfb765 fix)
Citation link built with the app's helper and opened by URL.
before: Citation targets a folded row (3cfb765b fix) after: Citation targets a folded row (3cfb765b fix) EXPECTED: the row opens (aria-expanded false to true), the source shows, and the user can fold it again. Before has no fold, so the source is already visible.
Arabic and Hebrew answer (pingdotgg#22777)
Final answer mixes Arabic, Hebrew and English.
before: Arabic and Hebrew answer (#22777) after: Arabic and Hebrew answer (#22777) EXPECTED pingdotgg#22777: RTL blocks have dir=rtl and align right. The English paragraph stays left.
Arabic in the composer (pingdotgg#22777)
Typed Arabic.
before: Arabic in the composer (#22777) after: Arabic in the composer (#22777) EXPECTED pingdotgg#22777: the paragraph gets dir=rtl, was ltr.
Subagent bar in a narrow column (pingdotgg#23502)
Composer 544 px wide.
before: Subagent bar in a narrow column (#23502) after: Subagent bar in a narrow column (#23502) EXPECTED pingdotgg#23502: status drops to its own line, model and status stay readable.
Tool images past the preview limit (pingdotgg#23595)
MCP result with 11 images and a limit of 8 (1 px test images).
before: Tool images past the preview limit (#23595) after: Tool images past the preview limit (#23595) EXPECTED pingdotgg#23595: 3 "[image]" marks, was none.
Long task durations (pingdotgg#13472)
Durations patched into the stored plan (see notes).
before: Long task durations (#13472) after: Long task durations (#13472) EXPECTED pingdotgg#13472: "12h 34m 56s" stays on one line, height 16 px, was 32 px.
Blockquote, light (pingdotgg#24036) before: Blockquote, light (#24036) after: Blockquote, light (#24036) EXPECTED pingdotgg#24036: quote text uses the body color, was muted.
Usage limit banner after snooze (pingdotgg#23803)
Stub fails the turn with usageLimitExceeded, then Snooze until reset.
before: Usage limit banner after snooze (#23803) after: Usage limit banner after snooze (#23803) EXPECTED pingdotgg#23803: the banner keeps a Wake now action, was only Resume at reset.
Cmd+B, no selection (pingdotgg#24063)
Text typed, no selection, Cmd+B, more text.
before: Cmd+B, no selection (#24063) after: Cmd+B, no selection (#24063) EXPECTED pingdotgg#24063: the sidebar toggles and the text stays plain. Before: sidebar stayed, next text turned bold.
Cmd+B with a selection (pingdotgg#24063)
All text selected.
before: Cmd+B with a selection (#24063) after: Cmd+B with a selection (#24063) EXPECTED pingdotgg#24063: bolds the selection, the sidebar stays, same as before.
Usage header at 1200 px (pingdotgg#24123)
Header 944 px wide.
before: Usage header at 1200 px (#24123) after: Usage header at 1200 px (#24123) EXPECTED pingdotgg#24123: full controls fit, were collapsed to menus. 1100, 1290 and 1440 px are pixel-identical.
Thread title instructions (pingdotgg#21882)
Clip of the Text generation section.
before: Thread title instructions (#21882) after: Thread title instructions (#21882) EXPECTED pingdotgg#21882: new setting row, absent before.
Telemetry export source (pingdotgg#23713)
Server started with an unreachable LECTURN_OTLP_TRACES_URL.
before: Telemetry export source (#23713) after: Telemetry export source (#23713) EXPECTED pingdotgg#23713: "Set by environment" and the variable name, was "Off" with no source.
Toast width (pingdotgg#23777)
Toast added through the app's toast manager (see notes).
before: Toast width (#23777) after: Toast width (#23777) EXPECTED pingdotgg#23777: description 330 px wide, was 304 px.
Choosing a project in the sidebar scope
Real click on "All projects", then a project.
before: Choosing a project in the sidebar scope after: Choosing a project in the sidebar scope INHERITED, NOT A REGRESSION: "Too many re-renders" on both sides, in dev and production builds. Open on main (see notes). It blocks the scoped part of pingdotgg#23519.
Cmd+K "scout" (pingdotgg#24032, pingdotgg#24343)
Thread with two subagents.
<img src="https://github.com/user-attachments/assets/1fb0dfee-61fa-45d6-b771-295bd9c59895" width="400" alt="before: Cmd+K "scout" (pingdotgg#24032, pingdotgg#24343)"> <img src="https://github.com/user-attachments/assets/cf25a5fa-1c66-4e8a-afdc-f76e025212fe" width="400" alt="after: Cmd+K "scout" (pingdotgg#24032, pingdotgg#24343)"> EXPECTED pingdotgg#24032: subagent threads hidden, was Scout-north and Scout-south.
Cmd+K "port" (pingdotgg#24032, pingdotgg#24343)
Threads "Port the feeding log" and a newer "Report the weekly totals".
<img src="https://github.com/user-attachments/assets/867ea1e2-2e64-4ae4-ade7-4e24f3296fdf" width="400" alt="before: Cmd+K "port" (pingdotgg#24032, pingdotgg#24343)"> <img src="https://github.com/user-attachments/assets/54015aed-c082-46bd-8488-977224e05754" width="400" alt="after: Cmd+K "port" (pingdotgg#24032, pingdotgg#24343)"> EXPECTED: the whole-word match comes first, mid-word settings are gone, and message matches have their own section.
Cmd+K message search (pingdotgg#24343)
Text from an agent answer.
before: Cmd+K message search (#24343) after: Cmd+K message search (#24343) EXPECTED pingdotgg#24343: indexed search with a highlighted snippet and more matches.
Pasted image tile (pingdotgg#23832)
40 MB synthetic PNG through a real paste event. The settled frames are pixel-identical; the change is timing.
before: Pasted image tile (#23832) after: Pasted image tile (#23832) EXPECTED pingdotgg#23832: first tile at 10 ms, was 313 ms.
PR file counts (pingdotgg#23905)
Synthetic PR data (see notes).
before: PR file counts (#23905) after: PR file counts (#23905) EXPECTED pingdotgg#23905: counts align on the baseline, was center.
PR check counts (pingdotgg#23548)
Mock: detail has 1 passing check, the checks call has 3 with one failure.
before: PR check counts (#23548) after: PR check counts (#23548) EXPECTED pingdotgg#23548: "1 of 3 failing" with all 3 rows. Before: the checks call was never made, "Check details are out of date".
PR timeline and review avatars (pingdotgg#23545, pingdotgg#24259)
Synthetic PR data (see notes).
before: PR timeline and review avatars (#23545, #24259) after: PR timeline and review avatars (#23545, #24259) EXPECTED pingdotgg#23545: the avatar in collapsed rows is no longer clipped (marker top-4, was top-6). pingdotgg#24259: review head action centered on both, Edit comment not reached.
Fork on a run-less reply (pingdotgg#23117)
Migrated thread whose reply has no run.
before: Fork on a run-less reply (#23117) after: Fork on a run-less reply (#23117) UNCHANGED: the fork button stays on the reply.
Fork on a user message (pingdotgg#23117)
Hover on the later user message.
before: Fork on a user message (#23117) after: Fork on a user message (#23117) UNCHANGED on normal user messages. A folded agent message shows its actions once expanded (pingdotgg#23135), so 2 buttons became 1 while folded.
Waiting app approval
Stored request marked as a connected app tool (see notes).
before: Waiting app approval after: Waiting app approval UNCHANGED: 0 approval rows in the timeline, only the composer card.
Cmd+K "squire"
Squires enabled.
<img src="https://github.com/user-attachments/assets/84932a50-53a7-4f65-9f9f-907d8838f355" width="400" alt="before: Cmd+K "squire""> <img src="https://github.com/user-attachments/assets/423e28ca-39ff-4bd9-9371-bf19a128176d" width="400" alt="after: Cmd+K "squire""> UNCHANGED: New Squire first.
18 s streamed reply (pingdotgg#23117, pingdotgg#23124)
End frame.
before: 18 s streamed reply (#23117, #23124) after: 18 s streamed reply (#23117, #23124) EXPECTED: "Maximum update depth exceeded" 0 times on both sides. Only the stream ends differ by time.
Sidebar: project group and Stave row
Two checkouts of one repository, one Stave space.
before: Sidebar: project group and Stave row after: Sidebar: project group and Stave row UNCHANGED: 0.014%, relative times.
Sidebar rows
Row layout, status line.
before: Sidebar rows after: Sidebar rows UNCHANGED rows. The list scrolls to the open thread on mount (pingdotgg#23519); other differences are run order.
Chat timeline with work rows
Worked row expanded.
before: Chat timeline with work rows after: Chat timeline with work rows UNCHANGED timeline. Sidebar differs by pingdotgg#23519 scroll and run order.
Settled shelf
A settled thread, shelf open.
before: Settled shelf after: Settled shelf UNCHANGED shelf. Sidebar differs by run order.
Notes panel
Saved note from a selection.
before: Notes panel after: Notes panel UNCHANGED panel. Sidebar differs by run order.
Timeline minimap preview
12 turn thread, hover on the last strip.
before: Timeline minimap preview after: Timeline minimap preview UNCHANGED: same preview, sidebar only.
Composer with attachments
Image and file attached, text typed.
before: Composer with attachments after: Composer with attachments UNCHANGED: pixel-identical.
Model picker
Open from the composer.
before: Model picker after: Model picker UNCHANGED: 0.019%, sidebar only.
Palette: themes
Change theme.
before: Palette: themes after: Palette: themes UNCHANGED: pixel-identical.
Palette: threads
Search "roster".
before: Palette: threads after: Palette: threads EXPECTED pingdotgg#24343: threads, then an In messages section.
Palette: add project
Directory browser.
before: Palette: add project after: Palette: add project UNCHANGED: pixel-identical.
Pull requests list
Synthetic PR data (see notes).
before: Pull requests list after: Pull requests list UNCHANGED: 0.018%, relative times.
PR detail and watch button
Detail open, hover on the watch button.
before: PR detail and watch button after: PR detail and watch button UNCHANGED: 0.018%, relative times.
PR header
Clip of the detail header.
before: PR header after: PR header UNCHANGED: pixel-identical.
Settings: appearance before: Settings: appearance after: Settings: appearance UNCHANGED: pixel-identical.
Settings: typography before: Settings: typography after: Settings: typography UNCHANGED: pixel-identical.
Settings: connections before: Settings: connections after: Settings: connections UNCHANGED: 2 cells, port in the URL.
Settings: archive before: Settings: archive after: Settings: archive UNCHANGED: pixel-identical.
MCP app full screen after a tap (pingdotgg#18548)
Tap inside the app.
before: MCP app full screen after a tap (#18548) after: MCP app full screen after a tap (#18548) UNCHANGED: pixel-identical, tap=granted, mode=fullscreen.
HTML render dialog padding (pingdotgg#20281)
Corner clip.
before: HTML render dialog padding (#20281) after: HTML render dialog padding (#20281) UNCHANGED: padding 16 px, 3 cells.

How these were made. Both sides ran the same scripted steps, one after the other, on a fresh isolated fixture: synthetic projects, a stub Codex, Claude off, HOME set to the fixture, the github.com host turned off and the host label masked as "Fixture Mac". A pixel diff backs the verdicts. Differences from the clock or the run (relative times, ids, the dev port) are not counted.

Sources. Before is 0ec7aee, the same tree as main 984c2a6. Spot-check before frames are reused from the last checkpoint's after frames on that tree. After ran on 3cfb765; PR scenes 87 to 89 and the spot checks ran on 75d8ac8. The web app code is the same from 3cfb765 through ff448b5: later commits change mobile, CI, docs and a static privacy page.

Sidebar scope crash. Choosing any project in the scope picker, or reloading with one saved, fails with "Too many re-renders" (React error 301 in production) in <Sidebar> until the saved scope is cleared. Both production builds crash the same way, so this is inherited. Likely cause, from reading the code and not tested with a fix: useSidebarSegments.ts line 105 compares scopedProjectKeys by identity during render, and Sidebar.tsx builds that Set anew. The production pages ran from a local static server in front of the fixture server, not from a packaged app.

Fixture patches, disclosed.

  • 90: plan durations are patched into the store, since the Codex adapter does not report them.
  • 85: the toast is added through the app's own toast manager in the dev build.
  • 87 to 89 and s9: GitHub stays off, so an in-page mock answers the pull request calls with synthetic data. These scenes show rendering, not GitHub reads.
  • 97: the server has an unreachable collector URL, and its 502 console lines are filtered from the error count.
  • 102: the stored request is marked as a connected app tool. 103: the citation link is opened by URL, and the Decisions and notes UIs were not clicked.

Parity only, defect not reproduced on main here. pingdotgg#23967: the draft opens on both sides with sockets cut in the page, which may not match a truly offline project. pingdotgg#23233: no toast on either side with a forced update advisory. pingdotgg#23519: the unscoped back case already had the row in view, and the scoped case hits the crash above.

Not shown: pingdotgg#23896 tool icons in light mode (the stub has no image tool icon), the pingdotgg#24259 Edit comment action (no button with the mock), the AccountMark and Connect sidebar rows, and the PR Code tab.

Android evidence

Android evidence (phone and 10-inch tablet, dark, Lecturn theme; GitHub-hosted ubuntu-24.04, capture-only harness)

Verdict: no confirmed regression, with one open item below. Synthetic fixture only. Method: ffmpeg max-channel pixel difference, threshold 12/255. Logs: 0 "Maximum update depth" in all 15 runs; no red screens or launcher ANR dialogs in the frames reviewed.

Heads. Each row names its source. Before e5a1909b reuses the earlier frames: to 984c2a6, mobile changed only send gating for pending approvals and comments, which these scenes do not render. After 3cfb765b was compared to the 433ea6f7 frames: draft 0.00% on phone, and thread, threads, apps and tablet draft at most 0.61%, all relative times, status-bar icons and sidebar row shift. Rows marked 433ea6f7 were not recaptured on later heads. PR head 1abf40d6 differs from 3cfb765b in mobile by non-layout navigation fixes (route params, draft back and new-task routing) and tests; no capture ran on 1abf40d6.

Open item. One of 6 after captures on phone showed an empty thread feed under the composer with a draft present (first scene after a cold start, agent-row stub applied). A rerun of the same commit showed the feed, as did the other 4 phone and all 6 tablet captures. Before showed the feed in its 3 phone captures, so a before-side count this small cannot exclude a change. The cause is not established; capture timing against the feed reveal is the likely reading, and that reveal gate also exists before this merge.

Stubs. Capture-only client stubs supply the draft model, draft text, agent message attribution and scratch icon. The fixture has no model options: without a model, the draft shows upstream's (pingdotgg#23467) "Your draft is saved on this device. Connect to an environment to choose its first model." with no composer controls, even with the environment connected.

Phone (1080×1920)

Scene Before After Changed Verdict
Threads list
e5a1909 to 3cfb765
before: Threads list after: Threads list 1.18% EXPECTED (pingdotgg#23841): fifth nav item (Usage); phone bar and tablet rail. Otherwise relative times and a ~1 px sidebar row shift
Thread
e5a1909 to 3cfb765
before: Thread after: Thread 0.38% EXPECTED (pingdotgg#23570): idle composer row unchanged. Timestamps and chip anti-aliasing only; tablet rail gains Usage
Apps tab
e5a1909 to 3cfb765
before: Apps tab after: Apps tab 1.52% EXPECTED (pingdotgg#23841): nav bar only. The fixture has no connected apps, so only the empty state renders
Draft thread + composer
984c2a6 to 3cfb765
before: Draft thread + composer after: Draft thread + composer 55.48% EXPECTED (pingdotgg#23467, pingdotgg#24239, pingdotgg#23366): draft is the root Thread route with the thread composer and a backdrop; workspace controls fit and align (Import no longer clips). Model is stubbed. Tablet before has the Apps sidebar because of capture order; after has Threads
Choose project
984c2a6 to 433ea6f
before: Choose project after: Choose project 0.16% UNCHANGED: moved to the root stack with no visible change
Add project (root stack)
984c2a6 to 433ea6f
before: Add project (root stack) after: Add project (root stack) 3.40% UNCHANGED: phone difference is provider row order, which also varied between two after runs at the same head (0.16% in the other)
Stave flow (root stack)
984c2a6 to 433ea6f
before: Stave flow (root stack) after: Stave flow (root stack) 0.00% UNCHANGED: the fixture has no Stave binary, so "Stave unavailable" renders
Settings
e5a1909 to 433ea6f
before: Settings after: Settings 1.28% EXPECTED (pingdotgg#23841, pingdotgg#24348): Settings stays in the workspace with the fifth nav item
Pulls tab
e5a1909 to 433ea6f
before: Pulls tab after: Pulls tab 1.96% EXPECTED (pingdotgg#23841): nav items only. "Select a pull request" detail (pingdotgg#23143) renders on tablet and was already present before
Pull request open
e5a1909 to 433ea6f
before: Pull request open after: Pull request open 0.00% UNCHANGED: no crash. GitHub is disabled in the fixture, so only summary and load error render
Review
e5a1909 to 433ea6f
before: Review after: Review 0.16% UNCHANGED: status-bar icons and tablet sidebar times
Terminal
e5a1909 to 433ea6f
before: Terminal after: Terminal 0.38% UNCHANGED: fixture text loses its em dash (pingdotgg#23799)
Undo toast
984c2a6 to 433ea6f
before: Undo toast after: Undo toast 9.68% EXPECTED (pingdotgg#23910, pingdotgg#23928): one row, above the bottom nav, instead of two rows at the top. Notice is raised by the harness
Drafts swipe
984c2a6 to 433ea6f
before: Drafts swipe after: Drafts swipe 75.02% EXPECTED (pingdotgg#23205): before, the same swipe opened the draft; after, phone asks to delete the pending task and tablet reveals Delete
Composer with a 3-line draft
984c2a6 to 433ea6f
before: Composer with a 3-line draft after: Composer with a 3-line draft 17.53% EXPECTED (pingdotgg#23829, pingdotgg#23366): composer grows and every line shows; before clipped the top line. Draft text is stubbed
Light theme thread + chips
984c2a6 to 433ea6f
before: Light theme thread + chips after: Light theme thread + chips 33.32% EXPECTED (pingdotgg#22585, pingdotgg#23829): chat and composer chips are darker. Draft text is stubbed
No-project icon
984c2a6 to 433ea6f
before: No-project icon after: No-project icon 1.38% EXPECTED (pingdotgg#21546): chat bubble replaces the monogram. The scratch icon is stubbed onto a fixture project

10-inch tablet, split view (1440×2560)

Scene Before After Changed Verdict
Threads list
e5a1909 to 3cfb765
before: Threads list after: Threads list 0.62% EXPECTED (pingdotgg#23841): fifth nav item (Usage); phone bar and tablet rail. Otherwise relative times and a ~1 px sidebar row shift
Thread
e5a1909 to 3cfb765
before: Thread after: Thread 0.75% EXPECTED (pingdotgg#23570): idle composer row unchanged. Timestamps and chip anti-aliasing only; tablet rail gains Usage
Apps tab
e5a1909 to 3cfb765
before: Apps tab after: Apps tab 0.57% EXPECTED (pingdotgg#23841): nav bar only. The fixture has no connected apps, so only the empty state renders
Draft thread + composer
984c2a6 to 3cfb765
before: Draft thread + composer after: Draft thread + composer 37.39% EXPECTED (pingdotgg#23467, pingdotgg#24239, pingdotgg#23366): draft is the root Thread route with the thread composer and a backdrop; workspace controls fit and align (Import no longer clips). Model is stubbed. Tablet before has the Apps sidebar because of capture order; after has Threads
Choose project
984c2a6 to 433ea6f
before: Choose project after: Choose project 0.43% UNCHANGED: moved to the root stack with no visible change
Add project (root stack)
984c2a6 to 433ea6f
before: Add project (root stack) after: Add project (root stack) 0.37% UNCHANGED: phone difference is provider row order, which also varied between two after runs at the same head (0.16% in the other)
Stave flow (root stack)
984c2a6 to 433ea6f
before: Stave flow (root stack) after: Stave flow (root stack) 0.36% UNCHANGED: the fixture has no Stave binary, so "Stave unavailable" renders
Settings
e5a1909 to 433ea6f
before: Settings after: Settings 1.13% EXPECTED (pingdotgg#23841, pingdotgg#24348): Settings stays in the workspace with the fifth nav item
Pulls tab
e5a1909 to 433ea6f
before: Pulls tab after: Pulls tab 0.61% EXPECTED (pingdotgg#23841): nav items only. "Select a pull request" detail (pingdotgg#23143) renders on tablet and was already present before
Pull request open
e5a1909 to 433ea6f
before: Pull request open after: Pull request open 0.62% UNCHANGED: no crash. GitHub is disabled in the fixture, so only summary and load error render
Review
e5a1909 to 433ea6f
before: Review after: Review 0.39% UNCHANGED: status-bar icons and tablet sidebar times
Terminal
e5a1909 to 433ea6f
before: Terminal after: Terminal 0.47% UNCHANGED: fixture text loses its em dash (pingdotgg#23799)
Undo toast
984c2a6 to 433ea6f
before: Undo toast after: Undo toast 2.58% EXPECTED (pingdotgg#23910, pingdotgg#23928): one row, above the bottom nav, instead of two rows at the top. Notice is raised by the harness
Drafts swipe
984c2a6 to 433ea6f
before: Drafts swipe after: Drafts swipe 52.35% EXPECTED (pingdotgg#23205): before, the same swipe opened the draft; after, phone asks to delete the pending task and tablet reveals Delete
Composer with a 3-line draft
984c2a6 to 433ea6f
before: Composer with a 3-line draft after: Composer with a 3-line draft 6.90% EXPECTED (pingdotgg#23829, pingdotgg#23366): composer grows and every line shows; before clipped the top line. Draft text is stubbed
Light theme thread + chips
984c2a6 to 433ea6f
before: Light theme thread + chips after: Light theme thread + chips 13.55% EXPECTED (pingdotgg#22585, pingdotgg#23829): chat and composer chips are darker. Draft text is stubbed
No-project icon
984c2a6 to 433ea6f
before: No-project icon after: No-project icon 1.43% EXPECTED (pingdotgg#21546): chat bubble replaces the monogram. The scratch icon is stubbed onto a fixture project

After only

Scene Phone Tablet Note
Usage tab (433ea6f7) after: usage tab, phone after: usage tab, tablet New tab (pingdotgg#23841, pingdotgg#24348). All 5 labels fit at default text size. The Android bar reads "Chats", unchanged from main
One-line agent row (3cfb765b) after: agent row, phone after: agent row, tablet EXPECTED (pingdotgg#23135). Attribution is stubbed; the tablet Composer row before shows the full bubble

Other scenes checked with no regression (433ea6f7, not published): environments, agent activity, usage in Settings, scheduled tasks, new scheduled task, environment detail, Stave and import flows. Maintenance differs only because the earlier frame carried a stubbed database notice. The Arcane backdrop with automatic insets is the Lecturn theme, shown in the frames above at its resting scroll position.

Not covered: pingdotgg#22110 HTML links in pull request comments and a loaded pull request (no GitHub in the fixture), tapping new thread from an app card (no connected app; its draft route is the same as the draft row), large text label fit, scrolled backdrop position, other palettes, iOS (capture route broken).

🤖 Generated with Claude Code

MarcoDotIO and others added 30 commits October 21, 2026 16:06
….com footer (pingdotgg#23133)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…tgg#22976)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…otgg#22979)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
)

Co-authored-by: Pixel Perfect <me@pixp.cc>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…uest (pingdotgg#23143)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…ds with its sidebar (pingdotgg#23144)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…s list (pingdotgg#23145)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…tgg#23146)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…ine in place (pingdotgg#23147)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…its tab bar (pingdotgg#23148)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…3226)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…2094)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…gg#23052)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…card (pingdotgg#23282)

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
…uests (pingdotgg#23034)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…sed (pingdotgg#23170)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…ngdotgg#23096)

Co-authored-by: Vishal <vishalprashantdoshi@gmail.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: PR Batch Tester <agent@local.test>
Co-authored-by: Vishal Doshi <vdoshi96@users.noreply.github.com>
flamboh and others added 22 commits October 23, 2026 21:36
…ver (pingdotgg#23814)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…he version mismatch instead of reconnecting forever (pingdotgg#23647)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Theo Browne <me@theo.li>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…24206)

Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…#24339)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…e search (pingdotgg#24343)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Integrates 158 first-parent upstream commits after a12d6ed: the Node
26.12.1 pin, the iPhone Duo run, unified mobile draft and thread navigation,
Usage and Settings in mobile workspace navigation, messages from other agents
as one-line rows, right-to-left text, ChatView render isolation, indexed Cmd+K
search, GitCafe reviewers and labels, the em dash and polling test lints, and a
further test prune under the retention rule.

Fork edits moved with the code they sat in; RESOLUTION_GUIDE lists where they
landed. Relay preview and stale-issue workflows are not taken. Migrations 068
and 069 become 86 and 87 on the fork ledger.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Point the service preflight install command at the fork's real install
  script; the identity sweep had invented a dead host.
- Open folded agent rows when a citation targets them.
- Clear accountId and appId on mobile route resets, and keep app workspaces out
  of the Home new-thread fallback.
- Android Apps drafts go back to Apps, Stave draft headers read the primary
  repo, and new-task finishes keep a real thread on the back stack.
- Keep recent palette queries out of app and embed sessions.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@Nurozen Nurozen added preview:web Build and deploy a hosted web preview for this PR and removed preview:web Build and deploy a hosted web preview for this PR labels Nov 7, 2026
cgl and others added 4 commits November 7, 2026 10:05
Pin the Stave draft header git action target in its test.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The fork does not take the relay preview workflows, so it still holds.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@Nurozen
Nurozen marked this pull request as ready for review November 7, 2026 19:55
@Nurozen
Nurozen merged commit b6ba620 into main Nov 7, 2026
17 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.