Skip to content

Docs: two contradictions a literal reader hits — editorial's theme list, and the on-fill text token - #61

Open
richm-spp wants to merge 14 commits into
Nutlope:mainfrom
richm-spp:fix/doc-contradictions
Open

Docs: two contradictions a literal reader hits — editorial's theme list, and the on-fill text token#61
richm-spp wants to merge 14 commits into
Nutlope:mainfrom
richm-spp:fix/doc-contradictions

Conversation

@richm-spp

Copy link
Copy Markdown

Stacked on #59#60 — review the last 2 commits until those merge.

Both found by an acceptance test that follows SKILL.md literally, step by step, and records every place the instructions are ambiguous or contradictory.

1. genres/editorial.md omits Grid. SKILL.md's routing says editorial "walks the remaining thirteen" and names Grid; the genre file lists twelve and doesn't. Grid landed in #57 and joined the rotation everywhere except the genre file's own list — same drift family as the gate-57 allowlist fix in #59. One line.

2. The invisible-button contradiction. interaction-and-states.md defines --color-accent-ink as the text colour on an accent fill, "verified ≥ APCA Lc 60 against the accent". Every theme token block in site/css/tokens.css defines it the other way — the accent used as text on paper, near-identical to the accent itself:

/* Almanac */
--color-accent:     oklch(38%  0.135 250);
--color-accent-ink: oklch(40%  0.13  250);   /* ~1:1 against the accent */

Code following the documented button rule (background: var(--color-accent); color: var(--color-accent-ink)) ships invisible labels on every theme. Seventeen token blocks vs two sentences: the docs bend. The rewrite names the two tokens' actual meanings and directs the on-fill case to a distinct --color-on-accent, computed and lifted into the build's token block when a build fills a surface with the accent (the themes don't currently ship one).

A follow-up issue lists the remaining smaller contradictions the same acceptance test surfaced, if that's useful.

richm-spp and others added 14 commits August 11, 2026 23:51
The skill's runtime behaviour is 'read the index, load only the picks', so a
link that doesn't resolve is a failed file read mid-build. Nothing in the repo
checked this.

Reports 31 broken instances / 28 unique file->target pairs on the current tree,
all in docs/ and site/_tests/. The runtime graph inside skills/ is clean at
274/274, which --runtime asserts separately.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Derives the theme list and the gate list from the artifacts, then asserts the
prose agrees. Catches the class of drift that produced the gate 57 defect: grid
was added by PR Nutlope#57 and the gate enumerating the catalog was never updated, so
the gate silently stopped covering the case it exists for.

Finds 3 real disagreements on the current tree: README claims 57 gates twice
(the artifact has 58 - 1-57 plus sub-gate 38a), and gate 57's allowlist omits
grid.

Each assertion was falsified before being trusted: version drift, a 22nd theme
landing, and a gate deleted without renumbering all turn it red. An allowlist is
detected as a comma-separated run of 5+ theme names, so the example mentions in
gates 38a and 55 ('Studio / Garden / Sport') no longer false-positive.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Twelve of the 58 gates are pure pattern-matching over emitted CSS/HTML. This
runs them for real: a small dependency-free CSS parser (rules carry their
at-rule context, so a declaration inside @media (prefers-reduced-motion) is
distinguishable from one outside — several gates hinge on exactly that),
one-level var() resolution, and inline <style> extraction.

Hard tier fails the run; advisory tier (needs-judgment gates: prose measure,
off-scale spacing, token bypass, 1fr-with-image) reports without failing, and
--strict promotes it.

Against the 30 committed examples: 61 hard failures, 246 advisories across 18
pages — while the pages' own CSS stamps declare 'gates: all-pass'. The findings
are the gates' own letter: <em> inside h1/h2 (banned by discipline 6),
body { overflow-x: hidden } (gate 34 mandates clip), uppercase display at
line-height 0.82-0.92 (gate 55 floor is 1.0), paper tokens at chroma 0.003
(gate 22 minimum is 0.005). Self-scoring said pass; the machine disagrees.

Checker was falsified against its own false positives before being trusted:
black box-shadows are compositing not palette (gate 22 now skips shadow/mask
props and alpha'd values), display headlines are not prose (gate 25 excludes
heading selectors and is advisory), .masthead-meta is not in gate 38a's
enumeration (selector tightened to the gate's own list).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
links and counts gate hard (they will go green in the fix commits that follow).
gates runs as a regression baseline: the historical examples carry 61 known
hard failures, so the job fails only if that number grows. Ratchet the baseline
down as examples are fixed; never up.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Every relative link in docs/ was broken (wrong depth prefix), the verbs
fixtures were one level short of the repo root, two links also pointed at
study-examples.md in a directory it never lived in, and one link targeted the
never-committed refine verb fixture (unlinked; the prose contrast stands).

The runtime graph in skills/ needed nothing - it was already 274/274.
links.mjs: 31 broken -> 0.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Grid landed via PR Nutlope#57 and neither the README's gate count nor gate 57's own
catalog enumeration was updated - so the gate written to catch studied-DNA
drift could not fire for the newest theme, and the README undercounted by one
(1-57 plus sub-gate 38a).

Both now guarded by tools/verify/counts.mjs, which derives the real numbers
from the artifacts.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The minimal wordmark nav was addressed as both N1 and N1a across seven files
('N1 (N1a)' in the cookbook index), while the load rule maps a code to
components/<code>-<slug>.md - so the N1a spelling pointed at a file that does
not exist (n1a-*.md). Prose now converges on N1, matching
n1-wordmark-2-links.md on disk; N1b keeps its own file and code.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
python3 -m http.server is not available on a standard Windows install, and
Windows users are half the audience of a Claude Code / Cursor skill. npx serve
works wherever node does - which the skill already requires.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Found by the end-to-end brand build: the emitted page concatenates the brand
file including its [data-paper=dark] block, which a browser correctly ignores
on a light page - but gates.mjs built its custom-prop map last-write-wins
across ALL rules, so B1 read the dark values on a light page and failed a page
that renders correctly.

Rules now contribute custom props only when their selectors can match the
document (attribute selectors require the attribute in the HTML, class-scoped
selectors require the class). Verified three ways: the light page passes; the
same page with data-paper=dark flips to the dark values and correctly FAILS
(dark accent on a still-light newsprint paper - a real misconfiguration the
gate should catch); the 61-failure example baseline is unchanged.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
(cherry picked from commit 9b29a5f)
Eleven pages carried 61 hard slop-test violations while their stamps claimed
'gates: all-pass'. Fixed per each gate's own prescribed remedy, one page at a
time, each verified to 0 by tools/verify/gates.mjs:

- 38a (48x): heading/display italic removed. Where the italic was an <em>
  inside h1-h6, the tag became <span class="accent"> with the words
  byte-identical and the CSS selector following it, since gate 38a bans the
  markup itself, not just the computed style - emphasis now carried by accent
  colour/weight per discipline 6. Verified: rendered text content of every
  modified page is byte-identical to HEAD.
- 55 (8x, carnival): uppercase display line-heights raised from 0.82-0.92 into
  the 1.02-1.08 band, preserving the original tightness ordering.
- 34 (2x): body overflow-x hidden -> clip on html AND body.
- 22 (3x, grid-01): paper chroma nudged 0.003/0.004 -> 0.005/0.006, hue and
  lightness untouched.

Also adds tools/verify/worklist.mjs, the machine-readable per-page findings
emitter that drove the fix fan-out.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
(cherry picked from commit cb11c09)
The examples are clean; the baseline is now zero and the workflow comment says
it must never be raised.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
(cherry picked from commit 44f0c47)
A page that inlines its CSS contains its own selector text — e.g. the literal
string data-paper="dark" inside <style> — which counted as the document
carrying that attribute and activated conditional token blocks that don't
apply. Applicability now matches against the markup with <style> blocks
stripped.

(Extracted from a downstream commit; only the gates.mjs hunk is generic.)
Grid landed in PR Nutlope#57 and joined the editorial rotation everywhere except the
genre file's own list, so a literal reader can't rotate to it. Same drift
family as the gate-57 allowlist fix.
interaction-and-states.md defined --color-accent-ink as the text colour ON an
accent fill, verified against the accent. Every theme token block defines it
the other way: the accent used AS text on the paper, near-identical to the
accent itself (Almanac: accent oklch(38% 0.135 250), accent-ink
oklch(40% 0.13 250) - about 1:1 on a fill). Code following the documented
button rule ships invisible labels on every theme.

Seventeen token blocks vs two doc sentences: the docs bend. The on-fill case
now names a distinct --color-on-accent token, computed and lifted into the
build's token block when needed.
@vercel

vercel Bot commented Aug 12, 2026

Copy link
Copy Markdown

@richm-spp is attempting to deploy a commit to the Together AI Team on Vercel.

A member of the Team first needs to authorize it.

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.

1 participant