diff --git a/tests/browser/agent-activity.spec.mjs b/tests/browser/agent-activity.spec.mjs index 5ae2635..17dc83b 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 }, +}); const channelActivity = (page) => page.getByRole("region", { @@ -374,7 +378,11 @@ test("profile activity opens the exact agent and originating channel before its }); test.describe("thread activity", () => { - test.use({ threadUnread: true, readState: true }); + test.use({ + threadUnread: true, + readState: true, + historyCounts: { alpha: 2, beta: 1 }, // Thread fixtures replace the last two Alpha rows with roots. + }); test("thread typing uses the existing route, stays isolated, and opens channel details above the composer", async ({ page, diff --git a/tests/browser/appearance.spec.mjs b/tests/browser/appearance.spec.mjs index 6ae7095..8f34a73 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 4a4bf88..3bf3a02 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 bd00e6c..b967c56 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 7a727a1..cd70201 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 63e95b9..c9f2248 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 9e8dcbc..31dd8e6 100644 --- a/tests/browser/external-links.spec.mjs +++ b/tests/browser/external-links.spec.mjs @@ -1,6 +1,7 @@ import { test, expect } from "./fixture.mjs"; import { end } from "./timeline.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 fabf4e6..71d285c 100644 --- a/tests/browser/gifs.spec.mjs +++ b/tests/browser/gifs.spec.mjs @@ -1,6 +1,7 @@ import { expectPhosphor } from "./phosphor.mjs"; 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 3507345..1f51650 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 f99b6ad..04a8a7c 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 76b43b8..5ff6080 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 c879de7..984a80a 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 f973953..fd68c52 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 72e8266..0b4c28a 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, selected channel, 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 3daaade..03a3844 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 08fd321..032b4a4 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 69abfab..0041a79 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 29dde65..251a75f 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 1f5dc87..2137c67 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 70aed2b..7a43326 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 5deeae5..a700794 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 bc501e5..d92c9b1 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 c5b6a24..e5fa9ff 100644 --- a/tests/browser/sidebar-unread.spec.mjs +++ b/tests/browser/sidebar-unread.spec.mjs @@ -11,6 +11,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 b8913a1..f92aa29 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 384163d..760b9fc 100644 --- a/tests/browser/thread-unread.spec.mjs +++ b/tests/browser/thread-unread.spec.mjs @@ -5,6 +5,7 @@ test.use({ productionBroker: true, readState: true, threadUnread: true, + historyCounts: { alpha: 20, beta: 1 }, largeSidebar: true, pluginFixtures: true, // Observe the real navigation completion, not reply mount timing. }); diff --git a/tests/browser/timeline-setup.spec.mjs b/tests/browser/timeline-setup.spec.mjs index 520a45c..aa08008 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 8b2b2a3..cbaf491 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 5336c90..d87f314 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/ });