- All playbooks
- Caching and setup
- Persist a tool’s incremental analysis state
Persist a tool’s incremental analysis state
Keep reusable configuration or analysis state in addition to dependency downloads, using the tool’s own cache contract.
How companies used this technique
Read what each company changed and follow the original sources.
Persist the tool’s analysis state separately
In the Go SDK a test job could win the shared cache key before lint saved its tools and analysis. Lint now turns off setup-go caching and owns a cache for modules, Go builds and the golangci-lint cache, keyed per revision with restore fallbacks.
Dedicated cache for modules, compiled tools and analysis Source
- Use it when
- Lint rebuilds its tools or analysis on every run despite restored dependency caches.
- Before applying it
- Restore, save and storage can outweigh reuse. Separate writers must never publish incomplete state under another job's key.
Let the build tool reuse unchanged work
Shopify CLI's scripts and CI jobs passed --skip-nx-cache, and a cache input included the commit SHA. Shopify/cli#8239 declares explicit cached targets with shared inputs and the real package-local dist outputs, then removes the bypass from scripts and CI.
The PR reports repeated builds and bundles restoring 12 of 12 tasks from cache. Source
- Use it when
- The build tool supports task caching and the CI commands bypass it.
- Before applying it
- A cached task whose inputs leave out a file restores stale work; declare shared configuration, lockfiles and tool versions as inputs.
Cache Gradle configuration as well as dependencies
Stripe Android enabled Gradle’s configuration cache with dedicated restore and save steps. A later change also saved Gradle transforms, and publishing commands run with --no-configuration-cache.
The author reports slightly faster builds. Source
- Use it when
- Gradle spends noticeable time configuring the same task graph on every run.
- Before applying it
- Configuration caches can contain secrets, so use Gradle’s encryption support and keep cache writes inside a trusted boundary. Resolve configuration-cache warnings before relying on it, and keep incompatible tasks such as publishing on the uncached path.
Company Playbooks
- Read Anthropic’s playbookRun only affected tests
- Read DoorDash’s playbookRun build and test in parallel, sharded across CI agents
- Read Linear’s playbookBenchmark the same job on faster hardware
- Read Mastra’s playbookStarSling runners for the slowest test workflow
- Read OpenAI’s playbookRank CI fixes by the minutes they save
- Read Ramp’s playbookMove a CPU-bound test suite to a faster CPU
- Read Shopify’s playbookLet an agent iterate against one CI metric
- Read Spotify’s playbookBuild arm64 on native arm64 runners
- Read Stripe’s playbookRun only the tests a change can reach
- Read Uber’s playbookBuild the merge-queue speculations most likely to be needed