Skip to content

ci(id): every main run builds the pkgs/id checks twice — the PR-tier matrix and the full flake check both run on push/schedule since the main-only trigger change #3045

Open

Description

@dezren39

ci(id): every main run builds the pkgs/id checks twice — the PR-tier matrix and the full flake check both run on push/schedule since the main-only trigger change

Evidence (main 0f84fe08, verified this run)

.github/workflows/id-check.yml has had no pull_request trigger since 814c5146 ("ci: main-only workflow triggers, cancel-in-progress everywhere", 2026-10-30, Drew's main-only order). Its on: block (id-check.yml:44-58) is now: push to main (paths pkgs/id/** + the workflow/guard files), a nightly schedule (41 8 * * *), and workflow_dispatch. But the job graph still contains BOTH tiers, and nothing gates either one off for push/schedule events:

  • PR tier: guard ("basic: guard PR check list") → check_each, a matrix over the 26 checks in .github/scripts/id-pr-checks.txt → the check aggregator ("nix flake check"). No if: on guard or check_each.
  • Main tier: full-flake-check ("full (main tier): nix flake check"), whose only gate is if: github.event_name != 'pull_request' — a dead condition, since the workflow can no longer receive that event. It has no needs: on the matrix, so it starts in parallel and cannot reuse the matrix jobs' cache uploads from the same run.

The matrix set is a subset of the full check by construction: the guard script check-id-pr-checks.sh exists to keep id-pr-checks.txt in sync with pkgs/id/flake.nix's checks (every flake check is either listed or explicitly excluded as heavy), and the workflow's own comment on full-flake-check says the full check is the PR set "including the heavy checks the PR list excludes". So every push-to-main run — and every nightly schedule run — builds each of the 26 fast derivations twice: once as its own matrix job, once inside the full flake check.

Live confirmation: run 41183833194 (push, 2026-10-31T08:15Z) — the jobs API shows, in one run, basic: guard PR check list, all 26 basic: nix flake check (<name>) matrix jobs, and full (main tier): nix flake check (28 jobs at query time; the aggregator is created once the matrix completes, for 29). The 2026-10-31 nightly main-broken report (#3038) likewise names both a basic: matrix failure and the full nix flake check failure from the same tree.

The docs still describe the pre-814c5146 world: the workflow header says it "Runs on push to main and PRs that touch pkgs/id/ files", the concurrency comment explains how "Pull-request runs keep sharing a per-ref group", and .github/ci-policy.md's table still lists the id PR tier as "guard + affected-crate matrix (id-pr-checks.txt)" — a tier that can never run on a PR again.

Why it matters

The matrix split (#869) and the PR-tier slimming (#1781) existed to stop paying for the same derivations repeatedly; the main-only trigger change silently reintroduced the duplication on the one event that now fires most — every merge to main that touches pkgs/id. That is ~26 extra Nix builds per merge (plus the guard and aggregator jobs), competing for the same runner pool the fleet already queues on (#1599), and doubling the surface for flaky-check noise on main (a matrix flake and the same check inside the full run can disagree, producing two differently-named failures for one tree, as #3038 shows). This is not a request to restore PR triggers — the main-only order stands — it is about making the job graph match it.

Acceptance criteria

  • A push-to-main (and schedule) run of the id workflow builds each pkgs/id check derivation at most once: e.g. the PR-tier jobs (guard/check_each/check) are removed or gated off for push/schedule, OR full-flake-check is restructured so it no longer re-runs the matrix set — with the chosen shape recorded in the workflow header.
  • The drift guards (check-id-pr-checks.sh, check-crash-gate-coverage.sh) still run exactly once per main run, in whichever job survives.
  • The dead github.event_name != 'pull_request' condition on full-flake-check is resolved, and the workflow header comment + .github/ci-policy.md's id row describe the main-only reality (no PR tier that cannot fire).
  • Evidence on the closing PR: the job list of a post-change push run, showing no check name appearing in both a matrix job and the full-tier job.

Distinct from: #3039 (host-eval job not a required check in nix-ci), #2936 / #1579 (pm-stack paths with no PR CI at all), #1780/#1781 (the original tier design, closed), #1599 (runner queueing — this issue reduces load, it is not the queueing bug).

Activity

  1. added
    kind/ciCI/CD pipelines, workflows, and build automation
    task/triageQueue packet kind: verify, reproduce, and route this item
    source/creatorFiled by the new-issue-creator job
    priority/normalOrdinary priority (the default)
    queue/queuedHas a queued task in the Supabase agent queue
    app/idPackage/app: id (pkgs/ or apps/ in this repo)
    effort/sSmall: expected under 2 hours of work
    on Oct 31, 2026
  2. dezren39 commented on Oct 31, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · filed

  3. dezren39 commented on Oct 31, 2026

    @dezren39
    MemberAuthor

    Related-but-distinct sibling found while deduping this run (same creator run, 2026-10-31): .github/workflows/mcpx-conformance.yml also carries dead github.event_name != 'pull_request' conditions (jobs leg and records) and a comment claiming the spec-parity job "stays on PRs", but that workflow's on: block has no pull_request trigger either (push + workflow_dispatch only). No duplicated builds there — the jobs are distinct — so it is only stale conditions/comments, not part of this issue's fix; noted here so the sweep that fixes #3045 can sweep the wording in passing if it wishes. mcpx.yml itself is NOT affected: it deliberately re-added a pull_request trigger after 814c514 (see its header comment, #1966/#1973), so its event conditions are live.

  4. added
    work/assignedQueue worker lifecycle state
    queue/claimedQueue worker lifecycle state
    and removed
    queue/queuedHas a queued task in the Supabase agent queue
    on Nov 1, 2026
  5. 68 remaining items

  6. added
    status/parkedDeliberately paused with a recorded resume condition
    queue/claimedQueue worker lifecycle state
    and removed
    status/parkedDeliberately paused with a recorded resume condition
    queue/parkedQueue task is parked (waiting on CI, time, or an event)
    on Nov 4, 2026
  7. dezren39 commented on Nov 4, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · picked up (resume)

  8. added
    queue/parkedQueue task is parked (waiting on CI, time, or an event)
    status/parkedDeliberately paused with a recorded resume condition
    and removed
    queue/claimedQueue worker lifecycle state
    on Nov 4, 2026
  9. dezren39 commented on Nov 4, 2026

    @dezren39
    MemberAuthor
  10. added
    queue/queuedHas a queued task in the Supabase agent queue
    and removed
    work/assignedQueue worker lifecycle state
    on Nov 5, 2026
  11. dezren39 commented on Nov 5, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · handed off

    • Agent: fleet monitor
    • Session / ID: task 8006 (repo-fleet-monitor run 2026-11-05T15:45:47Z)
    • Found via: monitor reconciliation (Duty 1 claim/label divergence repair)
    • Task: Claim evaporated: task 8006 is queued and unclaimed in repo-health-code-pilot, but this issue still carried claimed labels. Labels reset to the truth (queue/queued + status/needs-triage). Checkpoint stage at evaporation: handed_off.
    • Expectation: The next lane claim picks task 8006 up from the queued state and posts a fresh pickup note.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

app/idPackage/app: id (pkgs/ or apps/ in this repo)effort/sSmall: expected under 2 hours of workkind/ciCI/CD pipelines, workflows, and build automationpriority/normalOrdinary priority (the default)queue/parkedQueue task is parked (waiting on CI, time, or an event)queue/queuedHas a queued task in the Supabase agent queuesource/creatorFiled by the new-issue-creator jobstatus/needs-triageNot yet triaged; needs a first lookstatus/parkedDeliberately paused with a recorded resume conditiontask/triageQueue packet kind: verify, reproduce, and route this item

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions