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
verifiedAllow / 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
defaultDecide 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.0Open-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
designedA 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)
verified33 ms end-to-end. Block works; ask renders as block-with-notice. Verified live.
Claude Code
builtReal ask / deny / additionalContext / updatedToolOutput; merges into .claude/settings.json.
Codex
builtShares the Claude-compatible shim; writes .codex/hooks.json.
Strands Agents
designedInterventionHandler with Proceed / Deny / Confirm / Guide / Transform.
LangGraph
designedMiddleware: 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
plannedStreams → Firehose → S3 (Iceberg) → Athena.