Skip to content

ci: Turbo seeds vs the 10 GB Actions cache pool — measure the pool, then shrink or retire the per-sha seeds #25452

Closed

Description

@objectstack-fleet

Filing gate: ② ruling-directed sibling card — batch #5 item 1, letter C (#25373 comment 6366946328, maintainer 「同意」 2026-10-23T14:13:20Z). Reader: the domain:devx execution seat, dispatch step. Dedup: search_issues on objectstack-ai/objectstack, "Actions cache pool 10 GB eviction turbo seed" → 0 hits. Session: cse_01LKHDniRQSWjRJyDtacwpEd.

One-sentence problem

Every push to main writes about 12.8 GB of per-sha Turbo seeds to the Actions cache (six Test Core shard seeds of about 2.1 GB each, plus the Build Core, Type Check and other seeds), while the repository's Actions cache pool is 10 GB, so each merge can evict the seeds — and the pnpm store and Next.js caches — that the next PR run restores, and PR builds go cold for reasons the seed design cannot see.

Evidence (file lines at objectstack commit 2b7c331)

Governing text

  • ci.yml:597-610 and lint.yml:5101-5145 — the seed discipline comments (main writes, PR and merge_group restore by prefix). This card changes what and how much is written, not the restore order, unless the measurement shows the seeds are redundant with the remote cache.
  • AGENTS.md lines 371–372 are about the local worktree cache, not CI.
  • Ruling 6366946328: "Raising the pool limit is a billing item and comes back to the maintainer."

Change (in order; the dev pins what the measurement supports)

  1. Measure first. Read actions/cache/usage and the 100 largest entries of actions/caches (sorted by size_in_bytes, desc), from a local gh or a one-off read step in a workflow_dispatch job with actions: read. Record in the PR: pool total, the share held by *-turbo-* keys, by refs/pull/* refs, and by pnpm-store / nextjs keys, plus the age of the oldest live Test Core seed. If the pool is well under 10 GB and seeds survive at least 5 merges, stop and say so — the card closes with the reading.
  2. Then shrink, cheapest first, choosing from: (a) drop the .turbo/cache Actions seed for jobs whose tasks the remote cache already serves (Build Core, Type Check), keeping the seed only where the remote cache misses; (b) save the Test Core seeds from one shard-independent job, or prune .turbo/cache to the run's own hashes before save, to cut the per-shard size; (c) stop PR runs from saving the Next.js cache (restore-only on PRs, as the Turbo seed already is).
  3. Never raise the pool limit in this card. If after (a)–(c) the pool is still over budget, return the billing option to the maintainer as a needs-user-decision with the measured numbers.

Acceptance

Risks

Work estimate

Lane domain:devx · 1 PR (.github/workflows/ci.yml, .github/workflows/lint.yml; possibly .github/workflows/*.yml for the Next.js save gate) · Clause-②: no · Metadata-protocol: none · Tier H (governed surface — the PR waits for a GOVERNED_APPROVERS approval before ready). Size M. Serial: lands after #25373's PR (same ci.yml concurrency/save region) and after #25419 (needs its remote-cache assert lines for the before/after reading).

Related: #25373 (ruled sibling), #25374 / PR #25419 (remote cache assert), #5401 (closed).

Maintainer directive (verbatim, untranslated)

同意

— the maintainer, 2026-10-23T14:13:20Z, on director batch #5 item 1 (letter C = land the staged concurrency change as a coverage fix and file a separate card for the cache pool).


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 23, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 3 · 2026-10-23T18:23Z
    Session: session_01SawdJgiuoz8deqVdM51jAE (card thread, dispatched by seat session session_01LKHDniRQSWjRJyDtacwpEd)
    Account: os-elon-musk
    Branch: claude/project-thread-53z7nt (the harness-pinned branch for the card thread; it names no issue, so this claim is the identity record)
    Worktree: objectstack-issue-25452
    Domain: domain:devx
    Seat: domain:devx#1 (seat post #6023)
    File surface: .github/workflows/ci.yml, .github/workflows/lint.yml (possibly other workflow files for the Next.js save gate); Tier H (stop on breach; explain in the report)
    Container & model: M, mode:thread, model: default tier, effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: domain:devx seat 1 (#6023) reviews; Tier H — GOVERNED_APPROVERS approval before ready
    Thread-read: none
    Serial constraints cleared: cleared — #25454 (concurrency, merged 18:20Z) and #25419 (remote-cache assert, merged 18:10Z) are on main; #25465 (DTS skip) also landed 18:20Z

    Dispatched under the maintainer's 「同意」 to the director's ruling batch 1, item 5A (devx dispatches p1–p3). This card is also covered by the maintainer's 「同意,立卡」 for the CI performance audit cards, where the card says so. Dispatch order: /mnt/project-files/pm-devx-seat/dispatch-25452.md.

  2. objectstack-fleet commented on Oct 23, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT (seat review) → PR #25523 · domain:devx seat 1 · session_01LKHDniRQSWjRJyDtacwpEd · 2026-10-23T18:55Z

    • Reviewed at head fcae6e3a53: two files. scripts/ci/prune-turbo-cache.mjs is new (+381) with a 25-case self-test, wired into Build Core. .github/workflows/ci.yml (+29 / -1) adds a prune step before Test Core's "Save Turbo cache (main only)", and the save now runs only when the prune says save=true.
    • Cause, from logs: each push saved six Test Core seeds of 2.41–2.44 GB, about 14.6 GB per merge. Build Core's full 76-task build is 0.048 GB. The seed snowballs because turbo never evicts .turbo/cache, and the bare Linux-turbo-test- restore fallback carries that lineage across shards; PR run 39999049930 shard 1 restored shard 3's 2.50 GB seed. This is card change (b).
    • What the prune keeps: the task hashes named by the test step's --summarize run summary (.turbo/runs/, which ci.yml writes on both the package and the slice legs), plus the closure build's summary that the ci: assert the Turbo remote cache is on after Build Core, the Test Core closure and the three Type Check builds #25419 assertion moved to $RUNNER_TEMP/turbo-remote-cache. All three files of every other entry are deleted. A file of unknown shape is kept and counted, so a turbo layout change cannot silently empty the seed. With no run summary (cancelled, or an empty shard) there is no save, and the previous seed stays newest. Every run-time path exits 0, so the shard attestation is unaffected.
    • Fallback kept, and the seat agrees: once seeds are pruned, a cross-shard restore brings at most one closure's worth, and the prune drops whatever the run did not use. The lineage cannot carry forward, and a new shard number keeps its warm start.
    • Seat re-run: --self-test at this head is OK (25 cases, 5 batteries). CI is all green: 34 success, 11 skipped.
    • Still owed: the pool total before the change (actions/cache/usage and the largest entries) is pending. The maintainer has been asked to run two gh reads locally; this is not a landing blocker. The after-reading (≥ 5 merges, pool ≤ 8 GB at steady state, closure medians) is owed after landing.
    • ⛔ GOVERNED: Tier H (.github/workflows/ci.yml). A GOVERNED_APPROVERS approval is the review record; hotlong and os-zhuang are requested.
  3. objectstack-fleet commented on Oct 24, 2026

    @objectstack-fleet
    ContributorAuthor

    After-reading, first signal (devx seat, 2026-10-24 01:05Z; #25523 merged 00:35Z). Two push runs so far; the acceptance asks for ≥ 5.

    • Push run 40045993375 (041a120b61), Test Core 1/6: prune-turbo-cache: … kept 3 task entries named by 2 run summaries and dropped 17001 file(s) the run did not use: 2912.4 MB -> 0.8 MB on disk. It then saved Linux-turbo-test-1-main-041a120b61…. Shard 2 also saved.
    • Shards 3–6 on the same run logged NOT SAVED -- no readable run summary. Those are empty shards on an affected-only push, which is the designed no-save path, and the previous seed stays newest.
    • So a seed now carries only its own run: about 1 MB per shard on this merge, against 2.41–2.44 GB × 6 before.

    Still owed for the acceptance: the pool total at steady state (≤ 8 GB) and the PR shard-closure and Build Core medians over 10 PR runs, after ≥ 5 merges. The seat reads them on the next check.


    Generated by Claude Code

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

Metadata

Metadata

Assignees

Labels

area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratedomain:devxpriority:p2Medium: important, M3tooling

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions