Skip to content

main is red: #9813 landed with stale ciRequiredContextsKey expectations and an unsynced config template #9828

Description

@JSONbored

Problem

main CI has been failing since #9813 (gate.ignoredCheckRuns) merged. The last four ci.yml runs on
main are all failure, and every PR branched from or merged with main since inherits it — #9804 went
red on exactly these tests with no changes of its own in that area.

Six test failures across three files, all direct consequences of #9813:

1. fetchLiveCiAggregate / fetchLiveCiAggregatePreferGraphQl gained an eighth parameter
(ignoredCheckRuns), but three toHaveBeenCalledWith assertions still pass seven:

  • test/unit/agent-approval-queue.test.ts — "threads the repo's expectedCiContexts into the accept-time
    live CI re-check", "unions branch-protection contexts into the accept-time live CI re-check", "falls back
    to expectedCiContexts when the accept-time branch-protection read fails"
  • test/unit/queue.test.ts — "surfaces stale optional CI after the stale-CI cap"

2. The durable cache key gained an |ign: segment. src/queue/ci-resolution.ts now builds
...|adv:${...}|ign:${...}, but test/unit/queue.test.ts's durable-cache regression still expects
|adv: alone.

3. config/examples/loopover.full.yml was not synced. #9813 added the whole ignoredCheckRuns block
(19 lines of comment + key) to .loopover.yml.example but not to loopover.full.yml, and
test/unit/config-templates.test.ts requires the two byte-identical from # WHERE IT LIVES onward.

Why it matters beyond the red build

Per the gate's disposition matrix, red CI auto-CLOSES a contributor PR. A contributor who opened a PR after
#9813 landed gets closed for a defect that is not theirs and that they cannot fix. This is the same class of
harm #9798 and #9801 describe — a CI signal that corresponds to no real problem in the PR — except this one
does not self-correct.

Fix

Update the three assertions to the real arity, the cache-key expectation to |adv:|ign:, and sync
loopover.full.yml's tail from .loopover.yml.example. All three are test/fixture corrections; no
production behaviour changes, because #9813's implementation is correct — only the expectations were left
behind.

Follow-up worth considering

config-templates.test.ts catches template divergence but only after merge. The two files are required to be
byte-identical from a fixed marker onward, which is a generation relationship expressed as an assertion —
loopover.full.yml's tail could be generated from .loopover.yml.example by a :write/:check pair like
the ones this repo already uses elsewhere (replay-runner-image-manifest, gen-contract-api-schemas), so
the two cannot drift in the first place.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions