paperclip/.github/workflows
Devin Foley 44f6312cd8
fix(ci): reuse one available Cloud registry cache (#13334)
## Thinking Path

> - Paperclip is the open source app people use to manage AI agents for
work.
> - Paperclip Cloud needs a verified image for each merged source
commit.
> - Fresh builders restore compiled native dependencies from registry
caches.
> - The current workflow imports up to eleven historical cache manifests
at once.
> - Live builds missed native layers that a fresh builder reused from
one manifest.
> - This PR selects the nearest available cache and tests reuse across
fresh builders.

## Linked Issues or Issue Description

Refs #13329 and #13330. A search of open cache PRs found no duplicate of
this change.

**What existing behavior does this improve?**

Remote Docker cache reuse on fresh Cloud image builders.

**Current behavior**

[Cloud run
34714483272](https://github.com/paperclipai/paperclip/actions/runs/34714483272/job/103609096836)
imported the previous cache manifest successfully but rebuilt
`cargo-chef` and Rust dependencies. The dependency compile took 3m43s.
The preceding image build had already exported those layers.

A controlled [fresh-builder
diagnostic](https://github.com/paperclipai/paperclip/actions/runs/34715336530)
used the same source and registry cache. The single-manifest job reused
both layers immediately. The multiple-manifest job rebuilt them and
failed the cache assertion. Both jobs used GitHub-hosted runners with
read-only access.

**Proposed behavior**

Inspect cache manifests in first-parent order and import only the
nearest available one. Keep full-SHA cache exports, the ten-commit
search bound, and the legacy fallback. If caches cannot be read, permit
a cold build.

**Reason and benefit**

Avoid the observed cache misses without changing image contents or
builder sizes. Expected savings include about four minutes of native
tool/dependency compilation when those inputs are unchanged. The final
merge-to-deployable gain still needs a post-merge measurement.

**Breaking changes**

No image, artifact, deployment, or runner-routing contract changes.

## What Changed

- Select one available ancestor cache after Docker login and Buildx
setup.
- Preserve separate writable cache tags for each full source SHA.
- Test cache ordering, missing caches, registry errors, and workflow
integration.
- Add the selector tests to the existing release-registry suite.
- Export a local test cache, remove the first builder, and verify a
source rebuild on a fresh builder.
- Document cache selection and the stronger Docker check.

## Verification

- Passed 456 focused workflow, routing, readiness, preview-artifact, and
cache-selector tests.
- Passed shell syntax, ShellCheck for the changed probe, actionlint
workflow validation, and `git diff --check`. actionlint's shell checks
were disabled for the workflow validation because unchanged
migration-label commands trigger existing SC2012 notes.
- The fresh-builder registry diagnostic proves the single-cache
behavior. The [permanent two-builder probe
passed](https://github.com/paperclipai/paperclip/actions/runs/34715771048/job/103612624090),
including a changed real binary and dependency-declaration invalidation.
- Passed all 35 latest-head checks (green or intentionally skipped),
including full typecheck, test, build, and browser suites in [PR CI run
34715771217](https://github.com/paperclipai/paperclip/actions/runs/34715771217).
- The real selector CLI inspected registry metadata and chose the
nearest available ancestor cache.
- Fresh Greptile review is 5/5 with no open findings. The PR title was
corrected to meet the source-change naming rule; the review check passed
after that correction.
- Local full-suite runs and Docker builds are unavailable because the
local Docker daemon is unresponsive after disk exhaustion. CI provides
the Linux verification.

## Risks

- Missing or unreadable caches cause a slower cold build. The selector
logs that condition and preserves image publication.
- Inspecting several missing ancestors adds lookup time. Each lookup has
a ten-second timeout and the search is bounded.
- The Docker test now exports a local cache. It removes the first
builder before starting the second to release disk space, then cleans up
its builders and files.

## Model Used

OpenAI GPT-6 through Codex, with reasoning, repository tools, and code
execution. The exact serving model ID and context window are not exposed
by this environment.

## Checklist


- [x] I have included a thinking path that traces from project context
to this change
- [x] I have specified the model used (with version and capability
details)
- [x] I have checked ROADMAP.md and confirmed this PR does not duplicate
planned core work
- [x] I have searched GitHub for duplicate or related PRs and linked
them above
- [x] I have either (a) linked existing issues with `Fixes: #` / `Closes
#` / `Refs #` OR (b) described the issue in-PR following the relevant
issue template
- [x] I have not referenced internal/instance-local Paperclip issues or
links (only public GitHub `#NNN` / `github.com/paperclipai/paperclip`
URLs)
- [x] My branch name describes the change (e.g. `docs/...`, `fix/...`)
and contains no internal Paperclip ticket id or instance-derived details
- [x] I have run tests locally and they pass
- [x] I have added or updated tests where applicable
- [x] I have updated relevant documentation to reflect my changes
- [x] I have considered and documented any risks above
- [x] All Paperclip CI gates are green
- [x] Greptile is 5/5 with no open P2s, recommendations, or follow-ups
- [x] I will address all Greptile and reviewer comments before
requesting merge

Co-authored-by: Paperclip <noreply@paperclip.ing>
2026-09-12 13:20:18 -07:00
..
agent-runtime-images.yml build(deps): bump actions/checkout from 6 to 7 (#8461) 2026-06-23 10:13:39 -07:00
cloud-artifacts.yml ci: use reserved AWS capacity for post-merge cloud verification (#13257) 2026-09-11 14:13:01 -07:00
cloud-readiness.yml ci: keep Cloud readiness markers out of the builder queue (#13330) 2026-09-12 12:32:46 -07:00
commitperclip-review.yml fix(build): enforce Node 24 across Paperclip (#11792) 2026-08-21 10:17:52 -07:00
docker-cloud.yml fix(ci): reuse one available Cloud registry cache (#13334) 2026-09-12 13:20:18 -07:00
docker-runner-check.yml fix(ci): reuse one available Cloud registry cache (#13334) 2026-09-12 13:20:18 -07:00
docker.yml ci: build cloud images independently for each merge (#13189) 2026-09-10 20:42:18 -07:00
e2e.yml test(runner): add full-stack acceptance and eval gates (#12700) 2026-09-02 08:55:08 -05:00
pr-trusted.yml ci: reuse dependency caches without per-PR uploads (#13300) 2026-09-11 17:31:15 -07:00
pr.yml ci: activate shared PR dependency cache restores (#13302) 2026-09-11 18:05:36 -07:00
refresh-lockfile.yml fix(ci): avoid empty pnpm caches from lockfile refresh (#13267) 2026-09-11 14:35:28 -07:00
release-smoke.yml Follow the current onboarding arc in the release smoke (#12423) 2026-08-28 07:21:08 -07:00
release-verify.yml ci: run release Runner protocol and Rust checks in parallel (#13326) 2026-09-12 11:33:20 -07:00
release.yml ci: use reserved AWS capacity for post-merge cloud verification (#13257) 2026-09-11 14:13:01 -07:00
runner-chaos-evals.yml ci: allow dependency changes in cloud eval verification (#13286) 2026-09-11 15:56:21 -07:00
runner-full-stack-e2e.yml feat: add experimental persistent agent chat (#13284) 2026-09-12 08:56:04 -05:00
runner-live-evals.yml feat(runner): restore direct live eval campaigns and reports (#12909) 2026-09-05 20:18:11 -05:00
runner-protocol-live-evals.yml fix(evals): make the chat viewer the default published Evalbook (#12952) 2026-09-07 07:47:17 -05:00
storybook-deploy.yml feat: publish CODEOWNER-approved Storybook branch previews (#13226) 2026-09-11 09:13:55 -05:00
storybook-visual.yml feat: publish CODEOWNER-approved Storybook branch previews (#13226) 2026-09-11 09:13:55 -05:00