Every call signed.
Append-only JSONL with HMAC-SHA256 chaining. Verify any time with quill audit verify; tampering breaks the chain at the next entry.
Last summer Replit's agent deleted Jason Lemkin's production database mid‑vibe‑code. In April, a Cursor agent wiped PocketOS — including all backups — in nine seconds. A Claude Code session ran rm -rf ~/ on someone's Mac. Quill is the pause button before the next one is yours.
The gate is deterministic on purpose. No model decides whether your prod gets deleted; a regex does. Models can be jailbroken, regexes get reviewed.
Append-only JSONL with HMAC-SHA256 chaining. Verify any time with quill audit verify; tampering breaks the chain at the next entry.
Deterministic regex + namespace check. No model in the path. Nothing the agent can argue with, no jailbreak surface.
The set of moves you regret: rm -rf, force-push, drop table, prod deploy, npm publish. Each block carries a paste-able safer alternative.
These are the literal patterns and suggestions shipping in
src/quill/policy.py.
Open the file. Add yours. Send a PR.
mv node_modules /tmp/quarantine_$(date +%s)git push --force-with-lease or rebase firstpg_dump -t users > /tmp/backup_$(date +%s).sql then drop in a transactionvercel deploy then promote vercel promote <url>curl -fsSL <url> -o /tmp/install.sh && cat /tmp/install.shnpm publish --dry-rungrep -oE '^[A-Z_]+=' .envterraform plan -out=plan review terraform apply plan"I violated every principle I was given. I guessed instead of verifying. I ran a destructive action without being asked. I didn't understand what I was doing before doing it."
The agents writing your code right now have the same authority. They run shell, edit files, push to remotes, ship to prod. The pause button between them and your prod just hadn't been built into the framework yet.
Quill is the smallest version of one I could write.
rm -rf ~/ on a developer's Mac;
home directory + keychain gone.
Quill installs itself as Claude Code's PreToolUse hook. Every Bash, Edit, Write goes through the gate before it touches your machine.
Claude Code ──► quill claude-hook ──► gate ──► sign ──► allow / ask / deny │ └──► ~/.quill/audit.log.jsonl (0o600, HMAC-chained)
Live, from a real Claude Code session running through Quill. quill audit show --last 8.
| time | verdict | risk | tool | what was tried | why |
|---|---|---|---|---|---|
| 20:43:55 | ? ask | high | Edit | src/db.ts | high risk — file mutation needs ack |
| 20:44:11 | ✓ allow | low | Bash | ls -la | read-only command |
| 20:40:32 | ✗ block | critical | Bash | rm -rf node_modules | ↪ try: mv to quarantine |
| 20:40:32 | ✗ block | critical | Bash | git push --force origin | ↪ try: --force-with-lease |
| 20:40:32 | ✗ block | critical | Bash | DROP TABLE users | ↪ try: pg_dump first |
| 20:40:33 | ✗ block | critical | Bash | vercel --prod | ↪ try: vercel deploy then promote |
| 20:40:33 | ✗ block | critical | Bash | npm publish | ↪ try: --dry-run first |
| 20:40:33 | ✓ allow | low | Bash | cat README.md | read-only command |
The audit log lives on your disk at ~/.quill/audit.log.jsonl, mode 0o600. The HMAC signing key is generated locally on first run and never leaves your machine.
Nothing is sent to a server unless you explicitly opt in to anonymous aggregate telemetry. Even then, only counts and namespace tops — never tool args, never paths, never your intent.
quill telemetry show