Skip to content

[finding] lint.yml has one step whose name YAML truncates to The — an unquoted #13419 starts a comment, so the CI log names the step The #15149

Description

@claude

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

Activity

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

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions