diff --git a/tests/browser/agent-activity.spec.mjs b/tests/browser/agent-activity.spec.mjs index c2b67716..151683bd 100644 --- a/tests/browser/agent-activity.spec.mjs +++ b/tests/browser/agent-activity.spec.mjs @@ -1,7 +1,11 @@ import { test, expect } from "./fixture.mjs"; import { open } from "./timeline.mjs"; import { finalizeEvent, generateSecretKey, getPublicKey } from "nostr-tools"; -test.use({ productionBroker: true, developmentReact: true }); +test.use({ + productionBroker: true, + developmentReact: true, + historyCounts: { alpha: 1, beta: 1 }, +}); test("activity launcher consumes real encrypted telemetry, escapes raw text, selects agents, and releases on disable", async ({ page, diff --git a/tests/browser/appearance.spec.mjs b/tests/browser/appearance.spec.mjs index 6ae70955..8f34a73f 100644 --- a/tests/browser/appearance.spec.mjs +++ b/tests/browser/appearance.spec.mjs @@ -1,6 +1,7 @@ import { test, expect } from "./fixture.mjs"; import { open, anchor, expectAnchor } from "./timeline.mjs"; +test.use({ historyCounts: { alpha: 20, beta: 1 } }); const key = "buzz-appearance.v1"; const button = (page, name) => page.getByRole("button", { name, exact: true }); async function settings(page) { diff --git a/tests/browser/buzz-links.spec.mjs b/tests/browser/buzz-links.spec.mjs index 4a4bf88e..3bf3a02c 100644 --- a/tests/browser/buzz-links.spec.mjs +++ b/tests/browser/buzz-links.spec.mjs @@ -6,6 +6,7 @@ test.use({ readState: true, threadUnread: true, pluginFixtures: true, + historyCounts: { alpha: 640, beta: 1 }, }); const button = (page, name) => page.getByRole("button", { name, exact: true }); const state = (page) => diff --git a/tests/browser/channel-opening.spec.mjs b/tests/browser/channel-opening.spec.mjs index bd00e6c0..b967c569 100644 --- a/tests/browser/channel-opening.spec.mjs +++ b/tests/browser/channel-opening.spec.mjs @@ -2,7 +2,11 @@ import { readFile } from "node:fs/promises"; import { test, expect } from "./fixture.mjs"; import { open } from "./timeline.mjs"; -test.use({ productionBroker: true, largeSidebar: true }); +test.use({ + productionBroker: true, + largeSidebar: true, + historyCounts: { alpha: 20, beta: 20 }, +}); const heads = (app, channel) => app.report.queries.filter( ({ filter }) => diff --git a/tests/browser/completion-layout.spec.mjs b/tests/browser/completion-layout.spec.mjs index 7a727a12..cd70201d 100644 --- a/tests/browser/completion-layout.spec.mjs +++ b/tests/browser/completion-layout.spec.mjs @@ -1,5 +1,6 @@ import { test, expect } from "./fixture.mjs"; +test.use({ historyCounts: { alpha: 1, beta: 0 } }); test("completion menu stays reachable in the production channel layout", async ({ page, app, diff --git a/tests/browser/dm-labels.spec.mjs b/tests/browser/dm-labels.spec.mjs index 63e95b9b..c9f22485 100644 --- a/tests/browser/dm-labels.spec.mjs +++ b/tests/browser/dm-labels.spec.mjs @@ -1,7 +1,11 @@ import { test, expect } from "./fixture.mjs"; import { open } from "./timeline.mjs"; -test.use({ productionBroker: true, dmLabels: true }); +test.use({ + productionBroker: true, + dmLabels: true, + historyCounts: { alpha: 1, beta: 1 }, +}); for (const cold of [false, true]) { test(`DM names recover after ${cold ? "hidden channel deletion aborts a cold fetch" : "channel deletion purges loaded profiles"}`, async ({ diff --git a/tests/browser/external-links.spec.mjs b/tests/browser/external-links.spec.mjs index 8ff97b8c..a3e19e4c 100644 --- a/tests/browser/external-links.spec.mjs +++ b/tests/browser/external-links.spec.mjs @@ -1,5 +1,6 @@ import { test, expect } from "./fixture.mjs"; +test.use({ historyCounts: { alpha: 1, beta: 0 } }); const github = "https://github.com/block/buzz/pull/1"; const ordinary = "https://example.test/external-link"; const unsupported = "https://github.com/block/buzz/blob/main/README.md"; diff --git a/tests/browser/gifs.spec.mjs b/tests/browser/gifs.spec.mjs index 78adf652..45d6b49c 100644 --- a/tests/browser/gifs.spec.mjs +++ b/tests/browser/gifs.spec.mjs @@ -1,5 +1,6 @@ import { test, expect } from "./fixture.mjs"; +test.use({ historyCounts: { alpha: 1, beta: 0 } }); test("relay-backed GIF tab searches KLIPY and inserts URL-only media", async ({ page, app, diff --git a/tests/browser/history-loading.spec.mjs b/tests/browser/history-loading.spec.mjs index 3507345f..1f516506 100644 --- a/tests/browser/history-loading.spec.mjs +++ b/tests/browser/history-loading.spec.mjs @@ -1,7 +1,10 @@ import { test, expect } from "./fixture.mjs"; import { open, settle } from "./timeline.mjs"; -test.use({ productionBroker: true }); +test.use({ + productionBroker: true, + historyCounts: { alpha: 640, beta: 20 }, +}); const history = (page) => page.getByRole("region", { name: "Channel message history" }); diff --git a/tests/browser/layout.spec.mjs b/tests/browser/layout.spec.mjs index f99b6ad0..04a8a7c6 100644 --- a/tests/browser/layout.spec.mjs +++ b/tests/browser/layout.spec.mjs @@ -2,6 +2,7 @@ import { test, expect } from "./fixture.mjs"; import { settle, upper, expectAnchor } from "./timeline.mjs"; // Resize tests must not enter the fixture’s deliberately held paging path. +test.use({ historyCounts: { alpha: 640, beta: 80 } }); const readingTest = test.extend({ tallMessages: true }); async function expectNonPaging(page, app) { expect( diff --git a/tests/browser/live-status.spec.mjs b/tests/browser/live-status.spec.mjs index 76b43b8e..5ff60807 100644 --- a/tests/browser/live-status.spec.mjs +++ b/tests/browser/live-status.spec.mjs @@ -1,5 +1,8 @@ import { test, expect } from "./fixture.mjs"; -test.use({ productionBroker: true }); +test.use({ + productionBroker: true, + historyCounts: { alpha: 1, beta: 1 }, +}); test("clean pending setup stays in diagnostics and never flashes a warning during channel switches", async ({ page, app, diff --git a/tests/browser/live.spec.mjs b/tests/browser/live.spec.mjs index c879de78..984a80ac 100644 --- a/tests/browser/live.spec.mjs +++ b/tests/browser/live.spec.mjs @@ -1,7 +1,10 @@ import { test, expect } from "./fixture.mjs"; import { open, settle, upper, expectAnchor, end, anchor } from "./timeline.mjs"; -test.use({ productionBroker: true }); +test.use({ + productionBroker: true, + historyCounts: { alpha: 640, beta: 20 }, +}); const history = (page) => page.getByRole("region", { name: "Channel message history" }); const retry = (page) => diff --git a/tests/browser/membership.spec.mjs b/tests/browser/membership.spec.mjs index 01f5b909..7ad945e0 100644 --- a/tests/browser/membership.spec.mjs +++ b/tests/browser/membership.spec.mjs @@ -1,7 +1,11 @@ import { test, expect } from "./fixture.mjs"; import { anchor, expectAnchor, settle } from "./timeline.mjs"; -test.use({ membershipActivity: true, productionBroker: true }); +test.use({ + membershipActivity: true, + productionBroker: true, + historyCounts: { alpha: 640, beta: 1 }, +}); // Do not let the shared fixture's legacy WebKit exception mask timeline reflow // errors. These journeys must preserve the reader without observer-loop errors. diff --git a/tests/browser/navigation-groups.spec.mjs b/tests/browser/navigation-groups.spec.mjs index 7417b265..b72437a6 100644 --- a/tests/browser/navigation-groups.spec.mjs +++ b/tests/browser/navigation-groups.spec.mjs @@ -6,6 +6,7 @@ test.use({ savedSidebar: true, largeSidebar: true, developmentReact: true, + historyCounts: { alpha: 1, beta: 1 }, }); test("Home → Messages keeps saved groups and scroll on every visible frame without re-decoding", async ({ page, diff --git a/tests/browser/navigation-join.spec.mjs b/tests/browser/navigation-join.spec.mjs index 3daaade6..03a3844f 100644 --- a/tests/browser/navigation-join.spec.mjs +++ b/tests/browser/navigation-join.spec.mjs @@ -1,6 +1,7 @@ import { test, expect } from "./fixture.mjs"; import { open } from "./timeline.mjs"; +test.use({ historyCounts: { alpha: 640, beta: 1 } }); const button = (page, name) => page.getByRole("button", { name, exact: true }); const entry = (page) => page.evaluate(() => history.state.buzzNavigationV1.entry); diff --git a/tests/browser/navigation-repairs.spec.mjs b/tests/browser/navigation-repairs.spec.mjs index 08fd3218..032b4a40 100644 --- a/tests/browser/navigation-repairs.spec.mjs +++ b/tests/browser/navigation-repairs.spec.mjs @@ -1,6 +1,7 @@ import { test, expect } from "./fixture.mjs"; import { open } from "./timeline.mjs"; +test.use({ historyCounts: { alpha: 1, beta: 1 } }); // Regressions independently reproduced by Pinky against the first wiring handoff. const button = (page, name) => page.getByRole("button", { name, exact: true }); const entry = (page) => diff --git a/tests/browser/navigation-scroll-intent.spec.mjs b/tests/browser/navigation-scroll-intent.spec.mjs index 69abfab2..0041a79a 100644 --- a/tests/browser/navigation-scroll-intent.spec.mjs +++ b/tests/browser/navigation-scroll-intent.spec.mjs @@ -2,7 +2,12 @@ import { test, expect } from "./fixture.mjs"; import { open } from "./timeline.mjs"; const button = (page, name) => page.getByRole("button", { name, exact: true }); -test.use({ largeSidebar: true, productionBroker: true, readState: true }); +test.use({ + largeSidebar: true, + productionBroker: true, + readState: true, + historyCounts: { alpha: 1, beta: 1 }, +}); for (const action of [ "untouched", diff --git a/tests/browser/navigation-sidebar.spec.mjs b/tests/browser/navigation-sidebar.spec.mjs index 29dde65b..251a75f5 100644 --- a/tests/browser/navigation-sidebar.spec.mjs +++ b/tests/browser/navigation-sidebar.spec.mjs @@ -1,7 +1,10 @@ import { test, expect } from "./fixture.mjs"; import { open } from "./timeline.mjs"; const button = (page, name) => page.getByRole("button", { name, exact: true }); -test.use({ largeSidebar: true }); +test.use({ + largeSidebar: true, + historyCounts: { alpha: 1, beta: 1 }, +}); test("channel navigation preserves sidebar search, DOM, group state and scroll", async ({ page, diff --git a/tests/browser/navigation-thread-history.spec.mjs b/tests/browser/navigation-thread-history.spec.mjs index 5b2da3ec..48bbc373 100644 --- a/tests/browser/navigation-thread-history.spec.mjs +++ b/tests/browser/navigation-thread-history.spec.mjs @@ -1,7 +1,12 @@ import { test, expect } from "./fixture.mjs"; import { open } from "./timeline.mjs"; -test.use({ productionBroker: true, readState: true, threadUnread: true }); +test.use({ + productionBroker: true, + readState: true, + threadUnread: true, + historyCounts: { alpha: 20, beta: 20 }, +}); test("Back restores each thread visit before the previous channel", async ({ page, diff --git a/tests/browser/plugin-import.spec.mjs b/tests/browser/plugin-import.spec.mjs index 70aed2b5..7a433260 100644 --- a/tests/browser/plugin-import.spec.mjs +++ b/tests/browser/plugin-import.spec.mjs @@ -1,6 +1,7 @@ import { readFile } from "node:fs/promises"; import { test, expect } from "./fixture.mjs"; +test.use({ historyCounts: { alpha: 0, beta: 0 } }); const button = (page, name) => page.getByRole("button", { name, exact: true }); async function openPlugins(page, origin) { await page.goto(origin); diff --git a/tests/browser/profiles-appearance.spec.mjs b/tests/browser/profiles-appearance.spec.mjs index 5deeae55..a700794a 100644 --- a/tests/browser/profiles-appearance.spec.mjs +++ b/tests/browser/profiles-appearance.spec.mjs @@ -1,6 +1,7 @@ import { test, expect } from "./fixture.mjs"; import { open } from "./timeline.mjs"; +test.use({ historyCounts: { alpha: 20, beta: 0 } }); for (const mode of ["light", "dark"]) { test(`Profiles uses shared styles and host keyboard focus in ${mode} mode`, async ({ page, diff --git a/tests/browser/scroll.spec.mjs b/tests/browser/scroll.spec.mjs index 3cd8148e..6a77c0c4 100644 --- a/tests/browser/scroll.spec.mjs +++ b/tests/browser/scroll.spec.mjs @@ -11,6 +11,7 @@ import { edge, } from "./timeline.mjs"; +test.use({ historyCounts: { alpha: 640, beta: 80 } }); // Keep non-paging reading gestures outside the unchanged near-top read zone, // even with a 20-row head. The cursor journey below keeps ordinary-height rows. const readingTest = test.extend({ tallMessages: true }); diff --git a/tests/browser/sidebar-unread.spec.mjs b/tests/browser/sidebar-unread.spec.mjs index e53cc60f..14bc0f2b 100644 --- a/tests/browser/sidebar-unread.spec.mjs +++ b/tests/browser/sidebar-unread.spec.mjs @@ -6,6 +6,7 @@ test.use({ readState: true, largeSidebar: true, sidebarUnread: true, + historyCounts: { alpha: 20, beta: 20 }, }); const sidebar = (page) => page.getByRole("complementary", { name: "Channel sidebar", exact: true }); diff --git a/tests/browser/terminal.spec.mjs b/tests/browser/terminal.spec.mjs index b8913a15..f92aa29c 100644 --- a/tests/browser/terminal.spec.mjs +++ b/tests/browser/terminal.spec.mjs @@ -1,6 +1,7 @@ import { test, expect } from "./fixture.mjs"; import { open } from "./timeline.mjs"; const button = (page, name) => page.getByRole("button", { name, exact: true }); +test.use({ historyCounts: { alpha: 1, beta: 0 } }); test("web hides the unusable terminal and does not consume its shortcut, including re-enable", async ({ page, app, diff --git a/tests/browser/thread-unread.spec.mjs b/tests/browser/thread-unread.spec.mjs index d38e5e1f..5841d75e 100644 --- a/tests/browser/thread-unread.spec.mjs +++ b/tests/browser/thread-unread.spec.mjs @@ -1,7 +1,12 @@ import { test, expect } from "./fixture.mjs"; import { open } from "./timeline.mjs"; -test.use({ productionBroker: true, readState: true, threadUnread: true }); +test.use({ + productionBroker: true, + readState: true, + threadUnread: true, + historyCounts: { alpha: 20, beta: 1 }, +}); test("thread buttons show observed unread independently, clear only after reading, and expose hover/focus affordance", async ({ page, app, diff --git a/tests/browser/timeline-setup.spec.mjs b/tests/browser/timeline-setup.spec.mjs index 520a45c9..aa08008a 100644 --- a/tests/browser/timeline-setup.spec.mjs +++ b/tests/browser/timeline-setup.spec.mjs @@ -2,7 +2,10 @@ import { test, expect } from "./fixture.mjs"; import { open, upper, anchor, expectAnchor } from "./timeline.mjs"; // Reading setup must not accidentally exercise older-page loading. -test.use({ tallMessages: true }); +test.use({ + tallMessages: true, + historyCounts: { alpha: 640, beta: 1 }, +}); const history = (page) => page.getByRole("region", { name: "Channel message history" }); diff --git a/tests/browser/typing.spec.mjs b/tests/browser/typing.spec.mjs index 8b2b2a30..cbaf491b 100644 --- a/tests/browser/typing.spec.mjs +++ b/tests/browser/typing.spec.mjs @@ -1,7 +1,12 @@ import { test, expect } from "./fixture.mjs"; import { open, end } from "./timeline.mjs"; -test.use({ productionBroker: true, readState: true, threadUnread: true }); +test.use({ + productionBroker: true, + readState: true, + threadUnread: true, + historyCounts: { alpha: 20, beta: 1 }, +}); test("Messages receives scoped typing through authenticated live traffic and expires it without publishing", async ({ page, app, diff --git a/tests/browser/unread.spec.mjs b/tests/browser/unread.spec.mjs index 5336c90a..d87f3149 100644 --- a/tests/browser/unread.spec.mjs +++ b/tests/browser/unread.spec.mjs @@ -1,7 +1,11 @@ import { test, expect } from "./fixture.mjs"; import { open, settle } from "./timeline.mjs"; -test.use({ productionBroker: true, readState: true }); +test.use({ + productionBroker: true, + readState: true, + historyCounts: { alpha: 640, beta: 20 }, +}); const history = (page) => page.getByRole("region", { name: "Channel message history" }); const alpha = (page) => page.getByRole("button", { name: /^Alpha/ });