Fix Android showcase capture and rebuild v2 queued rows - #4730
Conversation
The Android showcase job died two seconds after the environment server started, printing one line: "cannot rollback - no transaction is active". That error was the masking, not the failure. The seed opens state.sqlite while the server it just started is still writing, so BEGIN IMMEDIATE loses the write-lock race and returns "database is locked"; the catch block's unguarded ROLLBACK then threw over it. A local probe against a fresh server reproduces both strings — 1 failure in 40 attempts on an idle machine, and none in 120 once the connection carries a busy timeout. Give the seed a 30s timeout, guard the rollback, and print stacks from the harness: it only fails in CI, where the line that threw is the whole diagnosis. Queued tasks rendered in Thread List v2 with the v1 row design — a bold `text-lg` title, a zinc "Pending" pill, and a chevron — so the one row you cannot act on shouted louder than the live work above it. Rebuild them in the v2 card idiom (project line, title, `branch · machine`) under a "Pending" divider that mirrors "Settled", with "Queued" in the status slot. The label stays uncolored: v2 reserves hue for act-now, in-motion, and broken, and a queued task asks nothing of the user. The showcase fixture had no settled threads, so the list screenshotted as one undifferentiated block. Seed three (one per project, 5h/28h/2d) with an explicit settled override, and drop the oldest unlabeled active thread so the settled tail starts above the fold on a phone. Co-Authored-By: Claude <noreply@anthropic.com>
|
Important Review skippedAuto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Repository UI Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.
Bugbot Autofix is ON, but a cloud agent failed to start.
Reviewed by Cursor Bugbot for commit ff354ee. Configure here.
ApprovabilityVerdict: Needs human review This PR introduces new UI components and changes how pending tasks are positioned in the thread list (moved from header to inline between active/settled items). While well-tested and contained to presentation logic, the behavioral changes to list ordering and empty states warrant human review. You can customize Macroscope's approvability policy. Learn more. |
Queued tasks led the list, which put the one row nothing can happen to above every live thread. Order the sections active → pending → settled instead: queued work is waiting on its environment, not asking anything of the user, so it belongs between the live block and history. The splice lives in buildThreadListV2ListItems so the compact Home list and the iPad sidebar cannot drift on section order or divider placement; queued rows also move out of the Home ListHeaderComponent into the list data, so they recycle like every other row. Co-Authored-By: Claude <noreply@anthropic.com>
A queued title is derived from the whole prompt rather than written as a title, so the second line an active row allows was landing a stray word or a lone emoji under an otherwise full line. Truncate instead. Co-Authored-By: Claude <noreply@anthropic.com>
Two review findings on the v2 queued row: The row always printed the environment label, while v2 thread rows only print it when more than one environment is connected. On a single machine the queued rows named it and the live rows above them did not, which is exactly the inconsistency the label gate exists to avoid. Project shells load after the first rows draw, but the lists' extraData omitted the maps those shells feed, so a recycled row kept the blank favicon and fallback title it first rendered with. Pass projectByKey, projectCwdByKey, and projectTitleByProjectKey through extraData on both the Home v2 list and the sidebar so late-arriving project metadata re-renders the rows that display it. Co-Authored-By: Claude <noreply@anthropic.com>
* fix(mobile): threads load snapped to bottom on iOS (pingdotgg#4689) Co-authored-by: Claude Fable 5 <noreply@anthropic.com> * feat: default sidebar v2 on for nightly and dev builds (pingdotgg#4491) Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com> * fix(web): 33 web UI fixes (pingdotgg#4700) * Make mobile Thread List v2 the default (pingdotgg#4717) * Fix mobile showcase workflow without Clerk (pingdotgg#4718) * Fix relay credential lookup for unlinked environments (pingdotgg#4692) Co-authored-by: codex <codex@users.noreply.github.com> * Settle merged PR threads immediately (pingdotgg#4704) * feat(web): add maria's sidebar header artwork toggle (pingdotgg#4652) * feat(web): add appearance settings category (pingdotgg#4715) * fix(desktop): allow updater-controlled relaunch (pingdotgg#4721) * fix(web): prevent diff panel scroll jumping (pingdotgg#4724) * Link inline code file paths in chat markdown (pingdotgg#4726) Co-authored-by: Claude Fable 5 <noreply@anthropic.com> * Fix Android showcase capture and rebuild v2 queued rows (pingdotgg#4730) Co-authored-by: Claude <noreply@anthropic.com> * fix(nix): refresh pnpm dependency hash --------- Co-authored-by: Theo Browne <me@t3.gg> Co-authored-by: Claude Fable 5 <noreply@anthropic.com> Co-authored-by: Max Katz <me@maxkatz.me> Co-authored-by: Julius Marminge <julius0216@outlook.com> Co-authored-by: codex <codex@users.noreply.github.com> Co-authored-by: jan <hi@4bs3nt.com>
## What's Changed * fix(web): prevent diff panel scroll jumping by @0x4bs3nt in pingdotgg/t3code#4724 * Link inline code file paths in chat markdown by @juliusmarminge in pingdotgg/t3code#4726 * Fix Android showcase capture and rebuild v2 queued rows by @juliusmarminge in pingdotgg/t3code#4730 **Full Changelog**: pingdotgg/t3code@v0.0.30-nightly.20260728.931...v0.0.30-nightly.20260728.932 Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.30-nightly.20260728.932
* Add OTA update checks to mobile settings (pingdotgg#4686) * fix(mobile): threads load snapped to bottom on iOS (pingdotgg#4689) Co-authored-by: Claude Fable 5 <noreply@anthropic.com> * feat: default sidebar v2 on for nightly and dev builds (pingdotgg#4491) Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com> * fix(web): 33 web UI fixes (pingdotgg#4700) * Make mobile Thread List v2 the default (pingdotgg#4717) * Fix mobile showcase workflow without Clerk (pingdotgg#4718) * Fix relay credential lookup for unlinked environments (pingdotgg#4692) Co-authored-by: codex <codex@users.noreply.github.com> * Settle merged PR threads immediately (pingdotgg#4704) * feat(web): add maria's sidebar header artwork toggle (pingdotgg#4652) * feat(web): add appearance settings category (pingdotgg#4715) * fix(desktop): allow updater-controlled relaunch (pingdotgg#4721) * fix(web): prevent diff panel scroll jumping (pingdotgg#4724) * Link inline code file paths in chat markdown (pingdotgg#4726) Co-authored-by: Claude Fable 5 <noreply@anthropic.com> * Fix Android showcase capture and rebuild v2 queued rows (pingdotgg#4730) Co-authored-by: Claude <noreply@anthropic.com> * perf(server): negotiate permessage-deflate on the websocket (pingdotgg#4705) Co-authored-by: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Julius Marminge <julius0216@outlook.com> Co-authored-by: Theo Browne <me@t3.gg> Co-authored-by: Claude Fable 5 <noreply@anthropic.com> Co-authored-by: Max Katz <me@maxkatz.me> Co-authored-by: codex <codex@users.noreply.github.com> Co-authored-by: jan <hi@4bs3nt.com>
Co-authored-by: Claude <noreply@anthropic.com>
## What's Changed * Add OTA update checks to mobile settings by @juliusmarminge in pingdotgg/t3code#4686 * fix(mobile): threads load snapped to bottom on iOS by @t3dotgg in pingdotgg/t3code#4689 * feat: default sidebar v2 on for nightly and dev builds by @t3dotgg in pingdotgg/t3code#4491 * fix(web): 33 web UI fixes by @maxktz in pingdotgg/t3code#4700 * Make mobile Thread List v2 the default by @juliusmarminge in pingdotgg/t3code#4717 * Fix mobile showcase workflow without Clerk by @juliusmarminge in pingdotgg/t3code#4718 * Fix relay credential lookup for unlinked environments by @juliusmarminge in pingdotgg/t3code#4692 * Settle merged PR threads immediately by @t3dotgg in pingdotgg/t3code#4704 * feat(web): add maria's sidebar header artwork toggle by @maxktz in pingdotgg/t3code#4652 * feat(web): add appearance settings category by @maxktz in pingdotgg/t3code#4715 * fix(desktop): allow updater-controlled relaunch by @0x4bs3nt in pingdotgg/t3code#4721 * fix(web): prevent diff panel scroll jumping by @0x4bs3nt in pingdotgg/t3code#4724 * Link inline code file paths in chat markdown by @juliusmarminge in pingdotgg/t3code#4726 * Fix Android showcase capture and rebuild v2 queued rows by @juliusmarminge in pingdotgg/t3code#4730 * perf(server): negotiate permessage-deflate on the websocket by @t3dotgg in pingdotgg/t3code#4705 * docs: overhaul agent guidance by @t3dotgg in pingdotgg/t3code#4782 * Prevent sidebar row labels from truncating by @juliusmarminge in pingdotgg/t3code#4789 * perf(server): gzip large thread snapshots by @t3dotgg in pingdotgg/t3code#4788 * fix(web): stashed prompts now survive switching providers by @t3dotgg in pingdotgg/t3code#4787 * Fix Git ref refresh resource storms by @juliusmarminge in pingdotgg/t3code#4727 * perf(server): trim stale context-window rows and drop dead replay RPC by @t3dotgg in pingdotgg/t3code#4791 * fix(web): defer command palette filesystem navigation by @juliusmarminge in pingdotgg/t3code#2109 * fix(release): skip scripts during Vercel installs by @t3dotgg in pingdotgg/t3code#4796 * refactor(client): share filesystem browse navigation by @juliusmarminge in pingdotgg/t3code#4797 * fix(mobile): defer filesystem navigation by @juliusmarminge in pingdotgg/t3code#4799 * refactor(server): use native HTTP compression streams by @juliusmarminge in pingdotgg/t3code#4798 * Remove Connect waitlist and add GA announcement tooling by @juliusmarminge in pingdotgg/t3code#4691 **Full Changelog**: pingdotgg/t3code@v0.0.29...v0.0.30 ## What's Changed * Add OTA update checks to mobile settings by @juliusmarminge in pingdotgg/t3code#4686 * fix(mobile): threads load snapped to bottom on iOS by @t3dotgg in pingdotgg/t3code#4689 * feat: default sidebar v2 on for nightly and dev builds by @t3dotgg in pingdotgg/t3code#4491 * fix(web): 33 web UI fixes by @maxktz in pingdotgg/t3code#4700 * Make mobile Thread List v2 the default by @juliusmarminge in pingdotgg/t3code#4717 * Fix mobile showcase workflow without Clerk by @juliusmarminge in pingdotgg/t3code#4718 * Fix relay credential lookup for unlinked environments by @juliusmarminge in pingdotgg/t3code#4692 * Settle merged PR threads immediately by @t3dotgg in pingdotgg/t3code#4704 * feat(web): add maria's sidebar header artwork toggle by @maxktz in pingdotgg/t3code#4652 * feat(web): add appearance settings category by @maxktz in pingdotgg/t3code#4715 * fix(desktop): allow updater-controlled relaunch by @0x4bs3nt in pingdotgg/t3code#4721 * fix(web): prevent diff panel scroll jumping by @0x4bs3nt in pingdotgg/t3code#4724 * Link inline code file paths in chat markdown by @juliusmarminge in pingdotgg/t3code#4726 * Fix Android showcase capture and rebuild v2 queued rows by @juliusmarminge in pingdotgg/t3code#4730 * perf(server): negotiate permessage-deflate on the websocket by @t3dotgg in pingdotgg/t3code#4705 * docs: overhaul agent guidance by @t3dotgg in pingdotgg/t3code#4782 * Prevent sidebar row labels from truncating by @juliusmarminge in pingdotgg/t3code#4789 * perf(server): gzip large thread snapshots by @t3dotgg in pingdotgg/t3code#4788 * fix(web): stashed prompts now survive switching providers by @t3dotgg in pingdotgg/t3code#4787 * Fix Git ref refresh resource storms by @juliusmarminge in pingdotgg/t3code#4727 * perf(server): trim stale context-window rows and drop dead replay RPC by @t3dotgg in pingdotgg/t3code#4791 * fix(web): defer command palette filesystem navigation by @juliusmarminge in pingdotgg/t3code#2109 * fix(release): skip scripts during Vercel installs by @t3dotgg in pingdotgg/t3code#4796 * refactor(client): share filesystem browse navigation by @juliusmarminge in pingdotgg/t3code#4797 * fix(mobile): defer filesystem navigation by @juliusmarminge in pingdotgg/t3code#4799 * refactor(server): use native HTTP compression streams by @juliusmarminge in pingdotgg/t3code#4798 * Remove Connect waitlist and add GA announcement tooling by @juliusmarminge in pingdotgg/t3code#4691 **Full Changelog**: pingdotgg/t3code@v0.0.29...v0.0.30 Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.30

Android showcase capture
The Android job failed two seconds after the environment server started, printing a single line with no stack:
That is the masking error, not the failure. The seed opens
state.sqlitewhile the server it just started is still writing, soBEGIN IMMEDIATEloses the write-lock race and returnsdatabase is locked— and thecatchblock's unguardedROLLBACKthen threw over it. A local probe against a freshly-started server reproduces both strings verbatim:{ "ok": 39, "busy": 1, "firstError": { "original": "Error: database is locked", "masked": "Error: cannot rollback - no transaction is active" } }1 failure in 40 attempts on an idle Mac; 0 in 120 once the connection carries a busy timeout. On a Linux runner with an emulator saturating the CPU it hit on the first try. So: a 30s busy timeout on the seed connection, a guarded rollback so the real error survives, and stack output from the harness — it only fails in CI, where the line that threw is the whole diagnosis.
Queued rows in Thread List v2
Queued tasks rendered in v2 with the v1 row design — bold
text-lgtitle, zinc "Pending" pill, chevron — so the one row you cannot act on shouted louder than the live work above it. They now use the v2 card idiom (project line, title,branch · machine) under a "Pending" divider mirroring "Settled", withQueuedin the status slot. The label stays uncolored: v2 reserves hue for act-now, in-motion, and broken, and a queued task asks nothing of the user. v1 keeps its own row unchanged.Showcase fixture
The fixture had no settled threads, so the list screenshotted as one undifferentiated block. Three are seeded now (one per project, 5h / 28h / 2d) with an explicit
settled_override, and the oldest unlabeled active thread was dropped so the settled tail starts above the fold on a phone. The fixture test asserts every project contributes to both the active block and the settled tail.Verification
environmentsandthreadsscenes captured locally on iPhone 6.9 and iPad 13 — pending, active, and settled all render, on both the compact list and the split-view sidebar. Android was not captured locally (build cancelled); this branch needs a workflow run to confirm that leg.Typecheck, lint, format, and 760 tests (scripts + mobile) pass.
🤖 Generated with Claude Code
Note
Low Risk
Changes are limited to mobile thread-list UI (v1 unchanged) and dev/CI showcase seeding; no auth, payments, or server API behavior.
Overview
Thread List v2 moves offline queued tasks out of the list header and into the flat list via shared
buildThreadListV2ListItems, ordered active → pending → settled with a Pending section divider (same pattern as Settled). Home and the iPad sidebar both render them with newThreadListV2PendingRowinstead of v1PendingTaskListRow.ThreadListV2SettledDividerbecomesThreadListV2SectionDividerwith alabelprop.The v2 empty state no longer treats pending-only queues as “non-empty” (those rows live in the list body now). FlatList/LegendList
extraDataalso includes project maps so rows refresh when project shells load after first paint.Showcase / CI: seeding opens SQLite with a 30s busy timeout, uses a guarded
ROLLBACKso lock errors aren’t masked, seeds settled threads for screenshots, and the showcase harness prints stacks on failure.Reviewed by Cursor Bugbot for commit 4962aaf. Bugbot is set up for automated code reviews on this repo. Configure here.
Note
Fix Android showcase capture and render queued pending tasks inline in thread list v2
ThreadListV2PendingRowin thread-list-v2-items.tsx to display queued pending tasks with project info, status label, branch, and a delete action via context menu.buildThreadListV2ListItemsin threadListV2.ts to splice pending tasks between active and settled thread items, marking the first pending item to draw a 'Pending' section divider.extraDatafor correct row invalidation.SQLITE_BUSYresilience and ROLLBACK error masking in mobile-showcase-environment.ts.v2-thread|v2-pending) with a newitem.keyextractor; pending task rows move from the header into the list body.Macroscope summarized 4962aaf.