CONCEPT D / AGENT WORKBENCH

Invert the hierarchy: durable intent (tasks) becomes the organizing spine of the project and threads become attempts beneath it. The project opens to a three-column mission-control surface — backlog → selected intent → live execution — so the relationship between what you meant and what the agents are doing is the product's default view, not a side panel. Threads that serve no task are demoted to an orphan group.

TESTED AGAINST · busy backlog (10 tasks) · empty backlog · capture from a live thread (# log mode) · multi-attempt history (failed → retry, live) · starting an attempt (provider/model) · blocked task · done task + evidence + reopen · mobile task home · mobile task screen · mobile quick capture

D1 · WORKBENCH — BUSY · #245 SELECTED, ATTEMPT 2 LIVE
1 2 3 4 5 6
T3 t3code
Workbench 10
#245 · Focus ring lost after clos…
Focus ring bug — #245 Failed
3d
Focus ring #245 — take 2 Working
18m
#238 · Thread list flickers on r…
Reconnect flicker fix Plan ready
2h
#241 · Add test for snooze acro…
Snooze DST test Awaiting input
1d
Threads
Pinned-thread drag ordering Open PR
4h
v0.0.33 release prep Awaiting input
6h
Snoozed 3
Settled 48
Backlog 8 open · 2 done this week
Now 2
#245 Focus ring lost after closing palette…
#238 Thread list flickers on reconnect…
Open 4
#241 Add test for snooze across DST bou…
#229 Composer stash lost when switching…
#249 Crash: renaming a thread while its… Suggested
#198 Focus outline invisible on amber b… dup #245?
Blocked 2
#231 Decide retention policy for settled…
#243 Auto-archive settled threads past r… on #231
Done recent
#212 Migrate diff renderer to @pierre/di…
#207 Empty-state copy for archived thre…
t3code/ Workbench / #245
Snooze Drop Mark done
#245 Open ◆ Pinned
opened 6w ago·2 attempts
Focus ring lost after closing command palette with Esc

Close the command palette with Esc and keyboard focus drops to <body>; the focus ring disappears until you Tab twice. Repro on Safari and Chrome. Likely the palette unmount steals focus before the restore handler runs.

Provenance

Logged from Pinned-thread drag ordering · 6w ago

“esc out of the palette and my focus ring is just… gone. tab does nothing until the second press. separate from the drag work but don't lose it”
apps/web/src/palette/CommandPalette.tsx apps/web/src/a11y/useFocusRestore.ts
Attempts 2 + New attempt
1 Focus ring bug — #245 claude · opus Failed 3d ago · ran 41m

Failed — regression in palette focus trap; change reverted, findings kept.

2 Focus ring #245 — take 2 cursor · composer-2 Working started 18m ago

Restoring focus via a sentinel element captured on palette open; a11y suite running.

History · 7 events — logged, pinned, attempt 1 started/failed, description edited, attempt 2 started
LIVE · ATTEMPT 2 Working
Focus ring #245 — take 2 cursor · composer-2
Run palette a11y regression suite 4/6
Last agent message · 40s ago Replaced the manual focus() call with a sentinel that records the restore target when the palette opens, so unmount order stops mattering. Running the palette a11y suite now — attempt 1's trap regression is covered by a new case.
Terminal pnpm test --filter palette-a11y
Open thread →
  • 1 The backlog is the project's spine: durable intent grouped Now (pinned) / Open / Blocked / Done tail. Selection drives the whole surface.
  • 2 Sidebar demoted — threads render indented under small task-header rows as attempts. Orphan threads fall into a residual "Threads" group: every thread now begs for a parent.
  • 3 The task is the primary document: lifecycle state (Open) lives on the header pill; run state never touches it.
  • 4 Multi-attempt history is first-class: attempt 1 failed (red, kept as data), attempt 2 live. The task survives its executions.
  • 5 Live monitor: read-only mini thread — last agent message, plan chip with pips (execution checklist, visually distinct from tasks), Working pulse.
  • 6 "Open thread →" is the only escape hatch; the monitor is for watching, not steering — steering happens in the thread.
D2 · CAPTURE — # LOG MODE IN A LIVE THREAD, TASK LANDS IN THE SPINE
1 2 3 4
T3 t3code
Workbench 11
#238 · Thread list flickers on r…
Reconnect flicker fix Working
now
#245 · Focus ring lost after clos…
Focus ring #245 — take 2 Working
21m
Threads
Pinned-thread drag ordering Open PR
4h
Snoozed 3
Settled 48
Backlog 9 open
Now 2
#245 Focus ring lost after closing pal…
#238 Thread list flickers on reconnect…
Open 5
#250 Composer stash lost when switch… just now
#241 Add test for snooze across DST…
#249 Crash: renaming a thread while… Suggested
#198 Focus outline invisible on amber…
Blocked 2
#231 Decide retention policy for settl…
t3code/ Reconnect flicker fix Working
claude · opus
The flicker only shows past ~200 threads — virtualizer remounts everything when the socket reconnects. Can you bisect what changed?

Reproduced at 240 threads. On reconnect the list gets a fresh query key, so the virtualizer treats every row as new and remounts. Bisecting the reconnect diff to find where the key started including the socket generation.

Bisect the reconnect diff 2/5
#250 Composer stash lost when switching projects ✓ Logged

Soak test running — reconnecting every 20s against the 240-thread fixture while I narrow the range.

Logging a task — won't interrupt the agent
# reconnect spinner overlaps the toast stack claude · opus
  • 1 Typing # first flips the composer to log mode — thin indigo top border + hint. The agent never pauses; the Working pill keeps pulsing sky.
  • 2 Second capture already in flight — log mode is cheap enough to use twice in one sitting.
  • 3 Visible durability: #250 lands at the top of the backlog column in real time. You SEE it enter the spine.
  • 4 Confirmation chip in the timeline: one line, mono id, "Logged" — never a card. Plan chip above it (pips) shows task ≠ checklist at a glance.
D3 · WORKBENCH — EMPTY BACKLOG (SIDEBAR CROPPED)
Backlog 0 open
Now
Nothing pinned
Open
xenforo-cloud/ Workbench
#
No open tasks

This project's outstanding work will live here — log with # from any thread, or press # right here.

Log a task
  • No callouts — note the cost though: an empty three-column workbench is a lot of chrome for a project with zero tasks. The empty state has to sell the habit.
D4 · STARTING AN ATTEMPT — #238, INLINE PROVIDER/MODEL (CENTER COLUMN)
1 2 3
t3code/ Workbench/ #238
#238 Open
opened 2w ago
Thread list flickers on reconnect when >200 threads
Attempts 1
cursor composer-2 seeds a focused thread with the #238 doc + files Start
1 Reconnect flicker — attempt 1 cursor · composer-2 Working started 5s ago

Spawned focused thread · reading ThreadListVirtualizer.tsx

History · 3 events
  • 1 "New attempt" expands to an inline provider/model row — no modal. Start spawns a focused thread pre-seeded with the task document.
  • 2 The attempt card carries the run state (sky Working, pulsing) the moment it exists.
  • 3 Task ≠ run: the header pill stays Open. Lifecycle state on the task, execution state on the attempt — they never merge.
D5 · BLOCKED TASK SELECTED — #243 (CENTER COLUMN INSET)
t3code/ Workbench/ #243
#243 Open Blocked
opened 3w ago
Auto-archive settled threads past retention window
Blocked — waiting on #231 · Decide retention policy for settled threads →
Can't pick an archive window until the retention decision lands.
Attempts

No attempts — blocked tasks can't spawn one. Unblocks automatically when #231 closes.

D6 · DONE TASK — #212, EVIDENCE + REOPEN (CENTER COLUMN INSET)
t3code/ Workbench/ #212
#212 Done
closed 5d ago
Migrate diff renderer to @pierre/diffs v3
1 Diff renderer migration claude · opus Done 5d ago · ran 2h 10m

Migrated 14 call sites; visual parity confirmed against the old renderer.

Verification
✓ pnpm test — 214 passed screenshot diff +38 −6 Reopen
M1 · MOBILE HOME — TASK-CENTRIC, SEGMENTED
9:41▪▪▪ ᯤ ▮

t3code

Tasks Threads
Now
#245
Focus ring lost after closing palette Attempt 2 working · 18m
#238
Thread list flickers on reconnect Plan ready
Open
#241
Add test for snooze across DST
#250
Composer stash lost when switching… logged 2m ago
#249
Crash: renaming a settling thread Suggested — accept?
Blocked
#231
Decide retention policy Blocked — needs decision
Done
#212
Migrate diff renderer to v3
M2 · MOBILE TASK SCREEN — #245, STACKED CENTER COLUMN
9:41▪▪▪ ᯤ ▮
‹ Tasks
#245 Open 6w
Focus ring lost after closing command palette with Esc

Esc from the palette drops focus to body; ring gone until you Tab twice. Safari + Chrome.

Provenance
“esc out of the palette and my focus ring is just… gone”
from Pinned-thread drag ordering · 6w
Attempts · 2
1
Focus ring bug — #245 Failed — palette focus trap regression
2
Take 2 · cursor · composer-2 Working · a11y suite · 18m
+ New attempt
  • Live attempt row taps straight into the thread — the monitor column collapses into the list on mobile.
M3 · MOBILE QUICK CAPTURE — # CHIP ABOVE KEYBOARD
9:41▪▪▪ ᯤ ▮
‹ t3code
Reconnect flicker fix
● Working
Only flickers past ~200 threads — bisect it?
Reproduced at 240. The virtualizer remounts on reconnect — bisecting the diff now.
#250 Composer stash lost when switching… ✓ Logged
Logging a task — won't interrupt the agent
reconnect spinner overlaps the toasts
# Task Aa @
QWERTYUIOP
ASDFGHJKL
ZXCVBNM
123spacelog
  • The # Task chip above the keyboard is the mobile log-mode toggle; the return key relabels to "log".