Skip to content

CI gates less than it appears to: one required check, and stacked PRs run none #126

Description

@blooop

Question

CI gates less than it looks like it does. Two independent holes, both found while
wiring the e2e suite into CI.

1. Only ci (py313) is a required check

main's ruleset requires exactly one context: ci (py313). Everything else —
prek, the other three interpreter jobs, and the new e2e job from
#114 — is advisory. A red e2e
job does not block a merge.

So the work that made the e2e suite trustworthy buys nothing at the gate until
this changes. That is the whole point of putting it in CI, and it is one ruleset
edit away.

Decide which contexts should be required. Not automatically all of them:
a required check that is flaky or slow blocks merges for reasons unrelated to the
change, which is its own failure mode. e2e measures 37s against the matrix's
42–52s, so on today's numbers it is cheap enough to require — but that is a
judgement, and it should be made rather than defaulted into.

2. A pull request onto a non-main base runs no CI at all

.github/workflows/ci.yml has on.pull_request.branches: [main]. That filter is
on the base branch, so a PR targeting anything else never triggers it.

This repo produces stacked PRs — there is a /stack workflow whose entire purpose
is chains of PRs where each targets its predecessor rather than main. Every link
in such a chain except the last currently merges with zero CI.

This is repo-wide and predates every ticket on this map; the e2e work only made it
visible. Note the interaction with hole 1: a required check that never runs is not
"pending", it is absent — and GitHub's behaviour there is worth confirming
rather than assuming, because "required but never triggered" is exactly the state
that silently blocks or silently passes depending on configuration.

Both are described in this repo's own terms in
PR #123's review.

This is a wayfinder:build ticket: go through /tdd.

Test-first, and mind what "test" means for a ruleset. The workflow change is
testable — a PR onto a non-main base must trigger CI, and demonstrating that
means actually opening one, not reading YAML. The ruleset change is a repo
setting, not code: that half needs human hands (gh api against branch
protection is possible but is an outward-facing configuration change to the
repository, not a code change). Park that half with a clear statement of what to
set and why, rather than flipping it.

Relation to the map. Not about developing in a devcontainer at all. It is here
because this map's work surfaced it and because
#114's deliverable is inert
without it — a CI job nobody is required to pass is a job that will rot.

Activity

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

Metadata

Metadata

Assignees

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions