Production builds GitHub `mikefreno/freno-dev`; agents merge into Gitea `Mike/freno-dev`. Around merge-basedd368d2the 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 sincedd368d2was 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).
126 lines
5.1 KiB
TypeScript
126 lines
5.1 KiB
TypeScript
/**
|
|
* Two page contracts live in this file, and they are reconciled on purpose.
|
|
*
|
|
* 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 (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 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`).
|
|
*/
|
|
import { describe, it, expect } from "bun:test";
|
|
import { readFileSync } from "node:fs";
|
|
import { join } from "node:path";
|
|
|
|
const ROOT = join(import.meta.dir, "../../..");
|
|
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"
|
|
];
|
|
|
|
/** 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 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} 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("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/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).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");
|
|
});
|
|
});
|