Skip to content

The last test has no way to run — two decisions the legibility arc left open #226

Description

@bdelanghe

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):

  • Deterministicscripts/legibility/check.mjs + lexicon.txt. Runs in the hermetic phase, fails the build. Done, merged, unambiguous.
  • Judgedscripts/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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions