Tools · CLIN 0005 Tactical & DevSecOps
Offline Manifest Inspector
PlannedRead container manifests, package lockfiles and SBOMs with no network connection.
This tool is planned. There is nothing to open yet. What follows is the plan, and it can change before the tool ships. The guide below covers the same job by hand in the meantime. Jump to the full specification.
What it will do
Open a container image manifest, a package lockfile or a software bill of materials and read what is inside with no network connection: the components, their versions, their checksums and where each was resolved from. It is meant for reviewing what is about to be carried onto a closed network.
You bring
- A container image manifest, a package lockfile or an SBOM
You get
- The components, with their versions and checksums
- The packages resolved from a public registry, which would need a mirror inside
Built from
- The Open Container Initiative image specification
- The SPDX and CycloneDX specifications
- NTIA, “The Minimum Elements For a Software Bill of Materials (SBOM)”, 2021
Only material the government has officially released to the public. Where the rules live shows how to find and cite each one.
Do it by hand today
- Working on disconnected networks · LockfilesThe checks you run by hand when nothing can phone home: checksums, transfer manifests, certificates, lockfiles and image digests.
- STIGs, OSCAL and SBOMs · What an SBOM isThree machine-readable formats that security compliance work runs on: what each one is, what is inside the file and how to check one.
True of every tool
- Free and open source.
- No paid tier, no ads, and the code is public.
- Runs in your browser.
- What you type or open is not sent anywhere.
- No tracking.
- No accounts, cookies or analytics.
- Shows its sources.
- Each result names the rule it rests on, so you can check it.
- Says what it does not do.
- It is an aid for your own work, not professional advice.
What happens to what you type shows how to confirm this yourself, and Check a tool’s answer is the method for verifying a result.
Want it sooner?
Requests decide what is built first. Say what you would use it for, and what you do by hand today.
Issues are public. Leave out real contract data, real rates and anything controlled. How to write a useful request.
Specification · draft
How it is meant to work, in detail
The inputs, the logic, the checks the tool has to pass and the worked examples it is tested against. It is a draft, and the tool is built from it, so it can change until the tool ships.
4 min readLast revised November 2026Source of this specification
Overview & Role#
Offline Manifest Inspector (slug: offline-manifest-inspector, CLIN 0005 — Tactical & DevSecOps) is a client-side static inspection tool in the ClearedStack catalog. On disconnected or air-gapped networks, package managers (npm), container runtimes (containerd), and security scanners cannot reach public registries, OSV/NVD feeds, or remote metadata endpoints. Engineers must inspect what is inside a container image manifest, a dependency lockfile, or a Software Bill of Materials (SBOM) locally before importing artifacts into an enclave.
The tool runs entirely in the visitor's browser with zero backend dependencies, making it available in both the Full Enclave Stack (Conn + Lazarette) and Snapshot Mode (frozen static bundle). Consistent with ClearedStack's architecture, it assumes containerd and OCI archives with zero Docker anywhere.
Governing Standards & Sources#
Every parser rule, field label, and digest check in Offline Manifest Inspector is grounded in public specifications:
| Artifact Type | Governing Standard | Key Fields & Rules Checked |
|---|---|---|
| Container Manifests & Indexes | Open Container Initiative (OCI) Image Specification v1.0 / v1.1 (application/vnd.oci.image.manifest.v1+json, application/vnd.oci.image.index.v1+json, oci-layout) | schemaVersion, mediaType, config.digest, layers[].digest and size, multi-arch manifests[].platform, and pinned @sha256: digests vs. mutable tags. |
| Package Lockfiles | npm package-lock.json specification (lockfileVersion 2 and 3) | packages entries, exact version, integrity (Subresource Integrity sha512- / sha256-), and resolved URLs (flagging external public registries that must be mirrored inside the enclave). |
| SPDX SBOMs | SPDX Specification v2.2 / v2.3 / v3.0 (ISO/IEC 5962:2021, JSON encoding) | spdxVersion, SPDXID, packages[].name, versionInfo, licenseConcluded / licenseDeclared, checksums[], and externalRefs (PURL/CPE). |
| CycloneDX SBOMs | CycloneDX Specification v1.4 / v1.5 / v1.6 (ECMA-424, JSON encoding) | bomFormat: "CycloneDX", specVersion, metadata.component, components[].name, version, purl, hashes[], and licenses[]. |
| Cryptographic Hashing | NIST FIPS 180-4 (Secure Hash Standard) | SHA-256 file fingerprinting via the browser Web Crypto API (crypto.subtle.digest("SHA-256", ...)). |
Scope limits: Offline Manifest Inspector performs structural parsing, digest computation, and local policy checks (such as flagging unpinned container tags, external resolved URLs, or components missing cryptographic hashes). It does not query remote vulnerability databases (CVE/NVD/OSV), pull container layers over a network, or make accreditation decisions.
Inputs, Processing Logic & Outputs#
Inputs
- Primary artifact: Drag-and-drop file, local file picker (
File.arrayBuffer()), or pasted JSON text for an OCI manifest/index (manifest.json,index.json),package-lock.json, SPDX JSON, or CycloneDX JSON. - Optional expected digest: A
sha256:<64-hex>string (for example, recorded outside the air gap fromctr -n k8s.io images lsor Lazarette) to compare against the uploaded file's computed SHA-256. - Optional format override: Auto-detection is default; the user may force a specific parser (
oci,npm-lock,spdx,cyclonedx).
Deterministic Browser-Only Processing Logic
- Byte-level SHA-256 fingerprint: Computes
crypto.subtle.digest("SHA-256", rawBytes)immediately in memory and formats the result assha256:<lowercase-64-hex>. If an expected digest was supplied, performs a constant-format lowercase comparison and reportsMATCHorMISMATCH. - Deterministic format detection: Inspects top-level JSON keys without heuristics or AI:
bomFormat === "CycloneDX"→ CycloneDX JSON parser.spdxVersionpresent → SPDX JSON parser.lockfileVersionpresent (2or3) andpackagesobject → npm lockfile parser.schemaVersion === 2with OCI/DockermediaTypeormanifests/layersarrays → OCI Image Manifest / Index parser.
- Structured extraction & enclave checks:
- OCI: Extracts config digest/size, layer digests/sizes, total compressed layer byte sum, and platform descriptors. Flags any image reference using a mutable tag without an
@sha256:digest. - Lockfile: Enumerates all packages, counts
sha512vs.sha256vs. missingintegrityhashes, and inspects everyresolvedURL—flagging any non-internal host (such asregistry.npmjs.org) that must be mirrored before an offlinenpm cibuild. - SBOM: Normalizes packages/components into a unified record (
name,version,purl,license,hashes) and counts missing hashes and missing/NOASSERTION licenses.
- OCI: Extracts config digest/size, layer digests/sizes, total compressed layer byte sum, and platform descriptors. Flags any image reference using a mutable tag without an
- Fail-closed error handling: Malformed JSON, unsupported
lockfileVersion, or unrecognized schemas halt parsing with an explicitE_PARSEdiagnostic rather than guessing missing fields.
Outputs
- Summary header: Detected format and spec version, computed
sha256:file digest, expected-digest match badge, total item/layer count, and warning count. - Interactive inspection table: Filterable and sortable list of layers, packages, or SBOM components with copyable digests and PURLs.
- Exportable report: Deterministic JSON or Markdown summary generated via a local
BlobURL (URL.createObjectURL) for inclusion in enclave transfer paperwork.
Clean-Room & 5-Condition QA Requirements#
To pass Shakedown and move from planned to live in src/data/catalog.ts, Offline Manifest Inspector must satisfy all five universal QA conditions and ClearedStack's clean-room rules:
| Requirement | Verification Criterion |
|---|---|
| 1. Browser-only & offline | Zero server endpoints; all JSON parsing, schema checks, and SHA-256 hashing run locally via standard Web APIs and Web Crypto (crypto.subtle) in both Full Enclave Stack and Snapshot Mode. |
| 2. Strict CSP | Enforces default-src 'self', connect-src 'self', and form-action 'none'; zero outbound fetch, XMLHttpRequest, WebSocket, or external font/script requests. |
| 3. Zero tracking or accounts | No sign-in walls, cookies, analytics, or telemetry beacons; any optional UI preference stored in localStorage is disclosed with a one-click clear control. |
| 4. Worked examples | Bundles synthetic test fixtures (OCI manifest, package-lock.json snippet, SPDX JSON, CycloneDX JSON) with deterministic expected outputs verified in automated tests. |
| 5. Citations, scope & MIT | Displays governing standard citations, explicit scope exclusions, non-advice notice, and an MIT LICENSE file. |
Clean-room boundary: The tool is authored from scratch in Moldloft using only the structured JSON specification from Waybill, never copying source code, CSS, or DOM layouts from third-party web inspectors.
Worked Example & Verification#
Synthetic Verification Case 1: package-lock.json Enclave Readiness Check
Given the synthetic lockfile entry from Working on disconnected networks:
{
"name": "example-enclave-app",
"lockfileVersion": 3,
"packages": {
"node_modules/react": {
"version": "19.3.0",
"resolved": "https://registry.npmjs.org/react/-/react-19.3.0.tgz",
"integrity": "sha512-syntheticExampleHashValue=="
}
}
}
- Detected format:
npm package-lock.json (lockfileVersion 3) - Extracted packages:
1(node_modules/react, version19.3.0, integrity algorithmsha512) - Enclave check: Flags
1externalresolvedhost (registry.npmjs.org) requiring internal mirroring before runningnpm ciinside the disconnected network.
Synthetic Verification Case 2: OCI Image Manifest
Given a synthetic application/vnd.oci.image.manifest.v1+json with schemaVersion: 2, one config descriptor (1420 bytes), and two layers (12582912 bytes and 4194304 bytes):
- Detected format:
OCI Image Manifest v1 (schemaVersion 2) - Total layer bytes:
16777216bytes (16.0 MiB) across2layers - Digest integrity: Every descriptor carries a valid
sha256:<64-hex>digest; file-levelsha256:matches the operator-supplied digest from Lazarette.