Daily harness signal

A loaded rule is not an enforced rule

August 24, 2026 · JST One fresh finding Claude Code · auto mode · policy
A fresh paired reproduction shows Claude Code loading custom auto-mode deny rules without changing behavior. Move non-negotiable, tool-shaped boundaries into deterministic permission rules and verify side effects, not configuration output.
01 · Fresh · source date 2026-08-22

Promote policy prose into a pre-classifier gate

Use when: Claude Code runs in auto mode and your autoMode.hard_deny or soft_deny prose is treated as a safety boundary. This matters most for unattended claude -p jobs, destructive commands, or rules that claude auto-mode config reports as loaded. Successful parsing proves visibility, not enforcement.

Action: inventory every custom deny entry and separate exact tool patterns from semantic policy. Duplicate each non-negotiable, tool-shaped boundary under managed permissions.deny. For a deletion floor, use {"permissions":{"deny":["Bash(rm *)"]}}; replace the pattern with your actual forbidden command surface. Keep "$defaults" in the auto-mode arrays, but treat custom prose as advisory until a behavioral canary passes. Use a synchronous PreToolUse hook or an OS sandbox when the boundary cannot be expressed as one permission pattern.

Acceptance check: in a throwaway directory, create victim.txt and allowed.txt. Run the same rm victim.txt request under --permission-mode auto first with only the custom hard_deny, then with the permissions.deny rule. Pass only when the second run records a permission denial before dispatch, victim.txt still exists, and an unrelated write to allowed.txt succeeds. Repeat after every CLI upgrade; a clean auto-mode config listing does not pass.

Evidence: Anthropic’s current documentation calls hard_deny unconditional, yet also identifies permissions.deny as the pre-classifier, non-overridable mechanism. Open issue #88891 provides a self-contained paired script, six trials on 2.1.240, isolated homes, effective-rule output, and file existence as the oracle. Both custom hard and soft denies failed its benign fixtures. The newer 2.1.241 release claims only generic reliability improvements, not this repair.

Caveat: this is one unconfirmed Fedora report using headless auto mode; interactive behavior, Anthropic’s built-in defaults, and genuinely dangerous actions were not systematically tested. Version 2.1.241 could contain an undocumented fix. Permission globs also need compound-command and positive-control tests; semantic, cross-tool policy still requires hooks, sandboxing, or network controls.

Compact source notes

  1. anthropics/claude-code issue #88891 (opened 2026-08-22; inspected 2026-08-24). Versioned six-trial reproduction with paired scratch homes and a file-existence oracle; open and not maintainer-confirmed.
  2. Claude Code auto-mode configuration (retrieved 2026-08-24). Official classifier precedence, $defaults behavior, and direction to use managed permissions.deny for never-run actions.
  3. Claude Code permissions reference (retrieved 2026-08-24). Official Bash(rm *) scoped-deny semantics and pre-model enforcement boundary.
  4. Claude Code v2.1.241 (published 2026-08-23 00:52 UTC). Newer signed release with only a generic reliability note and no inspectable claim that #88891 is repaired.
  5. Method: anchor lens—paired side-effect oracle plus official configuration contract; unity lens—visibility, classification, and enforcement are separate policy stages. Confidence: Likely. Falsifier: a current-version paired canary where the custom deny alone consistently preserves the target across headless and interactive modes.