Found while permuting the Lint & Repo Gates step list under the #13690 ruling (the permutation itself parses the job's steps with a real YAML parser, which is what surfaced this). ⛔ Filed unassigned, ⛔ not fixed in that PR: correcting it changes a step name, and that PR's whole correctness proof is that the multiset of step names and run: bodies is byte-identical before and after.
The observation
.github/workflows/lint.yml carries one step whose name: is an unquoted plain scalar containing #:
- name: The #13419 name-fold fixture has no non-test loader
run: |
node scripts/check-position-name-fold-loaders.mjs --self-test
node scripts/check-position-name-fold-loaders.mjs
In YAML a space followed by a hash begins a comment inside a plain scalar, so everything from #13419 on is not part of the value. The step's real name is the three-letter string The.
Measured with the repo's own yaml 2.9.0 (the parser already installed at the workspace root), parsing .github/workflows/lint.yml and projecting jobs.lint.steps[].name:
raw: - name: The #13419 name-fold fixture has no non-test loader
parsed: "The"
A sweep of every workflow file in .github/workflows/ for the same shape (an unquoted - name: value carrying #) finds exactly one occurrence — this one. So it is a single-site defect, not a family.
Why it is worth a card rather than a shrug
- The GitHub Actions step log names this step
The. A red there reads as an unnamed step, which is precisely the mis-routing failure the Lint & Repo Gates job rename was made to stop (the job's own header comment records three mis-routed diagnoses in one day from a step whose name did not say what it was).
- Anything that resolves a step by name cannot find it.
scripts/pm/ci-failure.mjs resolves steps by their name text against the workflow source, and scripts/pm/dispatch-gates.mjs reports families per step; a name the parser truncates is a name no by-name lookup can match.
- It is invisible to every current gate. The file parses, the step runs, the commands are correct, and no gate reads step names for well-formedness — which is why it has survived.
The fix, and the question worth deciding
Mechanically it is one line: quote the scalar.
- name: 'The #13419 name-fold fixture has no non-test loader'
The open question is whether to also add the guard, since the same keystroke is available to every future author and nothing red-flags it: a check that every workflow step's parsed name equals the text after - name: in the source (or, more simply, that no unquoted step name contains #). This repo names issue numbers in step names as a matter of style, so the shape is likely to recur. ⛔ Not proposed here — recorded so the triage seat can price the guard against a one-line fix.
Refs: #13690 (the permutation PR that surfaced it, which deliberately leaves it alone).
Generated by Claude Code
Found while permuting the
Lint & Repo Gatesstep list under the #13690 ruling (the permutation itself parses the job's steps with a real YAML parser, which is what surfaced this). ⛔ Filed unassigned, ⛔ not fixed in that PR: correcting it changes a step name, and that PR's whole correctness proof is that the multiset of step names andrun:bodies is byte-identical before and after.The observation
.github/workflows/lint.ymlcarries one step whosename:is an unquoted plain scalar containing#:In YAML a space followed by a hash begins a comment inside a plain scalar, so everything from
#13419on is not part of the value. The step's real name is the three-letter stringThe.Measured with the repo's own
yaml2.9.0 (the parser already installed at the workspace root), parsing.github/workflows/lint.ymland projectingjobs.lint.steps[].name:A sweep of every workflow file in
.github/workflows/for the same shape (an unquoted- name:value carrying#) finds exactly one occurrence — this one. So it is a single-site defect, not a family.Why it is worth a card rather than a shrug
The. A red there reads as an unnamed step, which is precisely the mis-routing failure theLint & Repo Gatesjob rename was made to stop (the job's own header comment records three mis-routed diagnoses in one day from a step whose name did not say what it was).scripts/pm/ci-failure.mjsresolves steps by their name text against the workflow source, andscripts/pm/dispatch-gates.mjsreports families per step; a name the parser truncates is a name no by-name lookup can match.The fix, and the question worth deciding
Mechanically it is one line: quote the scalar.
The open question is whether to also add the guard, since the same keystroke is available to every future author and nothing red-flags it: a check that every workflow step's parsed
nameequals the text after- name:in the source (or, more simply, that no unquoted step name contains#). This repo names issue numbers in step names as a matter of style, so the shape is likely to recur. ⛔ Not proposed here — recorded so the triage seat can price the guard against a one-line fix.Refs: #13690 (the permutation PR that surfaced it, which deliberately leaves it alone).
Generated by Claude Code