Browse pages
Delivery
Delivery holds the release, deployment and operations rules a project adds when running the product for other people takes a formal regime: release readiness gates, artifact promotion, branch protection, deployment and rollback, backup and restore, alerting and on-call routing, the supply-chain gate, and container image build, rollout and runtime limits. A project that only needs the core checks, contracts and review flow in the baseline carries none of it. A team that operates the product in production selects it, so each release deploys, recovers and answers alerts by a written procedure instead of improvisation, with container releases shipping the same image bytes they tested.
Stack: any Layer: operations
Activation#
Activation scope: project.
Applicable specification kinds: None.
The consumer enables delivery when it operates the product for other people in production, promotes one artifact through staging and production, or needs a formal release gate, deployment and rollback path, alerting regime, or supply-chain gate beyond the baseline checks. It also enables delivery when production or staging deploys the API, the Worker, or a frontend as a container image.
Baseline Relationship#
This extension replaces no baseline provision. The baseline keeps the boundary-selected checks, contract regeneration and the release record; this extension adds the production regime around them. Its schema, rollback, and secret rules cite the baseline provisions that own those obligations instead of restating them.
This extension switches on setting and runbook: resource bounds are setting records under litespec/ext/delivery#declare-writable-paths-and-limits, and the rollback procedure is a runbook record under litespec/ext/delivery#keep-rollback-executable.
Standards#
Meet Release Readiness Gates#
rulerulecheckablelitespec/ext/delivery#meet-release-readiness-gatesA release MUST show green G checks, verified scenarios, and green S checks where the reader is qualified.
Applies toartifact: any
Why
The three parts prove the three risks are closed: G checks prove the record graph holds, verified scenarios prove each behavior through the public boundary, and S checks prove the code matches the records where a qualified reader exists. A release missing any part ships with that risk unjudged. litespec model check --release makes the release-readiness findings block, so the gate is a command.
Example
A reimbursement release shows green G checks, every scenario verified, and green S checks on the .NET reader.
Checkchecked by a tool
Checked bylitespec model check --release blocks on use-case-unverified.
Marked checkable: the tool named here checks it.
Provide Release Data Recovery#
ruleruleguidancelitespec/ext/delivery#provide-release-data-recoveryA release MUST provide repeatable schema creation or upgrade, backup instructions, and a tested restore.
Applies toartifact: any
Why
A product that cannot recreate its schema, back up its data, and restore from backup holds customer data it cannot recover. Repeatable setup plus a tested restore turns recovery from a hope into a rehearsed procedure.
Checka reviewer answers
Reviewed forWhich releases lack repeatable schema setup, backup instructions, or a tested restore? Look at the recovery evidence beside the release.
Marked guidance: a reviewer answers this question.
Provide Release Operating Visibility#
ruleruleguidancelitespec/ext/delivery#provide-release-operating-visibilityA release MUST provide liveness, readiness, trace-correlated diagnostics, and secrets outside source control.
Applies toartifact: any
Why
Operators cannot keep a product they cannot see: liveness and readiness signals drive restarts and traffic, and trace-correlated diagnostics connect a failure to its cause. Secrets stay outside source control because a committed secret is a published one.
Checka reviewer answers
Reviewed forWhich releases lack health signals, trace diagnostics, or secrets outside source control? Look at the operating evidence beside the release.
Marked guidance: a reviewer answers this question.
Provide Release Delivery Controls#
ruleruleguidancelitespec/ext/delivery#provide-release-delivery-controlsA release MUST provide CI, tested deployment and rollback paths, current operating limits, and the runbooks those limits name.
Applies toartifact: any
Why
CI, tested deployment and rollback paths, current limits, and the runbooks those limits name make every release repeatable and every failure recoverable. Without them, each deployment improvises and each incident starts from scratch.
Checka reviewer answers
Reviewed forWhich releases lack current CI, deployment, rollback, limits, or runbooks? Look at the delivery evidence beside the release.
Marked guidance: a reviewer answers this question.
Record Release Evidence#
ruleruleguidancelitespec/ext/delivery#record-release-evidenceA release record MUST list build, test, contract, security, journey, schema, backup, deployment, readiness, diagnostics, smoke-test, and rollback results.
Applies toartifact: any
Why
Build, test, contract, security, journey, schema, backup, deployment, readiness, diagnostics, smoke-test, and rollback results together show the artifact works and can be operated. A missing kind is evidence nobody produced.
Checka reviewer answers
Reviewed forWhich records lack a result for a listed evidence kind? Look at the evidence list on each release record.
Marked guidance: a reviewer answers this question.
Record Operating Readiness#
ruleruleguidancelitespec/ext/delivery#record-operating-readinessA release record MUST list operating limits, alerts, runbooks, known operating conditions, and skipped checks.
Applies toartifact: any
Why
Limits, alerts, runbooks, known conditions, and skipped checks tell the maintainer what to watch, what to run, and what remains unverified after release. Without them, the release hands over an artifact with no operating instructions.
Checka reviewer answers
Reviewed forWhich records lack limits, alerts, runbooks, conditions, or omissions? Look at the readiness list on each release record.
Marked guidance: a reviewer answers this question.
Keep a First-Release Readiness Record#
ruleruleguidancelitespec/ext/delivery#keep-a-first-release-readiness-recordA consumer before its first production release MUST keep a readiness record with dated rehearsals, green gates, and a rehearsal owner.
Applies toartifact: any
Why
A release record binds evidence to one artifact, so a product with no artifact yet has nothing to record in one. The readiness record instead states what proves the product may take data: dated rehearsals, green gates, and a rehearsal owner who owns the backup and restore rehearsal.
Checka reviewer answers
Reviewed forWhich pre-release consumers lack dated rehearsals, green gates, or a rehearsal owner? Look at the readiness record beside the project.
Marked guidance: a reviewer answers this question.
Review Schema Artifacts#
ruleruleguidancelitespec/ext/delivery#review-schema-artifactsA persistence change MUST publish a schema artifact that lists every destructive operation with its reason.
Applies toartifact: migration
Why
A persistence change reaches production data, so the reviewer needs to see exactly what the database will do before it runs. The schema artifact shows that: the Marten schema plan and document transformation, or the generated EF Core migration with its SQL. Listing every destructive operation with its reason forces the author to name data loss where every reader sees it.
Checka reviewer answers
Reviewed forEach persistence change carries a schema artifact with every destructive operation and its reason.
Marked guidance: a reviewer answers this question.
Enforce the Supply-Chain Gate#
ruleruleguidancelitespec/ext/delivery#enforce-the-supply-chain-gateCI MUST enforce the supply-chain gate on every pull request.
Applies toartifact: any
Why
When a new advisory names a component and a version range, the team must answer one question fast: does any running release contain it. Without a component inventory beside the artifact, that answer means rebuilding the dependency graph of a commit somebody has to find first. NIST SP 800-218 states the practice, and the frozen lockfile the build resolved is what the inventory is generated from. OSV-Scanner matches dependencies against OSV.dev advisories and Gitleaks scans for leaked secrets, so advisories and secrets each have one evidence tool.
Example
The build job that produces the artifact generates the inventory from the same frozen lockfile. It stores the inventory beside the artifact, under the release version.
Checka reviewer answers
Reviewed forThe supply-chain report shows scan, pin, inventory, and license evidence with an exception for each unhandled high-severity advisory.
Marked guidance: a reviewer answers this question.
Publish a Book Preview for Every Change#
ruleruleguidancelitespec/ext/delivery#publish-a-book-preview-for-every-changeCI MUST publish a preview of the book for every change.
Applies toartifact: any
Why
The intent diff names what moved, while the preview shows it rendered, with the changed records readable beside their neighbors. The reader clicks from the comment into the preview for full context.
Checka reviewer answers
Reviewed forThe pull request links a book preview built from the change.
Marked guidance: a reviewer answers this question.
Promote Verified Artifacts#
ruleruleguidancelitespec/ext/delivery#promote-verified-artifactsCI MUST build one immutable artifact and promote that same artifact through staging and production.
Applies toartifact: any
Why
Staging tests prove something about the artifact they ran against. When production deploys a fresh build from the same branch instead, it ships code the tests never saw, because the branch may have moved between the two builds. Promoting the one tested artifact through staging and production keeps the tested code and the shipped code identical.
Checka reviewer answers
Reviewed forThe staging and production deployments reference the one artifact the release job passed.
Marked guidance: a reviewer answers this question.
Protect the Default Branch#
ruleruleguidancelitespec/ext/delivery#protect-the-default-branchThe default branch MUST require the jobs table entries for the project's size, a reviewed pull request, and a clean merge state.
Applies toartifact: any
Why
The default branch is the source every environment deploys from, so an unreviewed or unchecked commit there reaches production with no further review. Requiring the jobs table entries, a reviewed pull request, and a clean merge state keeps every commit on the branch reviewed and verified. A direct push or a bypassed check is permitted only during a documented repository recovery action.
Checka reviewer answers
Reviewed forThe default branch settings require the jobs-table entries, a reviewed pull request, and a clean merge state.
Marked guidance: a reviewer answers this question.
Record Every Branch Protection Bypass#
ruleruleguidancelitespec/ext/delivery#record-every-branch-protection-bypassA direct push or bypassed check on the default branch MUST produce a record naming the actor, the reason, and the change it admitted.
Applies toartifact: any
Why
The bypass permission exists so a recovery can proceed when the gates cannot run. A recovery nobody wrote down is indistinguishable from a habit, so the next reviewer cannot tell which commits on the branch were reviewed. The record names the actor, the reason, and the admitted change, which is the attribution NIST SP 800-218 states for the same event.
Example
The record is the recovery decision itself where one exists. A bypass smaller than a decision takes a dated entry in the operations log at .litespec/behavior/operations/log/.
Checka reviewer answers
Reviewed forEach bypass entry in the operations log or recovery decision names its actor, reason, and admitted change.
Marked guidance: a reviewer answers this question.
Keep a Canonical Job Graph#
ruleruleguidancelitespec/ext/delivery#keep-a-canonical-job-graphConsumer CI MUST use the job names and responsibilities the jobs table on the Continuous Integration page states.
Applies toartifact: any
Why
The release job reruns the table's jobs by name, and the branch protection settings require them by name. When a consumer renames a job or moves its checks elsewhere, those references point at a job that no longer exists, and the gate stops checking without failing. Fixed names and responsibilities keep every reference resolving to the checks the table states.
Checka reviewer answers
Reviewed forThe consumer workflows use the job names and responsibilities the jobs table states.
Marked guidance: a reviewer answers this question.
Keep Each Alert Threshold to Its Requirement's Measure#
rulerulecheckablelitespec/ext/delivery#keep-each-alert-threshold-to-its-requirements-measureAn alert rule MUST state every number its requirement's measure names in its own expression or threshold.
Applies toartifact: any
Why
The requirement's measure is the agreed target, and the alert is the one place it is enforced at runtime. A measure that says two seconds and an alert that fires at five drift apart silently, because nobody re-reads the alert when the requirement changes. Comparing the numbers is a coarse check, since a measure is prose, so it advises rather than blocks.
Example
requirement/expense-submission.month-end-submissions measures "at least 99 percent within two seconds", and its alert's expression compares the 0.99 quantile against 2.
Checkchecked by a tool
Checked bylitespec model check reports alert-threshold-drift (level A) for an alert rule whose own text carries none of the decimal numbers its requirement's measure names.
Marked checkable: the tool named here checks it.
Record Each Drill Run as a Check Result#
ruleruleguidancelitespec/ext/delivery#record-each-drill-run-as-a-check-resultA drill or measuring harness that checks a quality requirement MUST write each run as a check result naming the requirement's check, kept under the project's paths.checkResults.
Applies toartifact: any
Why
A drill rehearses a procedure against a running deployment, and a harness measures from outside: neither is a test, and neither runs in the test job, so their outcome lives only in a terminal or a pasted note that no tool reads. Writing each run as a small result file in Proof gives the quality requirement the same evidence a measured check gives it, under the same check name, with the date it ran and the value it saw.
Example
Claimwick's month-end load harness writes .litespec/proof/checks/2026-11-20-month-end-load.json holding "check": "month-end-load", "passed": true, "value": "99.4 percent acknowledged within two seconds", and "ranOn": "2026-11-20", and requirement/expense-submission.month-end-submissions names month-end-load in its check.
Checka reviewer answers
Reviewed forWhich drill or measuring harness runs lack a check result file naming the requirement's check under paths.checkResults? Look at the harness run records beside the files under paths.checkResults.
Marked guidance: a reviewer answers this question.
Define Backup and Restore Behavior#
ruleruleguidancelitespec/ext/delivery#define-backup-and-restore-behaviorA release MUST document backup owner, schedule, retention, encryption, location, restore command, and recovery objectives.
Applies toartifact: any
Why
A backup is only as good as its restore: without a named owner, a schedule, a retention bound, encryption, a location, a restore command, and recovery objectives, nobody knows what is kept, who restores it, or how much loss is accepted. Writing all seven down before production data arrives leaves nothing to decide during the incident.
Checka reviewer answers
Reviewed forThe release documentation states backup owner, schedule, retention, encryption, location, restore command, and recovery objectives.
Marked guidance: a reviewer answers this question.
Exercise a Restore Before the First Production Data#
ruleruleguidancelitespec/ext/delivery#exercise-a-restore-before-the-first-production-dataA project MUST rehearse a restore on representative data before its first deployment holds production data.
Applies toartifact: any
Why
Backups fail in ways only a restore reveals: a missing key, a wrong permission, a dump the new version cannot read. Rehearsing on representative data before production data arrives finds those failures while they cost nothing. The first restore attempt is the wrong time to learn the backup cannot restore.
Checka reviewer answers
Reviewed forThe operations log holds a restore rehearsal on representative data before the first production data.
Marked guidance: a reviewer answers this question.
Use a Repeatable Deployment#
ruleruleguidancelitespec/ext/delivery#use-a-repeatable-deploymentA deployment MUST use versioned artifacts, declared configuration, a schema step, readiness checks, and a passing release job.
Applies toartifact: any
Why
A repeatable deployment names everything it ships: a versioned artifact, declared configuration, a schema step, readiness checks, and a passing release job. Deploying from an uncommitted tree or a mutable branch reference makes the deployed content unknowable afterwards, because the same reference points at different code a week later. Named inputs let any deployment be repeated and any incident be traced to its exact content.
Checka reviewer answers
Reviewed forEach deployment names versioned artifacts, declared configuration, a schema step, readiness checks, and a passing release job.
Marked guidance: a reviewer answers this question.
Keep Rollback Executable#
ruleruleguidancelitespec/ext/delivery#keep-rollback-executableThe rollback runbook MUST state the previous artifact reference, command, configuration and schema compatibility, data recovery condition, and the expand-and-contract sequence for destructive schema work, and name the previous image digest for a container release.
Applies toartifact: record:runbook
Why
Rollback is written during the incident if it is not written before it, and an incident is the worst time to work out which artifact was live, which command restores it, and whether the schema still fits. Stating the previous artifact reference, the command, the configuration and schema compatibility, the data recovery condition, and the expand-and-contract sequence keeps each answer ready. For a container release the runbook names the previous image digest, which names one immutable image where a tag alone could have moved since the release went out. Rollback is a required runbook, so litespec/ext/delivery#exercise-every-runbook-before-release rehearses it.
Checka reviewer answers
Reviewed forThe rollback runbook states its artifact reference, command, compatibility, data condition, and expand-and-contract sequence, and the previous image digest for a container release.
Marked guidance: a reviewer answers this question.
Report Liveness from Every Recurring Job#
ruleruleguidancelitespec/ext/delivery#report-liveness-from-every-recurring-jobEvery recurring job MUST report liveness that pages a person when the job goes silent.
Applies toartifact: job
Why
A recurring job with nothing to do is quiet, and a recurring job that stopped is quiet too. Without a liveness signal that pages a person on silence, the two stay indistinguishable until somebody notices the missing output. Liveness turns a quiet job from an observation into an alarm.
Checka reviewer answers
Reviewed forEach recurring job reports liveness that pages a person on silence.
Marked guidance: a reviewer answers this question.
Define Actionable Baseline Alerts#
ruleruleguidancelitespec/ext/delivery#define-actionable-baseline-alertsA baseline alert MUST declare owner, threshold, evaluation window, severity, and runbook before a production release.
Applies toartifact: any
Why
Each declared field answers one failure mode:
- An alert with no owner waits for somebody to adopt it.
- An alert with no threshold or evaluation window fires on noise.
- An alert with no severity waits in the wrong queue.
- An alert with no runbook asks its receiver to invent the response.
Declaring all five before production makes each alert answerable the first time it fires.
Checka reviewer answers
Reviewed forEach baseline alert declares owner, threshold, window, severity, and runbook.
Marked guidance: a reviewer answers this question.
Cover the Baseline Alert Set#
ruleruleguidancelitespec/ext/delivery#cover-the-baseline-alert-setBaseline coverage MUST include sustained readiness failures, unexpected HTTP errors, release-flow latency, PostgreSQL outages, and failed deployments.
Applies toartifact: any
Why
Five failures end a release when nobody observes them: readiness that never recovers, HTTP errors the code did not expect, a slowing release flow, a lost database, and a deployment that failed partway. Naming them as the minimum coverage keeps a team from declaring alerts only for the failure it just survived.
Checka reviewer answers
Reviewed forThe baseline alerts cover readiness failures, unexpected HTTP errors, release-flow latency, PostgreSQL outages, and failed deployments.
Marked guidance: a reviewer answers this question.
Route Each Severity to a Declared Destination#
ruleruleguidancelitespec/ext/delivery#route-each-severity-to-a-declared-destinationAn alert inventory MUST state, for each severity it uses, the destination that receives the alert and the response time expected of it.
Applies toartifact: any
Why
A declared severity with no destination is a label: every alert arrives in the same place, and the page that wakes somebody is read beside the one that can wait. Routing each severity to its destination with an expected response time separates the page from the ticket, which is the separation Prometheus alerting practice states. The limits page declares the routing beside the generated inventory.
Example
A two-severity inventory routes page to the on-call destination with a stated response time, and ticket to the queue reviewed each working day.
Checka reviewer answers
Reviewed forEach severity states its destination and expected response time on the limits page.
Marked guidance: a reviewer answers this question.
Exercise Every Runbook Before Release#
ruleruleguidancelitespec/ext/delivery#exercise-every-runbook-before-releaseEach required runbook MUST carry a dated rehearsal in the operations log before a production release, with restore rehearsed on representative data.
Applies toartifact: record:runbook
Why
A runbook is a claim until somebody runs it: steps go stale, commands change, permissions lapse. A dated rehearsal in the operations log proves each required runbook still works against the current system. The restore rehearsal is the one litespec/ext/delivery#exercise-a-restore-before-the-first-production-data requires.
Checka reviewer answers
Reviewed forEach required runbook carries a dated rehearsal in the operations log.
Marked guidance: a reviewer answers this question.
State Availability Objectives as OpenSLO Files#
ruleruleguidancelitespec/ext/delivery#state-availability-objectives-as-openslo-filesA production release MUST state its availability and latency objectives as OpenSLO files compiled by Sloth.
Applies toartifact: any
Why
OpenSLO files state objectives as code, and Sloth validates them in CI and compiles them into Prometheus recording rules and burn-rate alerts. OpenTelemetry supplies the signals the objectives read, as litespec/quality/operations#emit-correlated-diagnostics states. Sloth and OpenTelemetry are free and maintained under Apache-2.0, and availability stays evidenced in production only.
Checka reviewer answers
Reviewed forThe OpenSLO files pass Sloth validation with their generated alerts loaded.
Marked guidance: a reviewer answers this question.
Attach Dashboard Links to Production Objectives#
ruleruleguidancelitespec/ext/delivery#attach-dashboard-links-to-production-objectivesEach production objective MUST link to its dashboard in the book.
Applies toartifact: any
Why
The book states intent while dashboards show production truth, and the link joins them: a reviewer clicks from the objective to the numbers behind it. Copying numbers into the page instead would freeze production truth at commit time.
Checka reviewer answers
Reviewed forEach production objective in the book links its dashboard.
Marked guidance: a reviewer answers this question.
Match Every Shipped Package to Its Pin#
rulerulecheckablelitespec/ext/delivery#match-every-shipped-package-to-its-pinEvery direct package in the project's generated bill of materials that the manifest pins MUST ship at the pinned version.
Applies toartifact: any
Why
The bill of materials (SBOM) is the computed list of what ships, so it is the one place a pin can be checked against instead of trusted. A version that drifted from its pin carries advisories and behavior the release never reviewed. The bill is generated, so the fact stays written once, and a record per package would rewrite hundreds of facts on every update.
Example
Claimwick's bill of materials sits at .litespec/proof/sbom/api.spdx.json, the project file names that folder in paths.sbom, and a direct pkg:nuget/Marten at a version other than the manifest pin is reported.
Checkchecked by a tool
Checked bylitespec model check reports dependency-version-drift (level S) for a direct package whose version differs from its manifest pin.
Marked checkable: the tool named here checks it.
Accept Every Shipped Package License Explicitly#
rulerulecheckablelitespec/ext/delivery#accept-every-shipped-package-license-explicitlyEvery direct package in the project's generated bill of materials MUST carry a license the project accepts in dependencies.licenses, or one its admits entry names.
Applies toartifact: any
Why
A copyleft or commercial license binds the product the day the package ships, and a license nobody accepted is found at an audit rather than at the change that brought it. Listing the accepted licenses once, and naming any other on the admitting decision, keeps the license choice a decision with a person's name on it.
Example
Claimwick accepts MIT, Apache-2.0, and BSD-3-Clause in dependencies.licenses, so a direct package under AGPL-3.0-only that no decision admits is reported.
Checkchecked by a tool
Checked bylitespec model check reports dependency-license-unknown (level S) for a direct package whose license the project does not accept and no admits entry names.
Marked checkable: the tool named here checks it.
Build Release Images in Stages#
ruleruleguidancelitespec/ext/delivery#build-release-images-in-stagesA release image MUST use multi-stage builds and pinned base-image digests.
Applies toartifact: any
Why
Build tooling has no place in a runtime image: each compiler and package cache widens the attack surface of every deployment. Multi-stage builds leave that tooling in the build stage. A pinned base-image digest fixes the exact reviewed base, so a rebuild months later starts from the same bytes.
Checka reviewer answers
Reviewed forWhich release images miss multi-stage builds or pinned base-image digests? Look at the Dockerfiles.
Marked guidance: a reviewer answers this question.
Run Images as Non-Root#
ruleruleguidancelitespec/ext/delivery#run-images-as-non-rootA release image MUST run its application with a non-root runtime user.
Applies toartifact: any
Why
A compromised application process inherits the rights of its runtime user. A non-root user confines the attacker to what that user may touch. Root would hand over the whole container.
Checka reviewer answers
Reviewed forWhich release images run their application as root? Look at the Dockerfiles and image configuration.
Marked guidance: a reviewer answers this question.
Copy Only Runtime Files#
ruleruleguidancelitespec/ext/delivery#copy-only-runtime-filesA runtime image MUST contain only files required to run the deployed application.
Applies toartifact: any
Why
Every file in the runtime image ships to every replica and waits for an attacker to read it. Copying only the files the application needs keeps the image small to transfer and to inspect. Each extra file is cost with no runtime purpose.
Checka reviewer answers
Reviewed forWhich runtime images carry files outside the declared runtime manifest? Look at the image file listing beside the declared runtime manifest.
Marked guidance: a reviewer answers this question.
Exclude Build Material from Runtime Images#
ruleruleguidancelitespec/ext/delivery#exclude-build-material-from-runtime-imagesA runtime image MUST NOT contain source, tests, package caches, or local configuration.
Applies toartifact: any
Why
Source, tests, package caches, and local configuration serve the build and never the running application. Carrying them into production leaks internals to anyone who pulls the image. Secrets stay out under litespec/quality/security#keep-secrets-out-of-tracked-and-observable-data.
Checka reviewer answers
Reviewed forWhich runtime images contain source, tests, package caches, or local configuration? Look at the runtime image contents.
Marked guidance: a reviewer answers this question.
Supply Runtime Configuration Externally#
ruleruleguidancelitespec/ext/delivery#supply-runtime-configuration-externallyA deployment platform MUST supply connection strings, OIDC settings, exporter endpoints, and secrets outside the image.
Applies toartifact: any
Why
Connection strings, OIDC settings, exporter endpoints, and secrets differ by environment. Supplying them outside the image lets one image serve every environment. Baking them in would rebuild and re-test the image for each environment it enters.
Checka reviewer answers
Reviewed forWhich connection strings, OIDC settings, exporter endpoints, or secrets live inside the image? Look at the deployment manifests.
Marked guidance: a reviewer answers this question.
Exclude Environment Configuration from Images#
ruleruleguidancelitespec/ext/delivery#exclude-environment-configuration-from-imagesA release image MUST NOT contain environment-specific configuration.
Applies toartifact: any
Why
One immutable image deploys unchanged into staging and production. Environment values baked into the image break that promise: the tested bytes and the deployed bytes differ. External values keep the image identical everywhere it runs.
Checka reviewer answers
Reviewed forWhich release images contain environment-specific configuration? Look at the release image contents.
Marked guidance: a reviewer answers this question.
Apply Schema Work Before Traffic#
ruleruleguidancelitespec/ext/delivery#apply-schema-work-before-trafficA release job MUST apply reviewed schema changes before traffic shifts to new application replicas, under litespec/backend/persistence#control-production-schema-changes.
Applies toartifact: any
Why
New application replicas expect the schema their release reviewed. The release job applies those schema changes before traffic shifts, under litespec/backend/persistence#control-production-schema-changes. Traffic first would send new code against an old schema.
Checka reviewer answers
Reviewed forWhich releases shift traffic before the reviewed schema job runs? Look at the release job order.
Marked guidance: a reviewer answers this question.
Keep Schema Work Out of Startup#
ruleruleguidancelitespec/ext/delivery#keep-schema-work-out-of-startupAn application replica MUST NOT alter the production schema during startup, under litespec/backend/persistence#control-production-schema-changes.
Applies toartifact: any
Why
Several replicas can start at once, each running its own startup. Schema work in startup then runs concurrently, without the release job's review and ordering. Startup reads the schema the release job prepared and changes nothing.
Checka reviewer answers
Reviewed forWhich application replicas alter the production schema during startup? Look at the replica startup paths.
Marked guidance: a reviewer answers this question.
Wait for Replica Readiness#
ruleruleguidancelitespec/ext/delivery#wait-for-replica-readinessA deployment controller MUST start new replicas and wait for readiness before shifting traffic.
Applies toartifact: any
Why
New replicas need time to load before they serve: a replica that receives traffic mid-startup fails its first requests. The controller starts them, waits for readiness, and only then shifts traffic. Readiness proves the new version serves before it becomes the version.
Checka reviewer answers
Reviewed forWhich deployments shift traffic before new replicas reach readiness? Look at the deployment controller behavior.
Marked guidance: a reviewer answers this question.
Test Released Traffic#
ruleruleguidancelitespec/ext/delivery#test-released-trafficA release deployment MUST run the release's recorded end-to-end suite after traffic reaches the new version.
Applies toartifact: any
Why
An image that builds can still fail where it runs: routing, configuration, and data differ from the build machine. Running the release's recorded end-to-end suite after traffic shifts tests the deployed path itself. The release record names the suite, so the check runs the same tests every release.
Checka reviewer answers
Reviewed forWhich releases skip the recorded end-to-end suite after traffic shifts? Look at the release evidence.
Marked guidance: a reviewer answers this question.
Limit Container Privileges#
ruleruleguidancelitespec/ext/delivery#limit-container-privilegesA deployment MUST use a read-only filesystem when the application permits it and drop unnecessary capabilities.
Applies toartifact: any
Why
A read-only filesystem and dropped capabilities shrink what a compromised process can do next: no writes outside declared paths, no privileged calls it never needed. The limits apply where the application permits them. Each kept capability is an action an attacker inherits.
Checka reviewer answers
Reviewed forWhich deployments keep a writable filesystem or unnecessary capabilities where the application permits the limits? Look at the deployment manifests.
Marked guidance: a reviewer answers this question.
Declare Writable Paths and Limits#
ruleruleguidancelitespec/ext/delivery#declare-writable-paths-and-limitsA deployment MUST declare writable paths and record CPU and memory bounds as setting records.
Applies toartifact: any
Why
Declared writable paths name the mutable storage the application needs, and CPU and memory bounds as setting records cap what one deployment may consume. The bounds protect the node's capacity from one hungry replica. The declarations also tell the next reader what the application was sized for.
Checka reviewer answers
Reviewed forWhich deployments miss declared writable paths or CPU and memory setting records? Look at the deployment manifests beside the setting records.
Marked guidance: a reviewer answers this question.
Run the Application as PID 1#
ruleruleguidancelitespec/ext/delivery#run-the-application-as-pid-1A container MUST run the application as its entry process.
Applies toartifact: any
Why
The platform stops a container by signaling its entry process. An application running as PID 1 receives that signal and shuts down on purpose. A wrapper that swallows the signal leaves the platform waiting until it kills the container mid-work.
Checka reviewer answers
Reviewed forWhich containers run something other than the application as their entry process? Look at the image entrypoints.
Marked guidance: a reviewer answers this question.
Set Sufficient Shutdown Time#
ruleruleguidancelitespec/ext/delivery#set-sufficient-shutdown-timeA deployment MUST set a shutdown grace period longer than measured request or Worker stop time.
Applies toartifact: any
Why
Stopping a replica interrupts its in-flight requests and Worker operations. A grace period longer than the measured stop time lets that work finish or record a safe interruption. A shorter period kills work the system then has to reconcile.
Checka reviewer answers
Reviewed forWhich deployments set a shutdown grace period no longer than measured request or Worker stop time? Look at the deployment manifests beside the measured stop times.
Marked guidance: a reviewer answers this question.
Write Runtime Logs to Streams#
ruleruleguidancelitespec/ext/delivery#write-runtime-logs-to-streamsA containerized application MUST write logs to standard output or standard error.
Applies toartifact: any
Why
Container filesystems vanish with their replicas, so a log file inside the container dies with the evidence it holds. Standard output and standard error hand each line to the platform's log collection. The platform then keeps logs past the life of any one replica.
Checka reviewer answers
Reviewed forWhich containerized applications write logs somewhere other than standard output or standard error? Look at the application logging configuration.
Marked guidance: a reviewer answers this question.
Keep Mutable Data External#
ruleruleguidancelitespec/ext/delivery#keep-mutable-data-externalA containerized application MUST keep mutable data outside its container filesystem.
Applies toartifact: any
Why
The platform recreates replicas at will: deploys, scaling, and node failures each replace containers with fresh ones. Mutable data kept inside the container filesystem dies with its replica. External storage keeps the data alive across every recreation.
Checka reviewer answers
Reviewed forWhich mutable data lives inside a container filesystem? Look at the application storage design.
Marked guidance: a reviewer answers this question.
Apply OCI Release Labels#
ruleruleguidancelitespec/ext/delivery#apply-oci-release-labelsA release image MUST include OCI source, revision, version, and created-time labels.
Applies toartifact: any
Why
Source, revision, version, and created-time labels in the OCI standard form connect each image to the commit and release that produced it. An incident responder reads the running image's labels and opens the exact source. Images without labels force that join through guesswork.
Checka reviewer answers
Reviewed forWhich release images miss OCI source, revision, version, or created-time labels? Look at the built images.
Marked guidance: a reviewer answers this question.
Record Image Digests#
ruleruleguidancelitespec/ext/delivery#record-image-digestsA release record MUST store the deployed image digest rather than only an image tag.
Applies toartifact: any
Why
The release record stores the deployed digest, not just the tag. A tag can move to a newer image after release, while the digest names the exact bytes that went out. The digest makes the deployed artifact reproducible and the rollback target exact.
Checka reviewer answers
Reviewed forWhich release records store only an image tag with no deployed digest? Look at the release records.
Marked guidance: a reviewer answers this question.
Exclude Build Timestamps from Contracts#
ruleruleguidancelitespec/ext/delivery#exclude-build-timestamps-from-contractsA published OpenAPI document or generated client MUST NOT contain a build timestamp.
Applies toartifact: any
Why
A generated-at field or a build-time comment changes the OpenAPI document and generated clients on every build. The diff then reports change where no contract changed, which buries real breaks. Contracts carry version identity instead of build time.
Checka reviewer answers
Reviewed forWhich published OpenAPI documents or generated clients contain a build timestamp? Look at the generated contracts.
Marked guidance: a reviewer answers this question.
Separate Frontend Configuration Classes#
ruleruleguidancelitespec/ext/delivery#separate-frontend-configuration-classesA frontend image build MUST distinguish public build-time configuration from server-only runtime secrets.
Applies toartifact: any
Why
A frontend build produces a browser bundle that anyone may download. Public build-time configuration belongs there, while server-only runtime secrets travel through mounts or runtime injection instead. The build distinguishes the two classes so each value lands in its own delivery.
Checka reviewer answers
Reviewed forWhich frontend builds mix public configuration with server-only secrets? Look at the frontend image build.
Marked guidance: a reviewer answers this question.
Use Protected Frontend Secret Delivery#
ruleruleguidancelitespec/ext/delivery#use-protected-frontend-secret-deliveryA frontend image build MUST use secret mounts or runtime injection for secrets.
Applies toartifact: any
Why
Secret mounts and runtime injection hand secrets to the build without writing them into a layer. Nothing secret then persists in the image history. A pulled image reveals its layers to anyone, so image history stays free of secrets.
Checka reviewer answers
Reviewed forWhich frontend secrets travel outside mounts or runtime injection? Look at the frontend image build.
Marked guidance: a reviewer answers this question.
Exclude Insecure Frontend Secret Carriers#
ruleruleguidancelitespec/ext/delivery#exclude-insecure-frontend-secret-carriersA frontend image build MUST NOT use ARG, copied environment files, or image layers for secrets.
Applies toartifact: any
Why
ARG values, copied environment files, and image layers all persist into the image history. A secret delivered through any of them stays readable to anyone who pulls the image. Secrets stay out of layers under litespec/quality/security#keep-secrets-out-of-tracked-and-observable-data.
Checka reviewer answers
Reviewed forWhich frontend image builds use ARG, copied environment files, or image layers for secrets? Look at the frontend image builds.
Marked guidance: a reviewer answers this question.
Conventions#
Treat Check Warnings as Failures#
conventiondefaultguidancelitespec/ext/delivery#treat-check-warnings-as-failuresTreat build and lint warnings as failures unless the build configuration records a narrow suppression with its reason.
ReplacementA consumer records a warnings convention naming which warnings fail its build.
Applies toartifact: any
Why
Warnings that nobody reviews accumulate until a real defect hides among them. Failing on warnings forces each one to be fixed or narrowly suppressed with its reason, so a changed compiler, linter, or dependency boundary surfaces immediately.
Checka reviewer answers
Reviewed forWhich builds pass with unreviewed warnings outside recorded suppressions? Look at the build logs beside the warnings convention.
Marked guidance: a reviewer answers this question.
Apply the Documented Defaults#
conventiondefaultguidancelitespec/ext/delivery#apply-the-documented-defaultsKeep one workflow per job the jobs table lists and use the job names the jobs table states.
ReplacementA consumer records a workflow-layout convention naming its workflow files and job names.
Applies toartifact: any
Why
One workflow per job keeps each gate readable, runnable, and skippable on its own. When containerized integration tests or browser tests join CI, they join as jobs the table names rather than as hidden steps inside another job, so the selection rules and the branch protection keep working unchanged.
Checka reviewer answers
Reviewed forEach consumer workflow file matches one jobs-table job and name, or the workflow-layout convention names another arrangement.
Marked guidance: a reviewer answers this question.
Use Stable Service Names#
conventiondefaultguidancelitespec/ext/delivery#use-stable-service-namesKeep service, resource, meter, and trace-source names identical across environments.
ReplacementA consumer records a service-naming convention naming how its services, resources, meters, and trace sources are named.
Applies toartifact: any
Why
Dashboards and alerts reference services by name. When a name changes with each deployment, every reference breaks and must be rebuilt before the new deployment can be watched. Identical names across environments keep one dashboard and one alert set working everywhere.
Checka reviewer answers
Reviewed forService, resource, meter, and trace-source names match across environments, or the service-naming convention names another arrangement.
Marked guidance: a reviewer answers this question.
Keep Deployment Descriptors Together#
conventiondefaultguidancelitespec/ext/delivery#keep-deployment-descriptors-togetherKeep compose files, proxy configuration, the environment example, database setup, observability, DNS records, alert definitions, service definitions, and bootstrap scripts under one deploy/ tree.
ReplacementA consumer records a deployment-layout convention naming where its deployment descriptors live.
Applies toartifact: any
Why
Deployment spreads across compose files, proxy configuration, environment examples, database setup, observability, DNS records, alert definitions, service definitions, and bootstrap scripts. Scattered across the workspace, one of them is always the file nobody finds during an incident. One deploy/ tree keeps every descriptor where the operator looks first.
Checka reviewer answers
Reviewed forThe deployment descriptors sit under one deploy/ tree, or the deployment-layout convention names another arrangement.
Marked guidance: a reviewer answers this question.
Keep Scripts at the Root#
conventiondefaultguidancelitespec/ext/delivery#keep-scripts-at-the-rootKeep bootstrap, release, and CI helper scripts under root scripts/.
ReplacementA project that organizes scripts per application records its own script layout in its project documentation.
Applies toartifact: any
Why
Bootstrap, release, and CI helper scripts serve the whole workspace, so the root scripts/ folder keeps them where every caller looks. An application-specific script may stay inside its application when no other workspace calls it.
Checka reviewer answers
Reviewed forBootstrap, release, and CI helper scripts sit under root scripts/; where replaced, the project documentation names the project's own script layout.
Marked guidance: a reviewer answers this question.
Place Dockerfiles Beside Deployables#
conventiondefaultguidancelitespec/ext/delivery#place-dockerfiles-beside-deployablesKeep one Dockerfile beside each deployable application.
ReplacementA consumer records a dockerfile-layout convention naming where its Dockerfiles live.
Applies toartifact: any
Why
One Dockerfile beside each deployable application keeps the image definition with the project that defines its runtime output. A reader finds the build next to the code it ships. A shared folder of Dockerfiles separates each build from its owner.
Checka reviewer answers
Reviewed forEach deployable application keeps its Dockerfile beside it, or the recorded dockerfile-layout convention names where its Dockerfiles live.
Marked guidance: a reviewer answers this question.
Build from the Workspace Root#
conventiondefaultguidancelitespec/ext/delivery#build-from-the-workspace-rootBuild images from the workspace root when shared project or package files are required.
ReplacementA consumer records a build-context convention naming the context its image builds use.
Applies toartifact: any
Why
Shared project and package files sit above any one application, so the build starts from the workspace root to reach them. The Dockerfile excludes what the build does not need, including unrelated secrets. A narrower context would copy shared inputs into each build or miss them.
Checka reviewer answers
Reviewed forImage builds needing shared inputs start from the workspace root, or the recorded build-context convention names the context its image builds use.
Marked guidance: a reviewer answers this question.
Dependencies#
Packages: None.
Related extensions: stage for the period before the first customer data.
Guides: None.