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:
fixture
2026-11-05 21:42:26 +00:00
parent 4dac2e2928
commit 0137703341
3 changed files with 20 additions and 8 deletions

View File

@@ -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. |

View File

@@ -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

View File

@@ -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. |