FRE-1695: reconcile the GitHub deploy line into Gitea master

Production builds GitHub `mikefreno/freno-dev`; agents merge into Gitea
`Mike/freno-dev`. Around merge-base dd368d2 the two masters diverged: Gitea
was 12 commits ahead (FRE-371, FRE-366, FRE-202, FRE-997, FRE-1670), GitHub
2 ahead (NOOK-1037 landing refresh, NOOK-1038 scoped-remote restore). Every
Gitea merge since dd368d2 was therefore undeployed.

This merge brings the GitHub line into Gitea so the two become one line,
with the Gitea master as the fast-forward ancestor of GitHub master. No
content is dropped from either side.

Conflicts and how they were resolved (only two, both copy contracts):

- `src/components/nook/FeatureBreakdowns.tsx`: took NOOK-1038's refreshed
  island bullets and kept FRE-997's "18 agents" bullet, because the roster
  on /agents lists all eighteen (agents.test.ts asserts equality).
- `src/routes/nook/remote-claims.test.ts`: rewrote as one file that holds
  both contracts — NOOK-1038 supersedes FRE-323's blanket remote hold
  (scoped one-click setup for Tailscale and authorized known hosts is a
  supported claim; blanket promises stay banned), and FRE-997's coverage
  correction stands (18 is publishable, stale thirteens stay banned). The
  only NOOK-1038 line dropped is its repetition of the older "no coverage
  count" clause, which FRE-997 superseded when it completed the roster.
  `marketing/positioning.md` already records both rows side by side.

Tests: bun test src/routes/nook -> 38 pass, 0 fail. Full suite matches the
pre-merge baseline failure set (see docs/deploy-source.md).
This commit is contained in:
2026-11-09 20:42:33 +00:00
committed by CTO
14 changed files with 1087 additions and 675 deletions

View File

@@ -1,49 +1,32 @@
/**
* Regression test for the removed remote / SSH claims and the removed agent
* count (FRE-323, FRE-359 verdict B).
* Two page contracts live in this file, and they are reconciled on purpose.
*
* FRE-323 took the remote story off the site because it was unverified and
* demo-gated (FRE-315, FRE-320, FRE-322 §3 correction 4): the "one click
* installs the nook-hook" 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-359 verdict B removed the coverage count for the same
* reason: the /agents table lists 13 of the registry's 18 rows.
* NOOK-1038 (2026-11-09, Mike's correction) supersedes FRE-323's blanket remote
* hold: one-click setup is a supported scoped claim for Tailscale peers and
* authorized known hosts, so the Remote cards and the setup demo belong on the
* page. Blanket authorization promises stay out.
*
* FRE-997 corrects the second half without touching the first. The count was
* stale, not unverifiable: `AgentSpec.all` holds eighteen, /agents now lists
* all eighteen and `agents.test.ts` asserts that roster as an equality again.
* So the two completeness phrasings FRE-359 banned ("every coding agent",
* "Supported agents") no longer rest on a 13-of-18 gap — the ban existed
* because the page claimed the set and listed two thirds of it. They are out
* of `BANNED_COVERAGE` on this branch for that reason alone; the stale counts
* stay banned, and every FRE-323 remote sentence stays banned, because this
* branch still carries the FRE-323 site state.
* FRE-997 (2026-11-04) restored the agent count. The page listed thirteen of the
* registry's eighteen rows, so FRE-359 verdict B dropped the count instead of
* correcting it; FRE-997 put all eighteen rows on /agents and made the roster an
* equality check again (`agents.test.ts`), so the count is publishable at 18 and
* the stale counts stay banned.
*
* The copy was not thrown away — it is parked in
* `marketing/drafts/remote-ssh/` with the restore gate, and this test asserts
* it is still there so nobody deletes the parked story as stale. It goes back
* on the site only when the one-click install ships and is recorded.
* The two lines met in the FRE-1695 reconciliation (Gitea was 12 commits ahead,
* GitHub 2). NOOK-1038's file repeated FRE-359's older "no coverage count"
* clause; that clause is superseded by FRE-997's landed correction and is the
* one line dropped here. Everything else from NOOK-1038 is taken verbatim, and
* `marketing/positioning.md` records both decisions side by side (coverage row:
* publishable at 18; remote row: approved, scoped). See `docs/deploy-source.md`.
*
* STATIC SOURCE AUDIT, the same pattern as `agents.test.ts` and
* `downloads.test.ts` (SolidJS does not render under `bun:test`).
*
* Deliberate exceptions, not audited here — both were weighed with the Chief
* of Staff at the go/no-go and left in place on purpose:
* - `src/routes/nook/agents.tsx` Muse row: "This Mac only — remote hosts skip
* it" is a limitation disclosure, not a capability claim.
* - `src/components/nook/IslandExtras.tsx` "Tailscale hosts" chip: adjacent to
* the removed remote story, but tailnet host lookup does exist. Raised on
* FRE-323 rather than widened into this correction.
*/
import { describe, it, expect } from "bun:test";
import { readFileSync } from "node:fs";
import { join } from "node:path";
const ROOT = join(import.meta.dir, "../../..");
/** Shipped page and component source. Tests and drafts may quote the old copy. */
const AUDITED = [
"src/routes/nook/index.tsx",
"src/routes/nook/agents.tsx",
@@ -53,29 +36,6 @@ const AUDITED = [
"src/components/nook/IslandExtras.tsx"
];
/** Every sentence FRE-323 ordered off the site. */
const BANNED_REMOTE_CLAIMS = [
"Agents on other machines",
"one click installs the nook-hook",
"Any SSH box",
"Works across every hooked agent, local or remote",
"Remote sessions are ordinary rows",
"One-click SSH setup",
"remote machines over SSH",
"this Mac or remote machines"
];
/** FRE-359 verdict B: no stale count, in any form.
*
* "every coding agent" and "Supported agents" left this list with FRE-997:
* the page now lists all eighteen registry rows and `agents.test.ts` asserts
* that equality, so the completeness claim is backed rather than incomplete. */
const BANNED_COVERAGE = [
"all thirteen",
"thirteen coding agents",
"13 agents"
];
/** User-facing copy only: comments are not copy and may name the old wording. */
function copyOf(file: string): string {
return readFileSync(join(ROOT, file), "utf8")
@@ -83,44 +43,83 @@ function copyOf(file: string): string {
.replace(/^\s*\/\/.*$/gm, "");
}
describe("remote claims stay off the site (FRE-323)", () => {
describe("remote marketing reflects the supported setup (NOOK-1038)", () => {
it("fills the collage's missing sixth grid slot with host-labelled remote sessions", () => {
const collage = copyOf("src/components/nook/FeatureCollage.tsx");
// The hero spans two columns; four regular cards fill the other slots.
expect(collage.match(/<CollageCell\b/g)).toHaveLength(4);
expect(collage).toContain('kicker="Remote"');
expect(collage).toContain("One-click setup for Tailscale and authorized known hosts");
expect(collage).toContain('host="build-box"');
expect(collage).toContain('host="gpu-rig"');
});
it("restores the detailed setup section with both discovery sources", () => {
const breakdowns = copyOf("src/components/nook/FeatureBreakdowns.tsx");
expect(breakdowns).toContain('kicker="Remote"');
expect(breakdowns).toContain('title="Set up remote agents in one click"');
expect(breakdowns).toContain("Tailscale peer or an authorized host from your SSH config");
expect(breakdowns).toContain("<RemoteHostDemo />");
});
it("demonstrates setup progressing to Live and a host-labelled session", () => {
const demos = copyOf("src/components/nook/MoreDemos.tsx");
for (const label of [
"connecting",
"pushing the hook binary",
"configuring agents",
"checking the host can reach this Mac",
"Live",
"Set up"
])
expect(demos).toContain(label);
expect(demos).toContain('host="gpu-rig"');
});
for (const file of AUDITED) {
it(`${file} does not restore a removed remote sentence`, () => {
const copy = copyOf(file);
for (const phrase of BANNED_REMOTE_CLAIMS) {
expect(copy.toLowerCase()).not.toContain(phrase.toLowerCase());
}
it(`${file} makes no blanket authorization promise`, () => {
const copy = copyOf(file).toLowerCase();
for (const phrase of [
"Any SSH box",
"Works across every hooked agent, local or remote",
"no SSH authorization needed"
])
expect(copy).not.toContain(phrase.toLowerCase());
});
}
it("/agents no longer offers remote sessions", () => {
const copy = copyOf("src/routes/nook/agents.tsx");
expect(copy).not.toContain("remote sessions report into the same grid");
expect(copy).not.toContain("on this Mac or on remote");
});
it("the parked copy still exists, so restoring the story is a revert and not a rewrite", () => {
const parked = readFileSync(join(ROOT, "marketing/drafts/remote-ssh/copy.md"), "utf8");
for (const phrase of ["Agents on other machines", "Any SSH box, one click away"]) {
expect(parked).toContain(phrase);
it("records the current decision without deleting the historical copy", () => {
for (const file of [
"marketing/drafts/remote-ssh/copy.md",
"marketing/drafts/remote-ssh/rationale.md",
"marketing/positioning.md"
]) {
const text = readFileSync(join(ROOT, file), "utf8");
expect(text).toContain("NOOK-1038");
expect(text).toContain("Tailscale and authorized known hosts");
}
expect(readFileSync(join(ROOT, "marketing/drafts/remote-ssh/rationale.md"), "utf8")).toContain(
"FRE-320"
);
expect(
readFileSync(join(ROOT, "marketing/drafts/remote-ssh/copy.md"), "utf8")
).toContain("Any SSH box, one click away");
});
});
describe("the agent count is corrected, not dropped (FRE-997)", () => {
/** FRE-359 verdict B, minus the phrasings FRE-997 re-grounded in the full roster. */
const BANNED_COVERAGE = ["all thirteen", "thirteen coding agents", "13 agents"];
for (const file of AUDITED) {
it(`${file} states no stale count`, () => {
const copy = copyOf(file);
for (const phrase of BANNED_COVERAGE) {
expect(copy.toLowerCase()).not.toContain(phrase.toLowerCase());
}
const copy = copyOf(file).toLowerCase();
for (const phrase of BANNED_COVERAGE) expect(copy).not.toContain(phrase);
});
}
it("/agents states the registry's size", () => {
expect(copyOf("src/routes/nook/agents.tsx")).toContain("Supported agents");
});
it("the landing copy states the count the roster actually has", () => {
expect(copyOf("src/components/nook/FeatureBreakdowns.tsx")).toContain("18 agents");
});
});