doctor: the preflight says what each seat may do to your files, before the room opens - #295
Merged
Conversation
…e the room opens `telltale doctor` gains a POSTURE block under the seats. One row per seat: the sandbox badge council would put on that column in a `telltale council --read` room, and the class of evidence behind it — enforced by construction, enforced by an operating system, asked for and never observed, measured not to restrict. One closing declaration names the default: the room WRITES, and 1 of the 5 seats can be asked to ask first. The room already said all of this, on the column badges and the help panel's posture page, and both are read inside the room — after the decision they inform. A user picks a workspace and a posture before the room opens, and the only surface that runs before the room opens said nothing about either. Nothing here is written in internal/doctor. council.DoctorSeats builds the block from postureClaim, the same function the room's own columns are built from, so the badge on a column and the badge in the preflight are one value read twice. A preflight with a posture table of its own would agree the day it was written and diverge the day a level moved. A posture is a claim measured once against a live run, not a check on this machine, so it renders outside the three-state block and moves nothing: no new probe, no network call, no login check, no exit-code change. It is wrong in both directions as a check — a FAILED would redden a working install over a vendor's design decision, and an ok would claim a containment property this mode never probed. TestAPostureIsNotACheck pins that the way TestDriftIsNotAFailedCheck pins the survey pin. TestThePreflightPostureIsTheRoomsOwnBadge pins the one-source property through different construction paths on each side. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…pointing up the page The `ro:requested` row borrowed the room's own legend wording, "weaker than the two above". That legend is ordered by level. These rows are ordered by seat, so "above" points at whatever vendor happens to sort first, and on a machine missing a seat it points at nothing. It names the comparison instead. Also unbreaks a test name that a doc comment had wrapped across two lines. 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.
telltale doctorgains a POSTURE block under the seats.Why the preflight owes this
The room already says all of it — the column badges, and the help panel's
posture page under each one. Both are read inside the room, which is after
the decision they inform. A user picks a workspace and a posture before the
room opens, and the one surface that runs before the room opens said nothing
about either. §9.17's frame settles that the fact belongs here: what a vendor's
own flags buy on this machine is true at launch and stays true.
One source, two surfaces
Nothing in the block is written in
internal/doctor.council.DoctorSeatsbuilds it from
postureClaim— the same function the room's own columns arebuilt from — and hands over the badge off
SandboxClaim.Badge()and an evidenceclass off the claim's
Level. A preflight with a per-vendor posture table of itsown would agree with the badges the day it was written and diverge the day a
level moved, and a reader looking at two disagreeing surfaces cannot tell which
one is lying.
TestThePreflightPostureIsTheRoomsOwnBadgemakes that assertion through adifferent construction path on each side —
DoctorSeatsagainst the columnsstateWithbuilds — because comparingdoctorPosturewithpostureClaimwouldbe comparing a call with itself.
The badge says what it IS; the evidence class says what it RESTS ON
unsandboxedis the case that proves they are two questions: two seats reachthat badge because a live run refuted the flags and because no flag was
ever passed, and a reader deciding whether to point council at a worktree needs
the second sentence. §4a.1's rule that two kinds of nothing must not render alike
is the same rule one level up.
evidenceClassis a table keyed by level, soTestEveryPostureLevelHasAnEvidenceClasswalks the type and fails the build the day a sixth level renders a badge with
nothing to classify it.
TestNoEvidenceClassSoftensItsBadgeholds the other halfon
TestThePostureLegendDoesNotSoftenAnyClaim's terms: these sentences classifyevidence and never weaken it, and none may call a posture read-only, safe or
unable to write.
The rows are the
--readroom, and the argv is on the blockThe room WRITES by default and
--readis the opt-out. The rows report the--readposture because that is the only one that is a fact about the machine— the default room's badge is a property of an argv the reader has not typed yet,
and five cells all reading
WRITEScarry nothing per seat. So the header namestelltale council --readin its first clause, and one closing declaration statesthe default. The gating half is counted off
canGate, never written down:that measurement has already moved once, when the Cursor seat became a live
process that can be asked and still does not ask about edits.
Non-gating, and pinned as such
No new probe, no network call, no login check, no exit-code change. A posture is
a claim measured once against a live run, not a check on this machine, so it
renders outside the three-state block beside the capability line and the survey
pin. It is wrong in both directions as a check: a
FAILEDwould redden a workinginstall over a vendor's own design decision, and an
okwould claim thispreflight established a containment property it never probed.
TestAPostureIsNotACheck— the same seat with and without the data, the threecounts required identical, no state word on any posture row. The method
TestDriftIsNotAFailedCheckuses.TestThePostureBlockCostsNoProbe— the probe count is unchanged by the block.no claim, not a missing row, andthe word is deliberately not shaped like
not checked.Gates
go vet ./...— clean.go test ./internal/doctor ./internal/council -timeout 20m— both green(council 54s on this Mac).
go test ./... -timeout 20m— green.internal/doctorrenders nogoldens, and this touches no council render path.
Measured on the reference Mac (Intel, 2026-08-17) — the block above is that run's
real output. The
codexrow is the platform branch working: the same block onWindows reads
unsandboxedthere, frompostureClaimrather than from a secondplatform test in the preflight.
Docs: a dated 2026-08-17 amendment to
docs/design.md§9.42.🤖 Generated with Claude Code