Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
693 commits
Select commit Hold shift + click to select a range
397a145
docs: why a settled /task leaves commits on task/<slug>, not the work…
santoshkumarradha Sep 18, 2026
915ff3a
pool: regenerate the seed index from the relay's first clean publish …
santoshkumarradha Sep 18, 2026
d9b4243
cmd/codeaf: the model warm stops when the process closes (#1179)
santoshkumarradha Sep 18, 2026
bd2dcf3
session: the auditor's calls say they are the auditor's and which nod…
santoshkumarradha Sep 18, 2026
c6ed47c
task: json unverified branch (#1182)
santoshkumarradha Sep 18, 2026
360352a
session: a settle turn runs under the checker's own bound, not the ru…
santoshkumarradha Sep 18, 2026
af9d577
Merge commit '360352ad4' into harness/worker-loop
santoshkumarradha Sep 18, 2026
1aac369
docs: the reruns with the review round, and what the bandit cache mis…
santoshkumarradha Sep 18, 2026
510e7c4
Merge branch 'wave1' of /home/santosh/src/codeaf-bashloop into harnes…
santoshkumarradha Sep 18, 2026
814e1af
session: the tasks text and record line name a failed/unverified node…
santoshkumarradha Sep 18, 2026
7c25a26
internal/session: the identical-effects test stops riding the turn gu…
santoshkumarradha Sep 18, 2026
6e7d0ed
cmd/codeaf: exec and run envelopes name a non-verified node's kept br…
santoshkumarradha Sep 18, 2026
f4079d7
session: bound a worker's park on a promoted command (#1187)
santoshkumarradha Sep 18, 2026
7f6e6f3
c236: the plan row's tree, failing tests first
santoshkumarradha Sep 18, 2026
edfbec7
c236: the tasks place draws the plan as a tree
santoshkumarradha Sep 18, 2026
839cfdd
c236: a task's page shows its children under its steps
santoshkumarradha Sep 18, 2026
994689f
docs: the model pool runbook names the Workers Paid plan and what it …
santoshkumarradha Sep 18, 2026
c315be1
docs: the runbook's plan line says metered, not capped, and nothing m…
santoshkumarradha Sep 18, 2026
74e5f10
c236: the manual says why a task is indented under another
santoshkumarradha Sep 18, 2026
f6b51f9
Merge remote-tracking branch 'origin/santos/dev' into harness/worker-…
santoshkumarradha Sep 18, 2026
4083847
docs: the plan drawn as a tree in the change entry and the body
santoshkumarradha Sep 18, 2026
1b4c8c3
Merge branch 'wave1-in' into harness/worker-loop
santoshkumarradha Sep 18, 2026
2e80c60
internal/tui3: the status word says working while a task subtree turn…
santoshkumarradha Sep 18, 2026
99363ca
session: bound a job subtree's CPU and process count (#1190)
santoshkumarradha Sep 18, 2026
6db5125
docs: what the audit check seat can execute, and where that boundary …
santoshkumarradha Sep 18, 2026
b73b53d
tui2/prose: load a curated lexer set on first use, not all 279 at ini…
santoshkumarradha Sep 18, 2026
cec27ad
test(plandb): declare task checks behavior
santoshkumarradha Sep 18, 2026
7665af7
feat(plandb): persist declared task checks
santoshkumarradha Sep 18, 2026
e264ca5
test(plandb): render checks in next claim
santoshkumarradha Sep 18, 2026
085c631
test(run): expose unchecked self-completing root
santoshkumarradha Sep 18, 2026
d5ff881
fix(plandb): show checks for next claimed task
santoshkumarradha Sep 18, 2026
3f3789a
test(run): declare review task checks
santoshkumarradha Sep 18, 2026
3e4492d
fix(run): propagate declared checks to reviews
santoshkumarradha Sep 18, 2026
879c2b1
test(session): require declared checks in checker brief
santoshkumarradha Sep 18, 2026
2296143
fix(session): run declared checks before acceptance probes
santoshkumarradha Sep 18, 2026
3da2982
docs: explain declared worker checks
santoshkumarradha Sep 18, 2026
631237c
Merge remote-tracking branch 'origin/dev' into santos/dev
santoshkumarradha Sep 18, 2026
2ac2360
Merge remote-tracking branch 'origin/dev' into santos/dev
santoshkumarradha Sep 18, 2026
af6ecbd
test(do): cover self-finished root review
santoshkumarradha Sep 18, 2026
03d4e49
test(do): keep root review contract comment scoped
santoshkumarradha Sep 18, 2026
0aecaf2
fix(run): reopen completed root for review check
santoshkumarradha Sep 18, 2026
d915ecb
docs: clarify childless root review
santoshkumarradha Sep 18, 2026
199b99e
test: isolate plan worker environment
santoshkumarradha Sep 18, 2026
b6b65c9
Merge branch 'c243-in' into wave1
santoshkumarradha Sep 18, 2026
1dc6630
run: a check's landing wakes nobody, so a root that finished alone co…
santoshkumarradha Sep 18, 2026
a361a82
docs: the solo root's review and declared checks in the entry and the…
santoshkumarradha Sep 18, 2026
0f8e82e
Merge remote-tracking branch 'origin/santos/dev' into harness/worker-…
santoshkumarradha Sep 18, 2026
8dd4ef0
Merge branch 'wave1-in' into harness/worker-loop
santoshkumarradha Sep 18, 2026
7677b95
docs: the plan as a tree, the rail and the page (design)
santoshkumarradha Sep 18, 2026
e67a2e1
docs: the role of the main chat once tasks are the main road (c244)
santoshkumarradha Sep 18, 2026
311435d
test(tui3): pin task tree rail and page behavior
santoshkumarradha Sep 18, 2026
c8d0046
Merge remote-tracking branch 'origin/dev' into santos/dev
santoshkumarradha Sep 18, 2026
1a3687a
Merge branch 'c244-in' into wave1
santoshkumarradha Sep 18, 2026
fb8013e
feat(tui3): draw plan subtrees and fold finished families
santoshkumarradha Sep 18, 2026
569f928
test(tui3): pin page waits and subtree figures
santoshkumarradha Sep 18, 2026
ae07e93
Merge remote-tracking branch 'origin/dev' into santos/dev
santoshkumarradha Sep 18, 2026
8845570
docs: a landing speaks only when an answer is owed (the approved chat…
santoshkumarradha Sep 18, 2026
43b1ea6
feat(tui3): show page waits and subtree figures
santoshkumarradha Sep 18, 2026
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
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/
45 changes: 45 additions & 0 deletions FINDINGS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# Unread config key notice findings

## Task

Carry the unread top-level `config.json` keys computed by `config.Load` into the existing one-time conversation notice in both hosted and `--no-host` chat. The notice must name the keys, use the existing `notices.json` mechanism, stay silent for a correct flat config, and show again only for a previously unseen changed key set. Production code is intentionally out of scope for this findings commit.

## Single-source transport path

The only key classification remains the computation currently inside `warnUnreadProfileKeys` in `internal/config/config.go:361-388`. Refactor it to return its sorted `[]string`, and make the existing log format that exact returned value. No downstream code may inspect config keys or reconstruct the set.

Retain that value from the existing `config.Load` call in `openV3ProcessWith` (`cmd/codeaf/chatv3_process.go:128-154`) on the process/launch data. From there the two paths are:

- `--no-host`: `openV3ProcessWith` -> `v3Process` -> `openV3Launch` / `v3Seam.bundle` -> the existing launch notice input -> `tui3.Options.Notice` -> the existing dim conversation note consumed by `internal/tui3/app.go:2870-2917`.
- Hosted: `openV3ProcessWith` during `bootEngine` (`cmd/codeaf/engine.go:563-613`) -> `remote.Engine` -> a dedicated unread-key field on `remote.Welcome` (`internal/remote/wire.go`) populated by `welcomeLocked` (`internal/remote/server.go:1149-1162`) -> `hostEntryNotice` / `hostOptions` (`cmd/codeaf/chatv3_host.go`) -> `tui3.Options.Notice` -> the same existing dim conversation note.

The hosted wire field is required because the engine and surface are separate processes. Neither stderr, the per-profile chat log, nor `host.log` reaches the conversation.

The displayed sentence should use the existing conversation-note surface and plain wording such as: `config.json keys are not read: models; models fell back to defaults.` The names come directly from the transported sorted list.

## Notice gate

Use the existing `noticeBoard` and `noticeLedger` persistence in `internal/tui3/notice.go` and `internal/tui3/notice_ledger.go`, with `maxShown=1`. Keep a stable display row id, `unread-profile-config-keys`, and use this dynamic ledger gate id:

`unread-profile-config-keys-<sha256hex>`

Compute the full lowercase SHA-256 hex digest from `encoding/json.Marshal` of the already sorted shared list. This is deterministic and unambiguous for arbitrary key strings, matches the notice id shape, and does not introduce a second unread-key computation. Gate eligibility, per-session shown state, show, and retire by the dynamic gate id while rendering by the stable row id. An empty list arms no notice. The same set remains retired across launches; a new set gets a new gate and shows once; returning to an already retired set stays silent.

The ledger must be opened for the profile whose config was loaded. In hosted mode, do not silently gate an engine-profile warning against an unrelated client profile.

## Focused verification plan

1. Extend the focused config test around `TestWarnUnreadProfileKeys` to prove the shared function returns a sorted list and the log formats that same result: `go test ./internal/config -run TestWarnUnreadProfileKeys -count=1`.
2. Add focused remote wire/server coverage proving the sorted unread list survives `Engine -> Welcome` serialization and receipt.
3. Add focused notice-board tests proving: empty input is unarmed; the first display is persisted; restart with the same gate is silent; a changed list displays once; returning to an old list is silent; and the rendered conversation note names the keys.
4. Add focused command-path tests for both `--no-host` launch transport and hosted `hostOptions` transport.
5. Exercise the acceptance case with a built real binary and a real engine plus client, never `quietAgent` or another fake agent: nested `{"models":{"tiers":{"reflex":"..."}}}` shows a notice naming `models` once; a correct flat config shows nothing; a second launch is silent; changing the unread set shows once again in hosted and `--no-host` modes.
6. Run only focused `go test -run` commands while implementing, then leave the coordinator's prescribed pre-PR gates to the coordinator.

## Implementation step

Implement the shared return value first, then transport it on `v3Process` and `remote.Welcome`, and finally arm the existing notice board with the hashed dynamic gate. Focused tests will cover config classification, wire transport, local and hosted option assembly, and ledger behavior. No downstream layer will read or classify `config.json`.

## Change-note step

This lane owns the user-visible change note after the implementation. The note will be `kind: fixed` on `surface: [chat, engine]`, because the load diagnostic added in pull request 1223 did not reach either chat path and the fix carries the same shared unread-key result through both the hosted engine/client boundary and `--no-host` into the existing conversation notice. Its invalidation will distinguish the old logger-only behavior from the once-per-profile notice, including the changed-key-set rule. No pull request number is assigned yet, so the note filename and `pr` value require reconciliation after the coordinator opens the pull request.
10 changes: 10 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
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
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.
Loading
Loading