Captured observations
The registered observation IDs, hashes, and review guarantees used when no public specification is sufficient.
Observed-behavior captures cited by clean-room derivation notes (CLEANROOM.md rule 3). Each capture has a stable ID and the SHA-256 of the raw capture. Scrubbed captures may live in-repo as test fixtures in a text-safe encoding; unscrubbed ones are retained privately and can be produced against their hash if a derivation is ever questioned.
Rows carry only the ID, hash, and an observable description. A storage path may be named elsewhere in-tree for a capture of public source, and only while all of these hold: the artifact lives in a tree this repository already materializes by pin, so naming its path discloses no location the build does not; the revision that tree is pinned at is an immutable identifier — a full commit hash, never a branch or a movable tag; the license is named and permits the use (a named but disqualifying license fails this, which is rule 1's business, not a formality this clause discharges); and the hash — never the path — remains the citation of record. For anything else, and for private recordings above all, the location is not written down. Two reasons, and the second survives even where the first does not: a citation must not disclose where a private capture is kept, and a path is not a stable identifier, so a claim resting on one can come to point at different bytes without saying so. The immutability condition is that second reason spelled out — a path plus a branch name is a moving target wearing a pin's clothes.
Captures this repository made itself, of behavior it is willing to publish, live in a
registered in-repository public-capture tree; every file in that tree is a capture. Neither
reason above applies: there is no private location to disclose, and the second is answered
rather than waived, because cleanroom-gate verifies that every file in the public-capture
tree — dotfiles and nested files included, which the first version of the check missed —
hashes to something a row carries. Edit the bytes and the gate rejects the change. That
check deliberately does not consult the
changed-path list, since docs/ is not a gated prefix and a change touching only a
capture would otherwise never be looked at.
The rows themselves get the mirror-image guarantee. Once a Derivation: marker cites a
row, the row is part of the reviewed surface: the gate folds cited row text into the
review subject and treats an edit to a cited row — even in a change touching no gated
path — as touching every gated file that cites it, so rewriting what a past review
vouched for re-opens that review instead of passing in silence. An uncited row carries
no such weight and stays free to add or amend.
An earlier version of this paragraph asserted that same guarantee before anything implemented it, and the reviewer who caught it was right to treat a rule amendment written in response to a review finding as the likeliest place for one. The rule is the same; what changed is that it is now true.
Whether a recording can be published is judged per capture, not assumed: anything carrying a real session's contents is not covered by this and takes the private path, where the hash is still the citation and the retention is ours to honor.
IDs are CAP-<nnn>, allocated in order and never reused: a Derivation: marker in
shipped code cites one, so a recycled ID would silently re-point an existing citation at
a different observation. cleanroom-gate resolves every cited ID against this table or
SPECS.md and fails the build on one that is in neither.
| ID | sha256 | What it observably shows |
|---|---|---|
CAP-001 | efb1138c4730af0cea8a0aa8e9a558c8c642227fa20ef529346c777cb4f2a043 | A public third-party VT fuzz harness. Its first input byte selects a parser code path and is not terminal input, and it drives a terminal built at 80×24 with 100 lines of scrollback. Both facts decide how the conformance corpus has to be replayed for its frames to describe the same terminal upstream tests. |
CAP-002 | 9cf4c0478be69f618838964da0d483fbb02dc45394c9ca9968e041c958c9adf4 | On Linux, a read of a pseudoterminal master after the last descriptor for its slave has closed fails with EIO rather than reporting end-of-file. A terminal treating that errno as an error reports every clean child exit as a failure. |
CAP-003 | f387911b368f608bbdbc332981ef7a70db99fffebb42affaa00174c33288b2c7 | The pinned Claude Code CLI (2.1.220), invoked in print mode with --input-format stream-json --output-format stream-json and no --verbose, refuses at flag validation before either format flag takes effect: stderr Error: When using --print, --output-format=stream-json requires --verbose, exit status 1. |
CAP-004 | bfe0f1ac5235cdb4f477cfb19f224129b27333b1ec09be1e8efbb1d31e2bcaf3 | A ZWJ emoji sequence — one UAX-29 extended grapheme cluster — occupies TWO cells in the pinned engine with grapheme-cluster mode reset (the default), yielding two style entries that both carry the SGR set before it, and ONE cell with that mode set, yielding one. So a consumer segmenting the delta's text by UAX-29 reads styles index-aligned only under the set mode. |
CAP-005 | 953f5e70c2eab37ec803fb7576ac6a05c20cc5f7f5389ce9595b5a794572b258 | In a transient systemd user unit with PrivateDevices=yes, /dev/ptmx, /dev/pts, and /dev/pts/ptmx all exist, but both posix_openpt(3) and open("/dev/ptmx") fail with ENOENT. The same probe in a control unit without PrivateDevices succeeds on both calls. |
CAP-001 takes the public-source clause: crates/gwk-pty/fixtures/PROVENANCE.md names
its repository, revision, license and path. What that clause requires is that the tree is
materialized by pin, and it is — pins.env fixes the repository at a full commit hash and
tools/pty-toolchain.sh checks it out — so naming a path inside it discloses no location
the build does not. It does not require that the artifact itself is read: nothing in
this build or its tests opens the harness file, and an earlier version of this note
claimed otherwise, justifying the row on the very ground the clause was amended to
abandon. The corpus beside it is read; the harness is not. The hash above stays the
citation of record either way, so "the harness says this" remains falsifiable against
bytes rather than against a location.
CAP-002 takes the own-observation clause: the capture is this repository's, one of the
registered in-repository public captures, and it carries the probe that produced it so the
observation can be re-run rather than believed. It is registered because the behavior has
no permitted spec to cite — POSIX gives read an EIO for a background process group
reading its controlling terminal, which is a different condition entirely, and citing it
would be a false citation dressed as a real one.
CAP-003 also takes the own-observation clause. CLAUDE-STREAM-JSON's cli-reference page
documents --verbose and --output-format as independent flags and states no dependency
between them; CLAUDE-HEADLESS pairs them only inside an example ("Use --output-format stream-json with --verbose to see...") without ever saying one requires the other.
Neither page states that --print plus --output-format stream-json is refused absent
--verbose, so citing either for that requirement would be the same false-citation-dressed-
as-real shape CAP-002's note names. The capture records only the refusal: a probe with
--verbose added was also run, and is deliberately not recorded here — it launched a real,
live session against this repository's own project configuration and its output carried
this operator's local session state, not stable, publishable protocol behavior. The negative
probe alone is what this row cites.
CAP-004 takes the own-observation clause for the same reason CAP-002 does, and the
mistake it corrects is worth publishing. An earlier version of the change that added it
cited TERM-UNICODE-CORE for the RESET-mode behavior. That document defines no reset-mode
segmentation rule; it says several times over that the unset state is undefined, and its
only sentence about joined sequences sits inside the mode-enabled requirement and runs
the other way. Citing it for what a terminal does with the mode off was exactly the false
citation dressed as a real one CAP-002's note names — an escalation from "the
specification declines to say" to "the specification says". The behavior is real, and this
row records it as measured, through the crate's own public API against the engine the build
pins, so the claim is falsifiable by re-running the probe rather than by reading a rule into
a document that refuses to state one. TERM-UNICODE-CORE keeps the citations it earns:
what the mode requires when set, and that the reset state is undefined — which argues for
pinning both sides better than the invented rule did.
CAP-005 takes the own-observation clause. The capture carries the exact probe and both
transient-unit invocations, and its output was regenerated when the row was registered.
It records the deployment behavior narrowly: device nodes being present did not make PTY
allocation usable under PrivateDevices=yes, while the otherwise-identical control was
clean. The row does not generalize that result to every systemd or kernel version.