Uh oh!
There was an error while loading. Please reload this page.
docs(ci): skills-paths header names both scan roots and drops the file count - #7412
Merged
Merged
Conversation
…e count The header stated the gate's scan surface as `skills/**` over 18 markdown files. Both halves were stale, and they drifted in two separate steps: the guide move took the count under `skills/` from 18 to 16, and widening `SCAN_ROOTS` to `['skills', '.claude/skills']` made the surface 20 files across two roots. A reader who took the parenthetical literally would conclude `.claude/skills` is ungated — the exact failure mode the widening exists to remove. The enumeration now names both roots and points at `SCAN_ROOTS` as the authority; the count is dropped rather than restated, because it goes stale on every guide added. `lint.yml`'s header records the same lesson about a number that went stale on its own clock. Comment-only: no change to triggers, jobs, steps, permissions or path filters. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
os-litant
commented
Sep 2, 2026
CollaboratorAuthor
Landing provenance (skills lane seat, session Generated by Claude Code |
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 freeto 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.
Fixes#7404
The header comment of
.github/workflows/skills-paths.ymlstated the gate's scan surface asskills/**over 18 markdown files. Both halves were stale, and they drifted in two separate steps. Prose only: the parsed workflow document is byte-identical before and after (proof in the gate table).A reader who took the old parenthetical literally would conclude
.claude/skillsis ungated — the exact failure mode the widening exists to remove.Before / after
The enumeration now names both roots and points at the declaration rather than copying a list; the count is dropped rather than restated at 20.
The roots, as the script declares them
scripts/check-skills-paths.mjs:154, verbatim:Landed in
7c77298— "chore(scripts): check-skills-paths scans .claude/skills too — 27 to 88 stated paths under the gate, the #7251 pins restored (#7358) (#7407)". It replacedexport const SCAN_ROOT = 'skills'.The gate's own run at this head prints the surface, which is where the 18/16/20 arithmetic resolves:
16 under
skills/(was 18 before the guide move) plus 4 under.claude/skills/= the 20 the card names.The three claims kept, each verified on
mainat6aeba671. The scan surface is entirely markdown.
scripts/check-skills-paths.mjs:202— the walker admits nothing else:Worth stating precisely, because it is a claim about what the gate reads, not about what the directories hold: the roots also contain 11 non-markdown files (
skills/objectui/evals/*.json), which the gate never opens. The comment's wording ("scan surface") is already the accurate one, so it is kept as-is.2.
ci.ymlandlint.ymlboth list'**/*.md'under thepaths-ignoreof theirpushtrigger.ci.yml:6-11:lint.yml:32-36carries the same list minusapps/site/**. The header's scoping to the push trigger is exact and still required: both files removedpaths-ignorefrom theirpull_requesttrigger (ci.yml:12,lint.yml:37— "Nopaths-ignorehere any more (objectui#3523, step 2)") and moved that decision into the jobs. Unchanged.3. This workflow carries no
pathsorpaths-ignoreof its own. After comment-stripping there is no such key at all — the YAML parse below enumerates the wholeon:block, andscripts/__tests__/check-skills-paths.test.ts:552-555pins it in both directions.That pin is also why a comment edit cannot move anything in it.
scripts/__tests__/check-skills-paths.test.ts:517-526, theyamlOfhelper, drops whole-line comments before every assertion:Its own doc comment gives the reason: "this file's own header discusses
pathsandpaths-ignorein prose ... A scan that counted comments would report filters and duplicate homes that no file has."Why the count is dropped, not restated
lint.yml:26-28records the same lesson from the other side, about a number that went stale on its own clock: "The order of magnitude is the whole argument; the integer never was." Restating 20 would re-arm the same drift on the next guide added.Gates — all at head
54d5db8, exit code captured by redirect before any pipevitest run scripts/__tests__/check-skills-paths.test.ts(+ 2 derived, below)Test Files 3 passed (3)·Tests 88 passed (88); lock:VERDICT command-exit 0node scripts/check-skills-paths.mjs✅ check-skills-paths: OK (87/88 stated path(s) resolve across 20 guide file(s); 1 baselined).node scripts/check-doc-links.mjsLinks are valid across 17 scan roots.node scripts/check-control-bytes.mjs✅ check-control-bytes: OK (scanned 6108 tracked text file(s); skipped 85 binary).node scripts/check-changeset-presence.mjs✅ No source or published contract of a released package changed in this range, so no changeset is owed.node scripts/check-governed-queue-guard.mjs --test .github/workflows/skills-paths.yml✅ NOT GOVERNED — 1 path(s) checked against 5 governed surface(s); none matched.yaml@2.9.0fromnode_modulesVERDICT: PARSED DOCUMENT IDENTICAL before/after — comment-only change confirmedThe changeset gate's verdict decides, and it says none is owed: one file changed, zero of them published source.
The YAML check parses both revisions with the repo's own
yaml@2.9.0and compares the parsed documents, so "comment-only" is measured rather than asserted. It also re-printson:(pull_request,push,merge_group,workflow_dispatch— nopathskey),permissions: contents: read, and the three steps unchanged.Two suites beyond the dispatched list, derived from the actual diff — both assert on this file, so a header edit is in their blast radius:
scripts/__tests__/check-pre-install-import-graph.test.ts:262pins'skills-paths.yml : skills-paths -> scripts/check-skills-paths.mjs'scripts/__tests__/merge-queue-reporting.test.ts:91pinsskills-paths.ymlamong the workflows that must subscribemerge_groupBoth are in the 3-file, 88-test run above.
Premise notes
Everything in the card held. Three deviations from the dispatch brief, none of them blocking:
workflow-scope push refusal did not occur. Both pushes (empty-branch probe, then the commit touching.github/workflows/**) returned exit 0.scripts/pm/os-verify-lock.shis an objectstack script; there is no lock script underobjectui/scripts/. The vitest run was serialized through the objectstack copy by absolute path, since the lock guards the shared container rather than a repo. Slotobjectui-7404, acquired after 0s, held 6s.skills/— widen SCAN_ROOT to cover.claude/skills#7358; they are the same landed commit7c77298, whose title carries both numbers (issue and PR). Not a conflict.🤖 Generated with Claude Code
https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
Generated by Claude Code