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".