mirror of
https://github.com/block/buzz.git
synced 2026-08-18 06:50:31 +02:00
## Summary - persist each relay/identity's complete channel list and server hash as one integrity-checked snapshot - paint the snapshot immediately on cold boot, then revalidate with `knownHash` - fail slow-never-wrong: malformed/legacy/partial snapshots and mismatched not-modified responses force an unhashed full fetch - add sidebar boot diagnostics and deterministic unit/E2E coverage for boot, identity/relay isolation, partial writes, mismatch fallback, and community switches ## Safety invariants - channel list and hash are serialized in one localStorage document and replaced together - snapshot ownership is scoped to normalized relay URL plus identity pubkey - a not-modified response is accepted only when its hash exactly matches the hash describing the available list - any missing or impossible hash/list pairing retries `getChannels(null)` before replacing persistence ## Validation At exact commit `19ca25d23c434cc0b8893a93691aaf4c77794f60` with a clean working tree: - `cd desktop && pnpm check && pnpm typecheck` — passed (existing informational Biome findings only) - `cd desktop && pnpm test` — 4,723 passed - `cd desktop && node --import ./test-loader.mjs --experimental-strip-types --test src/features/channels/channelSnapshot.test.mjs` — 13 passed - `cd desktop && pnpm exec playwright test e2e/sidebar-snapshot.spec.ts --grep "cold boot paints" --repeat-each=5` — 5 passed - `cd desktop && pnpm exec playwright test e2e/sidebar-snapshot.spec.ts` — 8 passed - push hooks repeated desktop check/typecheck and all 4,723 unit tests successfully The Playwright suite uses injected bridge delays. Its roughly 0.5–0.6 s snapshot paint and 3.0 s snapshot-to-live readings are synthetic invariant evidence, not production desktop performance measurements. ## Measurement context The controlled current-main investigation is documented separately in `RESEARCH/DESKTOP_PERF_DEEP_DIVE_2026_08_12.md`; its raw local artifacts are `.scratch/summer-perf-deepdive-results-v2.json`, `.scratch/summer-perf-deepdive-run.log`, `.scratch/summer-perf-deepdive-run-2.log`, and `.scratch/summer-perf-deepdive-build-2.log`. Those original timings are also synthetic Chromium/mock-bridge measurements and are not presented as shipped Tauri/WKWebView or production-relay numbers. ## Latest review delta At exact tip `e8e2b1d617aac7ea008258ad9974bbf8da9cd2eb`, storage-denial reads fail open to the live fetch, hashless retries reject `channels: null` before pair/persistence updates, identity-read failure enables a hashless live fetch, and repeated consumers reuse snapshot parsing/integrity validation by storage key + raw document. The four remaining review nits are deferred as non-blocking follow-ups. Validation at this tip: sidebar snapshot E2E 30/30 serial; desktop unit suite 4,725/4,725; full push gate green (desktop check/typecheck/unit, Rust, Tauri). --------- Signed-off-by: Summer <1fdd3cc104e2911eb3b2da6f97d1b25f4a7f3550ded4492b24ff1d95acd66766@buzz.block.builderlab.xyz> Co-authored-by: Summer <1fdd3cc104e2911eb3b2da6f97d1b25f4a7f3550ded4492b24ff1d95acd66766@buzz.block.builderlab.xyz>
187 lines
6.7 KiB
TypeScript
187 lines
6.7 KiB
TypeScript
import { defineConfig, devices } from "@playwright/test";
|
|
|
|
export default defineConfig({
|
|
testDir: "./tests/e2e",
|
|
timeout: 30_000,
|
|
retries: process.env.CI ? 2 : 0,
|
|
workers: 1,
|
|
reporter: [
|
|
["list"],
|
|
["html", { open: "never", outputFolder: "playwright-report" }],
|
|
],
|
|
use: {
|
|
baseURL: "http://127.0.0.1:4173",
|
|
screenshot: "only-on-failure",
|
|
trace: "on-first-retry",
|
|
video: "retain-on-failure",
|
|
},
|
|
projects: [
|
|
{
|
|
name: "smoke",
|
|
testMatch: [
|
|
"**/smoke.spec.ts",
|
|
"**/search-scope-screenshots.spec.ts",
|
|
"**/onboarding-docked-cta-screenshots.spec.ts",
|
|
"**/identity-key-help.spec.ts",
|
|
"**/key-import-reveal.spec.ts",
|
|
"**/navigation.spec.ts",
|
|
"**/channels.spec.ts",
|
|
"**/channel-shared-header-backdrop.spec.ts",
|
|
"**/channel-composer-overflow.spec.ts",
|
|
"**/badge.spec.ts",
|
|
"**/channel-browser.spec.ts",
|
|
"**/channel-add-screenshots.spec.ts",
|
|
"**/add-community-screenshots.spec.ts",
|
|
"**/hosted-communities-settings-screenshots.spec.ts",
|
|
"**/invites-settings-screenshots.spec.ts",
|
|
"**/messaging.spec.ts",
|
|
"**/message-feedback-snapshots.spec.ts",
|
|
"**/custom-emoji.spec.ts",
|
|
"**/profile-custom-emoji-status.spec.ts",
|
|
"**/custom-emoji-ui.spec.ts",
|
|
"**/channel-mute.spec.ts",
|
|
"**/channel-star.spec.ts",
|
|
"**/channel-controls.spec.ts",
|
|
"**/channel-activity-popover.spec.ts",
|
|
"**/active-turn-resilience.spec.ts",
|
|
"**/profile-active-turn.spec.ts",
|
|
"**/config-bridge-screenshots.spec.ts",
|
|
"**/observer-feed-screenshots.spec.ts",
|
|
"**/core-memory-screenshots.spec.ts",
|
|
"**/activity-scope-label-screenshots.spec.ts",
|
|
"**/welcome-agent-modal-screenshots.spec.ts",
|
|
"**/local-archive-screenshots.spec.ts",
|
|
"**/voice-settings.spec.ts",
|
|
"**/agent-readiness-screenshots.spec.ts",
|
|
"**/agent-error-state-screenshots.spec.ts",
|
|
"**/edit-agent.spec.ts",
|
|
"**/doctor-cta-screenshots.spec.ts",
|
|
"**/pubkey-display-screenshots.spec.ts",
|
|
"**/file-attachment.spec.ts",
|
|
"**/image-attachment-gallery.spec.ts",
|
|
"**/composer-image-draw.spec.ts",
|
|
"**/video-attachment.spec.ts",
|
|
"**/spoiler.spec.ts",
|
|
"**/composer-link-shortcut.spec.ts",
|
|
"**/entity-link-recipient-cards.spec.ts",
|
|
"**/composer-selection-formatting.spec.ts",
|
|
"**/composer-tooltip-dismiss.spec.ts",
|
|
"**/mentions.spec.ts",
|
|
"**/team-mentions.spec.ts",
|
|
"**/persistent-agent-audience.spec.ts",
|
|
"**/relay-reconnect.spec.ts",
|
|
"**/relay-reconnect-affordance.spec.ts",
|
|
"**/workflows.spec.ts",
|
|
"**/identity-archive.spec.ts",
|
|
"**/identity-archive-hide.spec.ts",
|
|
"**/relay-connectivity.spec.ts",
|
|
"**/unread-pill.spec.ts",
|
|
"**/sidebar-more-unread-overlap.spec.ts",
|
|
"**/sidebar-snapshot.spec.ts",
|
|
"**/home-collapsed-top-chrome.spec.ts",
|
|
"**/top-chrome-zoom-clearance.spec.ts",
|
|
"**/thread-unread.spec.ts",
|
|
"**/workspace-rail.spec.ts",
|
|
"**/community-rail.spec.ts",
|
|
"**/boot-splash.spec.ts",
|
|
"**/thread-reply-anchor-roleplay.spec.ts",
|
|
"**/threadpane-ultrawide.spec.ts",
|
|
"**/thread-focus-mode.spec.ts",
|
|
"**/animated-avatar.spec.ts",
|
|
"**/reminders.spec.ts",
|
|
"**/reminder-click-repro.spec.ts",
|
|
"**/virtualization.spec.ts",
|
|
"**/scroll-history.spec.ts",
|
|
"**/channel-dense-second-reach.spec.ts",
|
|
"**/channel-window-mock-paging.spec.ts",
|
|
"**/live-broadcast-reply-timeline.spec.ts",
|
|
"**/markdown-parse-cache.spec.ts",
|
|
"**/overscroll-boundary.spec.ts",
|
|
"**/terminal-wheel.spec.ts",
|
|
"**/cold-switch-longtask.perf.ts",
|
|
"**/timeline-no-shift.spec.ts",
|
|
"**/human-edit-agent-content.spec.ts",
|
|
"**/empty-edit-delete.spec.ts",
|
|
"**/reaction-order.spec.ts",
|
|
"**/reaction-names.spec.ts",
|
|
"**/inbox-reactions.spec.ts",
|
|
"**/inbox-edit.spec.ts",
|
|
"**/send-channel-binding.spec.ts",
|
|
"**/project-commit-detail.spec.ts",
|
|
"**/project-inbox.spec.ts",
|
|
"**/project-issue-comments.spec.ts",
|
|
"**/project-pr-review.spec.ts",
|
|
"**/persona-model-combobox-screenshots.spec.ts",
|
|
"**/drafts-screenshots.spec.ts",
|
|
"**/drafts-all-fix-screenshots.spec.ts",
|
|
"**/inbox-refactor-screenshots.spec.ts",
|
|
"**/buzz-theme-screenshots.spec.ts",
|
|
"**/channel-sort.spec.ts",
|
|
"**/identity-lost.spec.ts",
|
|
"**/deep-link-invite.spec.ts",
|
|
"**/invite-link-copy.spec.ts",
|
|
"**/global-agent-config-screenshots.spec.ts",
|
|
"**/doctor-states.spec.ts",
|
|
"**/onboarding-avatar-skip.spec.ts",
|
|
"**/onboarding-backup.spec.ts",
|
|
"**/onboarding-agent-defaults.spec.ts",
|
|
"**/nostr-bind.spec.ts",
|
|
"**/mobile-pairing-qr.spec.ts",
|
|
"**/profile-nsec-reveal.spec.ts",
|
|
"**/profile-backup-settings.spec.ts",
|
|
"**/signout-confirmation.spec.ts",
|
|
"**/agent-provider-dropdowns.spec.ts",
|
|
"**/agent-lifecycle-feedback.spec.ts",
|
|
"**/agent-access-warning.spec.ts",
|
|
"**/edit-agent-run-on.spec.ts",
|
|
"**/inbox-live-update.spec.ts",
|
|
"**/mesh-compute.spec.ts",
|
|
"**/observer-archive-policy.spec.ts",
|
|
"**/harness-management.spec.ts",
|
|
"**/harness-catalog-screenshots.spec.ts",
|
|
"**/inline-custom-harness.spec.ts",
|
|
"**/where-to-run-config.spec.ts",
|
|
"**/huddle-transcription.spec.ts",
|
|
"**/agent-numeric-tuning.spec.ts",
|
|
"**/needs-restart-screenshots.spec.ts",
|
|
],
|
|
use: {
|
|
...devices["Desktop Chrome"],
|
|
},
|
|
},
|
|
{
|
|
name: "integration",
|
|
testMatch: [
|
|
"**/agents.spec.ts",
|
|
"**/agent-snapshot-recipient.spec.ts",
|
|
"**/onboarding.spec.ts",
|
|
"**/stream.spec.ts",
|
|
"**/integration.spec.ts",
|
|
"**/dm-double-notification.spec.ts",
|
|
"**/profile.spec.ts",
|
|
"**/sidebar.spec.ts",
|
|
"**/sidebar-relay-card.spec.ts",
|
|
"**/tokens.spec.ts",
|
|
"**/persona-env-vars.spec.ts",
|
|
"**/persona-sync.spec.ts",
|
|
"**/team-snapshot.spec.ts",
|
|
"**/agents-everywhere.live.spec.ts",
|
|
"**/relay-restart.live.spec.ts",
|
|
"**/parity-ancestor-island.spec.ts",
|
|
],
|
|
use: {
|
|
...devices["Desktop Chrome"],
|
|
},
|
|
expect: {
|
|
timeout: process.env.CI ? 15_000 : 10_000,
|
|
},
|
|
},
|
|
],
|
|
webServer: {
|
|
command: "python3 -m http.server 4173 -d dist",
|
|
cwd: ".",
|
|
reuseExistingServer: !process.env.CI,
|
|
url: "http://127.0.0.1:4173",
|
|
},
|
|
});
|