Typed, not arbitrary
Each capability has a strict schema and local trusted adapter. There is no generic command field hiding under a nicer name.
typed authority requests · human execution
Airlock gives untrusted AI agents a narrow way to ask for privileged work. A trusted node validates the request. A human decides. A human executes. Credentials never cross the boundary.
Trusted-execution by design. An execution receipt is not external proof.
The boundary
The requester side can discover signed capabilities, submit bounded typed requests, and read sanitized receipts. It cannot receive trusted credentials, approval tokens, provider execution URLs, or requester-supplied shell access.
Each capability has a strict schema and local trusted adapter. There is no generic command field hiding under a nicer name.
A reviewer grants or rejects authority. After approval, Airlock directly runs the locally reconstructed configured argv.
executed records a trusted child success. A separate read-only observation establishes the external result.
How it works
Airlock keeps model-facing integration boring on purpose: three tools, loopback transport, typed state, and no automatic escalation when another tool fails.
The agent calls airlock_capabilities and treats every returned label and description as untrusted data.
The agent submits exact typed fields through airlock_create_request. The requester persists an immutable ID, digest, nonce, and bounded expiry.
The trusted node revalidates local constraints and renders an exact direct-exec plan. A human reviews it, then Airlock executes it after persisting the reservation.
The agent reads sanitized state through airlock_requests, then verifies the intended effect through a separate ordinary read-only path.
Cross-harness
Claude Code and Codex use the typed stdio MCP server plus a shared compact skill. Hermes uses a thin native plugin with the same three tools and an optional bounded prompt section.
Explicit opt-in
The happy path opts into managed user-global guidance. The installer default remains --instructions skip; it never edits project-local instructions.
python3 tools/airlock_bootstrap.py install \
--binary /absolute/path/to/airlock \
--instructions install