You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
[finding] Four more copies of the falsified paths-ignore premise survive #3857's three named sites (changeset-presence.yml, check-changeset-no-major.mjs and its test) #4369
Out-of-scope finding, recorded while implementing #3857 / #3859 (PR pending). Filed unassigned, per the report-don't-fix discipline: #3857 names exactly three sites and its dispatch scope is those three, so these four were left untouched rather than swept in.
Fact
#3857 established that ci.yml and lint.yml no longer carry paths-ignore on their pull_request trigger — objectui#3523 step 2 moved the path decision into the jobs (Decide whether this change needs a full run), leaving paths-ignore only on push. It then named three texts that still assert the old shape. A keyword sweep for paths-ignore across the tree at origin/main @ 2fea4d2fa finds four more carrying the same falsified premise, none of them named on that card:
Location
What it still says
.github/workflows/changeset-presence.yml:11-15
"ci.yml and lint.yml both list .changeset/** under paths-ignore, so a PR that adds ONLY a changeset starts nothing else" — a near-verbatim copy of the scripts/check-changeset-presence.mjs paragraph #3857 does name
scripts/check-changeset-no-major.mjs:22
"nothing executed it, and no workflow even looked at .changeset/** (both ci.yml and lint.yml list it under paths-ignore)" — the sentence is historical, but the parenthetical is present tense
"ci.yml cannot host this check: a changeset-only PR matches its paths-ignore twice over ('**/*.md' and .changeset/**), so no job in it would ever run"
The two test-file occurrences are comments only. The assertions below them are sound and stay green — expect(ci).toContain("paths-ignore:") passes because the push trigger genuinely keeps its copy — so nothing here is a broken gate; it is the explanation attached to a working gate.
Why it is worth a card rather than a shrug
This is the same class #3857's own triage graded, in its words: agent-facing operational assertions that are live-disproven, "the 'decide by it, decide wrong' class, with the cost already sampled once (PR #3856's author wrote a false CI expectation from AGENTS.md and got 16 checks)". That card was promoted from finding to pm:queue on that reading.
There is one extra cost specific to these four, which did not apply when all seven copies said the same wrong thing: once #3857's PR lands, the repository will state both shapes. A reader who lands on changeset-presence.yml's header first has no signal that the corrected text three files away supersedes it — the two read as equally authoritative, and the stale one is the one physically closest to the gate it explains.
The right fix is the same one #3857 specifies, applied to these four: state that paths-ignore remains only on push, that the pull_request path decision lives in the Decide whether this change needs a full run step, and restate each gate's rationale as the reason that holds today (both changeset gates are correct as built — the conclusion outlives its premise, because the in-job exclusion list still covers markdown and .changeset/**, so those workflows start, report, and skip every expensive step on exactly the PR these gates exist to judge).
grep -rn 'paths-ignore' .github/workflows scripts AGENTS.md | grep -v node_modules
sed -n '1,20p' .github/workflows/ci.yml # paths-ignore on push only; :12 says why
sed -n '29,42p' .github/workflows/lint.yml # same, :37
Dedupe
Searched open issues in this repo for paths-ignore, changeset-presence, check-changeset-no-major and changeset-guard: the only hit is #3857 itself, whose three named sites are disjoint from the four above. No twin.
Out-of-scope finding, recorded while implementing #3857 / #3859 (PR pending). Filed unassigned, per the report-don't-fix discipline: #3857 names exactly three sites and its dispatch scope is those three, so these four were left untouched rather than swept in.
Fact
#3857 established that
ci.ymlandlint.ymlno longer carrypaths-ignoreon theirpull_requesttrigger — objectui#3523 step 2 moved the path decision into the jobs (Decide whether this change needs a full run), leavingpaths-ignoreonly onpush. It then named three texts that still assert the old shape. A keyword sweep forpaths-ignoreacross the tree atorigin/main@2fea4d2fafinds four more carrying the same falsified premise, none of them named on that card:.github/workflows/changeset-presence.yml:11-15ci.ymlandlint.ymlboth list.changeset/**underpaths-ignore, so a PR that adds ONLY a changeset starts nothing else" — a near-verbatim copy of thescripts/check-changeset-presence.mjsparagraph #3857 does namescripts/check-changeset-no-major.mjs:22.changeset/**(bothci.ymlandlint.ymllist it underpaths-ignore)" — the sentence is historical, but the parenthetical is present tensescripts/__tests__/check-changeset-no-major.test.ts:19-22ci.ymlandlint.ymlbothpaths-ignore.changeset/**, so a changeset-only PR started no workflow at all"scripts/__tests__/check-changeset-no-major.test.ts:120-123ci.ymlcannot host this check: a changeset-only PR matches itspaths-ignoretwice over ('**/*.md'and.changeset/**), so no job in it would ever run"The two test-file occurrences are comments only. The assertions below them are sound and stay green —
expect(ci).toContain("paths-ignore:")passes because thepushtrigger genuinely keeps its copy — so nothing here is a broken gate; it is the explanation attached to a working gate.Why it is worth a card rather than a shrug
This is the same class #3857's own triage graded, in its words: agent-facing operational assertions that are live-disproven, "the 'decide by it, decide wrong' class, with the cost already sampled once (PR #3856's author wrote a false CI expectation from AGENTS.md and got 16 checks)". That card was promoted from
findingtopm:queueon that reading.There is one extra cost specific to these four, which did not apply when all seven copies said the same wrong thing: once #3857's PR lands, the repository will state both shapes. A reader who lands on
changeset-presence.yml's header first has no signal that the corrected text three files away supersedes it — the two read as equally authoritative, and the stale one is the one physically closest to the gate it explains.The right fix is the same one #3857 specifies, applied to these four: state that
paths-ignoreremains only onpush, that the pull_request path decision lives in theDecide whether this change needs a full runstep, and restate each gate's rationale as the reason that holds today (both changeset gates are correct as built — the conclusion outlives its premise, because the in-job exclusion list still covers markdown and.changeset/**, so those workflows start, report, and skip every expensive step on exactly the PR these gates exist to judge).Live counter-proof, re-measured today
.mdfile, 16 checks (the original sample).AGENTS.md, merged 17:40Z on 2026-08-11: 17 check runs on its head commit, read from the API, includingLint,Type Check,Test (shard 1..4/4),Internal Docs Link Check,Skill Guide Path Check,Control Byte ScanandChangeset Declaration.How to re-check
Dedupe
Searched open issues in this repo for
paths-ignore,changeset-presence,check-changeset-no-majorandchangeset-guard: the only hit is #3857 itself, whose three named sites are disjoint from the four above. No twin.Relation
Generated by Claude Code