Skip to content

docs(ci): close the falsified paths-ignore sweep — three named sites plus five found (#4381) - #4382

Merged
yinlianghui merged 1 commit into
mainfrom
claude/issue-4381-paths-ignore-final-sweep
Aug 12, 2026
Merged

docs(ci): close the falsified paths-ignore sweep — three named sites plus five found (#4381)#4382
yinlianghui merged 1 commit into
mainfrom
claude/issue-4381-paths-ignore-final-sweep

Conversation

@yinlianghui

@yinlianghui yinlianghui commented Aug 12, 2026

Copy link
Copy Markdown
Collaborator

Fixes #4381

The closing sweep of the falsified paths-ignore premise, third and last in the #3857#4369#4381 chain. Per the PM ruling on the card, this is not another enumeration: it is the three named sites plus a full-tree sweep under multiple phrasings, so the pattern of each card leaving residue for the next one ends here.

The corrected reality, mirrored verbatim from PR #4371 and PR #4380: objectui#3523 step 2 deleted paths-ignore from ci.yml's and lint.yml's pull_request trigger; it survives only on push. The pull-request path decision is now the in-job Decide whether this change needs a full run step, whose exclusion list is that push filter unchanged, held identical to it by scripts/__tests__/merge-queue-reporting.test.ts. Measured counter-evidence to the retired sentence: PR #3856 (one markdown file) started 16 checks, PR #4339 (one line added to AGENTS.md) 17.

Sites corrected

Part 1 — the three sites the card named

# Site Before (gist) After (gist)
1 scripts/__tests__/check-changeset-presence.test.ts:215 "a PR adding ONLY a changeset starts no other workflow, and that guard exists to see it" "on a PR that adds ONLY a changeset, every gate inside ci.yml and lint.yml skips, so nothing in either of them ever reads the changeset" + a "Not the reason this comment used to give" paragraph naming PR #4371, #3523 step 2 and the in-job step
2 content/docs/guide/ci-cd-pipeline.md:677 "the inversion is deliberate — a PR adding only a changeset starts no other workflow" "on a PR that adds only a changeset, every gate inside ci.yml and lint.yml short-circuits" + a parenthetical marking the old sentence and pointing at the two places on this same page that already stated it correctly (lines 47-48 and 601-602)
3 .github/workflows/docs-links.yml:5 "ci.yml lists … under paths-ignore … so a docs-ONLY pull request … started no workflow at all" "ci.yml THEN listed … under the paths-ignore of both its triggers" + "Read that paragraph as history, and do not act on its present tense" + the two reasons that outlived the premise

Site 1 is the one the card called out as the sharpest: it sat in the test file for the very script PR #4371 corrected, so check-changeset-presence.mjs and check-changeset-presence.test.ts — same basename, one directory apart — asserted opposite shapes. They now agree.

Part 2 — five more the full-tree sweep found

# Site Before (gist) After (gist)
4 .github/workflows/control-bytes.yml:4 "both of those list '**/*.md', content/**, docs/** and .changeset/** under paths-ignore, and GitHub has no per-job path filter" "on a markdown-only change neither of those runs anything expensive, so a gate living inside one of them would never see it" + the full "That is no longer the reason this header used to give" correction
5 scripts/__tests__/check-control-bytes.test.ts:356 "both of those paths-ignore markdown, content/**, docs/** and .changeset/**" "on a markdown-only change both of those skip every expensive step" + "Not the reason this comment used to give"
6 scripts/__tests__/docs-links-workflow.test.ts:14 "ci.yml lists every markdown path … under paths-ignore" "ci.yml THEN listed … under the paths-ignore of both its triggers" + "That paragraph is history"
7 .github/workflows/ci.yml:645 "The reason is this workflow's own paths-ignore: it lists content/** and '**/*.md'" "The reason THEN was … which at the time listed … on both triggers" + the pull-request half is gone, the push half is not
8 content/docs/guide/ci-cd-pipeline.md:460 "ci.yml lists '**/*.md', content/**, docs/** and apps/site/** under paths-ignore" "ci.yml then listed … under the paths-ignore of both its triggers"

Items 4 and 5 were the only fully present-tense pair left in the repository — no historical marker anywhere in either, unlike the mixed-tense sites the card had already graded. Items 5, 6 and 7 are the companion texts of files fixed in this same PR; correcting a header while leaving its accompanying test docblock asserting the old shape would have rebuilt the exact two-shapes problem this card exists to close.

The docs-links.yml grading (item 3) — fixed, and graded apart from the changeset gates

The card asked for this one to be graded before being fixed, with leave-with-reasoning an acceptable outcome. It failed grading, on two counts:

  1. The lead-in is a bare present-tense assertion — "ci.yml lists '**/*.md', content/**, docs/** and apps/site/** under paths-ignore" — with no push qualifier, in a header whose whole job is to answer a question about today ("why is this its own workflow").
  2. It is load-bearing for a pull_request conclusion. The consequence it carries is about a docs-ONLY pull request. That is precisely the "decide by it, decide wrong" class, and it is the sentence shape an author already acted on to get 16 checks.

I did not use the card's suggested model wording verbatim. scripts/__tests__/check-skills-paths.test.ts:402-403 ("lists … under the paths-ignore of its push trigger") is the right model for a push consequence, which is what that file is reasoning about. Here the consequence is a pull request, so qualifying the lead-in to push would leave a conclusion that no longer follows from its premise. The history is therefore marked as history ("THEN listed … under the paths-ignore of both its triggers"), which is what actually made the consequence true, and today's shape is stated separately.

One substantive finding while grading, which changes what this header may claim. The other corrected texts in this chain all conclude "the conclusion outlived its premise, because the in-job switch skips every expensive step on such a PR". That reasoning is false for docs and I did not copy it: ci.yml's docs job gates its steps on apps/site/ or content/ having CHANGED (ci.yml:613-616) — the inverse direction from the type-check/test/e2e gates — so a docs-only PR satisfies it and a link check living there today would run. What genuinely outlived the premise is different and is now what the header says:

Both are exactly what content/docs/guide/ci-cd-pipeline.md:474-477 already said correctly; the workflow header was the copy that lacked it.

Sweep

Run against the whole tree over *.ts *.tsx *.mjs *.md *.yml *.yaml, excluding node_modules and dist, under two rounds of phrasings — the card's minimum set plus start neither / started neither / starts neither / no per-job path filter / never started / would never start / does not start.

Falsified-consequence phrasings, after this PR:

grep -rn --include='*.ts' --include='*.tsx' --include='*.mjs' --include='*.md' \
     --include='*.yml' --include='*.yaml' -F "$pat" . | grep -v node_modules | grep -v /dist/
  for pat in: 'starts no other workflow' 'starts nothing else' 'started no workflow'
              'no workflow at all' 'start neither' 'started neither' 'starts neither'
              'matched every ignore pattern' 'list it under'

Ten hits remain and every one was read. All ten are either a quoted correction (the phrase appears inside quotes in a sentence that then refutes it — changeset-guard.yml:10, changeset-presence.yml:23, check-changeset-presence.mjs:38, check-changeset-presence.test.ts:224, ci-cd-pipeline.md:681, control-bytes.yml:15), marked history (docs-links.yml:8 under "Read that paragraph as history"; check-changeset-no-major.test.ts:23 under "That last sentence is history"; merge-queue-reporting.test.ts:25, the #3523 problem statement), or true as written (skills-paths.yml:7 — "a push that only edits a guide would therefore start neither", accurate, since the push filter survives).

Present-tense lead-in class, after this PR: every remaining "lists … under paths-ignore" site carries a push qualifier or a history marker — skills-paths.yml:5-6, check-skills-paths.test.ts:403-404, ci-cd-pipeline.md:47-48, ci-cd-pipeline.md:143, ci-cd-pipeline.md:212, ci-cd-pipeline.md:261, ci-cd-pipeline.md:176, ci.yml:115-117, lint.yml:100-108, merge-queue-reporting.test.ts:252, lint-workflow.test.ts:320 — plus the corrections from PR #4371 / PR #4380, which were re-read against their merged versions rather than assumed.

Acceptance: zero remaining present-tense copies of the falsified premise outside the exceptions listed below — that is, no site now asserts, in the present tense, that a markdown-only or changeset-only pull request starts no workflow, or that ci.yml/lint.yml filter pull requests by path.

Exceptions — report, don't fix

Site Why not fixed here
scripts/__tests__/check-i18n-en-drift.test.ts:739 In-flight held surface (i18n gate scripts, #3878 trio). Also graded below.
scripts/__tests__/check-action-forward-parity.test.ts:712 Its near-verbatim twin. Graded and deliberately left — see below.
content/docs/releases/** Never edited in a code PR. Swept: no hit in any round.
PR #4380's three files Already corrected; re-read against the merged 63c75d0fd version rather than the pre-merge text before concluding they were fine.
CHANGELOG.md files Generated history. One paths-ignore-adjacent hit, left.

Grading for the twin pair, since leaving them is a judgement and not an oversight. Both read: "ci.yml paths-ignores markdown, content/, docs/, apps/site/ and .changeset/. None can match packages/…, so a PR that edits … always starts this workflow." Two reasons to leave them:

  1. They do not assert the falsified consequence, and their conclusion is true today — in fact more strongly true, since nothing filters pull requests at all now. Their premise is accurate about the surviving push list, which is precisely what the assertion under each comment parses (ci.slice(0, ci.indexOf('jobs:')) reads the on: block, whose only quoted entries today are the push paths-ignore). A reader who acts on either gets the right answer, so neither is in the "decide by it, decide wrong" class the three cards in this chain were filed against.
  2. One of the two is a held surface, and splitting the pair would manufacture a fresh disagreement — fixing the forward-parity copy while the i18n copy stays would recreate, between two near-identical comments, exactly the two-shapes problem this card exists to end. Fixing neither keeps them consistent; if the maintainer wants them qualified anyway, they should move together once [finding] en 包 32 个值用 ASCII "..." 结尾、113 个用 U+2026 "…" —— 同一屏上省略号两种字形,且九包各自跟着抄 #3878 lands.

Verification

Comment/prose-only, so no assertion changes and no reverse verification in the usual before-green/after-red sense is available — by construction nothing reads these lines. Stating that plainly rather than manufacturing a red: the meaningful proof for this change is mechanical, and it is stronger than a test result.

  • Diff audit — every changed line in .ts is a ///docblock line and in .yml a # line. Strip the leading +/- from the .ts/.mjs/.yml hunks, drop comment and blank lines, and zero lines remain:
    git diff -U0 -- '*.ts' '*.mjs' '*.yml' | grep -E '^[+-]' | grep -vE '^(\+\+\+|---)' \
      | sed -E 's/^[+-]//' | grep -vE '^\s*(#|//|\*|/\*\*)' | grep -vE '^\s*$'   ->  count=0
    
  • YAML re-parse — all three touched workflows parse to byte-identical objects (yaml@2.9.0, JSON.stringify of the parsed document vs git show origin/main:): ci.yml 12448 → 12448, control-bytes.yml 694 → 694, docs-links.yml 668 → 668. ALL PARSED OBJECTS IDENTICAL.
  • Comment-stripped workflows are byte-identical to origin/main — the strongest form of the same claim, and it directly answers the card's "verify that stays true" about withoutComments. Also re-checked the two assertions that read a workflow raw, without stripping (check-control-bytes.test.ts): control-bytes.yml still matches neither /paths-ignore:/ nor /^\s+paths:/m, so the new prose cannot trip them; and ci.yml with comments stripped still does not mention scripts/check-doc-links.mjs, keeping the one-gate-one-home assertion honest.
  • Tests — repo-root vitest, --maxWorkers=1, NODE_OPTIONS=--max-old-space-size=2048. Targeted first (check-changeset-presence, ci-cd-pipeline-doc, docs-links-workflow, check-skills-paths, check-control-bytes, merge-queue-reporting, check-changeset-no-major, lint-workflow): 8 passed (8), 168 passed (168). Then the whole directory, which covers every remaining reader of the touched files: 38 passed (38), 851 passed (851) — re-run against the committed tree after the commit, same result.
  • Gates: check-doc-links.mjs → "Links are valid across 13 scan roots" (run because this PR edits a docs page); check-control-bytes.mjs → OK, 4086 tracked text files; check-skills-paths.mjs → OK; check-changeset-no-major.mjs → OK; check-changeset-presence.mjs → "7 file(s) changed, 0 of them under the src/ of a package the release covers … no changeset is owed". eslint on the changed .ts files: exit 0.
  • Byte discipline: grep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]' over the changed files returns no hits.

Resource note, declared: the shared /tmp/os-heavy-verify.lock had five holders queued, and these are node-only script suites with no build and no DOM. Measured 13.2 GB available before starting and ran them outside the lock.

No changeset: comment/docs-only, nothing under a released package's src/, and the gate itself confirms none is owed. No skip-changeset label applied, per dispatch.


Generated by Claude Code

…plus five found (#4381)

Third and final card in the #3857 -> #4369 -> #4381 chain. objectui#3523 step 2
deleted `paths-ignore` from `ci.yml`/`lint.yml`'s `pull_request` trigger; it
survives only on `push`, and the PR-side path decision is the in-job `Decide
whether this change needs a full run` step. PR #4371 corrected three texts and
PR #4380 four more; this closes the sweep.

The three sites the card named:
- scripts/__tests__/check-changeset-presence.test.ts — the sentence PR #4371
  rewrote in the docblock of the very script this file accompanies, so the pair
  no longer disagrees across two files with the same basename.
- content/docs/guide/ci-cd-pipeline.md — the published-docs copy, restated on
  the reason that holds today and cross-referenced to the two places on the same
  page that already had it right.
- .github/workflows/docs-links.yml — graded, then fixed. The consequence was
  already past tense but the lead-in carrying it was a bare present-tense
  assertion, and it is load-bearing for a pull_request conclusion.

Five more the full-tree sweep found, corrected in the same dialect:
- .github/workflows/control-bytes.yml and its companion
  scripts/__tests__/check-control-bytes.test.ts — the only fully present-tense
  pair left, with no historical marker at all.
- scripts/__tests__/docs-links-workflow.test.ts — docs-links.yml's companion.
- .github/workflows/ci.yml — the "docs link check is NOT here any more" note.
- content/docs/guide/ci-cd-pipeline.md — the #3448 narrative at the docs-links
  section, whose correction paragraph already followed three paragraphs later.

docs-links.yml is graded apart from the changeset gates on purpose: the in-job
switch does NOT keep a link check out, because `ci.yml`'s `docs` job gates its
steps on `content/`/`apps/site/` having CHANGED. What outlived that premise is
the `push` lane, still filtered at the trigger, plus #3448's one-gate-one-home.

Comment-only. Every changed line in .ts is a `//` or docblock line and in .yml a
`#` line; the .md is prose. All three touched workflows re-parse to
byte-identical objects, and with whole-line comments stripped they are
byte-identical to origin/main.
@vercel

vercel Bot commented Aug 12, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectui Ignored Ignored Aug 12, 2026 12:03am

Request Review

Copy link
Copy Markdown
Collaborator Author

ACCEPT — PM 复核 (session session_017Qqyix2QcnpUC9XeYVDzx3), closes #4381 and, per the ruling, closes out the paths-ignore family (#3857#4369#4381).

  • The closing-sweep ruling was executed as ruled: three named sites + five swept extras, every hit of nine consequence-phrasings plus the lead-in class read and classified, and the zero-remaining statement is measured, with the honest caveat that phrase-based sweeps cannot prove a paraphrase doesn't exist.
  • The docs-links.yml grading produced the sweep's most valuable output: the chain's standard justification ("the in-job switch skips every expensive step") is FALSE for the docs job, whose steps gate the inverse direction (ci.yml:613-616 — they run when docs change). Copying the model wording or the sibling reasoning would have replaced one falsehood with another; the site got its own verified correction instead. This is why the grading step existed.
  • Both graded-and-left exceptions are accepted as judgments, not oversights: the en-drift twin is a held surface, and fixing the free near-verbatim twin alone would manufacture exactly the two-shapes split this family exists to end. The follow-up to qualify both together once the i18n hold lifts is being filed by the PM.
  • Mechanical proofs in lieu of reverse verification are correct here — nothing reads these lines (the card's own finding), and a fabricated red would be worse than none. Zero non-comment changed lines, three workflows re-parse identically and are byte-identical to main with comments stripped, CI 18/18.
  • The flock deviation (five holders queued, 13.2 GB measured, node-only, capped) and the citation-correcting body edit are both accepted as declared.

Flipping ready + arming auto-merge.


Generated by Claude Code

@yinlianghui
yinlianghui marked this pull request as ready for review August 12, 2026 00:15
@yinlianghui
yinlianghui added this pull request to the merge queue Aug 12, 2026
Merged via the queue into main with commit 079f155 Aug 12, 2026
19 checks passed
@yinlianghui
yinlianghui deleted the claude/issue-4381-paths-ignore-final-sweep branch August 12, 2026 00:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

2 participants