marketing: correct the /privacy copy against the FRE-333 inventory

FRE-333's egress inventory landed after this patch was first written, and its
own §G proposed a page text. This is that text corrected against the inventory
it cites, six differences, each forced by a row:

- the opening no longer says prompts are "never sent to us" (sealed frames
  transit our relay; a remote machine carries them by design)
- (d) Weather states that it registers with the relay even with Phone off, and
  that a licensed Mac presents its license key there - SidecarController.weather()
  goes through the same relayCredential(licenseKey:) as the phone path
- (a) adds /deactivate (key + UUID) and the trial email (email + UUID, once)
- (i) stops saying a trial email delivers a license key; it is one reminder
  before the trial ends, the key is issued at checkout
- (b) keeps today's build (on every launch, no off switch, IP + macOS username);
  the opt-in form is the Contingency swap, so the page is true on the build it
  deploys with
- (j) carries the CTO's FRE-322 §2 code fact, with the remote-machine exception;
  he may still cut it

Page file untouched, nothing published. Patch re-checked with git apply --check
and parse-checked with esbuild; the site's own suite is `bun test` and this host
has no bun, so that stays an apply-time obligation. Verification is FRE-354;
the Sentry opt-in is proposed as FRE-355.
This commit is contained in:
Paperclip Agent
2026-10-29 09:12:16 +00:00
parent 2c917e63e8
commit e46c0a2677
2 changed files with 72 additions and 33 deletions

View File

@@ -1,5 +1,5 @@
diff --git a/src/routes/nook/privacy.tsx b/src/routes/nook/privacy.tsx
index da0cc1d..6a0acc0 100644
index da0cc1d..f357ded 100644
--- a/src/routes/nook/privacy.tsx
+++ b/src/routes/nook/privacy.tsx
@@ -1,9 +1,17 @@
@@ -23,7 +23,7 @@ index da0cc1d..6a0acc0 100644
*/
import { buildMainSiteUrl } from "~/lib/subdomain-url";
import { PageHead } from "~/components/PageHead";
@@ -21,39 +29,109 @@ export default function NookPrivacyPolicy() {
@@ -21,39 +29,118 @@ export default function NookPrivacyPolicy() {
<SubdomainHeader />
<div class="min-h-screen px-[8vw] py-[10vh]">
<div class="py-4 text-xl">The Nook&apos;s Privacy Policy</div>
@@ -60,9 +60,12 @@ index da0cc1d..6a0acc0 100644
+ the app; the device name is so you can recognize the Mac among
+ your activations. While you are on the trial, this is sent at
+ each launch. Once you are licensed, each launch re-checks only
+ that your key has not been revoked. These calls fail open: with
+ no connection, the app keeps working, because license
+ verification itself is offline.
+ that your key has not been revoked. Deactivating a Mac sends the
+ license key and that Mac&apos;s UUID. If you add an email during
+ the trial, that request carries the email and the UUID, and it
+ is sent once. All of these calls fail open: with no connection,
+ the app keeps working, because license verification itself is
+ offline.
+ </div>
+ <div class="pb-2">
+ <div class="-ml-6">(b) Crash and error reporting:</div> Crash
@@ -92,7 +95,9 @@ index da0cc1d..6a0acc0 100644
+ rounded to a 0.1° grid — about 11 km — and the rounding happens
+ on your Mac before anything is sent. The Weather module
+ registers with the relay for this even if you never turn on the
+ phone connection. &quot;My Location&quot; asks macOS for your
+ phone connection, and on a licensed Mac that registration
+ presents the license key, exactly as the phone connection&apos;s
+ does. &quot;My Location&quot; asks macOS for your
+ approximate position, and naming or searching for a place uses
+ Apple&apos;s Maps service, so Apple sees those lookups. Neither
+ feature sends us your precise location.
@@ -134,9 +139,10 @@ index da0cc1d..6a0acc0 100644
- checkout is used to deliver your license key and to look up your
- order.
+ <div class="-ml-6">(i) Your email and payment:</div> The email
+ you give at trial start or checkout delivers your license key
+ and looks up your order. Payments are processed by Stripe; we
+ never see or store your card details.
+ you give at checkout delivers your license key and looks up your
+ order. An email you add during the trial is used for one
+ reminder before the trial ends. Payments are processed by
+ Stripe; we never see or store your card details.
</div>
<div class="pb-2">
- <div class="-ml-6">(d) Payment:</div> Payments are processed by
@@ -144,15 +150,18 @@ index da0cc1d..6a0acc0 100644
+ <div class="-ml-6">(j) What does not leave your Mac:</div> The
+ hook and the bridge that connect your agents to The Nook talk to
+ nothing but your Mac — the hook dials the local bridge socket,
+ and the bridge only listens. The exception is deliberate and
+ yours: if you add a remote machine, the hook on that machine
+ dials this Mac, and that is the one case where agent traffic
+ crosses the network. The privileged helper that controls fans
+ and charging has no networking code at all.
+ and the bridge only listens. Two paths carry agent data across
+ the network, and both are switched on by you: if you add a
+ remote machine, the hook on that machine dials this Mac over
+ SSH; and if you use the phone connection, the session updates,
+ approvals and replies described in (c) travel through the relay,
+ sealed end to end.
+ The privileged helper that controls fans and charging has no
+ networking code at all.
</div>
</div>
</div>
@@ -63,9 +141,11 @@ export default function NookPrivacyPolicy() {
@@ -63,9 +150,11 @@ export default function NookPrivacyPolicy() {
<span class="-ml-4 pr-2">2.</span> How We Use It
</div>
<div class="pb-2 pl-4">
@@ -167,7 +176,7 @@ index da0cc1d..6a0acc0 100644
</div>
</div>
@@ -74,9 +154,11 @@ export default function NookPrivacyPolicy() {
@@ -74,9 +163,11 @@ export default function NookPrivacyPolicy() {
<span class="-ml-4 pr-2">3.</span> Data Security
</div>
<div class="pb-2 pl-4">