Skip to content

Give the CI test job a version-free name with no matrix - #31

Merged
JoshuaJewell merged 4 commits into
JoshuaJewell:mainfrom
hyperpolymath:fix/ci-version-stable-check
Oct 14, 2026
Merged

JoshuaJewell merged 4 commits into
JoshuaJewell:mainfrom
hyperpolymath:fix/ci-version-stable-check

Conversation

@hyperpolymath

Copy link
Copy Markdown
Contributor

What

CONTRIBUTING says "CI job names carry no version numbers, so that a pin change leaves required status checks intact". The test job is currently named Julia ${{ matrix.julia-version }} / ${{ matrix.os }} and posts as Julia 1.12.5 / ubuntu-24.04, so bumping the Julia pin renames the check.

The job is now named Julia tests and has no matrix. Both are needed: GitHub appends the matrix combination to any job name that does not reference the matrix, so a 1×1 matrix under a static name still posts Julia tests (1.12.5, ubuntu-24.04). This was measured on the fork (hyperpolymath#39, where the commit text's "#39" refers to that fork PR). The matrix selected exactly one combination, so the Julia version and runner become literals, each keeping its reasoning.

test_install_pins.jl now asserts, for every job, that the name interpolates nothing and that the job has no strategy.matrix. Against the previous commit that assertion fails on test alone. CONTRIBUTING's line about the pin being repeated "in the CI matrix" now says "in the CI workflow".

Heads-up

The posted check name changes from Julia 1.12.5 / ubuntu-24.04 to Julia tests. main currently has no required status checks, so nothing deadlocks. If you later make it required, use Julia tests.

How to test

julia --project=. test/runtests.jl install_pins

Locally: 206/206. This PR's own CI run shows the new name.

Found in a read-only review of main @ 257bcde. Tested locally with Julia 1.12.6 (CI pins 1.12.5) and R 4.5.0 (vegan 2.7-3, MASS 7.3-65), Debian 13 (WSL2).

🤖 Generated with Claude Code

hyperpolymath and others added 4 commits October 5, 2026 23:21
Closes #38.

The `test` job was named `Julia ${{ matrix.julia-version }} / ${{ matrix.os }}`,
and that string is what branch ruleset 23793298 requires as a status check.

A ruleset matches a required check by display name. Bumping either pin renamed
the check, and a renamed check does not report at all -- it does not fail, it is
simply absent, and an absent required check can never be satisfied. Every open
pull request would have deadlocked until an admin bypassed the rule. The trigger
was an ordinary version bump: the single most routine edit this repository gets.

Both halves of the name interpolated, so the OS pin carried the same fault as
the Julia pin.

Measured, by parsing three hypothetical bumps through both versions of the file:

  matrix                    before                        after
  1.12.5 / ubuntu-24.04     "Julia 1.12.5 / ubuntu-24.04" "Julia tests"
  1.12.6 / ubuntu-24.04     "Julia 1.12.6 / ubuntu-24.04" "Julia tests"
  1.13.0 / ubuntu-26.04     "Julia 1.13.0 / ubuntu-26.04" "Julia tests"

The versions are not hidden, only moved off the identifier: they remain in
`strategy.matrix` and in the `Set up Julia` step's log.

`test/unit/test_install_pins.jl` gains a reflexive testset asserting that NO job
name in ci.yml interpolates anything. It is written over every job rather than
over the one job we require today, because a rule enforced at each door in turn
is a rule the next door escapes. Verified by killing the mutant: against the
unedited ci.yml the assertion fails on exactly one job of three (97 pass /
1 fail), and passes 98/98 after the rename.

The job ID `test` is unchanged, so `needs: [test]` and the existing
`ci["jobs"]["test"]` assertions are untouched.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X3hgXxWm6umMgZkjYyHnnm
(cherry picked from commit 8a098d2)
#39 renamed this job to `Julia tests` and claimed the required status check
was therefore version-stable. It was not, and the claim was never measured.

MEASURED on PR #39 head 776e340, after that change had landed:

    Julia tests (1.12.5, ubuntu-24.04)   <- what GitHub actually posted
    Julia tests                          <- what the ruleset requires

GitHub appends the matrix combination to a job's posted check name whenever
the `name:` does not itself reference the matrix. The old interpolating name
suppressed the suffix by accident; replacing it with a static string turned
the suffix on. A 1x1 matrix is still a matrix, so both pins stayed embedded
in the check name and the required context `Julia tests` was never reported
at all -- so `main` has been sitting in precisely the deadlock issue #38
describes, with #39 itself merged only by an admin bypass.

The matrix selected exactly one combination and bought nothing, so it is
removed rather than worked around: `runs-on: ubuntu-24.04` and the
setup-julia `version: "1.12.5"` are literals, each keeping the reasoning
that used to sit beside the matrix entry. The non-matrix `repo-hygiene` job
was the control -- it has always posted its `name:` verbatim.

Why the guard did not catch it: `test_install_pins.jl` asserted that no job
name interpolates anything -- a property of the YAML `name:` field -- while
the consumer, the ruleset, matches the rendered check-run name. The guard
asked a different question than its consumer, so it passed on a broken fix.
It now asserts BOTH necessary conditions, over every job in the file: the
name interpolates nothing AND the job has no `strategy.matrix`. Run against
the previous commit that assertion fails on `test` alone (5 pass / 1 fail),
so it discriminates rather than blanket-failing.

`CI installs what is pinned` made the same claims about the same two values
and has been repointed at where they now live, locating the setup step by
its `uses:` rather than by index. Mutating either literal fails it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X3hgXxWm6umMgZkjYyHnnm
(cherry picked from commit 6c29b53)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@codecov

codecov Bot commented Oct 5, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

JoshuaJewell pushed a commit that referenced this pull request Oct 9, 2026
`_read_databases` and `_read_primers` both answer `json_error(400, ...)`: the
route's own verdict that a malformed `config/databases.yml` or `config/primers.yml`
is an operator-fixable input, not a server fault. Logging that at `@error` with a
full backtrace reports a routine bad file as if the server had crashed, and the
backtrace pointed into YAML.jl's parser rather than at the offending line, so it
carried no diagnostic value either.

The reason string is kept -- `reason=sprint(showerror, e)` is what actually names
the YAML defect. Only the backtrace goes.

Deliberately NOT changed: the three 500-class sites, which stay at `@error` with
their backtraces --

  src/server/routes/analysis_config.jl:144
  src/server/routes/annotations.jl:318
  src/server/routes/composition.jl:370

A 500 is the route saying it did not expect this, and there the backtrace is the
only thing separating a data problem from a code bug. Dropping it would be muting
a diagnostic rather than fixing one. `analysis_config.jl` already draws this line
itself: its `ArgumentError` branch returns 400 with no logging at all, while
everything else logs at `@error` and returns 500.

`src/server/routes/pipeline.jl:520` is untouched -- it is the silent-degradation
shape tracked in #31, not a severity question.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X3hgXxWm6umMgZkjYyHnnm
(cherry picked from commit e2147d5)
@JoshuaJewell
JoshuaJewell merged commit 9d888f1 into JoshuaJewell:main Oct 14, 2026
2 checks passed
@JoshuaJewell
JoshuaJewell deleted the fix/ci-version-stable-check branch October 14, 2026 01:25
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.

2 participants