Skip to content

spec: 010 Task 10.4 — pagelint rule 7, and the eight sentences it found - #98

Open
iancooper wants to merge 1 commit into
masterfrom
docs/spec-010-phase-10-sentences
Open

spec: 010 Task 10.4 — pagelint rule 7, and the eight sentences it found#98
iancooper wants to merge 1 commit into
masterfrom
docs/spec-010-phase-10-sentences

Conversation

@iancooper

Copy link
Copy Markdown
Member

D6 did not survive Task 10.3, so the opening-sentence rule lands as pagelint.py rule 7 — the fallback the task itself prescribed — with CLAUDE.md's ledger and two new convention sections in the same commit, because AC5 of Spec 011 failed on exactly that parity gap.

Six labels, not four

The four the task named, plus DESCRIPTION MISMATCH and DESCRIPTION UNREADABLE, which check the front matter against the sentence it is supposed to be. The ledger's first draft had that parity as review only — the one thing this programme has learned not to write down. It is mechanical, so it is mechanised.

The ruling the task asked for: rendered, not source

source rendered
pages over the 200-character limit 11 4

Seven were over only by the length of URLs nobody reads. Shortening real prose to accommodate an href would have made those pages worse.

First run: 8 findings across 8 pages

Four SUMMARY TOO LONG (249, 226, 211, 205) and four SUMMARY NOT UNIQUE in two pairs — DispatchingARequest/AsyncDispatchARequest and BuildingAPipeline/BuildingAnAsyncPipeline, each an async page that had never been given its own opening line. Zero missing, zero colons.

Design §9.2 predicted "a double-figure number of failures" and it is eight. Recorded as a wrong figure rather than rounded up to meet it.

The instrument was wrong twice in one task, in opposite directions. A scratch script written before the rule reported 15 pages. Seven were the source/rendered difference. The other two were its own bug: it skipped any line starting with * as a list item, so on two scheduler pages it skipped a bold opening sentence and reported a heading-follower two paragraphs down. The corpus was fine and the ruler was bent.

Eight branches proved red before trusted green

The red-proof refined a lesson this programme already had. "Assert that your mutation landed" is not strong enough. The first three probes reported SILENT and all three were the probe's fault — each asserted only text != orig, which was true, while producing something the branch was never meant to reject. The assertion has to be that the mutation produced the input the branch rejects. Three real rules would otherwise have been recorded as broken.

One defect in the rule itself, caught only because the red-proof printed a baseline and the baseline was red: front_matter_description() returned a line number into the slot its caller reads as a reason, so a perfectly correct page reported DESCRIPTION UNREADABLE: 2 — the check reporting its own success as a failure.

Ledger parity by enumeration found the mirror of Spec 011's original defect. NO H1 was in the ledger and missing from the linter's own docstring — the same rule, the other way round, four sessions later. Enumerate both directions.

Two defects found in passing — recorded, left for Phase 11

  1. 29 internal .html links across 16 pages, invisible to linkcheck.py because they are not .md. Twelve targets; one, QualityOfServicePatterns.html, has no page at all — a dead link green in every CI run this repo has done. The conversion is not mechanical either: the file is CommandsCommandDispatcher**a**ndProcessor.md, so the obvious rewrite lands on WRONG CASE, the fault class linkcheck.py exists for, hidden behind an extension it does not check. Four were fixed here (they sat inside sentences being rewritten), with anchors repointed at headings that exist — #the-command-processor-pattern, not #command-processor, which never existed.
  2. BuildingAnAsyncPipeline.md has two H1s. NO H1 fires only on no H1 and rule 3b starts at ##. Nothing links to the second one's anchor, so demoting it is safe — but it then becomes a ## that must be unique and qualified, which is a heading pass, not a sentence fix.

Gates

linkcheck 144 files; pagelint 0 errors / 791 warnings / 142 pages; --check-shape 0; --check-redirects 0 at 77 entries; --changed origin/master 0 with everything staged. The using-directive debt did not move.

🤖 Generated with Claude Code

https://claude.ai/code/session_012tcdwxVb8NmKaX2S6fvyFg

D6 did not survive Task 10.3, so the rule lands as pagelint rule 7, with
CLAUDE.md's ledger and its two new convention sections in the same commit —
AC5 of spec 011 failed on exactly that parity gap.

Six labels, not the four the task named: the two extra check the description
front matter against the sentence it is meant to be. The ledger's first draft
had that parity as "review only", which is the one thing this programme has
learned not to write down.

The ruling the task asked for: the 200 characters are rendered, not source.
Eleven pages were over the limit as typed and four are over it as read — seven
were over only by the length of URLs nobody sees, and shortening real prose to
accommodate an href would have made those pages worse.

First run: 8 findings across 8 pages. Four too long, four not unique in two
pairs, each an async page that had never been given its own opening line.
Design §9.2 predicted double figures; it is eight, recorded as a wrong figure
rather than rounded up to meet it.

The instrument was wrong twice in one task and in opposite directions. A
scratch script written before the rule reported fifteen pages; seven were the
source/rendered difference and two were its own bug — it skipped any line
starting with * as a list item, so on two scheduler pages it skipped a bold
opening sentence and reported a heading-follower two paragraphs down.

Eight branches proved red before trusted green, and the red-proof refined a
lesson this programme already had. "Assert that your mutation landed" is not
strong enough: the first three probes reported SILENT and all three were the
probe's fault, each asserting only that the file had changed while producing
something the branch was never meant to reject. The assertion has to be that
the mutation produced the input the branch rejects.

One defect in the rule itself, caught only because the red-proof printed a
baseline first and the baseline was red: front_matter_description returned a
line number into the slot its caller reads as a reason, so a correct page
reported DESCRIPTION UNREADABLE: 2 — the check reporting its own success as a
failure.

Ledger parity by enumeration found the mirror of spec 011's original defect:
NO H1 was in the ledger and missing from the linter's own docstring. The same
rule, the other way round, four sessions later.

Two defects found in passing and left for Phase 11: 29 internal .html links
across 16 pages that linkcheck cannot see, one of them pointing at a page that
does not exist; and a second H1 in BuildingAnAsyncPipeline.md that no rule can
see. Four of the 29 were fixed here because they sat inside sentences this task
was rewriting, with their anchors repointed at headings that exist.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012tcdwxVb8NmKaX2S6fvyFg
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