ci: restore the eslint ratchet to the count the tree actually measures - #7696
Conversation
Design Review (Fable 5) — ✅ PASSDesign-level review of Design-Verdict: PASS A one-count, fully reversible ratchet correction that restores CI truth; the real fix and the CI gap are both tracked (#7695, #7511) with a stated reversal plan. [DESIGN-REVIEWED] 83ace87 |
Opus 4.8 Review — ✅ no blocking findingsReviewed Review detailsNo AUTOSDE rule's No findings. [OPUS-REVIEWED] 83ace87 Verdict parsed from the review's SHA-scoped output markers for commit False positive or not applicable? A repository writer can comment: |
First Principles Review (Fable 5) — ✅ PASSPremise-level review of Verification done. The change is one hunk in First-Principles-Verdict: PASS Unwedges a fleet-wide false red at the only place it can be unwedged, declares the raise as a raise, and names what retires it. What this change shipsIntent: stop every
Watch
[FIRST-PRINCIPLES-REVIEWED] 83ace87 |
|
The proof is that the same shard disagreed with itself over the same backend code Filed as #7703 with the evidence and the likely class (a writer's handle still open |
GPT 5.6 Review — ✅ no blocking findingsGPT 5.6 completed its review of This comment is updated in place on each push. Review detailsNo findings. False positive or not applicable? A repository writer can comment: |
`Frontend Lint & Type Check` pinned `--max-warnings 603` while `npx eslint src/` measured 604, so the job failed on every open PR that touched website/** - on a warning none of those diffs wrote. The 604th arrived with 7362b6a (#7259), which took ArtifactsPage.tsx from two react-hooks/exhaustive-deps warnings to three. Main's own runs never reported it: the frontend jobs are skipped on pushes that touch no frontend file, which is the gap #7511 describes, so the drift surfaced on the next unrelated PR instead. This raises the ceiling to the measured count and nothing else. Raising is against that ratchet's own instruction and is deliberately the smaller move: the real fix is a stable identity for the artifacts fallback, which changes hook dependency behavior on a 1100-line component and belongs to that page's owner. Issue #7695 carries it, and the ceiling returns to 603 in the PR that clears it. Refs #7511 Refs #7695
9cf37c4 to
83ace87
Compare
iamwhatever
left a comment
There was a problem hiding this comment.
Tier 1 auto-approve: chore/build tooling (1 file). Criteria: no conflict, no requested changes, security path denylist clean, design-doc gate clean, SAST annotations clean, security checklist all-NO, AI reviewers green. Category: CI plumbing only -- raises the eslint --max-warnings ceiling in .github/workflows/ci.yml from 603 to 604 to match what the tree actually measures after #7259 landed a third exhaustive-deps warning; no runtime code touched.
dwu96
left a comment
There was a problem hiding this comment.
Tier 1 auto-approve: chore / build tooling (1 file). Criteria: no conflict, no requested changes, security path denylist clean, design-doc gate clean, SAST annotations clean, security checklist all-NO, AI reviewers green. Category: CI-plumbing-only change to the website eslint --max-warnings ratchet in .github/workflows/ci.yml (603 -> 604) with an inline rationale comment; no runtime code, no product behaviour, single file.
Problem / Motivation
Frontend Lint & Type Checkpinsnpx eslint src/ --max-warnings 603, but thetree measures 604 warnings, 0 errors. The job therefore fails on every open
pull request that touches
website/**, on a warning none of those diffs wrote.Why it matters
It is a false red on other people's work, and an expensive one: the author has to
measure the base tree, bisect to the owning commit, and then decide whether to
fold someone else's CI fix into their diff - before their own review can proceed.
It also trains people to read a red ratchet as noise, which is the opposite of
what a ratchet is for. One PR (#7686) has already paid that cost.
What changed (motivation -> approach -> change)
Symptom:
604 problems (0 errors, 604 warnings)against a ceiling of 603.Root cause:
7362b6a2b("fix: arm the move-undo bar for artifact and folderdrags (#4626)", merged as #7259) took
website/src/pages/ArtifactsPage.tsxfromtwo
react-hooks/exhaustive-depswarnings to three -const artifacts = data?.artifacts || []at line 1161 now also feeds a newuseMemo/useCallback.Measured three ways:
npx eslint src/origin/maintoday (087ee4852)Why main itself stayed green: the frontend jobs are skipped on pushes that touch
no frontend file, and the runs that would have covered it were cancelled - exactly
the reporting gap #7511 describes. So the first red lands on an unrelated PR.
The change: the ceiling goes to the count the tree measures, and nothing else. No
source file is touched.
This IS a raise, which that ratchet's own comment tells you not to do, so the
comment now records why it happened and what retires it. The alternative - giving
the fallback a stable identity, e.g.
useMemo(() => data?.artifacts ?? [], [data])-changes hook dependency behavior on a 1100-line component. That is a correctness
review owned by that page, not something a fleet-unblocking PR should decide, so
it is filed as #7695 and the ceiling returns to 603 in the PR that clears it.
Tests
None added; there is no code here to test. The gate itself is the assertion, and
it was run locally exactly as CI runs it:
npx eslint src/ --max-warnings 604-> exit 0.npx eslint src/ --max-warnings 603-> exit 1, i.e. the ceiling still equals themeasured count and admits no slack. A 605th warning would still fail the job.
ci.ymlparses (yaml.safe_load), oneLintstep, command readsnpx eslint src/ --max-warnings 604.Manual verification
Measured on
origin/mainat087ee4852with the repo's own lockfile install: 0errors, 604 warnings. The three
react-hooks/exhaustive-depswarnings onArtifactsPage.tsx:1161are visible in the per-file JSON report, and the samefile measures two at #7558.
Related Issues
Refs #7511
Refs #7695
Unblocks #7686
Pattern harvest
Rule candidate: lint
Pattern: a diff-scoped ratchet whose baseline lives in CI config, changed by a PR
whose own CI run never exercises the gate - the breach is then charged to whoever
pushes next. The general shape is a gate whose measurement and whose enforcement
run on different triggers; #7511 tracks the reporting half.
Checklist
config line; the gate was run both ways instead
records the raise and what retires it