Skip to content

The ESLint required context carries ~54 check:* gates, so every one of their failures mis-routes its own diagnosis — and the rename needs a Settings change no agent seat can make #9325

Description

@os-project-manager

Filed unassigned by the dev seat working #9258 (PR #9323). ⛔ Not fixed there: the card that sent me explicitly said to stop and report if the second item turned out to need a workflow restructure, and it needs strictly more than that.

The defect

lint.yml's lint job is named ESLint and runs ~54 sequential pnpm check:* steps. Any one of them failing publishes one failing check named ESLint on a PR whose diff may have nothing to do with linting. Whoever meets it has to open the log, discover the job runs a long gate chain, scroll to the failing step, and only then decide whether it is theirs.

That cost was paid three times on 2026-08-17 alone, all recorded on #9258: a crash inside check:merge-driver presented as a red ESLint on PRs #9256 and #9291 (plus the original filing), and the PM seat re-derived the routing each time because "flaky" is not a diagnosis worth asserting without confirming the failing step is the same one.

The compounding harm is the one that matters: a check whose name does not describe what it verifies trains readers to re-run on red, which is how a genuine regression in this gate family gets waved through. #5617 is the same family's worked precedent from the other direction.

Why it is not a one-line rename

scripts/check-required-contexts.mjs pins the job name: literals as contract, and ESLint is a registered entry:

{
  workflow: 'lint.yml',
  job: 'lint',
  context: 'ESLint',
  authorized: '#5617 maintainer ruling 2026-08-07 — applied to the settings the same day',
  carries: 'the whole check:* gate family — the job whose red did not block #5584',
}

A GitHub required status check is matched by check-run name, and a job's check-run name is its name:. So the rename has two halves that cannot land atomically:

  1. repo-side — the name: in lint.yml plus the registry literal here;
  2. settings-side — the required-context entry in repository Settings → Rulesets.

Either order leaves a window. Rename first and the old context sits permanently pending, which wedges every open PR and the merge queue. Change the settings first and the job carrying ~54 gates degrades to advisory with no signal anywhere — that is #5617 verbatim (PR #5584 merged with this job red for 19 minutes; four more merges repeated it that night before the settings were fixed on 2026-08-07).

⚠️ And the settings half is not reachable from an agent seat. check-required-contexts.mjs already records this as measured (#6865): GET /repos/objectstack-ai/objectstack/branches/main/protection answers HTTP 403 GitHub access is not enabled for this session. Re-confirmed on this runner today — that call still 403s and there is no gh CLI installed either.

⇒ This needs a maintainer, and it needs the two halves sequenced by someone who can see both. That is why it is a card and not a rider.

Shapes worth considering (none decided)

  • Rename the context to something that names the family, e.g. Lint and repo gates, coordinated across the registry and Settings in one sitting. Cheapest to read afterwards; needs the maintainer window above.
  • Split the job so the gate families report as separate contexts. Best diagnosability, biggest change, and it multiplies the required-context set (each new one is a new Settings entry and a new permanently-pending risk).
  • Leave the name and surface the failing step, e.g. an if: failure() step writing the failed step's name into $GITHUB_STEP_SUMMARY. Needs an id: on every step it wants to report on, which is ~54 edits to one file and still does not fix the name on the PR checks list.

⛔ I did not measure the relative cost of these; ranking them is triage, not this filing.

Re-check commands

grep -n "name: ESLint" .github/workflows/lint.yml
grep -c "pnpm check:" .github/workflows/lint.yml
node scripts/check-required-contexts.mjs

Refs: #9258 (the bug whose diagnosis this mis-routed, three times), PR #9323 (its fix), #5617 (the precedent for what a mis-sequenced rename costs), #6865 (the 403 measurement).

Activity

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

Metadata

Metadata

Assignees

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions