Repository navigation
[compass] Fix: seat_job can answer finished: true without the end of the command's output - #31
Merged
Conversation
ExecutionJobs.ReadAsync read the output page first and the job's status
second. A job whose last output was drained and whose Done was set between
the two was reported finished, with hasMoreOutput false, while the page
stopped short of its end. An agent that stops reading at finished: true lost
the tail of the log.
The status is now read first. A job is marked finished only after its
output is drained, so a page read after a finished status holds everything
to the end. A quick check ("execution job tail") finishes a real job while
a read is between the two, through an internal seam, and requires that a
finished reply has nothing left to read.
Reported in ANODE-BUGS.md as B-025.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
Owner
Author
|
Compass review: ready to merge (merged by compass-merge, 2026-10-10)
|
skulitom
added a commit
that referenced
this pull request
Oct 10, 2026
#31 and #32 - scripts/test-chrome-form.ps1: the window's process went into $chrome, which in PowerShell is the same variable as the -Chrome parameter, so the session check always failed and the final report named a process instead of chrome.exe. It is now $chromeProcess. - #31 (B-025) and #32 (B-023) merged before this candidate, so they ship in 0.11.2: the release notes list both, RELEASE-READINESS drops them from "Known and open", and the check count is 99. - The changelog, readiness record and release-notes anchor date 0.11.2 to 10 October, when its contents were fixed again. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
skulitom
added a commit
that referenced
this pull request
Oct 10, 2026
…e launch within days (#30) * [compass] Anode 0.11.2 release candidate - Version 0.11.2 in Anode.csproj, server.json, the MCPB manifest and the Claude Code plugin; CHANGELOG's Unreleased section becomes 0.11.2. - .github/RELEASE_NOTES.md: what's new in 0.11.2, known issues, upgrade. - docs/RELEASE-READINESS.md: a 0.11.2 section with what was checked without a seat, the owner's live check as exact commands (about 25 minutes), what stays covered only by stand-ins, and the known open bugs. - scripts/test-chrome-form.ps1: an opt-in live check for #28 and #29 on a local Chrome page (text field set_value read-back, <select> set_value failing instead of reporting success, the open list observed once). Package manifests, INSTALL.md's pinned example and the README's known issues change after the release, so main never points at a release that doesn't exist yet. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * [compass] 0.11.2 candidate: review fixes - test-chrome-form.ps1: count Find-Control's results through @(...), since Windows PowerShell 5.1 gives a single PSCustomObject no Count; start Chrome inside the try, and clean up every Chrome process it started. - RELEASE_NOTES: link the validation record on main, where the results are added after the release. - RELEASE-READINESS: say which PRs are in scope; stop if no File Explorer window appeared. - README: the 0.11.1 known issues now say 0.11.2 fixes them, which stays true inside the 0.11.2 package. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * docs: align pinned installer example with 0.11.2 * [compass] 0.11.2 candidate: fix test-chrome-form's Chrome variable; add #31 and #32 - scripts/test-chrome-form.ps1: the window's process went into $chrome, which in PowerShell is the same variable as the -Chrome parameter, so the session check always failed and the final report named a process instead of chrome.exe. It is now $chromeProcess. - #31 (B-025) and #32 (B-023) merged before this candidate, so they ship in 0.11.2: the release notes list both, RELEASE-READINESS drops them from "Known and open", and the check count is 99. - The changelog, readiness record and release-notes anchor date 0.11.2 to 10 October, when its contents were fixed again. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <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.
Report
From Compass's ANODE-BUGS.md inbox (not in this repo), entry B-025 (filed 2026-10-07 by compass-anode-fixer, from the second review of #25):
seat_jobcan answerfinished: truewithout the end of the command's output. An agent that stops reading atfinished: trueloses the tail of a build or test log, often its summary, with nothing in the reply to say so.Root cause
ExecutionJobs.ReadAsyncread the output page (job.Output.Read) first, and the job'sstate,finishedandexitCodeunder the job's gate second. A job's supervisor setsDoneonly after both output streams are drained. When the last output arrived andDonewas set between those two reads, the reply saidfinished: trueandhasMoreOutput: false, but its page stopped short of the end. It needs a reply's wait to run out, or a no-wait read to arrive, in that gap, so it is rare.Fix
ReadAsyncnow takes the status (state, finished, worker, exit code, error, elapsed time) under the gate before it reads the output page. Since a job is marked finished only after its output is drained, a page read after a finished status holds everything to the end. The reply's fields and their order are unchanged.An internal seam,
ExecutionJobs.BetweenStatusAndOutput, runs between the two reads; only the quick check sets it.Unchanged: if a job's output streams are still open 3 s after its worker exits and the job object ended its descendants (something outside the job holding them), the supervisor stops waiting and the job ends
failedwith a timeout error, as before; output that arrives after that can still follow a finished reply.docs/DEVELOPMENT-TESTING.mdnow says that afinished: truereply holds the output to its end, withhasMoreOutputmeaning only thatmaxCharscut the page. One CHANGELOG entry.How it was tested
execution job tail: a real Windows PowerShell job writeshead, waits 200 ms and writestail. The check reads it once, and the seam lets the job finish, output and all, while that read is between the status and the output. It then requires: the two pages together areheadtail; and a reply that saysfinished: truehashasMoreOutput: falseand nothing after its cursor.a reply said finished: true without the end of the output: it had '', and 'headtail' followed. The file was restored byte for byte afterwards.dotnet build -c Debugandselftest --quick: 98/98.scripts\build.ps1 -QuickTest -OutputDirectory artifacts\pkg-build: 98/98, and documentation links, anchors and tool names consistent.anode-controlpipe was not touched.bin/codex-review.sh,sandbox: read-only) onc13ff48: "No actionable regressions were identified. The status-before-output ordering addresses the completion race, and the added regression check exercises that interleaving."Needs a manual check in a seat
Nothing specific: the change is in the seat host's job bookkeeping, and the check runs it with real processes. Whoever next runs
test-development.ps1in a seat coversseat_exec/seat_jobend to end.Merge note
It merges cleanly with main and with #30 (the 0.11.2 candidate). If #30 merges first, git puts this CHANGELOG entry at the top of the
0.11.2section, which ships without this fix: move it under a new## Unreleasedheading above## 0.11.2when merging main in.🤖 Generated with Claude Code