Byte-identical to The-Nook drafts/faq-from-objections.md at b86a980b. The plan now names the rule-3 patch and FRE-334, the Chief of Staff's withdrawal ask. Source issue: FRE-326. Co-Authored-By: Paperclip <noreply@paperclip.ing>
468 lines
36 KiB
Markdown
468 lines
36 KiB
Markdown
# `/faq` from the objections we already have
|
||
|
||
**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
|
||
here — those stay with FRE-204, the Chief of Staff and the sponsor.
|
||
|
||
---
|
||
|
||
## 1. What I could read, and what I could not
|
||
|
||
| Source | What it is | Read on | What it yielded |
|
||
|---|---|---|---|
|
||
| `nook.freno.me/faq` | The live page | 2026-10-29 | Six questions already published: privacy, notch, battery, permissions, macOS 14.2, offline. |
|
||
| FRE-326 description | This board issue | 2026-10-29 | Two purchase-blocking questions named verbatim: *"does it work with Cursor?"* and *"what happens when my agent is idle?"* |
|
||
| NOOK issue corpus | 948 issues imported from Plane, plus the 324-issue Paperclip board | 2026-10-08 → 2026-10-28 | User-observable defect reports. These are reports, not captured asks; they prove an objection is live. |
|
||
| `freno-dev/marketing/positioning.md` | Voice, approved claims, competitor ban | 2026-10-29 | The register and the "never name a competitor" rule. |
|
||
| The-Nook code | `AgentRegistry.swift`, `SessionModels.swift`, `Terminal*`, `hook/setup.go`, `PluginInstaller.swift`, `LicenseService.swift`, `main.swift` | 2026-10-29 | The technical facts each answer is allowed to use. |
|
||
| NOOK-121 | The original `/faq` creation (2026-10-08) | 2026-10-29 | Confirms the six live questions came from the strategy's named objections, not from a support corpus. Refund was deliberately dropped by Mike. |
|
||
|
||
### The gap that shapes this draft
|
||
|
||
**Support mail is not readable from this run.** There is no mailbox on the machine; the in-app
|
||
"Report a bug" form `POST`s to `freno-dev/src/routes/api/the-nook/report.ts`, which emails the
|
||
developer and stores nothing queryable. `/privacy` and the repo contain no support corpus.
|
||
|
||
**Reply threads are not collected.** `freno-dev/marketing/listening.md` is an empty table; FRE-201
|
||
(the listening job) has not produced a thread yet.
|
||
|
||
**Directory comments do not exist yet.** FRE-207 has a submission packet, not live listings; none of
|
||
the directories has a comment thread about The Nook to mine.
|
||
|
||
**Consequence:** I cannot rank by observed ask frequency, because no ask corpus exists. What follows
|
||
ranks by **purchase-blocking weight first**, then by **the number of named reports in our own issue
|
||
corpus that belong to the cluster**. The report counts are a proxy for "this objection is live", not
|
||
a count of people who asked. I have not put a percentage on anything.
|
||
|
||
---
|
||
|
||
## 2. The register — clusters, sources, frequency, and whether they block a purchase
|
||
|
||
| # | Cluster | The question in the buyer's words | Verbatim source(s), with dates | Frequency evidence | Blocks a purchase? | Disposition |
|
||
|---|---|---|---|---|---|---|
|
||
| 1 | Privacy / what leaves the Mac | "Does The Nook read my prompts or my code?" | Live `/faq`, 2026-10-29; code findings in `main.swift:272-278`, `LicenseService.swift:254`, `docs/sidecar-frames.md` | 1 live question + 3 named code findings | **Yes — the whole decision for this audience** | **Withdraw the live answer; replacement held.** See §4. |
|
||
| 2 | Agent fit / Cursor | "Does it work with Cursor — and can I approve from the notch, or only watch?" | FRE-326, 2026-10-29: *"does it work with Cursor?"*; NOOK-643 (2026-10-20), NOOK-695 (2026-10-20), NOOK-699 (2026-10-20), NOOK-707 (2026-10-21), NOOK-638 (2026-10-20) | 1 board question + 5 reports | **Yes** | **Propose E1** |
|
||
| 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 | **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** |
|
||
| 10 | Trial / licence mechanics | "What am I actually buying — trial, Macs, updates?" | NOOK-682 (2026-10-20), NOOK-684 (2026-10-20), NOOK-60 (2026-10-08) | 2 reports; no captured ask | **Yes** | **Held** — no verbatim ask; do not invent one |
|
||
| 11 | Remote agents / containers | "Can I approve an agent running on a remote box or in Docker?" | FRE-323, FRE-320, FRE-315; `marketing/positioning.md` claims remote SSH | Many reports; the claim is unverified | **Yes — the launch claim** | **Held** — no answer before the demo |
|
||
| 12 | Phone / Watch | "Is there an iPhone app? Do I need one?" | NOOK-939 (2026-10-27), NOOK-294 (backlog) | 2 reports; status unverified | Curious; would be blocking if sold | **Held** — CTO status answer first |
|
||
| 13 | Refund / price | "What's your refund policy? Is $10 the real price?" | FRE-204, NOOK-121 | No readable source; contractual | **Yes** | **Out of scope** — FRE-204, CoS + sponsor |
|
||
|
||
### What changed since the last register (FRE-204)
|
||
|
||
- 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
|
||
|
||
Each entry carries the six required things: **claim, audience, channel, owner, date, and what has to
|
||
be true before it ships.** The answer text is the copy to paste; the trace is the evidence a CTO can
|
||
check.
|
||
|
||
### E1 · "Does it work with my agent — and can I approve from the notch, or only watch?"
|
||
|
||
> **It depends on the agent, and Cursor is the useful example.** Cursor is watched, not gated: its
|
||
> sessions, finished turns and errors appear in the island, but when Cursor asks for permission the
|
||
> prompt stays in Cursor. That is deliberate — Cursor blocks the action when a permission hook runs
|
||
> and prints nothing, so gating it would override Cursor's own prompts. Other agents do hand the
|
||
> decision to The Nook, so a tool call waits and you tap Allow or Deny from the card. One limit:
|
||
> `cursor-agent -p` one-shot runs send no turn end, so they appear but do not get a completion card.
|
||
|
||
- **Question source:** FRE-326, 2026-10-29 (*"does it work with Cursor?"*); NOOK-643, 2026-10-20
|
||
(*"No permission hook is installed, deliberately: Cursor blocks the action when a permission hook
|
||
prints nothing…"*).
|
||
- **Claim:** agent gating is per-agent; Cursor is watch-only.
|
||
- **Audience:** the buyer whose agent is not Claude Code.
|
||
- **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: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?"
|
||
|
||
> **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 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,
|
||
2026-10-22 (*"Codex terminal: sessions become idle or disappear prematurely"*); NOOK-417,
|
||
2026-10-15 (*"Never render plain Idle for a session whose integration is dark"*).
|
||
- **Claim:** idle is a statement about the last turn, not a guess at the process; stale is a separate
|
||
state.
|
||
- **Audience:** anyone watching a fleet and wondering whether to intervene.
|
||
- **Channel:** `/faq`.
|
||
- **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 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
|
||
Codex hook installed but not trusted, so it never ran); NOOK-648, 2026-10-20 and NOOK-685,
|
||
2026-10-20 (uninstall leftovers); NOOK-568, 2026-10-17 (helper re-registration tore down an
|
||
approved helper).
|
||
- **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 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 (`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 — 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,
|
||
2026-10-13 (*"jump and send address tmux panes on the default server, ignoring the session's tmux
|
||
socket"*).
|
||
- **Claim:** seven terminal families and tmux panes included. Remote panes are not claimed here;
|
||
the remote launch story is still held.
|
||
- **Audience:** anyone whose workflow is tmux-first.
|
||
- **Channel:** `/faq`.
|
||
- **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
|
||
> 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
|
||
display).
|
||
- **Claim:** a notch is optional; external displays work.
|
||
- **Audience:** Mac mini / Studio / external-monitor buyers.
|
||
- **Channel:** `/faq`.
|
||
- **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 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 source:** live `/faq`, 2026-10-29; NOOK-850, 2026-10-23 (*"the idle app does work
|
||
nothing asked for (CPU wins from a live profile)"*), NOOK-851, 2026-10-23 (a 30 fps timeline ticks
|
||
the fan icon at idle), NOOK-877, 2026-10-23 (compact Nook still costs too much CPU at rest).
|
||
- **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 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.
|
||
|
||
### E7 · "Why macOS 14.2 or later?"
|
||
|
||
> **The audio mixer listens to each app's own sound stream, and Apple only shipped that API in macOS
|
||
> 14.2 (Sonoma).** The app links against it, so 14.0 and 14.1 cannot launch it.
|
||
|
||
- **Question source:** live `/faq`, 2026-10-29; NOOK-881, 2026-10-23 (*"A macOS 14.0/14.1 Mac cannot
|
||
launch the app at all: dyld dies on a strongly linked CATapDescription overlay symbol"*).
|
||
- **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 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.
|
||
|
||
### E8 · "Does it work offline?"
|
||
|
||
> **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.
|
||
|
||
- **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 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.
|
||
|
||
---
|
||
|
||
## 4. The correction that is not a new entry: privacy
|
||
|
||
**Live answer, quoted from `nook.freno.me/faq` on 2026-10-29:**
|
||
|
||
> "No. The hooks and plugins that connect your agents to The Nook send session metadata only — which
|
||
> agent is running, which session, which event happened, which terminal it lives in. No prompt text
|
||
> and no code content leaves your device. Two things do leave the device, and we'd rather say so
|
||
> plainly: anonymous usage telemetry, and your email address if you choose to give it at trial start.
|
||
> That's the whole list."
|
||
|
||
**Why it cannot stay up:** it is contradicted by the current build.
|
||
|
||
1. **Sentry starts unconditionally with `sendDefaultPii = true`** (`Sources/NookApp/main.swift:272-278`).
|
||
That is crash and error reporting with personal identifiers, not "anonymous usage telemetry".
|
||
2. **The licence/trial call sends `IOPlatformUUID` and the Mac's device name** (`LicenseService.swift:254`,
|
||
`:305`). Precision from the verdict: the identifiers ride on activation, not on every launch — a
|
||
licensed Mac's launch call is `/status` with the key only (`:290-295`).
|
||
3. **With the phone link on, prompt and reply text transit `nook-relay.freno.me`, sealed end to end**
|
||
(`docs/sidecar-frames.md`). The relay can route the payload but cannot read it; the live answer
|
||
still says no prompt text leaves the device.
|
||
|
||
`/privacy` discloses the hardware UUID, device name and Stripe, but **not** Sentry and **not** the
|
||
relay. So there is no replacement sentence I can write that is both true and consistent with the
|
||
privacy page today.
|
||
|
||
**Proposed:** remove the privacy entry from `/faq` in the same edit that ships the other entries,
|
||
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), `/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 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.
|
||
|
||
---
|
||
|
||
## 5. Held — clusters with no entry yet
|
||
|
||
| Cluster | Why it is held | Owner and date |
|
||
|---|---|---|
|
||
| Trial / licence mechanics ("trial, Macs, updates") | No captured ask. NOOK-682 and NOOK-684 are defect reports, not a buyer question. The answer is factual (14 days, 3 Macs, Sparkle updates), but the task says do not invent a question to fill the slot. | CMO to capture an ask; CTO confirms `LicenseService.swift:43`, `:262` by 2026-11-03. |
|
||
| Remote agents / containers | The launch claim is unverified (FRE-315, FRE-322, FRE-323, FRE-320). No FAQ answer before the demo. | CTO evidence; CMO copy the day it exists. Revisit 2026-11-12. |
|
||
| Phone / Watch | Status is unverified; the landing page and FAQ currently disagree. | CTO status answer by 2026-11-03; CMO copy after. |
|
||
| Refund / price | Contractual, and explicitly out of this issue. | FRE-204, CoS + sponsor. |
|
||
| Custom agents | No captured ask; the `/agents` page already says a custom agent can wire itself in. | No entry until asked. |
|
||
|
||
---
|
||
|
||
## 6. What the page edit would change
|
||
|
||
**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 |
|
||
| **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 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 — and E1 no longer promises
|
||
it.
|
||
|
||
**Patch artifacts:** `freno-dev/marketing/drafts/faq-page.patch`, regenerated for this revision, and
|
||
`freno-dev/marketing/drafts/positioning-privacy-withdrawal.patch` for the rule-3 strike step 3 needs
|
||
to land with it (both proposals, neither applied). The page file and `positioning.md` are untouched
|
||
until the gates below are satisfied; `faq-page.patch` re-checked against `freno-dev` master
|
||
`c1c498e` on 2026-10-29 and applies cleanly.
|
||
|
||
---
|
||
|
||
## 7. Publish gates and sequence
|
||
|
||
| Step | Owner | Date | What settles it |
|
||
|---|---|---|---|
|
||
| 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 — asked in [FRE-334](/FRE/issues/FRE-334) | 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 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 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.
|
||
|
||
---
|
||
|
||
## Appendix A — verbatim source notes
|
||
|
||
| 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-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" |
|
||
| 2026-10-23 | NOOK-898 | "hook: kimi payloads fail to decode, so every Kimi session stays idle" |
|
||
| 2026-10-22 | NOOK-823 | "Codex terminal: sessions become idle or disappear prematurely" |
|
||
| 2026-10-15 | NOOK-417 | "Never render plain Idle for a session whose integration is dark" |
|
||
| 2026-10-15 | NOOK-415 | "Sessions whose integration predates the bridge credential freeze as Idle forever" |
|
||
| 2026-10-21 | NOOK-733 | "codex: a non-interactive session never runs an installed hook (0.163.0)" |
|
||
| 2026-10-20 | NOOK-648 | "opencode: uninstalling a pre-package install leaves its old nook.js link dangling" |
|
||
| 2026-10-20 | NOOK-685 | "tests: InstallerTests.clineHookFiles writes through the managed TaskComplete symlink and then expects that path to survive uninstall" |
|
||
| 2026-10-15 | NOOK-418 | "security: a custom agent's install target is never shown to, or approved by, the user" |
|
||
| 2026-10-17 | NOOK-568 | "helper: launch-time re-registration tears down an approved helper and leaves it unregistered" |
|
||
| 2026-10-13 | NOOK-302 | "terminal: a tmux session shows only 'tmux', and its outer terminal comes from whoever started the tmux server" |
|
||
| 2026-10-13 | NOOK-310 | "terminal: jump and send address tmux panes on the default server, ignoring the session's tmux socket" |
|
||
| 2026-10-22 | NOOK-788 | "pane: a remote reply inside a private tmux server resolves to nothing, and a pane id can be sent without its socket" |
|
||
| 2026-10-12 | NOOK-290 | "Compact island: weather slot clips mid-glyph on non-notch displays (no text cap)" |
|
||
| 2026-10-12 | NOOK-291 | "Compact island: non-notch pill is 36 pt wider than its slot row (padding double-counted in pillWidth)" |
|
||
| 2026-10-14 | NOOK-386 | "island: hide the empty pill under the notch (or above the top edge) and keep a narrower hover trigger" |
|
||
| 2026-10-23 | NOOK-850 | "Nook: the idle app does work nothing asked for (CPU wins from a live profile)" |
|
||
| 2026-10-23 | NOOK-851 | "island: a 30 fps timeline ticks the fan icon even when the fan is idle" |
|
||
| 2026-10-23 | NOOK-877 | "island: compact Nook still costs too much CPU at rest (round two, A/B per fix)" |
|
||
| 2026-10-23 | NOOK-881 | "A macOS 14.0/14.1 Mac cannot launch the app at all: dyld dies on a strongly linked CATapDescription overlay symbol" |
|
||
| 2026-10-16 | NOOK-494 | "iOS: the main list gives no sign the phone is offline from the Mac" |
|
||
| 2026-10-20 | NOOK-682 | "licensing: a new user can be blocked at launch instead of getting the 14-day trial" |
|
||
| 2026-10-20 | NOOK-684 | "licensing: parseISO rejects the server's fractional-second trial timestamp, so an expired server trial resets to 14 days" |
|
||
| 2026-10-08 | NOOK-60 | "Capture email at trial start" |
|
||
|
||
## Appendix B — frequency method
|
||
|
||
- **Live questions:** one per entry that quotes the live page. There are six, and they are the only
|
||
questions on the page today.
|
||
- **Board questions:** the two examples in FRE-326. They are not customer quotes; they are the
|
||
board's own words for the purchase-blocking objections this issue was created to answer.
|
||
- **Report counts:** the number of distinct NOOK issues I read whose subject or resolution directly
|
||
produced the objection, listed by identifier and date in §2 and Appendix A. I did not use a raw
|
||
keyword count: "agent" appears in 344 issues and "privacy" in 177, which says nothing about what
|
||
buyers ask. The counts are deliberately small and inspectable.
|
||
- **No ask frequency, no percentages.** The first thing a real support corpus changes is the order,
|
||
not the wording.
|
||
|
||
---
|
||
|
||
*Draft ends. Nothing here is published. The page file stays unchanged until the sponsor approves this
|
||
revision and a human merges it.*
|