diff --git a/marketing/drafts/remote-ssh/copy.md b/marketing/drafts/remote-ssh/copy.md deleted file mode 100644 index b7a449f..0000000 --- a/marketing/drafts/remote-ssh/copy.md +++ /dev/null @@ -1,79 +0,0 @@ -# Remote SSH copy — HELD, do not publish - -**Status:** removed from the `freno-dev` source on 2026-10-29 in the FRE-323 -correction, and **not yet off the live site** — the deploy is blocked on a write -credential to `mikefreno/freno-dev` (card `82d1e1b7`). `nook.freno.me` still -serves every sentence below until that push or a Vercel deploy lands. -**Owner:** CMO. **Verified by:** CTO, on the FRE-320/FRE-205 work. -**Restore only when:** FRE-320/FRE-205 ship a genuinely one-click install, the CTO -verifies that flow, and a recording shows a remote agent joining the island. -Until then this file is the only home for these sentences. - -## What was removed - -### 1. Landing collage tile - -Source: `src/components/nook/FeatureCollage.tsx` (removed 2026-10-29). - -``` -kicker: Remote -title: Agents on other machines -body: Run agents on Linux boxes and SSH servers — one click installs the - nook-hook, and their sessions join the same island. -``` - -The mock attached to it showed two session rows whose agent chips named -`build-box` and `gpu-rig`. - -### 2. Landing feature breakdown section - -Source: `src/components/nook/FeatureBreakdowns.tsx` (removed 2026-10-29). - -``` -kicker: Remote -title: Any SSH box, one click away -body: Pick a host from your ssh config or your tailnet and click once — the - nook-hook installs itself and its agents appear beside your local ones, - indistinguishable. - -bullets: -- One click: connect, push the hook, configure agents, check it can reach this Mac -- Hosts mirror this Mac's installed integrations automatically -- Remote sessions are ordinary rows; the agent chip names the machine -``` - -The section's demo animated a `gpu-rig` host moving from "Not set up" through -`connecting` → `pushing the hook binary` → `configuring agents` → `checking the -host can reach this Mac` → `Live`, then showed a remote session row. - -### 3. Approvals bullet - -Source: `src/components/nook/FeatureBreakdowns.tsx` (removed 2026-10-29). - -``` -- Works across every hooked agent, local or remote -``` - -### 4. Feature chip - -Source: `src/components/nook/IslandExtras.tsx` (removed 2026-10-29). - -``` -One-click SSH setup -``` - -## What replaced it - -Nothing. The Remote tile and section were removed rather than replaced; the -existing Approvals cell already carries the verified local claim: - -> Approve an agent's tool call from your Mac's notch, and the agent carries on. - -## Restore checklist - -1. FRE-320/FRE-205 have shipped the one-click install and removed the - `~/.ssh/config` / `ssh-copy-id` friction described in FRE-320. -2. The CTO has verified the shipping flow and the evidence is on FRE-320. -3. A recording exists showing a remote agent joining the island. -4. CMO restores the copy above, then owns the launch plan for it — with an - owner and date per item — before anything goes back on the site. diff --git a/marketing/drafts/remote-ssh/rationale.md b/marketing/drafts/remote-ssh/rationale.md deleted file mode 100644 index 104c08b..0000000 --- a/marketing/drafts/remote-ssh/rationale.md +++ /dev/null @@ -1,30 +0,0 @@ -# Why the remote claim is parked - -The site was selling a setup path a buyer does not get. - -FRE-320 measured today's actual path (2026-10-29): the one-click flow is -app-UI-only, needs a hand-edited `~/.ssh/config` for any host not already in ssh -config or on the tailnet, needs a one-time `ssh-copy-id` because the app runs ssh -with `BatchMode=yes`, and has no manual fallback for minting the per-host -credential. FRE-315 and FRE-322 §3 correction 4 marked the remote claim -unverified and demo-gated. The CTO named it the largest launch risk because it -was already in front of buyers. - -So the `freno-dev` source now says only what the product can back today: local -agents, the card, and the notch. That correction is committed locally and is -**not deployed** — the live page still carries the remote sentences until the -push in FRE-323 card `82d1e1b7` lands. The remote story is not deleted — it is -parked here with the FRE-320/FRE-205 work so it can return the day the one-click -install ships and is recorded. - -## What has to be true before it returns - -| Requirement | Owner | Date | -|---|---|---| -| One-click install ships without hand-edited `~/.ssh/config` or `ssh-copy-id` | FRE-320/FRE-205 engineering | When FRE-320/FRE-205 ships | -| CTO verifies the shipping flow and records the evidence on FRE-320 | CTO | Same day, before any copy moves | -| A recording shows a remote agent joining the island | Sponsor/CMO | Before restore | -| Restore copy and rebuild the launch plan with an owner + date per item | CMO | Day the three rows above are true | - -Nothing in this folder is publishable. `marketing/approved/` remains the only -place a human publishes from. diff --git a/marketing/positioning.md b/marketing/positioning.md index 0922cf7..9864972 100644 --- a/marketing/positioning.md +++ b/marketing/positioning.md @@ -4,13 +4,13 @@ Every drafted asset draws its voice, claims, and constraints from this file. If artifact invents its own framing, fix the artifact or fix this file — never both silently diverging. -**Reconciled 2026-10-29**, and again **2026-11-03** for the FRE-997 count -correction, against the CTO's verdicts ([FRE-315], [FRE-322], [FRE-354], -[FRE-997]), the Chief of Staff's price decision (2026-10-29 04:01), the Plan B -launch route ([FRE-346] → [FRE-203] `plan-b`), and `The-Nook` master (app floor is -**14.2**, not 14.0 — `freno-dev` `881190d`, site merge `134f41e`). The previous -version of this file named an upstream `the-nook/docs/marketing-strategy.md` that -no longer exists; the verdicts below are the source of truth it was pointing at. +**Reconciled 2026-10-29**, and again **2026-11-03** for the FRE-997 correction, +against the CTO's verdicts ([FRE-315], [FRE-322], [FRE-354], [FRE-997]), the Chief +of Staff's price decision (2026-10-29 04:01), the Plan B launch route ([FRE-346] → +[FRE-203] `plan-b`), and `The-Nook` master (app floor is **14.2**, not 14.0 — +`freno-dev` `881190d`, site merge `134f41e`). The previous version of this file +named an upstream `the-nook/docs/marketing-strategy.md` that no longer exists; the +verdicts below are the source of truth it was pointing at. [FRE-315]: https://paperclip.freno.me/FRE/issues/FRE-315 [FRE-322]: https://paperclip.freno.me/FRE/issues/FRE-322 @@ -115,11 +115,16 @@ one thing forbidden: say "TestFlight beta" when the phone exists in a sentence a all, and never claim approvals-from-phone as a shipped capability without its own CTO verdict — no "(coming soon)" parentheticals either way. -Remote SSH is **held**, not approved: the one-click install has not -been verified end to end ([FRE-315] §1) and the shipped path needs hand-edited -`~/.ssh/config` and a one-time `ssh-copy-id` ([FRE-320]). Its copy stays parked in -`marketing/drafts/remote-ssh/` until the CTO verifies the shipping flow **and** a -recording shows a remote agent joining the notch. +Remote SSH is **publishable**, and the site sells it again ([FRE-997]). The +copy that was pulled on 2026-10-29 had been checked against claims it never made: +hosts come from `~/.ssh/config` and Tailscale (`RemoteHostDiscovery`), the +one-time `ssh-copy-id` is a prerequisite the row hands the user as a command +(`RemoteHostStatus.fixCommand`), the per-host credential is minted and copied +over (`RemoteMirror`), and a remote host mirrors this Mac's integrations +(`RemoteMirrorReconcile`). Two things in the old copy were wrong and were fixed +rather than restored: the "every hooked agent" overstatement, and a count that +said thirteen against a registry of eighteen. Muse, Cline and Amp are +`.unsupported` for remote in `AgentSpec.remote`, and the copy names them. ### 5. Humans hold every account @@ -138,9 +143,9 @@ Each row names the evidence, not a feeling. Re-read the verdict before using a r | The hook and bridge are not a cloud service | **Verified code fact, held on disclosure** | [FRE-322] §2, wording corrected by [FRE-354] `(j)`. Held until Sentry is gated/removed and `/privacy` + `/faq` land. Never widen to "The Nook", never "nothing but your Mac". | | Fan, thermal and charge control | **No claim verdict yet — do not lead with it** | Backed by `helper/` (privileged helper, SMC, no kext), but no CTO sentence exists for it. Documentary, not launch. | | One-time purchase, no subscription | **Publishable fact, price not a launch asset** | $10, held at $10. No dated rise, no discount framing, no pricing copy. | -| Agent coverage numbers ("eighteen agents", "18 agents") | **Publishable at 18** | [FRE-997]: the /agents table now lists every row of `AgentSpec.all` and `agents.test.ts` asserts equality with the 18-name registry in registry order, so the landing bullet, the marquee chip and the /agents copy say 18. No other number is publishable. | +| Agent coverage numbers ("eighteen agents", "18 agents") | **Publishable at 18** | [FRE-997]: the /agents table now lists every row of `AgentSpec.all` and `agents.test.ts` asserts equality with the 18-name registry in registry order, so the landing bullet, the marquee chip and the /agents copy say 18. No other number is publishable, and `every` / `all` are still banned without naming the three local-only agents. | | macOS 14.2 or later | **Publishable fact** | The app cannot start below 14.2 (`freno-dev` `881190d`, site `134f41e`). "macOS 14+" is false and was fixed on the site. | -| Remote agents over SSH, one click to install | **Held** | [FRE-315] §1, [FRE-320], [FRE-323]. Needs a verified one-click install plus a recording. | +| Remote agents over SSH, one click to install | **Publishable, with the three local-only agents named** | [FRE-997]: `RemoteHostDiscovery` (ssh config + tailnet), `RemoteMirror` (hook push, credential, mirroring), `RemoteMirrorReconcile`, `RemoteHostStatus.fixCommand` (the one-time `ssh-copy-id` the row shows). `AgentSpec.remote` is `.unsupported` for Muse, Cline and Amp — the landing bullet and /agents paragraph name them; never say "every hooked agent". | | "Nothing leaves your Mac", "no telemetry", "local-only", "no account" | **False today — banned** | Sentry unconditional, licence check with hardware fingerprint ([FRE-322] §2.4). | | Approvals from the iPhone or Apple Watch | **No verdict — not a launch claim** | The companion is a TestFlight beta ([FRE-354]); the approval-from-phone claim has no CTO verdict and stays out of launch copy. | diff --git a/src/components/nook/FeatureBreakdowns.tsx b/src/components/nook/FeatureBreakdowns.tsx index fa1d546..220cec2 100644 --- a/src/components/nook/FeatureBreakdowns.tsx +++ b/src/components/nook/FeatureBreakdowns.tsx @@ -1,5 +1,6 @@ import { For, + Show, createEffect, createSignal, onCleanup, @@ -20,6 +21,7 @@ import { Campfire, type CampfireState } from "./Campfire"; import { ApprovalCardMock, SessionRowMock, + Glyph, CLAUDE, CODEX } from "./ModuleMocks"; @@ -35,7 +37,7 @@ import { * Detailed feature breakdowns: alternating copy + live-demo sections. * Each demo stages the real interaction loop: attention flares, approval * resolves, fans throttle, the charge ceiling holds, meetings surface, - * the camera wakes. Newer demos live in + * the camera wakes, a remote host goes live. Newer demos live in * MoreDemos.tsx; app-anatomy pieces in ModuleMocks.tsx. */ @@ -805,6 +807,112 @@ function CameraDemo() { ); } +/* ── Demo 7: Settings ▸ Remote hosts — one click to Live ──────────── */ + +/** RemoteMirror's progress steps, in order. */ +const SETUP_STEPS = [ + "connecting", + "pushing the hook binary", + "configuring agents", + "checking the host can reach this Mac" +]; + +function RemoteHostDemo() { + /* -1 not set up · 0…3 setting up · 4 live */ + const [step, setStep] = createSignal(-1); + const [pressed, setPressed] = createSignal(false); + useDemoLoop(11000, [ + [0, () => (setStep(-1), setPressed(false))], + [1400, () => setPressed(true)], + [1700, () => (setPressed(false), setStep(0))], + [2700, () => setStep(1)], + [3700, () => setStep(2)], + [4700, () => setStep(3)], + [5800, () => setStep(4)] + ]); + const live = () => step() === 4; + const working = () => step() >= 0 && step() < 4; + const chip = () => + live() + ? { color: "rgb(48,209,88)", label: "Live" } + : working() + ? { color: "rgba(255,255,255,0.55)", label: "Setting up" } + : { color: "rgba(255,255,255,0.35)", label: "Not set up" }; + + return ( +
gpu-rig
+tailnet peer
++ {working() ? SETUP_STEPS[step()] : " "} +
+