Offline Kit Import Verification Runbook
Status: script paths re-checked against commit
942a18727c(2026-09-26); the script behaviour and exit codes were not re-verified.
This runbook supports AIRGAP-MANIFEST-510-010, AIRGAP-REPLAY-510-013, and AIRGAP-VERIFY-510-014. It validates bundles fully offline and enforces replay depth.
Replay depth levels (manifest replayPolicy)
hash-only: verify manifest/bundle digests, staleness window, optional signature.full-recompute: hash-only + every chunk hash + AV report hash.policy-freeze: full-recompute + manifest policies must include the sealed policy hash (prevents imports with drifting policy/graph material).
Quick steps
src/OfflineKit/scripts/verify-kit.sh \
--manifest offline-kit/manifest.json \
--bundle offline-kit/bundle.tar.gz \
--signature offline-kit/manifest.sig --pubkey offline-kit/manifest.pub.pem \
--av-report offline-kit/reports/av-report.json \
--receipt offline-kit/receipts/ingress.json \
--sealed-policy-hash "aa55..." \
--depth policy-freeze
What the script enforces
- Manifest & bundle digests match (
hashes.*). - Optional manifest signature is valid (OpenSSL).
- Staleness:
createdAtmust be withinstalenessWindowHoursof--now(defaults to UTC now). - AV:
avScan.statusmust not befindings; ifreportSha256is present, the provided report hash must match. - Chunks (full-recompute/policy-freeze): every
chunks[].pathexists relative to the manifest and matches its recorded SHA-256. - Policy-freeze:
--sealed-policy-hashmust appear inpolicies[].sha256. - Optional:
--expected-graph-shachecks the graph chunk hash;--receiptreusesverify-receipt.shto bind the receipt to the manifest/bundle hashes.
Exit codes: hash mismatch (3/4), staleness (5), AV issues (6–8), chunk drift (9–10), graph mismatch (11), policy drift (12–13), bad depth (14).
Server-side import
This runbook verifies a kit on the client side. It does not admit anything into an estate. The server-side import of a signed carrier is POST /api/offlinekit/v1/import on offlinekit-web (stella airgap import); see ../guides/importer.md. The predecessor controller endpoint POST /system/airgap/verify that applied these replay rules server-side was withdrawn with the airgap-controller host.
References
- Schema:
docs/modules/airgap/schemas/manifest.schema.json - Samples:
docs/modules/airgap/samples/offline-kit-manifest.sample.json,docs/modules/airgap/samples/av-report.sample.json,docs/modules/airgap/samples/receipt.sample.json - Scripts:
src/OfflineKit/scripts/verify-kit.sh,src/OfflineKit/scripts/verify-manifest.sh,src/OfflineKit/scripts/verify-receipt.sh
