Recommended direction · T3 Code Tasks

The Project Ledger #

A durable, project-scoped ledger of agreed outstanding work, written mostly by agents and owned by T3. Capture is explicit — /task in the composer, a shortcut, select-text → Log as task, or just say “log that”. The # sigil is reserved for identity and reference (#245 autocompletes anywhere); it never creates. Out-of-band capture is stored raw-first and never touches a running agent; conversational capture goes through the active agent, which knows what “that” means. A task is intent; threads remain execution, linked through explicit attempts. Chassis from Concept B, capture language from Concept C, attention model from Concept A. No board, no sprints, no assignees.

R1 · The ledger — six weeks later, #245 selected
R1 · Desktop · project tasks surface + detail panel · 1160 × 668
1
2
3
4
5
Search⌘K
# Tasks 13
T3 Reconnect flicker fix2m
Working · fixing list virtualization
T3
Pinned-thread drag ordering
Done
3h
T3
v0.0.33 release prep
Approval
1d
XFBilling webhook retries2d
T3Snooze DST test4d
Snoozed 2
Settled 128
t3code/Tasks
Open10 Blocked2 Snoozed1 Done41 Sort: newest ▾
Pinned
#245Focus ring lost after closing command palette with Esc 6w
Open
#249Crash: renaming a thread while its agent is settling suggested2d
#248Composer stash indicator overlaps model chip at narrow widths4d
#241Add test for snooze across DST boundary attempt · working 2w
#238Thread list flickers on reconnect when >200 threads3w
#231Decide retention policy for settled threads blocked · decision5w
#230Bulk settle needs retention policy first blocked · #2315w
#229Composer stash lost when switching projects5w
#198Focus outline invisible on amber buttons9w
#187Terminal scrollback jumps when resizing right panel11w
Done 41
#212Migrate diff renderer to @pierre/diffs v3 3w
#207Empty-state copy for archived threads 7w
#245 Open logged 6w ago ⌖ ⋯
Focus ring lost after closing command palette with Esc
StartSnooze Done
Original capture · Chris · Jun 26
“Log the focus-ring bug as a task. It seems to happen after closing the command palette with Escape.”
Brief · written by luna at capture
After dismissing the command palette with Escape, keyboard focus returns to body instead of the trigger, so the focus ring disappears and tab order restarts. Seen in the drag-ordering session on macOS. Possibly the palette's focus-trap teardown racing the close animation.
Files
CommandPalette.tsx · mentioneduseFocusTrap.ts · recently changedfocusRing.ts · inferred
Attempts
None yet — Start creates a focused thread seeded with this record.
Related
#198 Focus outline invisible on amber buttons
History · 3 events
  • 1 One sidebar row, scoped to the active project. The count is Open + Blocked only — Done and Snoozed never inflate it. No red badges, no unread state: a ledger, not an inbox.
  • 2 Rows are stable (id order, newest first) and quiet: signal chips render only when true. An agent working elsewhere never reorders this list.
  • 3 Blocked is a flag with a reason, not a swimlane — 2px amber inset, “blocked · #231”. #230 unblocks automatically when #231 completes.
  • 4 Detail opens beside the list (like the diff panel) so triage flow is never lost. Verbs above the fold: Start, Snooze, Done.
  • 5 Every claim is attributable at a glance: the original capture is the user's exact words, immutable; the brief is labelled as written by the text-gen model; each file carries its basis (mentioned / recently changed / inferred). Re-enrichment is safe because generated text never overwrites human text — and a cheap model's guess can never masquerade as fact for six weeks.
R2 · The specified sequence, end to end (brief steps 1–14)
S1 · Steps 1–3 · agent mid-run, user logs without interrupting · 560 × 420
t3code/ Pinned-thread drag ordering Working
Now make the pinned cards reorderable by drag, persisting the order.
Wire dnd-kit sensors to the pinned block 3/7
Working for 42s · editing SidebarV2.tsx
1
/task Out of band — the agent never sees this · esc to cancel
/task Log the focus-ring bug — happens after closing the command palette with Escape
↵ log
  • 1 Capture is explicit: /task, the ⌘⇧T shortcut, or select-text → “Log as task”. All are out of band — the exact words are stored immediately and the running turn is untouched (Working pill keeps pulsing). Bare # never creates; it only references (#24… autocompletes existing tasks). Saying “log that as a task” conversationally is the other path — it goes through the active agent, which knows what “that” refers to (see S2b). Once /task mode is entered, everything typed or pasted is literal content — subsequent lines beginning with #, code fences, and shell comments stay task text, never syntax.
S2 · Steps 4–5 · confirmation chip, work continues · 560 × 420
t3code/ Pinned-thread drag ordering Working
Persist order to thread settings 4/7
2
Task created #245 Focus ring lost after closing command palette with Esc Current: Open
Great — and make sure drag works with keyboard too.
Keyboard reordering is in: Alt+↑/↓ moves the focused pinned card, announced via aria-live…
Reply, /task to log out of band, #245 to reference…
claude · opus
chip states · raw-first, enrichment additive, status always “current”
Task created #245 “Log the focus-ring bug — happens after closing the command palette with Escape” saved · writing brief…
Task created #245 Focus ring lost after closing command palette with Esc Current: Open
Task created #245 Focus ring lost after closing command palette with Esc Current: Done ✓
  • 2 The confirmation IS the record: a one-line chip anchored at the capture point in the timeline. The creation event is immutable (“Task created”, the user's words); the status on the right is explicitly current — a live reference, not a snapshot. The raw sentence is a valid task by itself; the brief-writer's title lands seconds later, additively. If enrichment fails, the chip simply keeps the raw words. No toast, no modal, no reordering.
S2b · the other path · conversational capture through the active agent · 560 × 420
t3code/ Pinned-thread drag ordering Working
…the reorder handler was also firing on the settled tail. I've scoped the sensors to the pinned block only. One thing I noticed: the drag preview loses its shadow under Safari.
1
Log that as a task — the Safari shadow thing. Then keep going.
Task created #246 Drag preview loses shadow in Safari during pinned reorder Current: Open
Logged #246 with the repro I just saw. Continuing with the keyboard reordering.
Reply, /task to log out of band, # to reference…
claude · opus
  • 1 “Log that” is an ordinary message to the working agent — it IS part of the turn, and that's the point: the agent knows what “that” means and writes a richer brief through t3_task_create. Same canonical task, same chip. T3 never classifies composer text or silently reroutes it — “Log that, then fix the failing test” must reach the agent whole. Out of band = guaranteed non-interrupting; conversational = context-richer. The user picks by construction, not by classifier.
S3 · Steps 9–10 · starting #245 with a chosen provider · 560 × 420
#245Open logged 6w ago
Focus ring lost after closing command palette with Esc
StartSnoozeDone
After dismissing the command palette with Escape, keyboard focus returns to body…
3
Start #245
New focused thread
Seeded with this task's record · default
Continue in current thread
Pinned-thread drag ordering
codex · gpt-5.3
Start thread
  • 3 Default: a new focused thread (conversationally saying “let's work on #245” continues in place instead — context wins). The provider/model select is the standard new-thread control: a task logged by Claude can be executed by Codex. The choice is remembered per user.
S4 · Step 11 · task shows the run, without becoming the checklist · 560 × 420
t3code/ Focus ring bug — #245 Working
4
# #245 Focus ring lost after closing command palette with Esc
Task record attached — description, origin excerpt, and 3 files. The agent reads it as context; the thread stays linked as an attempt.
Reproduce: palette → Esc → inspect activeElement 1/4
5
#245 Focus ring lost after closing command palette… Open attempt · working
  • 4 The focused thread opens seeded with the task record — no re-explaining, months later, on any provider.
  • 5 Ledger row during execution: task status stays Open (zinc); the run state is a separate sky chip borrowed from thread-status language. The plan pips belong to the thread's turn; the task never absorbs them. Kill the run and the task is simply Open again — nothing to clean up.
S5 · Steps 12–13 · attempt done, agent proposes — the human closes · 460 × 440
#245Open attempt 1 finished today
Focus ring lost after closing command palette with Esc
Proposed completion · by attempt 1's agent
Focus now returns to the palette's trigger element on Escape. Root cause: the focus trap released after the close animation removed the trigger from the tab order.
Evidence
6
✓ pnpm test — 214 passed screenshot · focus-ring.png diff +38 −6
Attempts
1 Focus ring bug — #245 codex · gpt-5.3 attempt done
Mark doneNot fixed — keep open
History · 5 events
  • 6 The attempt ending does not resolve the intent: the task stays Open while the agent proposes closure with a summary and evidence. One click (or “close it”) marks it Done; evidence rides with the task forever. “Close automatically after verified completion” can become a preference later — the default keeps the human as the authority on intent.
S6 · Step 14 · reopened — completion is reversible · 460 × 420
#245Open reopened
Focus ring lost after closing command palette with Esc
Note from Chris · today
“Still occurs in Safari when the palette is closed while a menu inside it is open.”
Attempts
1 Focus ring bug — #245 codex · gpt-5.3 attempt done
Start attempt 2Snooze
7
History
  • reopened · Chris · today — “still occurs in Safari…”
  • done · agent proposed, Chris confirmed · 1w
  • attempt started · codex · gpt-5.3 · 1w
  • logged · from “Pinned-thread drag ordering” · 6w
  • 7 Reopening restores Open, keeps the first attempt's history, and records why. The next attempt's agent sees the whole story: original finding, first fix, the Safari counter-example.
R3 · Mobile — capture anywhere, monitor from your pocket
M1 · Quick capture from a thread
9:4198%
Drag ordering Working
Make the pinned cards reorderable by drag.
Working for 42s · editing SidebarV2.tsx
1
Log a task — out of band, saved as written
Focus ring lost after closing palette with Esc…
Log
  • 1 The # chip above the keyboard opens a one-field sheet. Away from the desk with no thread open, the same sheet is reachable from Home — capture first, enrichment later.
M2 · Project tasks — segmented with threads
9:4198%
t3code+
Threads
Tasks · 13
#245Focus ring lost after closing palette6w
#249Crash renaming a settling threadsug.2d
#241Snooze DST boundary test2w
#238Thread list reconnect flicker3w
#231Retention policy decisionblk5w
#229Composer stash lost on switch5w
Done · 41 ›
M3 · Remote monitoring — task vs run, distinct
9:4198%
#245
Open logged 6w ago
Focus ring lost after closing command palette with Esc
Focus returns to body instead of the trigger after Escape…
2
Attempt
Focus ring bug — #245 Working
Reproduce: palette → Esc → inspect activeElement · 1/4
Logged fromPinned-thread drag ordering
  • 2 Started on desktop, watched from the phone: the task card (durable, calm) and the attempt card (live, sky, pulsing) are separate surfaces — the same thread-status colors used everywhere in T3.
R4 · Detail hierarchy & object model

Task detail — progressive disclosure

Always visible
  • #id · status · age · pinned/blocked flags · title
  • original capture (user's exact words, immutable)
  • brief (labelled as model-written) + provenance sentence
  • verbs: Start / Snooze / Done
One interaction away
  • Open at origin → (deep link to the turn)
  • files with basis (mentioned / recently changed / inferred)
  • attempts — numbered episodes with provider, outcome, evidence
  • related tasks · external issue link (when promoted)
Behind the History disclosure
  • full event log (logged, edited, attempts, proposed, done, reopened)
  • raw enrichment packet (what the brief-writer saw)
  • duplicate-merge trail · agent-verified facts vs inferred ones

Objects & relationships — target model (V1 ships Open/Done only)

Project ─ owns ── # Task and Thread
Task = immutable original capture + additive brief + provenance + lifecycle + Attempts
Task ── logged from ──▸ Thread → Turn (excerpt copied at capture; link may die, excerpt can't)
Attempt = one bounded episode of work: threadId + turn · provider/model · status/outcome · evidence
a thread can serve two tasks · one thread can hold two attempts · manual completion is a completion event with evidence — no attempt manufactured (the schema still allows threadless attempts)
Task ── blocked by / related ──▸ Task · promoted ──▸ External issue (link only)
Plan / todo pips ──▸ belong to a Turn — provider execution state, never promoted to tasks automatically
Invariants: a task can exist without a thread and a thread without a task · completing an attempt never completes the task — the agent proposes, the human closes · original capture text is immutable; enrichment is additive and attributed · deleting an origin never deletes a task.
First implementation slice (desktop/web validates the model): T3-owned project tasks · explicit out-of-band capture (/task + shortcut) · t3_task_* create/read/update/list tools for one or two providers (Claude Code's native Tasks stay untouched as execution state, taught apart by provider instructions — no aliasing) · stable #n ids · immutable capture + editable title/description · Open/Done · origin excerpt + deep link · ledger + detail panel · Start in a new thread · complete/reopen · the timeline chip.

Shipped V1 (before calling the feature complete): adds minimal mobile — quick capture (raw-first, offline-safe), compact project task list, task detail sufficient to understand and reference, and #245 deep links. Starting attempts, editing briefs, provenance layers, and evidence-based completion stay desktop-first.

Then, in order: ① continue-in-thread + richer attempt history ② snooze & pinning ③ blocked-by ④ evidence chips ⑤ remaining providers ⑥ promotion / import. Never: boards, sprints, points, assignees, due dates, required tags.