Skip to content

One task page for every task: a run's task opens the real task room - #1485

Merged
AbirAbbas merged 886 commits into
devfrom
task/one-task-page
Sep 25, 2026
Merged

AbirAbbas merged 886 commits into
devfrom
task/one-task-page

Conversation

@santoshkumarradha

@santoshkumarradha santoshkumarradha commented Sep 24, 2026 •

Copy link
Copy Markdown
Member

One task page for every task

In a chat, a task on the run engine opened a page of its own. #1420 restyled it to look like the task room, but it was still a second page: no transcript or work tab, no steer box, no step rows, and no tokens or model. Now every task opens the real task room, on either engine. There is one page type.

What a run's task shows in the room

The room reads the run's task through the session layer:

  • Transcript tab: the work order, then the trajectory's steps drawn as the room's own shell calls, with their output. The step in flight is the newest call. A refused action is one dim refused line. A call that did not run for any other reason has no row, but it still counts in the steps. Notes you left are drawn where corrections are drawn. Notes from a worker or the run name no author. The result comes last once the task has ended.
  • Work tab: the run's working copy, diffed against the commit it was cut from, plus the files it added. The files codeaf keeps there are left out. A copy that is gone from disk is read off its branch. This uses the new session.PlanTaskWork, built on runCopyOf and the run's notice copy.
  • Box: a message becomes a note on the store task (PlanNote). Once the store has it, the room says the worker reads a note at its next step. A refused note shows the store's own sentence on the line you typed. On a task that has ended, the room refuses the note before sending it, in the same words its box and foot already show (this task has finished), and keeps the text in the box.
  • x: raises the Stop this task? card and then stops the task through the plan's door. For the run's root, that is the run's stop.
  • Head:
    • the store's status, elapsed time and spend;
    • the model and tokens, read from the spend ledger. PlanTaskRow gains Model and Tokens, and the model shown is the one the task spent the most through.
    • Anything the ledger does not record is dropped, never shown as blank or zero.
  • Child tasks: the waits and the tasks under it are drawn under the transcript with tui3: a run's rows and its page look like the old task rows #1420's row shape. A press on any of those rows opens that task's room.
  • Following: the room follows a running task on its own 3-second beat, never on the paint clock. A task that has ended is read once.

The tasks place, the side list and the run's tab all open this room. The separate plan page is removed, along with its p key and its direct part cancel.

Tabs on every room

No room had tabs before, on either engine, so this PR adds them to every task room (not to the adaptive run's graph page):

  • transcript and work are named on the trail row beside the way back.
  • tab over an empty box switches between them, and a click on a name does the same.
  • An older-engine task's work tab lists the files it changed once it lands.

Apart from the tabs, older-engine tasks are unchanged.

Kept from #1420

  • There are still no ◑ $ rows.
  • The live step still needs Live.Step > 0 and a command.
  • A frame never reads the store.
  • Keys typed while a room opens land in its box, unsent.

Tests

  • Red first (9c0da30):
    • a new-engine task and an older-engine task open the same room type with the same tabs;
    • a message typed into a new-engine task's room reaches its store as a note.
  • internal/tui3/planroom_test.go:
    • steps become calls;
    • no live row without a step or command;
    • the refused line;
    • head model and tokens, known and unknown;
    • the work tab diff;
    • stop through the card;
    • store refusal of a note;
    • keys typed in the gap;
    • follow on the beat;
    • the live step leaving at the end;
    • a part's note reaching the part;
    • the pickup sentence;
    • a part row press.
  • Session:
    • the ledger's model and tokens on PlanTaskPage;
    • readPlanWork against a real git copy;
    • a harness file dropped whole from the patch.
  • The old page's tests are ported to the room. The tagged e2e scenario now waits for the room's tabs, only logs the note box (an ended task's box names another door), and reopens the tasks place after esc.

Tagged e2e TaskOnTheRunEngine

The room assertions pass. The scenario still fails on this branch, but every remaining failure fails the same way on clean santos/dev2:

  • the tasks place fold word → what ran under it never appears;
  • the row is already done before running can be read;
  • the landing names main instead of the run's branch.

On clean santos/dev2 the scenario also fails at the old page's own steps · $ wait.

Live check (tmux, isolated home, telemetry off, deepseek-v4-flash)

A /task on the run engine, opened from the tasks place:

  • The room shows the transcript · work tabs.
  • The head reads done 9s · 3 steps with deepseek/deepseek-v4-pro · 22.2k tok · $0.02.
  • The transcript has the brief, the steps and the report.
  • tab shows the three new files as a diff.
  • A note on the ended task is refused in the room's own words and kept in the box.

On clean santos/dev2 the same press opens the old page, which has no tabs, no model and no tokens.

Manual

Updated reading-a-task-page.md (new section on the two tabs), worker-harness.md and task-controls.md.

santoshkumarradha and others added 30 commits September 18, 2026 17:55
…ker seat)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…ker seat)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…urns late (#1210)

The root's worker marks its task done in the store before it returns. When the supervisor's pass saw the store done in that gap, Start ended the run with the right outcome and an empty result. Start now reads the stored root result when the worker's return is missing. A new test holds the return back past one pass, so the gap is every run of the test.
…y, and the landing's deadline fits a real call

Deciding whether to refresh ran after every message and opened the plan store
twice each time; it now reads the rows the task sheet already carries and the
store read moves into the command. The landing waited half a second for a call
that takes two to four, so the refresh could only ever succeed in a test; it
waits six. The rail no longer draws the whole plan when its reading holds no
rows (a fallback added for a fixture), and the landing fixture sets the belt
itself instead of inheriting it from the shell that ran it.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…he loop and at the landing

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…nced answer

The page the model read was six lines; it now says who is asking, when to open a
task, what an answer is, and what to do when the record does not hold it or the
person is steering. The rows, notes and task bodies are bounded, the page is
said once, and the answer is found by its braces.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The owner, 2026-09-18: a prompt is written so it is true in any setup. Two
example lines spelled a Go file and one a Go glob; they name a path and a name
pattern instead.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…one next thing (#1209)

The answer section of the chat prompt is reworded, close to byte neutral, so a reply leads with the action, uses the fewest numbered steps for a sequence, says where a multi-step job stands, gives cost in minutes or hours, states an error as cause then fix, and ends on the one thing that is the person's to do next. Shaped after the i-have-adhd skill by Ayoub Ghriss (MIT); no text copied. Fixed prefix 55,253 of 55,280; lean prefix 47,042 of 47,055.
…tore from a frame

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…l, the dot row, the run summary, one road to put work out, a landing that speaks only when an answer is owed
…conversation's turns, and the note carries the result
santoshkumarradha and others added 3 commits September 24, 2026 18:58
dev moved by one commit (f101ad2, #1440) while the first merge of the
day was being pushed; this brings it in.

Conflicted files and how each was settled:

- cmd/codeaf/chatv3_process.go: v3Process keeps dev2's catalog ownership
  (catalogs, closed, lifetime, ownCatalog, keepCatalog, takeCatalogs) and
  gains #1440's creditWatcher inside the struct. The process builds the
  skill shelf, then installs the credit watcher; neither needs the other.
  closeAll cancels processCtx and then joins the watcher.
- internal/manual/chat_test.go: dev2's six skills probes and #1440's five
  credits probes, side by side.

Broken by the merge without a textual conflict:

- internal/manual/chat/models-and-cost.md said a task on the shipped crew
  always runs on the paid worker model. While a known OpenRouter balance is
  low, an unwritten worker row now uses the free worker model; a row
  somebody chose keeps its model.

Checked with no change: the free crew covers all five tiers, and every
dev2 role (check, repair, belt worker, chat manager) reads one of them; a
402 is kept out of dev2's router retry, and the affordable-cap resend
happens once; one low-credit warning path per frame beside dev2's chips,
tip and keys rows; both launch roads wire ReadCredits once.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…and waited for

#1440's balance reads at launch, on a key change and on a switch to a paid
model run as Bubble Tea commands, and Bubble Tea does not wait for a
command it started. On santos/dev2 the process's closeAll cancels and joins
everything it owns (#1259, #1274), so a read could still be writing
credits.json after the process that owns the profile had closed.

tui3.Run now wraps ReadCredits in an owner that cancels every read in
flight and waits for it before Run returns, and refuses a read that starts
after close. Both local launch roads go through it.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@santoshkumarradha

Copy link
Copy Markdown
Member Author

@AbirAbbas ready for review and merge. It's third in line, after #1429 and #1494.

AbirAbbas and others added 3 commits September 25, 2026 11:10
An ended run gives its copy back and leaves the folder on disk as a plain
folder that git no longer answers for. readPlanWork only fell back to the
run's branch when the folder was gone entirely, so every finished or stopped
run's work tab said "the run's working copy is not here any more" while its
branch still held the work. Only a folder git still answers for is now read
as the live copy; every other copy is read off its branch. The manual's
sentence now says when the branch is read and what the tab says without it.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The work tab drew each line of a run's patch, each added file's name and
each file a node changed with tabs expanded and nothing else, so a carriage
return from a file with Windows line ends, a title escape or a screen clear
that a worker wrote into a file reached the frame raw and repainted rows the
surface owns. They now go through drawableLine, as a call's output in the
transcript already does.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
tasks.md still sent held parts to the run's plan page, and worker-harness.md
still said the page steps aside for the stop card and that `x` on a part ends
it without a card. The page is the task room now: held parts read their state
on their own rows, `x` in a room asks first for a part as for the run, and
only a part's row in the tasks place ends it at once.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@AbirAbbas

Copy link
Copy Markdown
Collaborator

Reviewed this and checked it by hand in the real binary (engine road plus one --no-host pass, every seat on deepseek-v4-flash). All three doors open the same room. The transcript, a note reaching the store, the ended-task refusal, x → Stop this task?, head model and tokens, tabs via tab and click, child rooms, and the older engine gaining tabs all hold. Git reads on the work tab stay on the 3 s beat.

I'm pushing three commits on top of 5988260df (plain fast-forward, no rebase):

  • 3c478a59b session: read a given-back run copy off its branch in the work tab. Every finished or stopped run's work tab said the run's working copy is not here any more, because an ended run leaves its copy as a plain folder git no longer answers for. readPlanWork returned before the branch read. There's a test that failed first, and it's re-checked by hand: the ended and stopped runs now show their diffs.
  • 76f5dd2b6 tui3: the work tab draws a run's difference through drawableLine. File bytes (\r, title escapes, screen clears) reached the frame raw.
  • ac47bda31 manual: no plan page left in the run-task passages. tasks.md and worker-harness.md still described the removed plan page and a card-less x on a part.

Should-fixes left for you, not blocking:

  • The diff path is taken from the last b/ in the header, so x b/plandb.db is hidden and non-ASCII names show as quoted octal.
  • the worker reads a note at its next step is spelled in two constants.
  • Older-engine rooms also gained the model on the title row.
  • The tagged e2e harness billed claude-fable-5.1 despite --one-model, so not every seat is pinned there.

Merge order is #1429 → this → #1494. Once #1429 lands I'll merge dev into this branch (it conflicts mechanically with #1429 in app.go/input.go/render.go/view.go) and merge after CI.

…and #1495

Four tui3 conflicts, each #1429's wall and team code beside the plan page
this branch removes. Both are kept: the wall's paint term stands before the
task room's, the wall, team menu and zoom keys are read where the plan page's
and work tab's keys were, the row keeps both its plan and open fields, and the
frame draws the wall where it drew the plan page and the work tab.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

@AbirAbbas AbirAbbas left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Verified by hand in the real binary and on top of dev at 5d8324a (#1429); CI green on 67cd345. Merging.

@AbirAbbas
AbirAbbas merged commit 619af48 into dev Sep 25, 2026
4 checks passed
@AbirAbbas
AbirAbbas deleted the task/one-task-page branch September 25, 2026 16:20
ZeroPoint95 added a commit that referenced this pull request Sep 25, 2026
Brings in #1429 (conversation overview) and #1485 (one task page for
every task). #1485 retired the page senior-dev's stored page was drawn
on, so a program's task now opens its program room from every door —
its row, its card, the tasks place and the run's tab. A program room
draws no transcript/work tabs, the run's own tab stays the one selected
tab, and the branch's guards for the retired overlays are dropped or
pointed at the room. Tests that drove the old page drive the room.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@AbirAbbas AbirAbbas mentioned this pull request Sep 25, 2026
AbirAbbas added a commit that referenced this pull request Sep 25, 2026
#1485 replaced the separate plan page with the task room and retired the
work tab as a full-frame view. This branch's one-line child rows move with it:
the task room's parts are drawn through planPageLines, the side column's row
with the call and the clock and money under it. The teams pane and the nav's
head cover no longer ask about the plan page or the work tab, which are rooms
of their chat now, and the task room's subtree test reads the room rather than
the side column every chat has on this branch.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
AbirAbbas pushed a commit that referenced this pull request Sep 25, 2026
Delegation around team managers: questions go up the team tree as decision packets, settings inherited with their provenance shown, nested teams and an optional All teams manager, wrap-up and close with a deadline that survives a restart, and spending caps that raise one packet. A teams place, the places on the wordmark line, one side column with Tasks and Traffic, and a standing card that says what it is.

Added in review: dev merged in over #1429's squash (through a stand-in merge so the squash does not conflict with this branch's own edits) and #1485 (the task room keeps this PR's one-line child rows; the plan page stays gone).

Co-authored-by: Santosh kumar <29346072+santoshkumarradha@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
AbirAbbas added a commit that referenced this pull request Sep 25, 2026
One conflict, internal/manual/chat/getting-started.md: the crew branch
dropped "three" from the first-run questions (the crew step is gone) and
#1429 made the places opt+1…opt+8; both are kept.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
AbirAbbas pushed a commit that referenced this pull request Sep 25, 2026
…1436)

A task's crew is picked per task by internal/crewroute (class, price on every connected route, quality minus lambda times cost) instead of a stored preset. /crew holds only what is allowed, what is pinned and a daily cap; --best and --cheap move one task. Old profiles migrate once. Route health, a per-seat fallback ladder, per-task and daily spend limits, /redo stronger, remote protocol 18.

Added in review: a pin keeps its thinking level, auto in the reflex or small-work row reads its default and migrates, -yes-spend passes the daily cap, the cap refusal no longer offers --cheap, zero crew money is not drawn, and the manual describes the one seats row; dev merged in over #1429, #1485, #1494 and #1511.

Co-authored-by: Santosh kumar <29346072+santoshkumarradha@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants