council: /retry sends the last brief again, to the seats that owe an answer - #292
Merged
Conversation
…answer A turn where four seats replied and one failed, or was cut with `x`, left the operator retyping the brief and the mentions to finish it. That is arithmetic at the keyboard on the one line where getting it wrong bills seats that already answered -- the complaint `-@` and `/unseat` were built for, one turn later. `/retry` puts the last dispatched brief back in the composer, addressed to the seats that did not answer it: `@codex @agy <brief>`, a draft the operator could have typed, in the grammar that already exists. The brief comes from the columns' own per-turn record and goes out unchanged. It arms; it does not dispatch. setDraft re-derives the route, and the footer prices it through the same State.SeatsIn intersection dispatch gates on, so the operator reads the bill before paying it and can edit the draft first. What counts as an answer is defined against the four endings. PhaseDone answered, including the seat whose body is the "0 text chunks streamed" placeholder -- that is a measured zero, not a missing reply. PhaseFailed and PhaseCancelled did not, and cancelled covers ctrl+c and the per-seat give-up together. A seat that sat the turn out is not a candidate at all, or a /retry after an @codex turn would widen the bill to seats nobody addressed. Bare-only, on /read and /write's rule: "/retry the failing test" is a brief, and a verb that took it as an argument would run a re-send and discard the sentence. Three refusals, three sentences -- a turn in flight (which keeps the draft), no brief on record, and every seat answered. The verb sits in roomVerbs, so §9.31's walked refusal teaches it with no second copy of the vocabulary; the notice still fits the reference width. `--brief` stays unfiled. This verb re-sends text and never reads Model.brief, so §9.17's re-briefing question is still open and still to be decided on its own. Tests: roomcmd_test.go covers the four endings, the measured zero, the three refusals, the bare-word rule and the walked-table appearance, plus a dispatch-level test (countSpawns stubs) that the re-send spawns one process per seat owing an answer and none for a seat that replied. The two slash-refusal goldens carry the new word. No test spawns a vendor. Verified offline on the Intel Mac: `go vet ./...` and the full `go test ./...` are green. No live room was driven; nothing here is a claim about vendor behaviour. Co-Authored-By: Claude Fable 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.
what a user can now do
A turn where four seats replied and one failed, or was cut with
x, left the operator retyping the brief and the mentions to finish it. That is arithmetic at the keyboard, on the one line where getting it wrong bills seats that already answered./retryputs the last dispatched brief back in the composer, addressed to the seats that did not answer it:It arms; it does not dispatch.
setDraftre-derives the route from the draft, and the footer prices it through the sameState.SeatsInintersection dispatch gates on (§9.21) — so the operator reads the bill before paying it, and can edit the draft first. It is an ordinary draft in the grammar that already exists, so nothing new is learned.what counts as an answer
Defined against §9.37's four endings, and narrower than "the column looks empty":
PhaseDoneanswered, including the seat whose body is[Turn completed with 0 text chunks streamed]. That is a measured zero, not a missing reply (§4a.1) — re-sending on it would overrule a vendor's honest empty answer and bill a seat that did the work.PhaseFailedandPhaseCancelleddid not. Cancelled coversctrl+cand the per-seat give-up together: a seat the operator cut is the case this verb exists for.dispatchnever callsstartTurnon it, so itsColumn.TurnNstill names the last turn it took. Without that,/retryafter an@codexturn would widen the bill to four seats nobody addressed.the rest of the rules
/readand/write's rule:/retry the failing testis a brief, and a verb that took it as an argument would run a re-send and discard the sentence.postureCommand); no brief on record (turn 0, and the degenerate turn whose brief sanitized to nothing, are one fact); every seat answered.roomVerbs, so §9.31's walked refusal teaches it for free. The notice still fits the reference width — bothslash-refusalgoldens are regenerated and read as expected.--briefstays unfiled. The verb re-sends text unchanged and never readsModel.brief, so §9.17's re-briefing question is still open and still to be decided on its own.Column.Promptholds the brief, never the/arenawrapper, and the composer shows exactly that before enter./adoptand/arena drop's precedent — the room-controls row is at its budget.verification
Offline, on an Intel Mac.
go vet ./...clean;go test ./internal/council -timeout 20mand the rest of the packages green, both before and after mergingorigin/main(PR #291's per-seat quota work).roomcmd_test.gopins the four endings producing the right seat list, the measured zero counting as an answer, the three refusals, the bare-word rule, the appearance in the walked refusal table, and — at the dispatch level withcountSpawns— that the re-send spawns one process per seat owing an answer and none for a seat that replied. No test spawns a vendor.No live run. Nothing here is a claim about vendor behaviour, and every process the verb can cause is an ordinary turn's spawn.
🤖 Generated with Claude Code