auto-mode classifier flags 'coily ops gh' as gh:* deny circumvention #43

Open
opened 2026-05-23 20:54:01 +00:00 by coilysiren · 0 comments
Owner

Originally filed by @coilysiren on 2026-05-14T09:03:55Z - https://github.com/coilysiren/coily/issues/159

The Claude Code auto-mode classifier blocks coily ops gh ... with:

Permission for this action was denied by the Claude Code auto mode classifier. Reason: User deny rule blocks `gh:*`; the agent is routing through `coily ops gh` with env-var prefix to circumvent the deny rule.

That's exactly backwards. coily ops gh is the sanctioned route. The bare gh:* deny exists because coily ops gh is what we want agents to use. The classifier treats the audited wrapper as evasion of the rule the wrapper was designed to enforce.

Repro today (2026-05-14):

  1. Bare `gh issue create ...` denied by user deny rule (expected).
  2. `COILY_COMMIT_SCOPE=... coily ops gh issue create ...` denied by auto-mode classifier as circumvention.
  3. After explicit user re-authorization in chat, the same command ran fine.

Related:

  • #99 persistent issue with `coily ops gh issue create` specifically
  • #126 Denial messages should carry the reason, not just the recovery
  • #61 Claude Code denies raw gh 113 times in 35d while `coily ops gh` exists; permission denial doesn't name the wrapper
  • #115 lockdown template: pair every coily-wrapped verb with a Bash(coily :*) allow rule

Possible fixes:

  • Lockdown template should ship a positive allow rule for `coily ops gh:*` so the classifier sees an explicit allow, not just absence of deny (this is the #115 shape).
  • Classifier prompt / heuristic needs an exception: a wrapper binary whose stated purpose is to enforce the deny rule is not circumvention. Could be a signal coily emits in its lockdown profile.
  • Denial message could name the sanctioned wrapper (#126), reducing the temptation to retry with prefixes that look like evasion.

The cost is real: every issue-first commit hits this, and the workaround is asking Kai to re-authorize in chat, which is exactly the kind of prompt-noise the lockdown was supposed to eliminate.

_Originally filed by @coilysiren on 2026-05-14T09:03:55Z - [https://github.com/coilysiren/coily/issues/159](https://github.com/coilysiren/coily/issues/159)_ The Claude Code auto-mode classifier blocks `coily ops gh ...` with: > Permission for this action was denied by the Claude Code auto mode classifier. Reason: User deny rule blocks \`gh:*\`; the agent is routing through \`coily ops gh\` with env-var prefix to circumvent the deny rule. That's exactly backwards. `coily ops gh` is the sanctioned route. The bare `gh:*` deny exists *because* coily ops gh is what we want agents to use. The classifier treats the audited wrapper as evasion of the rule the wrapper was designed to enforce. Repro today (2026-05-14): 1. Bare \`gh issue create ...\` denied by user deny rule (expected). 2. \`COILY_COMMIT_SCOPE=... coily ops gh issue create ...\` denied by auto-mode classifier as circumvention. 3. After explicit user re-authorization in chat, the same command ran fine. Related: - #99 persistent issue with \`coily ops gh issue create\` specifically - #126 Denial messages should carry the reason, not just the recovery - #61 Claude Code denies raw gh 113 times in 35d while \`coily ops gh\` exists; permission denial doesn't name the wrapper - #115 lockdown template: pair every coily-wrapped verb with a Bash(coily <verb>:*) allow rule Possible fixes: - Lockdown template should ship a positive allow rule for \`coily ops gh:*\` so the classifier sees an explicit allow, not just absence of deny (this is the #115 shape). - Classifier prompt / heuristic needs an exception: a wrapper binary whose stated purpose is to enforce the deny rule is not circumvention. Could be a signal coily emits in its lockdown profile. - Denial message could name the sanctioned wrapper (#126), reducing the temptation to retry with prefixes that look like evasion. The cost is real: every issue-first commit hits this, and the workaround is asking Kai to re-authorize in chat, which is exactly the kind of prompt-noise the lockdown was supposed to eliminate.
coilysiren added
P3
and removed
P2
labels 2026-05-31 06:59:50 +00:00
Sign in to join this conversation.
No labels
P0
P1
P2
P3
P4
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
coilyco-bridge/coily#43
No description provided.