AirGap Quarantine Investigation Runbook
Scope. This is the CLI’s client-side quarantine (
FileSystemQuarantineServiceinsrc/OfflineKit/__Libraries/StellaOps.AirGap.Importer/Quarantine/, used bystella offline import). It is not the OfflineKit service’s server-side quarantine:offlinekit-webdeletes rejected bytes from its privatequarantine/directory and never keeps them. Verified against commit942a18727c(2026-09-26): default root/updates/quarantine, sectionAirGap:Quarantine(QuarantineRoot,RetentionPeriod30 days,MaxQuarantineSizeBytes10 GiB,EnableAutomaticCleanup), entry files and the.removed/staging directory.
Purpose
Quarantine preserves failed bundle imports for offline forensic analysis. It keeps the original bundle and the verification context (reason + logs) so operators can diagnose tampering, trust-root drift, or packaging issues without re-running in an online environment.
Location & Structure
Default root: /updates/quarantine
Per-tenant layout: /updates/quarantine/<tenantId>/<timestamp>-<reason>-<id>/
Removal staging: /updates/quarantine/<tenantId>/.removed/<quarantineId>/
Files in a quarantine entry
bundle.tar.zst- the original bundle as providedmanifest.json- bundle manifest (when available)verification.log- validation step output (TUF/DSSE/Merkle/rotation/monotonicity, etc.)failure-reason.txt- human-readable failure summary (reason + timestamp + metadata)quarantine.json- structured metadata for listing/automation
Investigation steps (offline)
- Identify the tenant and locate the quarantine root on the importer host.
- Pick the newest quarantine entry for the tenant (timestamp prefix).
- Read
failure-reason.txtfirst to capture the top-level reason and metadata. - Review
verification.logfor the precise failing step. - If needed, extract and inspect
bundle.tar.zstin an isolated workspace (no network). - Decide whether the entry should be retained (for audit) or removed after investigation.
Removal & Retention
- Removal requires a human-provided reason (audit trail). Implementations should use the quarantine service’s remove operation which moves entries under
.removed/. - Retention and quota controls are configured via
AirGap:Quarantinesettings (root, TTL, max size); TTL cleanup can remove entries older than the retention period.
Common failure categories
tuf:*- invalid/expired metadata or snapshot hash mismatchdsse:*- signature invalid or trust root mismatchmerkle-*- payload entry set invalid or emptyrotation:*- root rotation policy failure (dual approval, no-op rotation, etc.)version-non-monotonic:*- rollback prevention triggered (force activation requires a justification)
