Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
147 commits
Select commit Hold shift + click to select a range
f6947ed
Harden FlowChain service restart evidence
FlowmemoryAI May 18, 2026
4486c0d
Harden FlowChain backup retention drills
FlowmemoryAI May 19, 2026
83af83f
Surface backup retention ops signals
FlowmemoryAI May 19, 2026
9369369
Harden live L1 systemd deployment gates
FlowmemoryAI May 19, 2026
4ad344f
Add systemd ops alert timer automation
FlowmemoryAI May 19, 2026
991185d
Add systemd backup scheduler automation
FlowmemoryAI May 19, 2026
be323ef
Add systemd bridge relayer opt-in plan
FlowmemoryAI May 19, 2026
2a489cd
Harden live gate refresh performance
FlowmemoryAI May 19, 2026
b6d970a
Add scheduled metrics export install gates
FlowmemoryAI May 19, 2026
6eddb91
Fix tester wallet UI readiness
FlowmemoryAI May 19, 2026
ccdac6f
Harden supervisor relayer autorecovery
FlowmemoryAI May 19, 2026
3a10194
Expose supervisor relayer recovery alerts
FlowmemoryAI May 19, 2026
076c5f5
Harden public RPC render validation
FlowmemoryAI May 19, 2026
8371700
Stage direct bridge observe cursor
FlowmemoryAI May 19, 2026
0198eb7
Harden bridge observer ops guardrail
FlowmemoryAI May 19, 2026
620e8c2
Harden public RPC edge preflight
FlowmemoryAI May 19, 2026
eceb5f8
Expose public RPC edge hardening metrics
FlowmemoryAI May 19, 2026
3bc83ec
Alert on public RPC edge hardening gaps
FlowmemoryAI May 19, 2026
bed5017
Harden bridge cursor range validation
FlowmemoryAI May 19, 2026
2fa1d78
Polish tester wallet launch flow
FlowmemoryAI May 19, 2026
b50a178
Add dashboard and owner-input ops alerts
FlowmemoryAI May 19, 2026
1175cef
Harden bridge cursor concurrency
FlowmemoryAI May 19, 2026
54c2e2c
Harden public RPC edge headers
FlowmemoryAI May 19, 2026
52ad79e
Tighten public RPC hardening audit coverage
FlowmemoryAI May 19, 2026
3500716
Harden dashboard RPC readiness proof
FlowmemoryAI May 19, 2026
c617666
Harden devkit transaction wait flow
FlowmemoryAI May 19, 2026
f11e6fb
Harden bridge pilot proof contract
FlowmemoryAI May 19, 2026
1e54f9a
Alert on stale production truth table
FlowmemoryAI May 19, 2026
a58eee8
Persist public RPC render evidence
FlowmemoryAI May 20, 2026
f859f1d
Validate tester wallet caps in dashboard
FlowmemoryAI May 20, 2026
d12cc7c
Harden bridge relayer once evidence
FlowmemoryAI May 20, 2026
e1e53c8
Alert on relayer evidence contract failures
FlowmemoryAI May 20, 2026
ec0ad58
Expose relayer contract health in ops UI
FlowmemoryAI May 20, 2026
b96e766
Add L1 activation cockpit
FlowmemoryAI May 20, 2026
0b17882
Require activation cockpit in readiness audits
FlowmemoryAI May 20, 2026
9066375
Align operator package with activation cockpit
FlowmemoryAI May 20, 2026
0d361e3
Expose activation readiness in ops metrics
FlowmemoryAI May 20, 2026
fe602c1
Run tester wallet E2E during cutover rehearsal
FlowmemoryAI May 20, 2026
2bd553b
Surface cutover wallet proof in activation plan
FlowmemoryAI May 20, 2026
9413e0e
Require wallet cutover proof for public RPC deployment
FlowmemoryAI May 20, 2026
8e6c238
Expose public RPC cutover proof in ops
FlowmemoryAI May 20, 2026
cc55c8b
Add signed transaction dev-pack submit path
FlowmemoryAI May 20, 2026
e16fa01
Add wallet signed transaction intake panel
FlowmemoryAI May 20, 2026
51298d8
Add transaction intake ops observability
FlowmemoryAI May 20, 2026
3567ba5
Harden bridge release evidence gate
FlowmemoryAI May 20, 2026
27993d9
Validate node supervisor autorecovery
FlowmemoryAI May 20, 2026
27d6fba
Require node recovery in architecture audit
FlowmemoryAI May 20, 2026
2dd36b5
Document node supervisor recovery proof
FlowmemoryAI May 20, 2026
0aa0a05
Add supervisor node recovery ops metrics
FlowmemoryAI May 20, 2026
4faed10
Gate tester write token setup
FlowmemoryAI May 20, 2026
5a16fc5
Harden public RPC method preflights
FlowmemoryAI May 20, 2026
14f789c
Add bridge runtime credit validation gate
FlowmemoryAI May 20, 2026
98a2d68
Surface bridge runtime proof in dashboard readiness
FlowmemoryAI May 20, 2026
dc2ae3d
Add external tester launch ops metrics
FlowmemoryAI May 20, 2026
989ef31
Show external tester launch blockers in dashboard
FlowmemoryAI May 20, 2026
7fc0ba4
Show bridge runtime proof on pilot dashboard
FlowmemoryAI May 20, 2026
a6c47bc
Add dev pack ecosystem inventory
FlowmemoryAI May 20, 2026
7576081
Promote browser readiness dev starter
FlowmemoryAI May 20, 2026
15e6c30
Clarify owner activation blockers
FlowmemoryAI May 20, 2026
a4d38b5
Surface service automation proofs in ops
FlowmemoryAI May 20, 2026
90dff79
Refresh operator package evidence
FlowmemoryAI May 20, 2026
51db029
Track public tester gateway in truth table
FlowmemoryAI May 20, 2026
91f50ad
Expose tester gateway ops metrics
FlowmemoryAI May 20, 2026
14e8916
Add tester gateway incident drill coverage
FlowmemoryAI May 20, 2026
049f9fc
Expand dev pack HTTP tooling
FlowmemoryAI May 20, 2026
eb17a90
Add FlowChain install and upgrade rehearsal gates
FlowmemoryAI May 20, 2026
d6c7f05
Add FlowChain bridge reconciliation gate
FlowmemoryAI May 20, 2026
94e9808
Harden public RPC live header readiness
FlowmemoryAI May 20, 2026
01bafce
Bound real-value pilot aggregate commands
FlowmemoryAI May 20, 2026
e02f8c8
Cover live RPC headers in architecture audit
FlowmemoryAI May 20, 2026
0bca89c
Promote real-value pilot aggregate gate
FlowmemoryAI May 20, 2026
85a06fb
Expose pilot aggregate ops signal
FlowmemoryAI May 20, 2026
f0161d9
Add owner go-live handoff gate
FlowmemoryAI May 20, 2026
ced12a0
Expose go-live handoff ops signals
FlowmemoryAI May 20, 2026
8e6007c
Show go-live handoff in activation cockpit
FlowmemoryAI May 20, 2026
37f87e4
Add operator package hash verification
FlowmemoryAI May 20, 2026
e5345cc
Add Python FlowChain dev pack
FlowmemoryAI May 20, 2026
5278093
Add external tester client dry run
FlowmemoryAI May 20, 2026
21a5cb0
Add public RPC synthetic canary
FlowmemoryAI May 20, 2026
b282696
Require RPC canary in top-level audits
FlowmemoryAI May 20, 2026
3769c5d
Preserve cutover truth table status
FlowmemoryAI May 20, 2026
36d6e38
Require relayer recovery in truth table
FlowmemoryAI May 20, 2026
fde2ba0
Track Base tx diagnostic truth gate
FlowmemoryAI May 20, 2026
5c74ccd
Require dashboard bridge proofs in release gates
FlowmemoryAI May 20, 2026
efa2787
Gate developer dev-pack in production truth table
FlowmemoryAI May 20, 2026
b6d674d
Gate external tester client validation
FlowmemoryAI May 20, 2026
5d89553
Export tester client validation metrics
FlowmemoryAI May 20, 2026
8ed07e5
Require tester client metrics in architecture audit
FlowmemoryAI May 20, 2026
ba32fe1
Gate public RPC deployment canary command
FlowmemoryAI May 20, 2026
c64c2cf
Export bridge release evidence metrics
FlowmemoryAI May 20, 2026
68e3a7d
Export bridge relayer loop metrics
FlowmemoryAI May 20, 2026
5165c32
Harden bridge relayer loop alert coverage
FlowmemoryAI May 20, 2026
46b7d86
Export service install validation metrics
FlowmemoryAI May 20, 2026
484c648
Alert on service install validation regressions
FlowmemoryAI May 20, 2026
769202d
Export public RPC rollback drill telemetry
FlowmemoryAI May 20, 2026
9159a95
Alert on bridge deploy control regressions
FlowmemoryAI May 20, 2026
52846c9
Refresh operator package evidence bundle
FlowmemoryAI May 20, 2026
1afc1d0
Package browser readiness starter
FlowmemoryAI May 20, 2026
9e8c289
Monitor developer pack readiness
FlowmemoryAI May 20, 2026
228caf8
Harden bridge reconciliation observability
FlowmemoryAI May 20, 2026
4e2df23
Monitor second-computer readiness
FlowmemoryAI May 20, 2026
1a611d6
Monitor backup restore readiness
FlowmemoryAI May 20, 2026
684bc60
Harden owner go-live launch sequence
FlowmemoryAI May 20, 2026
bfd71f1
Validate owner go-live command scripts
FlowmemoryAI May 20, 2026
70fc4d4
Map go-live steps to evidence reports
FlowmemoryAI May 20, 2026
fb4c445
Bundle go-live evidence in operator package
FlowmemoryAI May 21, 2026
a913e46
Harden public RPC owner host apply plan
FlowmemoryAI May 21, 2026
7e3b992
Separate optional bridge owner inputs
FlowmemoryAI May 21, 2026
acd4cb2
Harden real value pilot bridge observer
FlowmemoryAI May 21, 2026
62063a5
Generate public RPC owner host apply script
FlowmemoryAI May 21, 2026
fb439f5
Require owner host apply script in deployment contract
FlowmemoryAI May 21, 2026
93a0386
Add owner host apply stage to go live handoff
FlowmemoryAI May 21, 2026
3f3d4b3
Expose owner host apply sequence in dashboard
FlowmemoryAI May 21, 2026
72d6e2e
Refresh operator package evidence
FlowmemoryAI May 21, 2026
6421c22
Add Windows owner host apply automation
FlowmemoryAI May 21, 2026
1f89d32
Merge remote-tracking branch 'origin/main' into agent/live-product-in…
FlowmemoryAI May 21, 2026
b9dbf27
Add bridge command matrix production gate
FlowmemoryAI May 21, 2026
16f45a6
Add public RPC command matrix gate
FlowmemoryAI May 21, 2026
dab3db2
Expose RPC matrix in tester launch dashboard
FlowmemoryAI May 21, 2026
524d9e3
Gate dashboard RPC matrix proof
FlowmemoryAI May 21, 2026
4a753a3
Expose bridge command matrix in dashboard
FlowmemoryAI May 21, 2026
c9b3ae2
Gate ops alert dashboard coverage
FlowmemoryAI May 21, 2026
884a9c0
Validate recurring public RPC canary schedule
FlowmemoryAI May 21, 2026
982e959
Validate recurring bridge reconciliation schedule
FlowmemoryAI May 21, 2026
aab2ef8
Expose bridge schedule readiness in dashboard
FlowmemoryAI May 21, 2026
51c2e49
Add owner needs-now launch report
FlowmemoryAI May 21, 2026
e7d0c6f
Add needs-now observability coverage
FlowmemoryAI May 21, 2026
c06916b
Add bridge no-secret launch gate
FlowmemoryAI May 21, 2026
816a3c0
Surface bridge no-secret audit in dashboard
FlowmemoryAI May 21, 2026
3f4f11e
Surface owner needs-now groups in activation dashboard
FlowmemoryAI May 21, 2026
6af8cd6
Audit owner needs-now dashboard coverage
FlowmemoryAI May 21, 2026
9e7f189
Add owner env field guide
FlowmemoryAI May 21, 2026
3f45975
Surface owner env field guide in dashboard
FlowmemoryAI May 21, 2026
5029634
Harden bridge release evidence validation
FlowmemoryAI May 21, 2026
17bda7b
Enforce bridge release evidence in deployment contract
FlowmemoryAI May 21, 2026
6ea7fe6
Align owner needs-now with deployment gates
FlowmemoryAI May 21, 2026
3e11eee
Harden public RPC timeout guardrails
FlowmemoryAI May 21, 2026
3dcb11c
Surface public RPC timeout guardrail telemetry
FlowmemoryAI May 21, 2026
0d4bf87
Isolate bridge relayer loop one-shot runs
FlowmemoryAI May 21, 2026
230ce9a
Refresh launch evidence and incident drill inputs
FlowmemoryAI May 21, 2026
67eeeb8
Detail owner setup needs now
FlowmemoryAI May 21, 2026
bd307d3
Add FlowChain monitoring bundle
FlowmemoryAI May 21, 2026
18e4b64
Cover monitoring bundle in launch audits
FlowmemoryAI May 21, 2026
63a58d1
Add live chain capability matrix
FlowmemoryAI May 21, 2026
b1d460a
Add ops launch watch gate
FlowmemoryAI May 21, 2026
ee825a0
Harden L1 launch watch and runtime build cache
FlowmemoryAI May 22, 2026
a7f3eac
Refresh final L1 launch evidence
FlowmemoryAI May 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
node_modules/
__pycache__/
*.pyc
dist/
cache/
out/
Expand Down
111 changes: 109 additions & 2 deletions apps/dashboard/e2e/flowchain-ui-readiness.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ type BrowserState = {
created: boolean;
funded: boolean;
sent: boolean;
unhandledRequests: string[];
};

async function fulfillJson(route: Route, payload: unknown, status = 200) {
Expand Down Expand Up @@ -47,6 +48,17 @@ async function installControlPlaneMocks(page: Page, state: BrowserState) {
return;
}

if (pathname === "/rpc" && method === "POST") {
const payload = request.postDataJSON() as Array<{ id?: string | number }> | { id?: string | number };
const requests = Array.isArray(payload) ? payload : [payload];
await fulfillJson(route, requests.map((entry) => ({
jsonrpc: "2.0",
id: entry.id ?? null,
result: null,
})));
return;
}

if (pathname === "/state") {
await fulfillJson(route, {
state: {
Expand Down Expand Up @@ -234,7 +246,8 @@ async function installControlPlaneMocks(page: Page, state: BrowserState) {
return;
}

await fulfillJson(route, { schema: "flowmemory.control_plane.not_found.v0", noSecrets: true }, 404);
state.unhandledRequests.push(`${method} ${pathname}`);
await fulfillJson(route, { schema: "flowmemory.control_plane.unhandled_mock.v0", noSecrets: true });
});
}

Expand All @@ -261,7 +274,7 @@ async function expectNoHorizontalOverflow(page: Page) {
test.describe("FlowChain wallet, faucet, and explorer browser readiness", () => {
test("completes the tester wallet funding loop and keeps the explorer inspectable", async ({ page }) => {
const consoleErrors: string[] = [];
const state: BrowserState = { created: false, funded: false, sent: false };
const state: BrowserState = { created: false, funded: false, sent: false, unhandledRequests: [] };

page.on("console", (message) => {
if (message.type() === "error") {
Expand All @@ -276,21 +289,33 @@ test.describe("FlowChain wallet, faucet, and explorer browser readiness", () =>
await page.goto("/wallet?panel=tester");

await expect(page.getByText("Tester gateway configured")).toBeVisible();
await expect(page.getByLabel("Tester launch path")).toContainText("Create, fund, send, inspect");
await expect(page.getByLabel("Tester launch path")).toContainText("needs passphrase");
await page.getByLabel("Tester bearer token").fill(TESTER_TOKEN);
await page.getByLabel("Tester wallet label").fill("friend-browser-a");
await page.getByLabel("Tester wallet passphrase").fill("browser-test-passphrase");
await page.getByRole("button", { name: /Create tester wallet/ }).click();
await expect(page.getByRole("status")).toContainText("Tester wallet created");
await expect(page.getByLabel("Tester launch path")).toContainText("wallet ready");
await expect(page.getByLabel("Fund account")).toHaveValue(TESTER_ACCOUNT_A);

await page.getByRole("button", { name: "Tester", exact: true }).click();
await page.getByLabel("Fund account").fill(TESTER_ACCOUNT_A);
await page.getByLabel("Faucet units").fill("3");
await expect(page.getByLabel("Faucet units")).toHaveAttribute("aria-invalid", "true");
await expect(page.getByRole("button", { name: /Request tester faucet/ })).toBeDisabled();
await page.getByLabel("Faucet units").fill("2");
await page.getByRole("button", { name: /Request tester faucet/ }).click();
await expect(page.getByRole("status")).toContainText("Tester faucet accepted");
await expect(page.getByLabel("Tester launch path")).toContainText("funding proof");
await expect(page.getByLabel("Sender account")).toHaveValue(TESTER_ACCOUNT_A);

await page.getByRole("button", { name: "Tester", exact: true }).click();
await page.getByLabel("Sender account").fill(TESTER_ACCOUNT_A);
await page.getByLabel("Recipient account").fill(TESTER_ACCOUNT_B);
await page.getByLabel("Amount units").fill("3");
await expect(page.getByLabel("Amount units")).toHaveAttribute("aria-invalid", "true");
await expect(page.getByRole("button", { name: /Send tester units/ })).toBeDisabled();
await page.getByLabel("Amount units").fill("1");
await page.getByRole("button", { name: /Send tester units/ }).click();
await expect(page.getByRole("status")).toContainText("Tester send accepted");
Expand All @@ -311,8 +336,90 @@ test.describe("FlowChain wallet, faucet, and explorer browser readiness", () =>
await page.getByRole("button", { name: /Transactions/ }).first().click();
await expect(page.getByLabel("Explorer records")).toContainText(/transaction|transfer/i);

await page.goto("/tester");
await expect(page.getByRole("heading", { name: "Friends-and-family launch" })).toBeVisible();
await expect(page.getByLabel("Tester launch status")).toContainText("Live infra");
await expect(page.getByLabel("Tester launch status")).toContainText("Missing inputs");
await expect(page.getByLabel("Tester launch status")).toContainText("RPC command matrix");
await expect(page.getByText("RPC headers", { exact: true }).first()).toBeVisible();
await expect(page.getByText("HSTS, no-sniff, no-store, CSP")).toBeVisible();
await expect(page.getByText("RPC matrix", { exact: true }).first()).toBeVisible();
await expect(page.getByText("RPC launch matrix", { exact: true }).first()).toBeVisible();
await expect(page.getByText("npm run flowchain:public-rpc:command-matrix").first()).toBeVisible();

await page.goto("/activation");
await expect(page.getByRole("heading", { name: "L1 activation" })).toBeVisible();
await expect(page.getByLabel("L1 activation status")).toContainText("Needed now");
await expect(page.getByLabel("L1 activation status")).toContainText("Release");
await expect(page.getByRole("heading", { name: "Needed now" })).toBeVisible();
await expect(page.getByLabel("Owner setup groups")).toContainText("Public RPC edge");
await expect(page.getByLabel("Owner setup groups")).toContainText("Pick the public RPC URL");
await expect(page.getByLabel("Public RPC edge validation commands")).toContainText("flowchain:public-rpc:synthetic-canary");
await expect(page.getByLabel("Owner setup groups")).toContainText("Backup storage");
await expect(page.getByLabel("Owner setup groups")).toContainText("Base 8453 bridge");
await expect(page.getByLabel("Ready setup groups")).toContainText("Tester write gateway");
await expect(page.getByRole("heading", { name: "Host apply sequence" })).toBeVisible();
await expect(page.getByLabel("Owner host apply proof")).toContainText("owner-host-apply.sh plan");
await expect(page.getByLabel("Owner host apply proof")).toContainText("owner-host-apply.sh apply");
await expect(page.getByLabel("Owner host apply proof")).toContainText("owner-host-apply.ps1 -Action Plan");
await expect(page.getByLabel("Owner host apply proof")).toContainText("owner-host-apply.ps1 -Action Apply");
await expect(page.getByLabel("Owner host rollback commands")).toContainText("owner-host-apply.sh rollback");
await expect(page.getByLabel("Owner host rollback commands")).toContainText("owner-host-apply.ps1 -Action Rollback");
await expect(page.getByLabel("Go-live launch sequence")).toContainText("Apply owner-host public RPC edge");
await expect(page.getByLabel("Next owner inputs")).toContainText("FLOWCHAIN_RPC_PUBLIC_URL");
await expect(page.getByText("Expose repo-owned FlowChain RPC", { exact: false })).toBeVisible();
await expect(page.getByLabel("Missing owner inputs")).toContainText("FLOWCHAIN_RPC_PUBLIC_URL");
await expect(page.getByLabel("Owner env field guide")).toContainText("Guide rows");
await expect(page.getByLabel("Owner env field guide")).toContainText("FLOWCHAIN_RPC_PUBLIC_URL");
await expect(page.getByLabel("Owner env field guide")).toContainText("absolute non-local HTTPS endpoint");
await expect(page.getByLabel("Owner env field guide")).toContainText("owner DNS, tunnel, or reverse proxy hostname");

await page.goto("/bridge");
await expect(page.getByRole("heading", { name: "Bridge funds into Flowchain" })).toBeVisible();
const bridgeRuntimeProof = page.getByLabel("Bridge runtime proof");
await expect(bridgeRuntimeProof).toContainText("Bridge command matrix");
await expect(bridgeRuntimeProof).toContainText("flowchain:bridge:command-matrix");
await expect(bridgeRuntimeProof).toContainText("No-secret audit");
await expect(bridgeRuntimeProof).toContainText("flowchain:bridge:no-secret-audit");
await expect(bridgeRuntimeProof).toContainText("Pilot aggregate");
await expect(bridgeRuntimeProof).toContainText("Runtime credit");
await expect(bridgeRuntimeProof).toContainText("Transfer settlement");
await expect(bridgeRuntimeProof).toContainText("Relayer guardrail");
await expect(bridgeRuntimeProof).toContainText("Relayer loop");
await expect(bridgeRuntimeProof).toContainText("Reconciliation schedule");
await expect(bridgeRuntimeProof).toContainText("flowchain:bridge:reconciliation:schedule:validate");
await expect(bridgeRuntimeProof).toContainText(/\d+ proof commands/);
await expect(bridgeRuntimeProof).toContainText(/\d+(\.\d+)?s to spendable credit/);
await expect(bridgeRuntimeProof).toContainText(/\d+(\.\d+)?s/);
await expectNoHorizontalOverflow(page);

await page.goto("/ops");
await expect(page.getByRole("heading", { name: "Ops center" })).toBeVisible();
await expect(page.getByLabel("Bridge relayer check contract")).toContainText("Relayer check contract");
await expect(page.getByLabel("Bridge relayer check contract")).toContainText("bridge-relayer-check-contract-failed");
await expect(page.getByLabel("Service and deployment automation proof")).toContainText("Autorecovery drill");
await expect(page.getByLabel("Service and deployment automation proof")).toContainText("Public RPC automation");
await expect(page.getByLabel("Service and deployment automation proof")).toContainText("Systemd service plan");
await expect(page.getByLabel("Service and deployment automation proof")).toContainText("Bridge evidence audit");
await expect(page.getByLabel("Service and deployment automation proof")).toContainText("Ops install proof");
await expect(page.getByText("Active rules", { exact: true })).toBeVisible();
await expect(page.getByText("Escalation dry run", { exact: true }).first()).toBeVisible();

await page.goto("/alerts");
await expect(page.getByRole("heading", { name: "Alerts" })).toBeVisible();
await expect(page.getByText("Verifier failed", { exact: true })).toBeVisible();
await expect(page.getByText("UPSTREAM_LOSS", { exact: true })).toBeVisible();
await expect(page.getByText("next action").first()).toBeVisible();

await page.goto("/");
await expect(page.getByLabel("Public L1 launch readiness")).toContainText("Bridge runtime credit");
await expect(page.getByLabel("Public L1 launch readiness")).toContainText("flowchain:bridge:runtime-credit:validate");
await expect(page.getByLabel("Public L1 launch readiness")).toContainText("Bridge release evidence");
await expect(page.getByLabel("Public L1 launch readiness")).toContainText("flowchain:bridge:release:evidence:validate");

await expectNoUiLeakage(page);
await expectNoHorizontalOverflow(page);
expect(state.unhandledRequests).toEqual([]);
expect(consoleErrors).toEqual([]);
});
});
Loading