Skip to content

fix(ci): make a green signal mean the tests actually ran - #40

Open
sym-bot wants to merge 1 commit into
mainfrom
fix/ci-signal-means-something
Open

fix(ci): make a green signal mean the tests actually ran#40
sym-bot wants to merge 1 commit into
mainfrom
fix/ci-signal-means-something

Conversation

@sym-bot

@sym-bot sym-bot commented Jul 30, 2026

Copy link
Copy Markdown
Owner

Found while trying to decide whether a Node 18 hang belonged to PR #38 or to its base. Three defects; none exotic, but together they mean this repo's green signal has not been evidence for some time.

1. A PR targeting a stacked base ran no checks at all

pull_request was filtered to main. PR #39 targets the cutover branch feat/cmb-only-pin-core, so it ran zero jobs — while gh pr view reported mergeStateStatus: CLEAN and gh pr checks said "no checks reported".

At the surface a reviewer actually looks at, unverified and passing are the same colour.

Filter removed. Stacked work is exactly the work most worth checking, because its base is not main.

2. A hang recorded itself as "cancelled", not "failed"

The Node 18 matrix job has run past six hours, twice, while Node 22 finished in ~30s. With no job timeout it burns to the platform ceiling; with cancel-in-progress unconditional, any later run supersedes it first.

So a persistent, reproducible break left a trail of cancelled runs that reads as CI noise. It is why main's history shows almost nothing but cancellations and why the last genuine Node 18 result anyone has is from 26 Jul.

  • timeout-minutes: 15 — a hang fails fast and red.
  • cancel-in-progress is now conditional. Superseding a PR push is fine; superseding main destroys the only record of whether the mainline is green.
  • fail-fast: false — a Node 18 hang can no longer cancel the Node 22 job and take the one working signal down with it.

3. main could not be run on demand

No workflow_dispatch, so isolating "is this break mine or the base's?" required pushing to main — precisely when you least want to. Added.

Not fixed here, deliberately

Whatever makes Node 18 hang. engines declares node >=18 and the matrix tests it, so dropping it would be quietly narrowing a supported range to make a board go green.

This change makes the failure visible and diagnosable in fifteen minutes instead of invisible for six hours. The diagnosis is its own piece of work and needs a Node 18 environment to reproduce — I have only Node 22 locally.

Expected result

The first run of this workflow should go RED on Node 18. That is the point. If it goes green, the hang was environmental and this PR still stands on defects 1 and 3.

🤖 Generated with Claude Code

https://claude.ai/code/session_01SpDHL4kTRWvkuw63KADT6R

Three defects, found while trying to decide whether a Node 18 hang belonged to
PR #38 or to its base. None of them is exotic; together they mean this repo's
green signal has not been evidence for some time.

A PR TARGETING A STACKED BASE RAN NO CHECKS AT ALL. The pull_request trigger was
filtered to `main`, so PR #39 — targeting the cutover branch feat/cmb-only-pin-core
— ran zero jobs, while `gh pr view` reported mergeStateStatus CLEAN and
`gh pr checks` said "no checks reported". At the surface a reviewer actually looks
at, unverified and passing are the same colour. The filter is removed: every branch
that opens a PR is checked. Stacked work is exactly the work most worth checking,
because its base is not main.

A HANG RECORDED ITSELF AS "cancelled", NOT "failed". The Node 18 matrix job has run
past six hours twice while Node 22 finished in ~30s. With no job timeout it burns to
the platform ceiling; with cancel-in-progress unconditional, any later run supersedes
it first. So a persistent, reproducible break left a trail of cancelled runs that
reads as CI noise. timeout-minutes: 15 makes a hang fail fast and red, and
cancel-in-progress is now conditional: superseding a PR push is fine, superseding
`main` destroys the only record of whether the mainline is green.

fail-fast: false, so a Node 18 hang can no longer cancel the Node 22 job and take
the one working signal down with it.

workflow_dispatch, so `main` can be run on demand. Isolating "is this break mine or
the base's?" previously required pushing to main — precisely when you least want to.

NOT FIXED HERE, AND DELIBERATELY SO: whatever makes Node 18 hang. engines declares
node >=18 and the matrix tests it, so dropping it would be quietly narrowing a
supported range to make a board go green. This change makes the failure visible and
diagnosable in fifteen minutes instead of invisible for six hours; the diagnosis is
its own piece of work, and it needs a Node 18 environment to reproduce.

The first run of this workflow is expected to go RED on Node 18. That is the point.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SpDHL4kTRWvkuw63KADT6R
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