interlock
Features

Everything on the decision path

Interlock is a pipeline: route by blast radius, evaluate deterministically, ask a local judge the narrow questions, probe the result, compose deny-wins, and record it all.

Gating & Decisions

The core interlock — every proposed action is routed, evaluated, and composed into a single verdict.

Pre-action gate

verified

Allow / ask / block before execution. Verified live on Kiro: a force-push to main was refused before it ran, a notice was delivered, and the session continued.

Three-tier routing

Read-only, in-workspace writes, and gated actions each get the right amount of scrutiny — with sensitive-path promotion (reads of ~/.ssh, ~/.aws, .env are promoted to gated).

Shell decomposer

Understands chains, pipes, subshells, backticks, interpreter one-liners, heredocs, base64 decode-and-execute, and data arguments — so obfuscation doesn't slip through.

Cedar mandate

An authorization envelope written in Cedar — the same policy language as Amazon Bedrock AgentCore Policy.

Composer

Deny-wins semantics, OGR continuation wording, and per-rule policy overrides fuse every signal into one disposition.

Denial budget

3 consecutive or 20 total denials escalate to the user, so a stuck agent can't grind against the gate.

Shadow mode

default

Decide and record, never enforce — the default for new installs so you can watch before you block.

Fail modes

Per-category behavior applied locally by the hook when the daemon is down: closed for dangerous categories, open for everything else.

The Judge

A small, local, open-weights decision model answers narrow structured questions — never free-form prose.

Strands Decider 2B

Apache-2.0

Open-weights (Apache-2.0), calibrated confidence, runs locally on Apple Silicon (MLX) or NVIDIA GPU — or on SageMaker for teams.

Question library v1

intent_authorized · exfil_risk · confirmation_given · injection_present · injection_targets_action — typed questions, not open prompts.

Minimal state projector

Sees user messages, prior-call summaries, and the structured action — never agent prose, tool output, or policy text. Structural injection defense by construction.

Policy bands

Configurable thresholds on judge answers map to allow / ask / block.

Post-Action Probe

Tool results are attacker-controlled. The probe inspects output before the agent ever reads it.

Bedrock Guardrails

InvokeGuardrailChecks surfaces prompt injection, jailbreak attempts, and credential entities with character offsets.

Dual injection detection

The Decider and Guardrails are composed deny-wins, so either one can catch an injection the other misses.

Dispositions

pass · warn (additionalContext) · withhold (updatedToolOutput) — the probe can annotate or replace a result, not just flag it.

Flip test

designed

A consistency check that compares decisions with and without untrusted content to detect result-driven manipulation.

Harness Adapters

One decision API, many agents. Each adapter translates its harness's hook protocol to and from Interlock.

Kiro (IDE)

verified

33 ms end-to-end. Block works; ask renders as block-with-notice. Verified live.

Claude Code

built

Real ask / deny / additionalContext / updatedToolOutput; merges into .claude/settings.json.

Codex

built

Shares the Claude-compatible shim; writes .codex/hooks.json.

Strands Agents

designed

InterventionHandler with Proceed / Deny / Confirm / Guide / Transform.

LangGraph

designed

Middleware: wrap_tool_call plus interrupt() for human-in-the-loop.

Policy

Layered, validated YAML — hashed onto every verdict so a decision is always traceable to the policy that made it.

Layered configuration

defaults → user → workspace, validated and hashed onto every verdict.

Trust model

Workspace roots, allowed remotes, allowed hosts, protected branches, protected paths, sensitive paths, and package indexes.

Per-rule overrides

Change the action, enable/disable, or adjust the questions asked — rule by rule.

Policy unit tests

Run the policy against a corpus with interlock test before you ship a change.

Audit Store

The decision path never waits on the network. Durability is local-first, with a background drain to AWS.

Local append-only spool

fsync per record — the decision path never waits on the network.

DynamoDB single table

TTL 90 days, PITR, stream, 3 GSIs, KMS encryption.

Background drainer

Drains the spool to DynamoDB with backoff, so offline operation just catches up later.

Review queue

GSI3 surfaces asked / blocked / warned per day for review.

Lakehouse export

planned

Streams → Firehose → S3 (Iceberg) → Athena.