Skip to content

#1296 Hold the lede to a fixed budget and say what to cut first - #1298

Closed
williamthorsen wants to merge 4 commits into
mainfrom
1296
Closed

#1296 Hold the lede to a fixed budget and say what to cut first#1298
williamthorsen wants to merge 4 commits into
mainfrom
1296

Conversation

@williamthorsen

@williamthorsen williamthorsen commented Aug 12, 2026

Copy link
Copy Markdown
Owner

What

Sets an explicit sentence budget to improve the quality of ledes: lede-voice.md now caps a lede at one to three sentences, and directs how to summarize when that length would be exceeded. Mere factual accuracy no longer justifies inclusion. voice-checklist.md is revised to select highlights rather than listing every important fact, and that guidance reaches summarize-change, merge-pr, and commit.

Why

Nothing in the guidance said the budget was fixed or what to cut once it bound, so the length of a lede tracked the size of the diff: a large change got an entry reciting each mechanism it touched, with what the change amounted to buried inside it. The audit could not catch that, because its test passed on any lede whose first fact was correctly chosen, catalog or not.

Details

🐛 Bug fixes

  • Punch the highlights states the budget as fixed against the size of the change ("a diff touching nine files gets what a one-line fix gets"), forbids the per-item keep question by name, and replaces it with the allocation question. The assurance that a cut fact survives in ## Details and the diff is what makes that question askable: without it, cutting reads as losing and every keep finds a justification.
  • A new Generalize the list, not the change bullet carries the cut rule in two steps -- the upshot in place of the over-budget list, never a category of its parts, then the fact the upshot does not predict. "Unpredictability, not size, is the test: an inferable clause is cut first, however small." The readyup regroup works both steps: six dispersed modules become "one level below src/", and the spare sentence goes to a new lint rule banning utils/ directories rather than to the import churn every regroup entails. The rule is floored against "Cut detail, not meaning" -- an upshot the reader cannot restate the change from has been abstracted past its job.
  • Mechanism is substance is qualified rather than reversed: mechanism is the budget's first cut, except where the operation is itself what the change amounts to, as in a refactor or an internal restructuring. That carve-out keeps the qualification from licensing a mechanism-free refactor lede.
  • ## Form scopes the budget per concern and closes the paragraph allowances as a growth path: a second concern's paragraph is held to the same budget, a facet of the main change does not qualify as a second concern, and only a second concern or migration info earns a further paragraph, never size.
  • _partials/voice-checklist.md's Highlights item tests the per-concern budget, whether anything was deferred, and whether each detail is unpredictable from the opening. Editing the partial reaches summarize-change, merge-pr, and commit byte-identically at install time, so no consumer skill is edited.

Closes #1296

The lede's budget is now fixed at one to three sentences regardless of how large the change is, and `lede-voice.md` says what gives way when it binds: a list that no longer fits is replaced by what the change amounts to, and what remains goes to the fact that summary does not imply.

Mechanism is the first detail the budget cuts, except where the operation is itself what the change amounts to, as in a `refactor`.
The `Highlights` item in the voice checklist now tests whether the draft allocated its budget -- what the lede spent its sentences on and what it deferred to `## Details` -- rather than whether its first fact was the right one, which a catalog passes. A detail earns its place by being one the opening does not already imply, not by being large.
Changes the kept-detail test in `lede-voice.md` and `voice-checklist.md` from implication to noteworthiness: the detail worth a spare sentence is one a reader given the upshot could not have predicted, so an unimplied but ordinary fact no longer qualifies. The cut rule's worked example is now the `readyup` regroup, whose spare sentence went to a new lint rule rather than to the import churn every regroup entails, in place of a grocery analogy whose implied and unimplied items could each be read the other way.

The surrounding additions are tightened: `Mechanism is substance` states its exception as the fact the lede keeps instead of an undefined "surviving fact" and cross-references the budget, `Punch the highlights` folds the nothing-is-lost assurance into the allocation question, and the checklist's Highlights item requires a deferral only from a change that outgrew the budget, so a small draft with nothing to defer passes.
Reconciles the fixed budget with `## Form`'s paragraph allowances in `lede-voice.md`: a lede is one to three sentences per concern, a second concern's paragraph is held to the same budget, a facet of the main change does not qualify as one, and only a second concern or migration info earns a further paragraph, never size. The checklist's Highlights item carries the same per-concern bound, so a compliant two-concern draft passes audit.

Separately, the cut rule's handle is renamed from "Noteworthiness, not size, is the test" to "Unpredictability, not size, is the test", so the handle read alone names the prediction operation instead of re-asking the importance question the budget forbids.
@github-actions

Copy link
Copy Markdown

Dependency audit

Production dependency audit passed.

@williamthorsen williamthorsen self-assigned this Aug 12, 2026
@williamthorsen

Copy link
Copy Markdown
Owner Author

Shelved unmerged. Superseded by #1299.

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

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Ledes grow with the size of the change instead of holding a fixed budget

1 participant