Skip to content

Describe eight examples chosen to break the contract - #213

Closed
abernier wants to merge 4 commits into
readme-explainerfrom
pilot-eight
Closed

Describe eight examples chosen to break the contract#213
abernier wants to merge 4 commits into
readme-explainerfrom
pilot-eight

Conversation

@abernier

@abernier abernier commented Aug 14, 2026

Copy link
Copy Markdown
Member

Closes #198. Last of the seven in #192's stack, and the only one that writes
prose rather than the machinery for it.

Eight examples described under the contract from #196, picked for what they
would break: a technique carried by a prop, one with no notable drei API, the
smallest source in the gallery, the largest, two that already had a line, and
two of the misses the baseline in #197 recorded. apis lands on all eight;
UNDESCRIBED goes 39 → 33 and OVERLONG 5 → 4, in the same commits.

15/20 → 19/20, of which +3 belong to these lines and +1 to aquarium, which
was written before the pilot. The provenance, the fifteen controls and the two
runs are in bin/eval/pilot-eight.md rather than in a delta quoted here.

faucets-select-highlight was left empty on purpose and is still missed, by the
same near neighbour as before. That is deliberate: a sample covering all five
baseline misses would have scored better and shown less.

Three things the sample broke, all of them findings rather than failures:

  • apis ⊆ imports has two more ways to be unsatisfiable than the spec named — a
    namespace import (new THREE.MeshPhysicalMaterial) and a default import
    renamed at the call site (import Controller from "ecctrl"). Both are prose
    cases, like the prop case already was.
  • "read the example whole" does not survive a vendored dependency:
    ssgi-spheres-with-rapier-physics is 515 kB, of which 506 kB is a checked-in
    build the example imports from.
  • Rewriting a line that already passes buys nothing. transparent-aesop-bottles
    was rewritten and then reverted to its author's sentence — the rewrite
    traded thickness: 500 for the render-order pinning, at three times the
    length, and moved no question. bubbles is the other half of that slot and
    stays rewritten: 147 characters is over the bound, which is not a matter of
    taste.

The decision this unblocks is in
the issue:
neither "fill the 40" nor "rewrite the 170", but the ~81 that fail a test
written down in advance — empty, over the bound, carrying an identifier or a
URL, or under 40 characters — leaving the 89 that pass untouched.

🤖 Generated with Claude Code

https://claude.ai/code/session_01YQmbpRu6oCNrLiUQvhz5x6

abernier and others added 3 commits August 14, 2026 15:49
The pilot #192 asked for before deciding how much of the gallery to
rewrite: eight examples picked for what they would break, not for being
easy to write. Six were empty, two already had a line.

  pass-through-portals   the technique is a prop -- `localClippingEnabled`
                         on the renderer, `clippingPlanes` on the material,
                         `THREE.Plane` through the namespace import. None of
                         it is listable, so the prose carries it alone.
  water-shader           no notable drei API: the ocean is three-stdlib's,
                         registered as a JSX element by `extend`.
  react-ellipsecurve     the smallest source in the sample, 2.5 kB.
  ssgi-spheres-...       the largest, 515 kB, most of it a vendored copy of
                         a postprocessing library the example imports from.
  transparent-aesop-...  described already, and thinly -- 47 characters that
                         named the material and missed the render-order
                         pinning that keeps the backdrop behind the glass.
  bubbles                described already, and 147 characters of it, spent
                         listing five effects that its tags already carry.
  glass-flower           empty, and one of the five the eval baseline missed.
  ecctrl-fisheye         empty, and the miss the baseline could not even
                         answer with a name.

Two of them found a shape the spec had not: an identifier reached through
a namespace import (`new THREE.MeshPhysicalMaterial`) cannot go in `apis`
any more than a prop can, and a default import renamed at the call site
(`import Controller from "ecctrl"`) would only put a meaningless local
name there. Both are prose cases, which is one more than #192 expected.

UNDESCRIBED loses six, 39 to 33. OVERLONG loses `bubbles`, five to four.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YQmbpRu6oCNrLiUQvhz5x6
One of the two "already described" slots the pilot was asked to fill, and
the answer it came back with is no.

The line it replaced -- "PBR transmission and thickness to emulate glas."
-- names the technique in 47 characters and is the demo author's own. The
rewrite named the render-order pinning instead and dropped the thickness,
which is as load-bearing here as the transmission is: one true detail
traded for another, for a line three times longer. The eval agrees, in the
only way it can: no question moved on it. The glass questions were already
answered by `diamond-refraction` and by `aquarium`.

So the typo is fixed and the sentence is the author's again. `apis` stays,
because it adds a field rather than overwriting one -- which is the whole
difference between the two halves of this work.

The other slot, `bubbles`, is not touched: 147 characters is over the
bound, and the rewrite there is what the ratchet requires, not a matter of
taste.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YQmbpRu6oCNrLiUQvhz5x6
19/20, and the four questions that flipped do not all belong to the eight
lines: `aquarium` was written before the pilot and takes one of them, which
`baseline.md` half-predicted by recording an aborted pass that answered it
correctly on the old index. The file says so rather than quoting the
delta -- a number whose provenance is not written down is a number nobody
can check later.

The miss left in place is the part worth keeping. Four of the baseline's
five misses were taken and `faucets-select-highlight` was not; it is still
missed, by the same near neighbour, which is what separates an index that
got better from a sample drawn from its own answers.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YQmbpRu6oCNrLiUQvhz5x6
@abernier abernier changed the title pilot eight Describe eight examples chosen to break the contract Aug 14, 2026
Three of the seven changes in this stack are tools with an end: the skill,
the eval harness and the runs it recorded. They exist to get 170 examples
described and explained, and a tool that outlives its job becomes a
document that rots while claiming to be one. Each now says so in its own
header, where you cannot open it without reading its expiry -- the pattern
`description-exceptions.mjs` already set with "the schema tightens when
this file is empty".

What survives is what runs on its own and fails loudly: `apis ⊆ imports`,
the description bound, the backticked-identifier check. Plus
`questions.json`, because twenty hand-written answers are the expensive
half of an eval and the only half a future run would need.

That leaves the contract homeless, since it lived in the skill. It moves to
`schemas/pmndrs.schema.json`, onto the two fields it governs -- which is
where the author of a new example meets it, in an editor tooltip, years
after this stack is forgotten. The skill keeps the long form and the
worked example; the schema keeps the rule.

These land on the top branch rather than on the branches that introduced
each file: the alternative is restacking five PRs to place four comments.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YQmbpRu6oCNrLiUQvhz5x6
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.

Rewrite eight descriptions chosen to break the contract

1 participant