You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Filed as a decision record before the session that generated it is archived. This is not a work item. Both items below are decisions, and "decided: never" is a valid close on either. Nothing here proposes new instrumentation — the ceremony budget for legibility is spent, and #225 is the last build.
Context
The legibility gate landed in two halves (#219, #217):
Deterministic — scripts/legibility/check.mjs + lexicon.txt. Runs in the hermetic phase, fails the build. Done, merged, unambiguous.
Judged — scripts/legibility/coldread.feature. Five questions a stranger should be able to answer from the homepage alone. The cold-read judge: one API call, not an agent #225 builds the machine judge as a local tool only.
Neither half tests the thing the feature file actually says matters. Its own header states that one outside human outranks any green judge run. That test has never been run, and there is currently no mechanism by which it ever would be.
Decision 1 — does an API credential belong in the deploy path?
#225 ships npm run coldread and deliberately stops there. It does not wire into scripts/pipeline.mjs, add a workflow, or add a secret, because that decision is the maintainer's and was never made.
The options, without a recommendation attached:
what it costs
what it buys
Stay local
the judge runs only when someone remembers
no credential in CI, no new secret to rotate, no network dependency in a build that is otherwise a pure function of the source
Report-only in CI
a secret in the deploy path; a non-hermetic step in a pipeline whose phases are defined by hermeticity
the judge runs on every deploy and its verdict is visible without anyone remembering
Blocking gate
the above, plus a flaky proxy in the inner loop
nothing that survives scrutiny — see below
The third is already ruled out by the pipeline's own comment: "a flaky proxy in the inner loop rots trust in the gate around it." It is listed only so the ruling-out is on the record rather than implicit.
The real tension is that scripts/pipeline.mjs sorts steps by whether their output is a pure function of the committed source. A model call is not, under any phase. A stamped step is impure in a bounded way — a date, a commit SHA. A judge run is impure in an unbounded way: same input, different verdict. Putting one in the pipeline weakens what the phase labels mean, and those labels are load-bearing.
Decision 2 — who reads the page cold, and when?
The unautomatable test, in full:
One person who has not seen the site. Ninety seconds. The five questions in coldread.feature.
There is no tooling to build here and no issue to keep open forever. What is missing is a commitment about when it happens — before a copy change ships, once a quarter, never again. Any of those is a decision. Drift is not.
Why the machine judge does not substitute for it
Recorded here because it will be tempting to treat a green npm run coldread as this test having happened. The judge model is Opus, chosen deliberately, which makes it a ceiling test rather than a typical-reader test:
A red run is strong evidence. If the strongest available reader cannot restate the bet from the page, no reader can.
A green run is weak evidence. It says the ceiling cleared it. It says almost nothing about a stranger skimming on a phone, which is the actual reader the page is for.
There is also a contamination trap worth keeping visible, verified during this arc: a claude -p invocation from this checkout inherits CLAUDE.md and .claude/inject-org-context.sh, which inject the org's naming vocabulary — Hotel, floor, suite, room, door, guest — into the model's context. A judge asked "restate the bet from this page alone" would answer partly from injected context. That is why #225 specifies one POST /v1/messages and forbids shelling out to the agent harness: the request body is the only context, which is the entire point of the instrument.
The same trap has a weaker form for whoever writes cold-read material by hand. The five questions survived it only because they were written by the maintainer outside the injected context, not composed by a session running inside it.
Related
#225 (the judge, local tool) · #217 (the projection the gate reads, closed) · #219 (the homepage rewrite that motivated it) · docs/agentic-code-hygiene.md rule 3 — a gate's own claim about itself is not evidence.
Filed as a decision record before the session that generated it is archived. This is not a work item. Both items below are decisions, and "decided: never" is a valid close on either. Nothing here proposes new instrumentation — the ceremony budget for legibility is spent, and #225 is the last build.
Context
The legibility gate landed in two halves (#219, #217):
scripts/legibility/check.mjs+lexicon.txt. Runs in thehermeticphase, fails the build. Done, merged, unambiguous.scripts/legibility/coldread.feature. Five questions a stranger should be able to answer from the homepage alone. The cold-read judge: one API call, not an agent #225 builds the machine judge as a local tool only.Neither half tests the thing the feature file actually says matters. Its own header states that one outside human outranks any green judge run. That test has never been run, and there is currently no mechanism by which it ever would be.
Decision 1 — does an API credential belong in the deploy path?
#225 ships
npm run coldreadand deliberately stops there. It does not wire intoscripts/pipeline.mjs, add a workflow, or add a secret, because that decision is the maintainer's and was never made.The options, without a recommendation attached:
The third is already ruled out by the pipeline's own comment: "a flaky proxy in the inner loop rots trust in the gate around it." It is listed only so the ruling-out is on the record rather than implicit.
The real tension is that
scripts/pipeline.mjssorts steps by whether their output is a pure function of the committed source. A model call is not, under any phase. Astampedstep is impure in a bounded way — a date, a commit SHA. A judge run is impure in an unbounded way: same input, different verdict. Putting one in the pipeline weakens what the phase labels mean, and those labels are load-bearing.Decision 2 — who reads the page cold, and when?
The unautomatable test, in full:
There is no tooling to build here and no issue to keep open forever. What is missing is a commitment about when it happens — before a copy change ships, once a quarter, never again. Any of those is a decision. Drift is not.
Why the machine judge does not substitute for it
Recorded here because it will be tempting to treat a green
npm run coldreadas this test having happened. The judge model is Opus, chosen deliberately, which makes it a ceiling test rather than a typical-reader test:There is also a contamination trap worth keeping visible, verified during this arc: a
claude -pinvocation from this checkout inheritsCLAUDE.mdand.claude/inject-org-context.sh, which inject the org's naming vocabulary — Hotel, floor, suite, room, door, guest — into the model's context. A judge asked "restate the bet from this page alone" would answer partly from injected context. That is why #225 specifies onePOST /v1/messagesand forbids shelling out to the agent harness: the request body is the only context, which is the entire point of the instrument.The same trap has a weaker form for whoever writes cold-read material by hand. The five questions survived it only because they were written by the maintainer outside the injected context, not composed by a session running inside it.
Related
#225 (the judge, local tool) · #217 (the projection the gate reads, closed) · #219 (the homepage rewrite that motivated it) ·
docs/agentic-code-hygiene.mdrule 3 — a gate's own claim about itself is not evidence.