Skip to content

council: T reads a turn for what the seats did, and says how far back it can - #297

Merged
sanlee-ys merged 1 commit into
mainfrom
council/act-ledger
Aug 17, 2026
Merged

council: T reads a turn for what the seats did, and says how far back it can#297
sanlee-ys merged 1 commit into
mainfrom
council/act-ledger

Conversation

@sanlee-ys

Copy link
Copy Markdown
Owner

The turn page (§9.22) answers what the seats said about turn 10. The other half of a turn is what they ran, and the room has been parsing, redacting and keeping every tool call since §9.6a — it just draws them in a 37-cell column, where the outcome is one glyph. So "did anything fail in turn 10, and where" cost a scroll per seat.

T opens the same turn's acts at the full frame.

  acts in turn 3  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━  → everyone  5 acts
    the room keeps the last 50 turns per seat — an act from an older turn is gone.

  › what does resume cost by turn five?

  Claude Code  ────────────────────────────────────  ✓ done  41s  $0.0123
  ⚙ Bash: go test ./internal/council ✓ ok
  ⚙ Write: internal/council/ledger.go ✗ failed
      permission denied
  ⚙ Bash: git commit -m the room writes down what it did ✗ denied by you

  Codex  ──────────────────────────────────────────────────  ✓ done  9s
  ⚙ Read: docs/design.md ? outcome unknown
  ⚙ Bash: go vet ./... — no outcome reported

  Antigravity  ────────────────────────────────────────────  ✓ done  6s
  (no acts recorded)

What it is

  • A second FACE of the projection, not a third projection. TurnView keeps deciding which turn is on screen; TurnView.Ledger decides which of that turn's two records is drawn. [, ], g and G move the same coordinate, and the scroll window, the overflow markers and the clamp are the same code pointed at a different list.
  • The key is T. Shift on the key whose subject it shares — t gives one turn the whole room, T gives that turn's acts the whole room. It flips rather than navigates (toggleArenaDiff's shape), so a reader on turn 7 stays on turn 7. t still means the reading face from anywhere. In compose it is the letter T, on q/f/c/t's contract. That a shifted letter arrives as "T" and not "shift+t" was read off the pinned ultraviolet source, not assumed.
  • The help panel gained no row. f / t / T merged onto the row that already teaches both, which is how t itself landed there. The row sits at its 114-cell budget exactly.

The honesty this surface could get wrong for free

  • No reported outcome never renders as success. ? outcome unknown is its own word, because a vendor that says a step ENDED has not said it worked (antigravity's DONE).
  • An unresolved call splits on whether the seat is still working, not on turnEntry.Live — the newest turn stays the column's current one long after every seat lands, so Live alone would report a dead call as running for the rest of the session. running while waiting or streaming; no outcome reported once that seat has landed.
  • (no acts recorded), never "did nothing." A trace is a reading of what a vendor chose to report.
  • The header states the retention window from maxHistory itself. the room keeps the last 50 turns per seat — an unqualified "the acts" would be a record with a silent floor under it. It is a line under the rule rather than meta on it, because labelRuleIn sheds its meta whole at narrow widths and that sentence must not be the first thing to go.
  • A seat that sat the turn out is absent (§9.15), on screen and in the paste.

y / Y

Both keys already take the page's own document; YankPage is what keeps that true now there are two. The ledger document is built from the same turnEntries call the screen renders from, so there is no second sanitizer — every string already passed the one redact-and-sanitize choke point on the way onto State. It carries the retention sentence too: in a file pasted into an issue a week later, that line is the only thing saying the record was ever bounded.

Out of scope, deliberately

No per-seat focus on the page (§9.22's declined ruling stands), no change to what turnEntries collects, no note cards on the ledger (the seat's own rule already carries how its turn ended), no STATE.md.

Gates

go vet ./..., go test ./internal/council -timeout 20m, and the rest of the suite: green. Two new goldens (act-ledger, act-ledger-ascii); help.txt moved by exactly one line, the taught key — read before accepting. No test spawns a vendor. Nothing here is a claim about vendor behaviour, so no live run is owed: the acts it draws are the ones §9.6a already measured, at a width that can afford to name them.

🤖 Generated with Claude Code

… it can

The turn page answers what the seats SAID about turn 10. The other half of a
turn is what they ran — the tool calls, the commands, the edits, the one that
was refused at the gate — and the room has been parsing and keeping every one of
those since §9.6a. What it draws them in is a 37-cell column, where the outcome
is a single mark. So "did anything fail in turn 10, and where" cost a scroll per
seat and four glyph shapes to read.

T opens the same turn's acts at the full frame: one list, in seating order, with
the outcome in WORDS beside each call — ok, failed with the vendor's own first
line under it, outcome unknown, denied by you — and the mark it already had as
the second signal, so --ascii and NO_COLOR lose nothing. An act with no reported
outcome never reads as one that worked, which is what runner.ActStatus exists
for; an unresolved call says "running" only while its seat is still waiting or
streaming, and "no outcome reported" once that seat has landed. A seat that
recorded nothing says so, rather than that it did nothing — a trace is a reading
of what a vendor chose to report.

The header states the retention window from maxHistory itself: the room keeps
the last 50 turns per seat, so an unqualified "the acts" would be a record with
a silent floor under it. y and Y take the ledger while it is open, through the
same turnEntries call the screen renders from and the sanitize choke point every
string on State already passed — one document, no second cleaning step.

It is a second FACE of the projection §9.22 built rather than a third one:
[ ] g G move the same coordinate, the scroll window and the overflow markers are
the same code, and t still means the reading face from anywhere. The mode word
says ACTS 10/11 against TURN 10/11. The help panel gained no row — T merged onto
the one that already teaches f and t, which is how t itself landed there.

Verified offline: go vet, the council suite, two new goldens and their --ascii
twin assertions. No test here spawns a vendor, and nothing in it is a claim
about vendor behaviour — the acts it draws are the ones §9.6a already measured.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@sanlee-ys
sanlee-ys merged commit d024f03 into main Aug 17, 2026
5 of 6 checks passed
@sanlee-ys
sanlee-ys deleted the council/act-ledger branch August 17, 2026 18:50
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