Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
886 commits
Select commit Hold shift + click to select a range
8eca15b
fix(tui3): refresh and draw run now summary
santoshkumarradha Sep 18, 2026
3d7c3f8
test(tui3): pin now rail placement and style
santoshkumarradha Sep 18, 2026
b5b7c37
test(tui3): account for root kin fallback
santoshkumarradha Sep 18, 2026
0558888
test(tui3): compare now against rendered dot kin
santoshkumarradha Sep 18, 2026
b9494a4
fix(tui3): keep run summary on plan store seam
santoshkumarradha Sep 18, 2026
0bca3d0
test(tui3): keep plan fixtures on summary door
santoshkumarradha Sep 18, 2026
33c2356
merge santos/dev ae0eef3b6 (#1207: review checks run on the crew's ch…
santoshkumarradha Sep 18, 2026
6ee1a28
merge santos/dev ae0eef3b6 (#1207: review checks run on the crew's ch…
santoshkumarradha Sep 18, 2026
34f4786
hands-on: wave1 update (trunk ae0eef3b6 with #1207, the run summary)
santoshkumarradha Sep 18, 2026
5948a3a
hands-on: wave2 update (trunk ae0eef3b6)
santoshkumarradha Sep 18, 2026
43e42cd
run: a run's result is read from the store when the root's worker ret…
santoshkumarradha Sep 18, 2026
65b29cb
fix(tui3, session): the loop never opens the store for the run summar…
santoshkumarradha Sep 18, 2026
bdb7678
merge c276: the rail says now, and the run summary is refreshed off t…
santoshkumarradha Sep 18, 2026
f864e79
session: reading a run summary from no store answers none
santoshkumarradha Sep 18, 2026
adf82ca
docs: the change entry says where the now sentence shows
santoshkumarradha Sep 18, 2026
f602709
docs: explain asking about a task
santoshkumarradha Sep 18, 2026
ba96013
test: specify bounded read-only run ask
santoshkumarradha Sep 18, 2026
6038136
feat: add bounded read-only run ask
santoshkumarradha Sep 18, 2026
14b6595
test(namelaw): recognize run ask prompt
santoshkumarradha Sep 18, 2026
a6bb7e3
fix: keep task reads inside the requested run
santoshkumarradha Sep 18, 2026
f0f6981
session: the ask turn reads a written page, a bounded record and a fe…
santoshkumarradha Sep 18, 2026
13be169
merge c272: the ask turn, one bounded read-only question about a run
santoshkumarradha Sep 18, 2026
85f7d82
prompts: the worker pages name no language in their examples
santoshkumarradha Sep 18, 2026
7b74ff5
session: answers lead with the action, number their steps and end on …
santoshkumarradha Sep 18, 2026
1848dcc
tui3: the work tab reads the rows the task sheet carries, never the s…
santoshkumarradha Sep 18, 2026
effffc7
hands-on: wave1 update (the rail's now line, the ask turn)
santoshkumarradha Sep 18, 2026
9e2e817
hands-on: wave2 update (general prompt examples, the work tab off the…
santoshkumarradha Sep 18, 2026
ee4711c
hands-on: the union's landing code imports time
santoshkumarradha Sep 18, 2026
3263a06
Merge the harness waves (#1204, #1205): the plan tree on the chat rai…
santoshkumarradha Sep 18, 2026
8de8588
hands-on: the union's landing tests count the run summary out of the …
santoshkumarradha Sep 18, 2026
164548f
Merge the harness waves at 8de85886b: the rail's now line, the ask tu…
santoshkumarradha Sep 18, 2026
7cda67c
test: the synthetic usage writer is joined before the test's state di…
santoshkumarradha Sep 18, 2026
afdf015
session: a landing's report is evidence to the completion check, and …
santoshkumarradha Sep 18, 2026
52a73b6
session: a reopened conversation keeps its tasks (#1213)
santoshkumarradha Sep 18, 2026
b94df33
session: a proposal hears every problem at once, and the brief settle…
santoshkumarradha Sep 18, 2026
d5f2700
session: a check is one command as the shell reads its quotes (#1215)
santoshkumarradha Sep 19, 2026
39ffbc5
test(lane): the router scenario is judged on scripted first tokens, n…
santoshkumarradha Sep 19, 2026
927d1e1
config: a profile config key that nothing reads is said once (#1223)
santoshkumarradha Sep 19, 2026
d026bc6
session: the conversation's tasks tool reads a run's tasks (#1222)
santoshkumarradha Sep 19, 2026
ac84ab1
fix(resident): a dispatch pass does not reclaim the leaf it just rele…
santoshkumarradha Sep 19, 2026
3a45c3f
test(session): wait helpers check the condition before the clock (#1226)
santoshkumarradha Sep 19, 2026
e88d353
test(session): the pin-the-wire test joins the usage writer before cl…
santoshkumarradha Sep 19, 2026
78e8146
fix(chatv3): seal the place sweep note at close instead of joining th…
santoshkumarradha Sep 19, 2026
fe9eb62
test(provider): order the late-first-token rescue by a signal, not el…
santoshkumarradha Sep 19, 2026
ccfef48
remote, tui3: a hosted conversation reads and steers its run (#1230)
santoshkumarradha Sep 19, 2026
efa5326
tui3: a task's page opens with the task, and a run's rows on the rail…
santoshkumarradha Sep 19, 2026
4e176a5
fix(run): a self-finished codeaf do run seats its review before it en…
santoshkumarradha Sep 19, 2026
2daa32e
run: declared checks are the review contract, judged by observable pr…
santoshkumarradha Sep 19, 2026
b208ccc
test(connect): the second-door tests use dynamic ports, not the fixed…
santoshkumarradha Sep 19, 2026
98cc254
session: a run works in a copy of its own, and its work comes home wh…
santoshkumarradha Sep 19, 2026
692d4a1
tui3: a wait whose stream has stopped arriving paints at the spinner …
santoshkumarradha Sep 19, 2026
608c459
tui3: a task's page says only what is true of it (#1240)
santoshkumarradha Sep 19, 2026
2f6559a
chat: name unread config.json keys once before defaults apply (#1239)
santoshkumarradha Sep 19, 2026
1cbcb4b
test(exec): identify a leaf-end survivor by process identity, not a b…
santoshkumarradha Sep 19, 2026
8f990d5
config: concurrent profile writes in one process compose (#1242)
santoshkumarradha Sep 19, 2026
5d9c47b
run: regression test for seating the check after a self-finished work…
santoshkumarradha Sep 19, 2026
72bbd34
session: every run a conversation has made stays readable (#1234)
santoshkumarradha Sep 19, 2026
12840ee
scripts: a repeatable hosted drive of a run on the real binary (#1241)
santoshkumarradha Sep 19, 2026
7eab247
config: unread notice skips keys the product itself retired (#1245)
santoshkumarradha Sep 19, 2026
5a7748c
tui3: what is typed after a press on a run's row goes to its page, ne…
santoshkumarradha Sep 19, 2026
1e332c3
session: make the claim-unspent revision test deterministic by forcin…
santoshkumarradha Sep 19, 2026
45137b0
fix(connect): a reconnect reuses its registered identity instead of i…
santoshkumarradha Sep 19, 2026
443c661
test(connect): stop the second-door Slack test racing on a freed port…
santoshkumarradha Sep 19, 2026
d38345f
config: two codeaf processes writing the profile at once keep each ot…
santoshkumarradha Sep 19, 2026
8ed67b7
exec: the job shell tmux tests read one marker line, not a full env d…
santoshkumarradha Sep 19, 2026
c3ab6e0
tui3: a press never waits behind a run's summary, and an open page fo…
santoshkumarradha Sep 19, 2026
7b8be4b
session: a person's stop reaches a run (#1250)
santoshkumarradha Sep 19, 2026
992779e
repo: remove a cell's findings note that rode in with #1239
santoshkumarradha Sep 19, 2026
4bf3673
exec: the skill path shell test reads one marker line (#1252)
santoshkumarradha Sep 19, 2026
eae7055
build: make check cross-compiles every platform the release ships (#1…
santoshkumarradha Sep 19, 2026
7ab8820
chatv3: the standing ticker stops and is joined when the process clos…
santoshkumarradha Sep 19, 2026
7cefdf1
tui3: no frame reads a run's rows, whatever made the read due (#1255)
santoshkumarradha Sep 19, 2026
24e4385
tui3: a run's step rows show the work, cut from the commands as they …
santoshkumarradha Sep 19, 2026
37a9b3b
tui3: a task you stopped reads stopped wherever its state word is dra…
santoshkumarradha Sep 19, 2026
1c21396
session: usage writers have an owner and are closed when the process …
santoshkumarradha Sep 19, 2026
8866dda
test(session): the claim-unspent revision is typed through Submit, th…
santoshkumarradha Sep 19, 2026
09b50f8
tui3: a call that did not run has no row, and a refused action is one…
santoshkumarradha Sep 19, 2026
137bb8c
scripts: the heavy-suite lock is a kernel file lock, so one pid names…
santoshkumarradha Sep 19, 2026
761cdab
chatv3: the pool judge sweep is stopped and joined at close (#1267)
santoshkumarradha Sep 19, 2026
42daffa
test(chatv3): the goroutine law says truthfully what the two model wa…
santoshkumarradha Sep 19, 2026
b71454e
run: a time limit a person sets ends a run by the same road as the co…
santoshkumarradha Sep 19, 2026
ced4491
tui3: the dim line under a step row is only ever the row's own (#1265)
santoshkumarradha Sep 19, 2026
d3762f4
run: a task's step numbers continue across a wake (#1261)
santoshkumarradha Sep 19, 2026
da3368d
run: a dollar limit holds while a worker is still working (#1268)
santoshkumarradha Sep 19, 2026
0d3f3ed
plandb: a parked task is finished only by a worker woken for it (#1271)
santoshkumarradha Sep 19, 2026
8eb26dc
enginehost: a launch that lands while a host is coming up reaches it …
santoshkumarradha Sep 19, 2026
ec9953e
scripts: the heavy-suite lock follows the suite, not the helper that …
santoshkumarradha Sep 19, 2026
2b02957
run: a worker that has stopped making progress is told once, then end…
santoshkumarradha Sep 19, 2026
70b3a3c
catalog: the model catalog's own warm is cancelled and joined at clos…
santoshkumarradha Sep 19, 2026
c44b488
run: no run answers done while a finished piece of work has had no re…
santoshkumarradha Sep 19, 2026
057d01f
approval: a backslash pair inside double quotes is text, read by one …
santoshkumarradha Sep 19, 2026
8832349
session: a woken turn's fixture holds its script like every other tur…
santoshkumarradha Sep 19, 2026
cd2bf32
chat: closing a process stops its place sweep before it can change a …
santoshkumarradha Sep 19, 2026
5240a37
session, run: a run's dollars reach the conversation's own total (#1280)
santoshkumarradha Sep 19, 2026
2a04d63
run, session: an ending a person caused is not a fault, and it names …
santoshkumarradha Sep 19, 2026
b293a72
suite lock: the lock follows the suite, not what the suite leaves beh…
santoshkumarradha Sep 19, 2026
bbdd7cd
exec: a cancelled command is ended by the call that ran it (#1282)
santoshkumarradha Sep 19, 2026
3a154ce
session: a run is handed what is left of every dollar limit (#1281)
santoshkumarradha Sep 19, 2026
c37f467
session: a long declared check says why it was refused (#1283)
santoshkumarradha Sep 20, 2026
cb3f0f3
session: a usage flush says whether it drained (#1285)
santoshkumarradha Sep 20, 2026
1357788
standing: a row that needs you names what it needed and opens the ite…
santoshkumarradha Sep 20, 2026
f796212
tui3: a run task's page draws its brief through the reader the transc…
santoshkumarradha Sep 20, 2026
3d95e70
session: a run is work, and its life is the conversation's (#1291)
santoshkumarradha Sep 20, 2026
8b68293
session: a standing firing runs behind the gate a task node runs behi…
santoshkumarradha Sep 20, 2026
aef0deb
task: Trace settings to permission gate wiring
agentfield-bot Sep 20, 2026
70f7baf
task: Inventory every settings row for the UX review
agentfield-bot Sep 20, 2026
33a32b7
Merge branch 'task/inventory-every-settings-row-for-60437e' into feat…
agentfield-bot Sep 20, 2026
c975972
session: a run stopped on its own question says so (#1293)
santoshkumarradha Sep 20, 2026
db7ca98
task: Implement fzf v2 fuzzy matcher universally
agentfield-bot Sep 20, 2026
3d3b754
session: work nothing is driving reads as interrupted, not failed (#1…
santoshkumarradha Sep 20, 2026
1a692da
session: a run's working copy is written down, so it can be found aga…
santoshkumarradha Sep 20, 2026
952e003
manual: the interrupted page no longer offers two answers nobody can …
santoshkumarradha Sep 20, 2026
718f6b1
fuzzy: land the remaining surface cutover (autonomy, connections, mem…
santoshkumarradha Sep 20, 2026
de66900
fuzzy: state the gap price the code and tests charge
santoshkumarradha Sep 20, 2026
70116df
Merge branch 'task/implement-fzf-v2-fuzzy-matcher-u-71bbf5' into feat…
agentfield-bot Sep 20, 2026
83de531
docs: a footprint benchmark, its method, and one day's numbers (#1126)
santoshkumarradha Sep 20, 2026
1e0537e
docs: resume cost joins the footprint benchmark (#1317)
santoshkumarradha Sep 20, 2026
b123705
feat(session): a run nothing is driving can be carried on, in the cop…
santoshkumarradha Sep 20, 2026
9420891
chore(scripts): three proof steps that could not report failure, in o…
santoshkumarradha Sep 20, 2026
af1cdd4
tui3: a standing row stopped for permission says the line, not asks: …
santoshkumarradha Sep 20, 2026
91d38b1
session: a sign-in and a harness ask say what they are waiting for (#…
santoshkumarradha Sep 20, 2026
e098ca1
tui3: the front tab and the tab beside it agree about one conversatio…
santoshkumarradha Sep 20, 2026
1094d73
task: Fix the terminal cursor park for the settings search box
agentfield-bot Sep 20, 2026
32b4127
One fuzzy matcher for every picker, subtle match highlighting, and th…
santoshkumarradha Sep 20, 2026
9b38c2d
session: a landing already accepted stops saying your call (#1322)
santoshkumarradha Sep 20, 2026
3e2214a
The commit co-author links to the CodeAF account, and assisted-by nam…
santoshkumarradha Sep 20, 2026
d57f26d
scripts: a heavy suite takes both locks so a stale tree can see it (#…
santoshkumarradha Sep 20, 2026
bc116d3
docs: the trailer entry names its pull request and takes the required…
santoshkumarradha Sep 20, 2026
9f8f761
task: Skills: per-node attachment in briefs
agentfield-bot Sep 21, 2026
e46edfa
task: Verify standing-tasks findings
agentfield-bot Sep 21, 2026
1142f90
task: Finish skills store record: continue the cut-off branch
agentfield-bot Sep 21, 2026
12b4b6e
docs: changelog entry for skills tranche 1
santoshkumarradha Sep 21, 2026
7aded50
task: Finish skills shelf and use_skill: run the right suite, land th…
agentfield-bot Sep 21, 2026
d2c2723
task: Finish skills shelf and use_skill (windowed catalog + depth-gat…
santoshkumarradha Sep 21, 2026
21660ea
session: fix ActivateSkill test callers after the skills merge
santoshkumarradha Sep 21, 2026
7a13426
exec, manual: the drafted-with footer links to the codeaf repository …
santoshkumarradha Sep 21, 2026
e87b147
docs: the change entry for the drafted-with link (#1329)
santoshkumarradha Sep 21, 2026
777bb12
skills: compose per-node skill attachments at brief time and render them
agentfield-bot Sep 21, 2026
b3f2dda
cmd: wire the active shelf into the chat engine's plan builds
agentfield-bot Sep 21, 2026
7b2fc92
task: Skills tranche 1: integrate, wire live flow, prepare draft PR
agentfield-bot Sep 21, 2026
f316c06
task: Skills tranche 1: integrate, wire live flow, prepare draft PR
santoshkumarradha Sep 21, 2026
c4f5e3c
docs: drop pr-draft.md now that the PR body carries it
santoshkumarradha Sep 21, 2026
d39a4e3
session: a held landing offers its answer and stops demanding one (#1…
santoshkumarradha Sep 21, 2026
8219b14
task: Fix round 1: address skills review findings
agentfield-bot Sep 21, 2026
d1d874a
audit-notes: move the standing-visibility investigation out of the PR…
santoshkumarradha Sep 21, 2026
a51cc6e
session: align the catalog header test with the reviewed rewording
santoshkumarradha Sep 21, 2026
af61b0c
task: Fix round 3: final fixes for skills tranche 1
agentfield-bot Sep 21, 2026
48bd211
task: Make imported SKILL.md skills readable through codeaf's skill d…
agentfield-bot Sep 21, 2026
7ed8d2f
skills: import foreign SKILL.md folders in place
santoshkumarradha Sep 21, 2026
3e6a3ba
Merge branch 'task/import-existing-skills-claude-co-b9c535' into feat…
agentfield-bot Sep 21, 2026
9ca7b44
import foreign skills before the first message on every v3 launch
santoshkumarradha Sep 21, 2026
26bbabc
skills: preserve user scope without a project root
santoshkumarradha Sep 21, 2026
d6de383
the world this task started from: Resolve skills tranche merge into s…
agentfield-bot Sep 21, 2026
72e711c
merge skills tranche and existing-skill import
santoshkumarradha Sep 21, 2026
619860c
session, cmd, bench: the worker harness is the belt a task runs on (#…
santoshkumarradha Sep 21, 2026
2984917
merge skills tranche and existing-skill import
santoshkumarradha Sep 21, 2026
6d97ef7
merge skills tranche and existing-skill import
santoshkumarradha Sep 21, 2026
ae14cf7
docs: the bash-belt entry names only surfaces the checker knows
santoshkumarradha Sep 21, 2026
88bbd5b
manual: the use_skill page says what happened instead of naming it
santoshkumarradha Sep 21, 2026
2d5eeaf
docs: the bash-belt entry names only surfaces the checker knows
santoshkumarradha Sep 21, 2026
bdf8e2f
session: a person can put a skill in front of this conversation by hand
santoshkumarradha Sep 21, 2026
fb67f07
The node belt is the default again, on a measured comparison (#1336) …
santoshkumarradha Sep 21, 2026
dd188e8
session: one message carries the skills its own words choose, attachm…
santoshkumarradha Sep 21, 2026
cef7dd4
docs: the change entry for the message-chosen skills block
santoshkumarradha Sep 21, 2026
e66650f
tui3: /skill opens the shelf as a picker and carries the attached ski…
santoshkumarradha Sep 21, 2026
43f334e
session: a missed skill name says what the shelf holds instead of not…
santoshkumarradha Sep 21, 2026
e1b36b8
session: the prompts say what a skill is and when to open one before …
santoshkumarradha Sep 21, 2026
a2a803d
manual: the use_skill page says what a missed name answers
santoshkumarradha Sep 21, 2026
c7a6de3
docs: change entry for the shelf-on-the-page wave
santoshkumarradha Sep 21, 2026
65581fd
session: the skills a turn carried ride as names, not as a sentence
santoshkumarradha Sep 21, 2026
b656cd0
tui3: test the /skill picker, write its manual page and change entry,…
santoshkumarradha Sep 21, 2026
ea967cd
session: an absent skills list means unknown, not none
santoshkumarradha Sep 21, 2026
1eeb74c
session, chat: a pass that compacted nothing stops taking the convers…
santoshkumarradha Sep 21, 2026
72aa535
tui3: draw carried skills from event field
santoshkumarradha Sep 21, 2026
cddf198
docs: explain skills carried by a turn
santoshkumarradha Sep 21, 2026
3183985
docs: add skills row change entry
santoshkumarradha Sep 21, 2026
904bdb3
docs: explain skills carried by a turn
santoshkumarradha Sep 21, 2026
7bbc70a
provider, taxonomy: a quiet reply from the only machine there is gets…
santoshkumarradha Sep 21, 2026
8a83f41
chat: a replay draws the record once, whatever was already on the scr…
santoshkumarradha Sep 21, 2026
14043ab
Merge remote-tracking branch 'origin/cell/skillpick' into skills-preview
santoshkumarradha Sep 21, 2026
a7af389
Merge remote-tracking branch 'origin/cell/skillsay' into skills-preview
santoshkumarradha Sep 21, 2026
06dcf11
Merge remote-tracking branch 'origin/santos/dev2' into skills-preview
santoshkumarradha Sep 21, 2026
5d30bad
Merge remote-tracking branch 'origin/cell/c375' into skills-preview
santoshkumarradha Sep 22, 2026
95f4fa2
tui3: give /skill its fate at home and fit its row
santoshkumarradha Sep 22, 2026
d79c12a
the bash worker's page stops naming the shelf verb
santoshkumarradha Sep 22, 2026
ee93e0a
Merge remote-tracking branch 'origin/task/bashtask-skill-rule' into s…
santoshkumarradha Sep 22, 2026
99f301b
session, taxonomy: a conversation against one machine waits for it in…
santoshkumarradha Sep 22, 2026
09815c9
Merge remote-tracking branch 'origin/santos/dev2' into skills-preview
santoshkumarradha Sep 22, 2026
90233e1
build: the pull-request gate runs on santos/dev2 as well as dev (#1362)
santoshkumarradha Sep 22, 2026
abf8032
e2e: the tmux suite reads the surface again (#1360)
santoshkumarradha Sep 22, 2026
b38a29f
docs: the belt DOE, and the chat as manager over the plan store (#1354)
santoshkumarradha Sep 22, 2026
b18b619
session, run, cmd: the worker harness is the default belt again, with…
santoshkumarradha Sep 22, 2026
cb612d3
tui3: the skills a turn used outlive the run that used them
santoshkumarradha Sep 22, 2026
1f4972c
Revert "tui3: the skills a turn used outlive the run that used them"
santoshkumarradha Sep 22, 2026
863d5ee
docs: the wait-forever entry names the pull request that merged it
santoshkumarradha Sep 22, 2026
49971de
repo: drop the local state a wave swept in with it
santoshkumarradha Sep 22, 2026
d91bb63
Merge remote-tracking branch 'origin/santos/dev2' into HEAD
santoshkumarradha Sep 22, 2026
55dd97f
session, run, chat: notes are a channel into a running worker, not a …
santoshkumarradha Sep 22, 2026
9321a85
config: persistedCount says what it destroys (#1369)
santoshkumarradha Sep 22, 2026
89dacca
session, chat: the chat sees the plan when the person speaks (#1357)
santoshkumarradha Sep 22, 2026
518f289
session: the picture hand refuses a prompt that is not there (#1372)
santoshkumarradha Sep 22, 2026
77566dc
connect: the Slack thread limit is written down once (#1371)
santoshkumarradha Sep 22, 2026
32ef528
tui3: the stopped frame is compared against a clock in the test's han…
santoshkumarradha Sep 22, 2026
2f94ca1
tui3: the stopped frame's helper says it exists in order to be shared…
santoshkumarradha Sep 22, 2026
3f46952
chat, session: skills that are switched off say so instead of looking…
santoshkumarradha Sep 22, 2026
7fb2644
Merge origin/dev into santos/dev2: dev's thirteen commits since the fork
santoshkumarradha Sep 23, 2026
e731437
run, tests: a parent wakes on its children's landings, and the pool t…
santoshkumarradha Sep 23, 2026
dca2f3f
remote: the standing firing test asks for its lane once
santoshkumarradha Sep 23, 2026
942eef6
Merge origin/dev: sign in to Codex in the browser (#1336)
santoshkumarradha Sep 23, 2026
525b77f
suite-lock: the wrapper-killed test waits for the lock to be named
santoshkumarradha Sep 23, 2026
3a9c5e4
tui3, chat, pool: task-page keys, notes, tab mark and unowned warms (…
santoshkumarradha Sep 23, 2026
b998c87
session, config: the chat manages a live run in the side list's words…
santoshkumarradha Sep 23, 2026
af913d6
run, session: a run's ending is written where the next request reads …
santoshkumarradha Sep 23, 2026
c61615a
session, provider, suite-lock: the one machine is waited on, a pool i…
santoshkumarradha Sep 23, 2026
80bdef3
Merge origin/dev into santos/dev2: /cost keeps its columns under the …
santoshkumarradha Sep 23, 2026
7c3a499
Merge origin/dev into santos/dev2: a Codex model carries its 272k window
santoshkumarradha Sep 23, 2026
e2f7587
task: admit a deliverable path that is not on this machine (#1418)
santoshkumarradha Sep 23, 2026
10beaa5
attribution: always sign, and name only the bare model (#1412)
santoshkumarradha Sep 23, 2026
d71b388
task: a path is a place only where its own directory is (#1421)
santoshkumarradha Sep 23, 2026
19e86f7
fix(review): scope matching, worker panic resilience, check env leak,…
santoshkumarradha Sep 23, 2026
1ce4cac
do, run, session: codeaf do edits in place, commits nothing, and stop…
santoshkumarradha Sep 23, 2026
147382a
tui3: a run's rows and its page look like the old task rows (#1420)
santoshkumarradha Sep 23, 2026
b8765e1
One run per batch: simultaneous hand-offs join one run, a failed run …
santoshkumarradha Sep 23, 2026
03e301c
session: a read sweep the chat will not hand off is handed off by the…
santoshkumarradha Sep 23, 2026
af99c4e
Merge remote-tracking branch 'origin/dev' into task/sync-dev-1419
santoshkumarradha Sep 23, 2026
b67c162
Engine status and stop, the older engine gives up the slot, a held co…
santoshkumarradha Sep 23, 2026
bdb08cf
Merge remote-tracking branch 'origin/santos/dev2' into task/sync-dev-…
santoshkumarradha Sep 23, 2026
6f1f39f
Skills from Claude Code plugins and Codex, with memory off, chosen by…
santoshkumarradha Sep 24, 2026
008363c
fix: synchronize run worker step boundaries before further actions
santoshkumarradha Sep 24, 2026
99ec179
Merge origin/dev into santos/dev2: Ara's Home, tips and Sessions wave
AbirAbbas Sep 24, 2026
7db417c
chat: say what #1389 made true on the pages and comments it left behind
AbirAbbas Sep 24, 2026
ee0abdf
chat: /skill typed on Home keeps its words, and commands.md lists it
AbirAbbas Sep 24, 2026
9c0da30
tui3: red tests for one task page on either engine
santoshkumarradha Sep 24, 2026
e667d7a
tui3: every task opens the one task room, on either engine
santoshkumarradha Sep 24, 2026
4c6ada4
Merge remote-tracking branch 'origin/santos/dev2' into task/one-task-…
santoshkumarradha Sep 24, 2026
aa8a19f
docs: change entry for one task page
santoshkumarradha Sep 24, 2026
3324fde
docs: full stops on the one task page entry
santoshkumarradha Sep 24, 2026
f1419c2
tui3: an ended run task's room refuses a note in its own words
santoshkumarradha Sep 24, 2026
00a4479
manual: keep the task page questions reaching the tasks page
santoshkumarradha Sep 24, 2026
538da01
Merge origin/dev into santos/dev2: #1440, the OpenRouter balance
AbirAbbas Sep 24, 2026
19a5a77
chat: a balance read still running when the window closes is stopped …
AbirAbbas Sep 24, 2026
988e429
e2e: a run task's room is read by its tabs; its note box is observed
santoshkumarradha Sep 24, 2026
ab0fc43
Merge remote-tracking branch 'origin/santos/dev2' into task/one-task-…
santoshkumarradha Sep 24, 2026
2572afa
session: a note on a run row speaks as the task room does
santoshkumarradha Sep 25, 2026
08a0b55
remote: the task room's work tab and model travel the host road
santoshkumarradha Sep 25, 2026
5988260
Merge origin/dev into task/one-task-page: dev now holds santos/dev2 (…
agentfield-bot Sep 25, 2026
3c478a5
session: read a given-back run copy off its branch in the work tab
AbirAbbas Sep 25, 2026
76f5dd2
tui3: the work tab draws a run's difference through drawableLine
AbirAbbas Sep 25, 2026
ac47bda
manual: no plan page left in the run-task passages
AbirAbbas Sep 25, 2026
67cd345
Merge origin/dev into task/one-task-page: dev now holds #1429, #1487 …
AbirAbbas Sep 25, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions docs/changes/unreleased/1485-one-task-page.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
---
kind: changed
title: Every task opens the one task room, on either engine
pr: 1485
surface: [chat, docs]
invalidates:
- A run's task opened a separate store-backed page (taskSheetPlan, taskPlanFrame); it now opens the task room, read from the store.
- The run's page had no transcript or work tab; every task room now has both, switched with tab over an empty box.
- The run's page took p to hold a part and cancelled a part directly; in the room p is a letter and x raises the stop card.
- Tokens and the model were said not to be in the plan store; the room's head reads both from the spend ledger.
- The tasks place's enter and the run's tab opened the plan page; both open the task room now.
---

A task on the run engine now opens the same task room as any other task. Its transcript is
the worker's steps drawn as the room's own calls, its work tab is the run's working copy
difference, its box leaves a note on the task, and `x` stops it. The head shows the model
and tokens when the store's ledger records them. Every task room gains `transcript` and
`work` tabs.
74 changes: 33 additions & 41 deletions internal/e2e/tui_e2e_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2204,7 +2204,7 @@ func testTaskOnTheDefaultBelt(t *testing.T) {

// taskOnTheRunEngine is the body the two subtests above share: launch with the
// key and whatever belt words the caller names, put one `/task` on the run
// engine, and read the run off the tasks place, the plan page and the thread.
// engine, and read the run off the tasks place, the task's room and the thread.
func taskOnTheRunEngine(t *testing.T, rigName string, beltWords ...string) {
home := newHome(t, nil)
ws := newWorkspace(t, "runws", false)
Expand Down Expand Up @@ -2235,15 +2235,12 @@ func taskOnTheRunEngine(t *testing.T, rigName string, beltWords ...string) {
running := planRowWaitsToWear(t, r, 40*time.Second, runRowWord, say(t, "planRunningWord"))
t.Logf("the run on the tasks place, while a worker holds its task:\n%s", running)

// ── the page mid-run: the live step at the live edge ────────────────────
// ── the room mid-run ────────────────────────────────────────────────────
//
// ENTER OPENS THE PLAN PAGE, and while a worker holds the task the page
// follows its live edge: the step being run right now is drawn ONE STEP EARLY,
// with the running glyph beside the command and the call's own clock under it
// (docs/design/worker-harness/SURFACE.md §4, Cell 3; taskplan.go's
// taskPlanBody). It is read here, before the root lands, because the live step
// is gone the moment its command ends — the page after the landing is the
// settled page the section below reads.
// ENTER OPENS THE TASK'S ROOM, the one page every task opens, and while a
// worker holds the task the room follows it on its own beat (internal/tui3's
// planroom.go). It is read here, before the root lands; the room after the
// landing is the settled room the section below reads.
//
// AND THE CURSOR IS MOVED ONTO THE ROW FIRST ([tasksPlaceRunRow]). Enter on
// the conversation row is the door into the conversation and always was, so
Expand All @@ -2252,29 +2249,27 @@ func taskOnTheRunEngine(t *testing.T, rigName string, beltWords ...string) {
// conversation too.
tasksPlaceRunRow(t, r)
r.keys("Enter")
// THE PAGE COMING UP IS THE ASSERTION AND THE LIVE STEP IS AN OBSERVATION,
// and the two are separated here because only one of them is a fact about
// the surface. That the press over the row opens the STORE'S page rather
// than a room is true every time, and the page's own note box says it is
// the page. Which command a worker happens to be part-way through when the
// key lands is a moment: this brief is four steps and about half a minute,
// so a page opened a second after the last one ends is an honest page of a
// task that has finished — [rig.glimpse]'s own bargain, which never fails
// on a thing that is only on screen while work runs. Asserting it made a
// red out of a fast run and said nothing about any defect.
page := r.waitFor(40*time.Second, say(t, "planNoteBoxWord"))
t.Logf("the page the press over the run's row opened:\n%s", page)
// THE ROOM COMING UP IS THE ASSERTION: its two tabs are there whatever state
// the task is in. The note box's own words are there only while the task can
// still take a note, and which command a worker happens to be part-way
// through when the key lands is a moment, so both are only logged.
page := r.waitFor(40*time.Second, say(t, "roomTabsWords"))
t.Logf("the room the press over the run's row opened:\n%s", page)
if box, saw := r.glimpse(2*time.Second, say(t, "planNoteBoxWord")); saw {
t.Logf("the room's box takes a note while the task runs:\n%s", box)
} else {
t.Logf("the task had ended before its room opened, so its box names another door")
}
if live, sawLive := r.glimpse(15*time.Second, say(t, "planLiveGlyph")); sawLive {
if !strings.Contains(live, say(t, "planLiveClockWord")) {
t.Errorf("the plan page's live line has no clock under it (%q):\n%s",
say(t, "planLiveClockWord"), live)
}
t.Logf("the plan page mid-run, carrying the live step:\n%s", live)
t.Logf("the room mid-run, carrying the live step:\n%s", live)
} else {
t.Logf("the run finished before a live step could be caught on the page, which is this " +
t.Logf("the run finished before a live step could be caught in the room, which is this " +
"brief on a fast worker and not a defect")
}
// `esc` LEAVES THE ROOM FOR THE CONVERSATION, the way every room does, so
// the place is opened again to watch the row land.
r.keys("Escape")
openTasksPlace(t, r)

done := planRowWaitsToWear(t, r, runPatience, runRowWord, say(t, "planDoneWord"))
t.Logf("the run on the tasks place once its root landed:\n%s", done)
Expand All @@ -2295,20 +2290,16 @@ func taskOnTheRunEngine(t *testing.T, rigName string, beltWords ...string) {
t.Errorf("the landing does not name the branch the run's work is on (%q):\n%s", branch, landed)
}

// ── the page one row opens ──────────────────────────────────────────────
// ── the room one row opens ──────────────────────────────────────────────
//
// ENTER OVER THE ROW OPENS THE STORE'S OWN PAGE — the description the worker
// was given, the notes left on the task, and the trajectory: one line per
// command the worker ran, and the run's own finish among them. `esc` backs out
// one layer to the list, the card's own bargain.
// ENTER OVER THE ROW OPENS THE TASK'S ROOM, read through the store: the
// description the worker was given, the notes left on the task, and the
// trajectory as the room's own call rows. `esc` leaves for the conversation.
openTasksPlace(t, r)
tasksPlaceRunRow(t, r)
r.keys("Enter")
// THE PAGE IS READ BY TWO OF ITS OWN WORDS, and neither is the model's. The
// note box stands on this page and on nothing else, and the head's figures
// are the store's count of the steps its worker took and what they cost —
// so the pair says the press opened THE STORE'S PAGE and not the room a
// record row opens, which is the whole of what this scenario came to prove.
// THE ROOM IS READ BY ITS OWN WORDS, and not by the model's: the
// room's two tabs, which every task's room draws on either engine.
//
// WHICH COMMANDS ARE ON IT IS THE WORKER'S BUSINESS. The finish is the
// worker's own `plandb done` when the worker writes one, and the RUN's when
Expand All @@ -2317,17 +2308,18 @@ func taskOnTheRunEngine(t *testing.T, rigName string, beltWords ...string) {
// page carried `echo`, `cat` and the run's own ending note. So the finish
// command is observed and logged, never waited out: asserting it made a red
// out of a model's choice and said nothing about the surface.
stored := r.waitFor(40*time.Second, say(t, "planNoteBoxWord"), say(t, "planStepsSpend"))
t.Logf("the page the run's row opens, with the store's own figures on it:\n%s", stored)
stored := r.waitFor(40*time.Second, say(t, "roomTabsWords"))
t.Logf("the room the run's row opens:\n%s", stored)
if finish, saw := r.glimpse(5*time.Second, say(t, "planFinishCommand")); saw {
t.Logf("and this worker wrote its own finish into the trajectory:\n%s", finish)
} else {
t.Logf("this worker left the ending to the run, so no %q step is on the page",
say(t, "planFinishCommand"))
}
r.keys("Escape")
back := r.waitFor(30*time.Second, say(t, "planDoneWord"))
t.Logf("esc backed out of the page to the list:\n%s", back)
openTasksPlace(t, r)
back := planRowWaitsToWear(t, r, 30*time.Second, runRowWord, say(t, "planDoneWord"))
t.Logf("the list, after esc left the room:\n%s", back)
r.quit()
}

Expand Down
35 changes: 17 additions & 18 deletions internal/e2e/tuiwords_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -637,39 +637,38 @@ var tuiWords = map[string]tuiWord{
source: "plandb done",
pkg: "internal/session",
why: "the command a bash-belt worker finishes its store task with, recorded in the task's own " +
"trajectory and drawn as a step line on the plan page (taskplan.go's taskPlanBody reads " +
"trajectory and drawn as a call row in the task's room (planroom.go reads " +
"PlanTaskPage.Steps). THE PAGE DOES NOT SPELL IT — the worker runs it — so the gate looks where " +
"it is written: internal/session's plandb_plan.go, the sentence that teaches the finish. " +
"IT IS OBSERVED AND NEVER WAITED OUT, because whether it is on a page is the WORKER'S " +
"choice: the run writes the ending itself for a task whose worker stopped calling tools " +
"without writing one (internal/run's worker.go), which a small brief on a fast model " +
"regularly is. What the suite asserts about that page instead is that it is the store's " +
"page at all — planNoteBoxWord and planStepsSpend, two words no room draws",
"regularly is. What the suite asserts about that room instead is that it is the task's " +
"room at all: roomTabsWords",
},
"planNoteBoxWord": {
screen: "a note for this task",
why: "the plan page's own note box (taskplan.go's taskPlanNoteWord), and the one word on it " +
"that is there whatever state the task is in. It is what says the press over a run's row " +
"opened THE STORE'S PAGE rather than a room — the assertion that defect #1359 was about — " +
"where the live step beside it is a moment and is only ever observed",
why: "the note box a run's task takes its notes in (taskplan.go's taskPlanNoteWord, drawn as " +
"the task room's steer box by room.go) while the task can still take a note. A task that has " +
"ended names another door in its box, so the suite only observes this word; what it asserts " +
"about the room is roomTabsWords",
},
"roomTabsWords": {
screen: "transcript · work",
source: "transcript",
why: "the two tabs every task's room draws on its trail, on either engine (roomtabs.go): the " +
"transcript and the work the task changed. A run's task opens the same room as any other " +
"task, so the tabs are what say the press opened the room and not a page of its own",
},
"planLiveGlyph": {
screen: tokens.GlyphStepRunning,
pkg: tokensPkg,
why: "the mark the plan page leads the step it is running RIGHT NOW with, where the recorded " +
"steps lead with their number (taskplan.go's taskPlanBody, drawn through palette.glyph so the " +
"tier picks the rune rather than a literal in the surface). It is tokens.GStepRunning — one " +
why: "the mark the task's room leads the step it is running RIGHT NOW with (planroom.go draws " +
"the store's live step as a call in flight, through palette.glyph so the tier picks the rune " +
"rather than a literal in the surface). It is tokens.GStepRunning — one " +
"shape for one state, the same rune `working` wears — so the gate looks where the rune is " +
"spelled, and this suite sees the plain tier its throwaway profile pins",
},
"planLiveClockWord": {
screen: "running ",
source: "running ",
why: "the call's own clock, said under the live step on the plan page: the same ten-second " +
"count the rail keeps (taskplan.go's taskPlanBody reads PlanTaskPage.Live and taskToolFloor " +
"gates it, the 10-second clock the rail already keeps). It is the page's word, so the gate " +
"looks for it in the surface",
},

// ── the run's plan row, on the live edge (c185, SURFACE.md §2A/§3) ────────
//
Expand Down
64 changes: 64 additions & 0 deletions internal/enginehost/enginehost_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -674,3 +674,67 @@ func TestHostedAgentReadsSeededPlanTasksEndToEnd(t *testing.T) {
}
t.Fatalf("PlanTasks over host = %+v, want seeded real-store row", rows)
}

// THE TASK PAGE'S MODEL IS THE LEDGER'S, and it has to cross the host: the
// room head reads it off the page the engine served, and a page that arrives
// without it draws the price and the tokens and never the model.
func TestHostedPlanPageCarriesTheLedgersModel(t *testing.T) {
workspace := t.TempDir()
t.Setenv("CODEAF_TASK_BELT", "bash")
store, err := session.OpenRunPlan(workspace, "Hosted run", "prove the model crosses the host")
if err != nil {
t.Fatalf("open run plan: %v", err)
}
if _, err := store.AddMany([]plandb.TaskSpec{{ID: "seeded", Title: "Seeded task", Description: "the real row"}}); err != nil {
t.Fatalf("seed run plan: %v", err)
}
if err := store.AddSpend("seeded", "z-ai/glm-5.3-flash", "worker", 0.0017, 20000, 1000); err != nil {
t.Fatalf("write spend: %v", err)
}
if err := store.Close(); err != nil {
t.Fatalf("close seeded plan: %v", err)
}

engine, err := session.New(session.Config{
Workspace: workspace,
Model: "test/model",
APIKey: "fixture",
BaseURL: "http://127.0.0.1:1/v1",
System: "Test only.",
})
if err != nil {
t.Fatalf("build real session agent: %v", err)
}
t.Cleanup(func() { _ = engine.Close() })

host := &Host{
workspace: workspace,
opts: Options{Boot: func(remote.Hello) (*remote.Engine, error) {
return &remote.Engine{Agent: engine, Workspace: workspace}, nil
}},
sessions: map[string]*remote.Session{},
done: make(chan struct{}),
}
surface, hosted := net.Pipe()
go host.attach(hosted)
client, err := remote.Dial(surface, "", remote.Hello{Version: remote.Version, Workspace: workspace})
if err != nil {
t.Fatalf("dial hosted session: %v", err)
}
t.Cleanup(func() { _ = client.Close() })

page, ok := client.Agent().PlanTaskPage("t-seeded")
if !ok {
t.Fatal("PlanTaskPage over the host answered no page")
}
if page.Row.Model != "z-ai/glm-5.3-flash" {
t.Fatalf("page model = %q, want the ledger's z-ai/glm-5.3-flash (tokens %d usd %v)", page.Row.Model, page.Row.Tokens, page.Row.USD)
}
if page.Row.Tokens != 21000 {
t.Fatalf("page tokens = %d, want 21000", page.Row.Tokens)
}
work, found := client.Agent().PlanTaskWork("t-seeded")
if !found || work.NoDoor {
t.Fatalf("PlanTaskWork over the host = (%+v, %v), want the door to answer", work, found)
}
}
50 changes: 35 additions & 15 deletions internal/manual/chat/reading-a-task-page.md
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,25 @@ all re-fit it. Only the overflow folds. The conversation keeps exactly the last
calls in the no-caption fallback above a line reading `N earlier tool calls · ctrl+o`,
and scrolling the conversation never opens a fold — `ctrl+o` or a click does.

## See what a task changed: the `transcript` and `work` tabs, and the `tab` key

Two tabs are named at the right of the top line, beside the way back: `transcript` and
`work`. They are there for every task on either engine. `transcript` is everything this
manual describes: the brief, the steps, the notes and the report. `work` shows the files
changed.

- On this window's own engine, `work` lists the files once the task has landed:
`files this task changed`, or `this task changed no files`. Before it lands it says
`the files this task changes are listed here when it lands`.
- On a run's task, `work` is the run's working copy read against the commit it was cut
from: the difference, and the files added, with the files codeaf keeps there left out.
The whole run shares that one copy, and the tab says so at its top. Once the run has
ended its copy is given back, and the tab reads the work off the run's branch instead.
With that branch gone too, it says `the run's working copy is not here any more`.

`tab` over an empty box moves from one tab to the other, and a click on a tab's name opens
it. With words in the box, `tab` is the box's own key.

## What the line at the top of a task's page tells you

**It is drawn under the conversation tabs, not above them.** Those say which conversation
Expand Down Expand Up @@ -399,12 +418,11 @@ the page says it in one dim line, above whatever else it already knows:
- a read that came back with an error says `couldn't read this task's conversation ·
retrying`, which is a different fact from either of the two above and keeps its beat

**A run's task page follows its newest step the same way.** The page `enter` opens on a run's
row — a row drawn in the tasks place — keeps up with the work: the newest step walks in at the
bottom, and the page stays stuck to that live edge until you scroll up, which releases it.
Scrolling back to the bottom resumes the follow, and a page on a task that has settled is a
still page, never re-read. The step being run right now is drawn one step early, the running
glyph beside its command.
**A run's task follows its newest step the same way.** A task on the run engine opens this
same room, read from the run's store, and keeps up with the work: the newest step walks in at
the bottom, and the room stays stuck to that live edge until you scroll up, which releases it.
Scrolling back to the bottom resumes the follow, and a room on a task that has settled is a
still page, never re-read. The step being run right now is the newest call, drawn running.

## Why is a task I just started showing an empty page

Expand Down Expand Up @@ -578,11 +596,13 @@ until you answer it. A task that is still running is never refused: if nobody is
to read you — it is being checked, or its worker has just closed — the line is held on the
task's record instead, which the clause above says out loud.

**A run task's page carries this box too**, and it says when the note is read rather than merely
saved. Under the box the run page writes `the worker reads a note at its next step`: the note
goes to the task's store and waits until the worker asks for its next step, which is when it
reads what you wrote. A task that has ended, `done` or `incomplete`, takes no next step, so
its page leaves that sentence out.
**A run task's room carries this box too**, and it says when the note is read rather than merely
saved. Once the store has the note the room writes `the worker reads a note at its next step`
under it: the note waits in the store until the next step, which is when it is read. Once the
work has ended, `done` or `incomplete`, there is no next step, so the room leaves that sentence
out and takes no note: `enter` says `this task has finished` and where to say them instead, and
leaves them in the box. A note the store refuses for another reason shows the store's own
sentence on the line you typed.

## Task page says finished but the work is still running

Expand Down Expand Up @@ -740,7 +760,7 @@ tree's own connectors (`├─`, `└─`). A part that is running says the comm
on, such as `bash go test ./...`, and under that how long it has run and what it
has cost, each left out when the store has not got it.

Select any row there and press `enter` to open that task's page. Press `esc` to
return to the page you came from; the trail at the top of the page reads
`<conversation> ▸ <parent title> ▸ <this task>` so you can see where it returns.
This opens a page rather than changing the rail's fold.
Click any row there to open that task's room. The trail at the top of the room reads
`<conversation> ▸ <parent title> ▸ <this task>`, and a click on the parent's name in it
opens the parent's room again. `esc` returns to the conversation. This opens a room
rather than changing the rail's fold.
Loading
Loading