Day 66 of 68 · Friday · Learning

Headless permissions - skip-all vs deny-all-promptsConcept

Your headless fleet runs with --dangerously-skip-permissions, which approves everything. Claude Code 2.1.259 added the opposite posture, --permission-prompts none, which denies everything that would have asked and leaves an allowlist to say what may run.

Catch-up progress
66/68
Why this matters to you

The Sunday weekly review reads live web pages (five GitHub sources plus searches). A page that contains instructions aimed at Claude is a prompt-injection risk, and on 8-18 you fenced MCP servers out of that run for exactly that reason. The Bash side has no fence: whatever the model decides to run, runs. The new flag makes a fence possible without babysitting.

A permission mode decides what happens when Claude wants to use a tool. Interactive sessions prompt you. Headless sessions cannot prompt, so they need a rule. --dangerously-skip-permissions (with --permission-mode bypassPermissions) says 'never ask, always allow'. That is why every wrapper in PDB/scripts/run_*.sh and JobHunt's nightly_wrapper.sh carries it.

--permission-prompts none flips the default: anything that would have prompted is denied. On its own that would break every job. It works together with the permissions.allow list in settings.json, where you name the commands and paths that are pre-approved (python3 scripts/..., bun scripts/rm-bridge/..., Edit within PDB/data/). The model can still do everything the job needs; it cannot do the one thing a hostile web page asked for.

The trade: skip-all is zero maintenance and maximum blast radius; deny-plus-allowlist is one afternoon of listing what each job actually runs, then a denial in the log the first time a job needs something new. For a fleet of five unattended jobs that touch a real email account, a real device and a real git remote, the reviewer's answer is the allowlist.

Worked example

Read the current posture and what an allowlist would need:

grep -n 'permission\|strict-mcp\|settings' /Users/tom/Claude/PDB/scripts/run_weekly_review.sh

# what the weekly review actually executes (from tonight's log):
grep -oE '(python3|bun|curl|git) [^ ]+' /Users/tom/Claude/PDB/logs/weekly-review.log | sort | uniq -c | sort -rn | head
▶ Do it now
  1. Run both commands and read the flag lines aloud: what each one permits or fences.
  2. Write the top ten commands from the second list into a scratch note. That is the allowlist a switch would start from.
  3. Decide nothing yet. This week's paper doc asks whether to stage a one-page hardening proposal; the note is your evidence for that mark.

Gotchas

Go deeper: Claude Code changelog — 2.1.259 · Your 8-18 MCP fence (security remediation ink)
One-card takeaway

Skip-all trusts the model plus every page it reads. Deny-plus-allowlist trusts a list you wrote.