Skip to content

fix(nightly): guards-nightly has been RED naming a step that runs every night - #3285

Closed
noahgift wants to merge 3 commits into
mainfrom
PMAT-3234-nightly-manifest
Closed

noahgift wants to merge 3 commits into
mainfrom
PMAT-3234-nightly-manifest

Conversation

@noahgift

Copy link
Copy Markdown
Contributor

Five scheduled lanes are red (guards-nightly, Coverage Nightly, Silicon Nightly,
examples-nightly, CUDA Nightly). This is the one whose cause is entirely inside the
guard
rather than in the thing it guards.

FAIL: manifest names a step this workflow does not run:
      Test-tier decision case table (BSE-17): quick/full/reuse, drift is ENV

The step is there — guards-nightly.yml:158:

- name: "Test-tier decision case table (BSE-17): quick/full/reuse, drift is ENV"

The inline check matched the bare spelling:

grep -Fq -- "- name: $name" .github/workflows/guards-nightly.yml

A step name containing a colon-space must be quoted in YAML, and this one contains
(BSE-17): quick. So the matcher looked for - name: Test-tier… while the file said
- name: "Test-tier…, and the lane has been red since that name was quoted — reporting a step
that runs on every nightly as one the workflow does not run.

A guard that names a real step as missing is worse than no guard: it teaches the reader to skip
the lane.

Extracted, not patched in place

Logic inside a run: block cannot be unit-tested and cannot carry a case table — which is why
a one-character class of defect survived in it. scripts/check_guards_nightly_manifest.sh
matches on the parsed name, so all three YAML quotings of one string are one step.

bare name parsed                              ok
DOUBLE-quoted name unquoted (the defect)      ok
single-quoted name unquoted                   ok
trailing whitespace stripped                  ok
manifest fully covered            -> exit 0
a genuinely absent step           -> exit 1   <- still fails; not made permissive
vacuity floor, <5 entries parsed  -> exit 1

Against the real tree: ok 7 manifest entries, every one a step in this workflow. Mutation:
appending one bogus entry turns it red again, so the matcher was widened without being disarmed.

The self-test found a defect in its own harness first

Invoking step_names through bash -c 'source …' re-ran this file's own dispatch and returned
nothing, so four rows failed while the parser was correct. A broken harness reporting a
working parser as broken is the same error being fixed, in the other direction
— worth
recording because the row that matters most is the one most easily faked, either way.

Also

check_roadmap_sorted.sh caught the roadmap entry at a stale slot: main gained PMAT-3228/3229
while this branch was being written, so "after 3222" was no longer sorted. Re-inserted among
its numeric peers.

guard_tree.sh --dry-run reports the new guard wired-elsewhere guards-nightly.yml;
check_guards_are_wired.sh exits 0. bashrs 7.4.1: 0 errors.

The other four red lanes are separate causes and are not touched here: Coverage Nightly
(llvm-cov), Silicon Nightly (the x86_64-cpu SIMD axis genuinely failing), examples-nightly
(an example failing), CUDA Nightly (PP-26 batch-invariance, a known divergence).

no-close: a CI lane fix with no filed issue; the four remaining red nightlies are separate
causes and need their own triage.

ont-delta: none — a CI guard fix; it adds no entity, shape, verdict reason or resolves target.

🤖 Generated with Claude Code

…ry night — the matcher cannot see a YAML-quoted name

Five scheduled lanes are red. This is the one whose cause is entirely inside the
guard rather than in the thing it guards.

    FAIL: manifest names a step this workflow does not run:
          Test-tier decision case table (BSE-17): quick/full/reuse, drift is ENV

The step is there. guards-nightly.yml line 158:

    - name: "Test-tier decision case table (BSE-17): quick/full/reuse, drift is ENV"

The inline check matched the BARE spelling:

    grep -Fq -- "- name: $name" .github/workflows/guards-nightly.yml

A step name containing a colon-space MUST be quoted in YAML, and this one contains
`(BSE-17): quick`. So the matcher looked for `- name: Test-tier...` while the file
said `- name: "Test-tier...`, and the lane has been red ever since that name was
quoted — reporting a step that runs on every nightly as one the workflow does not
run. A guard that names a real step as missing is worse than no guard: it teaches
the reader to skip the lane.

EXTRACTED rather than patched in place. Logic inside a `run:` block cannot be
unit-tested and cannot carry a case table, which is why a one-character class of
defect survived in it. scripts/check_guards_nightly_manifest.sh now matches on the
PARSED name, so all three YAML quotings of one string are one step.

Case table, 7 rows, both directions:

    bare name parsed                              ok
    DOUBLE-quoted name unquoted (the defect)      ok
    single-quoted name unquoted                   ok
    trailing whitespace stripped                  ok
    manifest fully covered            -> exit 0
    a genuinely absent step           -> exit 1   <- still fails; not made permissive
    vacuity floor, <5 entries parsed  -> exit 1

Against the real tree: `ok  7 manifest entries, every one a step in this workflow`.
Mutation: appending one bogus entry turns it RED again, so the fix widened the
matcher without disarming it.

The self-test found a defect in its OWN HARNESS first: invoking `step_names` through
`bash -c 'source ...'` re-ran this file's dispatch and returned nothing, so four
rows failed while the parser was correct. A broken harness reporting a working
parser as broken is the same error as the one being fixed, in the other direction.

Wiring: `guard_tree.sh --dry-run` reports it `wired-elsewhere guards-nightly.yml`
and check_guards_are_wired.sh exits 0. bashrs 7.4.1: 0 errors.

check_roadmap_sorted.sh caught the roadmap entry inserted at a stale slot — main
gained PMAT-3228/3229 while this branch was being written, so "after 3222" was no
longer sorted. Re-inserted among its numeric peers.

ont-delta: none — a CI guard fix; it adds no entity, shape, verdict reason or
resolves target of its own.

Pmat-Ticket: PMAT-3234
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@github-actions

github-actions Bot commented Sep 14, 2026

Copy link
Copy Markdown

§13.11 rung 1 — quorum shadow verdict

S13-SHADOW pr=3285 head=215c2865617b9d8c147923ac1f11f92e00aa1c83 verdict=REFUSE class=Q1 arm_rc=1

Shadow mode: this records a verdict and merges nothing. A refusal
to arm is not a block (§13 adds zero rows to §7) — the pull request is
exactly as green as it was.

noahgift and others added 2 commits September 14, 2026 22:44
Third time tonight. My insertion helper rejoins entry blocks with an added
newline, re-serialising the entry ABOVE the insertion without any field changing —
PMAT-980 (#2874). The remedy is the one check_roadmap_diff_additive.sh names.

Pmat-Ticket: PMAT-3234

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@noahgift

Copy link
Copy Markdown
Contributor Author

Superseded by #3295, which carries this change unmodified along with eight other
collision-free CI/guard PRs as a single merge-queue entry.

Not abandoned and not rejected: the commits are merged into
PMAT-3231-batch-1-ci-guards verbatim (clean=9 conflicted=0), and this branch is
retained — reopening is one click if #3295 does not land.

Why: a successful merge_group CI run is median 78 min with max_entries_to_merge = 1,
so nine entries is ~12 h of queue for 623 insertions. As one entry it is 78 minutes.
Root cause and the full five-whys: #3294.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant