Skip to content

council: /retry sends the last brief again, to the seats that owe an answer - #292

Merged
sanlee-ys merged 2 commits into
mainfrom
council/retry-verb
Aug 17, 2026
Merged

council: /retry sends the last brief again, to the seats that owe an answer#292
sanlee-ys merged 2 commits into
mainfrom
council/retry-verb

Conversation

@sanlee-ys

Copy link
Copy Markdown
Owner

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.

/retry puts the last dispatched brief back in the composer, addressed to the seats that did not answer it:

› /retry
codex, agy did not answer turn 3 — enter re-sends that brief to them, and to no other seat

› @codex @agy the brief that half landed
                                                    → codex, agy  (2 seats) · enter dispatch

It arms; it does not dispatch. setDraft re-derives the route from the draft, and the footer prices it through the same State.SeatsIn intersection 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":

  • PhaseDone answered, 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.
  • PhaseFailed and PhaseCancelled did not. Cancelled covers ctrl+c and the per-seat give-up together: a seat the operator cut is the case this verb exists for.
  • A seat that sat the turn out is not a candidate at all. dispatch never calls startTurn on it, so its Column.TurnN still names the last turn it took. Without that, /retry after an @codex turn would widen the bill to four seats nobody addressed.

the rest of the rules

  • 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 (the phases are not settled, and the draft is kept, per postureCommand); no brief on record (turn 0, and the degenerate turn whose brief sanitized to nothing, are one fact); every seat answered.
  • No second copy of the vocabulary. The verb sits in roomVerbs, so §9.31's walked refusal teaches it for free. The notice still fits the reference width — both slash-refusal goldens are regenerated and read as expected.
  • --brief stays unfiled. The verb re-sends text unchanged and never reads Model.brief, so §9.17's re-briefing question is still open and still to be decided on its own.
  • After a race it re-sends the race's brief as an ordinary turn: Column.Prompt holds the brief, never the /arena wrapper, and the composer shows exactly that before enter.
  • The help panel does not name it, on /adopt and /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 20m and the rest of the packages green, both before and after merging origin/main (PR #291's per-seat quota work).

roomcmd_test.go pins 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 with countSpawns — 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

sanlee-ys and others added 2 commits August 17, 2026 12:37
…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>
@sanlee-ys
sanlee-ys merged commit 3cc9adb into main Aug 17, 2026
5 checks passed
@sanlee-ys
sanlee-ys deleted the council/retry-verb branch August 17, 2026 16:44
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