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
⌕ Search 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
- 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
- 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+
#245Focus ring lost after closing palette6w
#249Crash renaming a settling threadsug.2d
#241Snooze DST boundary test●2w
#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.