Version Lock
A version lock (kind: version-lock) is a frozen snapshot of component versions for a deployment ring. It’s machine-written by the promotion pipeline and serves as the immutable record of what was deployed.
Purpose
Version locks enable:
Immutable deployment records — lock captures exactly what versions were deployed
Promotion state tracking — each ring has a lock capturing its current version state
Rollback capability — locks record previous version state for rollback operations
Tamper detection — SHA-256 hash validation ensures locks haven’t been modified
Thin references — locks can point to version manifests instead of duplicating pins
Conceptual Model
File |
Author |
Mutability |
Purpose |
|---|---|---|---|
Version Manifest |
Operator / Tools |
Editable |
Source of truth for desired versions |
Version Lock |
|
Immutable |
Frozen snapshot after promotion or manual locking |
Schema
apiVersion: strata.huybrechts.xyz/v1
kind: version-lock
meta:
name: <ring_name> # Required: ring.scope identifier (e.g., 'prd', 'prd.us-east-1')
annotations:
description: <description>
labels:
environment: <env>
spec:
ring: <ring_name> # Required: ring being locked
source: <path> # Optional: relative path to version manifest (thin reference)
hash: <sha256> # Optional: SHA-256 of the source manifest's spec.pins
pins: # Optional (if source omitted): inline version pins
- target:
type: image | helm_chart | remote | tool
name: <name>
version: <version> # Exact version string
track: exact | latest # exact = pinned; latest = floating (dev rings only)
resolved: <version> # Last known resolved (for track: latest)
resolved_sha: <sha> # Immutable SHA for tamper detection
resolved_at: <timestamp> # When resolved was recorded
previous: # Optional: prior ring lock state (for rollback)
source: <path>
version: <version>
hash: <sha256>
Example — Thin Reference (Promotion)
apiVersion: strata.huybrechts.xyz/v1
kind: version-lock
meta:
name: prd
annotations:
description: "Production lock"
labels:
environment: production
spec:
ring: prd
source: prd.yaml # Points to version manifest
hash: "abc123def456..." # Hash of the manifest's spec.pins
previous:
source: prd.yaml
version: v2.0.0
hash: "old_hash..."
Example — Inline Pins (Manual Lock)
apiVersion: strata.huybrechts.xyz/v1
kind: version-lock
meta:
name: dev
spec:
ring: dev
pins:
- target:
type: image
name: app
version: v2.1.0
track: exact
resolved_sha: "sha256:abc123..."
- target:
type: helm_chart
name: traefik
version: "28.2.0"
track: exact
resolved_sha: "sha256:def456..."
Key Fields
Field |
Type |
Required |
Description |
|---|---|---|---|
|
string |
Yes |
Ring identifier or |
|
string |
Yes |
Ring being locked (must match a ring in the progression) |
|
string |
Conditional |
Relative path to version manifest (thin reference); mutually exclusive with |
|
string |
No |
SHA-256 of the referenced manifest’s |
|
array |
Conditional |
Inline version pins (old-style); mutually exclusive with |
|
object |
No |
Prior ring lock snapshot (enables single-step rollback) |
Workflow
Manual Locking
Create a lock from a version manifest:
strata versions lock --from versions/dev.yaml --output versions/dev.lock.yaml
Promotion
Promotion automatically writes locks:
strata promote start --target image:app:v2.2.0 --progression prd-progression
# Writes version-lock files for each ring wave
Validation
Validate a lock file hasn’t been tampered with:
strata validate versions/prd.lock.yaml --deep
# Checks SHA-256 hash if present
Rollback
Rollback to previous version state:
strata promote rollback versions/prd.lock.yaml
# Uses spec.previous to restore prior lock
Relationship to Version Manifest
Manifest → manual, human-editable, source of truth for desired versions
Lock → frozen output from promotion, immutable record of deployed versions
Locks typically reference manifests via spec.source (thin reference) to avoid duplication. When manifests change, the lock continues pointing to the old version until promotion creates a new lock.