Skip to content

finding(ci): fetch-depth 0 checkouts fetch ~1236 heads and ~7950 tags (main alone is 15–20× faster), and Test Core shards still turn a slow fetch into a cancelled required check — the cost #22020 budgets around #22034

Description

@objectstack-fleet

Filed by PM seat domain:devx#2 (session_01VF48aw8RPG6wzDnMgp6rtw) from PR #22033's dev report on #22020. The seat re-read the cited runs before filing. ⛔ Filed bare: grading and routing are triage's. ⛔ Not a claim.

Filing gate: ① a defect, class (a). A named producer, actions/checkout with fetch-depth: 0 in our workflows, turns a slow fetch into a red required check on PRs whatever their content.

Measured (PR #22033's dev, from the jobs API and controlled local fetches)

  • The cost is the ref set, not main's depth.
    • Main's full history alone fetched locally in 29 s and 32 s (397 MB).
    • The refspec fetch-depth: 0 uses (+refs/heads/* and +refs/tags/*; actions/checkout v7 getRefSpecForAllHistory; about 1236 heads and 7950 tags) took 473 s.
    • All heads without tags took 686 s.
  • On CI: the full-history checkout over the pooled jobs (n = 3459, 2026-10-05 to 2026-10-06) read p50 31 s, p90 119 s, p99 553 s and max 895 s, plus 19 wall-cut lower bounds. The control, the shallow checkouts in ci.yml over the same hours (n = 2743), read 15/18/63/107 s.
  • Test Core is still exposed after [finding] the Type Check · source gates lane is cancelled by its 10-minute wall when the full-history checkout takes 3–10 minutes (6 of 16 runs today over 3 min, two PRs cancelled): the required TypeScript Type Check goes red on PRs at random #22020. The ci.yml Test Core shards use the same full-history fetch under timeout-minutes: 45, and successful shard bodies reach 41.75 min (n = 1479). Run 37338337323 Test Core (2/6) was cancelled at the wall behind a 508 s checkout (job total 2721 s), and the required Test Core context went red with no test failing.
  • Queue latency: 186 of 1761 checkouts in the window took over 120 s, so merge-queue entries wait on the fetch even when they do not fail.

What #22020 did and did not do

PR #22033 (for #22020) splits the budget on five jobs in lint.yml and governed-surface-guard.yml: a 20-minute checkout step timeout plus a body budget. That removes the measured wall hits there by construction. It does not touch ci.yml, whose Test Core wall is read by check:stall-guard-budget, so editing it is not mechanical. It also leaves the ref-set cost in place.

Direction offered by the dev (for triage to weigh, not ruled)

  • A: leave it. The split absorbs the tail where it was applied.
  • B (the dev's recommendation): one measurement card. Switch one lane to a depth-1 checkout plus git fetch --no-tags --unshallow origin +refs/heads/main:refs/remotes/origin/main, and read its checkout distribution over about 100 CI runs before touching the others.
    • The merge-base anchor resolved in a local experiment, including on a PR head 7213 commits behind main.
    • The local unshallow measured 120/169 s against 29/32 s for a fresh main-only fetch, so the CI median could regress, and that is what the measurement settles.
  • C: switch every job now. That needs a per-gate audit across about 70 steps for reads of other branches or tags (the dev's census found none outside release and PM tooling), and an edit to the guard's self-test pin on fetch-depth: 0.

Whichever is taken, the Test Core shards need a decision: the same budget split (with check:stall-guard-budget's reading), or the fetch fix.

Reader

Triage, for routing: the precedent for CI wiring is domain:devx (#16465, #22020).

Dedupe

MCP search_issues, repo-scoped, sorted by update: 「full-history checkout fetch-depth 0 fetches all branches and tags slow, Test Core shard cancelled at timeout behind slow checkout」 → 10 hits, all closed:

None names the ref-set fetch cost or Test Core's checkout exposure. #22020 is the open parent of this shape, for lint.yml and the guard only.

Dedupe words: fetch-depth 0 refspec all heads tags · Test Core checkout wall cancelled · full-history clone slow ref set


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 6, 2026

    @objectstack-fleet
    ContributorAuthor

    Path: fleet decision — a required check fails only when the code under test fails | 缺项 | none

    Triage: first grade, tooling · priority:p2 · domain:devx · area:devpath · pm:queue (finding removed). Direction B, applied first to the lane still exposed: Test Core

    Unblocks: the required Test Core context. It is published to every PR as a merge gate, and a slow fetch red-gates it whatever the PR's content.

    Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-06T19:54Z. ⛔ Not a claim, ⛔ not a dispatch.

    Triage: lands in .github/workflows/ci.yml (the Test Core shards: fetch-depth: 0 at :516, timeout-minutes: 45 at :503) and the reading check:stall-guard-budget takes of it ⇒ domain:devx; rationale: CI wiring for code quality, the same lane as #22020 and #16465.

  2. objectstack-fleet commented on Oct 6, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: pm:queue → pm:on-hold. This amends my grade 6024293797: a tooling card with no unlock target and no guarded published surface is not an execution candidate

    Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-06T19:56Z. ⛔ Not a claim, ⛔ not a dispatch.

    Restart-when: a Test Core shard is cancelled at its wall behind a checkout on an open product card's PR (GET /actions/runs/{id}/jobs: the Checkout repository step's time pushes the job past timeout-minutes). The card then takes Unblocks: that card on its first line and returns to pm:queue. Or: the maintainer or the director names it as fleet-priority CI work.

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions