From 4a18beeaffc076fd59f5a2feddeb734b543c3f70 Mon Sep 17 00:00:00 2001 From: Paperclip Agent Date: Thu, 29 Oct 2026 06:08:15 +0000 Subject: [PATCH] faq: apply the CTO verdict to the eight entries Six entries change text, exactly as FRE-329's replacement sentences: E2 keeps the row for 15 minutes, E3 names the Login Items toggle and ~/.nook instead of "one entry, no writes outside the directory", E4 says which terminals take a typed reply, E5 says one island per enabled display, E6 says it never runs agents in the background, E8 lists the five user-triggered network uses. E1 and E7 are unchanged; no entry was cut. The page patch is regenerated from the corrected entry text, so the draft and the patch cannot drift apart. The gate table now records the verdict (done 2026-10-29) and puts the privacy withdrawal plus the positioning.md rule-3 strike on the Chief of Staff with a date, because the verdict found rule 3 is the source of the false claim. Nothing is applied to the page: src/routes/nook/faq.tsx is untouched on this branch. Source issue: FRE-326. Verdict: FRE-329. Co-Authored-By: Paperclip --- marketing/drafts/faq-from-objections.md | 253 +++++++++++++++--------- marketing/drafts/faq-page.patch | 14 +- 2 files changed, 170 insertions(+), 97 deletions(-) diff --git a/marketing/drafts/faq-from-objections.md b/marketing/drafts/faq-from-objections.md index 68547d4..8448036 100644 --- a/marketing/drafts/faq-from-objections.md +++ b/marketing/drafts/faq-from-objections.md @@ -1,8 +1,8 @@ # `/faq` from the objections we already have -**Date:** 2026-10-29 · **Owner:** CMO · **Status:** draft — not approved, not published · **Source issue:** FRE-326 -**Page:** `nook.freno.me/faq` · **Page source:** `freno-dev/src/routes/nook/faq.tsx` · **Site commit read:** `134f41e` (plus local `c1c498e`, remote-claim removal) -**Product commit read:** The-Nook `b5659415` (0.13.4, build 37) +**Date:** 2026-10-29 · **Owner:** CMO · **Status:** CTO-verified 2026-10-29 (FRE-329); **awaiting human approval** — not approved, not published · **Source issue:** FRE-326 +**Page:** `nook.freno.me/faq` · **Page source:** `freno-dev/src/routes/nook/faq.tsx` · **Site commit read:** `c1c498e` (branch `faq/from-objections-2026-10-29`, unmerged) +**Product commit read:** The-Nook `f9cbd879` — the exact revision the CTO verified against (0.13.4, build 37) Every entry below is traceable to a real question or a real report. Nothing is invented to fill a category. No testimonial is used. No price, refund term, or umbrella/cross-promotion answer appears @@ -49,7 +49,7 @@ a count of people who asked. I have not put a percentage on anything. | 3 | Idle / is it actually working? | "What happens when my agent is idle?" | FRE-326, 2026-10-29: *"what happens when my agent is idle?"*; NOOK-281 (2026-10-12), NOOK-415 (2026-10-15), NOOK-417 (2026-10-15), NOOK-823 (2026-10-22), NOOK-898 (2026-10-23) | 1 board question + 5 reports | **Yes** | **Propose E2** | | 4 | Install trust / permissions | "What permissions does it need — and what does it write into my agent's config?" | Live `/faq`, 2026-10-29; NOOK-733 (2026-10-21), NOOK-648 (2026-10-20), NOOK-685 (2026-10-20), NOOK-418 (2026-10-15), NOOK-568 (2026-10-17) | 1 live question + 5 reports | **Yes** | **Propose E3** | | 5 | Terminal / tmux fit | "Does it work with my terminal, including tmux?" | NOOK-302 (2026-10-13), NOOK-310 (2026-10-13), NOOK-788 (2026-10-22) | 3 reports; no captured ask | **Yes for tmux-first buyers** | **Propose E4** — report-sourced, not an ask | -| 6 | Notch / display | "Do I need a Mac with a notch?" | Live `/faq`, 2026-10-29; NOOK-290 (2026-10-12), NOOK-291 (2026-10-12), NOOK-386 (2026-10-14) | 1 live question + 3 reports | Compatibility; rarely the blocker | **Keep current answer** | +| 6 | Notch / display | “Do I need a Mac with a notch?” | Live `/faq`, 2026-10-29; NOOK-290 (2026-10-12), NOOK-291 (2026-10-12), NOOK-386 (2026-10-14) | 1 live question + 3 reports | Compatibility; rarely the blocker | **Rewrite E5** — the pointer-display sentence was never true | | 7 | Battery / cost | "How much battery does it cost?" | Live `/faq`, 2026-10-29; NOOK-850 (2026-10-23), NOOK-851 (2026-10-23), NOOK-877 (2026-10-23) | 1 live question + 3 reports | Curious, not a hard blocker | **Rewrite E6 without a number** | | 8 | macOS floor | "Why macOS 14.2 or later?" | Live `/faq`, 2026-10-29; NOOK-881 (2026-10-23) | 1 live question + 1 report | Compatibility; a hard no on 14.0/14.1 | **Keep current answer** | | 9 | Offline | "Does it work offline?" | Live `/faq`, 2026-10-29; NOOK-494 (2026-10-16) | 1 live question + 1 report | Compatibility; a hard no for offline-only | **Rewrite E8 for the phone exception** | @@ -60,14 +60,44 @@ a count of people who asked. I have not put a percentage on anything. ### What changed since the last register (FRE-204) -- The live page already has six entries; this draft **keeps two** (notch, macOS 14.2), **rewrites - three** (permissions, battery, offline), **withdraws one** (privacy), and **proposes three new - ones** (E1, E2, E4). It does not re-ask the six questions as if they were new. +- The live page already has six entries; this draft **keeps one** (macOS 14.2), **rewrites four** + (permissions, battery, offline, and notch — whose pointer-display sentence the CTO found was never + true), **withdraws one** (privacy), and **proposes three new ones** (E1, E2, E4). It does not re-ask + the six questions as if they were new. - The privacy answer is not merely unverified — it is **false at the current build**. It must come down in the same edit, not wait for a nicer replacement. - Cursor is now a supported agent row (`AgentRegistry.swift:524`), so "does it work with Cursor?" has a factual answer today. It was an open question when the live page was written. +### CTO verdict (FRE-329, 2026-10-29) + +The CTO read The-Nook `f9cbd879`, the site at `c1c498e` and the live page, and checked every entry +against the code. **No entry is cut.** Six change text, exactly as below; E1 and E7 ship as written. + +| Entry | Verdict | What changed in this revision | +|---|---|---| +| E1 Agent fit / Cursor | **verified** | nothing | +| E2 Idle | verified, one sentence tightened | the row-eviction sentence | +| E3 Permissions / config | **not verified** | three sentences: Login Items toggle, per-event entries, `~/.nook` | +| E4 Terminal / tmux | **not verified** | one sentence: which terminals take a typed reply | +| E5 Notch | **not verified** | one sentence: one island per enabled display, not the pointer's display | +| E6 Battery | verified, one clause tightened | "never runs them in the background" | +| E7 macOS 14.2 | **verified** | nothing | +| E8 Offline | **not verified** | one sentence, plus a six-row network list in its gate | +| §4 privacy | all three findings confirmed; withdrawal is right | `positioning.md` rule 3 comes down in the same change | + +The verdict adds two things to the plan, both now in §4 and §7: the false claim's **source rule** in +`marketing/positioning.md` — rule 3 and its approved-claims row — must be struck in the same change +as the withdrawal, or the next page restates it; and the egress inventory's scope widens to cover +weather, the network panel, the speed test, the changelog, the bug report and Sparkle, plus Sentry's +`sendDefaultPii` and trace sample rate. + +The verdict's full text and its per-sentence evidence is +[FRE-329's `faq-verdict` document](/FRE/issues/FRE-329#document-faq-verdict). Nothing in it is +reproduced here as a new claim; the entry text below is the verdict's own replacement wording, except +E4, where I took the verdict's first option (keep the Alacritty clause) and narrowed the jump +sentence, which the verdict itself notes is `open -b` for three of the seven names. + --- ## 3. Proposed entries — page-ready @@ -90,13 +120,14 @@ check. prints nothing…"*). - **Claim:** agent gating is per-agent; Cursor is watch-only. - **Audience:** the buyer whose agent is not Claude Code. -- **Channel:** `/faq`, plus the same answer in any FAQ structured data. -- **Owner:** CMO writes; CTO confirms. -- **Date:** CTO confirmation 2026-11-03; publish 2026-11-06. +- **Channel:** `/faq`. No FAQ structured data in this pass — see §6. +- **Owner:** CMO writes; CTO verified 2026-10-29. +- **Date:** CTO verified 2026-10-29 ([FRE-329](/FRE/issues/FRE-329)); publish on approval, target 2026-11-05. - **Must be true:** at the shipped commit, Cursor still reads `.missing(.approvals)` with the same reason, and `.available(.sessions)`, `.available(.completion)` and `.available(.errors)` as stated - (`AgentRegistry.swift:524-552`). The separate `/agents` page is incomplete for Cursor and the other - newer rows; that is a page correction, not a gate for this self-contained answer. + (`AgentRegistry.swift:523-555`, which is where the CTO read it). The separate `/agents` page is + incomplete for Cursor and the other newer rows; that is a page correction, not a gate for this + self-contained answer. ### E2 · "What happens when my agent is idle?" @@ -105,8 +136,10 @@ check. > idle until you type. When an agent finishes a turn with a final message, the row stays green for > ten minutes, then goes gray. A stale row is different: it means The Nook's integration cannot > report for that session, and the row says so instead of pretending it is idle. Nothing is lost when -> a row goes idle — the next prompt flips it back to running. If a session that is obviously working -> says idle, that is a bug; tell us. +> a row goes idle — the next prompt brings it back and flips it to running. The row itself leaves the +> island 15 minutes after the turn (5 if the turn ended without a reply), so a long-quiet session +> reappears on its next event instead of sitting there. If a session that is obviously working says +> idle, that is a bug; tell us. - **Question source:** FRE-326, 2026-10-29 (*"what happens when my agent is idle?"*); NOOK-898, 2026-10-23 (*"kimi payloads fail to decode, so every Kimi session stays idle"*); NOOK-823, @@ -116,22 +149,25 @@ check. state. - **Audience:** anyone watching a fleet and wondering whether to intervene. - **Channel:** `/faq`. -- **Owner:** CMO writes; CTO confirms. -- **Date:** CTO confirmation 2026-11-03; publish 2026-11-06. -- **Must be true:** `SessionModels.swift:540-580` still defines `islandStatus` this way (no content → - idle; complete → ready for 10 minutes → idle; `integrationStale` → stale) and `SessionState.swift` - still retains idle rows for 5 minutes. If an open bug makes a working agent render idle at the - shipped commit, the "that is a bug" sentence stays but the bug gets a named issue. +- **Owner:** CMO writes; CTO verified 2026-10-29. +- **Date:** CTO verified 2026-10-29 ([FRE-329](/FRE/issues/FRE-329)); publish on approval, target 2026-11-05. +- **Must be true:** `SessionModels.swift:511,552,564-577` still defines `islandStatus` this way (no + content → idle; complete → ready for 10 minutes → idle; `integrationStale` → stale) and + `SessionState.swift:35,40` still evicts a finished turn after 15 minutes, 5 when it ended without a + reply. If an open bug makes a working agent render idle at the shipped commit, the "that is a bug" + sentence stays but the bug gets a named issue. ### E3 · "What permissions does it need — and what does it write into my agent's config?" > **The app itself runs unprivileged.** Fan control and charge limiting go through a small helper -> that macOS requires to run as root for hardware access; the app installs it on first use and you -> approve it once with your password. For each agent, it adds one entry — a hook or a plugin — -> inside that agent's own config directory. It does not write outside that directory, and it only -> touches the records it created: -> a hook entry you added yourself in the same file survives install and uninstall. Uninstall removes -> exactly what it wrote, with no leftover links or orphaned files. +> that macOS requires to run as root for hardware access; the app registers it on first use and takes +> you to System Settings › General › Login Items & Extensions, where you switch it on once. For each +> agent it adds what that agent needs — a hook group per event it listens to, or one plugin link — +> inside the agent's own config file or directory. It keeps its own files under `~/.nook` — the hook +> binary and one plugin copy per agent — and adds only its own entries to that agent's config. A hook +> entry you added yourself in the same file survives install and uninstall, and it only touches the +> records and switches it created. Uninstall removes exactly what it wrote — and switches off what it +> turned on — with no leftover links or orphaned files. - **Question source:** live `/faq`, 2026-10-29 (*"What permissions does it need?"*); NOOK-418, 2026-10-15 (a custom agent's install target is never shown to the user); NOOK-733, 2026-10-21 (a @@ -141,17 +177,23 @@ check. - **Claim:** reversible install; the helper is the only root step; uninstall is exact. - **Audience:** the buyer who has a hand-tuned `~/.claude/settings.json` or `~/.codex/hooks.json`. - **Channel:** `/faq`. -- **Owner:** CMO writes; CTO confirms. -- **Date:** CTO confirmation 2026-11-03; publish 2026-11-06. +- **Owner:** CMO writes; CTO verified 2026-10-29. +- **Date:** CTO verified 2026-10-29 ([FRE-329](/FRE/issues/FRE-329)); publish on approval, target 2026-11-05. - **Must be true:** `hook/setup.go`'s strip functions and `PluginInstaller.uninstall` still remove - only their own records at the shipped commit; the custom-agent target is still shown and accepted - before install (NOOK-418); the helper is still the only privileged component. + only their own records at the shipped commit (`removeIfOurs`, `stripOurGroups`/`groupIsOurs`); the + helper is still registered through `SMAppService.daemon` with a Login Items toggle and no password + prompt (`PrivilegedHelper.swift:62-112,204-208`); the custom-agent target is still shown and + accepted before install (NOOK-418); the only host switch uninstall flips is Amp's own hook-enable + flag (`PluginInstaller.swift:379-385`) — and the answer now says so. ### E4 · "Does it work with my terminal, including tmux?" -> **Yes — Terminal.app, iTerm2, Warp, Ghostty, kitty, WezTerm and tmux.** A session is tied to the -> terminal that started it, so Jump lands in the right window and, in tmux, the right pane. Replies -> type back into that same pane. +> **Yes — it recognises Terminal.app, iTerm2, Warp, Ghostty, kitty, WezTerm and tmux. Four of those +> take a typed reply; the rest are watched.** A session is tied to the terminal that started it. Jump +> lands in the right window for Terminal.app, iTerm2, kitty and any tmux pane — in tmux, the right +> pane; on Warp, WezTerm and Ghostty it brings the app forward instead. Replies type straight back +> into Terminal.app, iTerm2, kitty and any tmux pane; on Warp, WezTerm and Ghostty you answer in the +> app's own window, and Alacritty takes no typed reply from another app at all. - **Question source:** no captured ask. Underlying reports: NOOK-302, 2026-10-13 (*"a tmux session shows only 'tmux', and its outer terminal comes from whoever started the tmux server"*); NOOK-310, @@ -161,19 +203,22 @@ check. the remote launch story is still held. - **Audience:** anyone whose workflow is tmux-first. - **Channel:** `/faq`. -- **Owner:** CMO writes; CTO confirms. -- **Date:** CTO confirmation 2026-11-03; publish 2026-11-06. -- **Must be true:** `Sources/NookCore/Terminal` still resolves those seven identities and still - addresses a session's own tmux pane. This entry is **report-sourced, not ask-sourced**; if a - captured ask never arrives, it is still publishable because the reports are real, but it ranks - below E1–E3 until one does. +- **Owner:** CMO writes; CTO verified 2026-10-29. +- **Date:** CTO verified 2026-10-29 ([FRE-329](/FRE/issues/FRE-329)); publish on approval, target 2026-11-05. +- **Must be true:** `TerminalAncestry.programs` still recognises those seven names; `TerminalSend.attempts` + still builds a delivery channel only for tmux, herdr, kitty, iTerm2 and Terminal.app and refuses + Alacritty by name; `TerminalJump` still raises the app rather than the window for Warp, WezTerm and + Ghostty. This entry is **report-sourced, not ask-sourced**; if a captured ask never arrives, it is + still publishable because the reports are real, but it ranks below E1–E3 until one does. ### E5 · "Do I need a Mac with a notch?" -> **No.** On a notched MacBook the island sits in the notch. On machines and displays without one, -> it anchors to the display your cursor is on, so a desktop setup with external monitors gets the -> same treatment. Everything inside the island — agent cards, fan control, the stats strip — works -> identically either way. +> **No. On a notched MacBook the island sits in the notch. On machines and displays without one, it +> sits at the top centre of the display — the same pill with the same slots.** You get one island on +> every display it is turned on for (all connected displays on first launch), each anchored to the top +> of its own screen; Settings › Displays trims that list, and the pointer only decides which display's +> floating controls are live. Everything inside the island — agent cards, fan control, the stats strip +> — works identically either way. - **Question source:** live `/faq`, 2026-10-29; NOOK-290, 2026-10-12 and NOOK-291, 2026-10-12 (non-notch display geometry bugs), NOOK-386, 2026-10-14 (empty pill tucks away on a non-notch @@ -181,15 +226,17 @@ check. - **Claim:** a notch is optional; external displays work. - **Audience:** Mac mini / Studio / external-monitor buyers. - **Channel:** `/faq`. -- **Owner:** CMO keeps; CTO confirms. -- **Date:** CTO confirmation 2026-11-03; publish 2026-11-06. -- **Must be true:** the external-display path still anchors to the pointer's display and the - non-notch geometry tests still pass. +- **Owner:** CMO keeps the question and rewrites the answer; CTO verified 2026-10-29. +- **Date:** CTO verified 2026-10-29 ([FRE-329](/FRE/issues/FRE-329)); publish on approval, target 2026-11-05. +- **Must be true:** `IslandDisplayManager` still owns one island per enabled display, `DisplayStore` + still snapshots every connected display on first launch (`DisplayStore.swift:52-59`), and the + non-notch geometry tests still pass. Nothing tests that first-launch snapshot today — that is a test + gap to file, not a gate on this answer. ### E6 · "How much battery does it cost?" -> **It is a native app, not a background agent.** It watches the agents you already run and does not -> run them itself, so their draw is the number that matters. We do not have a published battery +> **It is a native app, not a background agent.** It watches the agents you already run and never +> runs them in the background, so their draw is the number that matters. We do not have a published battery > measurement for The Nook alone; when we do, it will be a measurement, not an estimate. If it costs > more than it should on your Mac, that is a bug — tell us. @@ -199,8 +246,8 @@ check. - **Claim:** native app, not a background agent; **no numeric battery claim**. - **Audience:** the buyer checking whether this is another menu-bar battery sink. - **Channel:** `/faq`. -- **Owner:** CMO writes; CTO measures or approves the no-number wording. -- **Date:** CTO measurement/decision 2026-11-03; publish 2026-11-06. +- **Owner:** CMO writes; CTO verified the no-number wording 2026-10-29. +- **Date:** CTO verified the no-number wording 2026-10-29; publish on approval, target 2026-11-05. - **Must be true:** either a measurement exists and is quoted, or the no-number sentence ships. Do not restore "the heaviest thing it does is a sensor read" — the profile findings above contradict it. @@ -215,8 +262,8 @@ check. - **Claim:** the floor is 14.2 because of the audio tap API, not a policy choice. - **Audience:** anyone on an older macOS. - **Channel:** `/faq`. -- **Owner:** CMO keeps; CTO confirms. -- **Date:** CTO confirmation 2026-11-03; publish 2026-11-06. +- **Owner:** CMO keeps; CTO verified 2026-10-29. +- **Date:** CTO verified 2026-10-29 ([FRE-329](/FRE/issues/FRE-329)); publish on approval, target 2026-11-05. - **Must be true:** `Package.swift:12` and `LSMinimumSystemVersion` still say 14.2, and `DeploymentFloorTests` still refuses an older floor. @@ -224,20 +271,25 @@ check. > **The Mac app does.** The island, agent cards, permission cards and fan control work with no > network; the hooks talk to the app over a local socket. The network is used for update checks, -> licence activation, crash reports and the optional trial email. The phone link is the exception: -> when you are away from your Mac, the phone reaches it through our relay, so that part needs a -> connection. +> licence activation, crash reports and the optional trial email, plus a few things only when you use +> them: weather (asked for through our relay, with the location you chose), the network panel's +> IP-and-ISP lookup, the speed test, the changelog in Settings, and a bug report if you send one. The +> phone link is the exception: when you are away from your Mac, the phone reaches it through our +> relay, so that part needs a connection. - **Question source:** live `/faq`, 2026-10-29; NOOK-494, 2026-10-16 (*"iOS: the main list gives no sign the phone is offline from the Mac"*). - **Claim:** the Mac app is offline-first; the phone link is not. - **Audience:** the buyer with a disconnected or privacy-sensitive setup. - **Channel:** `/faq`. -- **Owner:** CMO writes; CTO confirms. -- **Date:** CTO confirmation 2026-11-03; publish 2026-11-06. -- **Must be true:** the only network calls at the shipped commit are the update check, licence - activation, crash reporting, the optional trial email, and the phone relay; `/privacy` lists the - same set. This entry shares its gate with the privacy correction below. +- **Owner:** CMO writes; CTO verified 2026-10-29. +- **Date:** CTO verified 2026-10-29 ([FRE-329](/FRE/issues/FRE-329)); publish on approval, target 2026-11-05. +- **Must be true:** the only network uses at the shipped commit are the update check, licence + activation, crash reporting, the optional trial email and the phone relay, plus exactly these five + user-triggered ones — `/v1/weather` on the relay (`SidecarRelayAPI.swift:182-196`), + `NetworkInfoService.swift:60-88,276`, `SpeedTest.swift:36,57`, `ChangelogModel.swift:102`, + `BugReportClient.swift:72-94` — and `/privacy` lists the same set. This entry shares its gate with + the privacy correction below. --- @@ -269,15 +321,29 @@ privacy page today. rather than replace it with another sentence I cannot stand behind. The replacement is held until the Security Engineer's egress inventory and the `/privacy` update land. +**The rule that produced the falsehood comes down with it.** The CTO's verdict traces the live answer +to `freno-dev/marketing/positioning.md` rule 3 (“Honest privacy scoping”) and to the matching +approved-claims row, which state the defensible claim as “No prompt or code content leaves the +device” with the backing “envelope carries session/event/terminal metadata only”. That backing is true +of the hook→app envelope and says nothing about what leaves the device, so if rule 3 stands while the +FAQ answer comes down, the next page restates the claim. Rule 3 and that row are struck in the same +commit as this patch (§7 step 3; the same edit also fixes the stale “macOS 14+” row in that table, +which NOOK-881 retired). + - **Claim:** none until the inventory exists — deliberately. - **Audience:** the buyer for whom this is the whole decision. -- **Channel:** `/faq` (withdrawal) and `/privacy` (replacement). +- **Channel:** `/faq` (withdrawal), `/privacy` (replacement), `marketing/positioning.md` (the rule). - **Owner:** CoS for the withdrawal decision; Security Engineer for the egress inventory and the - disclosure text; CTO for any build change; CMO for the replacement copy. -- **Date:** withdrawal decision 2026-10-31; inventory 2026-11-05; replacement copy 2026-11-09. -- **Must be true:** every destination in `main.swift`, `LicenseService.swift`, `Info.plist`, - `ChangelogRelease.swift` and `SidecarController.swift` is either in the answer or gone from the - build, and `/privacy` lists the same set. Until then, do not publish a privacy answer. + disclosure text; CTO for any build change; CMO for the replacement copy and the rule-3 strike. +- **Date:** withdrawal decision 2026-10-31; inventory 2026-11-05; replacement copy 2026-11-09; rule-3 + strike in the same commit as the page patch (§7 step 3). +- **Must be true:** every egress in the inventory is either in the answer or gone from the build, and + `/privacy` lists the same set. The inventory's scope is wider than the draft first drew it — it must + cover `main.swift`, `LicenseService.swift`, `Info.plist`, `ChangelogRelease.swift`, + `SidecarController.swift`, **plus** `SidecarRelayAPI`/`WeatherService` (`/v1/weather`), + `NetworkInfoService`, `SpeedTest`, `ChangelogModel`, `BugReportClient` and Sparkle's appcast — and + on the Sentry side not only that it starts but `sendDefaultPii` and the trace sample rate. Until + then, do not publish a privacy answer. --- @@ -295,29 +361,32 @@ the Security Engineer's egress inventory and the `/privacy` update land. ## 6. What the page edit would change -**File:** `freno-dev/src/routes/nook/faq.tsx` (site `master` at `134f41e`; local `c1c498e` removes -the remote claim from the landing page, not from the FAQ). +**File:** `freno-dev/src/routes/nook/faq.tsx` (site `master` at `134f41e`; the branch is cut from +local `c1c498e`, which removed the remote claim from the landing page, not from the FAQ). | Action | Entry | |---|---| -| **Remove** | "Does The Nook read my prompts or my code?" — until the egress inventory and `/privacy` are true | -| **Keep, with the exact text above** | "Do I need a Mac with a notch?" | -| **Keep, with the exact text above** | "Why macOS 14.2 or later?" | -| **Rewrite** | "What permissions does it need?" → E3 (adds the config/uninstall answer) | -| **Rewrite** | "How much battery does it cost?" → E6 (no number) | -| **Rewrite** | "Does it work offline?" → E8 (phone exception) | +| **Remove** | “Does The Nook read my prompts or my code?” — until the egress inventory and `/privacy` are true | +| **Rewrite (correction only)** | “Do I need a Mac with a notch?” → E5 (per-display island, not the pointer's display) | +| **Keep, with the exact text above** | “Why macOS 14.2 or later?” | +| **Rewrite** | “What permissions does it need?” → E3 (adds the config/uninstall answer) | +| **Rewrite** | “How much battery does it cost?” → E6 (no number) | +| **Rewrite** | “Does it work offline?” → E8 (phone exception, six-row network list) | | **Add** | E1 (agent fit / Cursor) | | **Add** | E2 (idle) | | **Add** | E4 (terminal / tmux) | +| **Edit** | The file header comment that cites `positioning.md` rule 3 → “Privacy is deliberately absent until the egress inventory and /privacy make an honest answer possible.” | +| **Edit** | The `PageHead` description, which still advertises the privacy question → the new eight-entry list | -Order on the page: E1, E2, E3, E4, E5, E6, E7, E8. The header, the mailto link, the accordion -behavior, and the page metadata stay unchanged. +Order on the page: E1, E2, E3, E4, E5, E6, E7, E8. The mailto link, the accordion behavior and the +page title stay unchanged. **Not in this pass:** FAQPage JSON-LD. The page has none today; adding structured data is an SEO -change, not an objection-mining change. It should be its own reviewed edit. +change, not an objection-mining change. It should be its own reviewed edit — and E1 no longer promises +it. -**Patch artifact:** `freno-dev/marketing/drafts/faq-page.patch` (a proposal, not applied). The page -file itself is untouched until the gates below are satisfied. +**Patch artifact:** `freno-dev/marketing/drafts/faq-page.patch`, regenerated for this revision (a +proposal, not applied). The page file itself is untouched until the gates below are satisfied. --- @@ -325,16 +394,19 @@ file itself is untouched until the gates below are satisfied. | Step | Owner | Date | What settles it | |---|---|---|---| -| 1. CTO verifies the claims and evidence pointers in E1–E8 | CTO | 2026-11-03 | A verdict per entry: verified / not verified / needs a test, with the exact sentence to change. The review issue is [FRE-327](/FRE/issues/FRE-327). | -| 2. Human approves the draft | Sponsor | 2026-11-04 | The draft moves from `marketing/drafts/` to `marketing/approved/`, or the approval card is accepted. No approval before the CTO verdict. | -| 3. Apply the page patch and commit on `freno-dev` | CMO | 2026-11-06 | The patch applies cleanly; `bun test` (or the site's suite) passes; the diff contains only the FAQ entries. | -| 4. Merge to `freno-dev/master` (the publish) | Sponsor or Chief of Staff | 2026-11-06 | A human merge; Vercel deploys. No agent pushes to master. | -| 5. Verify the live page | CMO | 2026-11-06 | `https://nook.freno.me/faq` returns 200 and shows the eight entries with no privacy answer; the text matches the approved draft. | +| 1. CTO verifies the claims and evidence pointers in E1–E8 | CTO | **done 2026-10-29** | [FRE-329](/FRE/issues/FRE-329), verdict in its `faq-verdict` document: E1/E7 verified as written, E2/E6 verified after one sentence each, E3/E4/E5/E8 corrected above, **no entry cut**. Applied in this revision. | +| 2. Human approves this revision | Sponsor | target 2026-10-31 | The draft moves from `marketing/drafts/` to `marketing/approved/`, or the confirmation card on FRE-326 is accepted. The card names the privacy withdrawal, which is part of the same page edit. | +| 2b. Withdrawal of the false privacy answer and of `positioning.md` rule 3 | Chief of Staff | target 2026-10-31 | A CoS decision, recorded on this issue. If the CoS declines, the seven non-privacy entries can still ship; the privacy answer does not stay up and does not get replaced. | +| 3. Apply the page patch, strike rule 3 + its approved-claims row, commit on `freno-dev` | CMO | 2026-11-03 | The patch applies cleanly; the site's own suite passes; the diff contains only the FAQ entries, the page comment/description, and the `positioning.md` strike. One commit, so the page and the rule move together. | +| 4. Merge to `freno-dev/master` (the publish) | Sponsor or Chief of Staff | 2026-11-05 | A human merge; Vercel deploys. No agent pushes to master. | +| 5. Verify the live page | CMO | 2026-11-05 | `https://nook.freno.me/faq` returns 200 and shows the eight entries with no privacy answer; the text matches the approved draft, sentence for sentence. | -**If the CTO rejects an entry:** cut it from the patch and ship the rest. No entry ships unverified. +**If the CTO had rejected an entry:** cut it from the patch and ship the rest — it did not reject any. **If the sponsor does not approve:** nothing is applied; the draft stays in `drafts/`. -**If the support mailbox becomes readable:** re-sort the register by observed asks before step 1; +**If the support mailbox becomes readable:** re-sort the register by observed asks before step 3; the top three may change, and the page order should follow the asks, not this draft's proxy ranking. +**If a `Must be true` line stops being true** before step 3 — a fix regresses, a line moves — the +entry goes back to the CTO, not onto the page. --- @@ -343,7 +415,8 @@ the top three may change, and the page order should follow the asks, not this dr | Date | Source | Verbatim | |---|---|---| | 2026-10-29 | Live `/faq` | "Does The Nook read my prompts or my code?" / "Do I need a Mac with a notch?" / "How much battery does it cost?" / "What permissions does it need?" / "Why macOS 14.2 or later?" / "Does it work offline?" | -| 2026-10-29 | FRE-326 description | "does it work with Cursor?" / "what happens when my agent is idle?" | +| 2026-10-29 | FRE-326 description | “does it work with Cursor?” / “what happens when my agent is idle?” | +| 2026-10-29 | [FRE-329](/FRE/issues/FRE-329) CTO verdict | “Four entries ship as written, two ship after a wording fix… two (E3, E4) currently say something false to a buyer.” Every correction in §3 is that document's own replacement sentence. | | 2026-10-08 | NOOK-121 | "Add /faq from real objections" — shipped the six live topics; refund dropped by Mike. | | 2026-10-20 | NOOK-643 | "agents: Cursor via hooks.json" — "No permission hook is installed, deliberately: Cursor blocks the action when a permission hook prints nothing…" | | 2026-10-21 | NOOK-707 | "agents: Cursor desktop chats bind to the shared extension-host pid and never end" | @@ -386,5 +459,5 @@ the top three may change, and the page order should follow the asks, not this dr --- -*Draft ends. Nothing here is published. The page file stays unchanged until the CTO verdict and the -human move to `approved/`.* +*Draft ends. Nothing here is published. The page file stays unchanged until the sponsor approves this +revision and a human merges it.* diff --git a/marketing/drafts/faq-page.patch b/marketing/drafts/faq-page.patch index 0193118..906093a 100644 --- a/marketing/drafts/faq-page.patch +++ b/marketing/drafts/faq-page.patch @@ -1,5 +1,5 @@ diff --git a/src/routes/nook/faq.tsx b/src/routes/nook/faq.tsx -index 03d135a..539a909 100644 +index 03d135a..bc3adef 100644 --- a/src/routes/nook/faq.tsx +++ b/src/routes/nook/faq.tsx @@ -1,8 +1,7 @@ @@ -29,32 +29,32 @@ index 03d135a..539a909 100644 + question: "What happens when my agent is idle?", answer: - "No. On a notched MacBook the island sits in the notch. On machines and displays without one, it anchors to the display your cursor is on, so a desktop setup with external monitors gets the same treatment. Everything inside the island — agent cards, fan control, the stats strip — works identically either way." -+ "Idle means the last turn is over, or the session has not produced anything yet — not that the process is gone. A running process is liveness, not work: a just-opened agent window can show idle until you type. When an agent finishes a turn with a final message, the row stays green for ten minutes, then goes gray. A stale row is different: it means The Nook's integration cannot report for that session, and the row says so instead of pretending it is idle. Nothing is lost when a row goes idle — the next prompt flips it back to running. If a session that is obviously working says idle, that is a bug; tell us." ++ "Idle means the last turn is over, or the session has not produced anything yet — not that the process is gone. A running process is liveness, not work: a just-opened agent window can show idle until you type. When an agent finishes a turn with a final message, the row stays green for ten minutes, then goes gray. A stale row is different: it means The Nook's integration cannot report for that session, and the row says so instead of pretending it is idle. Nothing is lost when a row goes idle — the next prompt brings it back and flips it to running. The row itself leaves the island 15 minutes after the turn (5 if the turn ended without a reply), so a long-quiet session reappears on its next event instead of sitting there. If a session that is obviously working says idle, that is a bug; tell us." }, { - question: "How much battery does it cost?", + question: + "What permissions does it need — and what does it write into my agent's config?", + answer: -+ "The app itself runs unprivileged. Fan control and charge limiting go through a small helper that macOS requires to run as root for hardware access; the app installs it on first use and you approve it once with your password. For each agent, it adds one entry — a hook or a plugin — inside that agent's own config directory. It does not write outside that directory, and it only touches the records it created: a hook entry you added yourself in the same file survives install and uninstall. Uninstall removes exactly what it wrote, with no leftover links or orphaned files." ++ "The app itself runs unprivileged. Fan control and charge limiting go through a small helper that macOS requires to run as root for hardware access; the app registers it on first use and takes you to System Settings › General › Login Items & Extensions, where you switch it on once. For each agent it adds what that agent needs — a hook group per event it listens to, or one plugin link — inside the agent's own config file or directory. It keeps its own files under ~/.nook — the hook binary and one plugin copy per agent — and adds only its own entries to that agent's config. A hook entry you added yourself in the same file survives install and uninstall, and it only touches the records and switches it created. Uninstall removes exactly what it wrote — and switches off what it turned on — with no leftover links or orphaned files." + }, + { + question: "Does it work with my terminal, including tmux?", answer: - "The Nook is a small native UI, not a background agent — it watches the agents you're already running; it doesn't run anything itself. The heaviest thing it does is read and write your Mac's fan and charging controllers, which is a lightweight sensor read. If you're running enough coding agents to need it, those agents dwarf the app's own draw." -+ "Yes — Terminal.app, iTerm2, Warp, Ghostty, kitty, WezTerm and tmux. A session is tied to the terminal that started it, so Jump lands in the right window and, in tmux, the right pane. Replies type back into that same pane." ++ "Yes — it recognises Terminal.app, iTerm2, Warp, Ghostty, kitty, WezTerm and tmux. Four of those take a typed reply; the rest are watched. A session is tied to the terminal that started it. Jump lands in the right window for Terminal.app, iTerm2, kitty and any tmux pane — in tmux, the right pane; on Warp, WezTerm and Ghostty it brings the app forward instead. Replies type straight back into Terminal.app, iTerm2, kitty and any tmux pane; on Warp, WezTerm and Ghostty you answer in the app's own window, and Alacritty takes no typed reply from another app at all." }, { - question: "What permissions does it need?", + question: "Do I need a Mac with a notch?", + answer: -+ "No. On a notched MacBook the island sits in the notch. On machines and displays without one, it anchors to the display your cursor is on, so a desktop setup with external monitors gets the same treatment. Everything inside the island — agent cards, fan control, the stats strip — works identically either way." ++ "No. On a notched MacBook the island sits in the notch. On machines and displays without one, it sits at the top centre of the display — the same pill with the same slots. You get one island on every display it is turned on for (all connected displays on first launch), each anchored to the top of its own screen; Settings › Displays trims that list, and the pointer only decides which display's floating controls are live. Everything inside the island — agent cards, fan control, the stats strip — works identically either way." + }, + { + question: "How much battery does it cost?", answer: - "The app itself runs unprivileged. Fan control and charge limiting go through a small helper component that macOS requires to run as root for hardware access — the app installs it on first use and you approve it once with your password. The hooks live in each agent's own config directory; you can inspect or remove every file it writes." -+ "It is a native app, not a background agent. It watches the agents you already run and does not run them itself, so their draw is the number that matters. We do not have a published battery measurement for The Nook alone; when we do, it will be a measurement, not an estimate. If it costs more than it should on your Mac, that is a bug — tell us." ++ "It is a native app, not a background agent. It watches the agents you already run and never runs them in the background, so their draw is the number that matters. We do not have a published battery measurement for The Nook alone; when we do, it will be a measurement, not an estimate. If it costs more than it should on your Mac, that is a bug — tell us." }, { question: "Why macOS 14.2 or later?", @@ -66,7 +66,7 @@ index 03d135a..539a909 100644 question: "Does it work offline?", answer: - "Yes. Everything The Nook does — the agent grid, permission cards, fan and thermal control — works with no network at all, and your agents' hooks talk to the app over a local socket. The network is only used for update checks, license activation, and the optional trial email." -+ "The Mac app does. The island, agent cards, permission cards and fan control work with no network; the hooks talk to the app over a local socket. The network is used for update checks, licence activation, crash reports and the optional trial email. The phone link is the exception: when you are away from your Mac, the phone reaches it through our relay, so that part needs a connection." ++ "The Mac app does. The island, agent cards, permission cards and fan control work with no network; the hooks talk to the app over a local socket. The network is used for update checks, licence activation, crash reports and the optional trial email, plus a few things only when you use them: weather (asked for through our relay, with the location you chose), the network panel's IP-and-ISP lookup, the speed test, the changelog in Settings, and a bug report if you send one. The phone link is the exception: when you are away from your Mac, the phone reaches it through our relay, so that part needs a connection." } ];