docs(playbook): name the recurring failure — a set-wide claim from a partial check

Three instances in one round (btn-block universality, sweep behavior-preservation,
the mxgw Bootstrap exemption), all the same shape, all caught by the asserter
re-checking rather than by challenge. Fix is a cheap per-member check that runs,
or an honestly-scoped claim when it hasn't.
This commit is contained in:
Joseph Doherty
2026-08-11 04:15:10 -04:00
parent 3777e50564
commit dc6410dfad
+25
View File
@@ -246,6 +246,13 @@ foundation branch merges — all branches build independently and compose at mer
also carry app-specific *shape* declarations that predate the sweep and that the kit does not
ship; mxgw's carried `border-radius: 5px; font-weight: 500; white-space: nowrap`, and a wholesale
delete would have silently dropped all three. Diff your block against the kit's before removing
**And check whether your app has one at all** — "every app carries this block" was asserted after
checking the apps that were convenient to check, and it was false. HistorianGateway has NO local
`.btn` sizing in either tree, only vendored Bootstrap, so for it the bump is a **visible change**
(buttons shrink from Bootstrap's 1rem to `.85rem`), not the no-op cleanup the note promised. The
per-repo check is one grep for `bs-btn-font-size` excluding `lib/bootstrap` — under ten seconds,
against a claim that was wrong for 20% of the family.
anything: four of the five apps' blocks were pure sizing and safe to delete outright, one was
not, and the difference is invisible unless you look. Two of the four that were safe deleted
without diffing first and said so — they were lucky, not careful, and that is the same shape of
@@ -352,6 +359,24 @@ must return the button, not the backdrop — mxgw's modal gate), and **realistic
data** (ScadaBridge injected a 150-char OPC UA node id; HistorianGateway created a key with an
88-char display name, which rendered as 40 chars + ellipsis with Revoke still in the viewport).
**The recurring failure of this whole playbook is a property asserted about a set after checking
the convenient part of it.** It happened three times in one round, in three different guises, and
each time the claim was made in good faith by someone who had genuinely looked at *something*:
- "All five apps carry a local `.btn` block, so the bump is a cleanup" — inferred from the apps that
had one. HistorianGateway had none, making its bump a visible restyle.
- "The sweep is behavior-preserving" — asserted about a 76-file diff after reviewing the wrapper and
class changes it was *supposed* to contain. Four files carried an unrequested state-model refactor
that closes a modal when a background refresh drops its row.
- "mxgw is Bootstrap-free so the modal defect can't affect it" — an exemption from a family-wide gate,
granted on a property nobody re-derived. It was a Bootstrap host and *was* affected.
The shape is identical every time: a universal claim, a partial check, and a conclusion that happens
to be convenient. The fix is not more caution, it is a **cheap per-member check that actually runs** —
one grep, ten seconds — plus stating the claim's scope honestly ("verified in these three; not checked
in the other two") when the check hasn't run. Note that all three were caught by someone re-examining
their own earlier assertion, never by the assertion being challenged.
**Record what you could not exercise rather than rounding it up.** HistorianGateway proved 2 of its
4 truncation sites live and said so: `sf.Error` needs a genuine drain failure, which needs a
historian that accepts a connection and *then* rejects the write, and a box with nothing listening