FRE-359 verdict B dropped the agent count instead of correcting it: the page
said thirteen while `AgentSpec.all` held eighteen, and the /agents table listed
13 of those rows. The count is a fact, not a claim, so this states it and makes
the table match the registry again.
- Landing island bullet and the marquee chip say 18 agents.
- /agents: title/description/ogTitle/H1 at eighteen, and the five missing rows
are on the page — Kimi, GitHub Copilot CLI, Crush, Cursor, Amp — with events
and gating taken from hook/setup.go, hook/normalize.go,
hook/normalize_hosts.go, Sources/NookCore/Agents/HookConfigInstaller.swift
and plugins/amp/index.ts. All five are Observe (kimi/copilot PreToolUse and
PermissionRequest fire before the host's own check; Crush documents one
event; a silent Cursor permission hook blocks; Amp's plugin API has no
permission-wait event).
- agents.test.ts asserts the roster as an equality with the 18-name registry
in registry order again, plus the count, instead of a subset check.
- remote-claims.test.ts keeps every FRE-323 remote removal guard and the parked
copy, and drops only the two completeness bans the corrected count
contradicts ("every coding agent", "Supported agents") — the ban existed
because the page claimed the set and listed 13 of 18.
- positioning.md: the coverage row is publishable at 18.
This is the count/roster half of FRE-997 only. The remote-SSH restore is held
by the Chief of Staff against FRE-346 §3 and is not in this commit: no remote
tile, breakdown, demo, chip, /agents remote paragraph or drafts deletion here.
Gate: `bun test src/routes/nook` 18 pass / 0 fail; `bun run build` succeeds.
127 lines
5.2 KiB
TypeScript
127 lines
5.2 KiB
TypeScript
/**
|
|
* Regression test for the removed remote / SSH claims and the removed agent
|
|
* count (FRE-323, FRE-359 verdict B).
|
|
*
|
|
* 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.
|
|
*
|
|
* 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.
|
|
*
|
|
* 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.
|
|
*
|
|
* 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",
|
|
"src/routes/nook/faq.tsx",
|
|
"src/components/nook/FeatureCollage.tsx",
|
|
"src/components/nook/FeatureBreakdowns.tsx",
|
|
"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")
|
|
.replace(/\/\*[\s\S]*?\*\//g, "")
|
|
.replace(/^\s*\/\/.*$/gm, "");
|
|
}
|
|
|
|
describe("remote claims stay off the site (FRE-323)", () => {
|
|
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("/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);
|
|
}
|
|
expect(readFileSync(join(ROOT, "marketing/drafts/remote-ssh/rationale.md"), "utf8")).toContain(
|
|
"FRE-320"
|
|
);
|
|
});
|
|
});
|
|
|
|
describe("the agent count is corrected, not dropped (FRE-997)", () => {
|
|
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());
|
|
}
|
|
});
|
|
}
|
|
|
|
it("/agents states the registry's size", () => {
|
|
expect(copyOf("src/routes/nook/agents.tsx")).toContain("Supported agents");
|
|
});
|
|
});
|