AirGap (sealed and offline operation)

Verified against commit 942a18727c (2026-09-26). Re-verify with: find src -type d -name 'StellaOps.AirGap*' -not -path '*__Obsoleted*' -not -path '*/bin/*' -not -path '*/obj/*' and grep -rn 'MapGroup("/system/airgap' src --include=*.cs | grep -v __Obsoleted. src/ is the source of truth; where this page and the code disagree, the code wins.

AirGap is no longer a service. There is no src/AirGap/ tree and no AirGap host: the airgap-controller and airgap-time deployables were withdrawn (source frozen at src/__Obsoleted/AirGap/), and the exchange libraries moved into the OfflineKit family. This directory is the dossier for the concepts of sealed and offline operation that the code still implements, and it names the service or library that implements each one.

Who owns what

ConcernOwnerWhere
Sealed posture and time-anchor custodyPlatformplatform.environment_state, state classes airgap-seal and time-anchor; PUT/GET /api/v1/platform/environment-state/{stateClass}/{scope} (src/Platform/StellaOps.Platform.WebService/Endpoints/EnvironmentStateEndpoints.cs)
Posture interpretation and egress policyshared library, domain-neutralsrc/__Libraries/StellaOps.AirGap.Policy (IEgressPolicy, Posture/, Time/), …AirGap.Policy.Replication (local posture replica), …AirGap.Policy.Analyzers
Carrier envelope, trust profiles, trust-snapshot importOfflineKitsrc/OfflineKit/__Libraries/StellaOps.AirGap.Bundle
Client-side pre-import verification, quarantine, evidence reconciliationOfflineKit (consumed by the CLI)src/OfflineKit/__Libraries/StellaOps.AirGap.Importer
RFC3161 time-token verificationOfflineKitsrc/OfflineKit/__Libraries/StellaOps.AirGap.Time.Verification
Verified carrier import (the sanctioned ingress of a sealed estate)OfflineKitPOST /api/offlinekit/v1/import on offlinekit-web; see OfflineKit
Sealed-mode enforcement face (/system/airgap/*)Policy Enginesrc/Policy/StellaOps.Policy.Engine/Endpoints/{SealedModeEndpoints,StalenessEndpoints,AirGapNotificationEndpoints}.cs

Platform validates who may declare a document; it never interprets one. Consumers replicate the environment_state catalog into their own database and read posture locally, so a down Platform never blocks a posture read. Hosts that compose the replica at this commit: Platform, Policy Engine, Notify worker, OfflineKit web, Authority, Signals and the Vulnerabilities worker (grep AddAirGapPostureReplica / PostureReplication).

Operating a sealed estate

StepCommand or surface
Declare sealed / unsealedstella airgap seal / stella airgap unseal (write the airgap-seal document; scope defaults to installation)
Read posturestella airgap status; GET /api/v1/platform/environment-state/airgap-seal/{scope}
Declare trusted timestella airgap time-anchor declare --token <rfc3161> --trust-roots <pem>: verifies the token locally, then declares the time-anchor document
Inspect trusted timestella airgap time-anchor status [--trust-roots <pem>]
Bring content instella airgap pull --run <id> on the producing estate, then stella airgap import on the sealed one; runbook ../../runbooks/airgap/offlinekit-import.md
Compare two envelopesstella airgap diff
Verify egress is blockedguides/sealing-and-egress.md

Scopes (src/Authority/StellaOps.Authority/StellaOps.Auth.Abstractions/StellaOpsScopes.cs): envstate:read, envstate:airgap-seal:write, envstate:time-anchor:write; the legacy airgap:status:read and airgap:seal grants are accepted as aliases for the read and seal-write policies. airgap:import gates the OfflineKit import.

Documents in this directory

Withdrawn material (the controller and time host contracts, the knowledge-snapshot dialect, the HLC job-sync bundles, planning records and guides built on commands that do not exist) is frozen under docs-archive/modules/airgap/ and docs-archive/modules/airgap-controller/.