Skip to main content
Correction (2026-11-04): The offline check harness (docker/local/offline-check/ and docker-compose.offline-check.yml) is not in this repository. It was removed with the Paytm connector on 2026-11-02 (ADR-0018). The steps below describe the check as it was run. They cannot be run from this repository as it stands. The verification steps further down apply to any Trust Record and its public keys, however it was produced.
The offline check runs the whole decision flow on a Docker network that has no route to the internet, then verifies the evidence with only your public keys. Run it before you rely on the deployment, and after every upgrade.
It takes about two minutes after the image is built. It ends with:
and exits with code 0.
The check grew from 12 to 14 steps on 2026-09-30, when it started adding a refund manager through maker checker (every refund needs a signed approval). Run the same day: 14 of 14 passed.
Any failed check makes it exit with 1 and print the API log.

What it does

  1. Builds while online. It builds the API image and pulls postgres:16. This is the only step that needs a network.
  2. Makes your keys, if needed. It runs setup, so ./parmana-local has your signing keys.
  3. Starts an isolated copy. It starts a second copy of the deployment under the project name parmana-offline-check, with its own empty database, on a Docker network created with internal: true. No container on that network has a route to the internet or to Parmana.
  4. Runs the checks below, from a container on the same network that holds your public keys and its own throwaway API keys, and no private key.
  5. Cleans up. It removes the copy’s containers and database. Your deployment started with docker compose up is not touched, and your API keys are not changed.
The copy signs with your deployment’s own keys from ./parmana-local/keys, so the record it produces is signed exactly as your deployment would sign it.

The 14 checks

No agent action is authorized without a signed human approval (Human approval), so the check adds a refund manager through maker checker, the same way an operator would, with a key it makes inside the isolated network. The image itself trusts no approver.

The stand in for your downstream system

The downstream system in the check was a stand-in for an external endpoint, paytm-agent-stand-in.mjs, which was removed with the harness. It took the place of that endpoint. It:
  • answers the connector route the way the real endpoint does;
  • refuses any request whose Execution Gateway signature does not verify with the gateway’s public key;
  • never calls any external system;
  • serves HTTPS with a certificate made for the run, because the server refuses a plain HTTP connector URL in production. The server trusts that one certificate for the run only.

Verify the record again, anywhere

The check leaves four files in parmana-local/offline-check/: trust-record.json, default.public.pem, default-secondary.public.pem and gateway.public.pem. Anyone can check the record on any machine with a clone of the repository, npm install and Node.js 24 or newer:
Expected output, exit code 0:
The script makes no network call and needs no database. More on independent verification: Verify independently.

What it does not cover

  • Building offline. The image is built while online. The check proves running without the internet, not installing without it.
  • Your real downstream system. It uses the stand in. Your own connector is tested by your own requests.

Where it has passed