task room, landing and --one-model: real file names, one note sentence, every seat on one model, no build caches - #1517
Merged
Merged
Conversation
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
added a commit
that referenced
this pull request
Sep 25, 2026
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Follows #1429 / #1485 / #1494 / #1436 review. One commit per item.
What was wrong, and what is true now
b/in thediff --gitline. So a person'sx b/plandb.dbwas 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 ownapplydoes, and both the filter and the room use it.the worker reads a note at its next stepwas two constants. It is now one (session.RunNotePickupWord). A law test finds exactly one literal and checks that the manual quotes it.--one-modeldid not reach a/taskrun's seats. The run engine seated the worker, planner, checker and probe from the profile's crew rows andCODEAF_CHECK_MODEL, which is how the tagged e2e billedclaude-fable-5.1. Now every seat rides the conversation's live model.odd name é'q.txtwas dropped without a word. It readgit status --porcelainwithout-z. Every reader of paths on the landing road now reads git's NUL form.__pycache__/*.pycin 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.plandb done.Validation contract
b/, quotes, accents, a newline). Only codeaf's own files are left out, judged on the real path.--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.How it was checked
TestLandKeepsEveryRealFilename(dev landed 2 of 6 names);TestTheWorkTabDrawsRealGitFilenames;TestTheNotePickupSentenceIsSpelledOnce(dev had 2 literals);TestUnderOneModelEveryRunSeatIsTheConversationsModel(dev seated the profile's four rows andvendor/env-check);TestLandLeavesOutUntrackedBuildCachesOnly.codeaf chat --one-model:/taskwroteodd name é'q.txt, editedx b/plandb.db, and imported a module, which made a__pycache__file.deepseek/deepseek-v4-flash, including the review-round checker. Total spend was $0.013.odd name é'q.txtandx b/plandb.db. The.pycstayed out.make pr-readyat box load 12–24.internal/run: five supervisor/worker timing tests;internal/session:TestPlandbCliWorkerOwnDone,TestAQueuedTaskThatSurvivedARestartStillHasItsBriefWrittenand five others.🤖 Generated with Claude Code