Skip to content

Fix Android showcase capture and rebuild v2 queued rows - #4730

Merged
juliusmarminge merged 4 commits into
mainfrom
t3code/fix-mobile-showcase-workflow
Jul 28, 2026
Merged

Fix Android showcase capture and rebuild v2 queued rows#4730
juliusmarminge merged 4 commits into
mainfrom
t3code/fix-mobile-showcase-workflow

Conversation

@juliusmarminge

@juliusmarminge juliusmarminge commented Jul 28, 2026

Copy link
Copy Markdown
Member

Android showcase capture

The Android job failed two seconds after the environment server started, printing a single line with no stack:

cannot rollback - no transaction is active

That is the masking error, 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 — and the catch block's unguarded ROLLBACK then 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-lg title, 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", 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. 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

environments and threads scenes 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 new ThreadListV2PendingRow instead of v1 PendingTaskListRow. ThreadListV2SettledDivider becomes ThreadListV2SectionDivider with a label prop.

The v2 empty state no longer treats pending-only queues as “non-empty” (those rows live in the list body now). FlatList/LegendList extraData also 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 ROLLBACK so 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

  • Introduces ThreadListV2PendingRow in thread-list-v2-items.tsx to display queued pending tasks with project info, status label, branch, and a delete action via context menu.
  • Adds buildThreadListV2ListItems in threadListV2.ts to splice pending tasks between active and settled thread items, marking the first pending item to draw a 'Pending' section divider.
  • Updates both HomeScreen and ThreadNavigationSidebar to use the new builder, replacing manual list construction and adding project metadata to extraData for correct row invalidation.
  • Extends the showcase seed script to support settled threads and fixes SQLITE_BUSY resilience and ROLLBACK error masking in mobile-showcase-environment.ts.
  • Behavioral Change: FlatList item shapes in v2 lists change to a discriminated union (v2-thread | v2-pending) with a new item.key extractor; pending task rows move from the header into the list body.

Macroscope summarized 4962aaf.

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>
@coderabbitai

coderabbitai Bot commented Jul 28, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: a60bf96b-0d4a-4e55-84ad-21ac6b23a3e3

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch t3code/fix-mobile-showcase-workflow

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

@github-actions github-actions Bot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Jul 28, 2026

@cursor cursor Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

Bugbot Autofix is ON, but a cloud agent failed to start.

Reviewed by Cursor Bugbot for commit ff354ee. Configure here.

Comment thread apps/mobile/src/features/home/HomeScreen.tsx Outdated
Comment thread apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx
@macroscopeapp

macroscopeapp Bot commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: 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.

juliusmarminge and others added 3 commits July 28, 2026 13:34
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>
@juliusmarminge
juliusmarminge merged commit f1a68ac into main Jul 28, 2026
16 checks passed
@juliusmarminge
juliusmarminge deleted the t3code/fix-mobile-showcase-workflow branch July 28, 2026 12:09
vimoppa added a commit to vimoppa/t3code that referenced this pull request Jul 28, 2026
* 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>
github-actions Bot added a commit to omarcresp/t3code-flake that referenced this pull request Jul 28, 2026
## 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
tarik02 added a commit to tarik02/t3code that referenced this pull request Jul 28, 2026
* 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>
andreasmolnardev pushed a commit to andreasmolnardev/codewise that referenced this pull request Jul 28, 2026
github-actions Bot added a commit to omarcresp/t3code-flake that referenced this pull request Jul 29, 2026
## 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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L 100-499 changed lines (additions + deletions). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant