docs(review-checklist): rules 27-32 — evidence instruments, rendered strings, and merge verification - #1771
Merged
Conversation
…strings, and merge verification Six incident-derived rules, appended per the file's own numbering convention: - 27: an evidence tool that accepts a parameter it does not implement makes its own evidence lie, and it lies in the filename (the harness --width hole, plus the woff2 403 that changed the typeface between revisions). - 28: a byte-identical before/after pair is evidence about the surface, not a null result; rendering-aware innerText vs textContent separates hidden from absent, and byte-identity is not a property of two sessions. - 29: one renderer, two meanings — classify a label helper's call sites by the data they receive; the ledger settles which string was a defect. - 30: what a rendered value means is answered from the store, not the renderer; and fixture provenance travels with the artifact. - 31: a flake fix is proven by making the defect reproducible; an assertion over a process-global resource must watch the subject's own identity. - 32: verify a merge at the consumer — squash merge tree == carried head tree. Docs-only; no version slot.
Rule 27 said the fix "made the sizes real" as though it were on `main`. It is not: on `main` `scripts/ui-evidence-shot.mjs:87` still hardcodes a 1440x900 viewport and drops `--width` without a warning. Rule 27 (and the same latent reading in rule 28) now name #1770 the way rule 26 names its PR. Tip commit on the cleared head; docs-only, one file, no version slot.
lilyshen0722
force-pushed
the
kai/checklist-rules-27-32
branch
from
September 19, 2026 16:33
1ae1c8e to
b8091c4
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Six incident-derived rules appended to the reviewer checklist, per that file's own convention (rules ascend in document order, new rules go at the end). All six come from this session's
Sharpenlane work.27 — an evidence tool that accepts a parameter it does not implement makes its own evidence lie, and it lies in the filename.
scripts/ui-evidence-shot.mjsaccepted--widthand never resized: a capture written as--out …-390.pngwas a 1440×900 desktop render under a phone's name, and a before/after pair was posted on that naming. Obligations: never accept a parameter you do not consume; echo the parameters that determine the output next to the output; refuse an unknown flag instead of defaulting. Second instance from the same arc: a symlinkedfrontend/node_modulesmade vite 403 the@fontsourcewoff2s, so the before render used fallback fonts — a pair differing by typeface, and a hole no parameter set could have exposed, which is why the run line reports non-2xx asset fetches.28 — a byte-identical before/after pair is evidence about the surface, not a null result. Three states render the same: nothing changed, the element never mounted, the element is in the DOM but unpainted. Discriminate with an element read (
innerTextis rendering-aware,textContentis not), not a pixel compare. Corollaries: byte-identity is not a property of two capture sessions; and when a stylesheet hides the target at the width you are shooting, name the surface that does paint it.29 — one renderer, two meanings.
seatLabelrenders both the aside'sagents allowedline and every trail row. The aside'san agentfor a resolvable member was the defect; the trail's was the fallback firing correctly for a callable seat with no installation and no membership. Classify a shared label's call sites by the data they receive — the ledger, not the string, decides which one is wrong.30 — what a rendered value means is answered from the store, not the renderer. The
Unknown Useron the #1758 fixture came frommodels/pg/Message.ts:214,261(LEFT JOINusers) with no PG row for a hand-inserted author — not from pod membership, which a one-write probe refuted and then reverted. Rider: a hand-seeded row is not a posted one, and a screenshot cannot distinguish a fixture row from live usage, so provenance travels with the artifact.31 — a flake fix is proven by making the defect reproducible, not by rerunning the flake. Same for an assertion that counts a process-global resource: it must watch the subject's own identity (
codex.js:442creates the dir,:506removes it; the test now watches that dir, with an in-seamexistsSynccontrol). Recorded negative:process.env.TMPDIRdoes not redirectos.tmpdir()inside jest.32 — verify a merge at the consumer. For a squash merge,
git rev-parse <merge>^{tree}must equalgit rev-parse <carried-head>^{tree}; a green tick proves the workflow ran, not that the reviewed artifact landed. Riders: a carry is a per-file claim and a docs-only addition on a cleared head is a re-stamp; know the required-check set, because a required check that has not reported renders asBLOCKED, which is in-flight rather than a verdict.Scope:
docs/development/review-checklist.mdonly — 16 lines added, no code, no version slot needed (Source changed ⇒ version bumpedinspectscli/srcandcommonly-mcp/src). No pointer edits: rules 27–32 are self-contained and the file's index/pointer lines already landed with #1755.Request: @vera's review gate, same as the preceding checklist PRs. Anchors in 29–31 are
origin/main-verified (V2ConnectorTools.tsx:271–274/727/786,models/pg/Message.ts:214,261,agentIdentityService.ts:618,agentMessageService.ts:1245–1249,codex.js:442/506).Revision
1ae1c8ec(tip on the cleared2d1492fc): rule 27 now attributes the harness fix to #1770 instead of implying it is onmain, and states whatmaindoes today —scripts/ui-evidence-shot.mjs:87hardcodes a 1440×900 viewport and drops--widthwithout a warning. Rule 28 carried the same latent reading about the pair's widths, so it now names #1770 too. Two lines, one file, docs-only; the diff against the cleared head is1 file changed, 2 insertions(+), 2 deletions(-).