From 0137703341f4631fc0e6e53459cb6fd909a9ee41 Mon Sep 17 00:00:00 2001 From: fixture Date: Thu, 5 Nov 2026 21:42:26 +0000 Subject: [PATCH] =?UTF-8?q?marketing:=20FRE-199=20CTO=20review=20fixes=20?= =?UTF-8?q?=E2=80=94=20B1=20precedence=20order,=20B2=20false=20git-push=20?= =?UTF-8?q?example=20dropped,=20N1=20hooks-guide=20attribution?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- marketing/approved/agent-done-signal/copy.md | 10 +++++++--- marketing/approved/agent-run-without-asking/copy.md | 8 ++++++-- marketing/approved/agent-waiting-on-permission/copy.md | 10 +++++++--- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/marketing/approved/agent-done-signal/copy.md b/marketing/approved/agent-done-signal/copy.md index 9538745..472e1ab 100644 --- a/marketing/approved/agent-done-signal/copy.md +++ b/marketing/approved/agent-done-signal/copy.md @@ -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. | diff --git a/marketing/approved/agent-run-without-asking/copy.md b/marketing/approved/agent-run-without-asking/copy.md index e236955..7ab03ec 100644 --- a/marketing/approved/agent-run-without-asking/copy.md +++ b/marketing/approved/agent-run-without-asking/copy.md @@ -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 diff --git a/marketing/approved/agent-waiting-on-permission/copy.md b/marketing/approved/agent-waiting-on-permission/copy.md index fec9b35..f61b5ba 100644 --- a/marketing/approved/agent-waiting-on-permission/copy.md +++ b/marketing/approved/agent-waiting-on-permission/copy.md @@ -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. |