Skip to content

Commit e20c60d

Browse files
ci(lint): raise the full-history checkout budget from 20 to 25 minutes (#31329)
<!-- claude-projects-attribution: {"github_login":"os-project-manager"} --> _Requested by **Leehom** · [project thread](https://claude.ai/code/project/chan_01TenzsRopZj4jMbvjX8uz1X?thread=cmsg_01TenzsRopZj4jMbvjX8uz1X3gvtau3kCm13KgYaNh4GAp)_ domain:devx#3 · os-project-manager · session_01FEkQ5p2YmYq6pWdeNjsmB1 Refs #22034 (step 1 of the ruling; step 2, narrowing the fetch, stays on the card) Clause-②: no Metadata-protocol: none ## 维护者速读 - 改了什么:`.github/workflows/lint.yml` 里 12 个全历史 checkout 步骤中的 11 个,步骤超时从 20 分钟提到 25 分钟;对应 job 的 `timeout-minutes` 各加 5 分钟(墙 = checkout 预算 + body 预算,body 预算一个都没动),并改写 `typecheck-source-gates` 里论证这个数字的注释。`typecheck-workspace` 保持 20(见下)。 - 为什么改:#22034 裁决第 1 步(triage 6715813320,你 2026-11-08T01:48Z「同意」)。#29980 的事故回放:单次 checkout 在 20 分钟失败 1.51%,25 分钟失败 0.42%;健康期最慢 checkout 435 秒,不付代价。 - 风险与回滚:只改超时数字和注释,不改 `run:`、fetch 深度、job 图;最坏情况是平台变慢时一条 lane 多等 5 分钟才红。所有 lane 的墙仍 ≤ 55 分钟上限。回滚即还原本 PR。 - 先看:`typecheck-source-gates` 的 CHECKOUT BUDGET 注释(约 4843–4854 行);`typecheck-workspace` 的墙注释与 checkout 注释(约 5520–5537 行);`lint-pm-dispatch-gates` 的墙(约 4673–4679 行,现在正好贴着 55 上限)。 - 两分钟验证:`git diff origin/main -- .github/workflows/lint.yml | grep '^[-+] *timeout-minutes'`,预期 11 行 `20 → 25` 的步骤超时,加 11 个 job 墙各 +5;`typecheck-workspace` 不在其中。 - 需要你做的:受管面 Tier H(`.github/workflows/**`):由你合并或入队,或授权账号 APPROVED 后由席位落地;另外请定一下 `typecheck-workspace` 是否维持 20(推荐维持,理由见 Acceptance notes)。 ## What changes `.github/workflows/lint.yml` only. Every changed line is a `timeout-minutes` value or the comment that sizes it; no `run:`, `fetch-depth`, `needs:` or `if:` changes. Per job, the arithmetic (JOB WALL = CHECKOUT BUDGET + BODY BUDGET; every body budget is unchanged): | job | checkout step | job wall | arithmetic | |:--|--:|--:|:--| | `lint-eslint` | 20 → 25 | 30 → 35 | 25 + 10 = 35 | | `lint-repo-tooling` | 20 → 25 | 30 → 35 | 25 + 10 = 35 | | `lint-docs-code` | 20 → 25 | 30 → 35 | 25 + 10 = 35 | | `lint-ci-engine` | 20 → 25 | 30 → 35 | 25 + 10 = 35 | | `lint-scoped-erasure` | 20 → 25 | 30 → 35 | 25 + 10 = 35 | | `lint-scoped-slot-corpus` | 20 → 25 | 30 → 35 | 25 + 10 = 35 | | `lint-scoped-tooling` | 20 → 25 | 30 → 35 | 25 + 10 = 35 | | `lint-pm-dispatch-gates` | 20 → 25 | 50 → 55 | 25 + 30 = 55, at the cap | | `typecheck-source-gates` | 20 → 25 | 30 → 35 | 25 + 10 = 35 | | `typecheck-workspace` | 20 (held) | 55 (held) | 20 + 35 = 55, at the cap | | `typecheck-debt` | 20 → 25 | 35 → 40 | 25 + 15 = 40 | | `typecheck-consumers` | 20 → 25 | 45 → 50 | 25 + 25 = 50 | The table was read back from a YAML parse of the file on head and on base `cba7d8ae` (job `timeout-minutes` minus the `Checkout repository` step's `timeout-minutes`): every body budget is the same number before and after. Comments: - `typecheck-source-gates`, which argues the scheme for the whole file: the scheme line reads 25; the CHECKOUT BUDGET paragraph now gives the #29980 replay (1.51% at 20 minutes, 0.42% at 25, a bound plus retry inside the same total gains nothing, healthy max 435 s over 3,576 checkouts after the incident) and names `typecheck-workspace` as the one exception; the "what the aggregate reads" bullets read 25 and 35. - Each JOB WALL comment reads `CHECKOUT BUDGET (25)` and its new sum. - `typecheck-workspace`: its wall comment and its checkout-step comment say this lane alone stays at 20, and why. ## Tests None owed: workflow configuration and comments only. No test pins these numbers, and os-dev.md does not ablate a workflow change. ## Acceptance notes - **`typecheck-workspace` is held at 20 (needs the maintainer's word).** The order reads "every checkout step that carries that budget", and "if a job's `timeout-minutes` is that sum, raise it by the same 5 minutes". For this lane that is 25 + 35 = 60, which breaks the cap the `lint` job argues for every job in the file ("55 stays the CAP every job in this file sits under": the queue removes an entry whose required check has not reported in 60 minutes, and a job's clock starts only after a runner picks it up). The measurement the ruling cites was taken for 11 lanes, not 12: #29980's dev report 6674602390, option B, reads "raise the single-attempt CHECKOUT BUDGET from 20 to 25 on the 11 lint.yml lanes whose wall has room (every lane but typecheck-workspace, which is held at 20 by the 55 cap: 20 + 35)". This PR ships that reading. The alternatives are in the report's `open_questions`: shrink this lane's body budget 35 → 30 (needs a fresh body window, which the file's rule asks for before any value moves), or lift its wall to 60 (breaks the cap). - **`lint-pm-dispatch-gates` now sits at the 55 cap** (25 + 30). Its body budget is unchanged. - **The governed-surface guard keeps 20.** `.github/workflows/governed-surface-guard.yml` carries the same budget on its queue-leg checkout (`timeout-minutes: 20` under "CHECKOUT BUDGET: lint.yml's `typecheck-source-gates` sizes it", wall 20 + 10 = 30). The order keeps every other workflow file untouched, so it stays at 20. After this PR that step comment points at a paragraph that now argues 25 for lint.yml and names only `typecheck-workspace` as the exception; the guard's number is not wrong, but its pointer reads looser than it did. Noted for #22034 step 2, which touches the guard's fetch anyway; not edited here. - **Readers of these numbers.** `git grep` on `origin/main` `cba7d8ae` for `CHECKOUT BUDGET` outside lint.yml hits only `governed-surface-guard.yml`. The scripts that read `timeout-minutes` (`check-stall-guard-budget.mjs`, `measure-stall-guard-headroom.mjs`, `check-shard-attestation.mjs`, `check-workflow-context-availability.mjs`) read stall-guarded steps, shard jobs or expression contexts; none reads a lint.yml checkout budget or job wall, and all of them ran green below. No pin moves. - **Root `ci.yml` and `ui/.github/**` are untouched** (out of bounds for this lane). The Test Core and Test UI full-history checkouts there carry no step budget; they are #22034 step 2. ## Verification Gate union derived by `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` (42 families for this diff), run on head `6f977132`, each exit code captured before any pipe: - **42 run, exit 0 each.** `--ran` with the codes recorded: "42 derived famil(ies) accounted for — 42 run, 0 NOT-MEASURED (a DERIVED zero — all 42 recorded an exit code and none of them is 3)". - One family needed a second run: `node scripts/check-self-test-workflow-commands.mjs` first exited 1 with "REFUSED — scripts/check-adr-0087-registration.mjs --self-test could not be run: spawnSync node ETIMEDOUT", while `check:pm-dispatch-gates` (519 s) and `check:type-check-debt` (641 s under the verify lock) loaded the box. Rerun alone on the same head: exit 0, 251 self-tests scanned. A load timeout, not a reading of this diff. - `pnpm check:type-check-debt` under `scripts/pm/os-verify-lock.sh`: "VERDICT command-exit 0 · held the lock 641s". - `pnpm check:pm-dispatch-gates`: exit 0, "2174 cases pass" (fast tier). - Outside the derivation: `node scripts/check-issue-citations.mjs` exit 0 ("no issue citations added against cba7d8a"); `node scripts/pm/check-governed-merges.mjs --branch claude/project-thread-5jkily` exit 3 (GOVERNED, expected): ```text governed-surface predicate: 1 of 1 path(s) hit the register (13 surfaces govern objectstack). ⛔ GOVERNED — a human merge is the review record for this PR (#9495 regime). ⚖️ landing tier: H(人合) — the maintainer's hand, or an authorized APPROVED review (GOVERNED_APPROVERS) and then the owning seat lands it. .github/workflows/** ×1 — CI, deploy and release workflows: what runs on every push, what deploys, what gates the queue - .github/workflows/lint.yml ⚠️ head repo: NOT MEASURED — this verdict cannot tell a fork PR from an internal one; `--pr N` reads it. size: 120 changed line(s) (+65 / -55) ≤ 3000 — under the human-merge threshold (generated files included in the count). ``` - `node scripts/pm/dispatch-gates.mjs --tier`: "no path-derived mandate: the surface hits none of the 4 declared glob(s)". - `pnpm lint`: the diff touches no package, so there is no scoped package lint; eslint does not read workflow YAML. - CI families are read from this PR's check-runs, not re-run here. `skip-changeset`: a workflow file, published by no package. --- _Generated by [Claude Code](https://claude.ai/code/session_01FEkQ5p2YmYq6pWdeNjsmB1)_ Co-authored-by: Claude <noreply@anthropic.com>
1 parent f88ca70 commit e20c60d

1 file changed

Lines changed: 65 additions & 55 deletions

File tree

‎.github/workflows/lint.yml‎

Lines changed: 65 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -511,11 +511,11 @@ jobs:
511511
needs: [schedule-gate]
512512
if: ${{ !cancelled() && needs.schedule-gate.outputs.skip != 'true' }}
513513
runs-on: ubuntu-latest
514-
# JOB WALL = CHECKOUT BUDGET (20, on the checkout step) + BODY BUDGET, the
514+
# JOB WALL = CHECKOUT BUDGET (25, on the checkout step) + BODY BUDGET, the
515515
# scheme `typecheck-source-gates` argues for a full-history checkout. Body
516516
# after the checkout, rebuilt per run from the 70 runs the `lint` job
517-
# cites: max 3.3 minutes; 2 × 3.3 = 6.7, 10 on the floor. 20 + 10 = 30.
518-
timeout-minutes: 30
517+
# cites: max 3.3 minutes; 2 × 3.3 = 6.7, 10 on the floor. 25 + 10 = 35.
518+
timeout-minutes: 35
519519
permissions:
520520
contents: read
521521

@@ -524,7 +524,7 @@ jobs:
524524
uses: actions/checkout@v7
525525
# CHECKOUT BUDGET: `typecheck-source-gates` sizes it; the `lint` job
526526
# above says why every lane carries it.
527-
timeout-minutes: 20
527+
timeout-minutes: 25
528528
with:
529529
# The slot-lookup ratchet compares the baseline against its state at
530530
# the merge base with main — the only way to see a file being ADDED
@@ -595,11 +595,11 @@ jobs:
595595
needs: [schedule-gate]
596596
if: ${{ !cancelled() && needs.schedule-gate.outputs.skip != 'true' }}
597597
runs-on: ubuntu-latest
598-
# JOB WALL = CHECKOUT BUDGET (20) + BODY BUDGET, `typecheck-source-gates`'
598+
# JOB WALL = CHECKOUT BUDGET (25) + BODY BUDGET, `typecheck-source-gates`'
599599
# scheme. Body after the checkout, rebuilt per run from the 70 runs the
600600
# `lint` job cites: max 4.1 minutes; 2 × 4.1 = 8.1, 10 on the floor.
601-
# 20 + 10 = 30.
602-
timeout-minutes: 30
601+
# 25 + 10 = 35.
602+
timeout-minutes: 35
603603
permissions:
604604
contents: read
605605

@@ -608,7 +608,7 @@ jobs:
608608
uses: actions/checkout@v7
609609
# CHECKOUT BUDGET: `typecheck-source-gates` sizes it; the `lint` job
610610
# above says why every lane carries it.
611-
timeout-minutes: 20
611+
timeout-minutes: 25
612612
with:
613613
# `fetch-depth: 0`: same reason as the `lint-eslint` checkout above.
614614
fetch-depth: 0
@@ -1987,11 +1987,11 @@ jobs:
19871987
needs: [schedule-gate]
19881988
if: ${{ !cancelled() && needs.schedule-gate.outputs.skip != 'true' }}
19891989
runs-on: ubuntu-latest
1990-
# JOB WALL = CHECKOUT BUDGET (20) + BODY BUDGET, `typecheck-source-gates`'
1990+
# JOB WALL = CHECKOUT BUDGET (25) + BODY BUDGET, `typecheck-source-gates`'
19911991
# scheme. Body after the checkout, rebuilt per run from the 70 runs the
19921992
# `lint` job cites: max 4.0 minutes; 2 × 4.0 = 8.0, 10 on the floor.
1993-
# 20 + 10 = 30.
1994-
timeout-minutes: 30
1993+
# 25 + 10 = 35.
1994+
timeout-minutes: 35
19951995
permissions:
19961996
contents: read
19971997

@@ -2000,7 +2000,7 @@ jobs:
20002000
uses: actions/checkout@v7
20012001
# CHECKOUT BUDGET: `typecheck-source-gates` sizes it; the `lint` job
20022002
# above says why every lane carries it.
2003-
timeout-minutes: 20
2003+
timeout-minutes: 25
20042004
with:
20052005
# `fetch-depth: 0`: same reason as the `lint-eslint` checkout above.
20062006
fetch-depth: 0
@@ -3018,11 +3018,11 @@ jobs:
30183018
needs: [schedule-gate]
30193019
if: ${{ !cancelled() && needs.schedule-gate.outputs.skip != 'true' }}
30203020
runs-on: ubuntu-latest
3021-
# JOB WALL = CHECKOUT BUDGET (20) + BODY BUDGET, `typecheck-source-gates`'
3021+
# JOB WALL = CHECKOUT BUDGET (25) + BODY BUDGET, `typecheck-source-gates`'
30223022
# scheme. Body after the checkout, rebuilt per run from the 70 runs the
30233023
# `lint` job cites: max 3.8 minutes; 2 × 3.8 = 7.6, 10 on the floor.
3024-
# 20 + 10 = 30.
3025-
timeout-minutes: 30
3024+
# 25 + 10 = 35.
3025+
timeout-minutes: 35
30263026
permissions:
30273027
contents: read
30283028
# ⭐ Added by #18224, for the issue-citation step far below: it resolves
@@ -3052,7 +3052,7 @@ jobs:
30523052
uses: actions/checkout@v7
30533053
# CHECKOUT BUDGET: `typecheck-source-gates` sizes it; the `lint` job
30543054
# above says why every lane carries it.
3055-
timeout-minutes: 20
3055+
timeout-minutes: 25
30563056
with:
30573057
# `fetch-depth: 0`: same reason as the `lint-eslint` checkout above.
30583058
fetch-depth: 0
@@ -4176,11 +4176,11 @@ jobs:
41764176
needs: [schedule-gate]
41774177
if: ${{ !cancelled() && needs.schedule-gate.outputs.skip != 'true' }}
41784178
runs-on: ubuntu-latest
4179-
# JOB WALL = CHECKOUT BUDGET (20) + BODY BUDGET, `typecheck-source-gates`'
4179+
# JOB WALL = CHECKOUT BUDGET (25) + BODY BUDGET, `typecheck-source-gates`'
41804180
# scheme. Body after the checkout, rebuilt per run from the 70 runs the
41814181
# `lint` job cites: max 4.3 minutes; 2 × 4.3 = 8.7, 10 on the floor.
4182-
# 20 + 10 = 30.
4183-
timeout-minutes: 30
4182+
# 25 + 10 = 35.
4183+
timeout-minutes: 35
41844184
permissions:
41854185
contents: read
41864186

@@ -4189,7 +4189,7 @@ jobs:
41894189
uses: actions/checkout@v7
41904190
# CHECKOUT BUDGET: `typecheck-source-gates` sizes it; the `lint` job
41914191
# above says why every lane carries it.
4192-
timeout-minutes: 20
4192+
timeout-minutes: 25
41934193
with:
41944194
# `fetch-depth: 0`: same reason as the `lint-eslint` checkout above.
41954195
fetch-depth: 0
@@ -4336,11 +4336,11 @@ jobs:
43364336
needs: [schedule-gate]
43374337
if: ${{ !cancelled() && needs.schedule-gate.outputs.skip != 'true' }}
43384338
runs-on: ubuntu-latest
4339-
# JOB WALL = CHECKOUT BUDGET (20) + BODY BUDGET, `typecheck-source-gates`'
4339+
# JOB WALL = CHECKOUT BUDGET (25) + BODY BUDGET, `typecheck-source-gates`'
43404340
# scheme. Body after the checkout, rebuilt per run from the 70 runs the
43414341
# `lint` job cites: max 4.3 minutes; 2 × 4.3 = 8.6, 10 on the floor.
4342-
# 20 + 10 = 30.
4343-
timeout-minutes: 30
4342+
# 25 + 10 = 35.
4343+
timeout-minutes: 35
43444344
permissions:
43454345
contents: read
43464346

@@ -4349,7 +4349,7 @@ jobs:
43494349
uses: actions/checkout@v7
43504350
# CHECKOUT BUDGET: `typecheck-source-gates` sizes it; the `lint` job
43514351
# above says why every lane carries it.
4352-
timeout-minutes: 20
4352+
timeout-minutes: 25
43534353
with:
43544354
# `fetch-depth: 0`: same reason as the `lint-eslint` checkout above.
43554355
fetch-depth: 0
@@ -4482,11 +4482,11 @@ jobs:
44824482
needs: [schedule-gate]
44834483
if: ${{ !cancelled() && needs.schedule-gate.outputs.skip != 'true' }}
44844484
runs-on: ubuntu-latest
4485-
# JOB WALL = CHECKOUT BUDGET (20) + BODY BUDGET, `typecheck-source-gates`'
4485+
# JOB WALL = CHECKOUT BUDGET (25) + BODY BUDGET, `typecheck-source-gates`'
44864486
# scheme. Body after the checkout, rebuilt per run from the 70 runs the
44874487
# `lint` job cites: max 3.7 minutes; 2 × 3.7 = 7.5, 10 on the floor.
4488-
# 20 + 10 = 30.
4489-
timeout-minutes: 30
4488+
# 25 + 10 = 35.
4489+
timeout-minutes: 35
44904490
permissions:
44914491
contents: read
44924492

@@ -4495,7 +4495,7 @@ jobs:
44954495
uses: actions/checkout@v7
44964496
# CHECKOUT BUDGET: `typecheck-source-gates` sizes it; the `lint` job
44974497
# above says why every lane carries it.
4498-
timeout-minutes: 20
4498+
timeout-minutes: 25
44994499
with:
45004500
# `fetch-depth: 0`: same reason as the `lint-eslint` checkout above.
45014501
fetch-depth: 0
@@ -4670,13 +4670,13 @@ jobs:
46704670
needs: [schedule-gate]
46714671
if: ${{ !cancelled() && needs.schedule-gate.outputs.skip != 'true' }}
46724672
runs-on: ubuntu-latest
4673-
# JOB WALL = CHECKOUT BUDGET (20) + BODY BUDGET, `typecheck-source-gates`'
4673+
# JOB WALL = CHECKOUT BUDGET (25) + BODY BUDGET, `typecheck-source-gates`'
46744674
# scheme. Body after the checkout, rebuilt per run from the 70 runs the
46754675
# `lint` job cites, where every run of this gate was BOTH tiers: max 15.5
4676-
# minutes; 2 × 15.5 = 31.0, 30 on the grain. 20 + 30 = 50, under the 55
4677-
# cap the `lint` job argues. Both tiers still run here on `schedule` and
4676+
# minutes; 2 × 15.5 = 31.0, 30 on the grain. 25 + 30 = 55, AT the 55 cap
4677+
# the `lint` job argues. Both tiers still run here on `schedule` and
46784678
# `push`, so the wall is sized for them, not for the fast tier.
4679-
timeout-minutes: 50
4679+
timeout-minutes: 55
46804680
permissions:
46814681
contents: read
46824682

@@ -4685,7 +4685,7 @@ jobs:
46854685
uses: actions/checkout@v7
46864686
# CHECKOUT BUDGET: `typecheck-source-gates` sizes it; the `lint` job
46874687
# above says why every lane carries it.
4688-
timeout-minutes: 20
4688+
timeout-minutes: 25
46894689
with:
46904690
# `fetch-depth: 0`: same reason as the `lint-eslint` checkout above.
46914691
fetch-depth: 0
@@ -4823,7 +4823,7 @@ jobs:
48234823
# window): the `lint` job's `timeout-minutes` comment. The four Type Check
48244824
# lanes size their wall as TWO budgets added, argued here once:
48254825
#
4826-
# wall = CHECKOUT BUDGET (20, on the checkout step) + BODY BUDGET
4826+
# wall = CHECKOUT BUDGET (25, on the checkout step) + BODY BUDGET
48274827
#
48284828
# The checkout is a full-history fetch (`fetch-depth: 0`, argued at the
48294829
# step) and its time has nothing to do with the change under test. Window
@@ -4840,35 +4840,43 @@ jobs:
48404840
# `cancelled` at the wall behind a 436–600 s checkout, and the required
48414841
# aggregate failed each one with no gate run.
48424842
#
4843-
# CHECKOUT BUDGET, 20 minutes: 1.3× that 895 s maximum. The rule's 2× would
4844-
# be 30, but the queue's window binds first: the workspace lane's body
4845-
# budget is 35, and 35 + 20 = 55 is the cap the `lint` job argues. One
4846-
# fetch, one budget, the same number on all four lanes.
4843+
# CHECKOUT BUDGET, 25 minutes, on every full-history checkout in this file
4844+
# but one. It was 20, 1.3× that 895 s maximum. The 2026-11-03 platform
4845+
# slowdown (#29980) then timed out 16 of these checkouts at 20 minutes.
4846+
# Replayed over that incident's full-history fetches (ci.yml's, n = 1,652,
4847+
# which carry no step timeout and so are uncensored), a single attempt
4848+
# fails 1.51% of checkouts at 20 minutes and 0.42% at 25, and a bound plus
4849+
# one retry inside the same total gains nothing (the hazard is flat).
4850+
# Healthy runs pay nothing for it: max 435 s over 3,576 checkouts of this
4851+
# workflow after the incident. The queries are in #29980's dev report.
4852+
# The one exception is `typecheck-workspace`: its body budget is 35, and
4853+
# 35 + 20 = 55 is already the cap the `lint` job argues, so that lane
4854+
# keeps 20 until its body is faster or the fetch is narrowed (#22034).
48474855
#
48484856
# BODY BUDGET, 10 minutes: everything after the checkout, successful runs
48494857
# only (n = 278): p50 2.8 / p99 3.1 / max 3.2 minutes; 2 × 3.2 = 6.4, and
4850-
# never below 10. 20 + 10 = 30.
4858+
# never below 10. 25 + 10 = 35.
48514859
#
48524860
# What the required `TypeScript Type Check` aggregate reads; it fails on
48534861
# anything but `success`:
4854-
# - a checkout that ends inside 20 minutes: nothing, the body still has
4862+
# - a checkout that ends inside 25 minutes: nothing, the body still has
48554863
# its 10;
4856-
# - a checkout still running at 20: the step FAILS ("The action
4857-
# 'Checkout repository' has timed out after 20 minutes."; actions/runner
4864+
# - a checkout still running at 25: the step FAILS ("The action
4865+
# 'Checkout repository' has timed out after 25 minutes."; actions/runner
48584866
# `StepsRunner.RunStepAsync` sets `TaskResult.Failed` on a step timeout),
48594867
# the gates are skipped, the lane reads `failure`;
48604868
# - a later step that hangs: the wall CANCELS the job, the lane reads
48614869
# `cancelled`. Actions has no timeout over a group of steps, so after a
4862-
# fast checkout a hung gate can run up to the full 30.
4863-
timeout-minutes: 30
4870+
# fast checkout a hung gate can run up to the full 35.
4871+
timeout-minutes: 35
48644872
permissions:
48654873
contents: read
48664874

48674875
steps:
48684876
- name: Checkout repository
48694877
uses: actions/checkout@v7
48704878
# CHECKOUT BUDGET: the job's wall comment above sizes it.
4871-
timeout-minutes: 20
4879+
timeout-minutes: 25
48724880
with:
48734881
# The authorable-surface deletion gate (#4650) below anchors on the
48744882
# MERGE BASE of HEAD with origin/main — that is the only anchor under
@@ -5521,7 +5529,8 @@ jobs:
55215529
# checkout numbers and what the aggregate reads: `typecheck-source-gates`.
55225530
# Body after the checkout, successful runs (n = 264): p50 11.0 / p99 17.1 /
55235531
# max 17.9 minutes; 2 × 17.9 = 35.8, 35 on the grain. 20 + 35 = 55, the
5524-
# cap the `lint` job argues, which is what holds the checkout budget at 20.
5532+
# cap the `lint` job argues, which is what holds THIS lane's checkout
5533+
# budget at 20 while every other full-history checkout here takes 25.
55255534
# No run of this lane hit the old 30 in the window, but 17.9 plus that
55265535
# 895 s checkout is 32.8: the same exposure, not yet drawn.
55275536
timeout-minutes: 55
@@ -5531,7 +5540,8 @@ jobs:
55315540
steps:
55325541
- name: Checkout repository
55335542
uses: actions/checkout@v7
5534-
# CHECKOUT BUDGET: `typecheck-source-gates` sizes it.
5543+
# CHECKOUT BUDGET: `typecheck-source-gates` sizes it and says why this
5544+
# lane alone stays at 20.
55355545
timeout-minutes: 20
55365546
with:
55375547
# `fetch-depth: 0`: see `typecheck-source-gates`' checkout (#4650, #6359,
@@ -5777,21 +5787,21 @@ jobs:
57775787
needs: [schedule-gate]
57785788
if: ${{ !cancelled() && needs.schedule-gate.outputs.skip != 'true' }}
57795789
runs-on: ubuntu-latest
5780-
# JOB WALL = CHECKOUT BUDGET (20) + BODY BUDGET; the split, its window, the
5790+
# JOB WALL = CHECKOUT BUDGET (25) + BODY BUDGET; the split, its window, the
57815791
# checkout numbers and what the aggregate reads: `typecheck-source-gates`.
57825792
# Body after the checkout, successful runs (n = 278): p50 4.4 / p99 7.2 /
5783-
# max 7.4 minutes; 2 × 7.4 = 14.8, 15 on the grain. 20 + 15 = 35. In the
5793+
# max 7.4 minutes; 2 × 7.4 = 14.8, 15 on the grain. 25 + 15 = 40. In the
57845794
# window the old 15 cancelled this lane twice, behind a 642 s and a 774 s
57855795
# checkout.
5786-
timeout-minutes: 35
5796+
timeout-minutes: 40
57875797
permissions:
57885798
contents: read
57895799

57905800
steps:
57915801
- name: Checkout repository
57925802
uses: actions/checkout@v7
57935803
# CHECKOUT BUDGET: `typecheck-source-gates` sizes it.
5794-
timeout-minutes: 20
5804+
timeout-minutes: 25
57955805
with:
57965806
# `fetch-depth: 0`: see `typecheck-source-gates`' checkout (#4650, #6359,
57975807
# #6356).
@@ -5981,21 +5991,21 @@ jobs:
59815991
needs: [schedule-gate]
59825992
if: ${{ !cancelled() && needs.schedule-gate.outputs.skip != 'true' }}
59835993
runs-on: ubuntu-latest
5984-
# JOB WALL = CHECKOUT BUDGET (20) + BODY BUDGET; the split, its window, the
5994+
# JOB WALL = CHECKOUT BUDGET (25) + BODY BUDGET; the split, its window, the
59855995
# checkout numbers and what the aggregate reads: `typecheck-source-gates`.
59865996
# Body after the checkout, successful runs (n = 271): p50 7.1 / p99 10.5 /
5987-
# max 11.5 minutes; 2 × 11.5 = 23, 25 on the grain. 20 + 25 = 45. In the
5997+
# max 11.5 minutes; 2 × 11.5 = 23, 25 on the grain. 25 + 25 = 50. In the
59885998
# window the old 20 cancelled this lane twice, both in a merge group,
59895999
# behind a 393 s and a 665 s checkout.
5990-
timeout-minutes: 45
6000+
timeout-minutes: 50
59916001
permissions:
59926002
contents: read
59936003

59946004
steps:
59956005
- name: Checkout repository
59966006
uses: actions/checkout@v7
59976007
# CHECKOUT BUDGET: `typecheck-source-gates` sizes it.
5998-
timeout-minutes: 20
6008+
timeout-minutes: 25
59996009
with:
60006010
# `fetch-depth: 0`: see `typecheck-source-gates`' checkout (#4650, #6359,
60016011
# #6356).

0 commit comments

Comments
 (0)