Skip to content

ci: stop running every dev commit twice, and bound every job - #953

Draft
JustVugg wants to merge 1 commit into
devfrom
ci/dedupe-and-timeouts
Draft

ci: stop running every dev commit twice, and bound every job#953
JustVugg wants to merge 1 commit into
devfrom
ci/dedupe-and-timeouts

Conversation

@JustVugg

Copy link
Copy Markdown
Owner

Measured, on a single commit (33302b8): 36 jobs where 18 suffice.

CI     event=pull_request  -> 14 jobs
CI     event=push          -> 14 jobs   <- exact duplicate
check  event=pull_request  ->  4 jobs
check  event=push          ->  4 jobs   <- exact duplicate

Cause: the release PR is dev -> main, so its head is dev. With main listed under pull_request, every push to dev fired both events on the same SHA and ran the whole matrix twice. That is half the project's CI wall-clock, and it is also why release PRs show every check name doubled.

Dropping main from the PR trigger costs nothing: check runs attach to the SHA, so the release PR still displays the push run's results. main's ruleset requires a review, not status checks, so nothing merge-gating is lost — and a PR mistargeted at main now visibly gets no CI, which is exactly the signal that it needs retargeting to dev.

Two more gaps, both things check.yml has had all along and ci.yml never did:

  • concurrency + cancel-in-progress — superseded runs were never cancelled; they ran to completion burning slots nobody was waiting on.
  • timeout-minutes on all 12 jobsci: run Metal backend tests on macOS #947's macOS job hung after its step failed and held one of the five macOS runner slots for ~50 minutes, queueing every other PR behind it. Budgets (15–30) are hang backstops against a measured worst case of ~10 min, not targets.

No check is removed and no job's content changes. The same work runs, once instead of twice, with an upper bound.

Held for the maintainer's go-ahead until after the v1.6.0 tag — release.yml is a separate file and is untouched either way.

🤖 Generated with Claude Code

Measured on one commit (33302b8): 36 jobs where 18 suffice.

    CI     event=pull_request  -> 14 jobs
    CI     event=push          -> 14 jobs   <- exact duplicate
    check  event=pull_request  ->  4 jobs
    check  event=push          ->  4 jobs   <- exact duplicate

Cause: the release PR is dev->main, so its head IS dev. Listing `main`
under `pull_request` meant every push to dev fired both events on the
same SHA and ran the whole matrix twice -- doubling runner load, and
filling release PRs with doubled check names. Dropping `main` from the
PR trigger fixes it without losing visibility: check runs attach to the
SHA, so the release PR still shows the push run's results. main's
ruleset requires a review, not status checks, so nothing merge-gating
is lost -- and a PR mistargeted at main now visibly gets no CI, which
is the signal it needs retargeting to dev.

Two more gaps this closes, both absent from ci.yml while check.yml has
had them all along:

- concurrency with cancel-in-progress: superseded runs were never
  cancelled and kept burning slots to completion.
- timeout-minutes on all 12 jobs: #947's macOS job hung after its step
  failed and held one of the five macOS slots for ~50 minutes, slowing
  every other PR's queue. Budgets are hang backstops (15-30) against a
  measured worst case of ~10 minutes, not targets.

No check is removed and no job's content changes: the same work runs,
once instead of twice, with an upper bound.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@JustVugg
JustVugg marked this pull request as draft August 11, 2026 22:44
@JustVugg

Copy link
Copy Markdown
Owner Author

Parked as draft at the maintainer's call — the CI is fine as it is for now. The findings stay recorded here for whenever it's worth picking up: 36 jobs per dev commit where 18 suffice (the release PR's head is dev, so push and pull_request both fire on one SHA), no concurrency on ci.yml, and no timeout-minutes on any of its 12 jobs.

BColsey pushed a commit to BColsey/colibri that referenced this pull request Aug 18, 2026
…gg#1081)

Every tiny-oracle job ran on x86, so NEON branches were never compiled,
let alone executed — which is how the olmoe (JustVugg#1044) / qwen36 (JustVugg#712
review) / inkling (JustVugg#1080) IDOT class shipped undetected.

Two additions:

1. tests/test_int_kernel_exact.c — integer kernels have no rounding
   excuse: against a pure-C reference on the same inputs they must match
   bit for bit on every ISA. Covers dot_i4i8 (pair int4xint8),
   planarize_i4 round-trip, dot_i4p_u (K1 plane layout, the -8*sum(x)
   identity), and matmul_i4p_idot vs matmul_i4_idot bitwise. The test
   encodes the real activation contract: qrow_i8 clamps to [-127,127],
   and -128 must never reach the kernels (the abs/sign VNNI trick cannot
   represent its negation) — the first draft generated full-range int8
   and produced 30 false failures against the SHIPPED kernel, which is
   the contract documenting itself.

2. An ubuntu-24.04-arm job (timeout-bounded per JustVugg#953's direction):
   builds every engine (NEON compile coverage — K1's dot_i4p_u NEON
   branch had never been compiled by anyone), runs the exactness gate
   with the NEON branches live, and replays the glm_tiny teacher-forcing
   oracle against a fixture generated on the same runner (same-machine
   torch reference, no cross-ISA float excuses).

The x86 efficiency job also runs the exactness gate, so both ISAs hold
the same bar. deepseek-v4 tiny-check on ARM is follow-up (its ARCH
plumbing needs checking for aarch64 first).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
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.

1 participant