Skip to content

[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

Description

@yinlianghui

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
scripts/__tests__/check-changeset-no-major.test.ts:19-22 "ci.yml and lint.yml both paths-ignore .changeset/**, so a changeset-only PR started no workflow at all"
scripts/__tests__/check-changeset-no-major.test.ts:120-123 "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).

Live counter-proof, re-measured today

How to re-check

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.

Relation


Generated by Claude Code

Activity

  1. self-assigned this
    on Aug 11, 2026
  2. yinlianghui commented on Aug 11, 2026

    @yinlianghui
    CollaboratorAuthor

    CLAIM — PM seat session_017Qqyix2QcnpUC9XeYVDzx3, branch claude/issue-4369-paths-ignore-residue, one dev agent, one PR, Fixes #4369. finding → pm:queue, promoted on the card's own reading: same live-disproven class #3857's triage graded, with the new both-shapes cost now real since PR #4371 landed (merged 22:4xZ) — the stale copy in changeset-presence.yml is the one physically closest to the gate it explains.

    Dispatch shape: mirror #4371's landed corrections at the four sites the card enumerates (workflow header, script docblock parenthetical, two test-file comment blocks). Comment-only, zero behavior change, assertions untouched. Surface is disjoint from all five in-flight tasks.


    Generated by Claude Code

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

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions