Skip to content

ci: cache Windows lanes and build Windows on the 16-core GitHub runner - #1333

Merged
AnthonyRonning merged 3 commits into
masterfrom
ci/windows-github-caches
Oct 27, 2026
Merged

AnthonyRonning merged 3 commits into
masterfrom
ci/windows-github-caches

Conversation

@AnthonyRonning

@AnthonyRonning AnthonyRonning commented Oct 27, 2026 •

Copy link
Copy Markdown
Contributor

Windows jobs that compile now run on the org's new GitHub-hosted larger runner maple-windows-2025-16core (Windows Latest 2025, 16 cores, runner group Maple). The Agent Windows lanes that must run on GitHub's image now also keep caches. GitHub lifted the enterprise usage cap that had made the cache store read-only, so they can.

Runner moves (all GitHub-hosted, so signing trust is unchanged)

Job Before After
agent-full-windows, agent-windows-updater, agent-package-windows (ci.yml) windows-2025, 4 cores, no cache 16-core, with caches
agent-desktop-build.yml windows-build (unsigned Agent build that feeds signed updates) Blacksmith 16-core. Build, sign and verify are all GitHub-hosted again.
desktop-build.yml build-windows (signed Research build) and release.yml build-windows windows-2025 16-core. They move together because the release restores the sccache master writes. Today the release's Windows build is its longest step, 27–44 min.
Agent/Research Windows signing and verify jobs windows-2025 unchanged: short jobs
Agent Windows Clippy lane, Research Windows PR package Blacksmith unchanged
  • CI_WINDOWS_GITHUB_RUNNER=windows-2025 moves the three Agent lanes back to the standard runner without a PR.
  • .github/actionlint.yaml declares the new label.
  • The policy test treats the org's maple-* runners as GitHub-hosted. Azure signing, --deny-self-hosted-runners attestation checks and the environments are unaffected.
  • scripts/ci/windows_signature_reference.py accepts builds from the new runner.

Caches for the GitHub-image Agent lanes

Lane Key Saved by
agent-full-windows ci-v1-agent-full-windows-* (rust-cache) master push and nightly
agent-windows-updater ci-v1-agent-windows-updater-* (rust-cache) master push and nightly
agent-package-windows ci-v1-agent-package-Windows-*, thin LTO, with a prefix fallback nightly only
  • PRs never save.
  • A failover to the other vendor only restores. plan.py adds a cache_save matrix field, and the special jobs guard on runner.name.
  • Blacksmith lanes and the ci-v1-agent-release-* exact-key family are unchanged, apart from windows-build now writing its exact key into GitHub's store.

What this PR's run proves

The labels ci:windows and ci:package make the run exercise the new runner before anything depends on it:

  • agent-windows-updater, including the updater's native ACL checks;
  • the Windows packaging rehearsal with its installer smoke test (install and repeat install).

The master and release moves are proven by master's first desktop-build (signed Research Windows) and agent-desktop-build runs after merge. Those run the same build scripts as the release.

Local validation

  • 503 scripts/ci tests and the publisher tests pass.
  • plan.py lint passes, and actionlint is clean on all workflows.
  • The workflows, ci-scripts and release-gates flake checks pass.
  • Two independent reviews (cache trust, CI semantics) found no blockers, and their findings are applied.

Watch after merge

Cache storage. These lanes add a few GB per Agent lockfile change. If usage nears the 50 GB limit, GitHub evicts the least recently used entries, and that could include the release-fed Windows sccache. Check gh api repos/MaplePrivacyLabs/Maple/actions/cache/usage daily for a week. If needed, save the two rust-cache lanes from nightly only.

🤖 Generated with Claude Code


View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need.

AnthonyRonning and others added 3 commits October 27, 2026 19:49
GitHub lifted the cache cap, so the three Agent lanes that need GitHub's
windows-2025 image now keep caches in GitHub's store. Pull requests still
only restore; master pushes and the nightly run save.

- The planner gives each matrix entry cache_save: false when the resolved
  runner is from another vendor than the lane's home runner, so a failover
  never writes into the other store. Both matrices use it instead of
  matching labels in YAML; Blacksmith lanes behave as before.
- agent-full-windows saves its rust-cache like every other matrix lane.
- agent-windows-updater gets its own rust-cache key, saved by master pushes
  and nightly on GitHub's runners. Its receipts and artifact are unchanged,
  and the Agent's own crates still compile from source.
- agent-package-windows restores ci-v1-agent-package-Windows-* like the
  Linux and macOS rehearsals, and runs nightly to save it.
- CI_WINDOWS_GITHUB_RUNNER overrides the three lanes' runner (default
  windows-2025), for example to a larger GitHub runner on the same store.

The workflow policy now lists exactly these GitHub-store writers and checks
the failover guards.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- C4 pins the packaging rehearsals' restore-keys to their own prefix and
  checks that no job falls back into ci-v1-agent-release-* by prefix.
- The workflow policy pins the cached matrix lanes whose home runner uses
  GitHub's store (agent-full-windows), not only the matrix job, and
  requires every ci.yml cache save to name only push or schedule events.
- plan.py lint checks that the plan step passes every matrix runner's
  override variable, so CI_WINDOWS_GITHUB_RUNNER cannot silently move only
  the special jobs.
- Docs: GitHub's larger runners are billed; the packaging cache is listed
  apart from the rust-cache lane caches.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Compiling Windows jobs move to the org's GitHub-hosted larger runner
maple-windows-2025-16core (Windows Latest 2025, 16 cores):
- the Agent's GitHub-image lanes (agent-full-windows, agent-windows-updater,
  agent-package-windows), now the CI_WINDOWS_GITHUB_RUNNER default;
- the unsigned Agent Windows build in agent-desktop-build.yml, so build, sign
  and verify all run on GitHub-hosted runners again;
- the signed Research build in desktop-build.yml and release.yml build-windows,
  together, so the release still restores the sccache master writes.

Short signing and verify jobs stay on windows-2025; the Windows Clippy lane and
the Research Windows PR package stay on Blacksmith. The policy test treats
the org's maple-* runners as GitHub-hosted, actionlint learns the label, and
the signature probe accepts builds from it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@AnthonyRonning AnthonyRonning added ci:windows Run Windows checks on this PR ci:package Build unsigned packages on this PR labels Oct 27, 2026
@AnthonyRonning
AnthonyRonning merged commit a662df3 into master Oct 27, 2026
38 checks passed
@AnthonyRonning
AnthonyRonning deleted the ci/windows-github-caches branch October 27, 2026 20:44
AnthonyRonning added a commit that referenced this pull request Oct 28, 2026
… Blacksmith (#1341)

* ci(agent): build Dev desktop packages nightly, Prod on every push

Agent master pushes now build, sign and verify only Prod on macOS, Linux and
Windows. Dev packages build nightly on the master tip (10:37 UTC) and, with
Prod, on a manual dispatch.

The Dev legs cost about $1.50 per Agent push. They also coupled the chains:
on 0.0.12 (run 40625776561) 'Linux bundle (dev)' lost its runner, and Attest
and Verify Linux were skipped for Prod too, so the release could not publish
Linux without a rerun. Pushes no longer have a Dev leg to wait for.

- Every packaging job's variant matrix is Prod on push, Dev on schedule and
  both on dispatch; each job's if: admits the schedule event. The changes job
  already selects the build on any non-push event.
- Dev and Prod share the exact-key release cache (the profile changes only
  Agent workspace crates). Only pushes save it, so the nightly and dispatched
  builds restore Prod's entry and never write it.
- The publisher already rejects schedule runs; desktop-signing and
  windows-signing allow master by branch policy, which a scheduled run on the
  default branch satisfies.
- C2 now checks every event: a push that drops Prod or builds Dev, or a
  nightly that builds Prod, fails. C4 evaluates the release-cache save
  condition per event (push only) and pins its writers to Prod on push.
- test_plan covers the nightly selection; docs updated.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* ci(opensecret): build every EIF on blacksmith-16vcpu-ubuntu-2404-arm

The os-eif PR candidate is the one thing keeping OpenSecret src/ PRs over
10 minutes: its build took p50 7.8 / p90 9.2 min on 8 vCPU ARM (52 dev+prod
pairs, 10-11..10-26), so ci-ok on PRs with EIF inputs was ~9.9 p50 / 12.4
p90 and 44% of them exceeded 10 min.

Every EIF builder moves together, so the PR candidate, the trusted master
and approval builds and the release builder stay on one runner class
(C5): lanes.py EIF_BUILDER (ci.yml os-eif), opensecret-eif.yml eif-trusted
and opensecret-eif-release.yml build. actionlint declares the new label in
place of the old one, which nothing uses any more. The unprivileged fork
job stays on GitHub's ubuntu-24.04-arm. Nothing else about the EIF builds,
their inputs or the PCR checks changes.

16 vCPU ARM costs twice the rate for an expected ~0.6x the time, about +24%
per build.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* ci(agent): build the Agent Windows binary on Blacksmith again

'Build Windows binary' moves from maple-windows-2025-16core back to
blacksmith-8vcpu-windows-2025. The fat-LTO link runs on one thread, so the
16-core runner is no faster warm (19.7 min of Cargo against 19.4-20.8 on
Blacksmith) and costs about $1.05 more per Agent push, roughly $300 a month.
Signing and verification stay on GitHub's windows-2025.

Kept consistent with what #1333 changed alongside it:
- test_workflow_policy no longer lists the job as a GitHub cache-store
  writer; its exact-key release cache now lives in Blacksmith's store, like
  the macOS and Linux builders'. The first Windows build after this lands
  starts cold once; nothing else reads that key.
- actionlint keeps maple-windows-2025-16core (release.yml and ci.yml still
  use it) and already declares the Blacksmith label.
- The signature probe keeps accepting all three build runners, since it
  checks historical producer runs; only its comment changes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* ci: address review findings

C2 now pins that the publisher rejects the nightly run by its event, even
when the run carries every Prod job and artifact. The Agent README and the
publisher docs describe which runs build and which qualify.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ci:package Build unsigned packages on this PR ci:windows Run Windows checks on this PR

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant