Promotion Record
A promotion record (kind: promotion-record) is a machine-written audit log documenting a version promotion through a progression. It captures what was promoted, how, gates evaluated, and final outcome.
Purpose
Promotion records enable:
Audit trail — complete history of when, who, and what was promoted
Compliance evidence — gate evaluation results prove promotion gates were checked
Rollback tracking — records link promotion to rollback operations
Deployment linking — records reference deployment manifests created during promotion
Version lineage — track version progression through rings (dev → staging → prod)
Conceptual Model
Entity |
Role |
When Created |
|---|---|---|
Version Manifest |
Input: desired versions |
Operator edits |
Promotion Record |
Output: audit log |
|
Version Lock |
Snapshot: frozen versions |
|
Deployment Manifest |
Deployment artifact |
|
A promotion record documents the entire promotion workflow — from initiation through all ring waves to final outcome.
Schema
apiVersion: strata.huybrechts.xyz/v1
kind: promotion-record
meta:
name: <record_name> # e.g., prom-20260623-prd-001
labels:
target: <target_name> # e.g., app, traefik
ring: <ring_name> # Target ring (e.g., prd)
outcome: <outcome> # completed | partial | rolled-back
annotations:
description: <description>
spec:
# What was promoted
target:
type: remote | helm_chart | image
name: <name>
from_version: <version> # Previous version
to_version: <version> # New version
# How & where
strategy: <strategy_name> # Promotion strategy name
progression: <progression_name>
rings: [list] # Ordered rings from progression
# Outcome
outcome: completed | partial | rolled-back
rollback_of: <promotion_record_name> # If this is a rollback
# Identity & timing
initiated_by: <user> # $USER or CI actor
hostname: <hostname> # Machine that ran strata
started_at: <iso8601_utc> # First wave commit timestamp
completed_at: <iso8601_utc> # Last wave commit timestamp (if completed)
duration_seconds: <int> # Calendar time elapsed
# Git
branch: promote/{target}-{version}-{ring} # Promotion branch name
commits: # Per-wave commits
- ring_wave: <number>
sha: <commit_sha>
message: <message>
committed_at: <iso8601_utc>
# Gate results (compliance evidence)
gates: # Gate evaluation results
- gate: <gate_name>
ring: <ring>
require: any_one | all
checked_at: <iso8601_utc>
passed: <boolean>
detail: <explanation>
# Ring wave execution
ring_waves: # Summary of each wave
- ring_wave: <number>
environments: [list]
deployment_wave: <wave_name>
deployments: <names_or_all>
files_modified: [list]
fields_removed: [list]
committed_at: <iso8601_utc>
# Links to deployment manifests
deployment_manifests: [list] # Paths to .strata/manifests/ files created by deploy
Example
apiVersion: strata.huybrechts.xyz/v1
kind: promotion-record
meta:
name: prom-20260721-app-prd-001
labels:
target: app
ring: prd
outcome: completed
annotations:
description: "Promotion of app from v2.1.0 to v2.2.0 through dev→staging→prd"
spec:
target:
type: image
name: app
from_version: v2.1.0
to_version: v2.2.0
strategy: blue-green
progression: prd-progression
rings: [dev, staging, prd]
outcome: completed
initiated_by: alice
hostname: ci-runner-1
started_at: "2026-07-21T14:23:45Z"
completed_at: "2026-07-21T14:35:12Z"
duration_seconds: 687
branch: promote/app-v2.2.0-prd
commits:
- ring_wave: 1
sha: abc123def456...
message: "Wave 1: dev - app v2.1.0→v2.2.0"
committed_at: "2026-07-21T14:24:00Z"
- ring_wave: 2
sha: def456abc789...
message: "Wave 2: staging - app v2.1.0→v2.2.0"
committed_at: "2026-07-21T14:29:15Z"
- ring_wave: 3
sha: abc789def012...
message: "Wave 3: prd - app v2.1.0→v2.2.0"
committed_at: "2026-07-21T14:35:00Z"
gates:
- gate: require_progression_order
ring: dev
require: any_one
checked_at: "2026-07-21T14:23:50Z"
passed: true
- gate: require_progression_order
ring: staging
require: any_one
checked_at: "2026-07-21T14:29:10Z"
passed: true
- gate: require_progression_order
ring: prd
require: all
checked_at: "2026-07-21T14:34:50Z"
passed: true
ring_waves:
- ring_wave: 1
environments: [dev]
deployment_wave: all
deployments: all
files_modified:
- versions/dev.yaml
committed_at: "2026-07-21T14:24:00Z"
- ring_wave: 2
environments: [staging]
deployment_wave: all
deployments: all
files_modified:
- versions/staging.yaml
committed_at: "2026-07-21T14:29:15Z"
- ring_wave: 3
environments: [prd]
deployment_wave: canary
deployments: [canary-deployment]
files_modified:
- versions/prd.yaml
committed_at: "2026-07-21T14:35:00Z"
deployment_manifests:
- .strata/manifests/prom-20260721-app-prd-001/dev-manifest.yaml
- .strata/manifests/prom-20260721-app-prd-001/staging-manifest.yaml
- .strata/manifests/prom-20260721-app-prd-001/prd-manifest.yaml
Key Fields
Field |
Type |
Required |
Description |
|---|---|---|---|
|
string |
Yes |
Unique record identifier (e.g., |
|
string |
No |
Artifact name being promoted (for filtering) |
|
string |
No |
Target ring (for filtering) |
|
string |
No |
Outcome status (for filtering) |
|
object |
Yes |
What was promoted: type, name, from/to versions |
|
string |
Yes |
Promotion strategy name |
|
string |
Yes |
Progression name |
|
string |
Yes |
|
|
string |
Yes |
User or CI actor |
|
string |
Yes |
ISO 8601 UTC timestamp |
|
string |
Yes |
Promotion branch name |
|
array |
No |
Gate evaluation results (compliance evidence) |
|
array |
No |
Per-wave execution summaries |
|
array |
No |
Links to deployment manifests |
Workflow
Initiating a Promotion
strata promote start --target image:app:v2.2.0 --progression prd-progression
# Writes promotion-record at .strata/promotions/records/
Viewing Promotion History
# List all promotion records
strata promote history
# View details of a specific record
strata promote show prom-20260721-app-prd-001
Rollback
strata promote rollback prom-20260721-app-prd-001
# Creates new promotion-record with rollback_of reference
# Restores previous version state
Storage
Promotion records are stored locally in .strata/promotions/records/ and are typically committed to git as part of the promotion branch. They provide a complete audit trail of all promotions.
Relationship to Other Kinds
Version Manifest → Input: desired versions
Promotion Record → Output: audit log of promotion workflow
Version Lock → Snapshot: frozen versions per-ring after promotion
Deployment Manifest → Final artifact: infrastructure to be deployed