Skip to content

task room, landing and --one-model: real file names, one note sentence, every seat on one model, no build caches - #1517

Merged
AbirAbbas merged 8 commits into
devfrom
fix/task-room-paths
Sep 25, 2026
Merged

AbirAbbas merged 8 commits into
devfrom
fix/task-room-paths

Conversation

@AbirAbbas

@AbirAbbas AbirAbbas commented Sep 25, 2026 •

Copy link
Copy Markdown
Collaborator

Follows #1429 / #1485 / #1494 / #1436 review. One commit per item.

What was wrong, and what is true now

  1. The work tab misread file names. It took a file's name from the last b/ in the diff --git line. So a person's x b/plandb.db was hidden as codeaf's own store, a name git quoted was drawn as octal escapes, and a leading space was trimmed. Now one reader (session.PatchSectionPath) reads the name the way git's own apply does, and both the filter and the room use it.
  2. One sentence had two spellings. the worker reads a note at its next step was two constants. It is now one (session.RunNotePickupWord). A law test finds exactly one literal and checks that the manual quotes it.
  3. --one-model did not reach a /task run's seats. The run engine seated the worker, planner, checker and probe from the profile's crew rows and CODEAF_CHECK_MODEL, which is how the tagged e2e billed claude-fable-5.1. Now every seat rides the conversation's live model.
  4. A run's landing dropped files whose names git quotes. A name like odd name é'q.txt was dropped without a word. It read git status --porcelain without -z. Every reader of paths on the landing road now reads git's NUL form.
  5. A landing committed untracked build caches (__pycache__/*.pyc in a repository with no .gitignore) and a worker's scratch copy. An untracked file matching one exact list now stays out: __pycache__/, *.pyc, .pytest_cache/, .mypy_cache/, .ruff_cache/, .DS_Store.
    • A tracked or worker-staged file still lands, and so do near-misses such as lockfiles.
    • The worker page tells the worker to delete its scratch files before plandb done.
    • The manual names the list.

Validation contract

  • Every changed or added file is listed and landed under its real name (spaces, b/, quotes, accents, a newline). Only codeaf's own files are left out, judged on the real path.
  • The note sentence is spelled once, and the manual quotes it.
  • Under --one-model, the work, plan, check and probe seats all ride the live conversation model, whatever the crew rows and the environment say. Without the flag, nothing changes.
  • An untracked cache on the list stays out of a landing and out of the work tab. A tracked or staged one lands, and so does every near-miss.

How it was checked

  • Each item has a test that failed on dev and passes now. Examples:
    • TestLandKeepsEveryRealFilename (dev landed 2 of 6 names);
    • TestTheWorkTabDrawsRealGitFilenames;
    • TestTheNotePickupSentenceIsSpelledOnce (dev had 2 literals);
    • TestUnderOneModelEveryRunSeatIsTheConversationsModel (dev seated the profile's four rows and vendor/env-check);
    • TestLandLeavesOutUntrackedBuildCachesOnly.
  • By hand, with the real binary on the engine road, running codeaf chat --one-model:
    • Every crew row was set to a different model slug. A /task wrote odd name é'q.txt, edited x b/plandb.db, and imported a module, which made a __pycache__ file.
    • Every call (106) rode deepseek/deepseek-v4-flash, including the review-round checker. Total spend was $0.013.
    • The landing commit held exactly odd name é'q.txt and x b/plandb.db. The .pyc stayed out.
  • make pr-ready at box load 12–24.
    • The light gate is green.
    • In touched packages, the belt worker prompt's 16 KiB law failed on my first wording of the scratch-file sentence. That is fixed and rechecked after merging dev.
    • Every other red passes when run alone, or fails the same way on origin/dev:
      • internal/run: five supervisor/worker timing tests;
      • internal/session: TestPlandbCliWorkerOwnDone, TestAQueuedTaskThatSurvivedARestartStillHasItsBriefWritten and five others.

🤖 Generated with Claude Code

AbirAbbas and others added 8 commits September 25, 2026 15:37
A run's landing staged the tree's own `git status --porcelain`, read
without `-z`. Git quotes a name holding an accent, a quote or a newline
there (`"odd name \303\251'q.txt"`), and the reader only stripped the
outer quotes, so `git add` was handed a literal pathspec naming no file.
The per-path retry then read it as a file that had never existed, and
the landing commit went out without it and without a word. Run A of the
#1485 review lost `odd name é'q.txt` this way.

Every reader of paths on the landing road now reads git's NUL form
through one small file (git_paths.go): the belt's staging list, the
left-behind report, the unheld-ledger check, the staged-path list, the
conflict list, and the snapshot's commit read. A name is never trimmed,
because a leading space is part of it. The run landing test lands a copy
holding ` lead.txt`, `odd name é'q.txt`, `has"quote.txt`, a newline
name, `a -> b.txt` and a modified `x b/plandb.db` through `run.Land`,
and asserts all six are in the commit with their bytes while codeaf's
own `plandb.db` and `.codeaf/` stay out. On dev it landed two of the six.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The work tab took a file's name from the text after the last ` b/` in
its `diff --git` line, in the session's filter and again in the room.
So a person's `x b/plandb.db` read as `plandb.db`, and the filter hid it
as codeaf's own store. A name git quoted was drawn as octal escapes, and
an added file's leading space was trimmed away.

One reader now answers which file a patch section is about
(git_patch_path.go), the way git's own apply reads it: a rename's
`rename to` line, else the quoted second name, else the two equal bare
halves measured rather than split. Both the harness filter and the
room's label ask it. The difference is read with its prefixes stated and
`core.quotePath=false`, so a person's diff config cannot change the
header's shape, and the added list keeps names whole.

The room also tells a section's header from its hunks by position. A
removed line that read `-- note` arrives as `--- note`; it is the file's
bytes and is drawn, where it used to be skipped as a header.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
`the worker reads a note at its next step` was two constants: the
chat's receipt for a note on a run's row, and the line the task room
writes under the same stored note. They agreed only because nobody had
changed one yet.

The session now exports RunNotePickupWord, and the room takes it. A law
test reads the Go sources of both packages and finds exactly one literal
saying it (dev had two), and checks that the manual quotes it exactly.

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

`--one-model` promises every text call rides the session model, and the
manual says it settles the crew's seats. But the flag withholds the
roles ladder and the crew router, so the chat handed the run engine
three empty seats, and the engine's crew factory filled them from the
profile's crew rows. It also filled the check seat from
CODEAF_CHECK_MODEL, and the probe always rode the profile's small row.
The tagged e2e fixture, which copies the owner's profile, billed
`claude-fable-5.1` and `glm-5.3-flash` that way.

Under the flag the run spec now names the conversation's live model as
every seat (RunSpec.OneModel, and the three seats set to it). The crew
factory seats every role on it (Seats.One) without reading the profile
or the environment. A session test pins the spec (the launch model, a
/model switch before the run, and no flag unchanged). Two run tests pin
the factory and the chat's door against profile rows and the
environment rung naming other models. On dev they seated the profile's
thinking, worker, careful and small rows and `vendor/env-check`.

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

A fresh-install /task in a small Python repository with no .gitignore
landed its one-line fix together with two new `__pycache__/*.pyc` files
and `calc_work.py`, a copy the worker made inside its own copy to compare
against HEAD.

The belt landing now leaves out an UNTRACKED file matching one list,
spelled once (build_caches.go): `__pycache__/`, `*.pyc`,
`.pytest_cache/`, `.mypy_cache/`, `.ruff_cache/`, `.DS_Store`. It is
matched by whole segment, basename ending or whole basename. It is a
separate predicate from harnessWrote, whose law is that a name
resembling machinery is not a reason. A tracked cache that changed, and
one the worker staged or committed, still land. So do the near-misses: a
lockfile, `bench-results/`, `pycache_notes.md`, `src/__pycache__helper.py`,
`my.pyc.txt`. The work tab's added list leaves out the same files.

The worker page now says to delete every scratch file it made in its
copy before `plandb done`. That is one sentence, because the belt
worker's system prompt has a 16 KiB law and about 120 bytes were left. The manual gains a section a person
reaches with "why did __pycache__ not land", which names the list
exactly (a test checks every name).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@AbirAbbas
AbirAbbas merged commit 691ade5 into dev Sep 25, 2026
4 checks passed
@AbirAbbas
AbirAbbas deleted the fix/task-room-paths branch September 25, 2026 21:53
AbirAbbas added a commit that referenced this pull request Sep 25, 2026
…he task room

Brings in #1516, #1517, #1518 and #1519. The two conflicts were dev editing the
inline run-road code that this branch had moved into helpers: the --one-model
seat (#1517) now rides the precomputed crew factory in enginewire, and the
hand-off's named model reaches the crew router as a worker pin (#1518) through
the crew wish set before commitProposalToRun. That wish is read only by the
ordinary task's crew routing, so a senior-dev run keeps the models it names.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant