Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
751 commits
Select commit Hold shift + click to select a range
48eb983
docs: explain task tree folds and pages
santoshkumarradha Sep 18, 2026
6abd659
test(tui3): specify the live run work tab
santoshkumarradha Sep 18, 2026
b9a3d1d
test(session): pin chat task-belt role rules
santoshkumarradha Sep 18, 2026
22f35c5
session: teach chat task routing verbs
santoshkumarradha Sep 18, 2026
e869d6b
docs: trace the task hand-off door
santoshkumarradha Sep 18, 2026
230df0c
docs: explain when chat starts a task
santoshkumarradha Sep 18, 2026
316dd95
fix(tui3): show live run rows on a work tab
santoshkumarradha Sep 18, 2026
d4ef5e7
docs: explain watching a live task tab
santoshkumarradha Sep 18, 2026
bb1c7d6
plan: the spine tests count the fake's calls atomically (#1203)
santoshkumarradha Sep 18, 2026
c954e8e
docs: the work tab, the dot row and the rail order (approved design)
santoshkumarradha Sep 18, 2026
5a63441
docs: the work tab, the dot row and the rail order (approved design)
santoshkumarradha Sep 18, 2026
2577c7b
test(session): pin silent belt landing digest
santoshkumarradha Sep 18, 2026
90ce0d5
fix(session): journal belt landing without waking
santoshkumarradha Sep 18, 2026
44448f3
docs(manual): describe silent task landings
santoshkumarradha Sep 18, 2026
90e0afd
session: source chat routing rules in system prompt
santoshkumarradha Sep 18, 2026
822572e
session: clarify current hand-off entry door
santoshkumarradha Sep 18, 2026
17eaa66
test(tui3): require full waits row figures
santoshkumarradha Sep 18, 2026
1b013b8
test(tui3): keep tab switching on work tab
santoshkumarradha Sep 18, 2026
b0eb4f2
docs(manual): remove stray landing text
santoshkumarradha Sep 18, 2026
01b907b
fix(tui3): show figures on page wait rows
santoshkumarradha Sep 18, 2026
8db5188
fix(tui3): route tab switching before work notes
santoshkumarradha Sep 18, 2026
9e48f83
session: isolate legacy task admission law from bash belt
santoshkumarradha Sep 18, 2026
48a3323
docs: the work tab design (carried onto the dots cell base)
santoshkumarradha Sep 18, 2026
ace6b17
Merge branch 'c249-in' into wave2
santoshkumarradha Sep 18, 2026
4839a26
test(session): require root subtree progress counts
santoshkumarradha Sep 18, 2026
2885ad1
feat(session): expose root subtree progress
santoshkumarradha Sep 18, 2026
97d8ec6
fix(session): carry progress onto root task page
santoshkumarradha Sep 18, 2026
4942c33
tui3: the work tab takes its reading at the opening and draws it per …
santoshkumarradha Sep 18, 2026
62a024d
Merge branch 'c246-in' into wave1
santoshkumarradha Sep 18, 2026
bd54a50
Merge harness/worker-loop (#1109): the worker harness, one loop under…
santoshkumarradha Sep 18, 2026
40b987d
docs: explain task progress dots and rail order
santoshkumarradha Sep 18, 2026
ad00e9c
Merge branch 'c248-in' into wave2
santoshkumarradha Sep 18, 2026
9771af7
test(tokens): specify progress cell glyph slots
santoshkumarradha Sep 18, 2026
f4848f1
test(demo-home): require seeded belt runs
santoshkumarradha Sep 18, 2026
d86ce0d
feat(tokens): add run progress cell glyphs
santoshkumarradha Sep 18, 2026
346f4d8
Merge branch 'c250-in' into wave2
santoshkumarradha Sep 18, 2026
9246e8a
test: pin answer-owed landing behavior
santoshkumarradha Sep 18, 2026
c550b2f
test(tui3): specify rail family order and fold
santoshkumarradha Sep 18, 2026
00ba20c
feat(demo-home): seed belt plan runs
santoshkumarradha Sep 18, 2026
22b349e
test: reproduce do deliverable landing race
santoshkumarradha Sep 18, 2026
a3a3e24
plandb: persist task questions
santoshkumarradha Sep 18, 2026
1d8eede
test(demo-home): only assert specified plan fields
santoshkumarradha Sep 18, 2026
6830de9
fix(run): preserve stored root deliverable
santoshkumarradha Sep 18, 2026
60765c4
session: answer owed root landings
santoshkumarradha Sep 18, 2026
831c02d
docs: explain when task landings reply
santoshkumarradha Sep 18, 2026
abd36de
test(tokens): pin failed cell Font Awesome spelling
santoshkumarradha Sep 18, 2026
5ad3807
fix(tokens): make failed cell spelling invariant
santoshkumarradha Sep 18, 2026
3616211
Merge branch 'sdev' into wave1
santoshkumarradha Sep 18, 2026
e8835e0
Merge branch 'sdev' into wave2
santoshkumarradha Sep 18, 2026
d2583dc
test(tui3): specify run progress dot tiers
santoshkumarradha Sep 18, 2026
5ad129b
test(namelaw): recognize landing answer prompt
santoshkumarradha Sep 18, 2026
6381bde
docs: the #1204 change entry
santoshkumarradha Sep 18, 2026
cc97b1b
docs: the #1205 change entry
santoshkumarradha Sep 18, 2026
37039bd
feat(tui3): render tiered run progress dots
santoshkumarradha Sep 18, 2026
5d65212
docs: the #1205 entry title under one line
santoshkumarradha Sep 18, 2026
b077588
fix(tui3): keep empty failure share at frontier
santoshkumarradha Sep 18, 2026
0bdb3e3
fix(tui3): place run progress on shared task row
santoshkumarradha Sep 18, 2026
2411dbf
style(tui3): format progress test table
santoshkumarradha Sep 18, 2026
f712f4b
test: exercise owed landing reply turn
santoshkumarradha Sep 18, 2026
7ca340f
session: wire owed landing answer role
santoshkumarradha Sep 18, 2026
68b49cb
docs: explain when task landings reply
santoshkumarradha Sep 18, 2026
57294c6
docs(demo-home): describe seeded belt runs
santoshkumarradha Sep 18, 2026
56a923f
test(session): expose proposal run routing gap
agentfield-bot Sep 18, 2026
c7ca723
Merge branch 'c256-in' into wave1
santoshkumarradha Sep 18, 2026
a504c16
fix(session): route approved proposals into run plan
agentfield-bot Sep 18, 2026
0907ea7
docs: explain chat hand-off routing
agentfield-bot Sep 18, 2026
678b20f
feat(tui3): order the rail's families by activity and fold done rows …
santoshkumarradha Sep 18, 2026
034f728
Merge branch 'c253-in' into wave1
santoshkumarradha Sep 18, 2026
57f3557
tui3: the activity order is the plan's and never re-files the record'…
santoshkumarradha Sep 18, 2026
b5fa63b
Merge branch 'c254-in' into wave1
santoshkumarradha Sep 18, 2026
c4bb795
docs/changes: note the chat hand-off routing (#1207)
agentfield-bot Sep 18, 2026
10e0548
session: a reopened conversation finds the belt run it left
santoshkumarradha Sep 18, 2026
476c87a
demo-home: the seeded run lives in the conversation's own folder, and…
santoshkumarradha Sep 18, 2026
8752df2
test(tui3): require progress on wide plan rows
santoshkumarradha Sep 18, 2026
51e9692
Merge branch 'c255-in' into wave2
santoshkumarradha Sep 18, 2026
f1f1410
fix(tui3): show plan progress on wide run rows
santoshkumarradha Sep 18, 2026
62ba5c1
docs(manual): say the rail shows the run tree
santoshkumarradha Sep 18, 2026
45390a4
docs(manual): render the rail tree wording
santoshkumarradha Sep 18, 2026
acda100
session: the three hand-off rules are a belt fact, not bytes of syste…
santoshkumarradha Sep 18, 2026
a7262c0
Merge the hand-off routing (c258) into the chat role
santoshkumarradha Sep 18, 2026
64b587a
test(tui3): specify plan tree in chat rail
santoshkumarradha Sep 18, 2026
be2979b
docs: where the hand-off enters, now that both doors take the run roa…
santoshkumarradha Sep 18, 2026
6593dd5
fix(tui3): draw plan tree in chat rail
santoshkumarradha Sep 18, 2026
3450779
fix(tui3): avoid duplicate plan notices in rail
santoshkumarradha Sep 18, 2026
c17d050
session: under the belt the conversation has one way to put work out
santoshkumarradha Sep 18, 2026
d8a3730
Merge c263: the chat's rail draws the plan tree, and wide rows wear t…
santoshkumarradha Sep 18, 2026
663b428
tui3: the rail's plan titles come from the held reading, never from t…
santoshkumarradha Sep 18, 2026
2ca56b2
hands-on: wave1 + wave2 (throwaway, never a PR)
santoshkumarradha Sep 18, 2026
feb5266
tui3: the rail draws the run's tree in a conversation that never open…
santoshkumarradha Sep 18, 2026
66b5a65
hands-on: wave1 update
santoshkumarradha Sep 18, 2026
539b577
test(tui3): the rail's plan row is one line, the run's row wears the …
santoshkumarradha Sep 18, 2026
ebc64ad
fix(tui3): draw a plan row on the rail as one line with its tail, one…
santoshkumarradha Sep 18, 2026
560f834
docs(manual): the roster's run rows are one line each, the run's row …
santoshkumarradha Sep 18, 2026
72f72a4
Merge c266: on the rail a plan row is one line and the run's row wear…
santoshkumarradha Sep 18, 2026
eeb8c60
hands-on: wave1 update (c266)
santoshkumarradha Sep 18, 2026
19286f6
the run's row counts progress at the store's own root, and a narrow r…
santoshkumarradha Sep 18, 2026
99c3a7f
hands-on: wave1 update
santoshkumarradha Sep 18, 2026
b0d5f74
tui3: on the rail a task under a task is drawn under it, at the rail'…
santoshkumarradha Sep 18, 2026
2b6052e
hands-on: wave1 update (rail nesting)
santoshkumarradha Sep 18, 2026
e99fd79
docs: the 1204 entry says the rail draws the run's tree
santoshkumarradha Sep 18, 2026
908152f
test: reproduce woken planner ownership and terminal worker
santoshkumarradha Sep 18, 2026
aba6597
fix: claim woken planners and stop terminal workers
santoshkumarradha Sep 18, 2026
9555b5d
fix: restore ownership on every planner wake
santoshkumarradha Sep 18, 2026
5bd4c74
docs: explain planner wake and repeated refusal
santoshkumarradha Sep 18, 2026
60f23f5
tui3: a family's line is one unbroken stroke, a failed run keeps its …
santoshkumarradha Sep 18, 2026
c45fc53
hands-on: wave1 update (family stroke, dots)
santoshkumarradha Sep 18, 2026
3ca7f70
tui3: a failure takes the dot row's end, one cell at least, and the r…
santoshkumarradha Sep 18, 2026
b4bd365
hands-on: wave1 update (dot cells)
santoshkumarradha Sep 18, 2026
dc91a73
Merge c269: a woken planner holds its task, and a worker whose task f…
santoshkumarradha Sep 18, 2026
9cc0af1
run: a refused claim never drops a wake, and a worker that wrote its …
santoshkumarradha Sep 18, 2026
cff326c
docs: the 1204 entry says a woken planner holds its task
santoshkumarradha Sep 18, 2026
a61547f
docs: the 1204 entry touches the engine too
santoshkumarradha Sep 18, 2026
7997f9e
hands-on: wave1 update (woken planner holds its task)
santoshkumarradha Sep 18, 2026
0c275ff
docs: the run pane, one look says what this is and where it stands
santoshkumarradha Sep 18, 2026
177ea1d
test(session): specify stored run summaries
santoshkumarradha Sep 18, 2026
0593e6f
feat(session): store and refresh run summaries
santoshkumarradha Sep 18, 2026
be16d7e
feat(session): carry run now in landing digest
santoshkumarradha Sep 18, 2026
4529f99
docs: explain run summary lines
santoshkumarradha Sep 18, 2026
ae0eef3
run: a belt check runs on the crew's checking seat, with a door seat …
santoshkumarradha Sep 18, 2026
d63acbd
fix(session): a run summary reads its own family and the session's op…
santoshkumarradha Sep 18, 2026
9f17760
merge c271: the run summary, four lines on the worker model
santoshkumarradha Sep 18, 2026
ea5113e
docs: the change entry says what the run summary invalidates
santoshkumarradha Sep 18, 2026
3e76425
test(session): require landing summary refresh
santoshkumarradha Sep 18, 2026
551bfdf
fix(session): refresh run summary at landing
santoshkumarradha Sep 18, 2026
8b2988c
docs: explain run now rail summary
santoshkumarradha Sep 18, 2026
234108e
test(tui3): specify run summary rail refresh
santoshkumarradha Sep 18, 2026
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
c975972
session: a run stopped on its own question says so (#1293)
santoshkumarradha 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
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
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
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
d39a4e3
session: a held landing offers its answer and stops demanding one (#1…
santoshkumarradha Sep 21, 2026
3a1f80f
session: generate_image refuses an empty prompt before anything is pa…
AbirAbbas Sep 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -37,3 +37,4 @@ internal/manual/pages.pack.gz
# at the root is what the next lane's `git add -A` sweeps up: two of these were
# committed that way on #1173 and had to be taken back out.
.furrow/
bench/idle-surface/runs/
31 changes: 29 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
# anywhere else — so a stale copy can't shadow a fresh one.
BINARY := bin/codeaf

.PHONY: all build build-check debug demo-home embed manual-pack-law furrow test test-focus test-report test-quick test-touched test-touched-preflight pr-ready test-laws fmt-check test-packed-manual manual-gates test-remote test-e2e test-e2e-tui vet check size clean \
.PHONY: all build build-check build-cross debug demo-home embed manual-pack-law furrow test test-focus test-report test-quick test-touched test-touched-preflight pr-ready test-laws fmt-check test-packed-manual manual-gates test-remote test-e2e test-e2e-tui vet check size clean \
changelog changelog-new changelog-check changelog-preview

# What the shipped binary is allowed to weigh, in bytes, checked in beside the
Expand Down Expand Up @@ -91,6 +91,7 @@ furrow:
# then to PATH — which is what it does here.
build: furrow embed
go build -tags=$(MANUAL_TAG) -trimpath -ldflags="-s -w $(BUILD_STAMP)" -o $(BINARY) ./cmd/codeaf
go build -trimpath -ldflags="-s -w $(BUILD_STAMP)" -o bin/plandb ./cmd/plandb

debug: furrow embed
go build -tags=$(MANUAL_TAG) -trimpath -ldflags="$(BUILD_STAMP)" -o $(BINARY) ./cmd/codeaf
Expand Down Expand Up @@ -185,6 +186,9 @@ test-touched-preflight:
exit 2; \
fi

# A directory under its own go.mod is another module — a bench fixture the
# task door edits, not a package of this one — and `go test ./that/dir` from
# here answers "does not contain package". The walk skips those.
test-touched: test-touched-preflight
@set -eu; \
base="$${BASE:-origin/dev}"; \
Expand All @@ -197,6 +201,12 @@ test-touched: test-touched-preflight
done | sort -u)"; \
pkgs=""; \
for dir in $$dirs; do \
nested=0; walk="$$dir"; \
while test "$$walk" != "." && test "$$walk" != "/"; do \
if test -f "$$walk/go.mod"; then nested=1; break; fi; \
walk="$$(dirname "$$walk")"; \
done; \
if test "$$nested" = 1; then continue; fi; \
if ls "$$dir"/*.go >/dev/null 2>&1; then pkgs="$$pkgs ./$$dir"; fi; \
done; \
fi; \
Expand Down Expand Up @@ -339,7 +349,24 @@ size: build

# The end-of-change ritual in one word: prove it, then ship the binary, then
# weigh it.
check: vet fmt-check test test-packed-manual size
# Read the release workflow so this gate follows the shipped platform list.
# The six builds share the normal GOCACHE, so a warm box pays far less than a
# cold one; the printed duration is the whole step, cold or warm.
build-cross:
@set -eu; started=$$(date +%s%N); \
targets="$$(awk '/^[[:space:]]*targets=\($$/ { in_targets=1; next } in_targets && /^[[:space:]]*\)/ { exit } in_targets { gsub(/"/, ""); if (NF == 2) print $$1 "/" $$2 }' .github/workflows/release.yml)"; \
test -n "$$targets"; \
for target in $$targets; do \
goos=$${target%/*}; goarch=$${target#*/}; \
printf 'build-cross: %s/%s\n' "$$goos" "$$goarch"; \
if ! CGO_ENABLED=0 GOOS="$$goos" GOARCH="$$goarch" go build ./...; then \
printf 'build-cross: FAILED building %s/%s\n' "$$goos" "$$goarch" >&2; exit 1; \
fi; \
done; \
finished=$$(date +%s%N); \
printf 'build-cross: total duration %ss (rounded up, an upper bound on the added time)\n' "$$(( (finished - started + 999999999) / 1000000000))"

check: vet fmt-check test test-packed-manual size build-cross

# ── the changelog ───────────────────────────────────────────────────────────
#
Expand Down
16 changes: 16 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -253,6 +253,22 @@ when the hosted relay does. [How it works](docs/REMOTE.md).
| how long it lasts | one session | conversations, tasks and standing orders that outlive the window |
| without you | it stops | headless, standing orders, a phone in your pocket |

## Performance benchmark

One Go binary, 53 MB on disk: up to 21x smaller than the field.

| | CodeAF | claude | heaviest rival measured |
| ------------------------ | ------- | -------------- | ----------------------- |
| On disk | 53 MB | 224 MB, 4x | 1.1 GB, 21x (omp) |
| RAM per added session | 27 MB | 216 MB, 8x | 653 MB, 24x (opencode) |
| 16 idle sessions | 507 MB | 3.5 GB, 7x | 10.5 GB, 21x (opencode) |
| Peak during one turn | 122 MB | 421 MB, 3.4x | 1.0 GB, 8x (opencode) |
| Resume a 50-turn session | 145 ms | 392 ms, 2.7x | 3.0 s, 20x (opencode) |

Sixteen of ours fit in half a gigabyte; claude's fourth tab alone needs more.

Harness, method and every table: [docs/benchmarks/performance](docs/benchmarks/performance/).

## Docs

- `codeaf manual`, or `alt+.` for the key map. The manual ships in the binary and the chat reads it too.
Expand Down
141 changes: 141 additions & 0 deletions bench/bashloop/BASHLOOP-DO-DOOR.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
# The do door — the six cells through `codeaf do`, and what stopped them

*2026-09-17. The companion report to the task-door grid — the same six cells,
the same two arms, the same pinned model (`deepseek/deepseek-v4-flash`), the
same fixtures, graders and reading discipline, driven through the product's
adaptive-run door instead of the engine's task door.*

**The headline first: the grid was not spent, because the arming gate failed.
On the do door the two arms are the same arm by every observable the door
itself keeps — no belt fingerprint appears in arm B's workers — and the brief's
own law says two identical arms are not a comparison. What ran is the arming
probe: a c1 pair and a c5 pair, both arms, n=1 each. Their rows are below. The
other four cells are recorded as not run, at the stage that stopped them.**

## The door, the flag, the dry run

The driver carries `-door task|do` (default `task`). Door `do` launches the
built binary as a subprocess, the rig's own shape
([bench/deepswe/run.sh](../deepswe/run.sh)):

```sh
codeaf do -w <fixture> -model deepseek/deepseek-v4-flash -plan-model deepseek/deepseek-v4-flash \
-db <home>/graph.db -keep -timeout 1800s -yes-spend -json < <brief>
```

with `CODEAF_HOME` and `HOME` on the throwaway home and `CODEAF_TASK_BELT`
unset for arm A, `=bash` for arm B — the only byte that differs between the
arms. The dry run prints every invocation for both doors; the driver's tests
prove the two doors' blocks and that the arms differ only in the belt variable
(`driver_test.go`).

The door's exit ladder, in its own words: **0** done · **1** could-not-run ·
**2** ran-not-finished · **3** limit-stopped · **4** needed-answer · **124**
the driver's wall fired first. `stdout` is one JSON envelope; `stderr` is the
stream, kept as `run.log` beside each row.

## The rows that ran (the arming probe)

Read off the door's own store, the home's `graph.db` — cost and models from
`usage` (the door's per-call ledger, the same per-response accounting the task
door's `v3/usage.jsonl` keeps), steps from the transcript's finished tool calls
(the task door's `took` unit), the diagnostics from the tool results, the
family shape from `nodes`:

| cell | arm | n | pass | rate | ending (exit) | med steps | med $ | med wall | invalid | trunc | idiom | parts | changed |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| c1 | A | 1 | 1 | 1.00 | done (0) | 5 | $0.0053 | 110s | 0 | 0 | 0 | 0/0 | 29 |
| c1 | B | 1 | 1 | 1.00 | done (0) | 21 | $0.0188 | 265s | 0 | 0 | 0 | 0/0 | 31 |
| c5 | A | 1 | 0 | 0.00 | ran-not-finished (2) | 87 | $0.0400 | 487s | 0 | 0 | 0 | 0/0 | 43 |
| c5 | B | 1 | 1 | 1.00 | ran-not-finished (2) | 93 | $0.0696 | 922s | 0 | 0 | 0 | 2/3 | 45 |

Over the graded passes: arm A (n=1) — 5 steps · $0.0053 · 110s. Arm B (n=2) —
medians 57 steps · $0.0442 · 594s. Both arms graded pass on c1 (the c5 grader
passed arm B's work: suite green, 2 of 3 parts landed as their own work, one
node failed — `task-2-x2`, read straight off the `nodes` table). Arm A's c5 ran
the four packages green and still graded no: the family never left one pair of
hands, and the run ended exit 2. The wall column is the envelope's own seconds
(`wall_source=node`); the driver's backstop never fired.

The cells not run, with the stage that stopped them:

| cell | arm | reading |
| --- | --- | --- |
| c2, c3, c4, c6 | A and B | not run — the grid was withheld at the belt-arming gate (below); spending four cells on one arm would have been the wrong answer the brief names |

## The arming gate, and how it was checked

The fix this branch carries (`36a689926`) arms the belt on the do door's run
leaves: `orchestrate.go`'s `newChild` now builds its `Config` with
`bashBelt: bashBeltAsked()` (`InTask` was already true, and
`Config.mayBashBelt` is `InTask && bashBelt`). The task door's workers take the
same flag at `task_run.go`'s worker construction. That wiring is real, and it
is where the task door's arming is enough — its workers do the work themselves.

The do door is built differently: a run leaf's file work is done by the
subharness's own executor, not by the leaf agent's own hands. So the probe
looked for the belt in the three places the brief names, using only the door's
own records:

1. **The worker's own trace** — the store's `transcript` table, per node. Both
arms' workers called the same executor toolset: c5 arm A `sh`×73, `edit`×5,
`read`×4, `share`×2, `write`×3; c5 arm B `sh`×80, `edit`×6, `read`×2,
`share`×1, `write`×4 (c1 the same shape, smaller). Arm B carries **zero**
calls of a bash-belt hand (`bash` — the belt's own shell, `branchBash` — is
a different name than the linear executor's `sh`), and the belt's tool
composition (`bashBelt()`: branch bash, document, jobs, manual)
appears nowhere.
2. **The composed page** — per-node first-turn `prompt_tokens` off
`usage_turns`: arm A 4640/6468/6667, arm B 4663/6714/6552/6771 (c1's three
and four nodes). Within a percent either way. The belt swaps whole pages
(`bashworker.md` in place of the fan-out page, belt facts into the frame);
a page swap that moves nothing measurable is not there.
3. **The belt's own diagnostics** — the one-action envelope's rejections
("no action executed") and the plan CLI's name (`plandb`, which the
bashworker page teaches): **zero** in every transcript body and event
payload on both arms. On the task door arm B's rows carried 1–17 invalid
actions each; here the envelope never armed, which is itself the fingerprint
of absence.

One behavioral divergence between the arms did show — c5 arm B spliced a
family (2 of 3 root children done) where arm A stayed single-handed and graded
no — but nothing in that run's trace names the belt, and at n=1 a family-shape
difference is run noise as far as the switch is concerned. The belt cannot be
credited with it and the grid cannot be built on it.

**Verdict: the belt does not reach the do door's workers.** The flag arms the
leaf's `Config` and stops there: the leaf's file work is executed by the
subharness executor, which is built without the belt, and the leaf's own prompt
is composed without the belt's pages. This is the DeepSWE finding one seam
deeper — the switch now reaches the process *and* the leaf `Config`, and still
arms nothing the door's records can see. `planSeed`'s store never seeds on this
door either (it runs from `TaskGraph.admit`; the do door registers and does not
admit), so the plan-CLI path has no purchase here either.

## The two sentences the brief asks for

The do door does not change the task-door verdict, because it cannot re-measure
it: with the belt invisible on this door, both arms are one arm, and the honest
do-door reading is "unmeasured", not "agree" or "disagree". The doors diverge
structurally — the task door builds workers at `newTaskAgentOn` whose toolbelt
and pages the belt composes, while the do door builds run leaves at
`orchestrate.go`'s `newChild` and hands the actual work to the subharness's own
executor, so the belt stops at the leaf's `Config` and nothing downstream of
that seam ever reads it.

## Where the readings live

Raw, beside this report, in `bench-results/bashloop-do-door/` — per results
root (`bashloop-do-pair2` = the c1 pair, `bashloop-do-c5probe` = the c5 probe,
`bashloop-do-pair` = the first pair, run before the store reader existed, whose
rows read hollow: `steps=0 $0.0000`, the defect that forced the reader): the
driver's `bashloop.csv`, each run's JSON envelope (`do.json`), its stderr
stream (`run.log`), and the home's own `graph.db` and `logs/calls.jsonl`.
On the Spark the full run directories (fixtures and all) are
`/home/santosh/work/bashloop-do/bench-results/`.

The first pair also earned the one driver change this report rides with: the
do door keeps its numbers in the store, not in the `v3` ledger-and-journals
layout the task door writes, so `door.go` reads the store read-only (same
helpers, same units, one new reader) and the row now carries the family shape
the c5 grader needs.
109 changes: 109 additions & 0 deletions bench/bashloop/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
# bashloop — the arm bench for the bash-only task loop

Wave 3 of the bash-task-loop experiment
([DESIGN.md](../../docs/design/bash-task-loop/DESIGN.md)): the same briefs run
on both belts — arm A with `CODEAF_TASK_BELT` unset (the belt as shipped),
arm B with `CODEAF_TASK_BELT=bash` — n replicates, cells interleaved so the
arms share the day. Every cell is graded by code: the fixture's own suite, a
mechanical diff, or a document's presence and coverage. No LLM judges
anything, per [bench/README.md](../README.md).

An arm is named by belt AND seats. `-seats one` (the default) runs the one
`-model` on every seat — arms `A-one` and `B-one`, the grid as it was before a
crew arm existed. `-seats crew` runs the five seat rows the machine's own
profile holds instead, arms `A-crew` and `B-crew` — so the grid can answer
whether a person on the tuned crew is better off beside the one-model
comparison. `-arms` selects any subset by name. A crew arm's rows quote every
model the run billed — the crew's worker, planner and auxiliary seats — which
is what its `models` column and `seats` column carry.

## Dry run first

```sh
go run ./bench/bashloop -dry-run # every invocation: arm, cell, replicate, env, brief
go run ./bench/bashloop -mode pair -dry-run # the same-question pair
go run ./bench/bashloop -dry-run -arms A-crew,B-crew # a crew arm prints its five seat rows
```

The dry run composes every invocation — arm, cell, replicate, env, model,
wall, brief, and where its record lands — and executes nothing. A crew arm
adds its five seat rows, one per tier, named with the model and the rung the
machine's own profile filled it with. The dry run is the check
bench/README.md's honest-wiring rule asks for; the test `driver_test.go`
proves it (every invocation printed, the arms differing only in the belt
variable, the default grid unchanged, and a crew arm differing from its
twin only in the seat rows).

## Live grid

```sh
go run ./bench/bashloop # grid: 6 cells × 2 arms × 3 replicates
go run ./bench/bashloop -mode pair # one brief, both arms, n=1 — the first smoke
go run ./bench/bashloop -cells c1,c3 # a subset
go run ./bench/bashloop -out bench-results/bashloop/manual-run
go run ./bench/bashloop -door do # the same grid through the product's do door
go run ./bench/bashloop -seats crew # both belts on the profile's crew seats
```

Each invocation seeds its own fixture repo from `fixtures/` (committed, so
the diff is measurable), works in a throwaway `CODEAF_HOME`, starts one task
through the engine's own task door, waits on the landing through the event
lane, and is read back off the disk the engine wrote: cost from the home's
usage ledger, steps from the family journals' `took` lines, the ending and
the wall from the task notice, the fan-out shape from the graph checkpoint.

## The second door

`-door do` runs the same cells, arms, fixtures, homes, readings and graders
through the product's adaptive-run door instead of the engine's task door:
the driver launches the built binary as a subprocess, the way
[bench/deepswe/run.sh](../deepswe/run.sh) drives it —

```sh
codeaf do -w <fixture> -model <pinned> -plan-model <pinned> \
-db <home>/graph.db -keep -timeout <seconds> -yes-spend -json < <brief>
```

with `CODEAF_HOME` and `HOME` pointed at the throwaway home and the arm's
belt switch in the environment. The door's own exit ladder reads
0 done · 1 could not run · 2 ran and did not finish · 3 a limit stopped it ·
4 needed an answer · 124 the driver's wall fired first, and the ending word
in the row is that word. The dry run prints the exact invocation for this
door too. The door edits the fixture in place (`-w`), so the grader reads
the seeded fixture directory itself, and the numbers are read from the
door's own run store — the home's `graph.db`: cost and models from the
`usage` table (the door's per-call ledger), steps from the transcript's
finished tool calls, the diagnostics from the tool results, the family
shape from the `nodes` table. The belt must be seen armed in the do door's
own trace (a belted worker's shell hand is named `bash`, where the linear
subharness's own executor names it `sh`; the envelope rejections and the
plan-CLI's name are the other fingerprints) before its rows are worth
reading — the do-door report names that check.

## The cells

| cell | shape | graded by |
| --- | --- | --- |
| c1 | small fix — one failing suite | the suite green, tests untouched |
| c2 | feature — a new package + tests | suite green, package present, existing files untouched |
| c3 | multi-file refactor — reads-heavy | suite green, one copy of the math, public surface unchanged |
| c4 | report from a document corpus | REPORT.md present, four sections, grounded |
| c5 | wide job — four independent packages | suite green, children landed in the graph, INTEGRATION.md |
| c6 | kept-tool image | the image exists and is referenced |

The medians the design doc quotes — steps, cost, wall over the graded
passes, per arm and cell, plus the branch-only diagnostics — are printed by
the driver into the run's CSV (`bashloop.csv`). The summary table groups by
cell and arm name and adds a `models` column; the CSV carries the arm's
seats (`one` or `crew`) beside its belt letter. The verdict words stay in
the design document.

## Reading the rows

`cost_usd` is the home's own ledger sum — the provider's per-response
accounting, the only honest source on a shared key (bench/README.md's cost
rule). `unbilled` counts the rows whose receipt the provider never returned;
a cost that reads low says so in that column. `ending` is the engine's own
state word; a row with `ending=setup-failed` never started. Wall is the
node's own record when it kept one and the driver's clock otherwise, and
`wall_source` says which.
Loading
Loading