
A pipeline that signs its own artifacts without server-side intervention is now a real deployment pattern. It is also, in many enterprises, deployed incorrectly.
The renewed interest in client-side execution — where build steps run in a self-hosted runner or an ephemeral job container without a central coordinator — is not incidental. Sigstore’s keyless signing flow, GitHub Actions’ OIDC token exchange, and SLSA Build L3 isolation requirements all assume provenance can be generated at the edge and verified downstream. The architectural pattern is sound, but its adoption often misfires.
The Architectural Pull
The case for client-side execution rests on three pillars:
- **Credential locality**: Short-lived OIDC tokens minted inside a job container reduce blast radius compared to long-lived personal access tokens stored on a CI server.
- **Build hermeticity**: Running builds on the same host, filesystem, and mounted cache eliminates “works locally but fails on CI” discrepancies.
- **Provenance fidelity**: SLSA Build L3 isolation guarantees that generating attestations directly on the build host creates stronger evidence than reconstructing provenance several hops downstream.
Where It Actually Breaks
The pattern fails predictably in real-world scenarios:
Signed does not mean trustworthy
In May 2026, the “Mini Shai-Hulud” supply chain attack compromised 84 npm artifacts across 42 packages in the @tanstack namespace, spreading to over 170 packages including @mistralai and @uipath. Attackers combined a GitHub Actions misconfiguration with cache poisoning and OIDC token extraction from runner memory.
The published packages carried valid SLSA Build Level 3 attestations. Attackers extracted legitimate OIDC tokens and signed via Sigstore, producing cryptographically genuine attestations. The key lesson: a signed artifact reflects what the build platform observed, not whether the platform itself was secure. Provenance is only as trustworthy as the isolation guarantees of the system generating it.
Cache poisoning without a control plane
Self-hosted runners persist cache between jobs for speed. However, a compromised dependency in one job can survive into subsequent builds — the exact mechanism used in the Mini Shai-Hulud attack. Fully ephemeral runners prevent this by isolating cache across builds.
The OIDC trust confusion
Teams often mistake switching to OIDC as an automatic security control. OIDC federates identity to eliminate long-lived secrets, but it does not restrict authorization. Overly broad role assumption policies defeat the purpose of OIDC migration.
A Decision Framework
Choosing an execution boundary depends on your workload’s threat model:
- **Centralized CI**: Ideal when artifacts serve multiple production tenants and provenance is verified at deployment admission.
- **Isolated ephemeral runners**: Best for builds with sensitive source code but internal artifact distribution.
- **Browser-based execution**: Suited for read-only developer utilities where no secrets are involved. Utility tools like a [browser-based JSON formatter](https://toolifyhub.tools/tools/json-formatter) execute computation locally in the browser — ideal for developer workflows, but unsuitable when build secrets or production artifacts enter the pipeline.
Performance Considerations
Performance in isolated pipelines depends on key operational factors:
- **Cache hit rate**: A warm cache on a self-hosted runner outperforms a cold start on an ephemeral runner.
- **Cold start tax**: Dependency resolution on ephemeral runners can consume more runtime than the build itself.
- **Mean time to revoke**: Measuring how quickly a compromised builder identity can be revoked is critical during an active security incident.
Production Readiness Checklist
Before deploying client-side or ephemeral execution in production, ensure:
- SLSA attestations are verified at deployment admission, not merely stored.
- OIDC role assumption policies are scoped to specific repositories and branches.
- Runner caches are ephemeral or content-addressed and verifiable.
- Mean time to revoke builder identities is actively measured.
- Client-side browser tools are strictly limited to secret-free developer utilities.
References
- SLSA, “Mini Shai-Hulud: Where SLSA’s Boundaries Fall” — slsa.dev/blog
- SLSA Specification, Build Track Levels — slsa.dev/spec
- Sigstore Documentation — sigstore.dev
- GitHub Actions OIDC Documentation — docs.github.com
