marketing: FRE-199 CTO review fixes — B1 precedence order, B2 false git-push example dropped, N1 hooks-guide attribution
B1 (agent-waiting-on-permission): body said 'allow / ask / deny' — inverted vs the permissions doc's deny → ask → allow. Fixed; fact-check row 3 was already correct and now matches the body. B2 (agent-run-without-asking): dropped the 'Bash(git commit *) allowed with Bash(git push *) denied is a policy the agent cannot talk its way around' example — the docs' own 'What a Bash rule doesn't match' table names Bash(git push *) as not stopping git -C . push origin main and friends. Sentence narrowed to the precedence claim, with a pointer to step 4's caveat. N1 (agent-done-signal): the osascript desktop-notification example is in the hooks guide (code.claude.com/docs/en/hooks-guide), not the hooks reference. Body and fact-check row 4 fixed. Pair-1 citations standardised from docs.anthropic.com to code.claude.com per the review's optional note. Each page's status blockquote records the revision.
This commit is contained in:
@@ -5,6 +5,9 @@
|
||||
> places it on nook.freno.me from `approved/`.
|
||||
> This page never names a product of ours and never names a competitor.
|
||||
> Internal target: first page of the FRE-199 pair, Thu 2026-11-06.
|
||||
> CTO review 2026-11-05: changes requested and applied — the `osascript`
|
||||
> example is attributed to the hooks guide, not the hooks reference; pair-1
|
||||
> citations standardised to code.claude.com.
|
||||
|
||||
Often, you don't — not from the terminal alone. A coding agent's turn can end in
|
||||
silence: the prompt returns, the cursor blinks, and a finished turn looks exactly
|
||||
@@ -42,7 +45,8 @@ Claude Code gives you two hooks that bracket the moments worth surfacing:
|
||||
rate limits, authentication problems, and the like.
|
||||
|
||||
All three can run a command of your choosing. The hooks reference documents the
|
||||
events and includes a desktop-notification example built on macOS's `osascript`.
|
||||
events; the hooks guide includes a desktop-notification example built on
|
||||
macOS's `osascript`.
|
||||
|
||||
## What to check or do
|
||||
|
||||
@@ -75,10 +79,10 @@ behaviour come from its own documentation, re-read 2026-11-05.
|
||||
|
||||
| # | Claim in the page | Source |
|
||||
|---|---|---|
|
||||
| 1 | `Stop` fires when the agent finishes responding (end of a turn); hook cadence is "per turn: UserPromptSubmit, Stop, StopFailure" | Claude Code hooks reference — https://docs.anthropic.com/en/docs/claude-code/hooks |
|
||||
| 1 | `Stop` fires when the agent finishes responding (end of a turn); hook cadence is "per turn: UserPromptSubmit, Stop, StopFailure" | Claude Code hooks reference — https://code.claude.com/docs/en/hooks |
|
||||
| 2 | `Notification` fires "when Claude Code sends a notification"; example payload carries `notification_type: "permission_prompt"`, message "Claude needs your permission" | same hooks reference (Notification event section) |
|
||||
| 3 | `StopFailure` "runs instead of Stop when the turn ends due to an API error" (rate limits, authentication) | same hooks reference (StopFailure section) |
|
||||
| 4 | Hooks run a command of your choosing; a desktop-notification example using `osascript` is in the reference | same hooks reference (desktop notification example) |
|
||||
| 4 | Hooks run a command of your choosing; a desktop-notification example using `osascript` is in the hooks guide | Claude Code hooks guide — https://code.claude.com/docs/en/hooks-guide (desktop-notification example) |
|
||||
| 5 | Operator anecdote: sessions that finished work but never signalled done, holding slots for hours; fix = derive done from git + idle transcript | r/ClaudeCode thread 1xjb3j0 ("Are you running a self-hosted queue of autonomous Claude Code sessions?", 2026-10-31), quoted in `drafts/listening.md` Scan 4 addendum. Quoted as one operator's described practice, not a measurement. |
|
||||
| 6 | PSA anecdote: code-review plugin showed green check + "No findings" without running | r/ClaudeCode 1xmnz2c (2026-11-03), logged in `drafts/listening.md` Scan 6. |
|
||||
| 7 | "Zero looks exactly like success" | Verbatim buyer phrasing, three independent instances (1xm09fs, 1xmnz2c, plus HN repeats) in `drafts/listening.md` Scans 5–8. Used as the problem's name, attributed to no one. |
|
||||
|
||||
@@ -5,6 +5,10 @@
|
||||
> a human places it on nook.freno.me from `approved/`. Internal target:
|
||||
> Mon 2026-11-09, met four days early. This page never names a product of ours
|
||||
> and never names a competitor.
|
||||
> CTO review 2026-11-05: changes requested and applied — the `Bash(git commit *)`
|
||||
> allowed / `Bash(git push *)` denied example removed (the docs' own
|
||||
> "What a Bash rule doesn't match" table shows a Bash rule does not stop every
|
||||
> invocation); the precedence claim stands.
|
||||
|
||||
You can — and the honest answer is that "should" is not one decision but two:
|
||||
what you are letting it do, and what happens when it does the wrong thing.
|
||||
@@ -51,8 +55,8 @@ nothing.
|
||||
condition is the bar: isolation first, autonomy second.
|
||||
3. **Write the rules instead of trusting the mode.** Rules are evaluated in
|
||||
order — deny, then ask, then allow — and the first match wins, so a broad
|
||||
deny holds even against a narrower allow. `Bash(git commit *)` allowed with
|
||||
`Bash(git push *)` denied is a policy the agent cannot talk its way around.
|
||||
deny holds even against a narrower allow. (What a Bash rule cannot do is
|
||||
match every way the same binary gets invoked — see the next step.)
|
||||
4. **Know what the rules do not cover.** A Bash rule matches the command text
|
||||
Claude writes, and the docs are explicit that this "isn't a security
|
||||
boundary around the program" — the same binary invoked by another path is
|
||||
|
||||
@@ -5,6 +5,10 @@
|
||||
> places it on nook.freno.me from `approved/`.
|
||||
> This page never names a product of ours and never names a competitor.
|
||||
> Internal target: second page of the FRE-199 pair, Fri 2026-11-07.
|
||||
> CTO review 2026-11-05: changes requested and applied — rule precedence
|
||||
> corrected to deny / ask / allow (body previously read allow / ask / deny,
|
||||
> contradicting the fact-check table and the source); pair-1 citations
|
||||
> standardised to code.claude.com.
|
||||
|
||||
Because it tried to do something its permission settings don't allow, and the
|
||||
default is to wait — indefinitely and quietly — for you. The prompt is not the
|
||||
@@ -16,7 +20,7 @@ not to approve faster, it's to make the prompts rare and the waiting visible.
|
||||
Claude Code's permission system decides, per tool call, whether to run, refuse,
|
||||
or stop and ask. In its `default` mode, it prompts for permission on the first
|
||||
use of each tool. Modes are set with `defaultMode` in the settings files, and a
|
||||
session's rules come from allow / ask / deny lists evaluated in that order —
|
||||
session's rules come from deny / ask / allow lists evaluated in that order —
|
||||
the first match wins.
|
||||
|
||||
You can see the whole rule set at any time with `/permissions`, which lists
|
||||
@@ -67,13 +71,13 @@ Code's behaviour come from its own documentation, re-read 2026-11-05.
|
||||
|
||||
| # | Claim in the page | Source |
|
||||
|---|---|---|
|
||||
| 1 | In `default` mode Claude Code "prompts for permission on first use of each tool" | Claude Code permissions doc — https://docs.anthropic.com/en/docs/claude-code/permissions (Permission modes table) |
|
||||
| 1 | In `default` mode Claude Code "prompts for permission on first use of each tool" | Claude Code permissions doc — https://code.claude.com/docs/en/permissions (Permission modes table) |
|
||||
| 2 | `defaultMode` in settings files sets the default mode for new sessions | same permissions doc (Permission modes section) |
|
||||
| 3 | Rules are evaluated deny → ask → allow, first match wins | same permissions doc (Permission rule syntax) |
|
||||
| 4 | `/permissions` lists all permission rules and the settings.json each comes from | same permissions doc (Manage permissions) |
|
||||
| 5 | `Bash(npm run build)` matches the exact command; `Bash(git log *)` wildcard form | same permissions doc (Use specifiers for fine-grained control) |
|
||||
| 6 | `acceptEdits` "automatically accepts file edits and common filesystem commands such as mkdir, touch, mv, cp for paths in the working directory" | same permissions doc (Permission modes table) |
|
||||
| 7 | A `Notification` hook fires when Claude Code sends a notification; permission prompts carry `notification_type: "permission_prompt"` and a message like "Claude needs your permission" | Claude Code hooks reference — https://docs.anthropic.com/en/docs/claude-code/hooks (Notification event) |
|
||||
| 7 | A `Notification` hook fires when Claude Code sends a notification; permission prompts carry `notification_type: "permission_prompt"` and a message like "Claude needs your permission" | Claude Code hooks reference — https://code.claude.com/docs/en/hooks (Notification event) |
|
||||
| 8 | Undo-split practice ("free hand on what git can undo, confirmation on what it can't") | r/ClaudeCode 1xkoz06 (2026-10-31, u/tomm3hshipp thread), commenter's described practice, logged in `drafts/listening.md` Scan 3 addendum. Described as one operator's approach, not a rule. |
|
||||
| 9 | The 55-minutes-lost framing | r/ClaudeAI 1xhbc71 (2026-10-28): "coming back an hour later to find it's been sitting on a permission prompt for 55 minutes". Used as the problem's shape, not quoted as a person. |
|
||||
|
||||
|
||||
Reference in New Issue
Block a user