[object Object]

← back to CelebritySignatures

auto-save: 2026-08-03T14:24:54 (6 files) — data/portraits.json screenrecord/ scripts/fetch-portraits.mjs scripts/screenrecord-game.mjs scripts/screenrecord-murals.mjs

4562ef63ffd61823cc97df2c840bc2dcf75d6be2 · 2026-08-03 14:25:04 -0700 · Steve Abrams

Files touched

Diff

commit 4562ef63ffd61823cc97df2c840bc2dcf75d6be2
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Mon Aug 3 14:25:04 2026 -0700

    auto-save: 2026-08-03T14:24:54 (6 files) — data/portraits.json screenrecord/ scripts/fetch-portraits.mjs scripts/screenrecord-game.mjs scripts/screenrecord-murals.mjs
---
 data/portraits.json                                |    1 +
 screenrecord/DEBUG-REPORT.md                       |  223 ++
 screenrecord/debug-log.jsonl                       | 2207 ++++++++++++++++++++
 .../run0/page@0647016d982221a1fe900c1840e6137c.mp4 |  Bin 0 -> 283292 bytes
 .../run0/page@132bd296b39d3b1aa89f178e875872b8.mp4 |  Bin 0 -> 2440435 bytes
 .../run0/page@389e0070fb0f53072a02e201a1d39b94.mp4 |  Bin 0 -> 1233428 bytes
 .../run0/page@3cd1340a9f795dfa77fee107dd42b186.mp4 |  Bin 0 -> 951642 bytes
 .../run0/page@672ecf6b0ba2e0c8477e0729ffa95655.mp4 |  Bin 0 -> 7238573 bytes
 .../run0/page@95748996b98a04424eb89029ed59900d.mp4 |  Bin 0 -> 5024498 bytes
 .../run0/page@d53150f4fc5f7157ff9b327bcc85a6f7.mp4 |  Bin 0 -> 3451403 bytes
 .../run0/page@ece429832621fdc53eb7bdbe5ffe9935.mp4 |  Bin 0 -> 4970741 bytes
 .../run1/page@09e5454e881013074dead68e52820662.mp4 |  Bin 0 -> 4981026 bytes
 .../run1/page@2e16f317b77a99fd179e90b70d6dc6c0.mp4 |  Bin 0 -> 6142578 bytes
 .../run1/page@5acccd111aa180017e3c3d3abe87cef4.mp4 |  Bin 0 -> 6010950 bytes
 .../run1/page@b814d48e2e10052ebaca97130a7789bd.mp4 |  Bin 0 -> 340684 bytes
 .../run1/page@bc094f397b8c213a7a61c8feaf3eb43b.mp4 |  Bin 0 -> 329748 bytes
 .../run2/page@0e1b81dcf8e068dd5e0431e85fe8f2c7.mp4 |  Bin 0 -> 339334 bytes
 .../run2/page@7a161f93a291136330d8f7621fe3a4ed.mp4 |  Bin 0 -> 6926668 bytes
 .../run2/page@7af0dbbbe7c306dc710790e56f508c9e.mp4 |  Bin 0 -> 4977689 bytes
 .../run2/page@e1bc67e02815f554ce57ace028f8ea11.mp4 |  Bin 0 -> 5242762 bytes
 .../run3/page@3b44d8ba298d928946343af1a2d4e46c.mp4 |  Bin 0 -> 5802423 bytes
 .../run3/page@4adcd3d9e98a0707841a95dd82a044f7.mp4 |  Bin 0 -> 1286063 bytes
 .../run3/page@5eea223bc7ae9bf0ac39ccf7495221c2.mp4 |  Bin 0 -> 4406272 bytes
 .../run3/page@cf3d061226f40c22fc8bf3fbd48fe003.mp4 |  Bin 0 -> 297891 bytes
 .../run4/page@5191324244d1c7f49ce143eb293ca185.mp4 |  Bin 0 -> 341198 bytes
 .../page@5191324244d1c7f49ce143eb293ca185.webm     |  Bin 0 -> 875972 bytes
 .../run4/page@bb2982ab6024853b100f11aefb3da07b.mp4 |  Bin 0 -> 5418624 bytes
 .../page@bb2982ab6024853b100f11aefb3da07b.webm     |  Bin 0 -> 4696612 bytes
 .../page@e40ee13d1a3b575716a3f84a9bbd6a22.webm     |  Bin 0 -> 8650752 bytes
 screenrecord/run-debug.mjs                         |  514 +++++
 scripts/fetch-portraits.mjs                        |   63 +
 scripts/screenrecord-game.mjs                      |  525 +++++
 scripts/screenrecord-murals.mjs                    |  590 ++++++
 scripts/screenrecord.mjs                           |  615 ++++++
 34 files changed, 4738 insertions(+)

diff --git a/data/portraits.json b/data/portraits.json
new file mode 100644
index 0000000..492ba46
--- /dev/null
+++ b/data/portraits.json
@@ -0,0 +1 @@
+{"Q11812":"https://commons.wikimedia.org/wiki/Special:FilePath/Official_Presidential_portrait_of_Thomas_Jefferson_(by_Rembrandt_Peale%2C_1800)(cropped).jpg?width=120","Q34969":"https://commons.wikimedia.org/wiki/Special:FilePath/Joseph_Siffrein_Duplessis_-_Benjamin_Franklin_-_Google_Art_Project.jpg?width=120","Q11806":"https://commons.wikimedia.org/wiki/Special:FilePath/John_Adams_A18236.jpg?width=120","Q212963":"https://commons.wikimedia.org/wiki/Special:FilePath/SamuelAdamsLarge.jpeg?width=120","Q219797":"https://commons.wikimedia.org/wiki/Special:FilePath/05_Elbridge_Gerry_3x4.jpg?width=120","Q272774":"https://commons.wikimedia.org/wiki/Special:FilePath/John_Hancock_1770-crop.jpg?width=120","Q656478":"https://commons.wikimedia.org/wiki/Special:FilePath/Benjamin_Rush_Painting_by_Peale_1783.jpg?width=120","Q354721":"https://commons.wikimedia.org/wiki/Special:FilePath/Roger_Sherman_1721-1793_by_Ralph_Earl.jpeg?width=120","Q725907":"https://commons.wikimedia.org/wiki/Special:FilePath/RichardHenryLee.jpg?width=120","Q464876":"https://commons.wikimedia.org/wiki/Special:FilePath/Robert_Edge_Pine_-_Robert_Morris_-_NPG.73.20_-_National_Portrait_Gallery.jpg?width=120","Q466009":"https://commons.wikimedia.org/wiki/Special:FilePath/Charles_Carroll_of_Carrollton_-_Michael_Laty.jpg?width=120","Q365181":"https://commons.wikimedia.org/wiki/Special:FilePath/JusticeJamesWilson.jpg?width=120","Q710057":"https://commons.wikimedia.org/wiki/Special:FilePath/Josiah_Bartlett_(NYPL_b12349193-419985)_(cropped).tif?width=120","Q878666":"https://commons.wikimedia.org/wiki/Special:FilePath/Rutledge%2C_Edward%2C_1749-1800_James_Earl.jpg?width=120","Q471303":"https://commons.wikimedia.org/wiki/Special:FilePath/George_Read_-_Robert_Edge_Pine.tiff?width=120","Q880686":"https://commons.wikimedia.org/wiki/Special:FilePath/Thomas_McKean_by_Charles_Willson_Peale.jpg?width=120","Q387664":"https://commons.wikimedia.org/wiki/Special:FilePath/Benjamin_Harrison_V_miniature_portrait.png?width=120","Q887130":"https://commons.wikimedia.org/wiki/Special:FilePath/Samuel_Huntington_-_Charles_Willson_Peale.jpg?width=120","Q1399643":"https://commons.wikimedia.org/wiki/Special:FilePath/Stephen_Hopkins_(NYPL_NYPG97-F76-420410).jpg?width=120","Q1397375":"https://commons.wikimedia.org/wiki/Special:FilePath/Francis_Hopkinson.jpg?width=120","Q285521":"https://commons.wikimedia.org/wiki/Special:FilePath/John_Wesley_Jarvis_-_Samuel_Chase_-_NPG.67.2_-_National_Portrait_Gallery.jpg?width=120","Q708913":"https://commons.wikimedia.org/wiki/Special:FilePath/George_Clymer.jpg?width=120","Q567964":"https://commons.wikimedia.org/wiki/Special:FilePath/William_Ellery.jpg?width=120","Q743472":"https://commons.wikimedia.org/wiki/Special:FilePath/Robert_Treat_Paine_portrait.jpg?width=120","Q1397321":"https://commons.wikimedia.org/wiki/Special:FilePath/WytheGeorge.jpg?width=120","Q887136":"https://commons.wikimedia.org/wiki/Special:FilePath/Portrait_of_Button_Gwinnett%2C_signer_of_the_Declaration_of_Independence_from_Georgia.jpg?width=120","Q887100":"https://commons.wikimedia.org/wiki/Special:FilePath/CaesarRodney.jpeg?width=120","Q878512":"https://commons.wikimedia.org/wiki/Special:FilePath/George_Walton_(1749_or_1750-1804).jpg?width=120","Q647979":"https://commons.wikimedia.org/wiki/Special:FilePath/Unidentified_Artist_-_Carter_Braxton_-_NPG.98.33_-_National_Portrait_Gallery.jpg?width=120","Q1381060":"https://commons.wikimedia.org/wiki/Special:FilePath/William_floyd.jpg?width=120","Q223235":"https://commons.wikimedia.org/wiki/Special:FilePath/Francis_Lewis.jpg?width=120","Q731813":"https://commons.wikimedia.org/wiki/Special:FilePath/Oliver_Wolcott_Ralph_Earl.jpeg?width=120","Q1246390":"https://commons.wikimedia.org/wiki/Special:FilePath/Peale%2C_Charles_Willson%2C_John_Witherspoon_(1723-1794)%2C_President_(1768-94).jpg?width=120","Q880222":"https://commons.wikimedia.org/wiki/Special:FilePath/Thomas_Nelson_(1700s).jpg?width=120","Q766814":"https://commons.wikimedia.org/wiki/Special:FilePath/William_Paca%2C_U.S._District_Court_Judge.jpg?width=120","Q550569":"https://commons.wikimedia.org/wiki/Special:FilePath/Stockton.jpg?width=120","Q329870":"https://commons.wikimedia.org/wiki/Special:FilePath/Abraham_Clark_1873_Lambdin_after_Trumbull.jpg?width=120","Q590856":"https://commons.wikimedia.org/wiki/Special:FilePath/Lyman_hall.jpg?width=120","Q1345669":"https://commons.wikimedia.org/wiki/Special:FilePath/William_Hooper.jpg?width=120","Q1230175":"https://commons.wikimedia.org/wiki/Special:FilePath/JohnMorton.jpg?width=120","Q1969780":"https://commons.wikimedia.org/wiki/Special:FilePath/William_Whipple_by_Walter_Gilman_Page%2C_1897.jpg?width=120","Q1666382":"https://commons.wikimedia.org/wiki/Special:FilePath/Joseph_Hewes.png?width=120","Q1368351":"https://commons.wikimedia.org/wiki/Special:FilePath/Matthew_Thornton.jpg?width=120","Q1399545":"https://commons.wikimedia.org/wiki/Special:FilePath/Thomas_Heyward%2C_Jr._(1746-1809)_Philippe_Abraham_Peticolas.jpg?width=120","Q537583":"https://commons.wikimedia.org/wiki/Special:FilePath/Thomas_Lynch_Jr..jpg?width=120","Q721842":"https://commons.wikimedia.org/wiki/Special:FilePath/Robert_Edge_Pine_-_Thomas_Stone_-_NPG.71.44_-_National_Portrait_Gallery.jpg?width=120","Q721599":"https://commons.wikimedia.org/wiki/Special:FilePath/James_Smith_(1700s).png?width=120","Q657569":"https://commons.wikimedia.org/wiki/Special:FilePath/Arthur_Middleton_from_a_painting_by_Benjamin_West.jpg?width=120","Q714967":"https://commons.wikimedia.org/wiki/Special:FilePath/PhilipLivingstonYounger.jpg?width=120","Q530037":"https://commons.wikimedia.org/wiki/Special:FilePath/John_Penn.png?width=120"}
\ No newline at end of file
diff --git a/screenrecord/DEBUG-REPORT.md b/screenrecord/DEBUG-REPORT.md
new file mode 100644
index 0000000..066e90e
--- /dev/null
+++ b/screenrecord/DEBUG-REPORT.md
@@ -0,0 +1,223 @@
+# CelebritySignatures /upload — Screen Record Debug Report
+Date: 2026-08-03  
+Target: http://localhost:9920/upload  
+Source: public/upload-signature.html (zero-dependency vanilla HTML/JS)  
+Ticket: TK-10194
+
+---
+
+## HIGHEST-LEVERAGE FIX (top item)
+
+### BUG 1 — Upload size floor is unreachable via the file picker in normal use
+
+**Severity: Medium / UX confusion risk**
+
+The server rejects files under 500 bytes (`buf.length < 500`). A 1x1 pixel PNG test image (the
+smallest valid PNG Playwright can inject headlessly) is only 68–70 bytes and hits this wall.
+
+The problem for REAL users: a legitimate tiny SVG logo or a low-resolution scan could fall below
+500 bytes. The error message "file must be 0.5KB–3MB" appears as a red inline message in `#upMsg`
+correctly, BUT there is no client-side size pre-check before the API call. The user fills out the
+name, attests, submits, waits for the network round-trip, then gets an error they couldn't have
+anticipated from the UI.
+
+**Recommended fix:** Add a client-side guard in `#uploadBtn.onclick` immediately after `dataUrl` is
+set — check `atob(dataUrl.split(',')[1]).length` before firing the API call and show the same
+"file must be 0.5KB–3MB" message immediately. This is a 2-line JS change in
+`upload-signature.html`.
+
+---
+
+## All Findings
+
+### PASS — $10 / 50% stat callout
+All 5 runs: the commission callout card renders correctly — "$10 per download" and "50%" your cut
+are present in the DOM. No missing content, no layout collapse.
+
+### PASS — Auth initial state (logged-out)
+All 5 runs: on page load, `#authForms` is visible and `#whoami` is hidden. The title reads "Sign
+in or create an account". Upload and dashboard cards are both `display:none`.
+
+### PASS — Upload + dashboard cards hidden when logged out
+All 5 runs: `#uploadCard` and `#dashCard` remain `display:none` when no session cookie is present.
+The `refresh()` call on page load correctly reads `/api/auth/me` returning `{user:null}` and hides
+both cards.
+
+### PASS — Create account flow (run 0, 2, 4)
+Run 0: Signup with `screenrec-test@example.com` / `secret123` / `Rec Test` succeeded. `#authMsg`
+showed "account created", `#whoami` appeared, `#authForms` hidden. Email shown correctly in
+`#whoEmail`.
+
+Runs 2 and 4 (re-runs on same account): server correctly returned `{ok:false, error:"account
+already exists — sign in instead"}` (HTTP 409). The front-end sets `#authMsg` to that error string
+in `.msg.err` red class. The fallback login path succeeded immediately. This is correct behavior
+— NOT a bug.
+
+**Minor UX note:** the "account already exists" message displays in red even though the right
+action (signing in) succeeds immediately after. The user sees a flash of red before the green
+"signed in" overrides it (because the fallback login updates `#authMsg` to "signed in"). The
+transition is fast but could be surprising on slow connections. Consider showing "sign in instead"
+in a neutral `.msg` class rather than `.msg.err`.
+
+### PASS — Sign in flow (run 1, 3)
+Direct `#loginBtn` click with correct creds: `#authMsg` = "signed in", `#whoami` appears,
+`#authForms` hides. Cards appear. Consistent across all odd-numbered runs.
+
+### PASS — Cards appear after sign in
+All 5 runs: immediately after a successful auth (signup or login), `#uploadCard` and `#dashCard`
+both appear. `refresh()` is called from inside the signup/login handlers and correctly fetches
+`/api/my-signatures`.
+
+### PASS — Dashboard empty state
+All 5 runs: dashboard tbody shows "no uploads yet" (colspan=6 row) when the test user has no
+approved uploads. `#totalEarned` shows "$0.00". Table header (Name / Status / Downloads / Price /
+Cut / Earned) renders correctly.
+
+### PASS — Dashboard after failed upload
+Because the upload size validation blocked all test submissions (70-byte fake PNG), the dashboard
+correctly continues to show "no uploads yet" after each failed submit attempt.
+
+### PASS — Upload validation: no file, no attest
+All 5 runs: clicking "Submit for review" with no file loaded → `#upMsg` = "choose a signature file
+first" (red). Consistent across all run orderings.
+
+### PASS — Upload validation: attest checked, still no file
+All 5 runs: checking `#attest` then clicking Submit with no file → still shows "choose a signature
+file first". The code correctly checks `dataUrl` first, before `#attest.checked`. This is the
+correct priority order.
+
+### PASS — Upload validation: file present, no attest
+All 5 runs: after `setInputFiles` injection of a fake PNG (preview shown, `dataUrl` populated),
+clicking Submit without checking `#attest` → `#upMsg` = "the attestation checkbox is required"
+(red). Correct.
+
+### FAIL — Upload: file size too small (headless test artifact, NOT a production bug)
+All 5 runs: the 1x1 pixel PNG injected by `setInputFiles` decodes to 70 bytes, below the 500-byte
+floor. Server returns HTTP 400, `{ok:false, error:"file must be 0.5KB–3MB"}`. `#upMsg` shows the
+error in red. The behavior is CORRECT — the server is enforcing its size constraint.
+
+**Why this is still worth flagging:** A real user uploading a small clean SVG signature (e.g. a
+scan of initials) could genuinely fall below 500 bytes. The 0.5KB floor is probably intended to
+block empty/corrupted base64 payloads, not to exclude legitimately small signatures. Consider
+lowering the floor to 100 bytes or 50 bytes, or removing the floor entirely (the 3MB ceiling is
+what matters for server safety).
+
+### PASS — Attest checkbox toggle
+All 5 runs in all orderings: `#attest` toggles true/false on click, state is readable. No ARIA
+issues detected.
+
+### PASS — Celebrity name field
+All 5 runs: `#celebName` accepts text fill, value reads back correctly.
+
+### PASS — File input properties
+All 5 runs: `#sigFile` exists, `accept="image/png,image/jpeg,image/svg+xml"` is set correctly.
+FileReader `onchange` fires, sets `dataUrl`, shows `#preview` (`display:block`). Preview src
+starts with `data:image/`.
+
+### PASS — Sign out
+All 5 runs: clicking `#logoutLink` calls `POST /api/auth/logout`, then `refresh()`. `#authForms`
+becomes visible, `#whoami` hides, `#authTitle` resets to "Sign in or create an account". Upload
+and dashboard cards hide. No errors.
+
+### PASS — Sign back in after logout
+All 5 runs: re-filling `#aEmail` + `#aPw` and clicking `#loginBtn` after logout works correctly.
+Session is re-established, cards reappear, `#whoEmail` shows correct email.
+
+### PASS — "Back to gallery" link
+All 5 runs: `h1 a` has `href="/"` and text "← back to the gallery". Not clicked (would navigate
+away) but the target `/` returns HTTP 200 (verified by curl separately).
+
+### PASS — No unhandled console errors or pageerrors
+Zero `pageerror` events across all 5 runs. The only `console.error` entries are the expected
+network-layer "Failed to load resource: 400 (Bad Request)" messages from the file-size validation
+hits and the "409 Conflict" from duplicate signup attempts — both correct, not symptoms of a JS
+bug.
+
+**Note on GA4:** `https://www.googletagmanager.com/gtag/js?id=G-2HEVP6TD0J` is loaded
+asynchronously. In headless Playwright with no internet access to GTM, this will silently fail to
+load (net::ERR_NAME_NOT_RESOLVED in a truly offline headless env, or load fine with internet). No
+error was observed in these runs, so the network was available or GTM timed out silently.
+
+---
+
+## Order-Dependent Failures
+
+**None found.** The following combinations were tested:
+- Run 0: DOM order (attest-toggle first in validation block)
+- Run 1: Reverse order (name-fill first)
+- Run 2: Inputs-before-buttons order
+- Run 3: Seeded shuffle
+- Run 4: Prior-error-selectors first
+
+All orderings produced identical outcomes for every element interaction. The auth flow, card
+toggling, validation messages, and sign-out/in cycle behaved identically regardless of which
+validation test was run first. No state leaks between validation tests detected.
+
+---
+
+## Console Errors (Aggregated Across All Runs)
+
+| Run | Selector | Error | Type |
+|-----|----------|-------|------|
+| 0   | #uploadBtn (real upload) | Failed to load resource: 400 (Bad Request) | console.error |
+| 1   | #uploadBtn (real upload) | Failed to load resource: 400 (Bad Request) | console.error |
+| 2   | #signupBtn (dup account) | Failed to load resource: 409 (Conflict) | console.error |
+| 2   | #uploadBtn (real upload) | Failed to load resource: 400 (Bad Request) | console.error |
+| 3   | #uploadBtn (real upload) | Failed to load resource: 400 (Bad Request) | console.error |
+| 4   | #signupBtn (dup account) | Failed to load resource: 409 (Conflict) | console.error |
+| 4   | #uploadBtn (real upload) | Failed to load resource: 400 (Bad Request) | console.error |
+
+All 7 console.error entries are fetch failures for correctly-rejected API calls. These are not JS
+bugs — the browser logs a console error for any `fetch()` that gets a 4xx response, even when the
+response JSON is correctly handled. Zero unhandled pageerrors.
+
+---
+
+## Recording Paths
+
+| Run | Combination | Primary MP4 |
+|-----|-------------|-------------|
+| 0   | DOM order   | screenrecord/rec/run0/page@d53150f4fc5f7157ff9b327bcc85a6f7.mp4 (3.3MB) |
+| 1   | Reverse     | screenrecord/rec/run1/page@bc094f397b8c213a7a61c8feaf3eb43b.mp4 (322KB) |
+| 2   | Inputs-first | screenrecord/rec/run2/page@0e1b81dcf8e068dd5e0431e85fe8f2c7.mp4 (331KB) |
+| 3   | Seeded shuffle | screenrecord/rec/run3/page@cf3d061226f40c22fc8bf3fbd48fe003.mp4 (291KB) |
+| 4   | Errors-first | screenrecord/rec/run4/page@5191324244d1c7f49ce143eb293ca185.mp4 (333KB) |
+
+ffmpeg was used to convert all .webm files to .mp4 (H.264, CRF 22).  
+Run 0 has multiple recordings (Playwright opened extra pages during GA4 script loading) — the
+primary/longest is the 3.3MB file above.
+
+---
+
+## Test Account Cleanup Note
+
+Test account created: `screenrec-test@example.com` / `secret123`  
+Location: `data/users.json`  
+Status: 1 user in file. NO celebrity uploads were created (upload size gate blocked all test
+submissions). Safe to remove this user entry from `data/users.json` when ready.
+
+---
+
+## Summary Scorecard
+
+| Flow | Status |
+|------|--------|
+| $10/50% stat callout renders | PASS |
+| Auth form shows when logged out | PASS |
+| Upload + dashboard hidden when logged out | PASS |
+| Create account | PASS |
+| Duplicate signup error message | PASS (correct 409 behavior) |
+| Sign in with existing account | PASS |
+| Upload + dashboard appear after sign in | PASS |
+| Dashboard empty state ("no uploads yet") | PASS |
+| Validation: no file | PASS |
+| Validation: attest + no file | PASS |
+| Validation: file + no attest | PASS |
+| File input preview on file select | PASS |
+| Full upload submit (real file) | FAIL — headless 70-byte PNG below 0.5KB floor |
+| Dashboard reflects new upload | N/A (blocked by size) |
+| Sign out | PASS |
+| Sign back in | PASS |
+| "Back to gallery" link | PASS |
+| No unhandled JS errors | PASS |
+| Order-dependent bugs | NONE FOUND |
diff --git a/screenrecord/debug-log.jsonl b/screenrecord/debug-log.jsonl
new file mode 100644
index 0000000..d0f8c77
--- /dev/null
+++ b/screenrecord/debug-log.jsonl
@@ -0,0 +1,2207 @@
+{"run":0,"ts":"2026-08-03T21:02:59.727Z","game":"whose","diff":"icons","cat":"All","selector":"#gamePick .gcard[data-g=\"whose\"]","label":"game-card-whose","action":"click","ok":true,"effect":"card selected","errors":["REQUEST_FAILED: POST https://www.google-analytics.com/g/collect?v=2&tid=G-2HEVP6TD0J&gtm=45je67u0v9260226174za200zd9260226174&_p=1785790978580&gcd=13l3l3l3l1l1&npa=0&dma=0&are=1&cid=678713399.1785790979&frm=0&ngs=1&pscdl=noapi&rcb=18&sr=1600x900&uaa=arm&uab=64&uafvl=HeadlessChrome%3B149.0.7827.55%7CChromium%3B149.0.7827.55%7CNot)A%253BBrand%3B24.0.0.0&uam=&uamb=0&uap=macOS&uapv=26.4.0&uaw=0&ul=en-us&_s=1&tag_exp=115938465~115938468~118897920~118897930~119896803&sid=1785790978&sct=1&seg=0&dl=http%3A%2F%2Flocalhost%2Fgame&dt=The%20Signature%20Games%20%E2%80%94%20Celebrity%20Signatures&en=page_view&_fv=1&_nsi=1&_ss=1&_ee=1&tfd=214 — net::ERR_ABORTED"]}
+{"run":0,"ts":"2026-08-03T21:02:59.732Z","game":"whose","diff":"icons","cat":"All","selector":"#catLabel/#catOpts","label":"category-row-visibility","action":"inspect","ok":true,"effect":"catLabel=block, catOpts=flex, expected_visible=true, actual=true","errors":[]}
+{"run":0,"ts":"2026-08-03T21:02:59.931Z","game":"whose","diff":"icons","cat":"All","selector":"#diffOpts .opt[data-d=\"icons\"]","label":"diff-icons","action":"click","ok":true,"effect":"selected","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:00.124Z","game":"whose","diff":"icons","cat":"All","selector":"#catOpts .opt[data-c=\"All\"]","label":"cat-All","action":"click","ok":true,"effect":"selected","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:00.172Z","game":"whose","diff":"icons","cat":"All","selector":"#goBtn","label":"begin-button","action":"click","ok":true,"effect":"Begin clicked","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:00.173Z","game":"whose","diff":"icons","cat":"All","selector":"#play","label":"play-panel-appeared","action":"wait","ok":true,"effect":"play panel shown in 49ms","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:00.177Z","game":"whose","diff":"icons","cat":"All","selector":"https://upload.wikimedia.org/wikipedia/commons/0/04/Hitler%E2%80%99s_signature_%281944%29.svg","label":"round-1-image","action":"inspect","ok":false,"effect":"Image broken/404: https://upload.wikimedia.org/wikipedia/commons/0/04/Hitler%E2%80%99s_signature_%281944%29.svg","errors":["Image 404 or broken: https://upload.wikimedia.org/wikipedia/commons/0/04/Hitler%E2%80%99s_signature_%281944%29.svg"]}
+{"run":0,"ts":"2026-08-03T21:03:00.178Z","game":"whose","diff":"icons","cat":"All","selector":"#stage","label":"round-1-render","action":"inspect","ok":true,"effect":"stage_html_len=141, choices=4, imgs_ok=0, imgs_broken=1","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:00.643Z","game":"whose","diff":"icons","cat":"All","selector":".choice","label":"round-1-pick-0","action":"click","ok":true,"effect":"Chose: \"Benjamin Franklin\", reveal: \"✗ It was Adolf Hitler · their page →Next →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:00.889Z","game":"whose","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-1-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:01.306Z","game":"whose","diff":"icons","cat":"All","selector":"#stage","label":"round-2-render","action":"inspect","ok":true,"effect":"stage_html_len=128, choices=4, imgs_ok=1, imgs_broken=1","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:01.765Z","game":"whose","diff":"icons","cat":"All","selector":".choice","label":"round-2-pick-3","action":"click","ok":true,"effect":"Chose: \"Richard Wagner\", reveal: \"✓ Correct — Richard Wagner · their page →Next →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:02.014Z","game":"whose","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-2-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:02.426Z","game":"whose","diff":"icons","cat":"All","selector":"#stage","label":"round-3-render","action":"inspect","ok":true,"effect":"stage_html_len=123, choices=4, imgs_ok=2, imgs_broken=1","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:02.873Z","game":"whose","diff":"icons","cat":"All","selector":".choice","label":"round-3-pick-2","action":"click","ok":true,"effect":"Chose: \"James Joyce\", reveal: \"✗ It was Leonhard Euler · their page →Next →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:03.127Z","game":"whose","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-3-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:03.537Z","game":"whose","diff":"icons","cat":"All","selector":"#stage","label":"round-4-render","action":"inspect","ok":true,"effect":"stage_html_len=170, choices=4, imgs_ok=3, imgs_broken=1","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:03.988Z","game":"whose","diff":"icons","cat":"All","selector":".choice","label":"round-4-pick-0","action":"click","ok":true,"effect":"Chose: \"Edgar Allan Poe\", reveal: \"✗ It was Immanuel Kant · their page →Next →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:04.237Z","game":"whose","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-4-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:04.650Z","game":"whose","diff":"icons","cat":"All","selector":"#stage","label":"round-5-render","action":"inspect","ok":true,"effect":"stage_html_len=125, choices=4, imgs_ok=4, imgs_broken=1","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:05.097Z","game":"whose","diff":"icons","cat":"All","selector":".choice","label":"round-5-pick-3","action":"click","ok":true,"effect":"Chose: \"Vladimir Lenin\", reveal: \"✗ It was Victor Hugo · their page →Next →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:05.350Z","game":"whose","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-5-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:05.759Z","game":"whose","diff":"icons","cat":"All","selector":"#stage","label":"round-6-render","action":"inspect","ok":true,"effect":"stage_html_len=126, choices=4, imgs_ok=5, imgs_broken=1","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:06.212Z","game":"whose","diff":"icons","cat":"All","selector":".choice","label":"round-6-pick-2","action":"click","ok":true,"effect":"Chose: \"Richard Wagner\", reveal: \"✗ It was Albert Camus · their page →Next →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:06.475Z","game":"whose","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-6-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:06.882Z","game":"whose","diff":"icons","cat":"All","selector":"#stage","label":"round-7-render","action":"inspect","ok":true,"effect":"stage_html_len=130, choices=4, imgs_ok=6, imgs_broken=1","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:07.333Z","game":"whose","diff":"icons","cat":"All","selector":".choice","label":"round-7-pick-0","action":"click","ok":true,"effect":"Chose: \"Benito Mussolini\", reveal: \"✓ Correct — Benito Mussolini · their page →Next →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:07.586Z","game":"whose","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-7-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:07.996Z","game":"whose","diff":"icons","cat":"All","selector":"#stage","label":"round-8-render","action":"inspect","ok":true,"effect":"stage_html_len=127, choices=4, imgs_ok=7, imgs_broken=1","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:08.445Z","game":"whose","diff":"icons","cat":"All","selector":".choice","label":"round-8-pick-3","action":"click","ok":true,"effect":"Chose: \"Walt Disney\", reveal: \"✗ It was Louis Pasteur · their page →Next →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:08.699Z","game":"whose","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-8-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:09.113Z","game":"whose","diff":"icons","cat":"All","selector":"#stage","label":"round-9-render","action":"inspect","ok":true,"effect":"stage_html_len=122, choices=4, imgs_ok=8, imgs_broken=1","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:09.571Z","game":"whose","diff":"icons","cat":"All","selector":".choice","label":"round-9-pick-2","action":"click","ok":true,"effect":"Chose: \"George Orwell\", reveal: \"✗ It was Georg Wilhelm Friedrich Hegel · their page →Next →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:09.837Z","game":"whose","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-9-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:10.248Z","game":"whose","diff":"icons","cat":"All","selector":"#stage","label":"round-10-render","action":"inspect","ok":true,"effect":"stage_html_len=132, choices=4, imgs_ok=9, imgs_broken=1","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:10.711Z","game":"whose","diff":"icons","cat":"All","selector":".choice","label":"round-10-pick-0","action":"click","ok":true,"effect":"Chose: \"Niccolò Machiavelli\", reveal: \"✗ It was Franklin Delano Roosevelt · their page →See results\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:10.962Z","game":"whose","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-10-next","action":"click","ok":true,"effect":"Next text: \"See results\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:11.367Z","game":"whose","diff":"icons","cat":"All","selector":"#results","label":"results-screen","action":"inspect","ok":true,"effect":"score=20, verdict=\"Everyone starts somewhere.\", best=\"Best (whose · icons): 20\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:11.821Z","game":"whose","diff":"icons","cat":"All","selector":"#againBtn","label":"play-again","action":"click","ok":true,"effect":"Setup panel returned: true","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:12.913Z","game":"art","diff":"icons","cat":"All","selector":"#gamePick .gcard[data-g=\"art\"]","label":"game-card-art","action":"click","ok":true,"effect":"card selected","errors":["REQUEST_FAILED: POST https://www.google-analytics.com/g/collect?v=2&tid=G-2HEVP6TD0J&gtm=45je67u0v9260226174za200zd9260226174&_p=1785790978580&gcd=13l3l3l3l1l1&npa=0&dma=0&_eu=AAAAAAQ&are=1&cid=678713399.1785790979&frm=0&ngs=1&pscdl=noapi&rcb=18&sr=1600x900&uaa=arm&uab=64&uafvl=HeadlessChrome%3B149.0.7827.55%7CChromium%3B149.0.7827.55%7CNot)A%253BBrand%3B24.0.0.0&uam=&uamb=0&uap=macOS&uapv=26.4.0&uaw=0&ul=en-us&_s=2&tag_exp=115938465~115938468~118897920~118897930~119896803&sid=1785790978&sct=1&seg=1&dl=http%3A%2F%2Flocalhost%2Fgame&dt=The%20Signature%20Games%20%E2%80%94%20Celebrity%20Signatures&en=user_engagement&_et=13177&tfd=13394 — net::ERR_ABORTED"]}
+{"run":0,"ts":"2026-08-03T21:03:12.917Z","game":"art","diff":"icons","cat":"All","selector":"#catLabel/#catOpts","label":"category-row-visibility","action":"inspect","ok":true,"effect":"catLabel=none, catOpts=none, expected_visible=false, actual=false","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:13.110Z","game":"art","diff":"icons","cat":"All","selector":"#diffOpts .opt[data-d=\"icons\"]","label":"diff-icons","action":"click","ok":true,"effect":"selected","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:13.154Z","game":"art","diff":"icons","cat":"All","selector":"#goBtn","label":"begin-button","action":"click","ok":true,"effect":"Begin clicked","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:14.665Z","game":"art","diff":"icons","cat":"All","selector":"#play","label":"play-panel-appeared","action":"wait","ok":true,"effect":"play panel shown in 1554ms","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:14.670Z","game":"art","diff":"icons","cat":"All","selector":"#stage","label":"round-1-render","action":"inspect","ok":true,"effect":"stage_html_len=152, choices=4, imgs_ok=1, imgs_broken=0","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:15.113Z","game":"art","diff":"icons","cat":"All","selector":".choice","label":"round-1-pick-0","action":"click","ok":true,"effect":"Chose: \"Gustav Klimt\", reveal: \"✗ It was Henri de Toulouse-Lautrec · “Old Man and Young Girl”, 1899 → · their pa\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:15.115Z","game":"art","diff":"icons","cat":"All","selector":"#reveal a","label":"round-1-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/86204","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:15.364Z","game":"art","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-1-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:15.770Z","game":"art","diff":"icons","cat":"All","selector":"#stage","label":"round-2-render","action":"inspect","ok":true,"effect":"stage_html_len=152, choices=4, imgs_ok=2, imgs_broken=0","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:16.208Z","game":"art","diff":"icons","cat":"All","selector":".choice","label":"round-2-pick-3","action":"click","ok":true,"effect":"Chose: \"Tristan Tzara\", reveal: \"✗ It was Piet Mondrian · “Farm near Duivendrecht”, c. 1916 → · their page →Next \"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:16.208Z","game":"art","diff":"icons","cat":"All","selector":"#reveal a","label":"round-2-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/144467","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:16.460Z","game":"art","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-2-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:16.866Z","game":"art","diff":"icons","cat":"All","selector":"#stage","label":"round-3-render","action":"inspect","ok":true,"effect":"stage_html_len=152, choices=4, imgs_ok=3, imgs_broken=0","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:17.321Z","game":"art","diff":"icons","cat":"All","selector":".choice","label":"round-3-pick-2","action":"click","ok":true,"effect":"Chose: \"Paul Cézanne\", reveal: \"✗ It was Émile Zola · “L'Assommoir”, 1878 → · their page →Next →\"","errors":["REQUEST_FAILED: POST https://www.google-analytics.com/g/collect?v=2&tid=G-2HEVP6TD0J&gtm=45je67u0v9260226174za200zd9260226174&_p=1785790991837&gcd=13l3l3l3l1l1&npa=0&dma=0&_eu=AAAAAAQ&are=1&cid=678713399.1785790979&frm=0&ngs=1&pscdl=noapi&rcb=19&sr=1600x900&uaa=arm&uab=64&uafvl=HeadlessChrome%3B149.0.7827.55%7CChromium%3B149.0.7827.55%7CNot)A%253BBrand%3B24.0.0.0&uam=&uamb=0&uap=macOS&uapv=26.4.0&uaw=0&ul=en-us&_s=1&tag_exp=115938466~115938468~118395335~118897920~118897930~119527019~119896803&sid=1785790978&sct=1&seg=1&dl=http%3A%2F%2Flocalhost%2Fgame&dt=The%20Signature%20Games%20%E2%80%94%20Celebrity%20Signatures&en=page_view&_ee=1&tfd=5033 — net::ERR_ABORTED"]}
+{"run":0,"ts":"2026-08-03T21:03:17.323Z","game":"art","diff":"icons","cat":"All","selector":"#reveal a","label":"round-3-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/69746","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:17.585Z","game":"art","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-3-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:17.992Z","game":"art","diff":"icons","cat":"All","selector":"#stage","label":"round-4-render","action":"inspect","ok":true,"effect":"stage_html_len=152, choices=4, imgs_ok=4, imgs_broken=0","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:18.432Z","game":"art","diff":"icons","cat":"All","selector":".choice","label":"round-4-pick-0","action":"click","ok":true,"effect":"Chose: \"Napoleon III\", reveal: \"✗ It was William Blake · “Colinet Mocked by Two Boys, from The Pastorals of Virg\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:18.434Z","game":"art","diff":"icons","cat":"All","selector":"#reveal a","label":"round-4-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/18286","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:18.698Z","game":"art","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-4-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:19.104Z","game":"art","diff":"icons","cat":"All","selector":"#stage","label":"round-5-render","action":"inspect","ok":true,"effect":"stage_html_len=152, choices=4, imgs_ok=5, imgs_broken=0","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:19.542Z","game":"art","diff":"icons","cat":"All","selector":".choice","label":"round-5-pick-3","action":"click","ok":true,"effect":"Chose: \"Edgar Degas\", reveal: \"✗ It was Edvard Munch · “Consolation”, 1894 → · their page →Next →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:19.543Z","game":"art","diff":"icons","cat":"All","selector":"#reveal a","label":"round-5-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/17215","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:19.794Z","game":"art","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-5-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:20.200Z","game":"art","diff":"icons","cat":"All","selector":"#stage","label":"round-6-render","action":"inspect","ok":true,"effect":"stage_html_len=152, choices=4, imgs_ok=6, imgs_broken=0","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:20.639Z","game":"art","diff":"icons","cat":"All","selector":".choice","label":"round-6-pick-2","action":"click","ok":true,"effect":"Chose: \"Beatrix Potter\", reveal: \"✗ It was Dante Gabriel Rossetti · “Full-length Portrait of a Woman”, 1846 → · th\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:20.639Z","game":"art","diff":"icons","cat":"All","selector":"#reveal a","label":"round-6-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/49424","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:20.889Z","game":"art","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-6-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:21.295Z","game":"art","diff":"icons","cat":"All","selector":"#stage","label":"round-7-render","action":"inspect","ok":true,"effect":"stage_html_len=152, choices=4, imgs_ok=7, imgs_broken=0","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:21.737Z","game":"art","diff":"icons","cat":"All","selector":".choice","label":"round-7-pick-0","action":"click","ok":true,"effect":"Chose: \"Franz Marc\", reveal: \"✗ It was Gustave Doré · “La Rue de la Vieille Lanterne: The Suicide of Gérard de\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:21.739Z","game":"art","diff":"icons","cat":"All","selector":"#reveal a","label":"round-7-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/105494","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:21.987Z","game":"art","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-7-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:22.102Z","selector":".card:first-child","label":"stat callout $10/50%","action":"check","ok":true,"effect":"$10=true 50%=true","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:22.104Z","selector":"#authForms","label":"auth initial state","action":"check","ok":true,"effect":"{\"authFormsVisible\":true,\"whoamiVisible\":false,\"uploadCardVisible\":false,\"dashCardVisible\":false,\"authMsg\":\"\",\"upMsg\":\"\",\"whoEmail\":\"\",\"totalEarned\":\"$0.00\",\"dashRows\":\"\",\"attestChecked\":false,\"previewVisible\":false}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:22.104Z","selector":"#uploadCard,#dashCard","label":"cards hidden when logged out","action":"check","ok":true,"effect":"upload=false dash=false","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:22.392Z","game":"art","diff":"icons","cat":"All","selector":"#stage","label":"round-8-render","action":"inspect","ok":true,"effect":"stage_html_len=152, choices=4, imgs_ok=8, imgs_broken=0","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:22.835Z","game":"art","diff":"icons","cat":"All","selector":".choice","label":"round-8-pick-3","action":"click","ok":true,"effect":"Chose: \"Johannes Vermeer\", reveal: \"✗ It was Pierre-Auguste Renoir · “Two Sisters (On the Terrace)”, 1881 → · their \"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:22.837Z","game":"art","diff":"icons","cat":"All","selector":"#reveal a","label":"round-8-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/14655","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:23.084Z","game":"art","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-8-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:23.490Z","game":"art","diff":"icons","cat":"All","selector":"#stage","label":"round-9-render","action":"inspect","ok":true,"effect":"stage_html_len=152, choices=4, imgs_ok=9, imgs_broken=0","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:23.929Z","game":"art","diff":"icons","cat":"All","selector":".choice","label":"round-9-pick-2","action":"click","ok":true,"effect":"Chose: \"Henri Matisse\", reveal: \"✓ Correct — Henri Matisse · “Woman before an Aquarium”, 1921–23 → · their page →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:23.930Z","game":"art","diff":"icons","cat":"All","selector":"#reveal a","label":"round-9-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/27984","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:23.993Z","selector":"#signupBtn","label":"Create account","action":"click","ok":true,"effect":"account created","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:23.996Z","selector":"#uploadCard,#dashCard","label":"cards visible after sign in","action":"check","ok":true,"effect":"upload=true dash=true whoEmail=screenrec-test@example.com","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:23.997Z","selector":"#dashTable","label":"dashboard table state","action":"check","ok":true,"effect":"rows=\"no uploads yet\" totalEarned=\"$0.00\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:24.182Z","game":"art","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-9-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:24.588Z","game":"art","diff":"icons","cat":"All","selector":"#stage","label":"round-10-render","action":"inspect","ok":true,"effect":"stage_html_len=152, choices=4, imgs_ok=10, imgs_broken=0","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:24.892Z","selector":"#uploadBtn","label":"submit with no file (validation)","action":"click","ok":true,"effect":"upMsg=\"choose a signature file first\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:25.026Z","game":"art","diff":"icons","cat":"All","selector":".choice","label":"round-10-pick-0","action":"click","ok":true,"effect":"Chose: \"Edgar Degas\", reveal: \"✗ It was Gustav Klimt · “Seated Woman from the Front with Hat, Face Hooded”, 191\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:25.027Z","game":"art","diff":"icons","cat":"All","selector":"#reveal a","label":"round-10-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/180671","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:25.279Z","game":"art","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-10-next","action":"click","ok":true,"effect":"Next text: \"See results\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:25.627Z","selector":"#uploadBtn","label":"submit with attest but no file","action":"click","ok":true,"effect":"upMsg=\"choose a signature file first\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:25.683Z","game":"art","diff":"icons","cat":"All","selector":"#results","label":"results-screen","action":"inspect","ok":true,"effect":"score=10, verdict=\"Everyone starts somewhere.\", best=\"Best (art · icons): 10\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:25.882Z","selector":"#attest","label":"attest checkbox toggle","action":"click","ok":true,"effect":"before=false after=true","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:26.092Z","selector":"#celebName","label":"celebName text input","action":"fill","ok":true,"effect":"value=\"Test Celebrity Name\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:26.094Z","selector":"#sigFile","label":"file input existence + accept attr","action":"check","ok":true,"effect":"accept=\"image/png,image/jpeg,image/svg+xml\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:26.139Z","game":"art","diff":"icons","cat":"All","selector":"#againBtn","label":"play-again","action":"click","ok":true,"effect":"Setup panel returned: true","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:26.634Z","selector":"/api/signatures","label":"API data check","action":"fetch","ok":true,"effect":"{\"ok\":true,\"count\":7076,\"status\":200}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:26.637Z","selector":"/api/signature-evolution","label":"API evo check","action":"fetch","ok":true,"effect":"{\"ok\":true,\"keyCount\":162,\"status\":200}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:26.902Z","selector":"#sigFile","label":"file input setInputFiles (fake PNG)","action":"setFile","ok":true,"effect":"preview=true dataUrlSet=true","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:27.217Z","game":"match","diff":"icons","cat":"All","selector":"#gamePick .gcard[data-g=\"match\"]","label":"game-card-match","action":"click","ok":true,"effect":"card selected","errors":["REQUEST_FAILED: POST https://www.google-analytics.com/g/collect?v=2&tid=G-2HEVP6TD0J&gtm=45je67u0v9260226174za200zd9260226174&_p=1785790991837&gcd=13l3l3l3l1l1&npa=0&dma=0&_eu=AAAAAAQ&are=1&cid=678713399.1785790979&frm=0&ngs=1&pscdl=noapi&rcb=19&sr=1600x900&uaa=arm&uab=64&uafvl=HeadlessChrome%3B149.0.7827.55%7CChromium%3B149.0.7827.55%7CNot)A%253BBrand%3B24.0.0.0&uam=&uamb=0&uap=macOS&uapv=26.4.0&uaw=0&ul=en-us&_s=2&tag_exp=115938466~115938468~118395335~118897920~118897930~119527019~119896803&sid=1785790978&sct=1&seg=1&dl=http%3A%2F%2Flocalhost%2Fgame&dt=The%20Signature%20Games%20%E2%80%94%20Celebrity%20Signatures&en=user_engagement&_et=14286&tfd=14320 — net::ERR_ABORTED"]}
+{"run":0,"ts":"2026-08-03T21:03:27.221Z","game":"match","diff":"icons","cat":"All","selector":"#catLabel/#catOpts","label":"category-row-visibility","action":"inspect","ok":true,"effect":"catLabel=none, catOpts=none, expected_visible=false, actual=false","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:27.417Z","game":"match","diff":"icons","cat":"All","selector":"#diffOpts .opt[data-d=\"icons\"]","label":"diff-icons","action":"click","ok":true,"effect":"selected","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:27.433Z","selector":"#uploadBtn","label":"submit with file but no attest","action":"click","ok":true,"effect":"upMsg=\"the attestation checkbox is required\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:27.460Z","game":"match","diff":"icons","cat":"All","selector":"#goBtn","label":"begin-button","action":"click","ok":true,"effect":"Begin clicked","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:27.618Z","selector":"#layoutChips .chip[data-l=\"gallery\"]","label":"Layout switch: Gallery","action":"click","ok":true,"effect":"body[data-layout]=gallery, cards=7076","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:28.273Z","selector":"#layoutChips .chip[data-l=\"float\"]","label":"Layout switch: Float","action":"click","ok":true,"effect":"body[data-layout]=float, cards=7076","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:29.130Z","selector":"#layoutChips .chip[data-l=\"plaque\"]","label":"Layout switch: Plaque","action":"click","ok":true,"effect":"body[data-layout]=plaque, cards=7076","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:29.787Z","selector":"#layoutChips .chip[data-l=\"ledger\"]","label":"Layout switch: Ledger","action":"click","ok":true,"effect":"body[data-layout]=ledger, cards=7076","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:29.892Z","selector":"#uploadBtn","label":"submit with file + attest (real upload)","action":"click","ok":false,"effect":"upMsg=\"file must be 0.5KB–3MB\"","errors":[{"type":"console.error","text":"Failed to load resource: the server responded with a status of 400 (Bad Request)"}]}
+{"run":0,"ts":"2026-08-03T21:03:30.426Z","selector":"#layoutChips .chip[data-l=\"vitrine\"]","label":"Layout switch: Vitrine","action":"click","ok":true,"effect":"body[data-layout]=vitrine, cards=7076","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:30.895Z","selector":"#dashTable","label":"dashboard after upload","action":"check","ok":true,"effect":"rows=\"no uploads yet\" earned=\"$0.00\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:30.981Z","game":"match","diff":"icons","cat":"All","selector":"#play","label":"play-panel-appeared","action":"wait","ok":true,"effect":"play panel shown in 3563ms","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:30.986Z","game":"match","diff":"icons","cat":"All","selector":"#stage","label":"round-1-render","action":"inspect","ok":true,"effect":"stage_html_len=127, choices=4, imgs_ok=1, imgs_broken=0","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:31.446Z","game":"match","diff":"icons","cat":"All","selector":".choice","label":"round-1-pick-0","action":"click","ok":true,"effect":"Chose: \"\", reveal: \"✗ Their piece was “Cervus Virginianus” → by John James AudubonNext →\"","errors":["REQUEST_FAILED: POST https://www.google-analytics.com/g/collect?v=2&tid=G-2HEVP6TD0J&gtm=45je67u0v9260226174za200zd9260226174&_p=1785791006145&gcd=13l3l3l3l1l1&npa=0&dma=0&_eu=AAAAAAQ&are=1&cid=678713399.1785790979&frm=0&ngs=1&pscdl=noapi&rcb=9&sr=1600x900&uaa=arm&uab=64&uafvl=HeadlessChrome%3B149.0.7827.55%7CChromium%3B149.0.7827.55%7CNot)A%253BBrand%3B24.0.0.0&uam=&uamb=0&uap=macOS&uapv=26.4.0&uaw=0&ul=en-us&_s=1&tag_exp=115938466~115938468~118897920~118897930~119527019~119896802~120222307&sid=1785790978&sct=1&seg=1&dl=http%3A%2F%2Flocalhost%2Fgame&dt=The%20Signature%20Games%20%E2%80%94%20Celebrity%20Signatures&en=page_view&_ee=1&tfd=5014 — net::ERR_ABORTED"]}
+{"run":0,"ts":"2026-08-03T21:03:31.447Z","game":"match","diff":"icons","cat":"All","selector":"#reveal a","label":"round-1-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/104328","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:31.696Z","game":"match","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-1-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:32.102Z","game":"match","diff":"icons","cat":"All","selector":"#stage","label":"round-2-render","action":"inspect","ok":true,"effect":"stage_html_len=129, choices=4, imgs_ok=2, imgs_broken=0","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:32.448Z","selector":"#logoutLink","label":"sign out link","action":"click","ok":true,"effect":"forms=true whoami=false","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:32.542Z","game":"match","diff":"icons","cat":"All","selector":".choice","label":"round-2-pick-3","action":"click","ok":true,"effect":"Chose: \"\", reveal: \"✗ Their piece was “Virgin and Child with Two Angels” → by Sandro BotticelliNext \"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:32.543Z","game":"match","diff":"icons","cat":"All","selector":"#reveal a","label":"round-2-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/80526","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:32.793Z","game":"match","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-2-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:33.199Z","game":"match","diff":"icons","cat":"All","selector":"#stage","label":"round-3-render","action":"inspect","ok":true,"effect":"stage_html_len=135, choices=4, imgs_ok=3, imgs_broken=0","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:33.460Z","selector":"#layoutChips .chip[data-l=\"wall\"]","label":"Layout switch: Wall","action":"click","ok":true,"effect":"body[data-layout]=wall, cards=7076","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:33.638Z","game":"match","diff":"icons","cat":"All","selector":".choice","label":"round-3-pick-2","action":"click","ok":true,"effect":"Chose: \"\", reveal: \"✗ Their piece was “Old Man and Young Girl” → by Henri de Toulouse-LautrecNext →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:33.639Z","game":"match","diff":"icons","cat":"All","selector":"#reveal a","label":"round-3-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/86204","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:33.890Z","game":"match","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-3-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:33.991Z","selector":"#loginBtn","label":"sign back in after logout","action":"click","ok":true,"effect":"msg=\"signed in\" whoEmail=\"screenrec-test@example.com\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:34.015Z","selector":"h1 a","label":"back to gallery link","action":"check","ok":true,"effect":"href=\"/\" text=\"← back to the gallery\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:34.297Z","game":"match","diff":"icons","cat":"All","selector":"#stage","label":"round-4-render","action":"inspect","ok":true,"effect":"stage_html_len=141, choices=4, imgs_ok=4, imgs_broken=0","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:34.434Z","selector":"a.logo","label":"Logo link (home) [nav-checked, not followed]","action":"check-href","ok":true,"effect":"href=/, element exists: true","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:34.738Z","game":"match","diff":"icons","cat":"All","selector":".choice","label":"round-4-pick-0","action":"click","ok":true,"effect":"Chose: \"\", reveal: \"✓ Correct — “Beata Beatrix” → by Dante Gabriel RossettiNext →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:34.739Z","game":"match","diff":"icons","cat":"All","selector":"#reveal a","label":"round-4-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/16551","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:34.435Z","selector":"#q","label":"Search box — type \"monet\"","action":"type","value":"monet","ok":true,"effect":"cards visible: 1, empty hidden: true","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:34.988Z","game":"match","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-4-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:34.816Z","selector":"#q","label":"Search box — type \"kahlo\"","action":"type","value":"kahlo","ok":true,"effect":"cards visible: 1, empty hidden: true","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:35.394Z","game":"match","diff":"icons","cat":"All","selector":"#stage","label":"round-5-render","action":"inspect","ok":true,"effect":"stage_html_len=127, choices=4, imgs_ok=5, imgs_broken=0","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:35.140Z","selector":"#q","label":"Search box — type \"xyzzy\" (no results)","action":"type","value":"xyzzy","ok":true,"effect":"cards visible: 0, empty hidden: false","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:35.834Z","game":"match","diff":"icons","cat":"All","selector":".choice","label":"round-5-pick-3","action":"click","ok":true,"effect":"Chose: \"\", reveal: \"✗ Their piece was “River Estuary” → by Nicolas PoussinNext →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:35.835Z","game":"match","diff":"icons","cat":"All","selector":"#reveal a","label":"round-5-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/81403","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:35.459Z","selector":"#q","label":"Search box — clear","action":"clear","ok":true,"effect":"cleared; cards: 7076","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:35.980Z","selector":"nav.gnav a[href=\"/murals\"]","label":"Nav: Murals [nav-checked, not followed]","action":"check-href","ok":true,"effect":"href=/murals, element exists: true","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:36.000Z","selector":"nav.gnav a[href=\"/game\"]","label":"Nav: Games [nav-checked, not followed]","action":"check-href","ok":true,"effect":"href=/game, element exists: true","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:36.017Z","selector":"nav.gnav a[href=\"/upload\"]","label":"Nav: Upload yours [nav-checked, not followed]","action":"check-href","ok":true,"effect":"href=/upload, element exists: true","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:36.085Z","game":"match","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-5-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:36.490Z","game":"match","diff":"icons","cat":"All","selector":"#stage","label":"round-6-render","action":"inspect","ok":true,"effect":"stage_html_len=145, choices=4, imgs_ok=6, imgs_broken=0","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:36.018Z","selector":"#burger","label":"Hamburger — open drawer","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":false,\"popOpen\":false,\"url\":\"http://localhost:9920/\"},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cardCount\":7076}}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:36.930Z","game":"match","diff":"icons","cat":"All","selector":".choice","label":"round-6-pick-2","action":"click","ok":true,"effect":"Chose: \"\", reveal: \"✗ Their piece was “Remembrance of Italy” → by Jean-Baptiste Camille CorotNext →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:36.931Z","game":"match","diff":"icons","cat":"All","selector":"#reveal a","label":"round-6-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/27","errors":[]}
+{"run":1,"ts":"2026-08-03T21:03:37.045Z","selector":".card:first-child","label":"stat callout $10/50%","action":"check","ok":true,"effect":"$10=true 50%=true","errors":[]}
+{"run":1,"ts":"2026-08-03T21:03:37.046Z","selector":"#authForms","label":"auth initial state","action":"check","ok":true,"effect":"{\"authFormsVisible\":true,\"whoamiVisible\":false,\"uploadCardVisible\":false,\"dashCardVisible\":false,\"authMsg\":\"\",\"upMsg\":\"\",\"whoEmail\":\"\",\"totalEarned\":\"$0.00\",\"dashRows\":\"\",\"attestChecked\":false,\"previewVisible\":false}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:03:37.047Z","selector":"#uploadCard,#dashCard","label":"cards hidden when logged out","action":"check","ok":true,"effect":"upload=false dash=false","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:37.182Z","game":"match","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-6-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:37.588Z","game":"match","diff":"icons","cat":"All","selector":"#stage","label":"round-7-render","action":"inspect","ok":true,"effect":"stage_html_len=133, choices=4, imgs_ok=7, imgs_broken=0","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:38.043Z","game":"match","diff":"icons","cat":"All","selector":".choice","label":"round-7-pick-0","action":"click","ok":true,"effect":"Chose: \"\", reveal: \"✓ Correct — “Colinet Mocked by Two Boys, from The Pastorals of Virgil” → by Will\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:38.044Z","game":"match","diff":"icons","cat":"All","selector":"#reveal a","label":"round-7-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/18286","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:38.294Z","game":"match","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-7-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:38.698Z","game":"match","diff":"icons","cat":"All","selector":"#stage","label":"round-8-render","action":"inspect","ok":true,"effect":"stage_html_len=132, choices=4, imgs_ok=8, imgs_broken=0","errors":[]}
+{"run":1,"ts":"2026-08-03T21:03:38.935Z","selector":"#loginBtn","label":"Sign in","action":"click","ok":true,"effect":"signed in","errors":[]}
+{"run":1,"ts":"2026-08-03T21:03:38.936Z","selector":"#uploadCard,#dashCard","label":"cards visible after sign in","action":"check","ok":true,"effect":"upload=true dash=true whoEmail=screenrec-test@example.com","errors":[]}
+{"run":1,"ts":"2026-08-03T21:03:38.936Z","selector":"#dashTable","label":"dashboard table state","action":"check","ok":true,"effect":"rows=\"no uploads yet\" totalEarned=\"$0.00\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:39.139Z","game":"match","diff":"icons","cat":"All","selector":".choice","label":"round-8-pick-3","action":"click","ok":true,"effect":"Chose: \"\", reveal: \"✗ Their piece was “Mahana no atua (Day of the God)” → by Paul GauguinNext →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:39.140Z","game":"match","diff":"icons","cat":"All","selector":"#reveal a","label":"round-8-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/27943","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:39.390Z","game":"match","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-8-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:03:39.467Z","selector":"#celebName","label":"celebName text input","action":"fill","ok":true,"effect":"value=\"Test Celebrity Name\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:03:39.674Z","selector":"#attest","label":"attest checkbox toggle","action":"click","ok":true,"effect":"before=false after=true","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:39.796Z","game":"match","diff":"icons","cat":"All","selector":"#stage","label":"round-9-render","action":"inspect","ok":true,"effect":"stage_html_len=126, choices=4, imgs_ok=9, imgs_broken=0","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:40.236Z","game":"match","diff":"icons","cat":"All","selector":".choice","label":"round-9-pick-2","action":"click","ok":true,"effect":"Chose: \"\", reveal: \"✗ Their piece was “The Capture of Samson” → by Peter Paul RubensNext →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:40.237Z","game":"match","diff":"icons","cat":"All","selector":"#reveal a","label":"round-9-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/8953","errors":[]}
+{"run":1,"ts":"2026-08-03T21:03:40.420Z","selector":"#uploadBtn","label":"submit with attest but no file","action":"click","ok":true,"effect":"upMsg=\"choose a signature file first\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:40.487Z","game":"match","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-9-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:40.894Z","game":"match","diff":"icons","cat":"All","selector":"#stage","label":"round-10-render","action":"inspect","ok":true,"effect":"stage_html_len=282, choices=4, imgs_ok=10, imgs_broken=0","errors":[]}
+{"run":1,"ts":"2026-08-03T21:03:41.003Z","selector":"#uploadBtn","label":"submit with no file (validation)","action":"click","ok":true,"effect":"upMsg=\"choose a signature file first\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:03:41.004Z","selector":"#sigFile","label":"file input existence + accept attr","action":"check","ok":true,"effect":"accept=\"image/png,image/jpeg,image/svg+xml\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:41.334Z","game":"match","diff":"icons","cat":"All","selector":".choice","label":"round-10-pick-0","action":"click","ok":true,"effect":"Chose: \"\", reveal: \"✗ Their piece was “Study of a Landscape” → by Louis DaguerreSee results\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:41.335Z","game":"match","diff":"icons","cat":"All","selector":"#reveal a","label":"round-10-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/39524","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:41.586Z","game":"match","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-10-next","action":"click","ok":true,"effect":"Next text: \"See results\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:36.554Z","selector":"a.hbtn[href=\"#collection\"]","label":"Hero CTA: Browse the collection","action":"click","ok":false,"effect":"ERROR: locator.click: Timeout 5000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('a.hbtn[href=\"#collection\"]').first()\u001b[22m\n\u001b[2m    - locator resolved to <a class=\"hbtn\" href=\"#collection\">Browse the col","errors":["locator.click: Timeout 5000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('a.hbtn[href=\"#collection\"]').first()\u001b[22m\n\u001b[2m    - locator resolved to <a class=\"hbtn\" href=\"#collection\">Browse the collection</a>\u001b[22m\n\u001b[2m  - attempting click action\u001b[22m\n\u001b[2m    2 × waiting for element to be visible,"]}
+{"run":0,"ts":"2026-08-03T21:03:41.607Z","selector":"a.hbtn[href=\"/murals\"]","label":"Hero CTA: Order a mural [nav-checked, not followed]","action":"check-href","ok":true,"effect":"href=/murals, element exists: true","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:41.650Z","selector":"a.hbtn[href=\"/game\"]","label":"Hero CTA: Play the games [nav-checked, not followed]","action":"check-href","ok":true,"effect":"href=/game, element exists: true","errors":[]}
+{"run":1,"ts":"2026-08-03T21:03:41.809Z","selector":"#sigFile","label":"file input setInputFiles (fake PNG)","action":"setFile","ok":true,"effect":"preview=true dataUrlSet=true","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:41.989Z","game":"match","diff":"icons","cat":"All","selector":"#results","label":"results-screen","action":"inspect","ok":true,"effect":"score=20, verdict=\"Everyone starts somewhere.\", best=\"Best (match · icons): 20\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:41.650Z","selector":"#drawerX","label":"Drawer × close button","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\"},\"after\":{\"drawerOpen\":false,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cardCount\":7076}}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:03:42.336Z","selector":"#uploadBtn","label":"submit with file but no attest","action":"click","ok":true,"effect":"upMsg=\"the attestation checkbox is required\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:42.444Z","game":"match","diff":"icons","cat":"All","selector":"#againBtn","label":"play-again","action":"click","ok":true,"effect":"Setup panel returned: true","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:42.216Z","selector":"#dback","label":"Drawer backdrop click","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\"},\"after\":{\"drawerOpen\":false,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cardCount\":7076}}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:43.523Z","game":"early","diff":"icons","cat":"All","selector":"#gamePick .gcard[data-g=\"early\"]","label":"game-card-early","action":"click","ok":true,"effect":"card selected","errors":["REQUEST_FAILED: POST https://www.google-analytics.com/g/collect?v=2&tid=G-2HEVP6TD0J&gtm=45je67u0v9260226174za200zd9260226174&_p=1785791006145&gcd=13l3l3l3l1l1&npa=0&dma=0&_eu=AAAAAAQ&are=1&cid=678713399.1785790979&frm=0&ngs=1&pscdl=noapi&rcb=9&sr=1600x900&uaa=arm&uab=64&uafvl=HeadlessChrome%3B149.0.7827.55%7CChromium%3B149.0.7827.55%7CNot)A%253BBrand%3B24.0.0.0&uam=&uamb=0&uap=macOS&uapv=26.4.0&uaw=0&ul=en-us&_s=2&tag_exp=115938466~115938468~118897920~118897930~119527019~119896802~120222307&sid=1785790978&sct=1&seg=1&dl=http%3A%2F%2Flocalhost%2Fgame&dt=The%20Signature%20Games%20%E2%80%94%20Celebrity%20Signatures&en=user_engagement&_et=16295&tfd=16309 — net::ERR_ABORTED"]}
+{"run":0,"ts":"2026-08-03T21:03:43.527Z","game":"early","diff":"icons","cat":"All","selector":"#catLabel/#catOpts","label":"category-row-visibility","action":"inspect","ok":true,"effect":"catLabel=none, catOpts=none, expected_visible=false, actual=false","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:43.724Z","game":"early","diff":"icons","cat":"All","selector":"#diffOpts .opt[data-d=\"icons\"]","label":"diff-icons","action":"click","ok":true,"effect":"selected","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:43.768Z","game":"early","diff":"icons","cat":"All","selector":"#goBtn","label":"begin-button","action":"click","ok":true,"effect":"Begin clicked","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:43.769Z","game":"early","diff":"icons","cat":"All","selector":"#play","label":"play-panel-appeared","action":"wait","ok":true,"effect":"play panel shown in 45ms","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:43.772Z","game":"early","diff":"icons","cat":"All","selector":"https://commons.wikimedia.org/wiki/Special:FilePath/Basel%202012-08%20Mattes%201%20(227).JPG?width=400","label":"round-1-image","action":"inspect","ok":false,"effect":"Image broken/404: https://commons.wikimedia.org/wiki/Special:FilePath/Basel%202012-08%20Mattes%201%20(227).JPG?width=400","errors":["Image 404 or broken: https://commons.wikimedia.org/wiki/Special:FilePath/Basel%202012-08%20Mattes%201%20(227).JPG?width=400"]}
+{"run":0,"ts":"2026-08-03T21:03:43.774Z","game":"early","diff":"icons","cat":"All","selector":"https://commons.wikimedia.org/wiki/Special:FilePath/Alexis%20Rudier%20Fondeur%20%C3%80%20Paris.%20Written%20on%20the%20bust%20of%20Bellona%20by%20Auguste%20Rodin%2C%201879.%20Nationalmuseum%2C%20Stockholm%2C%20Sweden.jpg?width=400","label":"round-1-image","action":"inspect","ok":false,"effect":"Image broken/404: https://commons.wikimedia.org/wiki/Special:FilePath/Alexis%20Rudier%20Fondeur%20%C3%80%20Paris.%20Written%20on%20the%20bust%20of%20Bellona%20by%20Auguste%20Rodin%2C%201879.%20Nationalmuseum%2C%20Stockholm%2C%20Sweden.jpg?width=400","errors":["Image 404 or broken: https://commons.wikimedia.org/wiki/Special:FilePath/Alexis%20Rudier%20Fondeur%20%C3%80%20Paris.%20Written%20on%20the%20bust%20of%20Bellona%20by%20Auguste%20Rodin%2C%201879.%20Nationalmuseum%2C%20Stockholm%2C%20Sweden.jpg?width=400"]}
+{"run":0,"ts":"2026-08-03T21:03:43.774Z","game":"early","diff":"icons","cat":"All","selector":"#stage","label":"round-1-render","action":"inspect","ok":true,"effect":"stage_html_len=582, choices=2, imgs_ok=0, imgs_broken=2","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:43.200Z","selector":".drawer .tab[data-v=\"grid\"]","label":"Drawer tab: Grid","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\"},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cardCount\":7076}}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:44.223Z","game":"early","diff":"icons","cat":"All","selector":".choice","label":"round-1-pick-0","action":"click","ok":true,"effect":"Chose: \"A is earlier\", reveal: \"✗ Alexis Rudier: B is from 1879, the other from 2012 · see the timeline →Next →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:44.474Z","game":"early","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-1-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:44.162Z","selector":".drawer .tab[data-v=\"collages\"]","label":"Drawer tab: Collages","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\"},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cardCount\":7076}}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:44.682Z","selector":".d-links a[href=\"/murals\"]","label":"Drawer link: Signature murals [nav-checked, not followed]","action":"check-href","ok":true,"effect":"href=/murals, element exists: true","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:44.698Z","selector":".d-links a[href=\"/game\"]","label":"Drawer link: The Signature Games [nav-checked, not followed]","action":"check-href","ok":true,"effect":"href=/game, element exists: true","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:44.712Z","selector":".d-links a[href=\"/upload\"]","label":"Drawer link: Upload your signature [nav-checked, not followed]","action":"check-href","ok":true,"effect":"href=/upload, element exists: true","errors":[]}
+{"run":1,"ts":"2026-08-03T21:03:44.782Z","selector":"#uploadBtn","label":"submit with file + attest (real upload)","action":"click","ok":false,"effect":"upMsg=\"file must be 0.5KB–3MB\"","errors":[{"type":"console.error","text":"Failed to load resource: the server responded with a status of 400 (Bad Request)"}]}
+{"run":0,"ts":"2026-08-03T21:03:44.882Z","game":"early","diff":"icons","cat":"All","selector":"#stage","label":"round-2-render","action":"inspect","ok":true,"effect":"stage_html_len=499, choices=2, imgs_ok=2, imgs_broken=2","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:45.322Z","game":"early","diff":"icons","cat":"All","selector":".choice","label":"round-2-pick-1","action":"click","ok":true,"effect":"Chose: \"B is earlier\", reveal: \"✓ Correct — Alfred Stevens: B is from 1867, the other from 2000 · see the timeli\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:45.574Z","game":"early","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-2-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:03:45.785Z","selector":"#dashTable","label":"dashboard after upload","action":"check","ok":true,"effect":"rows=\"no uploads yet\" earned=\"$0.00\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:45.979Z","game":"early","diff":"icons","cat":"All","selector":"https://commons.wikimedia.org/wiki/Special:FilePath/Message%20of%20President%20Theodore%20Roosevelt%20nominating%20Elihu%20Root%20to%20be%20Secretary%20of%20State%2C%2012-06-1905%20-%20NARA%20-%20306342.tif?width=400","label":"round-3-image","action":"inspect","ok":false,"effect":"Image broken/404: https://commons.wikimedia.org/wiki/Special:FilePath/Message%20of%20President%20Theodore%20Roosevelt%20nominating%20Elihu%20Root%20to%20be%20Secretary%20of%20State%2C%2012-06-1905%20-%20NARA%20-%20306342.tif?width=400","errors":["Image 404 or broken: https://commons.wikimedia.org/wiki/Special:FilePath/Message%20of%20President%20Theodore%20Roosevelt%20nominating%20Elihu%20Root%20to%20be%20Secretary%20of%20State%2C%2012-06-1905%20-%20NARA%20-%20306342.tif?width=400"]}
+{"run":0,"ts":"2026-08-03T21:03:45.981Z","game":"early","diff":"icons","cat":"All","selector":"https://commons.wikimedia.org/wiki/Special:FilePath/Autograph%20Collection%20-%20Roosevelt%2C%20Theodore%2C%201858-1919%20-%20DPLA%20-%2032bb680566dca1786891bc0751fe9ecd%20(page%202).jpg?width=400","label":"round-3-image","action":"inspect","ok":false,"effect":"Image broken/404: https://commons.wikimedia.org/wiki/Special:FilePath/Autograph%20Collection%20-%20Roosevelt%2C%20Theodore%2C%201858-1919%20-%20DPLA%20-%2032bb680566dca1786891bc0751fe9ecd%20(page%202).jpg?width=400","errors":["Image 404 or broken: https://commons.wikimedia.org/wiki/Special:FilePath/Autograph%20Collection%20-%20Roosevelt%2C%20Theodore%2C%201858-1919%20-%20DPLA%20-%2032bb680566dca1786891bc0751fe9ecd%20(page%202).jpg?width=400"]}
+{"run":0,"ts":"2026-08-03T21:03:45.982Z","game":"early","diff":"icons","cat":"All","selector":"#stage","label":"round-3-render","action":"inspect","ok":true,"effect":"stage_html_len=662, choices=2, imgs_ok=2, imgs_broken=4","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:46.433Z","game":"early","diff":"icons","cat":"All","selector":".choice","label":"round-3-pick-1","action":"click","ok":true,"effect":"Chose: \"B is earlier\", reveal: \"✓ Correct — Theodore Roosevelt: B is from 1858, the other from 1905 · see the ti\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:46.686Z","game":"early","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-3-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:47.094Z","game":"early","diff":"icons","cat":"All","selector":"#stage","label":"round-4-render","action":"inspect","ok":true,"effect":"stage_html_len=499, choices=2, imgs_ok=4, imgs_broken=4","errors":[]}
+{"run":1,"ts":"2026-08-03T21:03:47.340Z","selector":"#logoutLink","label":"sign out link","action":"click","ok":true,"effect":"forms=true whoami=false","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:47.542Z","game":"early","diff":"icons","cat":"All","selector":".choice","label":"round-4-pick-0","action":"click","ok":true,"effect":"Chose: \"A is earlier\", reveal: \"✓ Correct — Wassily Kandinsky: A is from 1913, the other from 1914 · see the tim\"","errors":["REQUEST_FAILED: POST https://www.google-analytics.com/g/collect?v=2&tid=G-2HEVP6TD0J&gtm=45je67u0v9260226174za200zd9260226174&_p=1785791022451&gcd=13l3l3l3l1l1&npa=0&dma=0&_eu=AAAAAAQ&are=1&cid=678713399.1785790979&frm=0&ngs=1&pscdl=noapi&rcb=8&sr=1600x900&uaa=arm&uab=64&uafvl=HeadlessChrome%3B149.0.7827.55%7CChromium%3B149.0.7827.55%7CNot)A%253BBrand%3B24.0.0.0&uam=&uamb=0&uap=macOS&uapv=26.4.0&uaw=0&ul=en-us&_s=1&tag_exp=115938466~115938469~118897920~118897930~119896802&sid=1785790978&sct=1&seg=1&dl=http%3A%2F%2Flocalhost%2Fgame&dt=The%20Signature%20Games%20%E2%80%94%20Celebrity%20Signatures&en=page_view&_ee=1&tfd=5016 — net::ERR_ABORTED"]}
+{"run":0,"ts":"2026-08-03T21:03:47.798Z","game":"early","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-4-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:48.207Z","game":"early","diff":"icons","cat":"All","selector":"#stage","label":"round-5-render","action":"inspect","ok":true,"effect":"stage_html_len=478, choices=2, imgs_ok=6, imgs_broken=4","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:48.654Z","game":"early","diff":"icons","cat":"All","selector":".choice","label":"round-5-pick-1","action":"click","ok":true,"effect":"Chose: \"B is earlier\", reveal: \"✗ Jenny Sacerdote: A is from 1915, the other from 1928 · see the timeline →Next \"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:03:48.881Z","selector":"#loginBtn","label":"sign back in after logout","action":"click","ok":true,"effect":"msg=\"signed in\" whoEmail=\"screenrec-test@example.com\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:03:48.904Z","selector":"h1 a","label":"back to gallery link","action":"check","ok":true,"effect":"href=\"/\" text=\"← back to the gallery\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:48.907Z","game":"early","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-5-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:49.320Z","game":"early","diff":"icons","cat":"All","selector":"#stage","label":"round-6-render","action":"inspect","ok":true,"effect":"stage_html_len=466, choices=2, imgs_ok=8, imgs_broken=4","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:49.765Z","game":"early","diff":"icons","cat":"All","selector":".choice","label":"round-6-pick-1","action":"click","ok":true,"effect":"Chose: \"B is earlier\", reveal: \"✓ Correct — Eugène Delacroix: B is from 1839, the other from 1849 · see the time\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:50.015Z","game":"early","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-6-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:50.422Z","game":"early","diff":"icons","cat":"All","selector":"https://commons.wikimedia.org/wiki/Special:FilePath/Painters%20and%20their%20works-%20a%20dictionary%20of%20great%20artists%20who%20are%20not%20now%20alive%2C%20giving%20their%20names%2C%20lives%2C%20and%20the%20prices%20paid%20for%20their%20works%20at%20auctions%20(1896)%20(14783522062).jpg?width=400","label":"round-7-image","action":"inspect","ok":false,"effect":"Image broken/404: https://commons.wikimedia.org/wiki/Special:FilePath/Painters%20and%20their%20works-%20a%20dictionary%20of%20great%20artists%20who%20are%20not%20now%20alive%2C%20giving%20their%20names%2C%20lives%2C%20and%20the%20prices%20paid%20for%20their%20works%20at%20auctions%20(1896)%20(14783522062).jpg?width=400","errors":["Image 404 or broken: https://commons.wikimedia.org/wiki/Special:FilePath/Painters%20and%20their%20works-%20a%20dictionary%20of%20great%20artists%20who%20are%20not%20now%20alive%2C%20giving%20their%20names%2C%20lives%2C%20and%20the%20prices%20paid%20for%20their%20works%20at%20auctions%20(1896)%20(14783522062).jpg?width=400"]}
+{"run":0,"ts":"2026-08-03T21:03:50.422Z","game":"early","diff":"icons","cat":"All","selector":"#stage","label":"round-7-render","action":"inspect","ok":true,"effect":"stage_html_len=697, choices=2, imgs_ok=9, imgs_broken=5","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:50.877Z","game":"early","diff":"icons","cat":"All","selector":".choice","label":"round-7-pick-0","action":"click","ok":true,"effect":"Chose: \"A is earlier\", reveal: \"✓ Correct — Jan van Eyck: A is from 1439, the other from 1896 · see the timeline\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:03:50.921Z","selector":".card:first-child","label":"stat callout $10/50%","action":"check","ok":true,"effect":"$10=true 50%=true","errors":[]}
+{"run":2,"ts":"2026-08-03T21:03:50.922Z","selector":"#authForms","label":"auth initial state","action":"check","ok":true,"effect":"{\"authFormsVisible\":true,\"whoamiVisible\":false,\"uploadCardVisible\":false,\"dashCardVisible\":false,\"authMsg\":\"\",\"upMsg\":\"\",\"whoEmail\":\"\",\"totalEarned\":\"$0.00\",\"dashRows\":\"\",\"attestChecked\":false,\"previewVisible\":false}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:03:50.923Z","selector":"#uploadCard,#dashCard","label":"cards hidden when logged out","action":"check","ok":true,"effect":"upload=false dash=false","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:51.127Z","game":"early","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-7-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:51.533Z","game":"early","diff":"icons","cat":"All","selector":"#stage","label":"round-8-render","action":"inspect","ok":true,"effect":"stage_html_len=466, choices=2, imgs_ok=11, imgs_broken=5","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:51.973Z","game":"early","diff":"icons","cat":"All","selector":".choice","label":"round-8-pick-1","action":"click","ok":true,"effect":"Chose: \"B is earlier\", reveal: \"✓ Correct — Eugène Delacroix: B is from 1835, the other from 1854 · see the time\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:52.228Z","game":"early","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-8-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:52.637Z","game":"early","diff":"icons","cat":"All","selector":"#stage","label":"round-9-render","action":"inspect","ok":true,"effect":"stage_html_len=493, choices=2, imgs_ok=13, imgs_broken=5","errors":[]}
+{"run":2,"ts":"2026-08-03T21:03:52.812Z","selector":"#signupBtn","label":"Create account","action":"click","ok":false,"effect":"account already exists — sign in instead","errors":[{"type":"console.error","text":"Failed to load resource: the server responded with a status of 409 (Conflict)"}]}
+{"run":0,"ts":"2026-08-03T21:03:53.085Z","game":"early","diff":"icons","cat":"All","selector":".choice","label":"round-9-pick-1","action":"click","ok":true,"effect":"Chose: \"B is earlier\", reveal: \"✗ Franklin Delano Roosevelt: A is from 1936, the other from 1942 · see the timel\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:53.336Z","game":"early","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-9-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:53.745Z","game":"early","diff":"icons","cat":"All","selector":"#stage","label":"round-10-render","action":"inspect","ok":true,"effect":"stage_html_len=466, choices=2, imgs_ok=15, imgs_broken=5","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:54.183Z","game":"early","diff":"icons","cat":"All","selector":".choice","label":"round-10-pick-0","action":"click","ok":true,"effect":"Chose: \"A is earlier\", reveal: \"✗ Eugène Delacroix: B is from 1835, the other from 1848 · see the timeline →See \"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:54.436Z","game":"early","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-10-next","action":"click","ok":true,"effect":"Next text: \"See results\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:03:54.533Z","selector":"#loginBtn","label":"Sign in (fallback after signup already-exists)","action":"click","ok":true,"effect":"signed in","errors":[]}
+{"run":2,"ts":"2026-08-03T21:03:54.534Z","selector":"#uploadCard,#dashCard","label":"cards visible after sign in","action":"check","ok":true,"effect":"upload=true dash=true whoEmail=screenrec-test@example.com","errors":[]}
+{"run":2,"ts":"2026-08-03T21:03:54.534Z","selector":"#dashTable","label":"dashboard table state","action":"check","ok":true,"effect":"rows=\"no uploads yet\" totalEarned=\"$0.00\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:54.846Z","game":"early","diff":"icons","cat":"All","selector":"#results","label":"results-screen","action":"inspect","ok":true,"effect":"score=72, verdict=\"A promising apprentice.\", best=\"Best (early · icons): 72\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:55.293Z","game":"early","diff":"icons","cat":"All","selector":"#againBtn","label":"play-again","action":"click","ok":true,"effect":"Setup panel returned: true","errors":[]}
+{"run":2,"ts":"2026-08-03T21:03:55.420Z","selector":"#uploadBtn","label":"submit with no file (validation)","action":"click","ok":true,"effect":"upMsg=\"choose a signature file first\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:03:56.156Z","selector":"#uploadBtn","label":"submit with attest but no file","action":"click","ok":true,"effect":"upMsg=\"choose a signature file first\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:56.371Z","game":"century","diff":"icons","cat":"All","selector":"#gamePick .gcard[data-g=\"century\"]","label":"game-card-century","action":"click","ok":true,"effect":"card selected","errors":["REQUEST_FAILED: POST https://www.google-analytics.com/g/collect?v=2&tid=G-2HEVP6TD0J&gtm=45je67u0v9260226174za200zd9260226174&_p=1785791022451&gcd=13l3l3l3l1l1&npa=0&dma=0&_eu=AAAAAAQ&are=1&cid=678713399.1785790979&frm=0&ngs=1&pscdl=noapi&rcb=8&sr=1600x900&uaa=arm&uab=64&uafvl=HeadlessChrome%3B149.0.7827.55%7CChromium%3B149.0.7827.55%7CNot)A%253BBrand%3B24.0.0.0&uam=&uamb=0&uap=macOS&uapv=26.4.0&uaw=0&ul=en-us&_s=2&tag_exp=115938466~115938469~118897920~118897930~119896802&sid=1785790978&sct=1&seg=1&dl=http%3A%2F%2Flocalhost%2Fgame&dt=The%20Signature%20Games%20%E2%80%94%20Celebrity%20Signatures&en=user_engagement&_et=12836&tfd=12852 — net::ERR_ABORTED"]}
+{"run":0,"ts":"2026-08-03T21:03:56.375Z","game":"century","diff":"icons","cat":"All","selector":"#catLabel/#catOpts","label":"category-row-visibility","action":"inspect","ok":true,"effect":"catLabel=block, catOpts=flex, expected_visible=true, actual=true","errors":[]}
+{"run":2,"ts":"2026-08-03T21:03:56.397Z","selector":"#attest","label":"attest checkbox toggle","action":"click","ok":true,"effect":"before=false after=true","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:56.571Z","game":"century","diff":"icons","cat":"All","selector":"#diffOpts .opt[data-d=\"icons\"]","label":"diff-icons","action":"click","ok":true,"effect":"selected","errors":[]}
+{"run":2,"ts":"2026-08-03T21:03:56.608Z","selector":"#celebName","label":"celebName text input","action":"fill","ok":true,"effect":"value=\"Test Celebrity Name\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:03:56.608Z","selector":"#sigFile","label":"file input existence + accept attr","action":"check","ok":true,"effect":"accept=\"image/png,image/jpeg,image/svg+xml\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:03:56.766Z","game":"century","diff":"icons","cat":"All","selector":"#catOpts .opt[data-c=\"All\"]","label":"cat-All","action":"click","ok":true,"effect":"selected","errors":[]}
+{"run":2,"ts":"2026-08-03T21:03:57.412Z","selector":"#sigFile","label":"file input setInputFiles (fake PNG)","action":"setFile","ok":true,"effect":"preview=true dataUrlSet=true","errors":[]}
+{"run":2,"ts":"2026-08-03T21:03:57.934Z","selector":"#uploadBtn","label":"submit with file but no attest","action":"click","ok":true,"effect":"upMsg=\"the attestation checkbox is required\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:04:00.379Z","selector":"#uploadBtn","label":"submit with file + attest (real upload)","action":"click","ok":false,"effect":"upMsg=\"file must be 0.5KB–3MB\"","errors":[{"type":"console.error","text":"Failed to load resource: the server responded with a status of 400 (Bad Request)"}]}
+{"run":2,"ts":"2026-08-03T21:04:01.381Z","selector":"#dashTable","label":"dashboard after upload","action":"check","ok":true,"effect":"rows=\"no uploads yet\" earned=\"$0.00\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:04:02.936Z","selector":"#logoutLink","label":"sign out link","action":"click","ok":true,"effect":"forms=true whoami=false","errors":[]}
+{"run":2,"ts":"2026-08-03T21:04:04.476Z","selector":"#loginBtn","label":"sign back in after logout","action":"click","ok":true,"effect":"msg=\"signed in\" whoEmail=\"screenrec-test@example.com\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:04:04.502Z","selector":"h1 a","label":"back to gallery link","action":"check","ok":true,"effect":"href=\"/\" text=\"← back to the gallery\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:04:06.551Z","selector":".card:first-child","label":"stat callout $10/50%","action":"check","ok":true,"effect":"$10=true 50%=true","errors":[]}
+{"run":3,"ts":"2026-08-03T21:04:06.552Z","selector":"#authForms","label":"auth initial state","action":"check","ok":true,"effect":"{\"authFormsVisible\":true,\"whoamiVisible\":false,\"uploadCardVisible\":false,\"dashCardVisible\":false,\"authMsg\":\"\",\"upMsg\":\"\",\"whoEmail\":\"\",\"totalEarned\":\"$0.00\",\"dashRows\":\"\",\"attestChecked\":false,\"previewVisible\":false}","errors":[]}
+{"run":3,"ts":"2026-08-03T21:04:06.553Z","selector":"#uploadCard,#dashCard","label":"cards hidden when logged out","action":"check","ok":true,"effect":"upload=false dash=false","errors":[]}
+{"run":3,"ts":"2026-08-03T21:04:08.423Z","selector":"#loginBtn","label":"Sign in","action":"click","ok":true,"effect":"signed in","errors":[]}
+{"run":3,"ts":"2026-08-03T21:04:08.424Z","selector":"#uploadCard,#dashCard","label":"cards visible after sign in","action":"check","ok":true,"effect":"upload=true dash=true whoEmail=screenrec-test@example.com","errors":[]}
+{"run":3,"ts":"2026-08-03T21:04:08.424Z","selector":"#dashTable","label":"dashboard table state","action":"check","ok":true,"effect":"rows=\"no uploads yet\" totalEarned=\"$0.00\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:04:08.473Z","selector":"page","label":"PAGE LOAD","action":"goto","ok":true,"effect":"{\"title\":\"Celebrity Signature Murals — made to order\",\"muralCards\":33,\"sigsLoaded\":true}","errors":[]}
+{"run":3,"ts":"2026-08-03T21:04:09.491Z","selector":"#uploadBtn","label":"submit with attest but no file","action":"click","ok":true,"effect":"upMsg=\"choose a signature file first\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:04:09.720Z","selector":"#celebName","label":"celebName text input","action":"fill","ok":true,"effect":"value=\"Test Celebrity Name\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:04:09.926Z","selector":"#attest","label":"attest checkbox toggle","action":"click","ok":true,"effect":"before=false after=true","errors":[]}
+{"run":3,"ts":"2026-08-03T21:04:10.489Z","selector":"#uploadBtn","label":"submit with no file (validation)","action":"click","ok":true,"effect":"upMsg=\"choose a signature file first\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:04:10.490Z","selector":"#sigFile","label":"file input existence + accept attr","action":"check","ok":true,"effect":"accept=\"image/png,image/jpeg,image/svg+xml\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:04:11.294Z","selector":"#sigFile","label":"file input setInputFiles (fake PNG)","action":"setFile","ok":true,"effect":"preview=true dataUrlSet=true","errors":[]}
+{"run":3,"ts":"2026-08-03T21:04:11.809Z","selector":"#uploadBtn","label":"submit with file but no attest","action":"click","ok":true,"effect":"upMsg=\"the attestation checkbox is required\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:04:14.254Z","selector":"#uploadBtn","label":"submit with file + attest (real upload)","action":"click","ok":false,"effect":"upMsg=\"file must be 0.5KB–3MB\"","errors":[{"type":"console.error","text":"Failed to load resource: the server responded with a status of 400 (Bad Request)"}]}
+{"run":0,"ts":"2026-08-03T21:03:44.713Z","selector":"#useFilter","label":"Use filter: Free to use","action":"select","value":"yes","ok":false,"effect":"ERROR: locator.scrollIntoViewIfNeeded: Timeout 29992.475000000002ms exceeded.\nCall log:\n\u001b[2m  - attempting scroll into view action\u001b[22m\n\u001b[2m    2 × waiting for element to be stable\u001b[22m\n\u001b[2m      - element i","errors":["locator.scrollIntoViewIfNeeded: Timeout 29992.475000000002ms exceeded.\nCall log:\n\u001b[2m  - attempting scroll into view action\u001b[22m\n\u001b[2m    2 × waiting for element to be stable\u001b[22m\n\u001b[2m      - element is not visible\u001b[22m\n\u001b[2m    - retrying scroll into view action\u001b[22m\n\u001b[2m    - waiting 20ms\u001b[22m\n\u001b[2m "]}
+{"run":3,"ts":"2026-08-03T21:04:15.257Z","selector":"#dashTable","label":"dashboard after upload","action":"check","ok":true,"effect":"rows=\"no uploads yet\" earned=\"$0.00\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:04:08.474Z","selector":".m-card:nth-child(1) .name-toggle","label":"Gallery card 1: Show names toggle","action":"click","ok":false,"effect":"ACTION_FAILED","errors":["TimeoutError: locator.click: Timeout 8000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('.m-card:nth-child(1) .name-toggle').first()\u001b[22m\n\u001b[2m    - locator resolved to <button type=\"button\" data-toggle=\"o\" class=\"name-toggle\">Show names</button>\u001b[22m\n\u001b[2m  - attempting click action\u001b[22m\n\u001b[2m    2 × waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m      - element is visible, enabled and stable\u001b[22m\n\u001b[2m      - scrolling into view if needed\u001b[22m\n\u001b[2m      - done scrolling\u001b[22m\n\u001b[2m      - <button class=\"pill\">Sign in</button> from <div class=\"acct-bar\">…</div> subtree intercepts pointer events\u001b[22m\n\u001b[2m    - retrying click action\u001b[22m\n\u001b[2m    - waiting 20ms\u001b[22m\n\u001b[2m    - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m    - element is visible, enabled and stable\u001b[22m\n\u001b[2m    - scrolling into view if needed\u001b[22m\n\u001b[2m    - done scrolling\u001b[22m\n\u001b[2m    - <button class=\"pill\">Sign in</button> from <div class=\"acct-bar\">…</div> subtree intercepts pointer events\u001b[22m\n\u001b[2m  2 × retrying click action\u001b[22m\n\u001b[2m      - waiting 100ms\u001b[22m\n\u001b[2m      - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m      - element is visible, enabled and stable\u001b[22m\n\u001b[2m      - scrolling into view if needed\u001b[22m\n\u001b[2m      - done scrolling\u001b[22m\n\u001b[2m      - <header>…</header> intercepts pointer events\u001b[22m\n\u001b[2m  3 × retrying click action\u001b[22m\n\u001b[2m      - waiting 500ms\u001b[22m\n\u001b[2m      - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m      - element is visible, enabled and stable\u001b[22m\n\u001b[2m      - scrolling into view if needed\u001b[22m\n\u001b[2m      - done scrolling\u001b[22m\n\u001b[2m      - <button class=\"pill\">Sign in</button> from <div class=\"acct-bar\">…</div> subtree intercepts pointer events\u001b[22m\n\u001b[2m    - retrying click action\u001b[22m\n\u001b[2m      - waiting 500ms\u001b[22m\n\u001b[2m      - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m      - element is visible, enabled and stable\u001b[22m\n\u001b[2m      - scrolling into view if needed\u001b[22m\n\u001b[2m      - done scrolling\u001b[22m\n\u001b[2m      - <button class=\"pill\">Sign in</button> from <div class=\"acct-bar\">…</div> subtree intercepts pointer events\u001b[22m\n\u001b[2m    - retrying click action\u001b[22m\n\u001b[2m      - waiting 500ms\u001b[22m\n\u001b[2m      - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m      - element is visible, enabled and stable\u001b[22m\n\u001b[2m      - scrolling into view if needed\u001b[22m\n\u001b[2m      - done scrolling\u001b[22m\n\u001b[2m      - <header>…</header> intercepts pointer events\u001b[22m\n\u001b[2m    - retrying click action\u001b[22m\n\u001b[2m      - waiting 500ms\u001b[22m\n\u001b[2m      - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m      - element is visible, enabled and stable\u001b[22m\n\u001b[2m      - scrolling into view if needed\u001b[22m\n\u001b[2m      - done scrolling\u001b[22m\n\u001b[2m      - <header>…</header> intercepts pointer events\u001b[22m\n\u001b[2m  2 × retrying click action\u001b[22m\n\u001b[2m      - waiting 500ms\u001b[22m\n\u001b[2m      - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m      - element is visible, enabled and stable\u001b[22m\n\u001b[2m      - scrolling into view if needed\u001b[22m\n\u001b[2m      - done scrolling\u001b[22m\n\u001b[2m      - <button class=\"pill\">Sign in</button> from <div class=\"acct-bar\">…</div> subtree intercepts pointer events\u001b[22m\n\u001b[2m  - retrying click action\u001b[22m\n\u001b[2m    - waiting 500ms\u001b[22m\n\u001b[2m    - waiting for element to be visible, enabled and stable\u001b[22m\n"]}
+{"run":3,"ts":"2026-08-03T21:04:16.810Z","selector":"#logoutLink","label":"sign out link","action":"click","ok":true,"effect":"forms=true whoami=false","errors":[]}
+{"run":3,"ts":"2026-08-03T21:04:18.354Z","selector":"#loginBtn","label":"sign back in after logout","action":"click","ok":true,"effect":"msg=\"signed in\" whoEmail=\"screenrec-test@example.com\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:04:18.378Z","selector":"h1 a","label":"back to gallery link","action":"check","ok":true,"effect":"href=\"/\" text=\"← back to the gallery\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:04:20.364Z","selector":".card:first-child","label":"stat callout $10/50%","action":"check","ok":true,"effect":"$10=true 50%=true","errors":[]}
+{"run":4,"ts":"2026-08-03T21:04:20.365Z","selector":"#authForms","label":"auth initial state","action":"check","ok":true,"effect":"{\"authFormsVisible\":true,\"whoamiVisible\":false,\"uploadCardVisible\":false,\"dashCardVisible\":false,\"authMsg\":\"\",\"upMsg\":\"\",\"whoEmail\":\"\",\"totalEarned\":\"$0.00\",\"dashRows\":\"\",\"attestChecked\":false,\"previewVisible\":false}","errors":[]}
+{"run":4,"ts":"2026-08-03T21:04:20.365Z","selector":"#uploadCard,#dashCard","label":"cards hidden when logged out","action":"check","ok":true,"effect":"upload=false dash=false","errors":[]}
+{"run":4,"ts":"2026-08-03T21:04:22.243Z","selector":"#signupBtn","label":"Create account","action":"click","ok":false,"effect":"account already exists — sign in instead","errors":[{"type":"console.error","text":"Failed to load resource: the server responded with a status of 409 (Conflict)"}]}
+{"run":4,"ts":"2026-08-03T21:04:23.966Z","selector":"#loginBtn","label":"Sign in (fallback after signup already-exists)","action":"click","ok":true,"effect":"signed in","errors":[]}
+{"run":4,"ts":"2026-08-03T21:04:23.966Z","selector":"#uploadCard,#dashCard","label":"cards visible after sign in","action":"check","ok":true,"effect":"upload=true dash=true whoEmail=screenrec-test@example.com","errors":[]}
+{"run":4,"ts":"2026-08-03T21:04:23.967Z","selector":"#dashTable","label":"dashboard table state","action":"check","ok":true,"effect":"rows=\"no uploads yet\" totalEarned=\"$0.00\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:04:24.851Z","selector":"#uploadBtn","label":"submit with no file (validation)","action":"click","ok":true,"effect":"upMsg=\"choose a signature file first\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:04:16.693Z","selector":".m-card:nth-child(1) .name-toggle","label":"Gallery card 1: Hide names toggle","action":"click","ok":false,"effect":"ACTION_FAILED","errors":["TimeoutError: locator.click: Timeout 8000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('.m-card:nth-child(1) .name-toggle').first()\u001b[22m\n\u001b[2m    - locator resolved to <button type=\"button\" data-toggle=\"o\" class=\"name-toggle\">Show names</button>\u001b[22m\n\u001b[2m  - attempting click action\u001b[22m\n\u001b[2m    2 × waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m      - element is visible, enabled and stable\u001b[22m\n\u001b[2m      - scrolling into view if needed\u001b[22m\n\u001b[2m      - done scrolling\u001b[22m\n\u001b[2m      - <button class=\"pill\">Sign in</button> from <div class=\"acct-bar\">…</div> subtree intercepts pointer events\u001b[22m\n\u001b[2m    - retrying click action\u001b[22m\n\u001b[2m    - waiting 20ms\u001b[22m\n\u001b[2m    - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m    - element is visible, enabled and stable\u001b[22m\n\u001b[2m    - scrolling into view if needed\u001b[22m\n\u001b[2m    - done scrolling\u001b[22m\n\u001b[2m    - <button class=\"pill\">Sign in</button> from <div class=\"acct-bar\">…</div> subtree intercepts pointer events\u001b[22m\n\u001b[2m  2 × retrying click action\u001b[22m\n\u001b[2m      - waiting 100ms\u001b[22m\n\u001b[2m      - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m      - element is visible, enabled and stable\u001b[22m\n\u001b[2m      - scrolling into view if needed\u001b[22m\n\u001b[2m      - done scrolling\u001b[22m\n\u001b[2m      - <header>…</header> intercepts pointer events\u001b[22m\n\u001b[2m  3 × retrying click action\u001b[22m\n\u001b[2m      - waiting 500ms\u001b[22m\n\u001b[2m      - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m      - element is visible, enabled and stable\u001b[22m\n\u001b[2m      - scrolling into view if needed\u001b[22m\n\u001b[2m      - done scrolling\u001b[22m\n\u001b[2m      - <button class=\"pill\">Sign in</button> from <div class=\"acct-bar\">…</div> subtree intercepts pointer events\u001b[22m\n\u001b[2m    - retrying click action\u001b[22m\n\u001b[2m      - waiting 500ms\u001b[22m\n\u001b[2m      - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m      - element is visible, enabled and stable\u001b[22m\n\u001b[2m      - scrolling into view if needed\u001b[22m\n\u001b[2m      - done scrolling\u001b[22m\n\u001b[2m      - <button class=\"pill\">Sign in</button> from <div class=\"acct-bar\">…</div> subtree intercepts pointer events\u001b[22m\n\u001b[2m    - retrying click action\u001b[22m\n\u001b[2m      - waiting 500ms\u001b[22m\n\u001b[2m      - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m      - element is visible, enabled and stable\u001b[22m\n\u001b[2m      - scrolling into view if needed\u001b[22m\n\u001b[2m      - done scrolling\u001b[22m\n\u001b[2m      - <header>…</header> intercepts pointer events\u001b[22m\n\u001b[2m    - retrying click action\u001b[22m\n\u001b[2m      - waiting 500ms\u001b[22m\n\u001b[2m      - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m      - element is visible, enabled and stable\u001b[22m\n\u001b[2m      - scrolling into view if needed\u001b[22m\n\u001b[2m      - done scrolling\u001b[22m\n\u001b[2m      - <header>…</header> intercepts pointer events\u001b[22m\n\u001b[2m  2 × retrying click action\u001b[22m\n\u001b[2m      - waiting 500ms\u001b[22m\n\u001b[2m      - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m      - element is visible, enabled and stable\u001b[22m\n\u001b[2m      - scrolling into view if needed\u001b[22m\n\u001b[2m      - done scrolling\u001b[22m\n\u001b[2m      - <button class=\"pill\">Sign in</button> from <div class=\"acct-bar\">…</div> subtree intercepts pointer events\u001b[22m\n\u001b[2m  - retrying click action\u001b[22m\n\u001b[2m    - waiting 500ms\u001b[22m\n\u001b[2m    - waiting for element to be visible, enabled and stable\u001b[22m\n"]}
+{"run":4,"ts":"2026-08-03T21:04:25.574Z","selector":"#uploadBtn","label":"submit with attest but no file","action":"click","ok":true,"effect":"upMsg=\"choose a signature file first\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:04:25.816Z","selector":"#attest","label":"attest checkbox toggle","action":"click","ok":true,"effect":"before=false after=true","errors":[]}
+{"run":4,"ts":"2026-08-03T21:04:26.026Z","selector":"#celebName","label":"celebName text input","action":"fill","ok":true,"effect":"value=\"Test Celebrity Name\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:04:26.027Z","selector":"#sigFile","label":"file input existence + accept attr","action":"check","ok":true,"effect":"accept=\"image/png,image/jpeg,image/svg+xml\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:04:26.779Z","game":"century","diff":"icons","cat":"All","selector":"#goBtn","label":"begin-button","action":"click","ok":false,"effect":"Click failed","errors":["TimeoutError: locator.click: Timeout 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('#goBtn')\u001b[22m\n\u001b[2m    - locator resolved to <button class=\"go\" id=\"goBtn\">Begin</button>\u001b[22m\n\u001b[2m  - attempting click action\u001b[22m\n\u001b[2m    - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m    - element is visible, enabled and stable\u001b[22m\n\u001b[2m    - scrolling into view if needed\u001b[22m\n\u001b[2m    - done scrolling\u001b[22m\n\u001b[2m    - performing click action\u001b[22m\n"]}
+{"run":4,"ts":"2026-08-03T21:04:26.832Z","selector":"#sigFile","label":"file input setInputFiles (fake PNG)","action":"setFile","ok":true,"effect":"preview=true dataUrlSet=true","errors":[]}
+{"run":4,"ts":"2026-08-03T21:04:27.351Z","selector":"#uploadBtn","label":"submit with file but no attest","action":"click","ok":true,"effect":"upMsg=\"the attestation checkbox is required\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:04:29.783Z","selector":"#uploadBtn","label":"submit with file + attest (real upload)","action":"click","ok":false,"effect":"upMsg=\"file must be 0.5KB–3MB\"","errors":[{"type":"console.error","text":"Failed to load resource: the server responded with a status of 400 (Bad Request)"}]}
+{"run":4,"ts":"2026-08-03T21:04:30.785Z","selector":"#dashTable","label":"dashboard after upload","action":"check","ok":true,"effect":"rows=\"no uploads yet\" earned=\"$0.00\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:04:32.339Z","selector":"#logoutLink","label":"sign out link","action":"click","ok":true,"effect":"forms=true whoami=false","errors":[]}
+{"run":0,"ts":"2026-08-03T21:04:24.927Z","selector":".m-card:nth-child(2) .name-toggle","label":"Gallery card 2: Show names toggle","action":"click","ok":false,"effect":"ACTION_FAILED","errors":["TimeoutError: locator.click: Timeout 8000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('.m-card:nth-child(2) .name-toggle').first()\u001b[22m\n\u001b[2m    - locator resolved to <button type=\"button\" data-toggle=\"d\" class=\"name-toggle\">Show names</button>\u001b[22m\n\u001b[2m  - attempting click action\u001b[22m\n\u001b[2m    2 × waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m      - element is visible, enabled and stable\u001b[22m\n\u001b[2m      - scrolling into view if needed\u001b[22m\n\u001b[2m      - done scrolling\u001b[22m\n\u001b[2m      - <button class=\"pill\">Sign in</button> from <div class=\"acct-bar\">…</div> subtree intercepts pointer events\u001b[22m\n\u001b[2m    - retrying click action\u001b[22m\n\u001b[2m    - waiting 20ms\u001b[22m\n\u001b[2m    - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m    - element is visible, enabled and stable\u001b[22m\n\u001b[2m    - scrolling into view if needed\u001b[22m\n\u001b[2m    - done scrolling\u001b[22m\n\u001b[2m    - <button class=\"pill\">Sign in</button> from <div class=\"acct-bar\">…</div> subtree intercepts pointer events\u001b[22m\n\u001b[2m  2 × retrying click action\u001b[22m\n\u001b[2m      - waiting 100ms\u001b[22m\n\u001b[2m      - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m      - element is visible, enabled and stable\u001b[22m\n\u001b[2m      - scrolling into view if needed\u001b[22m\n\u001b[2m      - done scrolling\u001b[22m\n\u001b[2m      - <header>…</header> intercepts pointer events\u001b[22m\n\u001b[2m  3 × retrying click action\u001b[22m\n\u001b[2m      - waiting 500ms\u001b[22m\n\u001b[2m      - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m      - element is visible, enabled and stable\u001b[22m\n\u001b[2m      - scrolling into view if needed\u001b[22m\n\u001b[2m      - done scrolling\u001b[22m\n\u001b[2m      - <button class=\"pill\">Sign in</button> from <div class=\"acct-bar\">…</div> subtree intercepts pointer events\u001b[22m\n\u001b[2m    - retrying click action\u001b[22m\n\u001b[2m      - waiting 500ms\u001b[22m\n\u001b[2m      - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m      - element is visible, enabled and stable\u001b[22m\n\u001b[2m      - scrolling into view if needed\u001b[22m\n\u001b[2m      - done scrolling\u001b[22m\n\u001b[2m      - <button class=\"pill\">Sign in</button> from <div class=\"acct-bar\">…</div> subtree intercepts pointer events\u001b[22m\n\u001b[2m    - retrying click action\u001b[22m\n\u001b[2m      - waiting 500ms\u001b[22m\n\u001b[2m      - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m      - element is visible, enabled and stable\u001b[22m\n\u001b[2m      - scrolling into view if needed\u001b[22m\n\u001b[2m      - done scrolling\u001b[22m\n\u001b[2m      - <header>…</header> intercepts pointer events\u001b[22m\n\u001b[2m    - retrying click action\u001b[22m\n\u001b[2m      - waiting 500ms\u001b[22m\n\u001b[2m      - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m      - element is visible, enabled and stable\u001b[22m\n\u001b[2m      - scrolling into view if needed\u001b[22m\n\u001b[2m      - done scrolling\u001b[22m\n\u001b[2m      - <header>…</header> intercepts pointer events\u001b[22m\n\u001b[2m  2 × retrying click action\u001b[22m\n\u001b[2m      - waiting 500ms\u001b[22m\n\u001b[2m      - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m      - element is visible, enabled and stable\u001b[22m\n\u001b[2m      - scrolling into view if needed\u001b[22m\n\u001b[2m      - done scrolling\u001b[22m\n\u001b[2m      - <button class=\"pill\">Sign in</button> from <div class=\"acct-bar\">…</div> subtree intercepts pointer events\u001b[22m\n\u001b[2m  - retrying click action\u001b[22m\n\u001b[2m    - waiting 500ms\u001b[22m\n\u001b[2m    - waiting for element to be visible, enabled and stable\u001b[22m\n"]}
+{"run":4,"ts":"2026-08-03T21:04:33.883Z","selector":"#loginBtn","label":"sign back in after logout","action":"click","ok":true,"effect":"msg=\"signed in\" whoEmail=\"screenrec-test@example.com\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:04:33.907Z","selector":"h1 a","label":"back to gallery link","action":"check","ok":true,"effect":"href=\"/\" text=\"← back to the gallery\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:04:33.151Z","selector":".m-card:nth-child(3) .name-toggle","label":"Gallery card 3: Show names toggle","action":"click","ok":false,"effect":"ACTION_FAILED","errors":["TimeoutError: locator.click: Timeout 8000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('.m-card:nth-child(3) .name-toggle').first()\u001b[22m\n\u001b[2m    - locator resolved to <button type=\"button\" data-toggle=\"p\" class=\"name-toggle\">Show names</button>\u001b[22m\n\u001b[2m  - attempting click action\u001b[22m\n\u001b[2m    2 × waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m      - element is visible, enabled and stable\u001b[22m\n\u001b[2m      - scrolling into view if needed\u001b[22m\n\u001b[2m      - done scrolling\u001b[22m\n\u001b[2m      - <button class=\"pill\">Sign in</button> from <div class=\"acct-bar\">…</div> subtree intercepts pointer events\u001b[22m\n\u001b[2m    - retrying click action\u001b[22m\n\u001b[2m    - waiting 20ms\u001b[22m\n\u001b[2m    - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m    - element is visible, enabled and stable\u001b[22m\n\u001b[2m    - scrolling into view if needed\u001b[22m\n\u001b[2m    - done scrolling\u001b[22m\n\u001b[2m    - <button class=\"pill\">Sign in</button> from <div class=\"acct-bar\">…</div> subtree intercepts pointer events\u001b[22m\n\u001b[2m  2 × retrying click action\u001b[22m\n\u001b[2m      - waiting 100ms\u001b[22m\n\u001b[2m      - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m      - element is visible, enabled and stable\u001b[22m\n\u001b[2m      - scrolling into view if needed\u001b[22m\n\u001b[2m      - done scrolling\u001b[22m\n\u001b[2m      - <header>…</header> intercepts pointer events\u001b[22m\n\u001b[2m  3 × retrying click action\u001b[22m\n\u001b[2m      - waiting 500ms\u001b[22m\n\u001b[2m      - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m      - element is visible, enabled and stable\u001b[22m\n\u001b[2m      - scrolling into view if needed\u001b[22m\n\u001b[2m      - done scrolling\u001b[22m\n\u001b[2m      - <button class=\"pill\">Sign in</button> from <div class=\"acct-bar\">…</div> subtree intercepts pointer events\u001b[22m\n\u001b[2m    - retrying click action\u001b[22m\n\u001b[2m      - waiting 500ms\u001b[22m\n\u001b[2m      - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m      - element is visible, enabled and stable\u001b[22m\n\u001b[2m      - scrolling into view if needed\u001b[22m\n\u001b[2m      - done scrolling\u001b[22m\n\u001b[2m      - <button class=\"pill\">Sign in</button> from <div class=\"acct-bar\">…</div> subtree intercepts pointer events\u001b[22m\n\u001b[2m    - retrying click action\u001b[22m\n\u001b[2m      - waiting 500ms\u001b[22m\n\u001b[2m      - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m      - element is visible, enabled and stable\u001b[22m\n\u001b[2m      - scrolling into view if needed\u001b[22m\n\u001b[2m      - done scrolling\u001b[22m\n\u001b[2m      - <header>…</header> intercepts pointer events\u001b[22m\n\u001b[2m    - retrying click action\u001b[22m\n\u001b[2m      - waiting 500ms\u001b[22m\n\u001b[2m      - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m      - element is visible, enabled and stable\u001b[22m\n\u001b[2m      - scrolling into view if needed\u001b[22m\n\u001b[2m      - done scrolling\u001b[22m\n\u001b[2m      - <header>…</header> intercepts pointer events\u001b[22m\n\u001b[2m  2 × retrying click action\u001b[22m\n\u001b[2m      - waiting 500ms\u001b[22m\n\u001b[2m      - waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m      - element is visible, enabled and stable\u001b[22m\n\u001b[2m      - scrolling into view if needed\u001b[22m\n\u001b[2m      - done scrolling\u001b[22m\n\u001b[2m      - <button class=\"pill\">Sign in</button> from <div class=\"acct-bar\">…</div> subtree intercepts pointer events\u001b[22m\n\u001b[2m  - retrying click action\u001b[22m\n\u001b[2m    - waiting 500ms\u001b[22m\n\u001b[2m    - waiting for element to be visible, enabled and stable\u001b[22m\n"]}
+{"run":0,"ts":"2026-08-03T21:04:41.780Z","game":"lightning","diff":"icons","cat":"All","selector":"page","label":"navigation","action":"goto","ok":false,"effect":"Navigation failed","errors":["TimeoutError: page.goto: Timeout 15000ms exceeded.\nCall log:\n\u001b[2m  - navigating to \"http://localhost:9920/game\", waiting until \"domcontentloaded\"\u001b[22m\n"]}
+{"run":0,"ts":"2026-08-03T21:04:41.385Z","selector":".m-card:nth-child(1) .roster-trig","label":"Gallery card 1: Roster drawer open","action":"click","ok":true,"effect":"{\"before\":\"See who's on this wall ▾\",\"after\":\"Hide who's on this wall ▴\",\"sigCount\":null}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:04:42.023Z","selector":".m-card:nth-child(2) .roster-trig","label":"Gallery card 2: Roster drawer open","action":"click","ok":true,"effect":"{\"before\":\"See who's on this wall ▾\",\"after\":\"Hide who's on this wall ▴\",\"sigCount\":null}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:04:14.716Z","selector":"#useFilter","label":"Use filter: Permission needed","action":"select","value":"permission-needed","ok":false,"effect":"ERROR: locator.scrollIntoViewIfNeeded: Timeout 29991.358000000007ms exceeded.\nCall log:\n\u001b[2m  - attempting scroll into view action\u001b[22m\n\u001b[2m    2 × waiting for element to be stable\u001b[22m\n\u001b[2m      - element i","errors":["locator.scrollIntoViewIfNeeded: Timeout 29991.358000000007ms exceeded.\nCall log:\n\u001b[2m  - attempting scroll into view action\u001b[22m\n\u001b[2m    2 × waiting for element to be stable\u001b[22m\n\u001b[2m      - element is not visible\u001b[22m\n\u001b[2m    - retrying scroll into view action\u001b[22m\n\u001b[2m    - waiting 20ms\u001b[22m\n\u001b[2m "]}
+{"run":1,"ts":"2026-08-03T21:04:49.869Z","game":"lightning","diff":"scholar","cat":"All","selector":"#gamePick .gcard[data-g=\"lightning\"]","label":"game-card-lightning","action":"click","ok":true,"effect":"card selected","errors":["REQUEST_FAILED: POST https://www.google-analytics.com/g/collect?v=2&tid=G-2HEVP6TD0J&gtm=45je67u0v9260226174za200zd9260226174&_p=1785791088754&gcd=13l3l3l3l1l1&npa=0&dma=0&are=1&cid=1749435826.1785791089&frm=0&ngs=1&pscdl=noapi&rcb=16&sr=1600x900&uaa=arm&uab=64&uafvl=HeadlessChrome%3B149.0.7827.55%7CChromium%3B149.0.7827.55%7CNot)A%253BBrand%3B24.0.0.0&uam=&uamb=0&uap=macOS&uapv=26.4.0&uaw=0&ul=en-us&_s=1&tag_exp=115938466~115938469~118395334~118897920~118897930~119896803~120222309&sid=1785791088&sct=1&seg=0&dl=http%3A%2F%2Flocalhost%2Fgame&dt=The%20Signature%20Games%20%E2%80%94%20Celebrity%20Signatures&en=page_view&_fv=1&_nsi=1&_ss=1&_ee=1&tfd=160 — net::ERR_ABORTED"]}
+{"run":1,"ts":"2026-08-03T21:04:49.873Z","game":"lightning","diff":"scholar","cat":"All","selector":"#catLabel/#catOpts","label":"category-row-visibility","action":"inspect","ok":true,"effect":"catLabel=none, catOpts=none, expected_visible=false, actual=false","errors":[]}
+{"run":1,"ts":"2026-08-03T21:04:50.060Z","game":"lightning","diff":"scholar","cat":"All","selector":"#diffOpts .opt[data-d=\"scholar\"]","label":"diff-scholar","action":"click","ok":true,"effect":"selected","errors":[]}
+{"run":1,"ts":"2026-08-03T21:04:50.105Z","game":"lightning","diff":"scholar","cat":"All","selector":"#goBtn","label":"begin-button","action":"click","ok":true,"effect":"Begin clicked","errors":[]}
+{"run":1,"ts":"2026-08-03T21:04:51.615Z","game":"lightning","diff":"scholar","cat":"All","selector":"#play","label":"play-panel-appeared","action":"wait","ok":true,"effect":"play panel shown in 1554ms","errors":[]}
+{"run":1,"ts":"2026-08-03T21:04:51.620Z","game":"lightning","diff":"scholar","cat":"All","selector":"https://www.artic.edu/iiif/2/00552a2c-b5c7-7279-16d6-d5fa3d6866ca/full/600,/0/default.jpg","label":"round-1-image","action":"inspect","ok":false,"effect":"Image broken/404: https://www.artic.edu/iiif/2/00552a2c-b5c7-7279-16d6-d5fa3d6866ca/full/600,/0/default.jpg","errors":["Image 404 or broken: https://www.artic.edu/iiif/2/00552a2c-b5c7-7279-16d6-d5fa3d6866ca/full/600,/0/default.jpg"]}
+{"run":1,"ts":"2026-08-03T21:04:51.621Z","game":"lightning","diff":"scholar","cat":"All","selector":"#timerbar","label":"round-1-timer","action":"inspect","ok":true,"effect":"Timer bar visible, fill class: tb-fill run","errors":[]}
+{"run":1,"ts":"2026-08-03T21:04:57.124Z","game":"lightning","diff":"scholar","cat":"All","selector":"#reveal","label":"round-1-timer-out","action":"wait","ok":true,"effect":"Reveal after timeout: \"⏱ Time! Artist: Walter CraneNext →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:04:57.126Z","game":"lightning","diff":"scholar","cat":"All","selector":".choice","label":"round-1-choices-disabled","action":"inspect","ok":true,"effect":"Choices disabled after timeout: true","errors":[]}
+{"run":1,"ts":"2026-08-03T21:04:57.127Z","game":"lightning","diff":"scholar","cat":"All","selector":"#stage","label":"round-1-render","action":"inspect","ok":true,"effect":"stage_html_len=193, choices=4, imgs_ok=0, imgs_broken=1","errors":[]}
+{"run":1,"ts":"2026-08-03T21:04:57.450Z","game":"lightning","diff":"scholar","cat":"All","selector":"#timerbar","label":"round-2-timer","action":"inspect","ok":true,"effect":"Timer bar visible, fill class: tb-fill run","errors":[]}
+{"run":1,"ts":"2026-08-03T21:04:57.451Z","game":"lightning","diff":"scholar","cat":"All","selector":"#stage","label":"round-2-render","action":"inspect","ok":true,"effect":"stage_html_len=195, choices=4, imgs_ok=1, imgs_broken=1","errors":[]}
+{"run":1,"ts":"2026-08-03T21:04:57.908Z","game":"lightning","diff":"scholar","cat":"All","selector":".choice","label":"round-2-pick-3","action":"click","ok":true,"effect":"Chose: \"Roman Portrait Bust\", reveal: \"✗ Painting: Napkin Depicting The Five Senses · see it →Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:04:57.910Z","game":"lightning","diff":"scholar","cat":"All","selector":"#reveal a","label":"round-2-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/74703","errors":[]}
+{"run":1,"ts":"2026-08-03T21:04:58.158Z","game":"lightning","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-2-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:04:58.565Z","game":"lightning","diff":"scholar","cat":"All","selector":"#timerbar","label":"round-3-timer","action":"inspect","ok":true,"effect":"Timer bar visible, fill class: tb-fill run","errors":[]}
+{"run":1,"ts":"2026-08-03T21:04:58.566Z","game":"lightning","diff":"scholar","cat":"All","selector":"#stage","label":"round-3-render","action":"inspect","ok":true,"effect":"stage_html_len=193, choices=4, imgs_ok=2, imgs_broken=1","errors":[]}
+{"run":1,"ts":"2026-08-03T21:04:59.018Z","game":"lightning","diff":"scholar","cat":"All","selector":".choice","label":"round-3-pick-2","action":"click","ok":true,"effect":"Chose: \"Paolo Veronese\", reveal: \"✗ Artist: Jean-Auguste-Dominique IngresNext →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:04:44.719Z","selector":"#useFilter","label":"Use filter: All signatures","action":"select","value":"all","ok":false,"effect":"ERROR: locator.scrollIntoViewIfNeeded: Timeout 29991.466ms exceeded.\nCall log:\n\u001b[2m  - attempting scroll into view action\u001b[22m\n\u001b[2m    2 × waiting for element to be stable\u001b[22m\n\u001b[2m      - element is not vis","errors":["locator.scrollIntoViewIfNeeded: Timeout 29991.466ms exceeded.\nCall log:\n\u001b[2m  - attempting scroll into view action\u001b[22m\n\u001b[2m    2 × waiting for element to be stable\u001b[22m\n\u001b[2m      - element is not visible\u001b[22m\n\u001b[2m    - retrying scroll into view action\u001b[22m\n\u001b[2m    - waiting 20ms\u001b[22m\n\u001b[2m    2 × wa"]}
+{"run":0,"ts":"2026-08-03T21:05:25.163Z","selector":"page","label":"PAGE LOAD","action":"goto","ok":true,"effect":"{\"title\":\"Celebrity Signature Murals — made to order\",\"muralCards\":33,\"sigsLoaded\":true}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:05:25.164Z","selector":".m-card:nth-child(1) .name-toggle","label":"Gallery card 1: Show names toggle","action":"click","ok":true,"effect":"{\"before\":\"Show names\",\"after\":\"Show names\",\"sigCount\":null}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:05:25.981Z","selector":".m-card:nth-child(1) .name-toggle","label":"Gallery card 1: Hide names toggle","action":"click","ok":true,"effect":"{\"before\":\"Show names\",\"after\":\"Show names\",\"sigCount\":null}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:05:26.766Z","selector":".m-card:nth-child(2) .name-toggle","label":"Gallery card 2: Show names toggle","action":"click","ok":true,"effect":"{\"before\":\"Show names\",\"after\":\"Show names\",\"sigCount\":null}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:05:27.566Z","selector":".m-card:nth-child(3) .name-toggle","label":"Gallery card 3: Show names toggle","action":"click","ok":true,"effect":"{\"before\":\"Show names\",\"after\":\"Show names\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:05:29.019Z","game":"lightning","diff":"scholar","cat":"All","selector":"#reveal a","label":"round-3-reveal-link","action":"inspect","ok":false,"effect":"No reveal link found after pick","errors":["Missing reveal link in lightning round 3"]}
+{"run":0,"ts":"2026-08-03T21:05:28.348Z","selector":".m-card:nth-child(1) .roster-trig","label":"Gallery card 1: Roster drawer open","action":"click","ok":true,"effect":"{\"before\":\"See who's on this wall ▾\",\"after\":\"Hide who's on this wall ▴\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:05:29.271Z","game":"lightning","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-3-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:05:29.679Z","game":"lightning","diff":"scholar","cat":"All","selector":"#timerbar","label":"round-4-timer","action":"inspect","ok":true,"effect":"Timer bar visible, fill class: tb-fill run","errors":[]}
+{"run":1,"ts":"2026-08-03T21:05:29.679Z","game":"lightning","diff":"scholar","cat":"All","selector":"#stage","label":"round-4-render","action":"inspect","ok":true,"effect":"stage_html_len=195, choices=4, imgs_ok=3, imgs_broken=1","errors":[]}
+{"run":0,"ts":"2026-08-03T21:05:29.128Z","selector":".m-card:nth-child(2) .roster-trig","label":"Gallery card 2: Roster drawer open","action":"click","ok":true,"effect":"{\"before\":\"See who's on this wall ▾\",\"after\":\"Hide who's on this wall ▴\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:05:30.130Z","game":"lightning","diff":"scholar","cat":"All","selector":".choice","label":"round-4-pick-0","action":"click","ok":true,"effect":"Chose: \"Roman Portrait Bust\", reveal: \"✗ Painting: Amédée-David, the Comte de Pastoret · see it →Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:05:30.130Z","game":"lightning","diff":"scholar","cat":"All","selector":"#reveal a","label":"round-4-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/111317","errors":[]}
+{"run":1,"ts":"2026-08-03T21:05:30.383Z","game":"lightning","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-4-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:05:29.908Z","selector":".m-card:nth-child(3) .roster-trig","label":"Gallery card 3: Roster drawer open","action":"click","ok":true,"effect":"{\"before\":\"See who's on this wall ▾\",\"after\":\"Hide who's on this wall ▴\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:05:30.790Z","game":"lightning","diff":"scholar","cat":"All","selector":"#timerbar","label":"round-5-timer","action":"inspect","ok":true,"effect":"Timer bar visible, fill class: tb-fill run","errors":[]}
+{"run":1,"ts":"2026-08-03T21:05:30.791Z","game":"lightning","diff":"scholar","cat":"All","selector":"#stage","label":"round-5-render","action":"inspect","ok":true,"effect":"stage_html_len=193, choices=4, imgs_ok=4, imgs_broken=1","errors":[]}
+{"run":1,"ts":"2026-08-03T21:05:31.241Z","game":"lightning","diff":"scholar","cat":"All","selector":".choice","label":"round-5-pick-3","action":"click","ok":true,"effect":"Chose: \"Thomas Lawrence\", reveal: \"✗ Artist: Pieter Brueghel the ElderNext →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:05:30.688Z","selector":".m-card:nth-child(1) [data-place]","label":"Gallery card 1: Place on wall","action":"click","ok":true,"effect":"{\"before\":\"Place on wall →\",\"after\":\"Place on wall →\",\"sigCount\":null}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:05:31.475Z","selector":".m-card:nth-child(2) [data-place]","label":"Gallery card 2: Place on wall","action":"click","ok":true,"effect":"{\"before\":\"Place on wall →\",\"after\":\"Place on wall →\",\"sigCount\":null}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:05:33.115Z","selector":".m-card:nth-child(3) [data-place]","label":"Gallery card 3: Place on wall","action":"click","ok":true,"effect":"{\"before\":\"Place on wall →\",\"after\":\"Place on wall →\",\"sigCount\":null}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:05:34.740Z","selector":"header nav a[href=\"/\"]","label":"Nav: Signature archive","action":"click","ok":true,"effect":"{\"before\":\"Signature archive\",\"sigCount\":null}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:05:35.612Z","selector":"header nav a[href=\"#studio\"]","label":"Nav: Wall studio","action":"click","ok":false,"effect":"ELEMENT_NOT_FOUND","errors":["Element not found: header nav a[href=\"#studio\"]"]}
+{"run":0,"ts":"2026-08-03T21:05:35.645Z","selector":"header nav a[href=\"#order\"]","label":"Nav: Order","action":"click","ok":false,"effect":"ELEMENT_NOT_FOUND","errors":["Element not found: header nav a[href=\"#order\"]"]}
+{"run":0,"ts":"2026-08-03T21:05:35.653Z","selector":"#finderInput","label":"Finder: search input","action":"type:lincoln","ok":false,"effect":"ELEMENT_NOT_FOUND","errors":["Element not found: #finderInput"]}
+{"run":0,"ts":"2026-08-03T21:05:35.659Z","selector":"#finderInput","label":"Finder: clear + type babe ruth","action":"clear+type:babe ruth","ok":false,"effect":"ELEMENT_NOT_FOUND","errors":["Element not found: #finderInput"]}
+{"run":0,"ts":"2026-08-03T21:05:35.665Z","selector":"#finderInput","label":"Finder: clear + type einstein","action":"clear+type:einstein","ok":false,"effect":"ELEMENT_NOT_FOUND","errors":["Element not found: #finderInput"]}
+{"run":0,"ts":"2026-08-03T21:05:35.670Z","selector":"#selMural","label":"Studio: Mural select","action":"select-option:d","ok":false,"effect":"ELEMENT_NOT_FOUND","errors":["Element not found: #selMural"]}
+{"run":0,"ts":"2026-08-03T21:05:35.677Z","selector":"#selMural","label":"Studio: Mural select - politics","action":"select-option:p","ok":false,"effect":"ELEMENT_NOT_FOUND","errors":["Element not found: #selMural"]}
+{"run":0,"ts":"2026-08-03T21:05:35.688Z","selector":"#selMural","label":"Studio: Mural select - sports","action":"select-option:sp","ok":false,"effect":"ELEMENT_NOT_FOUND","errors":["Element not found: #selMural"]}
+{"run":0,"ts":"2026-08-03T21:05:35.701Z","selector":"#murW","label":"Studio: Mural width - set 30","action":"set-value:30","ok":false,"effect":"ELEMENT_NOT_FOUND","errors":["Element not found: #murW"]}
+{"run":0,"ts":"2026-08-03T21:05:35.712Z","selector":"#murH","label":"Studio: Mural height - set 10","action":"set-value:10","ok":false,"effect":"ELEMENT_NOT_FOUND","errors":["Element not found: #murH"]}
+{"run":0,"ts":"2026-08-03T21:05:35.724Z","selector":"#murW","label":"Studio: Mural width - set 16","action":"set-value:16","ok":false,"effect":"ELEMENT_NOT_FOUND","errors":["Element not found: #murW"]}
+{"run":0,"ts":"2026-08-03T21:05:35.731Z","selector":"#murH","label":"Studio: Mural height - set 8","action":"set-value:8","ok":false,"effect":"ELEMENT_NOT_FOUND","errors":["Element not found: #murH"]}
+{"run":0,"ts":"2026-08-03T21:05:35.736Z","selector":"#murW","label":"Studio: Mural width - set 40","action":"set-value:40","ok":false,"effect":"ELEMENT_NOT_FOUND","errors":["Element not found: #murW"]}
+{"run":0,"ts":"2026-08-03T21:05:35.741Z","selector":"#murH","label":"Studio: Mural height - set 16","action":"set-value:16","ok":false,"effect":"ELEMENT_NOT_FOUND","errors":["Element not found: #murH"]}
+{"run":0,"ts":"2026-08-03T21:05:35.747Z","selector":"#wallW","label":"Studio: Wall width slider - 40","action":"set-slider:40","ok":false,"effect":"ELEMENT_NOT_FOUND","errors":["Element not found: #wallW"]}
+{"run":0,"ts":"2026-08-03T21:05:35.752Z","selector":"#wallH","label":"Studio: Wall height slider - 16","action":"set-slider:16","ok":false,"effect":"ELEMENT_NOT_FOUND","errors":["Element not found: #wallH"]}
+{"run":0,"ts":"2026-08-03T21:05:35.758Z","selector":"#wallW","label":"Studio: Wall width slider - 60","action":"set-slider:60","ok":false,"effect":"ELEMENT_NOT_FOUND","errors":["Element not found: #wallW"]}
+{"run":0,"ts":"2026-08-03T21:05:35.763Z","selector":"#wallH","label":"Studio: Wall height slider - 20","action":"set-slider:20","ok":false,"effect":"ELEMENT_NOT_FOUND","errors":["Element not found: #wallH"]}
+{"run":0,"ts":"2026-08-03T21:05:35.768Z","selector":"#wallW","label":"Studio: Wall width slider - 24","action":"set-slider:24","ok":false,"effect":"ELEMENT_NOT_FOUND","errors":["Element not found: #wallW"]}
+{"run":0,"ts":"2026-08-03T21:05:35.773Z","selector":"#wallH","label":"Studio: Wall height slider - 12","action":"set-slider:12","ok":false,"effect":"ELEMENT_NOT_FOUND","errors":["Element not found: #wallH"]}
+{"run":0,"ts":"2026-08-03T21:05:35.778Z","selector":"#btnCenter","label":"Studio: Center on wall","action":"click","ok":false,"effect":"ELEMENT_NOT_FOUND","errors":["Element not found: #btnCenter"]}
+{"run":0,"ts":"2026-08-03T21:05:35.783Z","selector":"#scenePresets button[data-scene=\"study\"]","label":"Scene preset: Study","action":"click","ok":false,"effect":"ELEMENT_NOT_FOUND","errors":["Element not found: #scenePresets button[data-scene=\"study\"]"]}
+{"run":0,"ts":"2026-08-03T21:05:35.788Z","selector":"#scenePresets button[data-scene=\"lounge\"]","label":"Scene preset: Lounge","action":"click","ok":false,"effect":"ELEMENT_NOT_FOUND","errors":["Element not found: #scenePresets button[data-scene=\"lounge\"]"]}
+{"run":0,"ts":"2026-08-03T21:05:35.793Z","selector":"#scenePresets button[data-scene=\"gallery\"]","label":"Scene preset: Gallery","action":"click","ok":false,"effect":"ELEMENT_NOT_FOUND","errors":["Element not found: #scenePresets button[data-scene=\"gallery\"]"]}
+{"run":0,"ts":"2026-08-03T21:05:35.799Z","selector":"#scenePresets button[data-scene=\"plain\"]","label":"Scene preset: Plain","action":"click","ok":false,"effect":"ELEMENT_NOT_FOUND","errors":["Element not found: #scenePresets button[data-scene=\"plain\"]"]}
+{"run":0,"ts":"2026-08-03T21:05:35.804Z","selector":"input[name=\"name\"]","label":"Order: Name input","action":"type:John Test","ok":false,"effect":"ELEMENT_NOT_FOUND","errors":["Element not found: input[name=\"name\"]"]}
+{"run":0,"ts":"2026-08-03T21:05:35.810Z","selector":"input[name=\"email\"]","label":"Order: Email input","action":"type:test@example.com","ok":false,"effect":"ELEMENT_NOT_FOUND","errors":["Element not found: input[name=\"email\"]"]}
+{"run":0,"ts":"2026-08-03T21:05:35.816Z","selector":"input[name=\"wall_w\"]","label":"Order: Wall width input","action":"set-value:24","ok":false,"effect":"ELEMENT_NOT_FOUND","errors":["Element not found: input[name=\"wall_w\"]"]}
+{"run":0,"ts":"2026-08-03T21:05:35.821Z","selector":"input[name=\"wall_h\"]","label":"Order: Wall height input","action":"set-value:12","ok":false,"effect":"ELEMENT_NOT_FOUND","errors":["Element not found: input[name=\"wall_h\"]"]}
+{"run":0,"ts":"2026-08-03T21:05:35.827Z","selector":"textarea[name=\"notes\"]","label":"Order: Notes textarea","action":"type:Test order for master bedroom. Target install October.","ok":false,"effect":"ELEMENT_NOT_FOUND","errors":["Element not found: textarea[name=\"notes\"]"]}
+{"run":0,"ts":"2026-08-03T21:05:35.832Z","selector":"#orderForm button[type=\"submit\"]","label":"Order: Submit form","action":"click","ok":false,"effect":"ELEMENT_NOT_FOUND","errors":["Element not found: #orderForm button[type=\"submit\"]"]}
+{"run":0,"ts":"2026-08-03T21:05:35.856Z","selector":".m-card:nth-child(1) .r-search","label":"Roster card 1: filter \"wash\"","action":"type:wash","ok":false,"effect":"ROSTER_NOT_OPEN","errors":[]}
+{"run":0,"ts":"2026-08-03T21:05:36.267Z","selector":".m-card:nth-child(1) .r-item:first-child","label":"Roster card 1: click first item","action":"click","ok":false,"effect":"NO_ROSTER_ITEMS","errors":[]}
+{"run":0,"ts":"2026-08-03T21:05:36.791Z","selector":".m-card:nth-child(2) .r-search","label":"Roster card 2: filter \"hancock\"","action":"type:hancock","ok":false,"effect":"ROSTER_NOT_OPEN","errors":[]}
+{"run":0,"ts":"2026-08-03T21:05:37.715Z","selector":"#muralEl","label":"Studio: Drag mural","action":"drag","ok":false,"effect":"MURAL_EL_NOT_FOUND","errors":[]}
+{"run":0,"ts":"2026-08-03T21:05:37.717Z","selector":".m-card:nth-child(1) img","label":"Gallery card 1: collage image load","action":"observe","ok":false,"effect":"null","errors":[]}
+{"run":0,"ts":"2026-08-03T21:05:37.718Z","selector":"#readout","label":"Studio: readout check (price + sig count)","action":"observe","ok":false,"effect":"null","errors":[]}
+{"run":0,"ts":"2026-08-03T21:05:37.718Z","selector":"#orderSummary","label":"Order: summary synced with studio","action":"observe","ok":false,"effect":null,"errors":[]}
+{"run":0,"ts":"2026-08-03T21:05:14.723Z","selector":"#sort","label":"Sort: Category then rank","action":"select","value":"cat","ok":false,"effect":"ERROR: locator.scrollIntoViewIfNeeded: Timeout 29985.185999999987ms exceeded.\nCall log:\n\u001b[2m  - attempting scroll into view action\u001b[22m\n\u001b[2m    2 × waiting for element to be stable\u001b[22m\n\u001b[2m      - element i","errors":["locator.scrollIntoViewIfNeeded: Timeout 29985.185999999987ms exceeded.\nCall log:\n\u001b[2m  - attempting scroll into view action\u001b[22m\n\u001b[2m    2 × waiting for element to be stable\u001b[22m\n\u001b[2m      - element is not visible\u001b[22m\n\u001b[2m    - retrying scroll into view action\u001b[22m\n\u001b[2m    - waiting 20ms\u001b[22m\n\u001b[2m "]}
+{"run":1,"ts":"2026-08-03T21:06:01.242Z","game":"lightning","diff":"scholar","cat":"All","selector":"#reveal a","label":"round-5-reveal-link","action":"inspect","ok":false,"effect":"No reveal link found after pick","errors":["Missing reveal link in lightning round 5"]}
+{"run":1,"ts":"2026-08-03T21:06:01.497Z","game":"lightning","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-5-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:06:01.902Z","game":"lightning","diff":"scholar","cat":"All","selector":"#timerbar","label":"round-6-timer","action":"inspect","ok":true,"effect":"Timer bar visible, fill class: tb-fill run","errors":[]}
+{"run":1,"ts":"2026-08-03T21:06:01.903Z","game":"lightning","diff":"scholar","cat":"All","selector":"#stage","label":"round-6-render","action":"inspect","ok":true,"effect":"stage_html_len=195, choices=4, imgs_ok=5, imgs_broken=1","errors":[]}
+{"run":1,"ts":"2026-08-03T21:06:02.354Z","game":"lightning","diff":"scholar","cat":"All","selector":".choice","label":"round-6-pick-2","action":"click","ok":true,"effect":"Chose: \"Amédée-David, the Comte de Pastoret\", reveal: \"✗ Painting: The Resurrection · see it →Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:06:02.356Z","game":"lightning","diff":"scholar","cat":"All","selector":"#reveal a","label":"round-6-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/15233","errors":[]}
+{"run":1,"ts":"2026-08-03T21:06:02.606Z","game":"lightning","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-6-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:06:03.014Z","game":"lightning","diff":"scholar","cat":"All","selector":"#timerbar","label":"round-7-timer","action":"inspect","ok":true,"effect":"Timer bar visible, fill class: tb-fill run","errors":[]}
+{"run":1,"ts":"2026-08-03T21:06:03.015Z","game":"lightning","diff":"scholar","cat":"All","selector":"#stage","label":"round-7-render","action":"inspect","ok":true,"effect":"stage_html_len=193, choices=4, imgs_ok=6, imgs_broken=1","errors":[]}
+{"run":1,"ts":"2026-08-03T21:06:03.466Z","game":"lightning","diff":"scholar","cat":"All","selector":".choice","label":"round-7-pick-0","action":"click","ok":true,"effect":"Chose: \"Jean-Auguste-Dominique Ingres\", reveal: \"✗ Artist: Paolo VeroneseNext →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:05:44.726Z","selector":"#sort","label":"Sort: Name A→Z","action":"select","value":"name","ok":false,"effect":"ERROR: locator.scrollIntoViewIfNeeded: Timeout 29989.33799999999ms exceeded.\nCall log:\n\u001b[2m  - attempting scroll into view action\u001b[22m\n\u001b[2m    2 × waiting for element to be stable\u001b[22m\n\u001b[2m      - element is","errors":["locator.scrollIntoViewIfNeeded: Timeout 29989.33799999999ms exceeded.\nCall log:\n\u001b[2m  - attempting scroll into view action\u001b[22m\n\u001b[2m    2 × waiting for element to be stable\u001b[22m\n\u001b[2m      - element is not visible\u001b[22m\n\u001b[2m    - retrying scroll into view action\u001b[22m\n\u001b[2m    - waiting 20ms\u001b[22m\n\u001b[2m  "]}
+{"run":0,"ts":"2026-08-03T21:06:24.655Z","selector":"page","label":"PAGE LOAD","action":"goto","ok":true,"effect":"{\"title\":\"Celebrity Signature Murals — made to order\",\"muralCards\":33,\"sigsLoaded\":true}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:06:24.655Z","selector":".m-card:nth-child(1) .name-toggle","label":"Gallery card 1: Show names toggle","action":"click","ok":true,"effect":"{\"before\":\"Show names\",\"after\":\"Show names\",\"sigCount\":null}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:06:25.479Z","selector":".m-card:nth-child(1) .name-toggle","label":"Gallery card 1: Hide names toggle","action":"click","ok":true,"effect":"{\"before\":\"Show names\",\"after\":\"Show names\",\"sigCount\":null}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:06:26.257Z","selector":".m-card:nth-child(2) .name-toggle","label":"Gallery card 2: Show names toggle","action":"click","ok":true,"effect":"{\"before\":\"Show names\",\"after\":\"Show names\",\"sigCount\":null}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:06:27.050Z","selector":".m-card:nth-child(3) .name-toggle","label":"Gallery card 3: Show names toggle","action":"click","ok":true,"effect":"{\"before\":\"Show names\",\"after\":\"Show names\",\"sigCount\":null}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:06:27.838Z","selector":".m-card:nth-child(1) .roster-trig","label":"Gallery card 1: Roster drawer open","action":"click","ok":true,"effect":"{\"before\":\"See who's on this wall ▾\",\"after\":\"Hide who's on this wall ▴\",\"sigCount\":null}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:06:28.633Z","selector":".m-card:nth-child(2) .roster-trig","label":"Gallery card 2: Roster drawer open","action":"click","ok":true,"effect":"{\"before\":\"See who's on this wall ▾\",\"after\":\"Hide who's on this wall ▴\",\"sigCount\":null}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:06:29.419Z","selector":".m-card:nth-child(3) .roster-trig","label":"Gallery card 3: Roster drawer open","action":"click","ok":true,"effect":"{\"before\":\"See who's on this wall ▾\",\"after\":\"Hide who's on this wall ▴\",\"sigCount\":null}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:06:30.213Z","selector":".m-card:nth-child(1) [data-place]","label":"Gallery card 1: Place on wall","action":"click","ok":true,"effect":"{\"before\":\"Place on wall →\",\"after\":\"Place on wall →\",\"sigCount\":null}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:06:30.991Z","selector":".m-card:nth-child(2) [data-place]","label":"Gallery card 2: Place on wall","action":"click","ok":true,"effect":"{\"before\":\"Place on wall →\",\"after\":\"Place on wall →\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:06:33.467Z","game":"lightning","diff":"scholar","cat":"All","selector":"#reveal a","label":"round-7-reveal-link","action":"inspect","ok":false,"effect":"No reveal link found after pick","errors":["Missing reveal link in lightning round 7"]}
+{"run":1,"ts":"2026-08-03T21:06:33.718Z","game":"lightning","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-7-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:06:34.127Z","game":"lightning","diff":"scholar","cat":"All","selector":"#timerbar","label":"round-8-timer","action":"inspect","ok":true,"effect":"Timer bar visible, fill class: tb-fill run","errors":[]}
+{"run":1,"ts":"2026-08-03T21:06:34.127Z","game":"lightning","diff":"scholar","cat":"All","selector":"#stage","label":"round-8-render","action":"inspect","ok":true,"effect":"stage_html_len=195, choices=4, imgs_ok=7, imgs_broken=1","errors":[]}
+{"run":0,"ts":"2026-08-03T21:06:32.640Z","selector":".m-card:nth-child(3) [data-place]","label":"Gallery card 3: Place on wall","action":"click","ok":true,"effect":"{\"before\":\"Place on wall →\",\"after\":\"Place on wall →\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:06:34.578Z","game":"lightning","diff":"scholar","cat":"All","selector":".choice","label":"round-8-pick-3","action":"click","ok":true,"effect":"Chose: \"Napkin Depicting The Five Senses\", reveal: \"✗ Painting: Circumcision of the Christ Child (recto); Marriage of the Virgin (ve\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:06:34.579Z","game":"lightning","diff":"scholar","cat":"All","selector":"#reveal a","label":"round-8-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/112742","errors":[]}
+{"run":1,"ts":"2026-08-03T21:06:34.829Z","game":"lightning","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-8-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:06:34.257Z","selector":"header nav a[href=\"#studio\"]","label":"Nav: Wall studio","action":"click","ok":true,"effect":"{\"before\":\"Wall studio\",\"after\":\"Wall studio\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:06:35.235Z","game":"lightning","diff":"scholar","cat":"All","selector":"#timerbar","label":"round-9-timer","action":"inspect","ok":true,"effect":"Timer bar visible, fill class: tb-fill run","errors":[]}
+{"run":1,"ts":"2026-08-03T21:06:35.236Z","game":"lightning","diff":"scholar","cat":"All","selector":"#stage","label":"round-9-render","action":"inspect","ok":true,"effect":"stage_html_len=193, choices=4, imgs_ok=8, imgs_broken=1","errors":[]}
+{"run":1,"ts":"2026-08-03T21:06:35.688Z","game":"lightning","diff":"scholar","cat":"All","selector":".choice","label":"round-9-pick-2","action":"click","ok":true,"effect":"Chose: \"Jean-Auguste-Dominique Ingres\", reveal: \"✗ Artist: Jacopo TintorettoNext →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:06:35.046Z","selector":"header nav a[href=\"#order\"]","label":"Nav: Order","action":"click","ok":true,"effect":"{\"before\":\"Order\",\"after\":\"Order\",\"sigCount\":null}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:06:35.826Z","selector":"header nav a[href=\"/\"]","label":"Nav: Signature archive","action":"click-navigate","ok":true,"effect":"CLICKED_NAVIGATE_WENT_BACK","errors":[]}
+{"run":0,"ts":"2026-08-03T21:06:38.054Z","selector":"#finderInput","label":"Finder: search input","action":"type:lincoln","ok":true,"effect":"{\"before\":null,\"after\":\"lincoln\",\"sigCount\":null}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:06:38.697Z","selector":"#finderInput","label":"Finder: clear + type babe ruth","action":"clear+type:babe ruth","ok":true,"effect":"{\"before\":\"lincoln\",\"after\":\"babe ruth\",\"sigCount\":null}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:06:39.352Z","selector":"#finderInput","label":"Finder: clear + type einstein","action":"clear+type:einstein","ok":true,"effect":"{\"before\":\"babe ruth\",\"after\":\"einstein\",\"sigCount\":null}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:06:39.985Z","selector":"#selMural","label":"Studio: Mural select - declaration","action":"select-option:d","ok":true,"effect":"{\"before\":\"Oldest Signatures in HistoryDeclaration of IndependencePolit\",\"after\":\"Oldest Signatures in HistoryDeclaration of IndependencePolit\",\"sigCount\":56,\"orderSummary\":\"Declaration of Independence · 12×24 ft custom · 56 signatures · $2,880\\n     Placement on a 32×14 ft \"}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:06:40.624Z","selector":"#selMural","label":"Studio: Mural select - politics","action":"select-option:p","ok":true,"effect":"{\"before\":\"Oldest Signatures in HistoryDeclaration of IndependencePolit\",\"after\":\"Oldest Signatures in HistoryDeclaration of IndependencePolit\",\"sigCount\":54,\"orderSummary\":\"Politics & Statecraft · 12×24 ft custom · 54 signatures · $2,880\\n     Placement on a 32×14 ft wall: \"}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:06:41.251Z","selector":"#selMural","label":"Studio: Mural select - composers","action":"select-option:co","ok":true,"effect":"{\"before\":\"Oldest Signatures in HistoryDeclaration of IndependencePolit\",\"after\":\"Oldest Signatures in HistoryDeclaration of IndependencePolit\",\"sigCount\":3,\"orderSummary\":\"Great Composers · 12×24 ft custom · 3 signatures · $2,880\\n     Placement on a 32×14 ft wall: 4.0 ft \"}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:06:41.886Z","selector":"#murW","label":"Studio: Mural width - set 30","action":"set-value:30","ok":true,"effect":"{\"before\":\"24\",\"after\":\"30\",\"studioReadout\":\"From left wall: 1.0 ft\\n    From right wall: 1.0 ft\\n    Bottom off floor: 1.0 ft\\n    Mural: 12×30 ft · 360 sq ft\\n    Signatures shown: 3\\n    Price: $3,600\",\"sigCount\":3,\"orderSummary\":\"Great Composers · 12×30 ft custom · 3 signatures · $3,600\\n     Placement on a 32×14 ft wall: 1.0 ft \"}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:06:42.538Z","selector":"#murH","label":"Studio: Mural height - set 10","action":"set-value:10","ok":true,"effect":"{\"before\":\"12\",\"after\":\"10\",\"studioReadout\":\"From left wall: 1.0 ft\\n    From right wall: 1.0 ft\\n    Bottom off floor: 2.0 ft\\n    Mural: 10×30 ft · 300 sq ft\\n    Signatures shown: 3\\n    Price: $3,000\",\"sigCount\":3,\"orderSummary\":\"Great Composers · 10×30 ft custom · 3 signatures · $3,000\\n     Placement on a 32×14 ft wall: 1.0 ft \"}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:06:43.184Z","selector":"#murW","label":"Studio: Mural width - set 16","action":"set-value:16","ok":true,"effect":"{\"before\":\"30\",\"after\":\"16\",\"studioReadout\":\"From left wall: 8.0 ft\\n    From right wall: 8.0 ft\\n    Bottom off floor: 2.0 ft\\n    Mural: 10×16 ft · 160 sq ft\\n    Signatures shown: 3\\n    Price: $1,600\",\"sigCount\":3,\"orderSummary\":\"Great Composers · 10×16 ft custom · 3 signatures · $1,600\\n     Placement on a 32×14 ft wall: 8.0 ft \"}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:06:43.821Z","selector":"#murH","label":"Studio: Mural height - set 8","action":"set-value:8","ok":true,"effect":"{\"before\":\"10\",\"after\":\"8\",\"studioReadout\":\"From left wall: 8.0 ft\\n    From right wall: 8.0 ft\\n    Bottom off floor: 3.0 ft\\n    Mural: 8×16 ft · 128 sq ft\\n    Signatures shown: 3\\n    Price: $1,280\",\"sigCount\":3,\"orderSummary\":\"Great Composers · 8×16 ft custom · 3 signatures · $1,280\\n     Placement on a 32×14 ft wall: 8.0 ft f\"}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:06:14.729Z","selector":"#sort","label":"Sort: Name Z→A","action":"select","value":"name-desc","ok":false,"effect":"ERROR: locator.scrollIntoViewIfNeeded: Timeout 29991.475999999995ms exceeded.\nCall log:\n\u001b[2m  - attempting scroll into view action\u001b[22m\n\u001b[2m    2 × waiting for element to be stable\u001b[22m\n\u001b[2m      - element i","errors":["locator.scrollIntoViewIfNeeded: Timeout 29991.475999999995ms exceeded.\nCall log:\n\u001b[2m  - attempting scroll into view action\u001b[22m\n\u001b[2m    2 × waiting for element to be stable\u001b[22m\n\u001b[2m      - element is not visible\u001b[22m\n\u001b[2m    - retrying scroll into view action\u001b[22m\n\u001b[2m    - waiting 20ms\u001b[22m\n\u001b[2m "]}
+{"run":0,"ts":"2026-08-03T21:06:44.457Z","selector":"#murW","label":"Studio: Mural width - set 40","action":"set-value:40","ok":true,"effect":"{\"before\":\"16\",\"after\":\"40\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 3.0 ft\\n    Mural: 8×40 ft · 320 sq ft\\n    Signatures shown: 3\\n    Price: $3,200\",\"sigCount\":3,\"orderSummary\":\"Great Composers · 8×40 ft custom · 3 signatures · $3,200\\n     Placement on a 32×14 ft wall: 0.0 ft f\"}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:06:45.101Z","selector":"#murH","label":"Studio: Mural height - set 16","action":"set-value:16","ok":true,"effect":"{\"before\":\"8\",\"after\":\"16\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 16×40 ft · 640 sq ft\\n    Signatures shown: 3\\n    Price: $6,400\",\"sigCount\":3,\"orderSummary\":\"Great Composers · 16×40 ft custom · 3 signatures · $6,400\\n     Placement on a 32×14 ft wall: 0.0 ft \"}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:06:45.741Z","selector":"#wallW","label":"Studio: Wall width slider - 40","action":"set-slider:40","ok":true,"effect":"{\"before\":\"32\",\"after\":\"40\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 16×40 ft · 640 sq ft\\n    Signatures shown: 3\\n    Price: $6,400\",\"sigCount\":null,\"orderSummary\":\"Great Composers · 16×40 ft custom · 3 signatures · $6,400\\n     Placement on a 40×14 ft wall: 0.0 ft \"}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:06:46.371Z","selector":"#wallH","label":"Studio: Wall height slider - 16","action":"set-slider:16","ok":true,"effect":"{\"before\":\"14\",\"after\":\"16\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 16×40 ft · 640 sq ft\\n    Signatures shown: 3\\n    Price: $6,400\",\"sigCount\":null,\"orderSummary\":\"Great Composers · 16×40 ft custom · 3 signatures · $6,400\\n     Placement on a 40×16 ft wall: 0.0 ft \"}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:06:46.996Z","selector":"#wallW","label":"Studio: Wall width slider - 60","action":"set-slider:60","ok":true,"effect":"{\"before\":\"40\",\"after\":\"60\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 20.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 16×40 ft · 640 sq ft\\n    Signatures shown: 3\\n    Price: $6,400\",\"sigCount\":null,\"orderSummary\":\"Great Composers · 16×40 ft custom · 3 signatures · $6,400\\n     Placement on a 60×16 ft wall: 0.0 ft \"}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:06:47.621Z","selector":"#wallH","label":"Studio: Wall height slider - 20","action":"set-slider:20","ok":true,"effect":"{\"before\":\"16\",\"after\":\"20\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 20.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 16×40 ft · 640 sq ft\\n    Signatures shown: 3\\n    Price: $6,400\",\"sigCount\":null,\"orderSummary\":\"Great Composers · 16×40 ft custom · 3 signatures · $6,400\\n     Placement on a 60×20 ft wall: 0.0 ft \"}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:06:48.256Z","selector":"#wallW","label":"Studio: Wall width slider - 24","action":"set-slider:24","ok":true,"effect":"{\"before\":\"60\",\"after\":\"24\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 16×40 ft · 640 sq ft\\n    Signatures shown: 3\\n    Price: $6,400\",\"sigCount\":null,\"orderSummary\":\"Great Composers · 16×40 ft custom · 3 signatures · $6,400\\n     Placement on a 24×20 ft wall: 0.0 ft \"}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:06:48.892Z","selector":"#wallH","label":"Studio: Wall height slider - 12","action":"set-slider:12","ok":true,"effect":"{\"before\":\"20\",\"after\":\"12\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 16×40 ft · 640 sq ft\\n    Signatures shown: 3\\n    Price: $6,400\",\"sigCount\":null,\"orderSummary\":\"Great Composers · 16×40 ft custom · 3 signatures · $6,400\\n     Placement on a 24×12 ft wall: 0.0 ft \"}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:06:49.536Z","selector":"#btnCenter","label":"Studio: Center on wall","action":"click","ok":true,"effect":"{\"before\":\"Center on wall\",\"after\":\"Center on wall\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 16×40 ft · 640 sq ft\\n    Signatures shown: 3\\n    Price: $6,400\",\"sigCount\":null}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:06:50.316Z","selector":"#scenePresets button[data-scene=\"study\"]","label":"Scene preset: Study","action":"click","ok":true,"effect":"{\"before\":\"Study\",\"after\":\"Study\",\"sigCount\":null}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:06:51.112Z","selector":"#scenePresets button[data-scene=\"lounge\"]","label":"Scene preset: Lounge","action":"click","ok":true,"effect":"{\"before\":\"Lounge\",\"after\":\"Lounge\",\"sigCount\":null}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:06:51.901Z","selector":"#scenePresets button[data-scene=\"gallery\"]","label":"Scene preset: Gallery","action":"click","ok":true,"effect":"{\"before\":\"Gallery\",\"after\":\"Gallery\",\"sigCount\":null}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:06:52.690Z","selector":"#scenePresets button[data-scene=\"plain\"]","label":"Scene preset: Plain","action":"click","ok":true,"effect":"{\"before\":\"Plain\",\"after\":\"Plain\",\"sigCount\":null}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:06:53.466Z","selector":"input[name=\"name\"]","label":"Order: Name input","action":"type:John Test","ok":true,"effect":"{\"before\":null,\"after\":\"John Test\",\"sigCount\":null}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:06:54.091Z","selector":"input[name=\"email\"]","label":"Order: Email input","action":"type:test@example.com","ok":true,"effect":"{\"before\":null,\"after\":\"test@example.com\",\"sigCount\":null}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:06:54.716Z","selector":"input[name=\"wall_w\"]","label":"Order: Wall width input","action":"set-value:24","ok":true,"effect":"{\"before\":\"32\",\"after\":\"24\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 16×40 ft · 640 sq ft\\n    Signatures shown: 3\\n    Price: $6,400\",\"sigCount\":null,\"orderSummary\":\"Great Composers · 16×40 ft custom · 3 signatures · $6,400\\n     Placement on a 24×12 ft wall: 0.0 ft \"}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:06:55.344Z","selector":"input[name=\"wall_h\"]","label":"Order: Wall height input","action":"set-value:12","ok":true,"effect":"{\"before\":\"14\",\"after\":\"12\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 16×40 ft · 640 sq ft\\n    Signatures shown: 3\\n    Price: $6,400\",\"sigCount\":null,\"orderSummary\":\"Great Composers · 16×40 ft custom · 3 signatures · $6,400\\n     Placement on a 24×12 ft wall: 0.0 ft \"}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:06:55.981Z","selector":"textarea[name=\"notes\"]","label":"Order: Notes textarea","action":"type:Test order for master bedroom. Target install October.","ok":true,"effect":"{\"before\":null,\"after\":\"Test order for master bedroom. Target install October.\",\"sigCount\":null}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:06:56.604Z","selector":"#orderForm button[type=\"submit\"]","label":"Order: Submit form","action":"click","ok":true,"effect":"{\"before\":\"Request this mural\",\"after\":\"Request this mural\",\"sigCount\":null}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:06:57.384Z","selector":".m-card:nth-child(1) .r-search","label":"Roster card 1: filter \"wash\"","action":"type:wash","ok":true,"effect":"{\"before\":null,\"after\":\"wash\",\"sigCount\":null}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:06:58.413Z","selector":".m-card:nth-child(1) .r-item:first-child","label":"Roster card 1: click roster item → provenance modal","action":"click","ok":false,"effect":"ACTION_FAILED","errors":["Error: locator.click: Element is not visible\nCall log:\n\u001b[2m  - waiting for locator('.m-card:nth-child(1) .r-item:first-child').first()\u001b[22m\n\u001b[2m    - locator resolved to <button type=\"button\" class=\"r-item\" data-sig=\"Oldest Signatures|1\">…</button>\u001b[22m\n\u001b[2m  - attempting click action\u001b[22m\n\u001b[2m    - scrolling into view if needed\u001b[22m\n"]}
+{"run":0,"ts":"2026-08-03T21:07:04.077Z","selector":"#provModal","label":"Provenance modal: opened?","action":"observe","ok":false,"effect":"MODAL_NOT_OPEN","errors":[]}
+{"run":0,"ts":"2026-08-03T21:07:04.581Z","selector":".m-card:nth-child(2) .r-search","label":"Roster card 2: filter \"hancock\"","action":"type:hancock","ok":true,"effect":"{\"before\":null,\"after\":\"hancock\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:07:05.690Z","game":"lightning","diff":"scholar","cat":"All","selector":"#reveal a","label":"round-9-reveal-link","action":"inspect","ok":false,"effect":"No reveal link found after pick","errors":["Missing reveal link in lightning round 9"]}
+{"run":1,"ts":"2026-08-03T21:07:05.942Z","game":"lightning","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-9-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:07:06.349Z","game":"lightning","diff":"scholar","cat":"All","selector":"#timerbar","label":"round-10-timer","action":"inspect","ok":true,"effect":"Timer bar visible, fill class: tb-fill run","errors":[]}
+{"run":1,"ts":"2026-08-03T21:07:06.349Z","game":"lightning","diff":"scholar","cat":"All","selector":"#stage","label":"round-10-render","action":"inspect","ok":true,"effect":"stage_html_len=195, choices=4, imgs_ok=9, imgs_broken=1","errors":[]}
+{"run":1,"ts":"2026-08-03T21:07:06.801Z","game":"lightning","diff":"scholar","cat":"All","selector":".choice","label":"round-10-pick-0","action":"click","ok":true,"effect":"Chose: \"The Resurrection\", reveal: \"✗ Painting: Roman Portrait Bust · see it →Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:07:06.803Z","game":"lightning","diff":"scholar","cat":"All","selector":"#reveal a","label":"round-10-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/95902","errors":[]}
+{"run":1,"ts":"2026-08-03T21:07:07.054Z","game":"lightning","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-10-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:07:07.460Z","game":"lightning","diff":"scholar","cat":"All","selector":"#timerbar","label":"round-11-timer","action":"inspect","ok":true,"effect":"Timer bar visible, fill class: tb-fill run","errors":[]}
+{"run":1,"ts":"2026-08-03T21:07:07.461Z","game":"lightning","diff":"scholar","cat":"All","selector":"#stage","label":"round-11-render","action":"inspect","ok":true,"effect":"stage_html_len=193, choices=4, imgs_ok=10, imgs_broken=1","errors":[]}
+{"run":0,"ts":"2026-08-03T21:07:06.130Z","selector":"#muralEl","label":"Studio: Drag mural","action":"drag","ok":false,"effect":"{\"before\":{\"left\":\"0px\",\"top\":\"0px\"},\"after\":{\"left\":\"0px\",\"top\":\"0px\"},\"readout\":\"From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 16×40 ft · 640 sq ft\\n    Signatures shown: 3\\n    Price: $6,\",\"moved\":false}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:07:07.756Z","selector":".m-card:nth-child(1) img","label":"Gallery card 1: collage image load","action":"observe","ok":true,"effect":"{\"src\":\"http://localhost:9920/output/collage-oldest-signatures.png\",\"complete\":true,\"naturalW\":1570}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:07:07.756Z","selector":"#readout","label":"Studio: readout check (price + sig count)","action":"observe","ok":true,"effect":"{\"text\":\"\\n    From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 16×40 ft · 640 sq ft\\n    Signatures shown: 3\\n    Price: $6,400\",\"price\":\"Price: $6,400\",\"sigs\":\"Signatures shown: 3\",\"sqft\":\"640 sq ft\"}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:07:07.757Z","selector":"#orderSummary","label":"Order: summary synced with studio","action":"observe","ok":true,"effect":"Great Composers · 16×40 ft custom · 3 signatures · $6,400\n     Placement on a 24×12 ft wall: 0.0 ft from left, 0.0 ft off floor.","errors":[]}
+{"run":1,"ts":"2026-08-03T21:07:07.913Z","game":"lightning","diff":"scholar","cat":"All","selector":".choice","label":"round-11-pick-3","action":"click","ok":true,"effect":"Chose: \"Adolph von Menzel\", reveal: \"✗ Artist: Kitagawa UtamaroNext →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:07:12.309Z","selector":"page","label":"PAGE LOAD","action":"goto","ok":true,"effect":"{\"title\":\"Celebrity Signature Murals — made to order\",\"muralCards\":33,\"sigsLoaded\":true}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:07:12.310Z","selector":"#orderForm button[type=\"submit\"]","label":"Order: Submit form","action":"click","ok":true,"effect":"{\"before\":\"Request this mural\",\"after\":\"Request this mural\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:07:13.126Z","selector":"textarea[name=\"notes\"]","label":"Order: Notes textarea","action":"type:Test order for master bedroom. Target install October.","ok":true,"effect":"{\"before\":null,\"after\":\"Test order for master bedroom. Target install October.\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:07:13.760Z","selector":"input[name=\"wall_h\"]","label":"Order: Wall height input","action":"set-value:12","ok":true,"effect":"{\"before\":\"14\",\"after\":\"12\",\"studioReadout\":\"From left wall: 4.0 ft\\n    From right wall: 4.0 ft\\n    Bottom off floor: 1.0 ft\\n    Mural: 12×24 ft · 288 sq ft\\n    Signatures shown: 18\\n    Price: $2,880\",\"sigCount\":null,\"orderSummary\":\"Oldest Signatures in History · 12×24 ft custom · 18 signatures · $2,880\\n     Placement on a 32×14 ft\"}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:06:44.731Z","selector":"#sort","label":"Sort: Rank","action":"select","value":"rank","ok":false,"effect":"ERROR: locator.scrollIntoViewIfNeeded: Timeout 29991.062000000005ms exceeded.\nCall log:\n\u001b[2m  - attempting scroll into view action\u001b[22m\n\u001b[2m    2 × waiting for element to be stable\u001b[22m\n\u001b[2m      - element i","errors":["locator.scrollIntoViewIfNeeded: Timeout 29991.062000000005ms exceeded.\nCall log:\n\u001b[2m  - attempting scroll into view action\u001b[22m\n\u001b[2m    2 × waiting for element to be stable\u001b[22m\n\u001b[2m      - element is not visible\u001b[22m\n\u001b[2m    - retrying scroll into view action\u001b[22m\n\u001b[2m    - waiting 20ms\u001b[22m\n\u001b[2m "]}
+{"run":1,"ts":"2026-08-03T21:07:14.399Z","selector":"input[name=\"wall_w\"]","label":"Order: Wall width input","action":"set-value:24","ok":true,"effect":"{\"before\":\"32\",\"after\":\"24\",\"studioReadout\":\"From left wall: 4.0 ft\\n    From right wall: 4.0 ft\\n    Bottom off floor: 1.0 ft\\n    Mural: 12×24 ft · 288 sq ft\\n    Signatures shown: 18\\n    Price: $2,880\",\"sigCount\":null,\"orderSummary\":\"Oldest Signatures in History · 12×24 ft custom · 18 signatures · $2,880\\n     Placement on a 32×14 ft\"}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:07:15.025Z","selector":"input[name=\"email\"]","label":"Order: Email input","action":"type:test@example.com","ok":true,"effect":"{\"before\":null,\"after\":\"test@example.com\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:07:15.661Z","selector":"input[name=\"name\"]","label":"Order: Name input","action":"type:John Test","ok":true,"effect":"{\"before\":null,\"after\":\"John Test\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:07:16.301Z","selector":"#scenePresets button[data-scene=\"plain\"]","label":"Scene preset: Plain","action":"click","ok":true,"effect":"{\"before\":\"Plain\",\"after\":\"Plain\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:07:17.078Z","selector":"#scenePresets button[data-scene=\"gallery\"]","label":"Scene preset: Gallery","action":"click","ok":true,"effect":"{\"before\":\"Gallery\",\"after\":\"Gallery\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:07:17.856Z","selector":"#scenePresets button[data-scene=\"lounge\"]","label":"Scene preset: Lounge","action":"click","ok":true,"effect":"{\"before\":\"Lounge\",\"after\":\"Lounge\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:07:18.642Z","selector":"#scenePresets button[data-scene=\"study\"]","label":"Scene preset: Study","action":"click","ok":true,"effect":"{\"before\":\"Study\",\"after\":\"Study\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:07:19.427Z","selector":"#btnCenter","label":"Studio: Center on wall","action":"click","ok":true,"effect":"{\"before\":\"Center on wall\",\"after\":\"Center on wall\",\"studioReadout\":\"From left wall: 4.0 ft\\n    From right wall: 4.0 ft\\n    Bottom off floor: 1.0 ft\\n    Mural: 12×24 ft · 288 sq ft\\n    Signatures shown: 18\\n    Price: $2,880\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:07:20.209Z","selector":"#wallH","label":"Studio: Wall height slider - 12","action":"set-slider:12","ok":true,"effect":"{\"before\":\"14\",\"after\":\"12\",\"studioReadout\":\"From left wall: 4.0 ft\\n    From right wall: 4.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 12×24 ft · 288 sq ft\\n    Signatures shown: 18\\n    Price: $2,880\",\"sigCount\":null,\"orderSummary\":\"Oldest Signatures in History · 12×24 ft custom · 18 signatures · $2,880\\n     Placement on a 32×12 ft\"}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:07:20.845Z","selector":"#wallW","label":"Studio: Wall width slider - 24","action":"set-slider:24","ok":true,"effect":"{\"before\":\"32\",\"after\":\"24\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 12×24 ft · 288 sq ft\\n    Signatures shown: 18\\n    Price: $2,880\",\"sigCount\":null,\"orderSummary\":\"Oldest Signatures in History · 12×24 ft custom · 18 signatures · $2,880\\n     Placement on a 24×12 ft\"}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:07:21.484Z","selector":"#wallH","label":"Studio: Wall height slider - 20","action":"set-slider:20","ok":true,"effect":"{\"before\":\"12\",\"after\":\"20\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 12×24 ft · 288 sq ft\\n    Signatures shown: 18\\n    Price: $2,880\",\"sigCount\":null,\"orderSummary\":\"Oldest Signatures in History · 12×24 ft custom · 18 signatures · $2,880\\n     Placement on a 24×20 ft\"}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:07:22.261Z","selector":"#wallW","label":"Studio: Wall width slider - 60","action":"set-slider:60","ok":true,"effect":"{\"before\":\"24\",\"after\":\"60\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 36.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 12×24 ft · 288 sq ft\\n    Signatures shown: 18\\n    Price: $2,880\",\"sigCount\":null,\"orderSummary\":\"Oldest Signatures in History · 12×24 ft custom · 18 signatures · $2,880\\n     Placement on a 60×20 ft\"}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:07:22.900Z","selector":"#wallH","label":"Studio: Wall height slider - 16","action":"set-slider:16","ok":true,"effect":"{\"before\":\"20\",\"after\":\"16\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 36.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 12×24 ft · 288 sq ft\\n    Signatures shown: 18\\n    Price: $2,880\",\"sigCount\":null,\"orderSummary\":\"Oldest Signatures in History · 12×24 ft custom · 18 signatures · $2,880\\n     Placement on a 60×16 ft\"}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:07:32.371Z","selector":"page","label":"PAGE LOAD","action":"goto","ok":true,"effect":"{\"title\":\"Celebrity Signature Murals — made to order\",\"muralCards\":33,\"sigsLoaded\":true}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:07:32.372Z","selector":".m-card:nth-child(1) .name-toggle","label":"Gallery card 1: Show names toggle","action":"click","ok":true,"effect":"{\"before\":\"Show names\",\"after\":\"Show names\",\"sigCount\":null}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:07:33.203Z","selector":".m-card:nth-child(1) .name-toggle","label":"Gallery card 1: Hide names toggle","action":"click","ok":true,"effect":"{\"before\":\"Show names\",\"after\":\"Show names\",\"sigCount\":null}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:07:33.981Z","selector":".m-card:nth-child(2) .name-toggle","label":"Gallery card 2: Show names toggle","action":"click","ok":true,"effect":"{\"before\":\"Show names\",\"after\":\"Show names\",\"sigCount\":null}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:07:34.779Z","selector":".m-card:nth-child(3) .name-toggle","label":"Gallery card 3: Show names toggle","action":"click","ok":true,"effect":"{\"before\":\"Show names\",\"after\":\"Show names\",\"sigCount\":null}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:07:35.563Z","selector":".m-card:nth-child(1) .roster-trig","label":"Gallery card 1: Roster drawer open","action":"click","ok":true,"effect":"{\"before\":\"See who's on this wall ▾\",\"after\":\"Hide who's on this wall ▴\",\"sigCount\":null}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:07:36.351Z","selector":".m-card:nth-child(2) .roster-trig","label":"Gallery card 2: Roster drawer open","action":"click","ok":true,"effect":"{\"before\":\"See who's on this wall ▾\",\"after\":\"Hide who's on this wall ▴\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:07:37.914Z","game":"lightning","diff":"scholar","cat":"All","selector":"#reveal a","label":"round-11-reveal-link","action":"inspect","ok":false,"effect":"No reveal link found after pick","errors":["Missing reveal link in lightning round 11"]}
+{"run":0,"ts":"2026-08-03T21:07:37.134Z","selector":".m-card:nth-child(3) .roster-trig","label":"Gallery card 3: Roster drawer open","action":"click","ok":true,"effect":"{\"before\":\"See who's on this wall ▾\",\"after\":\"Hide who's on this wall ▴\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:07:38.168Z","game":"lightning","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-11-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:07:38.578Z","game":"lightning","diff":"scholar","cat":"All","selector":"#timerbar","label":"round-12-timer","action":"inspect","ok":true,"effect":"Timer bar visible, fill class: tb-fill run","errors":[]}
+{"run":1,"ts":"2026-08-03T21:07:38.578Z","game":"lightning","diff":"scholar","cat":"All","selector":"#stage","label":"round-12-render","action":"inspect","ok":true,"effect":"stage_html_len=195, choices=4, imgs_ok=11, imgs_broken=1","errors":[]}
+{"run":0,"ts":"2026-08-03T21:07:37.915Z","selector":".m-card:nth-child(1) [data-place]","label":"Gallery card 1: Place on wall","action":"click","ok":true,"effect":"{\"before\":\"Place on wall →\",\"after\":\"Place on wall →\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:07:39.040Z","game":"lightning","diff":"scholar","cat":"All","selector":".choice","label":"round-12-pick-2","action":"click","ok":true,"effect":"Chose: \"Anna Maria Dashwood, later Marchioness o\", reveal: \"✗ Painting: The Courtesan Arihara of the Tsuruya, and Child Attendants Aoe and S\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:07:39.042Z","game":"lightning","diff":"scholar","cat":"All","selector":"#reveal a","label":"round-12-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/19236","errors":[]}
+{"run":1,"ts":"2026-08-03T21:07:39.292Z","game":"lightning","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-12-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:07:39.698Z","game":"lightning","diff":"scholar","cat":"All","selector":"#timerbar","label":"round-13-timer","action":"inspect","ok":true,"effect":"Timer bar visible, fill class: tb-fill run","errors":[]}
+{"run":1,"ts":"2026-08-03T21:07:39.699Z","game":"lightning","diff":"scholar","cat":"All","selector":"#stage","label":"round-13-render","action":"inspect","ok":true,"effect":"stage_html_len=193, choices=4, imgs_ok=12, imgs_broken=1","errors":[]}
+{"run":1,"ts":"2026-08-03T21:07:40.151Z","game":"lightning","diff":"scholar","cat":"All","selector":".choice","label":"round-13-pick-0","action":"click","ok":true,"effect":"Chose: \"Kitagawa Utamaro\", reveal: \"✗ Artist: Thomas LawrenceNext →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:07:38.690Z","selector":".m-card:nth-child(2) [data-place]","label":"Gallery card 2: Place on wall","action":"click","ok":true,"effect":"{\"before\":\"Place on wall →\",\"after\":\"Place on wall →\",\"sigCount\":null}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:07:40.330Z","selector":".m-card:nth-child(3) [data-place]","label":"Gallery card 3: Place on wall","action":"click","ok":true,"effect":"{\"before\":\"Place on wall →\",\"after\":\"Place on wall →\",\"sigCount\":null}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:07:41.955Z","selector":"header nav a[href=\"#studio\"]","label":"Nav: Wall studio","action":"click","ok":true,"effect":"{\"before\":\"Wall studio\",\"after\":\"Wall studio\",\"sigCount\":null}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:07:42.744Z","selector":"header nav a[href=\"#order\"]","label":"Nav: Order","action":"click","ok":true,"effect":"{\"before\":\"Order\",\"after\":\"Order\",\"sigCount\":null}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:07:14.733Z","selector":"#sort","label":"Sort: Notability","action":"select","value":"notability","ok":false,"effect":"ERROR: locator.scrollIntoViewIfNeeded: Timeout 29991.668000000005ms exceeded.\nCall log:\n\u001b[2m  - attempting scroll into view action\u001b[22m\n\u001b[2m    2 × waiting for element to be stable\u001b[22m\n\u001b[2m      - element i","errors":["locator.scrollIntoViewIfNeeded: Timeout 29991.668000000005ms exceeded.\nCall log:\n\u001b[2m  - attempting scroll into view action\u001b[22m\n\u001b[2m    2 × waiting for element to be stable\u001b[22m\n\u001b[2m      - element is not visible\u001b[22m\n\u001b[2m    - retrying scroll into view action\u001b[22m\n\u001b[2m    - waiting 20ms\u001b[22m\n\u001b[2m "]}
+{"run":0,"ts":"2026-08-03T21:07:43.522Z","selector":"header nav a[href=\"/\"]","label":"Nav: Signature archive","action":"click-navigate","ok":true,"effect":"CLICKED_NAVIGATE_WENT_BACK","errors":[]}
+{"run":0,"ts":"2026-08-03T21:07:45.752Z","selector":"#finderInput","label":"Finder: search input","action":"type:lincoln","ok":true,"effect":"{\"before\":null,\"after\":\"lincoln\",\"sigCount\":null}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:07:46.397Z","selector":"#finderInput","label":"Finder: clear + type babe ruth","action":"clear+type:babe ruth","ok":true,"effect":"{\"before\":\"lincoln\",\"after\":\"babe ruth\",\"sigCount\":null}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:07:47.033Z","selector":"#finderInput","label":"Finder: clear + type einstein","action":"clear+type:einstein","ok":true,"effect":"{\"before\":\"babe ruth\",\"after\":\"einstein\",\"sigCount\":null}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:07:47.678Z","selector":"#selMural","label":"Studio: Mural select - declaration","action":"select-option:d","ok":true,"effect":"{\"before\":\"Oldest Signatures in HistoryDeclaration of IndependencePolit\",\"after\":\"Oldest Signatures in HistoryDeclaration of IndependencePolit\",\"sigCount\":56,\"orderSummary\":\"Declaration of Independence · 12×24 ft custom · 56 signatures · $2,880\\n     Placement on a 32×14 ft \"}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:07:48.304Z","selector":"#selMural","label":"Studio: Mural select - politics","action":"select-option:p","ok":true,"effect":"{\"before\":\"Oldest Signatures in HistoryDeclaration of IndependencePolit\",\"after\":\"Oldest Signatures in HistoryDeclaration of IndependencePolit\",\"sigCount\":54,\"orderSummary\":\"Politics & Statecraft · 12×24 ft custom · 54 signatures · $2,880\\n     Placement on a 32×14 ft wall: \"}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:07:48.943Z","selector":"#selMural","label":"Studio: Mural select - composers","action":"select-option:co","ok":true,"effect":"{\"before\":\"Oldest Signatures in HistoryDeclaration of IndependencePolit\",\"after\":\"Oldest Signatures in HistoryDeclaration of IndependencePolit\",\"sigCount\":3,\"orderSummary\":\"Great Composers · 12×24 ft custom · 3 signatures · $2,880\\n     Placement on a 32×14 ft wall: 4.0 ft \"}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:07:49.575Z","selector":"#murW","label":"Studio: Mural width - set 30","action":"set-value:30","ok":true,"effect":"{\"before\":\"24\",\"after\":\"30\",\"studioReadout\":\"From left wall: 1.0 ft\\n    From right wall: 1.0 ft\\n    Bottom off floor: 1.0 ft\\n    Mural: 12×30 ft · 360 sq ft\\n    Signatures shown: 3\\n    Price: $3,600\",\"sigCount\":3,\"orderSummary\":\"Great Composers · 12×30 ft custom · 3 signatures · $3,600\\n     Placement on a 32×14 ft wall: 1.0 ft \"}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:07:50.220Z","selector":"#murH","label":"Studio: Mural height - set 10","action":"set-value:10","ok":true,"effect":"{\"before\":\"12\",\"after\":\"10\",\"studioReadout\":\"From left wall: 1.0 ft\\n    From right wall: 1.0 ft\\n    Bottom off floor: 2.0 ft\\n    Mural: 10×30 ft · 300 sq ft\\n    Signatures shown: 3\\n    Price: $3,000\",\"sigCount\":3,\"orderSummary\":\"Great Composers · 10×30 ft custom · 3 signatures · $3,000\\n     Placement on a 32×14 ft wall: 1.0 ft \"}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:07:50.863Z","selector":"#murW","label":"Studio: Mural width - set 16","action":"set-value:16","ok":true,"effect":"{\"before\":\"30\",\"after\":\"16\",\"studioReadout\":\"From left wall: 8.0 ft\\n    From right wall: 8.0 ft\\n    Bottom off floor: 2.0 ft\\n    Mural: 10×16 ft · 160 sq ft\\n    Signatures shown: 3\\n    Price: $1,600\",\"sigCount\":3,\"orderSummary\":\"Great Composers · 10×16 ft custom · 3 signatures · $1,600\\n     Placement on a 32×14 ft wall: 8.0 ft \"}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:07:51.503Z","selector":"#murH","label":"Studio: Mural height - set 8","action":"set-value:8","ok":true,"effect":"{\"before\":\"10\",\"after\":\"8\",\"studioReadout\":\"From left wall: 8.0 ft\\n    From right wall: 8.0 ft\\n    Bottom off floor: 3.0 ft\\n    Mural: 8×16 ft · 128 sq ft\\n    Signatures shown: 3\\n    Price: $1,280\",\"sigCount\":3,\"orderSummary\":\"Great Composers · 8×16 ft custom · 3 signatures · $1,280\\n     Placement on a 32×14 ft wall: 8.0 ft f\"}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:07:52.144Z","selector":"#murW","label":"Studio: Mural width - set 40","action":"set-value:40","ok":true,"effect":"{\"before\":\"16\",\"after\":\"40\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 3.0 ft\\n    Mural: 8×40 ft · 320 sq ft\\n    Signatures shown: 3\\n    Price: $3,200\",\"sigCount\":3,\"orderSummary\":\"Great Composers · 8×40 ft custom · 3 signatures · $3,200\\n     Placement on a 32×14 ft wall: 0.0 ft f\"}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:07:52.783Z","selector":"#murH","label":"Studio: Mural height - set 16","action":"set-value:16","ok":true,"effect":"{\"before\":\"8\",\"after\":\"16\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 16×40 ft · 640 sq ft\\n    Signatures shown: 3\\n    Price: $6,400\",\"sigCount\":3,\"orderSummary\":\"Great Composers · 16×40 ft custom · 3 signatures · $6,400\\n     Placement on a 32×14 ft wall: 0.0 ft \"}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:07:53.422Z","selector":"#wallW","label":"Studio: Wall width slider - 40","action":"set-slider:40","ok":true,"effect":"{\"before\":\"32\",\"after\":\"40\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 16×40 ft · 640 sq ft\\n    Signatures shown: 3\\n    Price: $6,400\",\"sigCount\":null,\"orderSummary\":\"Great Composers · 16×40 ft custom · 3 signatures · $6,400\\n     Placement on a 40×14 ft wall: 0.0 ft \"}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:07:54.055Z","selector":"#wallH","label":"Studio: Wall height slider - 16","action":"set-slider:16","ok":true,"effect":"{\"before\":\"14\",\"after\":\"16\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 16×40 ft · 640 sq ft\\n    Signatures shown: 3\\n    Price: $6,400\",\"sigCount\":null,\"orderSummary\":\"Great Composers · 16×40 ft custom · 3 signatures · $6,400\\n     Placement on a 40×16 ft wall: 0.0 ft \"}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:07:54.678Z","selector":"#wallW","label":"Studio: Wall width slider - 60","action":"set-slider:60","ok":true,"effect":"{\"before\":\"40\",\"after\":\"60\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 20.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 16×40 ft · 640 sq ft\\n    Signatures shown: 3\\n    Price: $6,400\",\"sigCount\":null,\"orderSummary\":\"Great Composers · 16×40 ft custom · 3 signatures · $6,400\\n     Placement on a 60×16 ft wall: 0.0 ft \"}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:07:55.305Z","selector":"#wallH","label":"Studio: Wall height slider - 20","action":"set-slider:20","ok":true,"effect":"{\"before\":\"16\",\"after\":\"20\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 20.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 16×40 ft · 640 sq ft\\n    Signatures shown: 3\\n    Price: $6,400\",\"sigCount\":null,\"orderSummary\":\"Great Composers · 16×40 ft custom · 3 signatures · $6,400\\n     Placement on a 60×20 ft wall: 0.0 ft \"}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:07:55.946Z","selector":"#wallW","label":"Studio: Wall width slider - 24","action":"set-slider:24","ok":true,"effect":"{\"before\":\"60\",\"after\":\"24\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 16×40 ft · 640 sq ft\\n    Signatures shown: 3\\n    Price: $6,400\",\"sigCount\":null,\"orderSummary\":\"Great Composers · 16×40 ft custom · 3 signatures · $6,400\\n     Placement on a 24×20 ft wall: 0.0 ft \"}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:07:56.592Z","selector":"#wallH","label":"Studio: Wall height slider - 12","action":"set-slider:12","ok":true,"effect":"{\"before\":\"20\",\"after\":\"12\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 16×40 ft · 640 sq ft\\n    Signatures shown: 3\\n    Price: $6,400\",\"sigCount\":null,\"orderSummary\":\"Great Composers · 16×40 ft custom · 3 signatures · $6,400\\n     Placement on a 24×12 ft wall: 0.0 ft \"}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:07:57.235Z","selector":"#btnCenter","label":"Studio: Center on wall","action":"click","ok":true,"effect":"{\"before\":\"Center on wall\",\"after\":\"Center on wall\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 16×40 ft · 640 sq ft\\n    Signatures shown: 3\\n    Price: $6,400\",\"sigCount\":null}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:07:58.030Z","selector":"#scenePresets button[data-scene=\"study\"]","label":"Scene preset: Study","action":"click","ok":true,"effect":"{\"before\":\"Study\",\"after\":\"Study\",\"sigCount\":null}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:07:58.828Z","selector":"#scenePresets button[data-scene=\"lounge\"]","label":"Scene preset: Lounge","action":"click","ok":true,"effect":"{\"before\":\"Lounge\",\"after\":\"Lounge\",\"sigCount\":null}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:07:59.619Z","selector":"#scenePresets button[data-scene=\"gallery\"]","label":"Scene preset: Gallery","action":"click","ok":true,"effect":"{\"before\":\"Gallery\",\"after\":\"Gallery\",\"sigCount\":null}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:08:00.411Z","selector":"#scenePresets button[data-scene=\"plain\"]","label":"Scene preset: Plain","action":"click","ok":true,"effect":"{\"before\":\"Plain\",\"after\":\"Plain\",\"sigCount\":null}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:08:01.214Z","selector":"input[name=\"name\"]","label":"Order: Name input","action":"type:John Test","ok":true,"effect":"{\"before\":null,\"after\":\"John Test\",\"sigCount\":null}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:08:01.848Z","selector":"input[name=\"email\"]","label":"Order: Email input","action":"type:test@example.com","ok":true,"effect":"{\"before\":null,\"after\":\"test@example.com\",\"sigCount\":null}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:08:02.482Z","selector":"input[name=\"wall_w\"]","label":"Order: Wall width input","action":"set-value:24","ok":true,"effect":"{\"before\":\"32\",\"after\":\"24\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 16×40 ft · 640 sq ft\\n    Signatures shown: 3\\n    Price: $6,400\",\"sigCount\":null,\"orderSummary\":\"Great Composers · 16×40 ft custom · 3 signatures · $6,400\\n     Placement on a 24×12 ft wall: 0.0 ft \"}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:08:03.113Z","selector":"input[name=\"wall_h\"]","label":"Order: Wall height input","action":"set-value:12","ok":true,"effect":"{\"before\":\"14\",\"after\":\"12\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 16×40 ft · 640 sq ft\\n    Signatures shown: 3\\n    Price: $6,400\",\"sigCount\":null,\"orderSummary\":\"Great Composers · 16×40 ft custom · 3 signatures · $6,400\\n     Placement on a 24×12 ft wall: 0.0 ft \"}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:08:03.748Z","selector":"textarea[name=\"notes\"]","label":"Order: Notes textarea","action":"type:Test order for master bedroom. Target install October.","ok":true,"effect":"{\"before\":null,\"after\":\"Test order for master bedroom. Target install October.\",\"sigCount\":null}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:08:04.374Z","selector":"#orderForm button[type=\"submit\"]","label":"Order: Submit form","action":"click","ok":true,"effect":"{\"before\":\"Request this mural\",\"after\":\"Request this mural\",\"sigCount\":null}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:08:05.176Z","selector":".m-card:nth-child(1) .r-search","label":"Roster card 1: filter \"wash\"","action":"type:wash","ok":true,"effect":"{\"before\":null,\"after\":\"wash\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:10.152Z","game":"lightning","diff":"scholar","cat":"All","selector":"#reveal a","label":"round-13-reveal-link","action":"inspect","ok":false,"effect":"No reveal link found after pick","errors":["Missing reveal link in lightning round 13"]}
+{"run":1,"ts":"2026-08-03T21:08:10.407Z","game":"lightning","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-13-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:10.815Z","game":"lightning","diff":"scholar","cat":"All","selector":"#timerbar","label":"round-14-timer","action":"inspect","ok":true,"effect":"Timer bar visible, fill class: tb-fill run","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:10.816Z","game":"lightning","diff":"scholar","cat":"All","selector":"#stage","label":"round-14-render","action":"inspect","ok":true,"effect":"stage_html_len=195, choices=4, imgs_ok=13, imgs_broken=1","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:11.278Z","game":"lightning","diff":"scholar","cat":"All","selector":".choice","label":"round-14-pick-3","action":"click","ok":true,"effect":"Chose: \"The Resurrection\", reveal: \"✗ Painting: Anna Maria Dashwood, later Marchioness of Ely · see it →Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:11.279Z","game":"lightning","diff":"scholar","cat":"All","selector":"#reveal a","label":"round-14-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/75374","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:11.529Z","game":"lightning","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-14-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:08:06.216Z","selector":".m-card:nth-child(1) .r-item:first-child","label":"Roster card 1: click roster item → provenance modal","action":"click","ok":false,"effect":"ACTION_FAILED","errors":["Error: locator.click: Element is not visible\nCall log:\n\u001b[2m  - waiting for locator('.m-card:nth-child(1) .r-item:first-child').first()\u001b[22m\n\u001b[2m    - locator resolved to <button type=\"button\" class=\"r-item\" data-sig=\"Oldest Signatures|1\">…</button>\u001b[22m\n\u001b[2m  - attempting click action\u001b[22m\n\u001b[2m    - scrolling into view if needed\u001b[22m\n"]}
+{"run":0,"ts":"2026-08-03T21:08:11.879Z","selector":"#provModal","label":"Provenance modal: opened?","action":"observe","ok":false,"effect":"MODAL_NOT_OPEN","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:11.934Z","game":"lightning","diff":"scholar","cat":"All","selector":"#timerbar","label":"round-15-timer","action":"inspect","ok":true,"effect":"Timer bar visible, fill class: tb-fill run","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:11.935Z","game":"lightning","diff":"scholar","cat":"All","selector":"#stage","label":"round-15-render","action":"inspect","ok":true,"effect":"stage_html_len=193, choices=4, imgs_ok=14, imgs_broken=1","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:12.388Z","game":"lightning","diff":"scholar","cat":"All","selector":".choice","label":"round-15-pick-2","action":"click","ok":true,"effect":"Chose: \"Paolo Veronese\", reveal: \"✗ Artist: Adolph von MenzelNext →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:08:12.383Z","selector":".m-card:nth-child(2) .r-search","label":"Roster card 2: filter \"hancock\"","action":"type:hancock","ok":true,"effect":"{\"before\":null,\"after\":\"hancock\",\"sigCount\":null}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:07:44.737Z","selector":"#sort","label":"Sort: Usable first","action":"select","value":"usable","ok":false,"effect":"ERROR: locator.scrollIntoViewIfNeeded: Timeout 29984.598999999987ms exceeded.\nCall log:\n\u001b[2m  - attempting scroll into view action\u001b[22m\n\u001b[2m    2 × waiting for element to be stable\u001b[22m\n\u001b[2m      - element i","errors":["locator.scrollIntoViewIfNeeded: Timeout 29984.598999999987ms exceeded.\nCall log:\n\u001b[2m  - attempting scroll into view action\u001b[22m\n\u001b[2m    2 × waiting for element to be stable\u001b[22m\n\u001b[2m      - element is not visible\u001b[22m\n\u001b[2m    - retrying scroll into view action\u001b[22m\n\u001b[2m    - waiting 20ms\u001b[22m\n\u001b[2m "]}
+{"run":0,"ts":"2026-08-03T21:08:13.918Z","selector":"#muralEl","label":"Studio: Drag mural","action":"drag","ok":false,"effect":"{\"before\":{\"left\":\"0px\",\"top\":\"0px\"},\"after\":{\"left\":\"0px\",\"top\":\"0px\"},\"readout\":\"From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 16×40 ft · 640 sq ft\\n    Signatures shown: 3\\n    Price: $6,\",\"moved\":false}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:08:15.549Z","selector":".m-card:nth-child(1) img","label":"Gallery card 1: collage image load","action":"observe","ok":true,"effect":"{\"src\":\"http://localhost:9920/output/collage-oldest-signatures.png\",\"complete\":true,\"naturalW\":1570}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:08:15.550Z","selector":"#readout","label":"Studio: readout check (price + sig count)","action":"observe","ok":true,"effect":"{\"text\":\"\\n    From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 16×40 ft · 640 sq ft\\n    Signatures shown: 3\\n    Price: $6,400\",\"price\":\"Price: $6,400\",\"sigs\":\"Signatures shown: 3\",\"sqft\":\"640 sq ft\"}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:08:15.550Z","selector":"#orderSummary","label":"Order: summary synced with studio","action":"observe","ok":true,"effect":"Great Composers · 16×40 ft custom · 3 signatures · $6,400\n     Placement on a 24×12 ft wall: 0.0 ft from left, 0.0 ft off floor.","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:21.259Z","selector":"page","label":"PAGE LOAD","action":"goto","ok":true,"effect":"{\"title\":\"Celebrity Signature Murals — made to order\",\"muralCards\":33,\"sigsLoaded\":true}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:21.260Z","selector":"#orderForm button[type=\"submit\"]","label":"Order: Submit form","action":"click","ok":true,"effect":"{\"before\":\"Request this mural\",\"after\":\"Request this mural\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:22.078Z","selector":"textarea[name=\"notes\"]","label":"Order: Notes textarea","action":"type:Test order for master bedroom. Target install October.","ok":true,"effect":"{\"before\":null,\"after\":\"Test order for master bedroom. Target install October.\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:22.705Z","selector":"input[name=\"wall_h\"]","label":"Order: Wall height input","action":"set-value:12","ok":true,"effect":"{\"before\":\"14\",\"after\":\"12\",\"studioReadout\":\"From left wall: 4.0 ft\\n    From right wall: 4.0 ft\\n    Bottom off floor: 1.0 ft\\n    Mural: 12×24 ft · 288 sq ft\\n    Signatures shown: 18\\n    Price: $2,880\",\"sigCount\":null,\"orderSummary\":\"Oldest Signatures in History · 12×24 ft custom · 18 signatures · $2,880\\n     Placement on a 32×14 ft\"}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:23.333Z","selector":"input[name=\"wall_w\"]","label":"Order: Wall width input","action":"set-value:24","ok":true,"effect":"{\"before\":\"32\",\"after\":\"24\",\"studioReadout\":\"From left wall: 4.0 ft\\n    From right wall: 4.0 ft\\n    Bottom off floor: 1.0 ft\\n    Mural: 12×24 ft · 288 sq ft\\n    Signatures shown: 18\\n    Price: $2,880\",\"sigCount\":null,\"orderSummary\":\"Oldest Signatures in History · 12×24 ft custom · 18 signatures · $2,880\\n     Placement on a 32×14 ft\"}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:23.973Z","selector":"input[name=\"email\"]","label":"Order: Email input","action":"type:test@example.com","ok":true,"effect":"{\"before\":null,\"after\":\"test@example.com\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:24.609Z","selector":"input[name=\"name\"]","label":"Order: Name input","action":"type:John Test","ok":true,"effect":"{\"before\":null,\"after\":\"John Test\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:25.233Z","selector":"#scenePresets button[data-scene=\"plain\"]","label":"Scene preset: Plain","action":"click","ok":true,"effect":"{\"before\":\"Plain\",\"after\":\"Plain\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:26.012Z","selector":"#scenePresets button[data-scene=\"gallery\"]","label":"Scene preset: Gallery","action":"click","ok":true,"effect":"{\"before\":\"Gallery\",\"after\":\"Gallery\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:26.791Z","selector":"#scenePresets button[data-scene=\"lounge\"]","label":"Scene preset: Lounge","action":"click","ok":true,"effect":"{\"before\":\"Lounge\",\"after\":\"Lounge\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:27.570Z","selector":"#scenePresets button[data-scene=\"study\"]","label":"Scene preset: Study","action":"click","ok":true,"effect":"{\"before\":\"Study\",\"after\":\"Study\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:28.354Z","selector":"#btnCenter","label":"Studio: Center on wall","action":"click","ok":true,"effect":"{\"before\":\"Center on wall\",\"after\":\"Center on wall\",\"studioReadout\":\"From left wall: 4.0 ft\\n    From right wall: 4.0 ft\\n    Bottom off floor: 1.0 ft\\n    Mural: 12×24 ft · 288 sq ft\\n    Signatures shown: 18\\n    Price: $2,880\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:29.143Z","selector":"#wallH","label":"Studio: Wall height slider - 12","action":"set-slider:12","ok":true,"effect":"{\"before\":\"14\",\"after\":\"12\",\"studioReadout\":\"From left wall: 4.0 ft\\n    From right wall: 4.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 12×24 ft · 288 sq ft\\n    Signatures shown: 18\\n    Price: $2,880\",\"sigCount\":null,\"orderSummary\":\"Oldest Signatures in History · 12×24 ft custom · 18 signatures · $2,880\\n     Placement on a 32×12 ft\"}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:29.788Z","selector":"#wallW","label":"Studio: Wall width slider - 24","action":"set-slider:24","ok":true,"effect":"{\"before\":\"32\",\"after\":\"24\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 12×24 ft · 288 sq ft\\n    Signatures shown: 18\\n    Price: $2,880\",\"sigCount\":null,\"orderSummary\":\"Oldest Signatures in History · 12×24 ft custom · 18 signatures · $2,880\\n     Placement on a 24×12 ft\"}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:30.425Z","selector":"#wallH","label":"Studio: Wall height slider - 20","action":"set-slider:20","ok":true,"effect":"{\"before\":\"12\",\"after\":\"20\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 12×24 ft · 288 sq ft\\n    Signatures shown: 18\\n    Price: $2,880\",\"sigCount\":null,\"orderSummary\":\"Oldest Signatures in History · 12×24 ft custom · 18 signatures · $2,880\\n     Placement on a 24×20 ft\"}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:31.062Z","selector":"#wallW","label":"Studio: Wall width slider - 60","action":"set-slider:60","ok":true,"effect":"{\"before\":\"24\",\"after\":\"60\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 36.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 12×24 ft · 288 sq ft\\n    Signatures shown: 18\\n    Price: $2,880\",\"sigCount\":null,\"orderSummary\":\"Oldest Signatures in History · 12×24 ft custom · 18 signatures · $2,880\\n     Placement on a 60×20 ft\"}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:31.700Z","selector":"#wallH","label":"Studio: Wall height slider - 16","action":"set-slider:16","ok":true,"effect":"{\"before\":\"20\",\"after\":\"16\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 36.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 12×24 ft · 288 sq ft\\n    Signatures shown: 18\\n    Price: $2,880\",\"sigCount\":null,\"orderSummary\":\"Oldest Signatures in History · 12×24 ft custom · 18 signatures · $2,880\\n     Placement on a 60×16 ft\"}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:32.342Z","selector":"#wallW","label":"Studio: Wall width slider - 40","action":"set-slider:40","ok":true,"effect":"{\"before\":\"60\",\"after\":\"40\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 16.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 12×24 ft · 288 sq ft\\n    Signatures shown: 18\\n    Price: $2,880\",\"sigCount\":null,\"orderSummary\":\"Oldest Signatures in History · 12×24 ft custom · 18 signatures · $2,880\\n     Placement on a 40×16 ft\"}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:32.973Z","selector":"#murH","label":"Studio: Mural height - set 16","action":"set-value:16","ok":true,"effect":"{\"before\":\"12\",\"after\":\"16\",\"studioReadout\":\"From left wall: 8.0 ft\\n    From right wall: 8.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 16×24 ft · 384 sq ft\\n    Signatures shown: 18\\n    Price: $3,840\",\"sigCount\":18,\"orderSummary\":\"Oldest Signatures in History · 16×24 ft custom · 18 signatures · $3,840\\n     Placement on a 40×16 ft\"}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:33.621Z","selector":"#murW","label":"Studio: Mural width - set 40","action":"set-value:40","ok":true,"effect":"{\"before\":\"24\",\"after\":\"40\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 16×40 ft · 640 sq ft\\n    Signatures shown: 18\\n    Price: $6,400\",\"sigCount\":18,\"orderSummary\":\"Oldest Signatures in History · 16×40 ft custom · 18 signatures · $6,400\\n     Placement on a 40×16 ft\"}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:34.254Z","selector":"#murH","label":"Studio: Mural height - set 8","action":"set-value:8","ok":true,"effect":"{\"before\":\"16\",\"after\":\"8\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 4.0 ft\\n    Mural: 8×40 ft · 320 sq ft\\n    Signatures shown: 18\\n    Price: $3,200\",\"sigCount\":18,\"orderSummary\":\"Oldest Signatures in History · 8×40 ft custom · 18 signatures · $3,200\\n     Placement on a 40×16 ft \"}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:34.894Z","selector":"#murW","label":"Studio: Mural width - set 16","action":"set-value:16","ok":true,"effect":"{\"before\":\"40\",\"after\":\"16\",\"studioReadout\":\"From left wall: 12.0 ft\\n    From right wall: 12.0 ft\\n    Bottom off floor: 4.0 ft\\n    Mural: 8×16 ft · 128 sq ft\\n    Signatures shown: 18\\n    Price: $1,280\",\"sigCount\":18,\"orderSummary\":\"Oldest Signatures in History · 8×16 ft custom · 18 signatures · $1,280\\n     Placement on a 40×16 ft \"}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:35.529Z","selector":"#murH","label":"Studio: Mural height - set 10","action":"set-value:10","ok":true,"effect":"{\"before\":\"8\",\"after\":\"10\",\"studioReadout\":\"From left wall: 12.0 ft\\n    From right wall: 12.0 ft\\n    Bottom off floor: 3.0 ft\\n    Mural: 10×16 ft · 160 sq ft\\n    Signatures shown: 18\\n    Price: $1,600\",\"sigCount\":18,\"orderSummary\":\"Oldest Signatures in History · 10×16 ft custom · 18 signatures · $1,600\\n     Placement on a 40×16 ft\"}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:36.157Z","selector":"#murW","label":"Studio: Mural width - set 30","action":"set-value:30","ok":true,"effect":"{\"before\":\"16\",\"after\":\"30\",\"studioReadout\":\"From left wall: 5.0 ft\\n    From right wall: 5.0 ft\\n    Bottom off floor: 3.0 ft\\n    Mural: 10×30 ft · 300 sq ft\\n    Signatures shown: 18\\n    Price: $3,000\",\"sigCount\":18,\"orderSummary\":\"Oldest Signatures in History · 10×30 ft custom · 18 signatures · $3,000\\n     Placement on a 40×16 ft\"}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:36.794Z","selector":"#selMural","label":"Studio: Mural select - composers","action":"select-option:co","ok":true,"effect":"{\"before\":\"Oldest Signatures in HistoryDeclaration of IndependencePolit\",\"after\":\"Oldest Signatures in HistoryDeclaration of IndependencePolit\",\"sigCount\":3,\"orderSummary\":\"Great Composers · 10×30 ft custom · 3 signatures · $3,000\\n     Placement on a 40×16 ft wall: 5.0 ft \"}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:37.431Z","selector":"#selMural","label":"Studio: Mural select - politics","action":"select-option:p","ok":true,"effect":"{\"before\":\"Oldest Signatures in HistoryDeclaration of IndependencePolit\",\"after\":\"Oldest Signatures in HistoryDeclaration of IndependencePolit\",\"sigCount\":54,\"orderSummary\":\"Politics & Statecraft · 10×30 ft custom · 54 signatures · $3,000\\n     Placement on a 40×16 ft wall: \"}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:38.054Z","selector":"#selMural","label":"Studio: Mural select - declaration","action":"select-option:d","ok":true,"effect":"{\"before\":\"Oldest Signatures in HistoryDeclaration of IndependencePolit\",\"after\":\"Oldest Signatures in HistoryDeclaration of IndependencePolit\",\"sigCount\":56,\"orderSummary\":\"Declaration of Independence · 10×30 ft custom · 56 signatures · $3,000\\n     Placement on a 40×16 ft \"}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:38.688Z","selector":"#finderInput","label":"Finder: clear + type einstein","action":"clear+type:einstein","ok":true,"effect":"{\"before\":null,\"after\":\"einstein\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:39.325Z","selector":"#finderInput","label":"Finder: clear + type babe ruth","action":"clear+type:babe ruth","ok":true,"effect":"{\"before\":\"einstein\",\"after\":\"babe ruth\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:39.963Z","selector":"#finderInput","label":"Finder: search input","action":"type:lincoln","ok":true,"effect":"{\"before\":\"babe ruth\",\"after\":\"lincoln\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:42.387Z","game":"lightning","diff":"scholar","cat":"All","selector":"#reveal a","label":"round-15-reveal-link","action":"inspect","ok":false,"effect":"No reveal link found after pick","errors":["Missing reveal link in lightning round 15"]}
+{"run":1,"ts":"2026-08-03T21:08:42.641Z","game":"lightning","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-15-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:40.599Z","selector":"header nav a[href=\"/\"]","label":"Nav: Signature archive","action":"click-navigate","ok":true,"effect":"CLICKED_NAVIGATE_WENT_BACK","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:43.047Z","game":"lightning","diff":"scholar","cat":"All","selector":"#timerbar","label":"round-16-timer","action":"inspect","ok":true,"effect":"Timer bar visible, fill class: tb-fill run","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:43.048Z","game":"lightning","diff":"scholar","cat":"All","selector":"#stage","label":"round-16-render","action":"inspect","ok":true,"effect":"stage_html_len=195, choices=4, imgs_ok=15, imgs_broken=1","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:43.500Z","game":"lightning","diff":"scholar","cat":"All","selector":".choice","label":"round-16-pick-0","action":"click","ok":true,"effect":"Chose: \"Head of an Old Man\", reveal: \"✓ Painting: Head of an Old Man · see it →See results\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:43.501Z","game":"lightning","diff":"scholar","cat":"All","selector":"#reveal a","label":"round-16-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/22638","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:42.882Z","selector":"header nav a[href=\"#order\"]","label":"Nav: Order","action":"click","ok":true,"effect":"{\"before\":\"Order\",\"after\":\"Order\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:43.754Z","game":"lightning","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-16-next","action":"click","ok":true,"effect":"Next text: \"See results\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:44.158Z","game":"lightning","diff":"scholar","cat":"All","selector":"#results","label":"results-screen","action":"inspect","ok":true,"effect":"score=5, verdict=\"The gallery guide is that way…\", best=\"Best (lightning · scholar): 5\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:44.158Z","game":"lightning","diff":"scholar","cat":"All","selector":"#misses","label":"lightning-bonus-line","action":"inspect","ok":true,"effect":"Bonus line HTML: \"<div class=\"ap-sub\" style=\"margin-top:8px\">⚡ Named BOTH on 0 of 8 paintings — <b>+0 bonus</b></div><b>Worth a second look:</b><br><a href=\"/?artist=Q660917\" target=\"_blank\" rel=\"noopener noreferrer\">W\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:43.679Z","selector":"header nav a[href=\"#studio\"]","label":"Nav: Wall studio","action":"click","ok":true,"effect":"{\"before\":\"Wall studio\",\"after\":\"Wall studio\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:44.613Z","game":"lightning","diff":"scholar","cat":"All","selector":"#againBtn","label":"play-again","action":"click","ok":true,"effect":"Setup panel returned: true","errors":[]}
+{"run":0,"ts":"2026-08-03T21:08:14.740Z","selector":"#sort","label":"Sort: Risk low→high","action":"select","value":"risk","ok":false,"effect":"ERROR: locator.scrollIntoViewIfNeeded: Timeout 29992.43399999995ms exceeded.\nCall log:\n\u001b[2m  - attempting scroll into view action\u001b[22m\n\u001b[2m    2 × waiting for element to be stable\u001b[22m\n\u001b[2m      - element is","errors":["locator.scrollIntoViewIfNeeded: Timeout 29992.43399999995ms exceeded.\nCall log:\n\u001b[2m  - attempting scroll into view action\u001b[22m\n\u001b[2m    2 × waiting for element to be stable\u001b[22m\n\u001b[2m      - element is not visible\u001b[22m\n\u001b[2m    - retrying scroll into view action\u001b[22m\n\u001b[2m    - waiting 20ms\u001b[22m\n\u001b[2m  "]}
+{"run":1,"ts":"2026-08-03T21:08:44.454Z","selector":".m-card:nth-child(3) [data-place]","label":"Gallery card 3: Place on wall","action":"click","ok":true,"effect":"{\"before\":\"Place on wall →\",\"after\":\"Place on wall →\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:45.690Z","game":"century","diff":"scholar","cat":"All","selector":"#gamePick .gcard[data-g=\"century\"]","label":"game-card-century","action":"click","ok":true,"effect":"card selected","errors":["REQUEST_FAILED: POST https://www.google-analytics.com/g/collect?v=2&tid=G-2HEVP6TD0J&gtm=45je67u0v9260226174za200zd9260226174&_p=1785791088754&gcd=13l3l3l3l1l1&npa=0&dma=0&_eu=AAAAAAQ&are=1&cid=1749435826.1785791089&frm=0&ngs=1&pscdl=noapi&rcb=16&sr=1600x900&uaa=arm&uab=64&uafvl=HeadlessChrome%3B149.0.7827.55%7CChromium%3B149.0.7827.55%7CNot)A%253BBrand%3B24.0.0.0&uam=&uamb=0&uap=macOS&uapv=26.4.0&uaw=0&ul=en-us&_s=2&tag_exp=115938466~115938469~118395334~118897920~118897930~119896803~120222309&sid=1785791088&sct=1&seg=1&dl=http%3A%2F%2Flocalhost%2Fgame&dt=The%20Signature%20Games%20%E2%80%94%20Celebrity%20Signatures&en=user_engagement&_et=235853&tfd=236013 — net::ERR_ABORTED"]}
+{"run":1,"ts":"2026-08-03T21:08:45.694Z","game":"century","diff":"scholar","cat":"All","selector":"#catLabel/#catOpts","label":"category-row-visibility","action":"inspect","ok":true,"effect":"catLabel=block, catOpts=flex, expected_visible=true, actual=true","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:45.891Z","game":"century","diff":"scholar","cat":"All","selector":"#diffOpts .opt[data-d=\"scholar\"]","label":"diff-scholar","action":"click","ok":true,"effect":"selected","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:46.085Z","game":"century","diff":"scholar","cat":"All","selector":"#catOpts .opt[data-c=\"All\"]","label":"cat-All","action":"click","ok":true,"effect":"selected","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:46.131Z","game":"century","diff":"scholar","cat":"All","selector":"#goBtn","label":"begin-button","action":"click","ok":true,"effect":"Begin clicked","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:46.132Z","game":"century","diff":"scholar","cat":"All","selector":"#play","label":"play-panel-appeared","action":"wait","ok":true,"effect":"play panel shown in 46ms","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:46.135Z","game":"century","diff":"scholar","cat":"All","selector":"https://upload.wikimedia.org/wikipedia/commons/4/46/Christina%2C_Queen_of_Sweden_signature.svg","label":"round-1-image","action":"inspect","ok":false,"effect":"Image broken/404: https://upload.wikimedia.org/wikipedia/commons/4/46/Christina%2C_Queen_of_Sweden_signature.svg","errors":["Image 404 or broken: https://upload.wikimedia.org/wikipedia/commons/4/46/Christina%2C_Queen_of_Sweden_signature.svg"]}
+{"run":1,"ts":"2026-08-03T21:08:46.135Z","game":"century","diff":"scholar","cat":"All","selector":"#stage","label":"round-1-render","action":"inspect","ok":true,"effect":"stage_html_len=142, choices=4, imgs_ok=0, imgs_broken=1","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:46.585Z","game":"century","diff":"scholar","cat":"All","selector":".choice","label":"round-1-pick-0","action":"click","ok":true,"effect":"Chose: \"17th century\", reveal: \"✓ Correct — Christina of Sweden died 1689 (17th century) · their page →Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:46.836Z","game":"century","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-1-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:45.236Z","selector":".m-card:nth-child(2) [data-place]","label":"Gallery card 2: Place on wall","action":"click","ok":true,"effect":"{\"before\":\"Place on wall →\",\"after\":\"Place on wall →\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:47.243Z","game":"century","diff":"scholar","cat":"All","selector":"#stage","label":"round-2-render","action":"inspect","ok":true,"effect":"stage_html_len=133, choices=4, imgs_ok=1, imgs_broken=1","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:47.696Z","game":"century","diff":"scholar","cat":"All","selector":".choice","label":"round-2-pick-3","action":"click","ok":true,"effect":"Chose: \"19th century\", reveal: \"✗ Selma Lagerlöf died 1940 (20th century) · their page →Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:47.948Z","game":"century","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-2-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:48.354Z","game":"century","diff":"scholar","cat":"All","selector":"#stage","label":"round-3-render","action":"inspect","ok":true,"effect":"stage_html_len=142, choices=4, imgs_ok=2, imgs_broken=1","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:46.868Z","selector":".m-card:nth-child(1) [data-place]","label":"Gallery card 1: Place on wall","action":"click","ok":true,"effect":"{\"before\":\"Place on wall →\",\"after\":\"Place on wall →\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:48.807Z","game":"century","diff":"scholar","cat":"All","selector":".choice","label":"round-3-pick-2","action":"click","ok":true,"effect":"Chose: \"19th century\", reveal: \"✗ Nadezhda Krupskaya died 1939 (20th century) · their page →Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:49.058Z","game":"century","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-3-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:49.464Z","game":"century","diff":"scholar","cat":"All","selector":"#stage","label":"round-4-render","action":"inspect","ok":true,"effect":"stage_html_len=145, choices=4, imgs_ok=3, imgs_broken=1","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:49.918Z","game":"century","diff":"scholar","cat":"All","selector":".choice","label":"round-4-pick-0","action":"click","ok":true,"effect":"Chose: \"18th century\", reveal: \"✓ Correct — Georges-Louis Leclerc, Comte de Buffon died 1788 (18th century) · th\"","errors":["REQUEST_FAILED: POST https://www.google-analytics.com/g/collect?v=2&tid=G-2HEVP6TD0J&gtm=45je67u0v9260226174za200zd9260226174&_p=1785791324622&gcd=13l3l3l3l1l1&npa=0&dma=0&_eu=AAAAAAQ&are=1&cid=1749435826.1785791089&frm=0&ngs=1&pscdl=noapi&rcb=16&sr=1600x900&uaa=arm&uab=64&uafvl=HeadlessChrome%3B149.0.7827.55%7CChromium%3B149.0.7827.55%7CNot)A%253BBrand%3B24.0.0.0&uam=&uamb=0&uap=macOS&uapv=26.4.0&uaw=0&ul=en-us&_s=1&tag_exp=115938465~115938468~118897920~118897930~119896802&sid=1785791088&sct=1&seg=1&dl=http%3A%2F%2Flocalhost%2Fgame&dt=The%20Signature%20Games%20%E2%80%94%20Celebrity%20Signatures&en=page_view&_ee=1&tfd=5023 — net::ERR_ABORTED"]}
+{"run":1,"ts":"2026-08-03T21:08:48.486Z","selector":".m-card:nth-child(3) .roster-trig","label":"Gallery card 3: Roster drawer open","action":"click","ok":true,"effect":"{\"before\":\"See who's on this wall ▾\",\"after\":\"Hide who's on this wall ▴\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:50.169Z","game":"century","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-4-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:50.576Z","game":"century","diff":"scholar","cat":"All","selector":"#stage","label":"round-5-render","action":"inspect","ok":true,"effect":"stage_html_len=133, choices=4, imgs_ok=4, imgs_broken=1","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:50.116Z","selector":".m-card:nth-child(2) .roster-trig","label":"Gallery card 2: Roster drawer open","action":"click","ok":true,"effect":"{\"before\":\"See who's on this wall ▾\",\"after\":\"Hide who's on this wall ▴\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:51.031Z","game":"century","diff":"scholar","cat":"All","selector":".choice","label":"round-5-pick-3","action":"click","ok":true,"effect":"Chose: \"20th century\", reveal: \"✓ Correct — Vladimir Mayakovsky died 1930 (20th century) · their page →Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:51.285Z","game":"century","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-5-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:51.693Z","game":"century","diff":"scholar","cat":"All","selector":"#stage","label":"round-6-render","action":"inspect","ok":true,"effect":"stage_html_len=130, choices=4, imgs_ok=5, imgs_broken=1","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:50.917Z","selector":".m-card:nth-child(1) .roster-trig","label":"Gallery card 1: Roster drawer open","action":"click","ok":true,"effect":"{\"before\":\"See who's on this wall ▾\",\"after\":\"Hide who's on this wall ▴\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:52.140Z","game":"century","diff":"scholar","cat":"All","selector":".choice","label":"round-6-pick-2","action":"click","ok":true,"effect":"Chose: \"20th century\", reveal: \"✓ Correct — Emma Goldman died 1940 (20th century) · their page →Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:52.391Z","game":"century","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-6-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:51.712Z","selector":".m-card:nth-child(3) .name-toggle","label":"Gallery card 3: Show names toggle","action":"click","ok":true,"effect":"{\"before\":\"Show names\",\"after\":\"Show names\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:52.796Z","game":"century","diff":"scholar","cat":"All","selector":"#stage","label":"round-7-render","action":"inspect","ok":true,"effect":"stage_html_len=131, choices=4, imgs_ok=6, imgs_broken=1","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:53.252Z","game":"century","diff":"scholar","cat":"All","selector":".choice","label":"round-7-pick-0","action":"click","ok":true,"effect":"Chose: \"17th century\", reveal: \"✗ Alexander Blok died 1921 (20th century) · their page →Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:52.506Z","selector":".m-card:nth-child(2) .name-toggle","label":"Gallery card 2: Show names toggle","action":"click","ok":true,"effect":"{\"before\":\"Show names\",\"after\":\"Show names\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:53.506Z","game":"century","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-7-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:53.913Z","game":"century","diff":"scholar","cat":"All","selector":"#stage","label":"round-8-render","action":"inspect","ok":true,"effect":"stage_html_len=124, choices=4, imgs_ok=7, imgs_broken=1","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:53.291Z","selector":".m-card:nth-child(1) .name-toggle","label":"Gallery card 1: Hide names toggle","action":"click","ok":true,"effect":"{\"before\":\"Show names\",\"after\":\"Show names\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:54.363Z","game":"century","diff":"scholar","cat":"All","selector":".choice","label":"round-8-pick-3","action":"click","ok":true,"effect":"Chose: \"18th century\", reveal: \"✓ Correct — John Locke died 1704 (18th century) · their page →Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:54.614Z","game":"century","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-8-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:54.082Z","selector":".m-card:nth-child(1) .name-toggle","label":"Gallery card 1: Show names toggle","action":"click","ok":true,"effect":"{\"before\":\"Show names\",\"after\":\"Show names\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:55.020Z","game":"century","diff":"scholar","cat":"All","selector":"#stage","label":"round-9-render","action":"inspect","ok":true,"effect":"stage_html_len=120, choices=4, imgs_ok=8, imgs_broken=1","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:55.475Z","game":"century","diff":"scholar","cat":"All","selector":".choice","label":"round-9-pick-2","action":"click","ok":true,"effect":"Chose: \"15th century\", reveal: \"✗ Molière died 1673 (17th century) · their page →Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:54.862Z","selector":".m-card:nth-child(1) .r-search","label":"Roster card 1: filter \"wash\"","action":"type:wash","ok":true,"effect":"{\"before\":null,\"after\":\"wash\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:55.725Z","game":"century","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-9-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:08:44.743Z","selector":"#sort","label":"Sort: Risk high→low","action":"select","value":"risk-desc","ok":false,"effect":"ERROR: locator.scrollIntoViewIfNeeded: Target page, context or browser has been closed\nCall log:\n\u001b[2m  - attempting scroll into view action\u001b[22m\n\u001b[2m    2 × waiting for element to be stable\u001b[22m\n\u001b[2m      - ","errors":["locator.scrollIntoViewIfNeeded: Target page, context or browser has been closed\nCall log:\n\u001b[2m  - attempting scroll into view action\u001b[22m\n\u001b[2m    2 × waiting for element to be stable\u001b[22m\n\u001b[2m      - element is not visible\u001b[22m\n\u001b[2m    - retrying scroll into view action\u001b[22m\n\u001b[2m    - waiting 20ms\u001b["]}
+{"run":0,"ts":"2026-08-03T21:08:56.025Z","selector":"#sort","label":"Sort: License A→Z","action":"select","value":"license","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":0,"ts":"2026-08-03T21:08:56.026Z","selector":"#sort","label":"Sort: Living first","action":"select","value":"living","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":0,"ts":"2026-08-03T21:08:56.026Z","selector":"#sort","label":"Sort: Deceased first","action":"select","value":"deceased","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":0,"ts":"2026-08-03T21:08:56.026Z","selector":"#sort","label":"Sort: Death date","action":"select","value":"death","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":0,"ts":"2026-08-03T21:08:56.026Z","selector":"#sort","label":"Sort: Museums","action":"select","value":"museums","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":0,"ts":"2026-08-03T21:08:56.026Z","selector":"#sort","label":"Sort: Signature count","action":"select","value":"sigcount","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":0,"ts":"2026-08-03T21:08:56.027Z","selector":"#sort","label":"Sort: reset to cat","action":"select","value":"cat","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":0,"ts":"2026-08-03T21:08:56.027Z","selector":"#density","label":"Density slider → 3","action":"range","value":"3","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":0,"ts":"2026-08-03T21:08:56.027Z","selector":"#density","label":"Density slider → 7","action":"range","value":"7","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":0,"ts":"2026-08-03T21:08:56.028Z","selector":"#density","label":"Density slider → 5","action":"range","value":"5","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":0,"ts":"2026-08-03T21:08:56.028Z","selector":"#catChips .chip[data-c=\"All\"]","label":"Category chip: All","action":"click","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":0,"ts":"2026-08-03T21:08:56.028Z","selector":"#catChips .chip[data-c=\"Oldest Signatures\"]","label":"Category chip: Oldest Signatures","action":"click","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":0,"ts":"2026-08-03T21:08:56.028Z","selector":"#catChips .chip[data-c=\"Declaration of Independence\"]","label":"Category chip: Declaration of Independence","action":"click","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":0,"ts":"2026-08-03T21:08:56.029Z","selector":"#catChips .chip[data-c=\"Politics\"]","label":"Category chip: Politics","action":"click","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":0,"ts":"2026-08-03T21:08:56.029Z","selector":"#catChips .chip[data-c=\"Artists\"]","label":"Category chip: Artists","action":"click","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":0,"ts":"2026-08-03T21:08:56.029Z","selector":"#catChips .chip[data-c=\"Authors\"]","label":"Category chip: Authors","action":"click","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":0,"ts":"2026-08-03T21:08:56.029Z","selector":"#catChips .chip[data-c=\"All\"]","label":"Category chip: back to All","action":"click","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":0,"ts":"2026-08-03T21:08:56.029Z","selector":"#layoutChips .chip[data-l=\"gallery\"]","label":"Layout: Gallery","action":"click","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":0,"ts":"2026-08-03T21:08:56.029Z","selector":"#layoutChips .chip[data-l=\"float\"]","label":"Layout: Float","action":"click","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":0,"ts":"2026-08-03T21:08:56.029Z","selector":"#layoutChips .chip[data-l=\"plaque\"]","label":"Layout: Plaque","action":"click","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":0,"ts":"2026-08-03T21:08:56.030Z","selector":"#layoutChips .chip[data-l=\"ledger\"]","label":"Layout: Ledger","action":"click","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":0,"ts":"2026-08-03T21:08:56.030Z","selector":"#layoutChips .chip[data-l=\"vitrine\"]","label":"Layout: Vitrine","action":"click","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":0,"ts":"2026-08-03T21:08:56.030Z","selector":"#layoutChips .chip[data-l=\"wall\"]","label":"Layout: Wall","action":"click","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":0,"ts":"2026-08-03T21:08:56.030Z","selector":"#layoutChips .chip[data-l=\"gallery\"]","label":"Layout: back to Gallery","action":"click","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":0,"ts":"2026-08-03T21:08:56.030Z","selector":"#filtersHint","label":"☰ Categories/sort/views button","action":"click","ok":false,"effect":"ERROR: locator.count: Target page, context or browser has been closed","errors":["locator.count: Target page, context or browser has been closed"]}
+{"run":0,"ts":"2026-08-03T21:08:56.030Z","selector":null,"label":"Escape key to close drawer","action":"escape","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":0,"ts":"2026-08-03T21:08:56.030Z","selector":".info-chip","label":"First card Details chip → open artist popup","action":"click-details","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":0,"ts":"2026-08-03T21:08:56.030Z","selector":".ap-x","label":"Artist popup × close","action":"click","ok":false,"effect":"ERROR: locator.count: Target page, context or browser has been closed","errors":["locator.count: Target page, context or browser has been closed"]}
+{"run":0,"ts":"2026-08-03T21:08:56.031Z","selector":".info-chip","label":"Re-open artist popup","action":"click-details","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":0,"ts":"2026-08-03T21:08:56.031Z","selector":".ap-back","label":"Artist popup backdrop click","action":"click","ok":false,"effect":"ERROR: locator.count: Target page, context or browser has been closed","errors":["locator.count: Target page, context or browser has been closed"]}
+{"run":0,"ts":"2026-08-03T21:08:56.031Z","selector":".info-chip","label":"Re-open artist popup (for escape)","action":"click-details","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":0,"ts":"2026-08-03T21:08:56.031Z","selector":null,"label":"Escape key to close artist popup","action":"escape","ok":false,"effect":"ERROR: keyboard.press: Target page, context or browser has been closed","errors":["keyboard.press: Target page, context or browser has been closed"]}
+{"run":0,"ts":"2026-08-03T21:08:56.031Z","selector":".drawer .tab[data-v=\"collages\"]","label":"Switch to Collages tab","action":"click","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":0,"ts":"2026-08-03T21:08:56.031Z","selector":".drawer .tab[data-v=\"grid\"]","label":"Switch back to Grid tab","action":"click","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":0,"ts":"2026-08-03T21:08:56.031Z","selector":".info-chip","label":"Artist popup deep test","action":"deep-test","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":0,"ts":"2026-08-03T21:08:56.031Z","selector":".drawer .tab[data-v=\"collages\"]","label":"Collages tab test","action":"test","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":1,"ts":"2026-08-03T21:08:56.130Z","game":"century","diff":"scholar","cat":"All","selector":"#stage","label":"round-10-render","action":"inspect","ok":true,"effect":"stage_html_len=123, choices=4, imgs_ok=9, imgs_broken=1","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:56.585Z","game":"century","diff":"scholar","cat":"All","selector":".choice","label":"round-10-pick-0","action":"click","ok":true,"effect":"Chose: \"15th century\", reveal: \"✗ P. T. Barnum died 1891 (19th century) · their page →See results\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:56.837Z","game":"century","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-10-next","action":"click","ok":true,"effect":"Next text: \"See results\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:57.242Z","game":"century","diff":"scholar","cat":"All","selector":"#results","label":"results-screen","action":"inspect","ok":true,"effect":"score=56, verdict=\"The gallery guide is that way…\", best=\"Best (century · scholar): 56\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:57.698Z","game":"century","diff":"scholar","cat":"All","selector":"#againBtn","label":"play-again","action":"click","ok":true,"effect":"Setup panel returned: true","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:58.775Z","game":"early","diff":"scholar","cat":"All","selector":"#gamePick .gcard[data-g=\"early\"]","label":"game-card-early","action":"click","ok":true,"effect":"card selected","errors":["REQUEST_FAILED: POST https://www.google-analytics.com/g/collect?v=2&tid=G-2HEVP6TD0J&gtm=45je67u0v9260226174za200zd9260226174&_p=1785791324622&gcd=13l3l3l3l1l1&npa=0&dma=0&_eu=AAAAAAQ&are=1&cid=1749435826.1785791089&frm=0&ngs=1&pscdl=noapi&rcb=16&sr=1600x900&uaa=arm&uab=64&uafvl=HeadlessChrome%3B149.0.7827.55%7CChromium%3B149.0.7827.55%7CNot)A%253BBrand%3B24.0.0.0&uam=&uamb=0&uap=macOS&uapv=26.4.0&uaw=0&ul=en-us&_s=2&tag_exp=115938465~115938468~118897920~118897930~119896802&sid=1785791088&sct=1&seg=1&dl=http%3A%2F%2Flocalhost%2Fgame&dt=The%20Signature%20Games%20%E2%80%94%20Celebrity%20Signatures&en=user_engagement&_et=13066&tfd=13089 — net::ERR_ABORTED"]}
+{"run":1,"ts":"2026-08-03T21:08:58.779Z","game":"early","diff":"scholar","cat":"All","selector":"#catLabel/#catOpts","label":"category-row-visibility","action":"inspect","ok":true,"effect":"catLabel=none, catOpts=none, expected_visible=false, actual=false","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:58.975Z","game":"early","diff":"scholar","cat":"All","selector":"#diffOpts .opt[data-d=\"scholar\"]","label":"diff-scholar","action":"click","ok":true,"effect":"selected","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:59.020Z","game":"early","diff":"scholar","cat":"All","selector":"#goBtn","label":"begin-button","action":"click","ok":true,"effect":"Begin clicked","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:59.021Z","game":"early","diff":"scholar","cat":"All","selector":"#play","label":"play-panel-appeared","action":"wait","ok":true,"effect":"play panel shown in 45ms","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:59.024Z","game":"early","diff":"scholar","cat":"All","selector":"https://commons.wikimedia.org/wiki/Special:FilePath/Magritte%2C%20Rene%201898%E2%80%931967%20Signature.svg?width=400","label":"round-1-image","action":"inspect","ok":false,"effect":"Image broken/404: https://commons.wikimedia.org/wiki/Special:FilePath/Magritte%2C%20Rene%201898%E2%80%931967%20Signature.svg?width=400","errors":["Image 404 or broken: https://commons.wikimedia.org/wiki/Special:FilePath/Magritte%2C%20Rene%201898%E2%80%931967%20Signature.svg?width=400"]}
+{"run":1,"ts":"2026-08-03T21:08:59.026Z","game":"early","diff":"scholar","cat":"All","selector":"https://commons.wikimedia.org/wiki/Special:FilePath/1960%20Paris%20Ren%C3%A9%20et%20Georgette%20Magritte.jpg?width=400","label":"round-1-image","action":"inspect","ok":false,"effect":"Image broken/404: https://commons.wikimedia.org/wiki/Special:FilePath/1960%20Paris%20Ren%C3%A9%20et%20Georgette%20Magritte.jpg?width=400","errors":["Image 404 or broken: https://commons.wikimedia.org/wiki/Special:FilePath/1960%20Paris%20Ren%C3%A9%20et%20Georgette%20Magritte.jpg?width=400"]}
+{"run":1,"ts":"2026-08-03T21:08:59.027Z","game":"early","diff":"scholar","cat":"All","selector":"#stage","label":"round-1-render","action":"inspect","ok":true,"effect":"stage_html_len=484, choices=2, imgs_ok=0, imgs_broken=2","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:59.488Z","game":"early","diff":"scholar","cat":"All","selector":".choice","label":"round-1-pick-0","action":"click","ok":true,"effect":"Chose: \"A is earlier\", reveal: \"✓ Correct — René Magritte: A is from 1898, the other from 1960 · see the timelin\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:59.740Z","game":"early","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-1-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:00.150Z","game":"early","diff":"scholar","cat":"All","selector":"https://commons.wikimedia.org/wiki/Special:FilePath/Signature%20of%20Alfred%20Stevens%2C%201870.JPG?width=400","label":"round-2-image","action":"inspect","ok":false,"effect":"Image broken/404: https://commons.wikimedia.org/wiki/Special:FilePath/Signature%20of%20Alfred%20Stevens%2C%201870.JPG?width=400","errors":["Image 404 or broken: https://commons.wikimedia.org/wiki/Special:FilePath/Signature%20of%20Alfred%20Stevens%2C%201870.JPG?width=400"]}
+{"run":1,"ts":"2026-08-03T21:09:00.151Z","game":"early","diff":"scholar","cat":"All","selector":"#stage","label":"round-2-render","action":"inspect","ok":true,"effect":"stage_html_len=488, choices=2, imgs_ok=1, imgs_broken=3","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:00.601Z","game":"early","diff":"scholar","cat":"All","selector":".choice","label":"round-2-pick-1","action":"click","ok":true,"effect":"Chose: \"B is earlier\", reveal: \"✓ Correct — Alfred Stevens: B is from 1870, the other from 2000 · see the timeli\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:00.853Z","game":"early","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-2-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:08:55.886Z","selector":".m-card:nth-child(1) .r-item:first-child","label":"Roster card 1: click roster item → provenance modal","action":"click","ok":false,"effect":"ACTION_FAILED","errors":["Error: locator.click: Element is not visible\nCall log:\n\u001b[2m  - waiting for locator('.m-card:nth-child(1) .r-item:first-child').first()\u001b[22m\n\u001b[2m    - locator resolved to <button type=\"button\" class=\"r-item\" data-sig=\"Oldest Signatures|1\">…</button>\u001b[22m\n\u001b[2m  - attempting click action\u001b[22m\n\u001b[2m    - scrolling into view if needed\u001b[22m\n"]}
+{"run":1,"ts":"2026-08-03T21:09:01.262Z","game":"early","diff":"scholar","cat":"All","selector":"#stage","label":"round-3-render","action":"inspect","ok":true,"effect":"stage_html_len=438, choices=2, imgs_ok=3, imgs_broken=3","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:01.548Z","selector":"#provModal","label":"Provenance modal: opened?","action":"observe","ok":false,"effect":"MODAL_NOT_OPEN","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:01.711Z","game":"early","diff":"scholar","cat":"All","selector":".choice","label":"round-3-pick-1","action":"click","ok":true,"effect":"Chose: \"B is earlier\", reveal: \"✗ Auguste Rodin: A is from 1898, the other from 1903 · see the timeline →Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:01.962Z","game":"early","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-3-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:02.368Z","game":"early","diff":"scholar","cat":"All","selector":"https://commons.wikimedia.org/wiki/Special:FilePath/Joseph-Victor%20Ranvier%20signature%201871%20(cropped).jpg?width=400","label":"round-4-image","action":"inspect","ok":false,"effect":"Image broken/404: https://commons.wikimedia.org/wiki/Special:FilePath/Joseph-Victor%20Ranvier%20signature%201871%20(cropped).jpg?width=400","errors":["REQUEST_FAILED: GET https://upload.wikimedia.org/wikipedia/commons/a/a5/Joseph-Victor_Ranvier_signature_1871_%28cropped%29.jpg?utm_source=commons.wikimedia.org&utm_campaign=index&utm_content=thumbnail_unscaled — net::ERR_BLOCKED_BY_ORB","Image 404 or broken: https://commons.wikimedia.org/wiki/Special:FilePath/Joseph-Victor%20Ranvier%20signature%201871%20(cropped).jpg?width=400"]}
+{"run":1,"ts":"2026-08-03T21:09:02.370Z","game":"early","diff":"scholar","cat":"All","selector":"#stage","label":"round-4-render","action":"inspect","ok":true,"effect":"stage_html_len=502, choices=2, imgs_ok=4, imgs_broken=4","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:02.052Z","selector":".m-card:nth-child(2) .r-search","label":"Roster card 2: filter \"hancock\"","action":"type:hancock","ok":true,"effect":"{\"before\":null,\"after\":\"hancock\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:02.809Z","game":"early","diff":"scholar","cat":"All","selector":".choice","label":"round-4-pick-0","action":"click","ok":true,"effect":"Chose: \"A is earlier\", reveal: \"✗ Joseph-Victor Ranvier: B is from 1870, the other from 1871 · see the timeline \"","errors":["REQUEST_FAILED: POST https://www.google-analytics.com/g/collect?v=2&tid=G-2HEVP6TD0J&gtm=45je67u0v9260226174za200zd9260226174&_p=1785791337705&gcd=13l3l3l3l1l1&npa=0&dma=0&_eu=AAAAAAQ&are=1&cid=1749435826.1785791089&frm=0&ngs=1&pscdl=noapi&rcb=4&sr=1600x900&uaa=arm&uab=64&uafvl=HeadlessChrome%3B149.0.7827.55%7CChromium%3B149.0.7827.55%7CNot)A%253BBrand%3B24.0.0.0&uam=&uamb=0&uap=macOS&uapv=26.4.0&uaw=0&ul=en-us&_s=1&tag_exp=115616986~115938466~115938469~118897920~118897930~119896803~120222309&sid=1785791088&sct=1&seg=1&dl=http%3A%2F%2Flocalhost%2Fgame&dt=The%20Signature%20Games%20%E2%80%94%20Celebrity%20Signatures&en=page_view&_ee=1&tfd=5017 — net::ERR_ABORTED"]}
+{"run":1,"ts":"2026-08-03T21:09:03.060Z","game":"early","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-4-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:03.475Z","game":"early","diff":"scholar","cat":"All","selector":"https://commons.wikimedia.org/wiki/Special:FilePath/Joseph-Victor%20Ranvier%20signature%201871%20(cropped).jpg?width=400","label":"round-5-image","action":"inspect","ok":false,"effect":"Image broken/404: https://commons.wikimedia.org/wiki/Special:FilePath/Joseph-Victor%20Ranvier%20signature%201871%20(cropped).jpg?width=400","errors":["REQUEST_FAILED: GET https://upload.wikimedia.org/wikipedia/commons/a/a5/Joseph-Victor_Ranvier_signature_1871_%28cropped%29.jpg?utm_source=commons.wikimedia.org&utm_campaign=index&utm_content=thumbnail_unscaled — net::ERR_BLOCKED_BY_ORB","Image 404 or broken: https://commons.wikimedia.org/wiki/Special:FilePath/Joseph-Victor%20Ranvier%20signature%201871%20(cropped).jpg?width=400"]}
+{"run":1,"ts":"2026-08-03T21:09:03.480Z","game":"early","diff":"scholar","cat":"All","selector":"#stage","label":"round-5-render","action":"inspect","ok":true,"effect":"stage_html_len=502, choices=2, imgs_ok=5, imgs_broken=5","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:03.933Z","game":"early","diff":"scholar","cat":"All","selector":".choice","label":"round-5-pick-1","action":"click","ok":true,"effect":"Chose: \"B is earlier\", reveal: \"✓ Correct — Joseph-Victor Ranvier: B is from 1870, the other from 1871 · see the\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:04.184Z","game":"early","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-5-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:04.593Z","game":"early","diff":"scholar","cat":"All","selector":"https://commons.wikimedia.org/wiki/Special:FilePath/Giovanni%20boldini%2C%20sulla%20panchina%20al%20bois%2C%201872%20(coll.%20priv.)%2003%20firma.jpg?width=400","label":"round-6-image","action":"inspect","ok":false,"effect":"Image broken/404: https://commons.wikimedia.org/wiki/Special:FilePath/Giovanni%20boldini%2C%20sulla%20panchina%20al%20bois%2C%201872%20(coll.%20priv.)%2003%20firma.jpg?width=400","errors":["Image 404 or broken: https://commons.wikimedia.org/wiki/Special:FilePath/Giovanni%20boldini%2C%20sulla%20panchina%20al%20bois%2C%201872%20(coll.%20priv.)%2003%20firma.jpg?width=400"]}
+{"run":1,"ts":"2026-08-03T21:09:04.593Z","game":"early","diff":"scholar","cat":"All","selector":"#stage","label":"round-6-render","action":"inspect","ok":true,"effect":"stage_html_len=520, choices=2, imgs_ok=6, imgs_broken=6","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:05.044Z","game":"early","diff":"scholar","cat":"All","selector":".choice","label":"round-6-pick-1","action":"click","ok":true,"effect":"Chose: \"B is earlier\", reveal: \"✗ Giovanni Boldini: A is from 1842, the other from 1872 · see the timeline →Next\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:03.587Z","selector":"#muralEl","label":"Studio: Drag mural","action":"drag","ok":true,"effect":"{\"before\":{\"left\":\"135px\",\"top\":\"81px\"},\"after\":{\"left\":\"255px\",\"top\":\"27px\"},\"readout\":\"From left wall: 9.4 ft\\n    From right wall: 0.6 ft\\n    Bottom off floor: 3.0 ft\\n    Mural: 10×30 ft · 300 sq ft\\n    Signatures shown: 18\\n    Price: $3\",\"moved\":true}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:05.218Z","selector":".m-card:nth-child(1) img","label":"Gallery card 1: collage image load","action":"observe","ok":true,"effect":"{\"src\":\"http://localhost:9920/output/collage-oldest-signatures.png\",\"complete\":true,\"naturalW\":1570}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:05.219Z","selector":"#readout","label":"Studio: readout check (price + sig count)","action":"observe","ok":true,"effect":"{\"text\":\"\\n    From left wall: 9.4 ft\\n    From right wall: 0.6 ft\\n    Bottom off floor: 3.0 ft\\n    Mural: 10×30 ft · 300 sq ft\\n    Signatures shown: 18\\n    Price: $3,000\",\"price\":\"Price: $3,000\",\"sigs\":\"Signatures shown: 18\",\"sqft\":\"300 sq ft\"}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:05.219Z","selector":"#orderSummary","label":"Order: summary synced with studio","action":"observe","ok":true,"effect":"Oldest Signatures in History · 10×30 ft custom · 18 signatures · $3,000\n     Placement on a 40×16 ft wall: 9.4 ft from left, 3.0 ft off floor.","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:05.281Z","game":"early","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-6-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:05.695Z","game":"early","diff":"scholar","cat":"All","selector":"#stage","label":"round-7-render","action":"inspect","ok":true,"effect":"stage_html_len=497, choices=2, imgs_ok=8, imgs_broken=6","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:06.157Z","game":"early","diff":"scholar","cat":"All","selector":".choice","label":"round-7-pick-0","action":"click","ok":true,"effect":"Chose: \"A is earlier\", reveal: \"✗ Emmanuel Frémiet: B is from 1891, the other from 1892 · see the timeline →Next\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:06.408Z","game":"early","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-7-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:06.816Z","game":"early","diff":"scholar","cat":"All","selector":"https://commons.wikimedia.org/wiki/Special:FilePath/KanseiBuncho%20rakkan.jpg?width=400","label":"round-8-image","action":"inspect","ok":false,"effect":"Image broken/404: https://commons.wikimedia.org/wiki/Special:FilePath/KanseiBuncho%20rakkan.jpg?width=400","errors":["REQUEST_FAILED: GET https://upload.wikimedia.org/wikipedia/commons/c/c9/KanseiBuncho_rakkan.jpg?utm_source=commons.wikimedia.org&utm_campaign=index&utm_content=thumbnail_unscaled — net::ERR_BLOCKED_BY_ORB","Image 404 or broken: https://commons.wikimedia.org/wiki/Special:FilePath/KanseiBuncho%20rakkan.jpg?width=400"]}
+{"run":1,"ts":"2026-08-03T21:09:06.821Z","game":"early","diff":"scholar","cat":"All","selector":"#stage","label":"round-8-render","action":"inspect","ok":true,"effect":"stage_html_len=424, choices=2, imgs_ok=9, imgs_broken=7","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:07.270Z","game":"early","diff":"scholar","cat":"All","selector":".choice","label":"round-8-pick-1","action":"click","ok":true,"effect":"Chose: \"B is earlier\", reveal: \"✗ Tani Bunchō: A is from 1789, the other from 1811 · see the timeline →Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:07.519Z","game":"early","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-8-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:07.929Z","game":"early","diff":"scholar","cat":"All","selector":"https://commons.wikimedia.org/wiki/Special:FilePath/KanseiBuncho%20rakkan.jpg?width=400","label":"round-9-image","action":"inspect","ok":false,"effect":"Image broken/404: https://commons.wikimedia.org/wiki/Special:FilePath/KanseiBuncho%20rakkan.jpg?width=400","errors":["REQUEST_FAILED: GET https://upload.wikimedia.org/wikipedia/commons/c/c9/KanseiBuncho_rakkan.jpg?utm_source=commons.wikimedia.org&utm_campaign=index&utm_content=thumbnail_unscaled — net::ERR_BLOCKED_BY_ORB","Image 404 or broken: https://commons.wikimedia.org/wiki/Special:FilePath/KanseiBuncho%20rakkan.jpg?width=400"]}
+{"run":1,"ts":"2026-08-03T21:09:07.934Z","game":"early","diff":"scholar","cat":"All","selector":"#stage","label":"round-9-render","action":"inspect","ok":true,"effect":"stage_html_len=424, choices=2, imgs_ok=10, imgs_broken=8","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:08.395Z","game":"early","diff":"scholar","cat":"All","selector":".choice","label":"round-9-pick-1","action":"click","ok":true,"effect":"Chose: \"B is earlier\", reveal: \"✗ Tani Bunchō: A is from 1789, the other from 1811 · see the timeline →Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:08.644Z","game":"early","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-9-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:09.059Z","game":"early","diff":"scholar","cat":"All","selector":"https://commons.wikimedia.org/wiki/Special:FilePath/Signature%20of%20Ren%C3%A9%20Gr%C3%A9goire%20(1913)%20(cropped).jpg?width=400","label":"round-10-image","action":"inspect","ok":false,"effect":"Image broken/404: https://commons.wikimedia.org/wiki/Special:FilePath/Signature%20of%20Ren%C3%A9%20Gr%C3%A9goire%20(1913)%20(cropped).jpg?width=400","errors":["Image 404 or broken: https://commons.wikimedia.org/wiki/Special:FilePath/Signature%20of%20Ren%C3%A9%20Gr%C3%A9goire%20(1913)%20(cropped).jpg?width=400"]}
+{"run":1,"ts":"2026-08-03T21:09:09.060Z","game":"early","diff":"scholar","cat":"All","selector":"#stage","label":"round-10-render","action":"inspect","ok":true,"effect":"stage_html_len=509, choices=2, imgs_ok=11, imgs_broken=9","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:09.518Z","game":"early","diff":"scholar","cat":"All","selector":".choice","label":"round-10-pick-0","action":"click","ok":true,"effect":"Chose: \"A is earlier\", reveal: \"✗ René Grégoire: B is from 1913, the other from 1935 · see the timeline →See res\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:09.770Z","game":"early","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-10-next","action":"click","ok":true,"effect":"Next text: \"See results\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:10.176Z","game":"early","diff":"scholar","cat":"All","selector":"#results","label":"results-screen","action":"inspect","ok":true,"effect":"score=32, verdict=\"Everyone starts somewhere.\", best=\"Best (early · scholar): 32\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:10.629Z","game":"early","diff":"scholar","cat":"All","selector":"#againBtn","label":"play-again","action":"click","ok":true,"effect":"Setup panel returned: true","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:11.706Z","game":"match","diff":"scholar","cat":"All","selector":"#gamePick .gcard[data-g=\"match\"]","label":"game-card-match","action":"click","ok":true,"effect":"card selected","errors":["REQUEST_FAILED: POST https://www.google-analytics.com/g/collect?v=2&tid=G-2HEVP6TD0J&gtm=45je67u0v9260226174za200zd9260226174&_p=1785791337705&gcd=13l3l3l3l1l1&npa=0&dma=0&_eu=AAAAAAQ&are=1&cid=1749435826.1785791089&frm=0&ngs=1&pscdl=noapi&rcb=4&sr=1600x900&uaa=arm&uab=64&uafvl=HeadlessChrome%3B149.0.7827.55%7CChromium%3B149.0.7827.55%7CNot)A%253BBrand%3B24.0.0.0&uam=&uamb=0&uap=macOS&uapv=26.4.0&uaw=0&ul=en-us&_s=2&tag_exp=115616986~115938466~115938469~118897920~118897930~119896803~120222309&sid=1785791088&sct=1&seg=1&dl=http%3A%2F%2Flocalhost%2Fgame&dt=The%20Signature%20Games%20%E2%80%94%20Celebrity%20Signatures&en=user_engagement&_et=12919&tfd=12935 — net::ERR_ABORTED"]}
+{"run":1,"ts":"2026-08-03T21:09:11.709Z","game":"match","diff":"scholar","cat":"All","selector":"#catLabel/#catOpts","label":"category-row-visibility","action":"inspect","ok":true,"effect":"catLabel=none, catOpts=none, expected_visible=false, actual=false","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:11.907Z","game":"match","diff":"scholar","cat":"All","selector":"#diffOpts .opt[data-d=\"scholar\"]","label":"diff-scholar","action":"click","ok":true,"effect":"selected","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:11.950Z","game":"match","diff":"scholar","cat":"All","selector":"#goBtn","label":"begin-button","action":"click","ok":true,"effect":"Begin clicked","errors":[]}
+{"run":2,"ts":"2026-08-03T21:09:14.469Z","selector":"page","label":"PAGE LOAD","action":"goto","ok":true,"effect":"{\"title\":\"Celebrity Signature Murals — made to order\",\"muralCards\":33,\"sigsLoaded\":true}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:09:14.470Z","selector":"#wallW","label":"Studio: Wall width slider - 40","action":"set-slider:40","ok":true,"effect":"{\"before\":\"32\",\"after\":\"40\",\"studioReadout\":\"From left wall: 4.0 ft\\n    From right wall: 12.0 ft\\n    Bottom off floor: 1.0 ft\\n    Mural: 12×24 ft · 288 sq ft\\n    Signatures shown: 18\\n    Price: $2,880\",\"sigCount\":null,\"orderSummary\":\"Oldest Signatures in History · 12×24 ft custom · 18 signatures · $2,880\\n     Placement on a 40×14 ft\"}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:09:15.105Z","selector":"#wallH","label":"Studio: Wall height slider - 16","action":"set-slider:16","ok":true,"effect":"{\"before\":\"14\",\"after\":\"16\",\"studioReadout\":\"From left wall: 4.0 ft\\n    From right wall: 12.0 ft\\n    Bottom off floor: 1.0 ft\\n    Mural: 12×24 ft · 288 sq ft\\n    Signatures shown: 18\\n    Price: $2,880\",\"sigCount\":null,\"orderSummary\":\"Oldest Signatures in History · 12×24 ft custom · 18 signatures · $2,880\\n     Placement on a 40×16 ft\"}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:09:15.740Z","selector":"#wallW","label":"Studio: Wall width slider - 60","action":"set-slider:60","ok":true,"effect":"{\"before\":\"40\",\"after\":\"60\",\"studioReadout\":\"From left wall: 4.0 ft\\n    From right wall: 32.0 ft\\n    Bottom off floor: 1.0 ft\\n    Mural: 12×24 ft · 288 sq ft\\n    Signatures shown: 18\\n    Price: $2,880\",\"sigCount\":null,\"orderSummary\":\"Oldest Signatures in History · 12×24 ft custom · 18 signatures · $2,880\\n     Placement on a 60×16 ft\"}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:09:16.377Z","selector":"#wallH","label":"Studio: Wall height slider - 20","action":"set-slider:20","ok":true,"effect":"{\"before\":\"16\",\"after\":\"20\",\"studioReadout\":\"From left wall: 4.0 ft\\n    From right wall: 32.0 ft\\n    Bottom off floor: 1.0 ft\\n    Mural: 12×24 ft · 288 sq ft\\n    Signatures shown: 18\\n    Price: $2,880\",\"sigCount\":null,\"orderSummary\":\"Oldest Signatures in History · 12×24 ft custom · 18 signatures · $2,880\\n     Placement on a 60×20 ft\"}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:09:17.001Z","selector":"#wallW","label":"Studio: Wall width slider - 24","action":"set-slider:24","ok":true,"effect":"{\"before\":\"60\",\"after\":\"24\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 1.0 ft\\n    Mural: 12×24 ft · 288 sq ft\\n    Signatures shown: 18\\n    Price: $2,880\",\"sigCount\":null,\"orderSummary\":\"Oldest Signatures in History · 12×24 ft custom · 18 signatures · $2,880\\n     Placement on a 24×20 ft\"}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:09:17.635Z","selector":"#wallH","label":"Studio: Wall height slider - 12","action":"set-slider:12","ok":true,"effect":"{\"before\":\"20\",\"after\":\"12\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 12×24 ft · 288 sq ft\\n    Signatures shown: 18\\n    Price: $2,880\",\"sigCount\":null,\"orderSummary\":\"Oldest Signatures in History · 12×24 ft custom · 18 signatures · $2,880\\n     Placement on a 24×12 ft\"}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:09:18.274Z","selector":"#murW","label":"Studio: Mural width - set 30","action":"set-value:30","ok":true,"effect":"{\"before\":\"24\",\"after\":\"30\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 12×30 ft · 360 sq ft\\n    Signatures shown: 18\\n    Price: $3,600\",\"sigCount\":18,\"orderSummary\":\"Oldest Signatures in History · 12×30 ft custom · 18 signatures · $3,600\\n     Placement on a 24×12 ft\"}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:09:18.918Z","selector":"#murH","label":"Studio: Mural height - set 10","action":"set-value:10","ok":true,"effect":"{\"before\":\"12\",\"after\":\"10\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 1.0 ft\\n    Mural: 10×30 ft · 300 sq ft\\n    Signatures shown: 18\\n    Price: $3,000\",\"sigCount\":18,\"orderSummary\":\"Oldest Signatures in History · 10×30 ft custom · 18 signatures · $3,000\\n     Placement on a 24×12 ft\"}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:09:19.544Z","selector":"#murW","label":"Studio: Mural width - set 16","action":"set-value:16","ok":true,"effect":"{\"before\":\"30\",\"after\":\"16\",\"studioReadout\":\"From left wall: 4.0 ft\\n    From right wall: 4.0 ft\\n    Bottom off floor: 1.0 ft\\n    Mural: 10×16 ft · 160 sq ft\\n    Signatures shown: 18\\n    Price: $1,600\",\"sigCount\":18,\"orderSummary\":\"Oldest Signatures in History · 10×16 ft custom · 18 signatures · $1,600\\n     Placement on a 24×12 ft\"}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:09:20.170Z","selector":"#murH","label":"Studio: Mural height - set 8","action":"set-value:8","ok":true,"effect":"{\"before\":\"10\",\"after\":\"8\",\"studioReadout\":\"From left wall: 4.0 ft\\n    From right wall: 4.0 ft\\n    Bottom off floor: 2.0 ft\\n    Mural: 8×16 ft · 128 sq ft\\n    Signatures shown: 18\\n    Price: $1,280\",\"sigCount\":18,\"orderSummary\":\"Oldest Signatures in History · 8×16 ft custom · 18 signatures · $1,280\\n     Placement on a 24×12 ft \"}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:09:20.795Z","selector":"#murW","label":"Studio: Mural width - set 40","action":"set-value:40","ok":true,"effect":"{\"before\":\"16\",\"after\":\"40\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 2.0 ft\\n    Mural: 8×40 ft · 320 sq ft\\n    Signatures shown: 18\\n    Price: $3,200\",\"sigCount\":18,\"orderSummary\":\"Oldest Signatures in History · 8×40 ft custom · 18 signatures · $3,200\\n     Placement on a 24×12 ft \"}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:22.027Z","game":"match","diff":"scholar","cat":"All","selector":"#play","label":"play-panel-appeared","action":"wait","ok":true,"effect":"play panel shown in 10120ms","errors":["REQUEST_FAILED: POST https://www.google-analytics.com/g/collect?v=2&tid=G-2HEVP6TD0J&gtm=45je67u0v9260226174za200zd9260226174&_p=1785791350636&gcd=13l3l3l3l1l1&npa=0&dma=0&_eu=AAAAAAQ&are=1&cid=1749435826.1785791089&frm=0&ngs=1&pscdl=noapi&rcb=3&sr=1600x900&uaa=arm&uab=64&uafvl=HeadlessChrome%3B149.0.7827.55%7CChromium%3B149.0.7827.55%7CNot)A%253BBrand%3B24.0.0.0&uam=&uamb=0&uap=macOS&uapv=26.4.0&uaw=0&ul=en-us&_s=1&tag_exp=115938466~115938469~118897920~118897930~119896803~120222308&sid=1785791088&sct=1&seg=1&dl=http%3A%2F%2Flocalhost%2Fgame&dt=The%20Signature%20Games%20%E2%80%94%20Celebrity%20Signatures&en=page_view&_ee=1&tfd=5017 — net::ERR_ABORTED"]}
+{"run":1,"ts":"2026-08-03T21:09:22.031Z","game":"match","diff":"scholar","cat":"All","selector":"#stage","label":"round-1-render","action":"inspect","ok":true,"effect":"stage_html_len=165, choices=4, imgs_ok=1, imgs_broken=0","errors":[]}
+{"run":2,"ts":"2026-08-03T21:09:21.419Z","selector":"#murH","label":"Studio: Mural height - set 16","action":"set-value:16","ok":true,"effect":"{\"before\":\"8\",\"after\":\"16\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 16×40 ft · 640 sq ft\\n    Signatures shown: 18\\n    Price: $6,400\",\"sigCount\":18,\"orderSummary\":\"Oldest Signatures in History · 16×40 ft custom · 18 signatures · $6,400\\n     Placement on a 24×12 ft\"}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:22.491Z","game":"match","diff":"scholar","cat":"All","selector":".choice","label":"round-1-pick-0","action":"click","ok":true,"effect":"Chose: \"\", reveal: \"✗ Their piece was “An Allegory of Statuary or Lament of Sculpture” → by François\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:22.493Z","game":"match","diff":"scholar","cat":"All","selector":"#reveal a","label":"round-1-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/100263","errors":[]}
+{"run":2,"ts":"2026-08-03T21:09:22.043Z","selector":"input[name=\"wall_w\"]","label":"Order: Wall width input","action":"set-value:24","ok":true,"effect":"{\"before\":\"32\",\"after\":\"24\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 16×40 ft · 640 sq ft\\n    Signatures shown: 18\\n    Price: $6,400\",\"sigCount\":null,\"orderSummary\":\"Oldest Signatures in History · 16×40 ft custom · 18 signatures · $6,400\\n     Placement on a 24×12 ft\"}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:22.741Z","game":"match","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-1-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:23.146Z","game":"match","diff":"scholar","cat":"All","selector":"#stage","label":"round-2-render","action":"inspect","ok":true,"effect":"stage_html_len=126, choices=4, imgs_ok=2, imgs_broken=0","errors":[]}
+{"run":2,"ts":"2026-08-03T21:09:22.667Z","selector":"input[name=\"wall_h\"]","label":"Order: Wall height input","action":"set-value:12","ok":true,"effect":"{\"before\":\"14\",\"after\":\"12\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 16×40 ft · 640 sq ft\\n    Signatures shown: 18\\n    Price: $6,400\",\"sigCount\":null,\"orderSummary\":\"Oldest Signatures in History · 16×40 ft custom · 18 signatures · $6,400\\n     Placement on a 24×12 ft\"}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:23.600Z","game":"match","diff":"scholar","cat":"All","selector":".choice","label":"round-2-pick-3","action":"click","ok":true,"effect":"Chose: \"\", reveal: \"✗ Their piece was “Head of a Young Black Boy in Profile to Right” → by Wenceslau\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:23.601Z","game":"match","diff":"scholar","cat":"All","selector":"#reveal a","label":"round-2-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/18605","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:23.852Z","game":"match","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-2-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:09:23.308Z","selector":"#finderInput","label":"Finder: search input","action":"type:lincoln","ok":true,"effect":"{\"before\":null,\"after\":\"lincoln\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:24.256Z","game":"match","diff":"scholar","cat":"All","selector":"#stage","label":"round-3-render","action":"inspect","ok":true,"effect":"stage_html_len=126, choices=4, imgs_ok=3, imgs_broken=0","errors":[]}
+{"run":2,"ts":"2026-08-03T21:09:23.934Z","selector":"#finderInput","label":"Finder: clear + type babe ruth","action":"clear+type:babe ruth","ok":true,"effect":"{\"before\":\"lincoln\",\"after\":\"babe ruth\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:24.698Z","game":"match","diff":"scholar","cat":"All","selector":".choice","label":"round-3-pick-2","action":"click","ok":true,"effect":"Chose: \"\", reveal: \"✗ Their piece was “The Capture of Samson” → by Peter Paul RubensNext →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:24.699Z","game":"match","diff":"scholar","cat":"All","selector":"#reveal a","label":"round-3-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/8953","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:24.949Z","game":"match","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-3-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:09:24.560Z","selector":"#finderInput","label":"Finder: clear + type einstein","action":"clear+type:einstein","ok":true,"effect":"{\"before\":\"babe ruth\",\"after\":\"einstein\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:25.354Z","game":"match","diff":"scholar","cat":"All","selector":"#stage","label":"round-4-render","action":"inspect","ok":true,"effect":"stage_html_len=143, choices=4, imgs_ok=4, imgs_broken=0","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:25.795Z","game":"match","diff":"scholar","cat":"All","selector":".choice","label":"round-4-pick-0","action":"click","ok":true,"effect":"Chose: \"\", reveal: \"✗ Their piece was “Jean Baptiste Camille Corot” → by Étienne CarjatNext →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:25.796Z","game":"match","diff":"scholar","cat":"All","selector":"#reveal a","label":"round-4-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/92159","errors":[]}
+{"run":2,"ts":"2026-08-03T21:09:25.199Z","selector":".m-card:nth-child(1) .name-toggle","label":"Gallery card 1: Show names toggle","action":"click","ok":true,"effect":"{\"before\":\"Show names\",\"after\":\"Show names\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:26.046Z","game":"match","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-4-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:26.451Z","game":"match","diff":"scholar","cat":"All","selector":"#stage","label":"round-5-render","action":"inspect","ok":true,"effect":"stage_html_len=157, choices=4, imgs_ok=5, imgs_broken=0","errors":[]}
+{"run":2,"ts":"2026-08-03T21:09:26.017Z","selector":".m-card:nth-child(1) .name-toggle","label":"Gallery card 1: Hide names toggle","action":"click","ok":true,"effect":"{\"before\":\"Show names\",\"after\":\"Show names\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:26.894Z","game":"match","diff":"scholar","cat":"All","selector":".choice","label":"round-5-pick-3","action":"click","ok":true,"effect":"Chose: \"\", reveal: \"✓ Correct — “A Mountain Torrent” → by Kenyon CoxNext →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:26.897Z","game":"match","diff":"scholar","cat":"All","selector":"#reveal a","label":"round-5-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/131381","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:27.160Z","game":"match","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-5-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:27.566Z","game":"match","diff":"scholar","cat":"All","selector":"#stage","label":"round-6-render","action":"inspect","ok":true,"effect":"stage_html_len=172, choices=4, imgs_ok=6, imgs_broken=0","errors":[]}
+{"run":2,"ts":"2026-08-03T21:09:26.791Z","selector":".m-card:nth-child(2) .name-toggle","label":"Gallery card 2: Show names toggle","action":"click","ok":true,"effect":"{\"before\":\"Show names\",\"after\":\"Show names\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:28.004Z","game":"match","diff":"scholar","cat":"All","selector":".choice","label":"round-6-pick-2","action":"click","ok":true,"effect":"Chose: \"\", reveal: \"✗ Their piece was “Henry Hill” → by John Singleton CopleyNext →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:28.005Z","game":"match","diff":"scholar","cat":"All","selector":"#reveal a","label":"round-6-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/187051","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:28.260Z","game":"match","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-6-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:09:27.569Z","selector":".m-card:nth-child(3) .name-toggle","label":"Gallery card 3: Show names toggle","action":"click","ok":true,"effect":"{\"before\":\"Show names\",\"after\":\"Show names\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:28.666Z","game":"match","diff":"scholar","cat":"All","selector":"#stage","label":"round-7-render","action":"inspect","ok":true,"effect":"stage_html_len=138, choices=4, imgs_ok=7, imgs_broken=0","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:29.114Z","game":"match","diff":"scholar","cat":"All","selector":".choice","label":"round-7-pick-0","action":"click","ok":true,"effect":"Chose: \"\", reveal: \"✗ Their piece was “Bust of Angelique Mongez” → by Jacques-Louis DavidSee results\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:29.115Z","game":"match","diff":"scholar","cat":"All","selector":"#reveal a","label":"round-7-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/113576","errors":[]}
+{"run":2,"ts":"2026-08-03T21:09:28.345Z","selector":".m-card:nth-child(1) .roster-trig","label":"Gallery card 1: Roster drawer open","action":"click","ok":true,"effect":"{\"before\":\"See who's on this wall ▾\",\"after\":\"Hide who's on this wall ▴\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:29.367Z","game":"match","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-7-next","action":"click","ok":true,"effect":"Next text: \"See results\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:29.771Z","game":"match","diff":"scholar","cat":"All","selector":"#results","label":"results-screen","action":"inspect","ok":true,"effect":"score=10, verdict=\"Everyone starts somewhere.\", best=\"Best (match · scholar): 10\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:09:29.126Z","selector":".m-card:nth-child(2) .roster-trig","label":"Gallery card 2: Roster drawer open","action":"click","ok":true,"effect":"{\"before\":\"See who's on this wall ▾\",\"after\":\"Hide who's on this wall ▴\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:30.225Z","game":"match","diff":"scholar","cat":"All","selector":"#againBtn","label":"play-again","action":"click","ok":true,"effect":"Setup panel returned: true","errors":[]}
+{"run":2,"ts":"2026-08-03T21:09:29.905Z","selector":".m-card:nth-child(3) .roster-trig","label":"Gallery card 3: Roster drawer open","action":"click","ok":true,"effect":"{\"before\":\"See who's on this wall ▾\",\"after\":\"Hide who's on this wall ▴\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:31.305Z","game":"art","diff":"scholar","cat":"All","selector":"#gamePick .gcard[data-g=\"art\"]","label":"game-card-art","action":"click","ok":true,"effect":"card selected","errors":["REQUEST_FAILED: POST https://www.google-analytics.com/g/collect?v=2&tid=G-2HEVP6TD0J&gtm=45je67u0v9260226174za200zd9260226174&_p=1785791350636&gcd=13l3l3l3l1l1&npa=0&dma=0&_eu=AAAAAAQ&are=1&cid=1749435826.1785791089&frm=0&ngs=1&pscdl=noapi&rcb=3&sr=1600x900&uaa=arm&uab=64&uafvl=HeadlessChrome%3B149.0.7827.55%7CChromium%3B149.0.7827.55%7CNot)A%253BBrand%3B24.0.0.0&uam=&uamb=0&uap=macOS&uapv=26.4.0&uaw=0&ul=en-us&_s=2&tag_exp=115938466~115938469~118897920~118897930~119896803~120222308&sid=1785791088&sct=1&seg=1&dl=http%3A%2F%2Flocalhost%2Fgame&dt=The%20Signature%20Games%20%E2%80%94%20Celebrity%20Signatures&en=user_engagement&_et=19582&tfd=19600 — net::ERR_ABORTED"]}
+{"run":1,"ts":"2026-08-03T21:09:31.309Z","game":"art","diff":"scholar","cat":"All","selector":"#catLabel/#catOpts","label":"category-row-visibility","action":"inspect","ok":true,"effect":"catLabel=none, catOpts=none, expected_visible=false, actual=false","errors":[]}
+{"run":2,"ts":"2026-08-03T21:09:30.684Z","selector":".m-card:nth-child(1) [data-place]","label":"Gallery card 1: Place on wall","action":"click","ok":true,"effect":"{\"before\":\"Place on wall →\",\"after\":\"Place on wall →\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:31.504Z","game":"art","diff":"scholar","cat":"All","selector":"#diffOpts .opt[data-d=\"scholar\"]","label":"diff-scholar","action":"click","ok":true,"effect":"selected","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:31.548Z","game":"art","diff":"scholar","cat":"All","selector":"#goBtn","label":"begin-button","action":"click","ok":true,"effect":"Begin clicked","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:32.555Z","game":"art","diff":"scholar","cat":"All","selector":"#play","label":"play-panel-appeared","action":"wait","ok":true,"effect":"play panel shown in 1051ms","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:32.559Z","game":"art","diff":"scholar","cat":"All","selector":"https://www.artic.edu/iiif/2/6829aab0-8d0e-9438-aebf-a1a379572951/full/600,/0/default.jpg","label":"round-1-image","action":"inspect","ok":false,"effect":"Image broken/404: https://www.artic.edu/iiif/2/6829aab0-8d0e-9438-aebf-a1a379572951/full/600,/0/default.jpg","errors":["Image 404 or broken: https://www.artic.edu/iiif/2/6829aab0-8d0e-9438-aebf-a1a379572951/full/600,/0/default.jpg"]}
+{"run":1,"ts":"2026-08-03T21:09:32.559Z","game":"art","diff":"scholar","cat":"All","selector":"#stage","label":"round-1-render","action":"inspect","ok":true,"effect":"stage_html_len=152, choices=4, imgs_ok=0, imgs_broken=1","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:33.017Z","game":"art","diff":"scholar","cat":"All","selector":".choice","label":"round-1-pick-0","action":"click","ok":true,"effect":"Chose: \"Ernst Ludwig Kirchner\", reveal: \"✗ It was Franz Marc · “The Bewitched Mill”, 1913 → · their page →Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:33.018Z","game":"art","diff":"scholar","cat":"All","selector":"#reveal a","label":"round-1-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/9021","errors":[]}
+{"run":2,"ts":"2026-08-03T21:09:31.461Z","selector":".m-card:nth-child(2) [data-place]","label":"Gallery card 2: Place on wall","action":"click","ok":true,"effect":"{\"before\":\"Place on wall →\",\"after\":\"Place on wall →\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:33.268Z","game":"art","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-1-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:33.674Z","game":"art","diff":"scholar","cat":"All","selector":"#stage","label":"round-2-render","action":"inspect","ok":true,"effect":"stage_html_len=152, choices=4, imgs_ok=1, imgs_broken=1","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:34.128Z","game":"art","diff":"scholar","cat":"All","selector":".choice","label":"round-2-pick-3","action":"click","ok":true,"effect":"Chose: \"David Smith\", reveal: \"✗ It was John White Alexander · “Abraham Lincoln, Springfield, Illinois”, June 3\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:34.129Z","game":"art","diff":"scholar","cat":"All","selector":"#reveal a","label":"round-2-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/49356","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:34.380Z","game":"art","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-2-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:09:33.099Z","selector":".m-card:nth-child(3) [data-place]","label":"Gallery card 3: Place on wall","action":"click","ok":true,"effect":"{\"before\":\"Place on wall →\",\"after\":\"Place on wall →\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:34.786Z","game":"art","diff":"scholar","cat":"All","selector":"#stage","label":"round-3-render","action":"inspect","ok":true,"effect":"stage_html_len=152, choices=4, imgs_ok=2, imgs_broken=1","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:35.225Z","game":"art","diff":"scholar","cat":"All","selector":".choice","label":"round-3-pick-2","action":"click","ok":true,"effect":"Chose: \"Balthasar Permoser\", reveal: \"✓ Correct — Balthasar Permoser · “Combat Between Horseman and Footsoldier”, n.d.\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:35.226Z","game":"art","diff":"scholar","cat":"All","selector":"#reveal a","label":"round-3-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/84389","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:35.481Z","game":"art","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-3-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":["REQUEST_FAILED: POST https://www.google-analytics.com/g/collect?v=2&tid=G-2HEVP6TD0J&gtm=45je67u0v9260226174za200zd9260226174&_p=1785791370234&gcd=13l3l3l3l1l1&npa=0&dma=0&_eu=AAAAAAQ&are=1&cid=1749435826.1785791089&frm=0&ngs=1&pscdl=noapi&rcb=11&sr=1600x900&uaa=arm&uab=64&uafvl=HeadlessChrome%3B149.0.7827.55%7CChromium%3B149.0.7827.55%7CNot)A%253BBrand%3B24.0.0.0&uam=&uamb=0&uap=macOS&uapv=26.4.0&uaw=0&ul=en-us&_s=1&tag_exp=115938465~115938469~118897920~118897930~119896803&sid=1785791088&sct=1&seg=1&dl=http%3A%2F%2Flocalhost%2Fgame&dt=The%20Signature%20Games%20%E2%80%94%20Celebrity%20Signatures&en=page_view&_ee=1&tfd=5019 — net::ERR_ABORTED"]}
+{"run":2,"ts":"2026-08-03T21:09:34.748Z","selector":"header nav a[href=\"#studio\"]","label":"Nav: Wall studio","action":"click","ok":true,"effect":"{\"before\":\"Wall studio\",\"after\":\"Wall studio\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:35.887Z","game":"art","diff":"scholar","cat":"All","selector":"https://www.artic.edu/iiif/2/726af50a-c850-b15f-5ea7-bf386cabdb03/full/600,/0/default.jpg","label":"round-4-image","action":"inspect","ok":false,"effect":"Image broken/404: https://www.artic.edu/iiif/2/726af50a-c850-b15f-5ea7-bf386cabdb03/full/600,/0/default.jpg","errors":["HTTP_403: https://www.artic.edu/iiif/2/726af50a-c850-b15f-5ea7-bf386cabdb03/full/600,/0/default.jpg","CONSOLE_ERR: Failed to load resource: the server responded with a status of 403 ()","Image 404 or broken: https://www.artic.edu/iiif/2/726af50a-c850-b15f-5ea7-bf386cabdb03/full/600,/0/default.jpg"]}
+{"run":1,"ts":"2026-08-03T21:09:35.887Z","game":"art","diff":"scholar","cat":"All","selector":"#stage","label":"round-4-render","action":"inspect","ok":true,"effect":"stage_html_len=152, choices=4, imgs_ok=2, imgs_broken=2","errors":[]}
+{"run":2,"ts":"2026-08-03T21:09:35.528Z","selector":"header nav a[href=\"#order\"]","label":"Nav: Order","action":"click","ok":true,"effect":"{\"before\":\"Order\",\"after\":\"Order\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:36.338Z","game":"art","diff":"scholar","cat":"All","selector":".choice","label":"round-4-pick-0","action":"click","ok":true,"effect":"Chose: \"Sharaku\", reveal: \"✗ It was Claude Nicolas Ledoux · “Project for the Ceiling of the Salle de Specta\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:36.340Z","game":"art","diff":"scholar","cat":"All","selector":"#reveal a","label":"round-4-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/86071","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:36.588Z","game":"art","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-4-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:36.995Z","game":"art","diff":"scholar","cat":"All","selector":"#stage","label":"round-5-render","action":"inspect","ok":true,"effect":"stage_html_len=152, choices=4, imgs_ok=3, imgs_broken=2","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:37.435Z","game":"art","diff":"scholar","cat":"All","selector":".choice","label":"round-5-pick-3","action":"click","ok":true,"effect":"Chose: \"Joachim Wtewael\", reveal: \"✗ It was Maxime Du Camp · “Le Sphynx vu de Face, Egypte Moyenne, plate 11 from t\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:37.437Z","game":"art","diff":"scholar","cat":"All","selector":"#reveal a","label":"round-5-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/144206","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:37.686Z","game":"art","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-5-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:38.092Z","game":"art","diff":"scholar","cat":"All","selector":"#stage","label":"round-6-render","action":"inspect","ok":true,"effect":"stage_html_len=152, choices=4, imgs_ok=4, imgs_broken=2","errors":[]}
+{"run":2,"ts":"2026-08-03T21:09:36.306Z","selector":"header nav a[href=\"/\"]","label":"Nav: Signature archive","action":"click-navigate","ok":true,"effect":"CLICKED_NAVIGATE_WENT_BACK","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:38.545Z","game":"art","diff":"scholar","cat":"All","selector":".choice","label":"round-6-pick-2","action":"click","ok":true,"effect":"Chose: \"Filippo Tommaso Marinetti\", reveal: \"✗ It was Henri Rousseau · “River and Park Landscape”, 1885/90 → · their page →Ne\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:38.546Z","game":"art","diff":"scholar","cat":"All","selector":"#reveal a","label":"round-6-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/38445","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:38.797Z","game":"art","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-6-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:09:38.534Z","selector":"#selMural","label":"Studio: Mural select - declaration","action":"select-option:d","ok":true,"effect":"{\"before\":\"Oldest Signatures in HistoryDeclaration of IndependencePolit\",\"after\":\"Oldest Signatures in HistoryDeclaration of IndependencePolit\",\"sigCount\":56,\"orderSummary\":\"Declaration of Independence · 16×40 ft custom · 56 signatures · $6,400\\n     Placement on a 24×12 ft \"}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:39.202Z","game":"art","diff":"scholar","cat":"All","selector":"#stage","label":"round-7-render","action":"inspect","ok":true,"effect":"stage_html_len=152, choices=4, imgs_ok=5, imgs_broken=2","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:39.643Z","game":"art","diff":"scholar","cat":"All","selector":".choice","label":"round-7-pick-0","action":"click","ok":true,"effect":"Chose: \"Charles Dana Gibson\", reveal: \"✗ It was Jean-Baptiste Isabey · “M. Villeau”, 1823 → · their page →Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:39.644Z","game":"art","diff":"scholar","cat":"All","selector":"#reveal a","label":"round-7-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/8652","errors":[]}
+{"run":2,"ts":"2026-08-03T21:09:39.173Z","selector":"#selMural","label":"Studio: Mural select - politics","action":"select-option:p","ok":true,"effect":"{\"before\":\"Oldest Signatures in HistoryDeclaration of IndependencePolit\",\"after\":\"Oldest Signatures in HistoryDeclaration of IndependencePolit\",\"sigCount\":54,\"orderSummary\":\"Politics & Statecraft · 16×40 ft custom · 54 signatures · $6,400\\n     Placement on a 24×12 ft wall: \"}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:39.894Z","game":"art","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-7-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:40.300Z","game":"art","diff":"scholar","cat":"All","selector":"#stage","label":"round-8-render","action":"inspect","ok":true,"effect":"stage_html_len=152, choices=4, imgs_ok=6, imgs_broken=2","errors":[]}
+{"run":2,"ts":"2026-08-03T21:09:39.806Z","selector":"#selMural","label":"Studio: Mural select - composers","action":"select-option:co","ok":true,"effect":"{\"before\":\"Oldest Signatures in HistoryDeclaration of IndependencePolit\",\"after\":\"Oldest Signatures in HistoryDeclaration of IndependencePolit\",\"sigCount\":3,\"orderSummary\":\"Great Composers · 16×40 ft custom · 3 signatures · $6,400\\n     Placement on a 24×12 ft wall: 0.0 ft \"}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:40.741Z","game":"art","diff":"scholar","cat":"All","selector":".choice","label":"round-8-pick-3","action":"click","ok":true,"effect":"Chose: \"Eugène Delacroix\", reveal: \"✓ Correct — Eugène Delacroix · “Arab Horseman Attacked by a Lion”, 1849–50 → · t\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:40.742Z","game":"art","diff":"scholar","cat":"All","selector":"#reveal a","label":"round-8-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/81503","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:40.991Z","game":"art","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-8-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:09:40.432Z","selector":"#btnCenter","label":"Studio: Center on wall","action":"click","ok":true,"effect":"{\"before\":\"Center on wall\",\"after\":\"Center on wall\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 16×40 ft · 640 sq ft\\n    Signatures shown: 3\\n    Price: $6,400\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:41.397Z","game":"art","diff":"scholar","cat":"All","selector":"#stage","label":"round-9-render","action":"inspect","ok":true,"effect":"stage_html_len=152, choices=4, imgs_ok=7, imgs_broken=2","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:41.838Z","game":"art","diff":"scholar","cat":"All","selector":".choice","label":"round-9-pick-2","action":"click","ok":true,"effect":"Chose: \"Émile Zola\", reveal: \"✗ It was Peter Paul Rubens · “Saint Francis”, c. 1615 → · their page →Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:41.839Z","game":"art","diff":"scholar","cat":"All","selector":"#reveal a","label":"round-9-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/100342","errors":[]}
+{"run":2,"ts":"2026-08-03T21:09:41.217Z","selector":"#scenePresets button[data-scene=\"study\"]","label":"Scene preset: Study","action":"click","ok":true,"effect":"{\"before\":\"Study\",\"after\":\"Study\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:42.090Z","game":"art","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-9-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:42.495Z","game":"art","diff":"scholar","cat":"All","selector":"#stage","label":"round-10-render","action":"inspect","ok":true,"effect":"stage_html_len=152, choices=4, imgs_ok=8, imgs_broken=2","errors":[]}
+{"run":2,"ts":"2026-08-03T21:09:42.004Z","selector":"#scenePresets button[data-scene=\"lounge\"]","label":"Scene preset: Lounge","action":"click","ok":true,"effect":"{\"before\":\"Lounge\",\"after\":\"Lounge\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:42.936Z","game":"art","diff":"scholar","cat":"All","selector":".choice","label":"round-10-pick-0","action":"click","ok":true,"effect":"Chose: \"Harriet Hosmer\", reveal: \"✗ It was Alvan Clark · “Miss M. of Washington, No. 17 from the portfolio \"Americ\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:42.939Z","game":"art","diff":"scholar","cat":"All","selector":"#reveal a","label":"round-10-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/103544","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:43.187Z","game":"art","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-10-next","action":"click","ok":true,"effect":"Next text: \"See results\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:09:42.795Z","selector":"#scenePresets button[data-scene=\"gallery\"]","label":"Scene preset: Gallery","action":"click","ok":true,"effect":"{\"before\":\"Gallery\",\"after\":\"Gallery\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:43.593Z","game":"art","diff":"scholar","cat":"All","selector":"#results","label":"results-screen","action":"inspect","ok":true,"effect":"score=20, verdict=\"Everyone starts somewhere.\", best=\"Best (art · scholar): 20\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:44.047Z","game":"art","diff":"scholar","cat":"All","selector":"#againBtn","label":"play-again","action":"click","ok":true,"effect":"Setup panel returned: true","errors":[]}
+{"run":2,"ts":"2026-08-03T21:09:43.591Z","selector":"#scenePresets button[data-scene=\"plain\"]","label":"Scene preset: Plain","action":"click","ok":true,"effect":"{\"before\":\"Plain\",\"after\":\"Plain\",\"sigCount\":null}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:09:44.387Z","selector":"input[name=\"name\"]","label":"Order: Name input","action":"type:John Test","ok":true,"effect":"{\"before\":null,\"after\":\"John Test\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:45.124Z","game":"whose","diff":"scholar","cat":"All","selector":"#gamePick .gcard[data-g=\"whose\"]","label":"game-card-whose","action":"click","ok":true,"effect":"card selected","errors":["REQUEST_FAILED: POST https://www.google-analytics.com/g/collect?v=2&tid=G-2HEVP6TD0J&gtm=45je67u0v9260226174za200zd9260226174&_p=1785791370234&gcd=13l3l3l3l1l1&npa=0&dma=0&_eu=AAAAAAQ&are=1&cid=1749435826.1785791089&frm=0&ngs=1&pscdl=noapi&rcb=11&sr=1600x900&uaa=arm&uab=64&uafvl=HeadlessChrome%3B149.0.7827.55%7CChromium%3B149.0.7827.55%7CNot)A%253BBrand%3B24.0.0.0&uam=&uamb=0&uap=macOS&uapv=26.4.0&uaw=0&ul=en-us&_s=2&tag_exp=115938465~115938469~118897920~118897930~119896803&sid=1785791088&sct=1&seg=1&dl=http%3A%2F%2Flocalhost%2Fgame&dt=The%20Signature%20Games%20%E2%80%94%20Celebrity%20Signatures&en=user_engagement&_et=13805&tfd=13826 — net::ERR_ABORTED"]}
+{"run":1,"ts":"2026-08-03T21:09:45.128Z","game":"whose","diff":"scholar","cat":"All","selector":"#catLabel/#catOpts","label":"category-row-visibility","action":"inspect","ok":true,"effect":"catLabel=block, catOpts=flex, expected_visible=true, actual=true","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:45.325Z","game":"whose","diff":"scholar","cat":"All","selector":"#diffOpts .opt[data-d=\"scholar\"]","label":"diff-scholar","action":"click","ok":true,"effect":"selected","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:45.520Z","game":"whose","diff":"scholar","cat":"All","selector":"#catOpts .opt[data-c=\"All\"]","label":"cat-All","action":"click","ok":true,"effect":"selected","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:45.571Z","game":"whose","diff":"scholar","cat":"All","selector":"#goBtn","label":"begin-button","action":"click","ok":true,"effect":"Begin clicked","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:45.572Z","game":"whose","diff":"scholar","cat":"All","selector":"#play","label":"play-panel-appeared","action":"wait","ok":true,"effect":"play panel shown in 52ms","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:45.578Z","game":"whose","diff":"scholar","cat":"All","selector":"https://upload.wikimedia.org/wikipedia/commons/a/ac/Nelly_Sachs_Signature.jpg","label":"round-1-image","action":"inspect","ok":false,"effect":"Image broken/404: https://upload.wikimedia.org/wikipedia/commons/a/ac/Nelly_Sachs_Signature.jpg","errors":["Image 404 or broken: https://upload.wikimedia.org/wikipedia/commons/a/ac/Nelly_Sachs_Signature.jpg"]}
+{"run":1,"ts":"2026-08-03T21:09:45.579Z","game":"whose","diff":"scholar","cat":"All","selector":"#stage","label":"round-1-render","action":"inspect","ok":true,"effect":"stage_html_len=125, choices=4, imgs_ok=0, imgs_broken=1","errors":[]}
+{"run":2,"ts":"2026-08-03T21:09:45.014Z","selector":"input[name=\"email\"]","label":"Order: Email input","action":"type:test@example.com","ok":true,"effect":"{\"before\":null,\"after\":\"test@example.com\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:46.034Z","game":"whose","diff":"scholar","cat":"All","selector":".choice","label":"round-1-pick-0","action":"click","ok":true,"effect":"Chose: \"Nelly Sachs\", reveal: \"✓ Correct — Nelly Sachs · their page →Next →\"","errors":["REQUEST_FAILED: GET https://upload.wikimedia.org/wikipedia/commons/a/ac/Nelly_Sachs_Signature.jpg — net::ERR_BLOCKED_BY_ORB"]}
+{"run":2,"ts":"2026-08-03T21:09:45.638Z","selector":"textarea[name=\"notes\"]","label":"Order: Notes textarea","action":"type:Test order for master bedroom. Target install October.","ok":true,"effect":"{\"before\":null,\"after\":\"Test order for master bedroom. Target install October.\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:46.284Z","game":"whose","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-1-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:46.690Z","game":"whose","diff":"scholar","cat":"All","selector":"https://upload.wikimedia.org/wikipedia/commons/e/e2/Jack_Kerouac_signature.svg","label":"round-2-image","action":"inspect","ok":false,"effect":"Image broken/404: https://upload.wikimedia.org/wikipedia/commons/e/e2/Jack_Kerouac_signature.svg","errors":["REQUEST_FAILED: GET https://upload.wikimedia.org/wikipedia/commons/e/e2/Jack_Kerouac_signature.svg — net::ERR_BLOCKED_BY_ORB","Image 404 or broken: https://upload.wikimedia.org/wikipedia/commons/e/e2/Jack_Kerouac_signature.svg"]}
+{"run":1,"ts":"2026-08-03T21:09:46.691Z","game":"whose","diff":"scholar","cat":"All","selector":"#stage","label":"round-2-render","action":"inspect","ok":true,"effect":"stage_html_len=126, choices=4, imgs_ok=0, imgs_broken=2","errors":[]}
+{"run":2,"ts":"2026-08-03T21:09:46.266Z","selector":"#orderForm button[type=\"submit\"]","label":"Order: Submit form","action":"click","ok":true,"effect":"{\"before\":\"Request this mural\",\"after\":\"Request this mural\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:47.144Z","game":"whose","diff":"scholar","cat":"All","selector":".choice","label":"round-2-pick-3","action":"click","ok":true,"effect":"Chose: \"Ambrose Bierce\", reveal: \"✗ It was Jack Kerouac · their page →Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:47.394Z","game":"whose","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-2-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:09:47.046Z","selector":".m-card:nth-child(1) .r-search","label":"Roster card 1: filter \"wash\"","action":"type:wash","ok":true,"effect":"{\"before\":null,\"after\":\"wash\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:47.801Z","game":"whose","diff":"scholar","cat":"All","selector":"https://upload.wikimedia.org/wikipedia/commons/3/3d/Nikolai_Gogol_Signature.svg","label":"round-3-image","action":"inspect","ok":false,"effect":"Image broken/404: https://upload.wikimedia.org/wikipedia/commons/3/3d/Nikolai_Gogol_Signature.svg","errors":["REQUEST_FAILED: GET https://upload.wikimedia.org/wikipedia/commons/3/3d/Nikolai_Gogol_Signature.svg — net::ERR_BLOCKED_BY_ORB","Image 404 or broken: https://upload.wikimedia.org/wikipedia/commons/3/3d/Nikolai_Gogol_Signature.svg"]}
+{"run":1,"ts":"2026-08-03T21:09:47.802Z","game":"whose","diff":"scholar","cat":"All","selector":"#stage","label":"round-3-render","action":"inspect","ok":true,"effect":"stage_html_len=127, choices=4, imgs_ok=0, imgs_broken=3","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:48.256Z","game":"whose","diff":"scholar","cat":"All","selector":".choice","label":"round-3-pick-2","action":"click","ok":true,"effect":"Chose: \"T. S. Eliot\", reveal: \"✗ It was Nikolai Gogol · their page →Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:48.506Z","game":"whose","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-3-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:48.913Z","game":"whose","diff":"scholar","cat":"All","selector":"#stage","label":"round-4-render","action":"inspect","ok":true,"effect":"stage_html_len=127, choices=4, imgs_ok=1, imgs_broken=3","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:49.365Z","game":"whose","diff":"scholar","cat":"All","selector":".choice","label":"round-4-pick-0","action":"click","ok":true,"effect":"Chose: \"Rosa Luxemburg\", reveal: \"✗ It was Max Weber · their page →Next →\"","errors":["REQUEST_FAILED: POST https://www.google-analytics.com/g/collect?v=2&tid=G-2HEVP6TD0J&gtm=45je67u0v9260226174za200zd9260226174&_p=1785791384054&gcd=13l3l3l3l1l1&npa=0&dma=0&_eu=AAAAAAQ&are=1&cid=1749435826.1785791089&frm=0&ngs=1&pscdl=noapi&rcb=3&sr=1600x900&uaa=arm&uab=64&uafvl=HeadlessChrome%3B149.0.7827.55%7CChromium%3B149.0.7827.55%7CNot)A%253BBrand%3B24.0.0.0&uam=&uamb=0&uap=macOS&uapv=26.4.0&uaw=0&ul=en-us&_s=1&tag_exp=115938466~115938469~118897920~118897930~119896802~120222308&sid=1785791088&sct=1&seg=1&dl=http%3A%2F%2Flocalhost%2Fgame&dt=The%20Signature%20Games%20%E2%80%94%20Celebrity%20Signatures&en=page_view&_ee=1&tfd=5016 — net::ERR_ABORTED"]}
+{"run":1,"ts":"2026-08-03T21:09:49.617Z","game":"whose","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-4-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:50.024Z","game":"whose","diff":"scholar","cat":"All","selector":"https://upload.wikimedia.org/wikipedia/commons/9/9b/Yukio_Mishima_signature.svg","label":"round-5-image","action":"inspect","ok":false,"effect":"Image broken/404: https://upload.wikimedia.org/wikipedia/commons/9/9b/Yukio_Mishima_signature.svg","errors":["REQUEST_FAILED: GET https://upload.wikimedia.org/wikipedia/commons/9/9b/Yukio_Mishima_signature.svg — net::ERR_BLOCKED_BY_ORB","Image 404 or broken: https://upload.wikimedia.org/wikipedia/commons/9/9b/Yukio_Mishima_signature.svg"]}
+{"run":1,"ts":"2026-08-03T21:09:50.025Z","game":"whose","diff":"scholar","cat":"All","selector":"#stage","label":"round-5-render","action":"inspect","ok":true,"effect":"stage_html_len=127, choices=4, imgs_ok=1, imgs_broken=4","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:50.477Z","game":"whose","diff":"scholar","cat":"All","selector":".choice","label":"round-5-pick-3","action":"click","ok":true,"effect":"Chose: \"Yukio Mishima\", reveal: \"✓ Correct — Yukio Mishima · their page →Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:50.728Z","game":"whose","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-5-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:51.139Z","game":"whose","diff":"scholar","cat":"All","selector":"#stage","label":"round-6-render","action":"inspect","ok":true,"effect":"stage_html_len=126, choices=4, imgs_ok=2, imgs_broken=4","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:51.592Z","game":"whose","diff":"scholar","cat":"All","selector":".choice","label":"round-6-pick-2","action":"click","ok":true,"effect":"Chose: \"Gabriele D'Annunzio\", reveal: \"✗ It was Jean Cocteau · their page →Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:51.839Z","game":"whose","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-6-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:52.256Z","game":"whose","diff":"scholar","cat":"All","selector":"#stage","label":"round-7-render","action":"inspect","ok":true,"effect":"stage_html_len=129, choices=4, imgs_ok=3, imgs_broken=4","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:52.714Z","game":"whose","diff":"scholar","cat":"All","selector":".choice","label":"round-7-pick-0","action":"click","ok":true,"effect":"Chose: \"Ernest Rutherford\", reveal: \"✗ It was Jacques Cartier · their page →Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:52.964Z","game":"whose","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-7-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:53.370Z","game":"whose","diff":"scholar","cat":"All","selector":"https://upload.wikimedia.org/wikipedia/commons/2/2d/Goncharov_signature.svg","label":"round-8-image","action":"inspect","ok":false,"effect":"Image broken/404: https://upload.wikimedia.org/wikipedia/commons/2/2d/Goncharov_signature.svg","errors":["REQUEST_FAILED: GET https://upload.wikimedia.org/wikipedia/commons/2/2d/Goncharov_signature.svg — net::ERR_BLOCKED_BY_ORB","Image 404 or broken: https://upload.wikimedia.org/wikipedia/commons/2/2d/Goncharov_signature.svg"]}
+{"run":1,"ts":"2026-08-03T21:09:53.370Z","game":"whose","diff":"scholar","cat":"All","selector":"#stage","label":"round-8-render","action":"inspect","ok":true,"effect":"stage_html_len=123, choices=4, imgs_ok=3, imgs_broken=5","errors":[]}
+{"run":2,"ts":"2026-08-03T21:09:48.072Z","selector":".m-card:nth-child(1) .r-item:first-child","label":"Roster card 1: click roster item → provenance modal","action":"click","ok":false,"effect":"ACTION_FAILED","errors":["Error: locator.click: Element is not visible\nCall log:\n\u001b[2m  - waiting for locator('.m-card:nth-child(1) .r-item:first-child').first()\u001b[22m\n\u001b[2m    - locator resolved to <button type=\"button\" class=\"r-item\" data-sig=\"Oldest Signatures|1\">…</button>\u001b[22m\n\u001b[2m  - attempting click action\u001b[22m\n\u001b[2m    - scrolling into view if needed\u001b[22m\n"]}
+{"run":2,"ts":"2026-08-03T21:09:53.734Z","selector":"#provModal","label":"Provenance modal: opened?","action":"observe","ok":false,"effect":"MODAL_NOT_OPEN","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:53.824Z","game":"whose","diff":"scholar","cat":"All","selector":".choice","label":"round-8-pick-3","action":"click","ok":true,"effect":"Chose: \"Henri Barbusse\", reveal: \"✗ It was Ivan Goncharov · their page →Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:54.076Z","game":"whose","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-8-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:54.482Z","game":"whose","diff":"scholar","cat":"All","selector":"#stage","label":"round-9-render","action":"inspect","ok":true,"effect":"stage_html_len=123, choices=4, imgs_ok=4, imgs_broken=5","errors":[]}
+{"run":2,"ts":"2026-08-03T21:09:54.237Z","selector":".m-card:nth-child(2) .r-search","label":"Roster card 2: filter \"hancock\"","action":"type:hancock","ok":true,"effect":"{\"before\":null,\"after\":\"hancock\",\"sigCount\":null}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:54.935Z","game":"whose","diff":"scholar","cat":"All","selector":".choice","label":"round-9-pick-2","action":"click","ok":true,"effect":"Chose: \"John Adams\", reveal: \"✗ It was Lord Byron · their page →Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:55.186Z","game":"whose","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-9-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:55.594Z","game":"whose","diff":"scholar","cat":"All","selector":"https://upload.wikimedia.org/wikipedia/commons/a/a9/Denis_Diderot_signature.svg","label":"round-10-image","action":"inspect","ok":false,"effect":"Image broken/404: https://upload.wikimedia.org/wikipedia/commons/a/a9/Denis_Diderot_signature.svg","errors":["REQUEST_FAILED: GET https://upload.wikimedia.org/wikipedia/commons/a/a9/Denis_Diderot_signature.svg — net::ERR_BLOCKED_BY_ORB","Image 404 or broken: https://upload.wikimedia.org/wikipedia/commons/a/a9/Denis_Diderot_signature.svg"]}
+{"run":1,"ts":"2026-08-03T21:09:55.595Z","game":"whose","diff":"scholar","cat":"All","selector":"#stage","label":"round-10-render","action":"inspect","ok":true,"effect":"stage_html_len=127, choices=4, imgs_ok=4, imgs_broken=6","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:56.046Z","game":"whose","diff":"scholar","cat":"All","selector":".choice","label":"round-10-pick-0","action":"click","ok":true,"effect":"Chose: \"John Milton\", reveal: \"✗ It was Denis Diderot · their page →See results\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:56.298Z","game":"whose","diff":"scholar","cat":"All","selector":"#nextBtn","label":"round-10-next","action":"click","ok":true,"effect":"Next text: \"See results\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:56.702Z","game":"whose","diff":"scholar","cat":"All","selector":"#results","label":"results-screen","action":"inspect","ok":true,"effect":"score=20, verdict=\"Everyone starts somewhere.\", best=\"Best (whose · scholar): 20\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:09:57.158Z","game":"whose","diff":"scholar","cat":"All","selector":"#againBtn","label":"play-again","action":"click","ok":true,"effect":"Setup panel returned: true","errors":[]}
+{"run":2,"ts":"2026-08-03T21:09:55.771Z","selector":"#muralEl","label":"Studio: Drag mural","action":"drag","ok":false,"effect":"{\"before\":{\"left\":\"0px\",\"top\":\"0px\"},\"after\":{\"left\":\"0px\",\"top\":\"0px\"},\"readout\":\"From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 16×40 ft · 640 sq ft\\n    Signatures shown: 3\\n    Price: $6,\",\"moved\":false}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:09:57.405Z","selector":".m-card:nth-child(1) img","label":"Gallery card 1: collage image load","action":"observe","ok":true,"effect":"{\"src\":\"http://localhost:9920/output/collage-oldest-signatures.png\",\"complete\":true,\"naturalW\":1570}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:09:57.406Z","selector":"#readout","label":"Studio: readout check (price + sig count)","action":"observe","ok":true,"effect":"{\"text\":\"\\n    From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 16×40 ft · 640 sq ft\\n    Signatures shown: 3\\n    Price: $6,400\",\"price\":\"Price: $6,400\",\"sigs\":\"Signatures shown: 3\",\"sqft\":\"640 sq ft\"}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:09:57.407Z","selector":"#orderSummary","label":"Order: summary synced with studio","action":"observe","ok":true,"effect":"Great Composers · 16×40 ft custom · 3 signatures · $6,400\n     Placement on a 24×12 ft wall: 0.0 ft from left, 0.0 ft off floor.","errors":[]}
+{"run":3,"ts":"2026-08-03T21:10:02.247Z","selector":"page","label":"PAGE LOAD","action":"goto","ok":true,"effect":"{\"title\":\"Celebrity Signature Murals — made to order\",\"muralCards\":33,\"sigsLoaded\":true}","errors":[]}
+{"run":3,"ts":"2026-08-03T21:10:02.247Z","selector":"#wallH","label":"Studio: Wall height slider - 12","action":"set-slider:12","ok":true,"effect":"{\"before\":\"14\",\"after\":\"12\",\"studioReadout\":\"From left wall: 4.0 ft\\n    From right wall: 4.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 12×24 ft · 288 sq ft\\n    Signatures shown: 18\\n    Price: $2,880\",\"sigCount\":null,\"orderSummary\":\"Oldest Signatures in History · 12×24 ft custom · 18 signatures · $2,880\\n     Placement on a 32×12 ft\"}","errors":[]}
+{"run":3,"ts":"2026-08-03T21:10:02.886Z","selector":"#wallH","label":"Studio: Wall height slider - 20","action":"set-slider:20","ok":true,"effect":"{\"before\":\"12\",\"after\":\"20\",\"studioReadout\":\"From left wall: 4.0 ft\\n    From right wall: 4.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 12×24 ft · 288 sq ft\\n    Signatures shown: 18\\n    Price: $2,880\",\"sigCount\":null,\"orderSummary\":\"Oldest Signatures in History · 12×24 ft custom · 18 signatures · $2,880\\n     Placement on a 32×20 ft\"}","errors":[]}
+{"run":3,"ts":"2026-08-03T21:10:03.520Z","selector":"#murW","label":"Studio: Mural width - set 30","action":"set-value:30","ok":true,"effect":"{\"before\":\"24\",\"after\":\"30\",\"studioReadout\":\"From left wall: 1.0 ft\\n    From right wall: 1.0 ft\\n    Bottom off floor: 4.0 ft\\n    Mural: 12×30 ft · 360 sq ft\\n    Signatures shown: 18\\n    Price: $3,600\",\"sigCount\":18,\"orderSummary\":\"Oldest Signatures in History · 12×30 ft custom · 18 signatures · $3,600\\n     Placement on a 32×20 ft\"}","errors":[]}
+{"run":3,"ts":"2026-08-03T21:10:04.150Z","selector":"#murH","label":"Studio: Mural height - set 16","action":"set-value:16","ok":true,"effect":"{\"before\":\"12\",\"after\":\"16\",\"studioReadout\":\"From left wall: 1.0 ft\\n    From right wall: 1.0 ft\\n    Bottom off floor: 2.0 ft\\n    Mural: 16×30 ft · 480 sq ft\\n    Signatures shown: 18\\n    Price: $4,800\",\"sigCount\":18,\"orderSummary\":\"Oldest Signatures in History · 16×30 ft custom · 18 signatures · $4,800\\n     Placement on a 32×20 ft\"}","errors":[]}
+{"run":3,"ts":"2026-08-03T21:10:04.785Z","selector":"#murH","label":"Studio: Mural height - set 10","action":"set-value:10","ok":true,"effect":"{\"before\":\"16\",\"after\":\"10\",\"studioReadout\":\"From left wall: 1.0 ft\\n    From right wall: 1.0 ft\\n    Bottom off floor: 5.0 ft\\n    Mural: 10×30 ft · 300 sq ft\\n    Signatures shown: 18\\n    Price: $3,000\",\"sigCount\":18,\"orderSummary\":\"Oldest Signatures in History · 10×30 ft custom · 18 signatures · $3,000\\n     Placement on a 32×20 ft\"}","errors":[]}
+{"run":3,"ts":"2026-08-03T21:10:05.410Z","selector":"#murH","label":"Studio: Mural height - set 8","action":"set-value:8","ok":true,"effect":"{\"before\":\"10\",\"after\":\"8\",\"studioReadout\":\"From left wall: 1.0 ft\\n    From right wall: 1.0 ft\\n    Bottom off floor: 6.0 ft\\n    Mural: 8×30 ft · 240 sq ft\\n    Signatures shown: 18\\n    Price: $2,400\",\"sigCount\":18,\"orderSummary\":\"Oldest Signatures in History · 8×30 ft custom · 18 signatures · $2,400\\n     Placement on a 32×20 ft \"}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:06.645Z","game":"art","diff":"curator","cat":"All","selector":"#gamePick .gcard[data-g=\"art\"]","label":"game-card-art","action":"click","ok":true,"effect":"card selected","errors":["REQUEST_FAILED: POST https://www.google-analytics.com/g/collect?v=2&tid=G-2HEVP6TD0J&gtm=45je67v1v9260226174za200zd9260226174&_p=1785791405561&gcd=13l3l3l3l1l1&npa=0&dma=0&are=1&cid=1264535497.1785791406&frm=0&ngs=1&pscdl=noapi&rcb=16&sr=1600x900&uaa=arm&uab=64&uafvl=HeadlessChrome%3B149.0.7827.55%7CChromium%3B149.0.7827.55%7CNot)A%253BBrand%3B24.0.0.0&uam=&uamb=0&uap=macOS&uapv=26.4.0&uaw=0&ul=en-us&_s=1&tag_exp=115938466~115938469~118897920~118897930~119896803~120222308&sid=1785791405&sct=1&seg=0&dl=http%3A%2F%2Flocalhost%2Fgame&dt=The%20Signature%20Games%20%E2%80%94%20Celebrity%20Signatures&en=page_view&_fv=1&_nsi=1&_ss=1&_ee=1&tfd=148 — net::ERR_ABORTED"]}
+{"run":2,"ts":"2026-08-03T21:10:06.648Z","game":"art","diff":"curator","cat":"All","selector":"#catLabel/#catOpts","label":"category-row-visibility","action":"inspect","ok":true,"effect":"catLabel=none, catOpts=none, expected_visible=false, actual=false","errors":[]}
+{"run":3,"ts":"2026-08-03T21:10:06.047Z","selector":"#selMural","label":"Studio: Mural select - composers","action":"select-option:co","ok":true,"effect":"{\"before\":\"Oldest Signatures in HistoryDeclaration of IndependencePolit\",\"after\":\"Oldest Signatures in HistoryDeclaration of IndependencePolit\",\"sigCount\":3,\"orderSummary\":\"Great Composers · 8×30 ft custom · 3 signatures · $2,400\\n     Placement on a 32×20 ft wall: 1.0 ft f\"}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:06.840Z","game":"art","diff":"curator","cat":"All","selector":"#diffOpts .opt[data-d=\"curator\"]","label":"diff-curator","action":"click","ok":true,"effect":"selected","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:06.884Z","game":"art","diff":"curator","cat":"All","selector":"#goBtn","label":"begin-button","action":"click","ok":true,"effect":"Begin clicked","errors":[]}
+{"run":3,"ts":"2026-08-03T21:10:06.684Z","selector":"#selMural","label":"Studio: Mural select - declaration","action":"select-option:d","ok":true,"effect":"{\"before\":\"Oldest Signatures in HistoryDeclaration of IndependencePolit\",\"after\":\"Oldest Signatures in HistoryDeclaration of IndependencePolit\",\"sigCount\":56,\"orderSummary\":\"Declaration of Independence · 8×30 ft custom · 56 signatures · $2,400\\n     Placement on a 32×20 ft w\"}","errors":[]}
+{"run":3,"ts":"2026-08-03T21:10:07.306Z","selector":"#wallH","label":"Studio: Wall height slider - 16","action":"set-slider:16","ok":true,"effect":"{\"before\":\"20\",\"after\":\"16\",\"studioReadout\":\"From left wall: 1.0 ft\\n    From right wall: 1.0 ft\\n    Bottom off floor: 6.0 ft\\n    Mural: 8×30 ft · 240 sq ft\\n    Signatures shown: 56\\n    Price: $2,400\",\"sigCount\":null,\"orderSummary\":\"Declaration of Independence · 8×30 ft custom · 56 signatures · $2,400\\n     Placement on a 32×16 ft w\"}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:08.395Z","game":"art","diff":"curator","cat":"All","selector":"#play","label":"play-panel-appeared","action":"wait","ok":true,"effect":"play panel shown in 1555ms","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:08.401Z","game":"art","diff":"curator","cat":"All","selector":"#stage","label":"round-1-render","action":"inspect","ok":true,"effect":"stage_html_len=152, choices=4, imgs_ok=1, imgs_broken=0","errors":[]}
+{"run":3,"ts":"2026-08-03T21:10:07.937Z","selector":"#selMural","label":"Studio: Mural select - politics","action":"select-option:p","ok":true,"effect":"{\"before\":\"Oldest Signatures in HistoryDeclaration of IndependencePolit\",\"after\":\"Oldest Signatures in HistoryDeclaration of IndependencePolit\",\"sigCount\":54,\"orderSummary\":\"Politics & Statecraft · 8×30 ft custom · 54 signatures · $2,400\\n     Placement on a 32×16 ft wall: 1\"}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:08.854Z","game":"art","diff":"curator","cat":"All","selector":".choice","label":"round-1-pick-0","action":"click","ok":true,"effect":"Chose: \"Camille Pissarro\", reveal: \"✗ It was Henri de Toulouse-Lautrec · “Equestrienne (At the Cirque Fernando)”, 18\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:08.856Z","game":"art","diff":"curator","cat":"All","selector":"#reveal a","label":"round-1-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/16146","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:09.105Z","game":"art","diff":"curator","cat":"All","selector":"#nextBtn","label":"round-1-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:10:08.573Z","selector":"#murW","label":"Studio: Mural width - set 16","action":"set-value:16","ok":true,"effect":"{\"before\":\"30\",\"after\":\"16\",\"studioReadout\":\"From left wall: 8.0 ft\\n    From right wall: 8.0 ft\\n    Bottom off floor: 4.0 ft\\n    Mural: 8×16 ft · 128 sq ft\\n    Signatures shown: 54\\n    Price: $1,280\",\"sigCount\":54,\"orderSummary\":\"Politics & Statecraft · 8×16 ft custom · 54 signatures · $1,280\\n     Placement on a 32×16 ft wall: 8\"}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:09.511Z","game":"art","diff":"curator","cat":"All","selector":"#stage","label":"round-2-render","action":"inspect","ok":true,"effect":"stage_html_len=152, choices=4, imgs_ok=2, imgs_broken=0","errors":[]}
+{"run":3,"ts":"2026-08-03T21:10:09.205Z","selector":"#murW","label":"Studio: Mural width - set 40","action":"set-value:40","ok":true,"effect":"{\"before\":\"16\",\"after\":\"40\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 4.0 ft\\n    Mural: 8×40 ft · 320 sq ft\\n    Signatures shown: 54\\n    Price: $3,200\",\"sigCount\":54,\"orderSummary\":\"Politics & Statecraft · 8×40 ft custom · 54 signatures · $3,200\\n     Placement on a 32×16 ft wall: 0\"}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:09.964Z","game":"art","diff":"curator","cat":"All","selector":".choice","label":"round-2-pick-3","action":"click","ok":true,"effect":"Chose: \"Louis-Léopold Boilly\", reveal: \"✗ It was Ludwig Richter · “The Fountain at Grottaferrata”, 1832 → · their page →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:09.965Z","game":"art","diff":"curator","cat":"All","selector":"#reveal a","label":"round-2-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/209942","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:10.215Z","game":"art","diff":"curator","cat":"All","selector":"#nextBtn","label":"round-2-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:10:09.839Z","selector":"#wallW","label":"Studio: Wall width slider - 40","action":"set-slider:40","ok":true,"effect":"{\"before\":\"32\",\"after\":\"40\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 4.0 ft\\n    Mural: 8×40 ft · 320 sq ft\\n    Signatures shown: 54\\n    Price: $3,200\",\"sigCount\":null,\"orderSummary\":\"Politics & Statecraft · 8×40 ft custom · 54 signatures · $3,200\\n     Placement on a 40×16 ft wall: 0\"}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:10.621Z","game":"art","diff":"curator","cat":"All","selector":"#stage","label":"round-3-render","action":"inspect","ok":true,"effect":"stage_html_len=152, choices=4, imgs_ok=3, imgs_broken=0","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:11.063Z","game":"art","diff":"curator","cat":"All","selector":".choice","label":"round-3-pick-2","action":"click","ok":true,"effect":"Chose: \"Jean-Pierre Houël\", reveal: \"✗ It was William Morris Hunt · “The Fortune Teller”, 1857 → · their page →Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:11.065Z","game":"art","diff":"curator","cat":"All","selector":"#reveal a","label":"round-3-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/117786","errors":[]}
+{"run":3,"ts":"2026-08-03T21:10:10.464Z","selector":"#wallW","label":"Studio: Wall width slider - 60","action":"set-slider:60","ok":true,"effect":"{\"before\":\"40\",\"after\":\"60\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 20.0 ft\\n    Bottom off floor: 4.0 ft\\n    Mural: 8×40 ft · 320 sq ft\\n    Signatures shown: 54\\n    Price: $3,200\",\"sigCount\":null,\"orderSummary\":\"Politics & Statecraft · 8×40 ft custom · 54 signatures · $3,200\\n     Placement on a 60×16 ft wall: 0\"}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:11.328Z","game":"art","diff":"curator","cat":"All","selector":"#nextBtn","label":"round-3-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:11.736Z","game":"art","diff":"curator","cat":"All","selector":"#stage","label":"round-4-render","action":"inspect","ok":true,"effect":"stage_html_len=152, choices=4, imgs_ok=4, imgs_broken=0","errors":[]}
+{"run":3,"ts":"2026-08-03T21:10:11.091Z","selector":"#wallW","label":"Studio: Wall width slider - 24","action":"set-slider:24","ok":true,"effect":"{\"before\":\"60\",\"after\":\"24\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 4.0 ft\\n    Mural: 8×40 ft · 320 sq ft\\n    Signatures shown: 54\\n    Price: $3,200\",\"sigCount\":null,\"orderSummary\":\"Politics & Statecraft · 8×40 ft custom · 54 signatures · $3,200\\n     Placement on a 24×16 ft wall: 0\"}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:12.186Z","game":"art","diff":"curator","cat":"All","selector":".choice","label":"round-4-pick-0","action":"click","ok":true,"effect":"Chose: \"Jean-Pierre Dantan\", reveal: \"✓ Correct — Jean-Pierre Dantan · “Portrait Bust of Joseph-Louis-Hippolyte Bellan\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:12.187Z","game":"art","diff":"curator","cat":"All","selector":"#reveal a","label":"round-4-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/139895","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:12.437Z","game":"art","diff":"curator","cat":"All","selector":"#nextBtn","label":"round-4-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:10:11.738Z","selector":"#btnCenter","label":"Studio: Center on wall","action":"click","ok":true,"effect":"{\"before\":\"Center on wall\",\"after\":\"Center on wall\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 4.0 ft\\n    Mural: 8×40 ft · 320 sq ft\\n    Signatures shown: 54\\n    Price: $3,200\",\"sigCount\":null}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:12.844Z","game":"art","diff":"curator","cat":"All","selector":"#stage","label":"round-5-render","action":"inspect","ok":true,"effect":"stage_html_len=152, choices=4, imgs_ok=5, imgs_broken=0","errors":[]}
+{"run":3,"ts":"2026-08-03T21:10:12.551Z","selector":"#finderInput","label":"Finder: clear + type einstein","action":"clear+type:einstein","ok":true,"effect":"{\"before\":null,\"after\":\"einstein\",\"sigCount\":null}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:13.284Z","game":"art","diff":"curator","cat":"All","selector":".choice","label":"round-5-pick-3","action":"click","ok":true,"effect":"Chose: \"William Shakespeare Burton\", reveal: \"✗ It was Édouard de Beaumont · “The Couple”, n.d. → · their page →Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:13.285Z","game":"art","diff":"curator","cat":"All","selector":"#reveal a","label":"round-5-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/82029","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:13.536Z","game":"art","diff":"curator","cat":"All","selector":"#nextBtn","label":"round-5-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:10:13.191Z","selector":"#finderInput","label":"Finder: clear + type babe ruth","action":"clear+type:babe ruth","ok":true,"effect":"{\"before\":\"einstein\",\"after\":\"babe ruth\",\"sigCount\":null}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:13.942Z","game":"art","diff":"curator","cat":"All","selector":"#stage","label":"round-6-render","action":"inspect","ok":true,"effect":"stage_html_len=152, choices=4, imgs_ok=6, imgs_broken=0","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:14.381Z","game":"art","diff":"curator","cat":"All","selector":".choice","label":"round-6-pick-2","action":"click","ok":true,"effect":"Chose: \"Charles Joshua Chaplin\", reveal: \"✗ It was Benjamin Haydon · “Lord Gray”, n.d. → · their page →Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:14.382Z","game":"art","diff":"curator","cat":"All","selector":"#reveal a","label":"round-6-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/82943","errors":[]}
+{"run":3,"ts":"2026-08-03T21:10:13.827Z","selector":"#finderInput","label":"Finder: search input","action":"type:lincoln","ok":true,"effect":"{\"before\":\"babe ruth\",\"after\":\"lincoln\",\"sigCount\":null}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:14.632Z","game":"art","diff":"curator","cat":"All","selector":"#nextBtn","label":"round-6-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:15.038Z","game":"art","diff":"curator","cat":"All","selector":"#stage","label":"round-7-render","action":"inspect","ok":true,"effect":"stage_html_len=152, choices=4, imgs_ok=7, imgs_broken=0","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:15.478Z","game":"art","diff":"curator","cat":"All","selector":".choice","label":"round-7-pick-0","action":"click","ok":true,"effect":"Chose: \"Louis-Léopold Boilly\", reveal: \"✗ It was David d'Angers · “Mademoiselle Jubin”, 1829 → · their page →Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:15.478Z","game":"art","diff":"curator","cat":"All","selector":"#reveal a","label":"round-7-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/157221","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:15.729Z","game":"art","diff":"curator","cat":"All","selector":"#nextBtn","label":"round-7-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:16.134Z","game":"art","diff":"curator","cat":"All","selector":"#stage","label":"round-8-render","action":"inspect","ok":true,"effect":"stage_html_len=152, choices=4, imgs_ok=8, imgs_broken=0","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:16.576Z","game":"art","diff":"curator","cat":"All","selector":".choice","label":"round-8-pick-3","action":"click","ok":true,"effect":"Chose: \"Thomas Pollock Anshutz\", reveal: \"✗ It was John White Alexander · “Alexander Grant”, 1770 → · their page →Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:16.578Z","game":"art","diff":"curator","cat":"All","selector":"#reveal a","label":"round-8-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/93780","errors":[]}
+{"run":3,"ts":"2026-08-03T21:10:14.465Z","selector":"header nav a[href=\"/\"]","label":"Nav: Signature archive","action":"click-navigate","ok":true,"effect":"CLICKED_NAVIGATE_WENT_BACK","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:16.827Z","game":"art","diff":"curator","cat":"All","selector":"#nextBtn","label":"round-8-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:17.232Z","game":"art","diff":"curator","cat":"All","selector":"#stage","label":"round-9-render","action":"inspect","ok":true,"effect":"stage_html_len=152, choices=4, imgs_ok=9, imgs_broken=0","errors":[]}
+{"run":3,"ts":"2026-08-03T21:10:16.727Z","selector":"header nav a[href=\"#order\"]","label":"Nav: Order","action":"click","ok":true,"effect":"{\"before\":\"Order\",\"after\":\"Order\",\"sigCount\":null}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:17.674Z","game":"art","diff":"curator","cat":"All","selector":".choice","label":"round-9-pick-2","action":"click","ok":true,"effect":"Chose: \"William-Adolphe Bouguereau\", reveal: \"✗ It was Nadar · “Gustave Doré”, 1856-58 → · their page →Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:17.674Z","game":"art","diff":"curator","cat":"All","selector":"#reveal a","label":"round-9-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/50176","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:17.924Z","game":"art","diff":"curator","cat":"All","selector":"#nextBtn","label":"round-9-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:10:17.516Z","selector":"header nav a[href=\"#studio\"]","label":"Nav: Wall studio","action":"click","ok":true,"effect":"{\"before\":\"Wall studio\",\"after\":\"Wall studio\",\"sigCount\":null}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:18.330Z","game":"art","diff":"curator","cat":"All","selector":"#stage","label":"round-10-render","action":"inspect","ok":true,"effect":"stage_html_len=152, choices=4, imgs_ok=10, imgs_broken=0","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:18.769Z","game":"art","diff":"curator","cat":"All","selector":".choice","label":"round-10-pick-0","action":"click","ok":true,"effect":"Chose: \"Alphonse Mucha\", reveal: \"✓ Correct — Alphonse Mucha · “Zodiaque (\"La Plume\")”, 1896–97 → · their page →Se\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:18.770Z","game":"art","diff":"curator","cat":"All","selector":"#reveal a","label":"round-10-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/111986","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:19.023Z","game":"art","diff":"curator","cat":"All","selector":"#nextBtn","label":"round-10-next","action":"click","ok":true,"effect":"Next text: \"See results\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:10:18.294Z","selector":".m-card:nth-child(3) [data-place]","label":"Gallery card 3: Place on wall","action":"click","ok":true,"effect":"{\"before\":\"Place on wall →\",\"after\":\"Place on wall →\",\"sigCount\":null}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:19.427Z","game":"art","diff":"curator","cat":"All","selector":"#results","label":"results-screen","action":"inspect","ok":true,"effect":"score=20, verdict=\"Everyone starts somewhere.\", best=\"Best (art · curator): 20\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:19.881Z","game":"art","diff":"curator","cat":"All","selector":"#againBtn","label":"play-again","action":"click","ok":true,"effect":"Setup panel returned: true","errors":[]}
+{"run":3,"ts":"2026-08-03T21:10:19.076Z","selector":".m-card:nth-child(2) [data-place]","label":"Gallery card 2: Place on wall","action":"click","ok":true,"effect":"{\"before\":\"Place on wall →\",\"after\":\"Place on wall →\",\"sigCount\":null}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:20.958Z","game":"match","diff":"curator","cat":"All","selector":"#gamePick .gcard[data-g=\"match\"]","label":"game-card-match","action":"click","ok":true,"effect":"card selected","errors":["REQUEST_FAILED: POST https://www.google-analytics.com/g/collect?v=2&tid=G-2HEVP6TD0J&gtm=45je67v1v9260226174za200zd9260226174&_p=1785791405561&gcd=13l3l3l3l1l1&npa=0&dma=0&_eu=AAAAAAQ&are=1&cid=1264535497.1785791406&frm=0&ngs=1&pscdl=noapi&rcb=16&sr=1600x900&uaa=arm&uab=64&uafvl=HeadlessChrome%3B149.0.7827.55%7CChromium%3B149.0.7827.55%7CNot)A%253BBrand%3B24.0.0.0&uam=&uamb=0&uap=macOS&uapv=26.4.0&uaw=0&ul=en-us&_s=2&tag_exp=115938466~115938469~118897920~118897930~119896803~120222308&sid=1785791405&sct=1&seg=1&dl=http%3A%2F%2Flocalhost%2Fgame&dt=The%20Signature%20Games%20%E2%80%94%20Celebrity%20Signatures&en=user_engagement&_et=14279&tfd=14428 — net::ERR_ABORTED"]}
+{"run":2,"ts":"2026-08-03T21:10:20.962Z","game":"match","diff":"curator","cat":"All","selector":"#catLabel/#catOpts","label":"category-row-visibility","action":"inspect","ok":true,"effect":"catLabel=none, catOpts=none, expected_visible=false, actual=false","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:21.160Z","game":"match","diff":"curator","cat":"All","selector":"#diffOpts .opt[data-d=\"curator\"]","label":"diff-curator","action":"click","ok":true,"effect":"selected","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:21.203Z","game":"match","diff":"curator","cat":"All","selector":"#goBtn","label":"begin-button","action":"click","ok":true,"effect":"Begin clicked","errors":[]}
+{"run":3,"ts":"2026-08-03T21:10:20.706Z","selector":".m-card:nth-child(1) [data-place]","label":"Gallery card 1: Place on wall","action":"click","ok":true,"effect":"{\"before\":\"Place on wall →\",\"after\":\"Place on wall →\",\"sigCount\":null}","errors":[]}
+{"run":3,"ts":"2026-08-03T21:10:22.326Z","selector":".m-card:nth-child(3) .roster-trig","label":"Gallery card 3: Roster drawer open","action":"click","ok":true,"effect":"{\"before\":\"See who's on this wall ▾\",\"after\":\"Hide who's on this wall ▴\",\"sigCount\":null}","errors":[]}
+{"run":3,"ts":"2026-08-03T21:10:23.961Z","selector":".m-card:nth-child(2) .roster-trig","label":"Gallery card 2: Roster drawer open","action":"click","ok":true,"effect":"{\"before\":\"See who's on this wall ▾\",\"after\":\"Hide who's on this wall ▴\",\"sigCount\":null}","errors":[]}
+{"run":3,"ts":"2026-08-03T21:10:24.754Z","selector":".m-card:nth-child(1) .roster-trig","label":"Gallery card 1: Roster drawer open","action":"click","ok":true,"effect":"{\"before\":\"See who's on this wall ▾\",\"after\":\"Hide who's on this wall ▴\",\"sigCount\":null}","errors":[]}
+{"run":3,"ts":"2026-08-03T21:10:25.548Z","selector":".m-card:nth-child(3) .name-toggle","label":"Gallery card 3: Show names toggle","action":"click","ok":true,"effect":"{\"before\":\"Show names\",\"after\":\"Show names\",\"sigCount\":null}","errors":[]}
+{"run":3,"ts":"2026-08-03T21:10:26.330Z","selector":".m-card:nth-child(2) .name-toggle","label":"Gallery card 2: Show names toggle","action":"click","ok":true,"effect":"{\"before\":\"Show names\",\"after\":\"Show names\",\"sigCount\":null}","errors":[]}
+{"run":3,"ts":"2026-08-03T21:10:27.114Z","selector":".m-card:nth-child(1) .name-toggle","label":"Gallery card 1: Hide names toggle","action":"click","ok":true,"effect":"{\"before\":\"Show names\",\"after\":\"Show names\",\"sigCount\":null}","errors":[]}
+{"run":3,"ts":"2026-08-03T21:10:27.907Z","selector":".m-card:nth-child(1) .name-toggle","label":"Gallery card 1: Show names toggle","action":"click","ok":true,"effect":"{\"before\":\"Show names\",\"after\":\"Show names\",\"sigCount\":null}","errors":[]}
+{"run":3,"ts":"2026-08-03T21:10:28.686Z","selector":"#scenePresets button[data-scene=\"lounge\"]","label":"Scene preset: Lounge","action":"click","ok":true,"effect":"{\"before\":\"Lounge\",\"after\":\"Lounge\",\"sigCount\":null}","errors":[]}
+{"run":3,"ts":"2026-08-03T21:10:29.470Z","selector":"#scenePresets button[data-scene=\"gallery\"]","label":"Scene preset: Gallery","action":"click","ok":true,"effect":"{\"before\":\"Gallery\",\"after\":\"Gallery\",\"sigCount\":null}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:30.771Z","game":"match","diff":"curator","cat":"All","selector":"#play","label":"play-panel-appeared","action":"wait","ok":true,"effect":"play panel shown in 9610ms","errors":["REQUEST_FAILED: POST https://www.google-analytics.com/g/collect?v=2&tid=G-2HEVP6TD0J&gtm=45je67v1v9260226174za200zd9260226174&_p=1785791419889&gcd=13l3l3l3l1l1&npa=0&dma=0&_eu=AAAAAAQ&are=1&cid=1264535497.1785791406&frm=0&ngs=1&pscdl=noapi&rcb=10&sr=1600x900&uaa=arm&uab=64&uafvl=HeadlessChrome%3B149.0.7827.55%7CChromium%3B149.0.7827.55%7CNot)A%253BBrand%3B24.0.0.0&uam=&uamb=0&uap=macOS&uapv=26.4.0&uaw=0&ul=en-us&_s=1&tag_exp=115938465~115938469~118897920~118897930~119896803&sid=1785791405&sct=1&seg=1&dl=http%3A%2F%2Flocalhost%2Fgame&dt=The%20Signature%20Games%20%E2%80%94%20Celebrity%20Signatures&en=page_view&_ee=1&tfd=5021 — net::ERR_ABORTED"]}
+{"run":2,"ts":"2026-08-03T21:10:30.776Z","game":"match","diff":"curator","cat":"All","selector":"#stage","label":"round-1-render","action":"inspect","ok":true,"effect":"stage_html_len=132, choices=4, imgs_ok=1, imgs_broken=0","errors":[]}
+{"run":3,"ts":"2026-08-03T21:10:30.258Z","selector":"#scenePresets button[data-scene=\"plain\"]","label":"Scene preset: Plain","action":"click","ok":true,"effect":"{\"before\":\"Plain\",\"after\":\"Plain\",\"sigCount\":null}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:31.229Z","game":"match","diff":"curator","cat":"All","selector":".choice","label":"round-1-pick-0","action":"click","ok":true,"effect":"Chose: \"\", reveal: \"✗ Their piece was “Napkin Depicting The Five Senses” → by Walter CraneNext →\"","errors":["HTTP_403: https://www.artic.edu/iiif/2/726af50a-c850-b15f-5ea7-bf386cabdb03/full/600,/0/default.jpg","CONSOLE_ERR: Failed to load resource: the server responded with a status of 403 ()"]}
+{"run":2,"ts":"2026-08-03T21:10:31.230Z","game":"match","diff":"curator","cat":"All","selector":"#reveal a","label":"round-1-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/74703","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:31.480Z","game":"match","diff":"curator","cat":"All","selector":"#nextBtn","label":"round-1-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:10:31.052Z","selector":"input[name=\"name\"]","label":"Order: Name input","action":"type:John Test","ok":true,"effect":"{\"before\":null,\"after\":\"John Test\",\"sigCount\":null}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:31.889Z","game":"match","diff":"curator","cat":"All","selector":"#stage","label":"round-2-render","action":"inspect","ok":true,"effect":"stage_html_len=134, choices=4, imgs_ok=2, imgs_broken=0","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:32.329Z","game":"match","diff":"curator","cat":"All","selector":".choice","label":"round-2-pick-3","action":"click","ok":true,"effect":"Chose: \"\", reveal: \"✗ Their piece was “Eve” → by Jan van Kessel the ElderNext →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:32.331Z","game":"match","diff":"curator","cat":"All","selector":"#reveal a","label":"round-2-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/21668","errors":[]}
+{"run":3,"ts":"2026-08-03T21:10:31.741Z","selector":"input[name=\"email\"]","label":"Order: Email input","action":"type:test@example.com","ok":true,"effect":"{\"before\":null,\"after\":\"test@example.com\",\"sigCount\":null}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:32.577Z","game":"match","diff":"curator","cat":"All","selector":"#nextBtn","label":"round-2-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:32.982Z","game":"match","diff":"curator","cat":"All","selector":"#stage","label":"round-3-render","action":"inspect","ok":true,"effect":"stage_html_len=132, choices=4, imgs_ok=3, imgs_broken=0","errors":["HTTP_403: https://www.artic.edu/iiif/2/77d0cf9f-f656-95cc-a3d9-0bf3b2639af9/full/600,/0/default.jpg","CONSOLE_ERR: Failed to load resource: the server responded with a status of 403 ()"]}
+{"run":3,"ts":"2026-08-03T21:10:32.366Z","selector":"input[name=\"wall_w\"]","label":"Order: Wall width input","action":"set-value:24","ok":true,"effect":"{\"before\":\"32\",\"after\":\"24\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 4.0 ft\\n    Mural: 8×40 ft · 320 sq ft\\n    Signatures shown: 18\\n    Price: $3,200\",\"sigCount\":null,\"orderSummary\":\"Oldest Signatures in History · 8×40 ft custom · 18 signatures · $3,200\\n     Placement on a 24×16 ft \"}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:33.437Z","game":"match","diff":"curator","cat":"All","selector":".choice","label":"round-3-pick-2","action":"click","ok":true,"effect":"Chose: \"\", reveal: \"✓ Correct — “Sir Lancelot Approaching the Castle of Astolat” → by Gustave DoréNe\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:33.437Z","game":"match","diff":"curator","cat":"All","selector":"#reveal a","label":"round-3-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/43672","errors":[]}
+{"run":3,"ts":"2026-08-03T21:10:33.006Z","selector":"input[name=\"wall_h\"]","label":"Order: Wall height input","action":"set-value:12","ok":true,"effect":"{\"before\":\"14\",\"after\":\"12\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 4.0 ft\\n    Mural: 8×40 ft · 320 sq ft\\n    Signatures shown: 18\\n    Price: $3,200\",\"sigCount\":null,\"orderSummary\":\"Oldest Signatures in History · 8×40 ft custom · 18 signatures · $3,200\\n     Placement on a 24×16 ft \"}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:33.689Z","game":"match","diff":"curator","cat":"All","selector":"#nextBtn","label":"round-3-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:34.094Z","game":"match","diff":"curator","cat":"All","selector":"https://upload.wikimedia.org/wikipedia/commons/4/47/Max_Rosenthal_signature.tiff","label":"round-4-image","action":"inspect","ok":false,"effect":"Image broken/404: https://upload.wikimedia.org/wikipedia/commons/4/47/Max_Rosenthal_signature.tiff","errors":["REQUEST_FAILED: GET https://upload.wikimedia.org/wikipedia/commons/4/47/Max_Rosenthal_signature.tiff — net::ERR_BLOCKED_BY_ORB","HTTP_403: https://www.artic.edu/iiif/2/b1fc0292-ac96-8755-325d-461f42e2357a/full/600,/0/default.jpg","CONSOLE_ERR: Failed to load resource: the server responded with a status of 403 ()","Image 404 or broken: https://upload.wikimedia.org/wikipedia/commons/4/47/Max_Rosenthal_signature.tiff"]}
+{"run":2,"ts":"2026-08-03T21:10:34.094Z","game":"match","diff":"curator","cat":"All","selector":"#stage","label":"round-4-render","action":"inspect","ok":true,"effect":"stage_html_len=134, choices=4, imgs_ok=3, imgs_broken=1","errors":[]}
+{"run":3,"ts":"2026-08-03T21:10:33.631Z","selector":"textarea[name=\"notes\"]","label":"Order: Notes textarea","action":"type:Test order for master bedroom. Target install October.","ok":true,"effect":"{\"before\":null,\"after\":\"Test order for master bedroom. Target install October.\",\"sigCount\":null}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:34.534Z","game":"match","diff":"curator","cat":"All","selector":".choice","label":"round-4-pick-0","action":"click","ok":true,"effect":"Chose: \"\", reveal: \"✗ Their piece was “Colonel John St. Clair Bart” → by Max RosenthalNext →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:34.535Z","game":"match","diff":"curator","cat":"All","selector":"#reveal a","label":"round-4-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/274489","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:34.786Z","game":"match","diff":"curator","cat":"All","selector":"#nextBtn","label":"round-4-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:10:34.253Z","selector":"#orderForm button[type=\"submit\"]","label":"Order: Submit form","action":"click","ok":true,"effect":"{\"before\":\"Request this mural\",\"after\":\"Request this mural\",\"sigCount\":null}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:35.192Z","game":"match","diff":"curator","cat":"All","selector":"#stage","label":"round-5-render","action":"inspect","ok":true,"effect":"stage_html_len=137, choices=4, imgs_ok=4, imgs_broken=1","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:35.647Z","game":"match","diff":"curator","cat":"All","selector":".choice","label":"round-5-pick-3","action":"click","ok":true,"effect":"Chose: \"\", reveal: \"✗ Their piece was “Art of Engraving, from Encyclopédie” → by André BretonNext →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:35.649Z","game":"match","diff":"curator","cat":"All","selector":"#reveal a","label":"round-5-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/40842","errors":[]}
+{"run":3,"ts":"2026-08-03T21:10:35.031Z","selector":"#scenePresets button[data-scene=\"study\"]","label":"Scene preset: Study","action":"click","ok":true,"effect":"{\"before\":\"Study\",\"after\":\"Study\",\"sigCount\":null}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:35.897Z","game":"match","diff":"curator","cat":"All","selector":"#nextBtn","label":"round-5-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:36.302Z","game":"match","diff":"curator","cat":"All","selector":"#stage","label":"round-6-render","action":"inspect","ok":true,"effect":"stage_html_len=128, choices=4, imgs_ok=5, imgs_broken=1","errors":[]}
+{"run":3,"ts":"2026-08-03T21:10:35.812Z","selector":".m-card:nth-child(1) .r-search","label":"Roster card 1: filter \"wash\"","action":"type:wash","ok":true,"effect":"{\"before\":null,\"after\":\"wash\",\"sigCount\":null}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:36.744Z","game":"match","diff":"curator","cat":"All","selector":".choice","label":"round-6-pick-2","action":"click","ok":true,"effect":"Chose: \"\", reveal: \"✗ Their piece was “Two Putti with Lamb” → by Leonardo da VinciNext →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:36.744Z","game":"match","diff":"curator","cat":"All","selector":"#reveal a","label":"round-6-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/95701","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:36.994Z","game":"match","diff":"curator","cat":"All","selector":"#nextBtn","label":"round-6-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:37.401Z","game":"match","diff":"curator","cat":"All","selector":"#stage","label":"round-7-render","action":"inspect","ok":true,"effect":"stage_html_len=127, choices=4, imgs_ok=6, imgs_broken=1","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:37.841Z","game":"match","diff":"curator","cat":"All","selector":".choice","label":"round-7-pick-0","action":"click","ok":true,"effect":"Chose: \"\", reveal: \"✗ Their piece was “Jules Janin” → by BertallSee results\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:37.842Z","game":"match","diff":"curator","cat":"All","selector":"#reveal a","label":"round-7-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/144525","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:38.092Z","game":"match","diff":"curator","cat":"All","selector":"#nextBtn","label":"round-7-next","action":"click","ok":true,"effect":"Next text: \"See results\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:38.500Z","game":"match","diff":"curator","cat":"All","selector":"#results","label":"results-screen","action":"inspect","ok":true,"effect":"score=10, verdict=\"Everyone starts somewhere.\", best=\"Best (match · curator): 10\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:38.954Z","game":"match","diff":"curator","cat":"All","selector":"#againBtn","label":"play-again","action":"click","ok":true,"effect":"Setup panel returned: true","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:40.030Z","game":"lightning","diff":"curator","cat":"All","selector":"#gamePick .gcard[data-g=\"lightning\"]","label":"game-card-lightning","action":"click","ok":true,"effect":"card selected","errors":["REQUEST_FAILED: POST https://www.google-analytics.com/g/collect?v=2&tid=G-2HEVP6TD0J&gtm=45je67v1v9260226174za200zd9260226174&_p=1785791419889&gcd=13l3l3l3l1l1&npa=0&dma=0&_eu=AAAAAAQ&are=1&cid=1264535497.1785791406&frm=0&ngs=1&pscdl=noapi&rcb=10&sr=1600x900&uaa=arm&uab=64&uafvl=HeadlessChrome%3B149.0.7827.55%7CChromium%3B149.0.7827.55%7CNot)A%253BBrand%3B24.0.0.0&uam=&uamb=0&uap=macOS&uapv=26.4.0&uaw=0&ul=en-us&_s=2&tag_exp=115938465~115938469~118897920~118897930~119896803&sid=1785791405&sct=1&seg=1&dl=http%3A%2F%2Flocalhost%2Fgame&dt=The%20Signature%20Games%20%E2%80%94%20Celebrity%20Signatures&en=user_engagement&_et=19057&tfd=19081 — net::ERR_ABORTED"]}
+{"run":2,"ts":"2026-08-03T21:10:40.034Z","game":"lightning","diff":"curator","cat":"All","selector":"#catLabel/#catOpts","label":"category-row-visibility","action":"inspect","ok":true,"effect":"catLabel=none, catOpts=none, expected_visible=false, actual=false","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:40.231Z","game":"lightning","diff":"curator","cat":"All","selector":"#diffOpts .opt[data-d=\"curator\"]","label":"diff-curator","action":"click","ok":true,"effect":"selected","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:40.273Z","game":"lightning","diff":"curator","cat":"All","selector":"#goBtn","label":"begin-button","action":"click","ok":true,"effect":"Begin clicked","errors":[]}
+{"run":3,"ts":"2026-08-03T21:10:36.838Z","selector":".m-card:nth-child(1) .r-item:first-child","label":"Roster card 1: click roster item → provenance modal","action":"click","ok":false,"effect":"ACTION_FAILED","errors":["Error: locator.click: Element is not visible\nCall log:\n\u001b[2m  - waiting for locator('.m-card:nth-child(1) .r-item:first-child').first()\u001b[22m\n\u001b[2m    - locator resolved to <button type=\"button\" class=\"r-item\" data-sig=\"Oldest Signatures|1\">…</button>\u001b[22m\n\u001b[2m  - attempting click action\u001b[22m\n\u001b[2m    - scrolling into view if needed\u001b[22m\n"]}
+{"run":2,"ts":"2026-08-03T21:10:42.285Z","game":"lightning","diff":"curator","cat":"All","selector":"#play","label":"play-panel-appeared","action":"wait","ok":true,"effect":"play panel shown in 2054ms","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:42.291Z","game":"lightning","diff":"curator","cat":"All","selector":"#timerbar","label":"round-1-timer","action":"inspect","ok":true,"effect":"Timer bar visible, fill class: tb-fill run","errors":[]}
+{"run":3,"ts":"2026-08-03T21:10:42.499Z","selector":"#provModal","label":"Provenance modal: opened?","action":"observe","ok":false,"effect":"MODAL_NOT_OPEN","errors":[]}
+{"run":3,"ts":"2026-08-03T21:10:43.002Z","selector":".m-card:nth-child(2) .r-search","label":"Roster card 2: filter \"hancock\"","action":"type:hancock","ok":true,"effect":"{\"before\":null,\"after\":\"hancock\",\"sigCount\":null}","errors":[]}
+{"run":3,"ts":"2026-08-03T21:10:44.535Z","selector":"#muralEl","label":"Studio: Drag mural","action":"drag","ok":true,"effect":"{\"before\":{\"left\":\"0px\",\"top\":\"108px\"},\"after\":{\"left\":\"0px\",\"top\":\"0px\"},\"readout\":\"From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 4.0 ft\\n    Mural: 8×40 ft · 320 sq ft\\n    Signatures shown: 18\\n    Price: $3,\",\"moved\":true}","errors":[]}
+{"run":3,"ts":"2026-08-03T21:10:46.169Z","selector":".m-card:nth-child(1) img","label":"Gallery card 1: collage image load","action":"observe","ok":true,"effect":"{\"src\":\"http://localhost:9920/output/collage-oldest-signatures.png\",\"complete\":true,\"naturalW\":1570}","errors":[]}
+{"run":3,"ts":"2026-08-03T21:10:46.170Z","selector":"#readout","label":"Studio: readout check (price + sig count)","action":"observe","ok":true,"effect":"{\"text\":\"\\n    From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 4.0 ft\\n    Mural: 8×40 ft · 320 sq ft\\n    Signatures shown: 18\\n    Price: $3,200\",\"price\":\"Price: $3,200\",\"sigs\":\"Signatures shown: 18\",\"sqft\":\"320 sq ft\"}","errors":[]}
+{"run":3,"ts":"2026-08-03T21:10:46.170Z","selector":"#orderSummary","label":"Order: summary synced with studio","action":"observe","ok":true,"effect":"Oldest Signatures in History · 8×40 ft custom · 18 signatures · $3,200\n     Placement on a 24×16 ft wall: 0.0 ft from left, 4.0 ft off floor.","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:47.794Z","game":"lightning","diff":"curator","cat":"All","selector":"#reveal","label":"round-1-timer-out","action":"wait","ok":true,"effect":"Reveal after timeout: \"⏱ Time! Artist: Amand GautierNext →\"","errors":["REQUEST_FAILED: POST https://www.google-analytics.com/g/collect?v=2&tid=G-2HEVP6TD0J&gtm=45je67v1v9260226174za200zd9260226174&_p=1785791438967&gcd=13l3l3l3l1l1&npa=0&dma=0&_eu=AAAAAAQ&are=1&cid=1264535497.1785791406&frm=0&ngs=1&pscdl=noapi&rcb=19&sr=1600x900&uaa=arm&uab=64&uafvl=HeadlessChrome%3B149.0.7827.55%7CChromium%3B149.0.7827.55%7CNot)A%253BBrand%3B24.0.0.0&uam=&uamb=0&uap=macOS&uapv=26.4.0&uaw=0&ul=en-us&_s=1&tag_exp=115938466~115938468~118897920~118897930~119896803&sid=1785791405&sct=1&seg=1&dl=http%3A%2F%2Flocalhost%2Fgame&dt=The%20Signature%20Games%20%E2%80%94%20Celebrity%20Signatures&en=page_view&_ee=1&tfd=5023 — net::ERR_ABORTED"]}
+{"run":2,"ts":"2026-08-03T21:10:47.796Z","game":"lightning","diff":"curator","cat":"All","selector":".choice","label":"round-1-choices-disabled","action":"inspect","ok":true,"effect":"Choices disabled after timeout: true","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:47.796Z","game":"lightning","diff":"curator","cat":"All","selector":"#stage","label":"round-1-render","action":"inspect","ok":true,"effect":"stage_html_len=193, choices=4, imgs_ok=1, imgs_broken=0","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:48.120Z","game":"lightning","diff":"curator","cat":"All","selector":"#timerbar","label":"round-2-timer","action":"inspect","ok":true,"effect":"Timer bar visible, fill class: tb-fill run","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:48.121Z","game":"lightning","diff":"curator","cat":"All","selector":"#stage","label":"round-2-render","action":"inspect","ok":true,"effect":"stage_html_len=195, choices=4, imgs_ok=2, imgs_broken=0","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:48.577Z","game":"lightning","diff":"curator","cat":"All","selector":".choice","label":"round-2-pick-3","action":"click","ok":true,"effect":"Chose: \"La Pensée\", reveal: \"✗ Painting: Jeanne Bécu, Comtesse Du Barry, and her servant Zamor · see it →Next\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:48.578Z","game":"lightning","diff":"curator","cat":"All","selector":"#reveal a","label":"round-2-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/61073","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:48.830Z","game":"lightning","diff":"curator","cat":"All","selector":"#nextBtn","label":"round-2-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:49.237Z","game":"lightning","diff":"curator","cat":"All","selector":"#timerbar","label":"round-3-timer","action":"inspect","ok":true,"effect":"Timer bar visible, fill class: tb-fill run","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:49.237Z","game":"lightning","diff":"curator","cat":"All","selector":"#stage","label":"round-3-render","action":"inspect","ok":true,"effect":"stage_html_len=193, choices=4, imgs_ok=3, imgs_broken=0","errors":[]}
+{"run":2,"ts":"2026-08-03T21:10:49.688Z","game":"lightning","diff":"curator","cat":"All","selector":".choice","label":"round-3-pick-2","action":"click","ok":true,"effect":"Chose: \"John Thompson\", reveal: \"✓ Artist: John ThompsonNext →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:10:50.564Z","selector":"page","label":"PAGE LOAD","action":"goto","ok":true,"effect":"{\"title\":\"Celebrity Signature Murals — made to order\",\"muralCards\":33,\"sigsLoaded\":true}","errors":[]}
+{"run":4,"ts":"2026-08-03T21:10:50.565Z","selector":".m-card:nth-child(1) .name-toggle","label":"Gallery card 1: Show names toggle","action":"click","ok":true,"effect":"{\"before\":\"Show names\",\"after\":\"Show names\",\"sigCount\":null}","errors":[]}
+{"run":4,"ts":"2026-08-03T21:10:51.388Z","selector":".m-card:nth-child(1) .name-toggle","label":"Gallery card 1: Hide names toggle","action":"click","ok":true,"effect":"{\"before\":\"Show names\",\"after\":\"Show names\",\"sigCount\":null}","errors":[]}
+{"run":4,"ts":"2026-08-03T21:10:52.169Z","selector":".m-card:nth-child(2) .name-toggle","label":"Gallery card 2: Show names toggle","action":"click","ok":true,"effect":"{\"before\":\"Show names\",\"after\":\"Show names\",\"sigCount\":null}","errors":[]}
+{"run":4,"ts":"2026-08-03T21:10:52.949Z","selector":".m-card:nth-child(3) .name-toggle","label":"Gallery card 3: Show names toggle","action":"click","ok":true,"effect":"{\"before\":\"Show names\",\"after\":\"Show names\",\"sigCount\":null}","errors":[]}
+{"run":4,"ts":"2026-08-03T21:10:53.726Z","selector":"header nav a[href=\"#studio\"]","label":"Nav: Wall studio","action":"click","ok":true,"effect":"{\"before\":\"Wall studio\",\"after\":\"Wall studio\",\"sigCount\":null}","errors":[]}
+{"run":4,"ts":"2026-08-03T21:10:54.506Z","selector":"header nav a[href=\"#order\"]","label":"Nav: Order","action":"click","ok":true,"effect":"{\"before\":\"Order\",\"after\":\"Order\",\"sigCount\":null}","errors":[]}
+{"run":4,"ts":"2026-08-03T21:10:55.280Z","selector":"#finderInput","label":"Finder: search input","action":"type:lincoln","ok":true,"effect":"{\"before\":null,\"after\":\"lincoln\",\"sigCount\":null}","errors":[]}
+{"run":4,"ts":"2026-08-03T21:10:55.913Z","selector":"#finderInput","label":"Finder: clear + type babe ruth","action":"clear+type:babe ruth","ok":true,"effect":"{\"before\":\"lincoln\",\"after\":\"babe ruth\",\"sigCount\":null}","errors":[]}
+{"run":4,"ts":"2026-08-03T21:10:56.552Z","selector":"#finderInput","label":"Finder: clear + type einstein","action":"clear+type:einstein","ok":true,"effect":"{\"before\":\"babe ruth\",\"after\":\"einstein\",\"sigCount\":null}","errors":[]}
+{"run":4,"ts":"2026-08-03T21:10:57.194Z","selector":"#selMural","label":"Studio: Mural select - declaration","action":"select-option:d","ok":true,"effect":"{\"before\":\"Oldest Signatures in HistoryDeclaration of IndependencePolit\",\"after\":\"Oldest Signatures in HistoryDeclaration of IndependencePolit\",\"sigCount\":56,\"orderSummary\":\"Declaration of Independence · 12×24 ft custom · 56 signatures · $2,880\\n     Placement on a 32×14 ft \"}","errors":[]}
+{"run":4,"ts":"2026-08-03T21:10:57.825Z","selector":"#selMural","label":"Studio: Mural select - politics","action":"select-option:p","ok":true,"effect":"{\"before\":\"Oldest Signatures in HistoryDeclaration of IndependencePolit\",\"after\":\"Oldest Signatures in HistoryDeclaration of IndependencePolit\",\"sigCount\":54,\"orderSummary\":\"Politics & Statecraft · 12×24 ft custom · 54 signatures · $2,880\\n     Placement on a 32×14 ft wall: \"}","errors":[]}
+{"run":4,"ts":"2026-08-03T21:10:58.452Z","selector":"#selMural","label":"Studio: Mural select - composers","action":"select-option:co","ok":true,"effect":"{\"before\":\"Oldest Signatures in HistoryDeclaration of IndependencePolit\",\"after\":\"Oldest Signatures in HistoryDeclaration of IndependencePolit\",\"sigCount\":3,\"orderSummary\":\"Great Composers · 12×24 ft custom · 3 signatures · $2,880\\n     Placement on a 32×14 ft wall: 4.0 ft \"}","errors":[]}
+{"run":4,"ts":"2026-08-03T21:10:59.074Z","selector":"#murW","label":"Studio: Mural width - set 30","action":"set-value:30","ok":true,"effect":"{\"before\":\"24\",\"after\":\"30\",\"studioReadout\":\"From left wall: 1.0 ft\\n    From right wall: 1.0 ft\\n    Bottom off floor: 1.0 ft\\n    Mural: 12×30 ft · 360 sq ft\\n    Signatures shown: 3\\n    Price: $3,600\",\"sigCount\":3,\"orderSummary\":\"Great Composers · 12×30 ft custom · 3 signatures · $3,600\\n     Placement on a 32×14 ft wall: 1.0 ft \"}","errors":[]}
+{"run":4,"ts":"2026-08-03T21:10:59.704Z","selector":"#murH","label":"Studio: Mural height - set 10","action":"set-value:10","ok":true,"effect":"{\"before\":\"12\",\"after\":\"10\",\"studioReadout\":\"From left wall: 1.0 ft\\n    From right wall: 1.0 ft\\n    Bottom off floor: 2.0 ft\\n    Mural: 10×30 ft · 300 sq ft\\n    Signatures shown: 3\\n    Price: $3,000\",\"sigCount\":3,\"orderSummary\":\"Great Composers · 10×30 ft custom · 3 signatures · $3,000\\n     Placement on a 32×14 ft wall: 1.0 ft \"}","errors":[]}
+{"run":4,"ts":"2026-08-03T21:11:00.328Z","selector":"#murW","label":"Studio: Mural width - set 16","action":"set-value:16","ok":true,"effect":"{\"before\":\"30\",\"after\":\"16\",\"studioReadout\":\"From left wall: 8.0 ft\\n    From right wall: 8.0 ft\\n    Bottom off floor: 2.0 ft\\n    Mural: 10×16 ft · 160 sq ft\\n    Signatures shown: 3\\n    Price: $1,600\",\"sigCount\":3,\"orderSummary\":\"Great Composers · 10×16 ft custom · 3 signatures · $1,600\\n     Placement on a 32×14 ft wall: 8.0 ft \"}","errors":[]}
+{"run":4,"ts":"2026-08-03T21:11:00.967Z","selector":"#murH","label":"Studio: Mural height - set 8","action":"set-value:8","ok":true,"effect":"{\"before\":\"10\",\"after\":\"8\",\"studioReadout\":\"From left wall: 8.0 ft\\n    From right wall: 8.0 ft\\n    Bottom off floor: 3.0 ft\\n    Mural: 8×16 ft · 128 sq ft\\n    Signatures shown: 3\\n    Price: $1,280\",\"sigCount\":3,\"orderSummary\":\"Great Composers · 8×16 ft custom · 3 signatures · $1,280\\n     Placement on a 32×14 ft wall: 8.0 ft f\"}","errors":[]}
+{"run":4,"ts":"2026-08-03T21:11:01.609Z","selector":"#murW","label":"Studio: Mural width - set 40","action":"set-value:40","ok":true,"effect":"{\"before\":\"16\",\"after\":\"40\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 3.0 ft\\n    Mural: 8×40 ft · 320 sq ft\\n    Signatures shown: 3\\n    Price: $3,200\",\"sigCount\":3,\"orderSummary\":\"Great Composers · 8×40 ft custom · 3 signatures · $3,200\\n     Placement on a 32×14 ft wall: 0.0 ft f\"}","errors":[]}
+{"run":4,"ts":"2026-08-03T21:11:02.246Z","selector":"#murH","label":"Studio: Mural height - set 16","action":"set-value:16","ok":true,"effect":"{\"before\":\"8\",\"after\":\"16\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 16×40 ft · 640 sq ft\\n    Signatures shown: 3\\n    Price: $6,400\",\"sigCount\":3,\"orderSummary\":\"Great Composers · 16×40 ft custom · 3 signatures · $6,400\\n     Placement on a 32×14 ft wall: 0.0 ft \"}","errors":[]}
+{"run":4,"ts":"2026-08-03T21:11:02.885Z","selector":"#wallW","label":"Studio: Wall width slider - 40","action":"set-slider:40","ok":true,"effect":"{\"before\":\"32\",\"after\":\"40\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 16×40 ft · 640 sq ft\\n    Signatures shown: 3\\n    Price: $6,400\",\"sigCount\":null,\"orderSummary\":\"Great Composers · 16×40 ft custom · 3 signatures · $6,400\\n     Placement on a 40×14 ft wall: 0.0 ft \"}","errors":[]}
+{"run":4,"ts":"2026-08-03T21:11:03.521Z","selector":"#wallH","label":"Studio: Wall height slider - 16","action":"set-slider:16","ok":true,"effect":"{\"before\":\"14\",\"after\":\"16\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 16×40 ft · 640 sq ft\\n    Signatures shown: 3\\n    Price: $6,400\",\"sigCount\":null,\"orderSummary\":\"Great Composers · 16×40 ft custom · 3 signatures · $6,400\\n     Placement on a 40×16 ft wall: 0.0 ft \"}","errors":[]}
+{"run":4,"ts":"2026-08-03T21:11:04.148Z","selector":"#wallW","label":"Studio: Wall width slider - 60","action":"set-slider:60","ok":true,"effect":"{\"before\":\"40\",\"after\":\"60\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 20.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 16×40 ft · 640 sq ft\\n    Signatures shown: 3\\n    Price: $6,400\",\"sigCount\":null,\"orderSummary\":\"Great Composers · 16×40 ft custom · 3 signatures · $6,400\\n     Placement on a 60×16 ft wall: 0.0 ft \"}","errors":[]}
+{"run":4,"ts":"2026-08-03T21:11:04.791Z","selector":"#wallH","label":"Studio: Wall height slider - 20","action":"set-slider:20","ok":true,"effect":"{\"before\":\"16\",\"after\":\"20\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 20.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 16×40 ft · 640 sq ft\\n    Signatures shown: 3\\n    Price: $6,400\",\"sigCount\":null,\"orderSummary\":\"Great Composers · 16×40 ft custom · 3 signatures · $6,400\\n     Placement on a 60×20 ft wall: 0.0 ft \"}","errors":[]}
+{"run":4,"ts":"2026-08-03T21:11:05.428Z","selector":"#wallW","label":"Studio: Wall width slider - 24","action":"set-slider:24","ok":true,"effect":"{\"before\":\"60\",\"after\":\"24\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 16×40 ft · 640 sq ft\\n    Signatures shown: 3\\n    Price: $6,400\",\"sigCount\":null,\"orderSummary\":\"Great Composers · 16×40 ft custom · 3 signatures · $6,400\\n     Placement on a 24×20 ft wall: 0.0 ft \"}","errors":[]}
+{"run":4,"ts":"2026-08-03T21:11:06.074Z","selector":"#wallH","label":"Studio: Wall height slider - 12","action":"set-slider:12","ok":true,"effect":"{\"before\":\"20\",\"after\":\"12\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 16×40 ft · 640 sq ft\\n    Signatures shown: 3\\n    Price: $6,400\",\"sigCount\":null,\"orderSummary\":\"Great Composers · 16×40 ft custom · 3 signatures · $6,400\\n     Placement on a 24×12 ft wall: 0.0 ft \"}","errors":[]}
+{"run":4,"ts":"2026-08-03T21:11:06.706Z","selector":"#btnCenter","label":"Studio: Center on wall","action":"click","ok":true,"effect":"{\"before\":\"Center on wall\",\"after\":\"Center on wall\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 16×40 ft · 640 sq ft\\n    Signatures shown: 3\\n    Price: $6,400\",\"sigCount\":null}","errors":[]}
+{"run":4,"ts":"2026-08-03T21:11:07.499Z","selector":"#scenePresets button[data-scene=\"study\"]","label":"Scene preset: Study","action":"click","ok":true,"effect":"{\"before\":\"Study\",\"after\":\"Study\",\"sigCount\":null}","errors":[]}
+{"run":4,"ts":"2026-08-03T21:11:08.291Z","selector":"#scenePresets button[data-scene=\"lounge\"]","label":"Scene preset: Lounge","action":"click","ok":true,"effect":"{\"before\":\"Lounge\",\"after\":\"Lounge\",\"sigCount\":null}","errors":[]}
+{"run":4,"ts":"2026-08-03T21:11:09.083Z","selector":"#scenePresets button[data-scene=\"gallery\"]","label":"Scene preset: Gallery","action":"click","ok":true,"effect":"{\"before\":\"Gallery\",\"after\":\"Gallery\",\"sigCount\":null}","errors":[]}
+{"run":4,"ts":"2026-08-03T21:11:09.867Z","selector":"#scenePresets button[data-scene=\"plain\"]","label":"Scene preset: Plain","action":"click","ok":true,"effect":"{\"before\":\"Plain\",\"after\":\"Plain\",\"sigCount\":null}","errors":[]}
+{"run":4,"ts":"2026-08-03T21:11:10.646Z","selector":"input[name=\"name\"]","label":"Order: Name input","action":"type:John Test","ok":true,"effect":"{\"before\":null,\"after\":\"John Test\",\"sigCount\":null}","errors":[]}
+{"run":4,"ts":"2026-08-03T21:11:11.269Z","selector":"input[name=\"email\"]","label":"Order: Email input","action":"type:test@example.com","ok":true,"effect":"{\"before\":null,\"after\":\"test@example.com\",\"sigCount\":null}","errors":[]}
+{"run":4,"ts":"2026-08-03T21:11:11.896Z","selector":"input[name=\"wall_w\"]","label":"Order: Wall width input","action":"set-value:24","ok":true,"effect":"{\"before\":\"32\",\"after\":\"24\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 16×40 ft · 640 sq ft\\n    Signatures shown: 3\\n    Price: $6,400\",\"sigCount\":null,\"orderSummary\":\"Great Composers · 16×40 ft custom · 3 signatures · $6,400\\n     Placement on a 24×12 ft wall: 0.0 ft \"}","errors":[]}
+{"run":4,"ts":"2026-08-03T21:11:12.525Z","selector":"input[name=\"wall_h\"]","label":"Order: Wall height input","action":"set-value:12","ok":true,"effect":"{\"before\":\"14\",\"after\":\"12\",\"studioReadout\":\"From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 16×40 ft · 640 sq ft\\n    Signatures shown: 3\\n    Price: $6,400\",\"sigCount\":null,\"orderSummary\":\"Great Composers · 16×40 ft custom · 3 signatures · $6,400\\n     Placement on a 24×12 ft wall: 0.0 ft \"}","errors":[]}
+{"run":4,"ts":"2026-08-03T21:11:13.158Z","selector":"textarea[name=\"notes\"]","label":"Order: Notes textarea","action":"type:Test order for master bedroom. Target install October.","ok":true,"effect":"{\"before\":null,\"after\":\"Test order for master bedroom. Target install October.\",\"sigCount\":null}","errors":[]}
+{"run":4,"ts":"2026-08-03T21:11:13.785Z","selector":"#orderForm button[type=\"submit\"]","label":"Order: Submit form","action":"click","ok":true,"effect":"{\"before\":\"Request this mural\",\"after\":\"Request this mural\",\"sigCount\":null}","errors":[]}
+{"run":4,"ts":"2026-08-03T21:11:14.561Z","selector":".m-card:nth-child(1) .roster-trig","label":"Gallery card 1: Roster drawer open","action":"click","ok":true,"effect":"{\"before\":\"See who's on this wall ▾\",\"after\":\"Hide who's on this wall ▴\",\"sigCount\":null}","errors":[]}
+{"run":4,"ts":"2026-08-03T21:11:15.341Z","selector":".m-card:nth-child(2) .roster-trig","label":"Gallery card 2: Roster drawer open","action":"click","ok":true,"effect":"{\"before\":\"See who's on this wall ▾\",\"after\":\"Hide who's on this wall ▴\",\"sigCount\":null}","errors":[]}
+{"run":4,"ts":"2026-08-03T21:11:16.134Z","selector":".m-card:nth-child(3) .roster-trig","label":"Gallery card 3: Roster drawer open","action":"click","ok":true,"effect":"{\"before\":\"See who's on this wall ▾\",\"after\":\"Hide who's on this wall ▴\",\"sigCount\":null}","errors":[]}
+{"run":4,"ts":"2026-08-03T21:11:16.928Z","selector":".m-card:nth-child(1) [data-place]","label":"Gallery card 1: Place on wall","action":"click","ok":true,"effect":"{\"before\":\"Place on wall →\",\"after\":\"Place on wall →\",\"sigCount\":null}","errors":[]}
+{"run":4,"ts":"2026-08-03T21:11:17.727Z","selector":".m-card:nth-child(2) [data-place]","label":"Gallery card 2: Place on wall","action":"click","ok":true,"effect":"{\"before\":\"Place on wall →\",\"after\":\"Place on wall →\",\"sigCount\":null}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:11:19.690Z","game":"lightning","diff":"curator","cat":"All","selector":"#reveal a","label":"round-3-reveal-link","action":"inspect","ok":false,"effect":"No reveal link found after pick","errors":["Missing reveal link in lightning round 3"]}
+{"run":2,"ts":"2026-08-03T21:11:19.941Z","game":"lightning","diff":"curator","cat":"All","selector":"#nextBtn","label":"round-3-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:11:20.349Z","game":"lightning","diff":"curator","cat":"All","selector":"#timerbar","label":"round-4-timer","action":"inspect","ok":true,"effect":"Timer bar visible, fill class: tb-fill run","errors":[]}
+{"run":2,"ts":"2026-08-03T21:11:20.349Z","game":"lightning","diff":"curator","cat":"All","selector":"#stage","label":"round-4-render","action":"inspect","ok":true,"effect":"stage_html_len=195, choices=4, imgs_ok=4, imgs_broken=0","errors":[]}
+{"run":2,"ts":"2026-08-03T21:11:20.801Z","game":"lightning","diff":"curator","cat":"All","selector":".choice","label":"round-4-pick-0","action":"click","ok":true,"effect":"Chose: \"Springtime and Love\", reveal: \"✗ Painting: Landscape with Sheep, Picardy · see it →Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:11:20.802Z","game":"lightning","diff":"curator","cat":"All","selector":"#reveal a","label":"round-4-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/111669","errors":[]}
+{"run":4,"ts":"2026-08-03T21:11:19.376Z","selector":".m-card:nth-child(3) [data-place]","label":"Gallery card 3: Place on wall","action":"click","ok":true,"effect":"{\"before\":\"Place on wall →\",\"after\":\"Place on wall →\",\"sigCount\":null}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:11:21.053Z","game":"lightning","diff":"curator","cat":"All","selector":"#nextBtn","label":"round-4-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:11:21.460Z","game":"lightning","diff":"curator","cat":"All","selector":"https://www.artic.edu/iiif/2/b10a8296-74c3-cb5c-a8ad-f448fe2cf337/full/600,/0/default.jpg","label":"round-5-image","action":"inspect","ok":false,"effect":"Image broken/404: https://www.artic.edu/iiif/2/b10a8296-74c3-cb5c-a8ad-f448fe2cf337/full/600,/0/default.jpg","errors":["HTTP_403: https://www.artic.edu/iiif/2/b10a8296-74c3-cb5c-a8ad-f448fe2cf337/full/600,/0/default.jpg","CONSOLE_ERR: Failed to load resource: the server responded with a status of 403 ()","Image 404 or broken: https://www.artic.edu/iiif/2/b10a8296-74c3-cb5c-a8ad-f448fe2cf337/full/600,/0/default.jpg"]}
+{"run":2,"ts":"2026-08-03T21:11:21.461Z","game":"lightning","diff":"curator","cat":"All","selector":"#timerbar","label":"round-5-timer","action":"inspect","ok":true,"effect":"Timer bar visible, fill class: tb-fill run","errors":[]}
+{"run":2,"ts":"2026-08-03T21:11:21.461Z","game":"lightning","diff":"curator","cat":"All","selector":"#stage","label":"round-5-render","action":"inspect","ok":true,"effect":"stage_html_len=193, choices=4, imgs_ok=4, imgs_broken=1","errors":[]}
+{"run":2,"ts":"2026-08-03T21:11:21.913Z","game":"lightning","diff":"curator","cat":"All","selector":".choice","label":"round-5-pick-3","action":"click","ok":true,"effect":"Chose: \"Pierre Carrier-Belleuse\", reveal: \"✗ Artist: Henri ChapuNext →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:11:21.007Z","selector":"header nav a[href=\"/\"]","label":"Nav: Signature archive","action":"click-navigate","ok":true,"effect":"CLICKED_NAVIGATE_WENT_BACK","errors":[]}
+{"run":4,"ts":"2026-08-03T21:11:23.950Z","selector":".m-card:nth-child(1) .r-search","label":"Roster card 1: filter \"wash\"","action":"type:wash","ok":true,"effect":"{\"before\":null,\"after\":\"wash\",\"sigCount\":null}","errors":[]}
+{"run":4,"ts":"2026-08-03T21:11:24.980Z","selector":".m-card:nth-child(1) .r-item:first-child","label":"Roster card 1: click roster item → provenance modal","action":"click","ok":false,"effect":"ACTION_FAILED","errors":["Error: locator.click: Element is not visible\nCall log:\n\u001b[2m  - waiting for locator('.m-card:nth-child(1) .r-item:first-child').first()\u001b[22m\n\u001b[2m    - locator resolved to <button type=\"button\" class=\"r-item\" data-sig=\"Oldest Signatures|1\">…</button>\u001b[22m\n\u001b[2m  - attempting click action\u001b[22m\n\u001b[2m    - scrolling into view if needed\u001b[22m\n"]}
+{"run":4,"ts":"2026-08-03T21:11:30.645Z","selector":"#provModal","label":"Provenance modal: opened?","action":"observe","ok":false,"effect":"MODAL_NOT_OPEN","errors":[]}
+{"run":4,"ts":"2026-08-03T21:11:31.813Z","selector":".m-card:nth-child(2) .r-search","label":"Roster card 2: filter \"hancock\"","action":"type:hancock","ok":true,"effect":"{\"before\":null,\"after\":\"hancock\",\"sigCount\":null}","errors":[]}
+{"run":4,"ts":"2026-08-03T21:11:33.394Z","selector":"#muralEl","label":"Studio: Drag mural","action":"drag","ok":false,"effect":"{\"before\":{\"left\":\"0px\",\"top\":\"0px\"},\"after\":{\"left\":\"0px\",\"top\":\"0px\"},\"readout\":\"From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 16×40 ft · 640 sq ft\\n    Signatures shown: 18\\n    Price: $6\",\"moved\":false}","errors":[]}
+{"run":4,"ts":"2026-08-03T21:11:35.019Z","selector":".m-card:nth-child(1) img","label":"Gallery card 1: collage image load","action":"observe","ok":true,"effect":"{\"src\":\"http://localhost:9920/output/collage-oldest-signatures.png\",\"complete\":true,\"naturalW\":1570}","errors":[]}
+{"run":4,"ts":"2026-08-03T21:11:35.019Z","selector":"#readout","label":"Studio: readout check (price + sig count)","action":"observe","ok":true,"effect":"{\"text\":\"\\n    From left wall: 0.0 ft\\n    From right wall: 0.0 ft\\n    Bottom off floor: 0.0 ft\\n    Mural: 16×40 ft · 640 sq ft\\n    Signatures shown: 18\\n    Price: $6,400\",\"price\":\"Price: $6,400\",\"sigs\":\"Signatures shown: 18\",\"sqft\":\"640 sq ft\"}","errors":[]}
+{"run":4,"ts":"2026-08-03T21:11:35.020Z","selector":"#orderSummary","label":"Order: summary synced with studio","action":"observe","ok":true,"effect":"Oldest Signatures in History · 16×40 ft custom · 18 signatures · $6,400\n     Placement on a 24×12 ft wall: 0.0 ft from left, 0.0 ft off floor.","errors":[]}
+{"run":0,"ts":"2026-08-03T21:11:44.332Z","selector":"/api/signatures","label":"API: /api/signatures","action":"fetch","ok":true,"effect":"{\"ok\":true,\"count\":7076,\"status\":200}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:11:44.339Z","selector":"/api/signature-evolution","label":"API: /api/signature-evolution","action":"fetch","ok":true,"effect":"{\"ok\":true,\"keys\":162,\"status\":200}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:11:45.284Z","selector":"#layoutChips .chip[data-l=\"gallery\"]","label":"Layout: Gallery","action":"click","ok":true,"effect":"body[data-layout]=gallery, cards=7076","errors":[]}
+{"run":0,"ts":"2026-08-03T21:11:45.918Z","selector":"#layoutChips .chip[data-l=\"float\"]","label":"Layout: Float","action":"click","ok":true,"effect":"body[data-layout]=float, cards=7076","errors":[]}
+{"run":0,"ts":"2026-08-03T21:11:46.774Z","selector":"#layoutChips .chip[data-l=\"plaque\"]","label":"Layout: Plaque","action":"click","ok":true,"effect":"body[data-layout]=plaque, cards=7076","errors":[]}
+{"run":0,"ts":"2026-08-03T21:11:47.444Z","selector":"#layoutChips .chip[data-l=\"ledger\"]","label":"Layout: Ledger","action":"click","ok":true,"effect":"body[data-layout]=ledger, cards=7076","errors":[]}
+{"run":0,"ts":"2026-08-03T21:11:48.015Z","selector":"#layoutChips .chip[data-l=\"vitrine\"]","label":"Layout: Vitrine","action":"click","ok":true,"effect":"body[data-layout]=vitrine, cards=7076","errors":[]}
+{"run":0,"ts":"2026-08-03T21:11:51.043Z","selector":"#layoutChips .chip[data-l=\"wall\"]","label":"Layout: Wall","action":"click","ok":true,"effect":"body[data-layout]=wall, cards=7076","errors":[]}
+{"run":2,"ts":"2026-08-03T21:11:51.915Z","game":"lightning","diff":"curator","cat":"All","selector":"#reveal a","label":"round-5-reveal-link","action":"inspect","ok":false,"effect":"No reveal link found after pick","errors":["Missing reveal link in lightning round 5"]}
+{"run":0,"ts":"2026-08-03T21:11:51.956Z","selector":"a.logo","label":"Logo link (home)","action":"nav-check","ok":true,"effect":"exists:true, href:/, text:","errors":[]}
+{"run":2,"ts":"2026-08-03T21:11:52.165Z","game":"lightning","diff":"curator","cat":"All","selector":"#nextBtn","label":"round-5-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:11:51.979Z","selector":"#q","label":"Search: type \"monet\"","action":"type","value":"monet","ok":true,"effect":"typed \"monet\"; cards:1, empty hidden:true","errors":[]}
+{"run":2,"ts":"2026-08-03T21:11:52.571Z","game":"lightning","diff":"curator","cat":"All","selector":"https://www.artic.edu/iiif/2/b10a8296-74c3-cb5c-a8ad-f448fe2cf337/full/600,/0/default.jpg","label":"round-6-image","action":"inspect","ok":false,"effect":"Image broken/404: https://www.artic.edu/iiif/2/b10a8296-74c3-cb5c-a8ad-f448fe2cf337/full/600,/0/default.jpg","errors":["HTTP_403: https://www.artic.edu/iiif/2/b10a8296-74c3-cb5c-a8ad-f448fe2cf337/full/600,/0/default.jpg","CONSOLE_ERR: Failed to load resource: the server responded with a status of 403 ()","Image 404 or broken: https://www.artic.edu/iiif/2/b10a8296-74c3-cb5c-a8ad-f448fe2cf337/full/600,/0/default.jpg"]}
+{"run":2,"ts":"2026-08-03T21:11:52.572Z","game":"lightning","diff":"curator","cat":"All","selector":"#timerbar","label":"round-6-timer","action":"inspect","ok":true,"effect":"Timer bar visible, fill class: tb-fill run","errors":[]}
+{"run":2,"ts":"2026-08-03T21:11:52.573Z","game":"lightning","diff":"curator","cat":"All","selector":"#stage","label":"round-6-render","action":"inspect","ok":true,"effect":"stage_html_len=195, choices=4, imgs_ok=4, imgs_broken=2","errors":[]}
+{"run":0,"ts":"2026-08-03T21:11:52.359Z","selector":"#q","label":"Search: type \"kahlo\"","action":"type","value":"kahlo","ok":true,"effect":"typed \"kahlo\"; cards:1, empty hidden:true","errors":[]}
+{"run":2,"ts":"2026-08-03T21:11:53.023Z","game":"lightning","diff":"curator","cat":"All","selector":".choice","label":"round-6-pick-2","action":"click","ok":true,"effect":"Chose: \"Landscape with Sheep, Picardy\", reveal: \"✗ Painting: La Pensée · see it →Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:11:53.024Z","game":"lightning","diff":"curator","cat":"All","selector":"#reveal a","label":"round-6-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/120058","errors":[]}
+{"run":0,"ts":"2026-08-03T21:11:52.717Z","selector":"#q","label":"Search: type \"xyzzy\" (no results)","action":"type","value":"xyzzy","ok":true,"effect":"typed \"xyzzy\"; cards:0, empty hidden:false","errors":[]}
+{"run":2,"ts":"2026-08-03T21:11:53.275Z","game":"lightning","diff":"curator","cat":"All","selector":"#nextBtn","label":"round-6-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:11:53.074Z","selector":"#q","label":"Search: clear","action":"clear","ok":true,"effect":"cleared; cards:7076","errors":[]}
+{"run":0,"ts":"2026-08-03T21:11:53.580Z","selector":"nav.gnav a[href=\"/murals\"]","label":"Nav: Murals","action":"nav-check","ok":true,"effect":"exists:true, href:/murals, text:Murals","errors":[]}
+{"run":0,"ts":"2026-08-03T21:11:53.613Z","selector":"nav.gnav a[href=\"/game\"]","label":"Nav: Games","action":"nav-check","ok":true,"effect":"exists:true, href:/game, text:Games","errors":[]}
+{"run":0,"ts":"2026-08-03T21:11:53.643Z","selector":"nav.gnav a[href=\"/upload\"]","label":"Nav: Upload yours","action":"nav-check","ok":true,"effect":"exists:true, href:/upload, text:Upload yours","errors":[]}
+{"run":2,"ts":"2026-08-03T21:11:53.684Z","game":"lightning","diff":"curator","cat":"All","selector":"#timerbar","label":"round-7-timer","action":"inspect","ok":true,"effect":"Timer bar visible, fill class: tb-fill run","errors":[]}
+{"run":2,"ts":"2026-08-03T21:11:53.684Z","game":"lightning","diff":"curator","cat":"All","selector":"#stage","label":"round-7-render","action":"inspect","ok":true,"effect":"stage_html_len=193, choices=4, imgs_ok=5, imgs_broken=2","errors":[]}
+{"run":2,"ts":"2026-08-03T21:11:54.137Z","game":"lightning","diff":"curator","cat":"All","selector":".choice","label":"round-7-pick-0","action":"click","ok":true,"effect":"Chose: \"Étienne Carjat\", reveal: \"✓ Artist: Étienne CarjatNext →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:11:53.669Z","selector":"#burger","label":"Hamburger — open drawer","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":false,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false}}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:11:54.201Z","selector":"a.hbtn[href=\"#collection\"]","label":"Hero CTA: Browse the collection","action":"anchor-click","ok":false,"effect":"ERROR: locator.click: Timeout 3000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('a.hbtn[href=\"#collection\"]').first()\u001b[22m\n\u001b[2m    - locator resolved to <a class=\"hbtn\" href=\"#collection\">Browse the col","errors":["locator.click: Timeout 3000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('a.hbtn[href=\"#collection\"]').first()\u001b[22m\n\u001b[2m    - locator resolved to <a class=\"hbtn\" href=\"#collection\">Browse the collection</a>\u001b[22m\n\u001b[2m  - attempting click action\u001b[22m\n\u001b[2m    2 × waiting for element to be visible,"]}
+{"run":0,"ts":"2026-08-03T21:11:57.237Z","selector":"a.hbtn[href=\"/murals\"]","label":"Hero CTA: Order a mural","action":"nav-check","ok":true,"effect":"exists:true, href:/murals, text:Order a mural","errors":[]}
+{"run":0,"ts":"2026-08-03T21:11:57.272Z","selector":"a.hbtn[href=\"/game\"]","label":"Hero CTA: Play the games","action":"nav-check","ok":true,"effect":"exists:true, href:/game, text:Play the games","errors":[]}
+{"run":0,"ts":"2026-08-03T21:11:57.301Z","selector":"#drawerX","label":"Drawer × close","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false},\"after\":{\"drawerOpen\":false,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false}}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:11:57.842Z","selector":"#dback","label":"Drawer backdrop","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false},\"after\":{\"drawerOpen\":false,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false}}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:11:58.836Z","selector":".drawer .tab[data-v=\"grid\"]","label":"Drawer tab: Grid","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false}}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:11:59.749Z","selector":".drawer .tab[data-v=\"collages\"]","label":"Drawer tab: Collages","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":true}}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:12:00.282Z","selector":".drawer .tab[data-v=\"grid\"]","label":"Drawer tab: back to Grid","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false}}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:12:01.218Z","selector":".d-links a[href=\"/murals\"]","label":"Drawer link: Signature murals","action":"nav-check","ok":true,"effect":"exists:true, href:/murals, text:Signature murals","errors":[]}
+{"run":0,"ts":"2026-08-03T21:12:01.259Z","selector":".d-links a[href=\"/game\"]","label":"Drawer link: The Signature Games","action":"nav-check","ok":true,"effect":"exists:true, href:/game, text:The Signature Games","errors":[]}
+{"run":0,"ts":"2026-08-03T21:12:01.283Z","selector":".d-links a[href=\"/upload\"]","label":"Drawer link: Upload your signature","action":"nav-check","ok":true,"effect":"exists:true, href:/upload, text:Upload your signature","errors":[]}
+{"run":0,"ts":"2026-08-03T21:12:01.312Z","selector":"#useFilter","label":"Use filter: Free to use","action":"select","value":"yes","ok":true,"effect":"selected yes; cards:7058","errors":[]}
+{"run":0,"ts":"2026-08-03T21:12:01.735Z","selector":"#useFilter","label":"Use filter: Permission needed","action":"select","value":"permission-needed","ok":true,"effect":"selected permission-needed; cards:0","errors":[]}
+{"run":0,"ts":"2026-08-03T21:12:02.095Z","selector":"#useFilter","label":"Use filter: All signatures","action":"select","value":"all","ok":true,"effect":"selected all; cards:7076","errors":[]}
+{"run":0,"ts":"2026-08-03T21:12:02.506Z","selector":"#sort","label":"Sort: Category then rank","action":"select","value":"cat","ok":true,"effect":"selected cat; cards:7076","errors":[]}
+{"run":0,"ts":"2026-08-03T21:12:02.942Z","selector":"#sort","label":"Sort: Name A→Z","action":"select","value":"name","ok":true,"effect":"selected name; cards:7076","errors":[]}
+{"run":0,"ts":"2026-08-03T21:12:03.465Z","selector":"#sort","label":"Sort: Name Z→A","action":"select","value":"name-desc","ok":true,"effect":"selected name-desc; cards:7076","errors":[]}
+{"run":0,"ts":"2026-08-03T21:12:04.156Z","selector":"#sort","label":"Sort: Rank","action":"select","value":"rank","ok":true,"effect":"selected rank; cards:7076","errors":[]}
+{"run":0,"ts":"2026-08-03T21:12:04.713Z","selector":"#sort","label":"Sort: Notability","action":"select","value":"notability","ok":true,"effect":"selected notability; cards:7076","errors":[]}
+{"run":0,"ts":"2026-08-03T21:12:05.202Z","selector":"#sort","label":"Sort: Usable first","action":"select","value":"usable","ok":true,"effect":"selected usable; cards:7076","errors":[]}
+{"run":0,"ts":"2026-08-03T21:12:05.661Z","selector":"#sort","label":"Sort: Risk low→high","action":"select","value":"risk","ok":true,"effect":"selected risk; cards:7076","errors":[]}
+{"run":0,"ts":"2026-08-03T21:12:06.103Z","selector":"#sort","label":"Sort: Risk high→low","action":"select","value":"risk-desc","ok":true,"effect":"selected risk-desc; cards:7076","errors":[]}
+{"run":0,"ts":"2026-08-03T21:12:06.571Z","selector":"#sort","label":"Sort: License A→Z","action":"select","value":"license","ok":true,"effect":"selected license; cards:7076","errors":[]}
+{"run":0,"ts":"2026-08-03T21:12:07.119Z","selector":"#sort","label":"Sort: Living first","action":"select","value":"living","ok":true,"effect":"selected living; cards:7076","errors":[]}
+{"run":0,"ts":"2026-08-03T21:12:07.597Z","selector":"#sort","label":"Sort: Deceased first","action":"select","value":"deceased","ok":true,"effect":"selected deceased; cards:7076","errors":[]}
+{"run":0,"ts":"2026-08-03T21:12:08.042Z","selector":"#sort","label":"Sort: Death date","action":"select","value":"death","ok":true,"effect":"selected death; cards:7076","errors":[]}
+{"run":0,"ts":"2026-08-03T21:12:08.527Z","selector":"#sort","label":"Sort: Museums","action":"select","value":"museums","ok":true,"effect":"selected museums; cards:7076","errors":[]}
+{"run":0,"ts":"2026-08-03T21:12:09.064Z","selector":"#sort","label":"Sort: Signature count","action":"select","value":"sigcount","ok":true,"effect":"selected sigcount; cards:7076","errors":[]}
+{"run":0,"ts":"2026-08-03T21:12:09.537Z","selector":"#sort","label":"Sort: reset to cat","action":"select","value":"cat","ok":true,"effect":"selected cat; cards:7076","errors":[]}
+{"run":0,"ts":"2026-08-03T21:12:09.991Z","selector":"#density","label":"Density slider → 3","action":"range","value":"3","ok":true,"effect":"set to 3; --cols:3","errors":[]}
+{"run":0,"ts":"2026-08-03T21:12:10.724Z","selector":"#density","label":"Density slider → 7","action":"range","value":"7","ok":true,"effect":"set to 7; --cols:7","errors":[]}
+{"run":0,"ts":"2026-08-03T21:12:11.413Z","selector":"#density","label":"Density slider → 5","action":"range","value":"5","ok":true,"effect":"set to 5; --cols:5","errors":[]}
+{"run":0,"ts":"2026-08-03T21:12:12.112Z","selector":"#catChips .chip[data-c=\"All\"]","label":"Category: All","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false}}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:12:12.933Z","selector":"#catChips .chip[data-c=\"Oldest Signatures\"]","label":"Category: Oldest Signatures","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/?cat=Oldest%20Signatures\",\"cards\":18,\"bodyLayout\":\"gallery\",\"colsVisible\":false}}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:12:13.448Z","selector":"#catChips .chip[data-c=\"Declaration of Independence\"]","label":"Category: Declaration","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/?cat=Oldest%20Signatures\",\"cards\":18,\"bodyLayout\":\"gallery\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/?cat=Declaration%20of%20Independence\",\"cards\":56,\"bodyLayout\":\"gallery\",\"colsVisible\":false}}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:12:13.907Z","selector":"#catChips .chip[data-c=\"Politics\"]","label":"Category: Politics","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/?cat=Declaration%20of%20Independence\",\"cards\":56,\"bodyLayout\":\"gallery\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/?cat=Politics\",\"cards\":54,\"bodyLayout\":\"gallery\",\"colsVisible\":false}}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:12:14.366Z","selector":"#catChips .chip[data-c=\"Artists\"]","label":"Category: Artists","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/?cat=Politics\",\"cards\":54,\"bodyLayout\":\"gallery\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/?cat=Artists\",\"cards\":1262,\"bodyLayout\":\"gallery\",\"colsVisible\":false}}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:12:14.892Z","selector":"#catChips .chip[data-c=\"Authors\"]","label":"Category: Authors","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/?cat=Artists\",\"cards\":1262,\"bodyLayout\":\"gallery\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/?cat=Authors\",\"cards\":5686,\"bodyLayout\":\"gallery\",\"colsVisible\":false}}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:12:15.621Z","selector":"#catChips .chip[data-c=\"All\"]","label":"Category: back to All","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/?cat=Authors\",\"cards\":5686,\"bodyLayout\":\"gallery\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false}}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:12:16.443Z","selector":"#layoutChips .chip[data-l=\"gallery\"]","label":"Layout: Gallery","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false}}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:12:16.970Z","selector":"#layoutChips .chip[data-l=\"float\"]","label":"Layout: Float","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"float\",\"colsVisible\":false}}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:12:17.721Z","selector":"#layoutChips .chip[data-l=\"plaque\"]","label":"Layout: Plaque","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"float\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"plaque\",\"colsVisible\":false}}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:12:18.632Z","selector":"#layoutChips .chip[data-l=\"ledger\"]","label":"Layout: Ledger","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"plaque\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"ledger\",\"colsVisible\":false}}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:12:19.429Z","selector":"#layoutChips .chip[data-l=\"vitrine\"]","label":"Layout: Vitrine","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"ledger\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"vitrine\",\"colsVisible\":false}}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:12:20.161Z","selector":"#layoutChips .chip[data-l=\"wall\"]","label":"Layout: Wall","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"vitrine\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"wall\",\"colsVisible\":false}}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:12:22.294Z","selector":"#layoutChips .chip[data-l=\"gallery\"]","label":"Layout: back to Gallery","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"wall\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false}}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:12:24.137Z","game":"lightning","diff":"curator","cat":"All","selector":"#reveal a","label":"round-7-reveal-link","action":"inspect","ok":false,"effect":"No reveal link found after pick","errors":["Missing reveal link in lightning round 7"]}
+{"run":2,"ts":"2026-08-03T21:12:24.389Z","game":"lightning","diff":"curator","cat":"All","selector":"#nextBtn","label":"round-7-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:12:24.795Z","game":"lightning","diff":"curator","cat":"All","selector":"#timerbar","label":"round-8-timer","action":"inspect","ok":true,"effect":"Timer bar visible, fill class: tb-fill run","errors":[]}
+{"run":2,"ts":"2026-08-03T21:12:24.796Z","game":"lightning","diff":"curator","cat":"All","selector":"#stage","label":"round-8-render","action":"inspect","ok":true,"effect":"stage_html_len=195, choices=4, imgs_ok=6, imgs_broken=2","errors":[]}
+{"run":2,"ts":"2026-08-03T21:12:25.248Z","game":"lightning","diff":"curator","cat":"All","selector":".choice","label":"round-8-pick-3","action":"click","ok":true,"effect":"Chose: \"Exterior View of the Italian Gate of the\", reveal: \"✗ Painting: Portrait of Honoré Daumier · see it →Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:12:25.249Z","game":"lightning","diff":"curator","cat":"All","selector":"#reveal a","label":"round-8-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/105473","errors":[]}
+{"run":2,"ts":"2026-08-03T21:12:25.500Z","game":"lightning","diff":"curator","cat":"All","selector":"#nextBtn","label":"round-8-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:12:25.905Z","game":"lightning","diff":"curator","cat":"All","selector":"#timerbar","label":"round-9-timer","action":"inspect","ok":true,"effect":"Timer bar visible, fill class: tb-fill run","errors":[]}
+{"run":2,"ts":"2026-08-03T21:12:25.906Z","game":"lightning","diff":"curator","cat":"All","selector":"#stage","label":"round-9-render","action":"inspect","ok":true,"effect":"stage_html_len=193, choices=4, imgs_ok=7, imgs_broken=2","errors":[]}
+{"run":0,"ts":"2026-08-03T21:12:23.035Z","selector":"#filtersHint","label":"☰ Categories/sort/views button","action":"click","ok":false,"effect":"ERROR: locator.click: Timeout 3000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('#filtersHint').first()\u001b[22m\n\u001b[2m    - locator resolved to <button id=\"filtersHint\" class=\"filters-hint\">☰ Categories, sor","errors":["locator.click: Timeout 3000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('#filtersHint').first()\u001b[22m\n\u001b[2m    - locator resolved to <button id=\"filtersHint\" class=\"filters-hint\">☰ Categories, sort & views</button>\u001b[22m\n\u001b[2m  - attempting click action\u001b[22m\n\u001b[2m    2 × waiting for element to be v"]}
+{"run":2,"ts":"2026-08-03T21:12:26.360Z","game":"lightning","diff":"curator","cat":"All","selector":".choice","label":"round-9-pick-2","action":"click","ok":true,"effect":"Chose: \"John Thompson\", reveal: \"✗ Artist: Pierre Carrier-BelleuseNext →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:12:26.072Z","selector":null,"label":"Escape key closes drawer","action":"escape","ok":true,"effect":"drawerOpen:false, popOpen:false","errors":[]}
+{"run":0,"ts":"2026-08-03T21:12:26.434Z","selector":".info-chip","label":"First card Details chip → open popup","action":"click-details","ok":true,"effect":"popOpen:true, artist:GAR.AMA (Uruk scribe)","errors":[]}
+{"run":0,"ts":"2026-08-03T21:12:27.791Z","selector":".ap-x","label":"Artist popup × close","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":false,\"popOpen\":true,\"url\":\"http://localhost:9920/?artist=lexical-list-oldest-autograph-ms-2494-4\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false},\"after\":{\"drawerOpen\":false,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false}}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:12:28.337Z","selector":".info-chip","label":"Re-open artist popup (backdrop close)","action":"click-details","ok":true,"effect":"popOpen:true, artist:GAR.AMA (Uruk scribe)","errors":[]}
+{"run":0,"ts":"2026-08-03T21:12:29.682Z","selector":".ap-back","label":"Artist popup backdrop close","action":"click","ok":false,"effect":"ERROR: locator.click: Timeout 3000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('.ap-back').first()\u001b[22m\n\u001b[2m    - locator resolved to <div class=\"ap-back\"></div>\u001b[22m\n\u001b[2m  - attempting click action\u001b[2","errors":["locator.click: Timeout 3000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('.ap-back').first()\u001b[22m\n\u001b[2m    - locator resolved to <div class=\"ap-back\"></div>\u001b[22m\n\u001b[2m  - attempting click action\u001b[22m\n\u001b[2m    2 × waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m      - element is vis"]}
+{"run":2,"ts":"2026-08-03T21:12:56.361Z","game":"lightning","diff":"curator","cat":"All","selector":"#reveal a","label":"round-9-reveal-link","action":"inspect","ok":false,"effect":"No reveal link found after pick","errors":["Missing reveal link in lightning round 9"]}
+{"run":2,"ts":"2026-08-03T21:12:56.612Z","game":"lightning","diff":"curator","cat":"All","selector":"#nextBtn","label":"round-9-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:12:57.019Z","game":"lightning","diff":"curator","cat":"All","selector":"#timerbar","label":"round-10-timer","action":"inspect","ok":true,"effect":"Timer bar visible, fill class: tb-fill run","errors":[]}
+{"run":2,"ts":"2026-08-03T21:12:57.019Z","game":"lightning","diff":"curator","cat":"All","selector":"#stage","label":"round-10-render","action":"inspect","ok":true,"effect":"stage_html_len=195, choices=4, imgs_ok=8, imgs_broken=2","errors":[]}
+{"run":2,"ts":"2026-08-03T21:12:57.472Z","game":"lightning","diff":"curator","cat":"All","selector":".choice","label":"round-10-pick-0","action":"click","ok":true,"effect":"Chose: \"Jeanne Bécu, Comtesse Du Barry, and her \", reveal: \"✗ Painting: La Source · see it →Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:12:57.473Z","game":"lightning","diff":"curator","cat":"All","selector":"#reveal a","label":"round-10-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/20669","errors":[]}
+{"run":2,"ts":"2026-08-03T21:12:57.724Z","game":"lightning","diff":"curator","cat":"All","selector":"#nextBtn","label":"round-10-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:12:58.130Z","game":"lightning","diff":"curator","cat":"All","selector":"#timerbar","label":"round-11-timer","action":"inspect","ok":true,"effect":"Timer bar visible, fill class: tb-fill run","errors":[]}
+{"run":2,"ts":"2026-08-03T21:12:58.131Z","game":"lightning","diff":"curator","cat":"All","selector":"#stage","label":"round-11-render","action":"inspect","ok":true,"effect":"stage_html_len=193, choices=4, imgs_ok=9, imgs_broken=2","errors":[]}
+{"run":2,"ts":"2026-08-03T21:12:58.585Z","game":"lightning","diff":"curator","cat":"All","selector":".choice","label":"round-11-pick-3","action":"click","ok":true,"effect":"Chose: \"Karin Larsson\", reveal: \"✓ Artist: Karin LarssonNext →\"","errors":[]}
+{"run":0,"ts":"2026-08-03T21:12:32.725Z","selector":".info-chip","label":"Re-open artist popup (escape close)","action":"click-details","ok":false,"effect":"ERROR: locator.hover: Timeout 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('.card').first()\u001b[22m\n\u001b[2m    - locator resolved to <div class=\"card\">…</div>\u001b[22m\n\u001b[2m  - attempting hover action\u001b[22m\n\u001b","errors":["locator.hover: Timeout 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('.card').first()\u001b[22m\n\u001b[2m    - locator resolved to <div class=\"card\">…</div>\u001b[22m\n\u001b[2m  - attempting hover action\u001b[22m\n\u001b[2m    2 × waiting for element to be visible and stable\u001b[22m\n\u001b[2m      - element is visible and stab"]}
+{"run":0,"ts":"2026-08-03T21:13:02.965Z","selector":null,"label":"Escape key closes artist popup","action":"escape","ok":true,"effect":"drawerOpen:false, popOpen:false","errors":[]}
+{"run":0,"ts":"2026-08-03T21:13:03.322Z","selector":".drawer .tab[data-v=\"collages\"]","label":"Collages tab: switch + check","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":true}}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:13:04.317Z","selector":".drawer .tab[data-v=\"grid\"]","label":"Collages → Grid: switch back","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false}}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:13:08.623Z","selector":"#artistPop","label":"Popup deep: structure check","action":"inspect","ok":true,"effect":"{\"popOpen\":true,\"artistName\":\"GAR.AMA (Uruk scribe)\",\"ctaHref\":\"/murals?name=GAR.AMA%20(Uruk%20scribe)\",\"sigNaturalW\":468,\"life\":\"† c. 3100 BCE · Cited by the Schøyen Collection as the earliest extant autograph signature — a named scribe signing a lexical list.\",\"hasTags\":1,\"hasBadge\":1,\"hasEvo\":false,\"hasMuralCta\":true}","errors":[]}
+{"run":0,"ts":"2026-08-03T21:13:08.626Z","selector":".ap-sig img","label":"Popup sig img: HTTP check","action":"check-img","ok":false,"effect":"src=https://images.metmuseum.org/CRDImages/an/web-large/DP293243.jpg, ok=false","errors":[]}
+{"run":0,"ts":"2026-08-03T21:13:12.629Z","selector":"#apWorks","label":"Popup works: loaded after 4s","action":"check-works","ok":true,"effect":"works:1, brokenImgs:0, text:no openly-licensed works found in the open museum APIs — see Wikidata","errors":["console.error: Access to fetch at 'https://images.metmuseum.org/CRDImages/an/web-large/DP293243.jpg' from origin 'http://localhost:9920' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.","console.error: Failed to load resource: net::ERR_FAILED"]}
+{"run":0,"ts":"2026-08-03T21:13:12.634Z","selector":"#apBody a[href*=\"wikidata\"]","label":"Popup: Wikidata link","action":"check-link","ok":false,"effect":"href:undefined","errors":[]}
+{"run":0,"ts":"2026-08-03T21:13:13.029Z","selector":".ap-x","label":"Popup × close (deep test)","action":"click","ok":true,"effect":"hidden:true","errors":[]}
+{"run":0,"ts":"2026-08-03T21:13:14.170Z","selector":"#collagesView","label":"Collages: content","action":"check","ok":true,"effect":"{\"collageCount\":5,\"collageImgs\":5,\"collageNotes\":0,\"downloadLinks\":[\"/output/collage-oldest-signatures.png\",\"/output/collage-declaration-of-independence.png\",\"/output/collage-politics.png\",\"/output/collage-artists.png\",\"/output/collage-authors.png\"],\"notBuilt\":[]}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:13:22.224Z","selector":"/api/signatures","label":"API: /api/signatures","action":"fetch","ok":true,"effect":"{\"ok\":true,\"count\":7076,\"status\":200}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:13:22.234Z","selector":"/api/signature-evolution","label":"API: /api/signature-evolution","action":"fetch","ok":true,"effect":"{\"ok\":true,\"keys\":162,\"status\":200}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:13:23.180Z","selector":"#layoutChips .chip[data-l=\"gallery\"]","label":"Layout: Gallery","action":"click","ok":true,"effect":"body[data-layout]=gallery, cards=7076","errors":[]}
+{"run":1,"ts":"2026-08-03T21:13:23.919Z","selector":"#layoutChips .chip[data-l=\"float\"]","label":"Layout: Float","action":"click","ok":true,"effect":"body[data-layout]=float, cards=7076","errors":[]}
+{"run":1,"ts":"2026-08-03T21:13:24.755Z","selector":"#layoutChips .chip[data-l=\"plaque\"]","label":"Layout: Plaque","action":"click","ok":true,"effect":"body[data-layout]=plaque, cards=7076","errors":[]}
+{"run":1,"ts":"2026-08-03T21:13:25.422Z","selector":"#layoutChips .chip[data-l=\"ledger\"]","label":"Layout: Ledger","action":"click","ok":true,"effect":"body[data-layout]=ledger, cards=7076","errors":[]}
+{"run":1,"ts":"2026-08-03T21:13:26.024Z","selector":"#layoutChips .chip[data-l=\"vitrine\"]","label":"Layout: Vitrine","action":"click","ok":true,"effect":"body[data-layout]=vitrine, cards=7076","errors":[]}
+{"run":2,"ts":"2026-08-03T21:13:28.585Z","game":"lightning","diff":"curator","cat":"All","selector":"#reveal a","label":"round-11-reveal-link","action":"inspect","ok":false,"effect":"No reveal link found after pick","errors":["Missing reveal link in lightning round 11"]}
+{"run":2,"ts":"2026-08-03T21:13:28.836Z","game":"lightning","diff":"curator","cat":"All","selector":"#nextBtn","label":"round-11-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:13:28.936Z","selector":"#layoutChips .chip[data-l=\"wall\"]","label":"Layout: Wall","action":"click","ok":true,"effect":"body[data-layout]=wall, cards=7076","errors":[]}
+{"run":2,"ts":"2026-08-03T21:13:29.242Z","game":"lightning","diff":"curator","cat":"All","selector":"#timerbar","label":"round-12-timer","action":"inspect","ok":true,"effect":"Timer bar visible, fill class: tb-fill run","errors":[]}
+{"run":2,"ts":"2026-08-03T21:13:29.242Z","game":"lightning","diff":"curator","cat":"All","selector":"#stage","label":"round-12-render","action":"inspect","ok":true,"effect":"stage_html_len=195, choices=4, imgs_ok=10, imgs_broken=2","errors":[]}
+{"run":2,"ts":"2026-08-03T21:13:29.694Z","game":"lightning","diff":"curator","cat":"All","selector":".choice","label":"round-12-pick-2","action":"click","ok":true,"effect":"Chose: \"La Pensée\", reveal: \"✗ Painting: Little Lie-A-Bed's Sad Breakfast · see it →Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:13:29.696Z","game":"lightning","diff":"curator","cat":"All","selector":"#reveal a","label":"round-12-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/31923","errors":[]}
+{"run":2,"ts":"2026-08-03T21:13:29.947Z","game":"lightning","diff":"curator","cat":"All","selector":"#nextBtn","label":"round-12-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:13:30.353Z","game":"lightning","diff":"curator","cat":"All","selector":"#timerbar","label":"round-13-timer","action":"inspect","ok":true,"effect":"Timer bar visible, fill class: tb-fill run","errors":[]}
+{"run":2,"ts":"2026-08-03T21:13:30.354Z","game":"lightning","diff":"curator","cat":"All","selector":"#stage","label":"round-13-render","action":"inspect","ok":true,"effect":"stage_html_len=193, choices=4, imgs_ok=11, imgs_broken=2","errors":[]}
+{"run":1,"ts":"2026-08-03T21:13:29.857Z","selector":".drawer .tab[data-v=\"grid\"]","label":"Collages → Grid: switch back","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false}}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:13:30.807Z","game":"lightning","diff":"curator","cat":"All","selector":".choice","label":"round-13-pick-0","action":"click","ok":true,"effect":"Chose: \"Étienne Carjat\", reveal: \"✗ Artist: Francesco Paolo MichettiNext →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:13:30.796Z","selector":".drawer .tab[data-v=\"collages\"]","label":"Collages tab: switch + check","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":true}}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:13:31.305Z","selector":null,"label":"Escape key closes artist popup","action":"escape","ok":true,"effect":"drawerOpen:false, popOpen:false","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:00.808Z","game":"lightning","diff":"curator","cat":"All","selector":"#reveal a","label":"round-13-reveal-link","action":"inspect","ok":false,"effect":"No reveal link found after pick","errors":["Missing reveal link in lightning round 13"]}
+{"run":2,"ts":"2026-08-03T21:14:01.062Z","game":"lightning","diff":"curator","cat":"All","selector":"#nextBtn","label":"round-13-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:01.468Z","game":"lightning","diff":"curator","cat":"All","selector":"#timerbar","label":"round-14-timer","action":"inspect","ok":true,"effect":"Timer bar visible, fill class: tb-fill run","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:01.469Z","game":"lightning","diff":"curator","cat":"All","selector":"#stage","label":"round-14-render","action":"inspect","ok":true,"effect":"stage_html_len=195, choices=4, imgs_ok=12, imgs_broken=2","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:01.919Z","game":"lightning","diff":"curator","cat":"All","selector":".choice","label":"round-14-pick-3","action":"click","ok":true,"effect":"Chose: \"Springtime and Love\", reveal: \"✓ Painting: Springtime and Love · see it →Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:01.920Z","game":"lightning","diff":"curator","cat":"All","selector":"#reveal a","label":"round-14-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/39479","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:02.171Z","game":"lightning","diff":"curator","cat":"All","selector":"#nextBtn","label":"round-14-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:02.578Z","game":"lightning","diff":"curator","cat":"All","selector":"#timerbar","label":"round-15-timer","action":"inspect","ok":true,"effect":"Timer bar visible, fill class: tb-fill run","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:02.579Z","game":"lightning","diff":"curator","cat":"All","selector":"#stage","label":"round-15-render","action":"inspect","ok":true,"effect":"stage_html_len=193, choices=4, imgs_ok=13, imgs_broken=2","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:03.030Z","game":"lightning","diff":"curator","cat":"All","selector":".choice","label":"round-15-pick-2","action":"click","ok":true,"effect":"Chose: \"Pierre Carrier-Belleuse\", reveal: \"✗ Artist: Bernardo BellottoNext →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:13:31.659Z","selector":".info-chip","label":"Re-open artist popup (escape close)","action":"click-details","ok":false,"effect":"ERROR: locator.hover: Timeout 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('.card').first()\u001b[22m\n\u001b[2m    - locator resolved to <div class=\"card\">…</div>\u001b[22m\n\u001b[2m  - attempting hover action\u001b[22m\n\u001b","errors":["locator.hover: Timeout 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('.card').first()\u001b[22m\n\u001b[2m    - locator resolved to <div class=\"card\">…</div>\u001b[22m\n\u001b[2m  - attempting hover action\u001b[22m\n\u001b[2m    2 × waiting for element to be visible and stable\u001b[22m\n\u001b[2m      - element is not visible\u001b[22m"]}
+{"run":1,"ts":"2026-08-03T21:14:03.891Z","selector":".ap-back","label":"Artist popup backdrop close","action":"click","ok":false,"effect":"ERROR: locator.click: Timeout 3000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('.ap-back').first()\u001b[22m\n\u001b[2m    - locator resolved to <div class=\"ap-back\"></div>\u001b[22m\n\u001b[2m  - attempting click action\u001b[2","errors":["locator.click: Timeout 3000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('.ap-back').first()\u001b[22m\n\u001b[2m    - locator resolved to <div class=\"ap-back\"></div>\u001b[22m\n\u001b[2m  - attempting click action\u001b[22m\n\u001b[2m    2 × waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m      - element is not"]}
+{"run":2,"ts":"2026-08-03T21:14:33.030Z","game":"lightning","diff":"curator","cat":"All","selector":"#reveal a","label":"round-15-reveal-link","action":"inspect","ok":false,"effect":"No reveal link found after pick","errors":["Missing reveal link in lightning round 15"]}
+{"run":2,"ts":"2026-08-03T21:14:33.284Z","game":"lightning","diff":"curator","cat":"All","selector":"#nextBtn","label":"round-15-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:33.691Z","game":"lightning","diff":"curator","cat":"All","selector":"#timerbar","label":"round-16-timer","action":"inspect","ok":true,"effect":"Timer bar visible, fill class: tb-fill run","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:33.692Z","game":"lightning","diff":"curator","cat":"All","selector":"#stage","label":"round-16-render","action":"inspect","ok":true,"effect":"stage_html_len=195, choices=4, imgs_ok=14, imgs_broken=2","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:34.142Z","game":"lightning","diff":"curator","cat":"All","selector":".choice","label":"round-16-pick-0","action":"click","ok":true,"effect":"Chose: \"La Pensée\", reveal: \"✗ Painting: Exterior View of the Italian Gate of the Ramparts of the Town of Dre\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:34.143Z","game":"lightning","diff":"curator","cat":"All","selector":"#reveal a","label":"round-16-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/188958","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:34.396Z","game":"lightning","diff":"curator","cat":"All","selector":"#nextBtn","label":"round-16-next","action":"click","ok":true,"effect":"Next text: \"See results\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:34.800Z","game":"lightning","diff":"curator","cat":"All","selector":"#results","label":"results-screen","action":"inspect","ok":true,"effect":"score=20, verdict=\"A promising apprentice.\", best=\"Best (lightning · curator): 20\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:34.801Z","game":"lightning","diff":"curator","cat":"All","selector":"#misses","label":"lightning-bonus-line","action":"inspect","ok":true,"effect":"Bonus line HTML: \"<div class=\"ap-sub\" style=\"margin-top:8px\">⚡ Named BOTH on 0 of 8 paintings — <b>+0 bonus</b></div><b>Worth a second look:</b><br><a href=\"/?artist=Q1994456\" target=\"_blank\" rel=\"noopener noreferrer\">\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:35.255Z","game":"lightning","diff":"curator","cat":"All","selector":"#againBtn","label":"play-again","action":"click","ok":true,"effect":"Setup panel returned: true","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:36.336Z","game":"whose","diff":"curator","cat":"Politics","selector":"#gamePick .gcard[data-g=\"whose\"]","label":"game-card-whose","action":"click","ok":true,"effect":"card selected","errors":["REQUEST_FAILED: POST https://www.google-analytics.com/g/collect?v=2&tid=G-2HEVP6TD0J&gtm=45je67v1v9260226174za200zd9260226174&_p=1785791438967&gcd=13l3l3l3l1l1&npa=0&dma=0&_eu=AAAAAAQ&are=1&cid=1264535497.1785791406&frm=0&ngs=1&pscdl=noapi&rcb=19&sr=1600x900&uaa=arm&uab=64&uafvl=HeadlessChrome%3B149.0.7827.55%7CChromium%3B149.0.7827.55%7CNot)A%253BBrand%3B24.0.0.0&uam=&uamb=0&uap=macOS&uapv=26.4.0&uaw=0&ul=en-us&_s=2&tag_exp=115938466~115938468~118897920~118897930~119896803&sid=1785791405&sct=1&seg=1&dl=http%3A%2F%2Flocalhost%2Fgame&dt=The%20Signature%20Games%20%E2%80%94%20Celebrity%20Signatures&en=user_engagement&_et=236281&tfd=236303 — net::ERR_ABORTED"]}
+{"run":2,"ts":"2026-08-03T21:14:36.340Z","game":"whose","diff":"curator","cat":"Politics","selector":"#catLabel/#catOpts","label":"category-row-visibility","action":"inspect","ok":true,"effect":"catLabel=block, catOpts=flex, expected_visible=true, actual=true","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:36.534Z","game":"whose","diff":"curator","cat":"Politics","selector":"#diffOpts .opt[data-d=\"curator\"]","label":"diff-curator","action":"click","ok":true,"effect":"selected","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:36.729Z","game":"whose","diff":"curator","cat":"Politics","selector":"#catOpts .opt[data-c=\"Politics\"]","label":"cat-Politics","action":"click","ok":true,"effect":"selected","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:36.771Z","game":"whose","diff":"curator","cat":"Politics","selector":"#goBtn","label":"begin-button","action":"click","ok":true,"effect":"Begin clicked","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:36.772Z","game":"whose","diff":"curator","cat":"Politics","selector":"#play","label":"play-panel-appeared","action":"wait","ok":true,"effect":"play panel shown in 43ms","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:36.776Z","game":"whose","diff":"curator","cat":"Politics","selector":"https://upload.wikimedia.org/wikipedia/commons/2/22/Harry_S._Truman_signature.png","label":"round-1-image","action":"inspect","ok":false,"effect":"Image broken/404: https://upload.wikimedia.org/wikipedia/commons/2/22/Harry_S._Truman_signature.png","errors":["Image 404 or broken: https://upload.wikimedia.org/wikipedia/commons/2/22/Harry_S._Truman_signature.png"]}
+{"run":2,"ts":"2026-08-03T21:14:36.776Z","game":"whose","diff":"curator","cat":"Politics","selector":"#stage","label":"round-1-render","action":"inspect","ok":true,"effect":"stage_html_len=129, choices=4, imgs_ok=0, imgs_broken=1","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:37.227Z","game":"whose","diff":"curator","cat":"Politics","selector":".choice","label":"round-1-pick-0","action":"click","ok":true,"effect":"Chose: \"Harry S. Truman\", reveal: \"✓ Correct — Harry S. Truman · their page →Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:37.478Z","game":"whose","diff":"curator","cat":"Politics","selector":"#nextBtn","label":"round-1-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:37.893Z","game":"whose","diff":"curator","cat":"Politics","selector":"#stage","label":"round-2-render","action":"inspect","ok":true,"effect":"stage_html_len=123, choices=4, imgs_ok=1, imgs_broken=1","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:38.343Z","game":"whose","diff":"curator","cat":"Politics","selector":".choice","label":"round-2-pick-3","action":"click","ok":true,"effect":"Chose: \"Martin Luther King Jr.\", reveal: \"✗ It was Karl Marx · their page →Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:38.603Z","game":"whose","diff":"curator","cat":"Politics","selector":"#nextBtn","label":"round-2-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:39.018Z","game":"whose","diff":"curator","cat":"Politics","selector":"#stage","label":"round-3-render","action":"inspect","ok":true,"effect":"stage_html_len=120, choices=4, imgs_ok=2, imgs_broken=1","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:39.469Z","game":"whose","diff":"curator","cat":"Politics","selector":".choice","label":"round-3-pick-2","action":"click","ok":true,"effect":"Chose: \"Nikita Khrushchev\", reveal: \"✗ It was John Adams · their page →Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:39.730Z","game":"whose","diff":"curator","cat":"Politics","selector":"#nextBtn","label":"round-3-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:40.137Z","game":"whose","diff":"curator","cat":"Politics","selector":"#stage","label":"round-4-render","action":"inspect","ok":true,"effect":"stage_html_len=131, choices=4, imgs_ok=3, imgs_broken=1","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:40.589Z","game":"whose","diff":"curator","cat":"Politics","selector":".choice","label":"round-4-pick-0","action":"click","ok":true,"effect":"Chose: \"Galileo Galilei\", reveal: \"✓ Correct — Galileo Galilei · their page →Next →\"","errors":["REQUEST_FAILED: POST https://www.google-analytics.com/g/collect?v=2&tid=G-2HEVP6TD0J&gtm=45je67v1v9260226174za200zd9260226174&_p=1785791675263&gcd=13l3l3l3l1l1&npa=0&dma=0&_eu=AAAAAAQ&are=1&cid=1264535497.1785791406&frm=0&ngs=1&pscdl=noapi&rcb=0&sr=1600x900&uaa=arm&uab=64&uafvl=HeadlessChrome%3B149.0.7827.55%7CChromium%3B149.0.7827.55%7CNot)A%253BBrand%3B24.0.0.0&uam=&uamb=0&uap=macOS&uapv=26.4.0&uaw=0&ul=en-us&_s=1&tag_exp=115938465~115938469~118897920~118897930~119259605~119896802&sid=1785791405&sct=1&seg=1&dl=http%3A%2F%2Flocalhost%2Fgame&dt=The%20Signature%20Games%20%E2%80%94%20Celebrity%20Signatures&en=page_view&_ee=1&tfd=5019 — net::ERR_ABORTED"]}
+{"run":2,"ts":"2026-08-03T21:14:40.842Z","game":"whose","diff":"curator","cat":"Politics","selector":"#nextBtn","label":"round-4-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:14:08.933Z","selector":".info-chip","label":"Re-open artist popup (backdrop close)","action":"click-details","ok":false,"effect":"ERROR: locator.hover: Timeout 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('.card').first()\u001b[22m\n\u001b[2m    - locator resolved to <div class=\"card\">…</div>\u001b[22m\n\u001b[2m  - attempting hover action\u001b[22m\n\u001b","errors":["locator.hover: Timeout 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('.card').first()\u001b[22m\n\u001b[2m    - locator resolved to <div class=\"card\">…</div>\u001b[22m\n\u001b[2m  - attempting hover action\u001b[22m\n\u001b[2m    2 × waiting for element to be visible and stable\u001b[22m\n\u001b[2m      - element is not visible\u001b[22m"]}
+{"run":2,"ts":"2026-08-03T21:14:41.248Z","game":"whose","diff":"curator","cat":"Politics","selector":"#stage","label":"round-5-render","action":"inspect","ok":true,"effect":"stage_html_len=124, choices=4, imgs_ok=4, imgs_broken=1","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:41.701Z","game":"whose","diff":"curator","cat":"Politics","selector":".choice","label":"round-5-pick-3","action":"click","ok":true,"effect":"Chose: \"Thomas Jefferson\", reveal: \"✗ It was Henry Ford · their page →Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:41.954Z","game":"whose","diff":"curator","cat":"Politics","selector":"#nextBtn","label":"round-5-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:42.360Z","game":"whose","diff":"curator","cat":"Politics","selector":"#stage","label":"round-6-render","action":"inspect","ok":true,"effect":"stage_html_len=134, choices=4, imgs_ok=5, imgs_broken=1","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:42.811Z","game":"whose","diff":"curator","cat":"Politics","selector":".choice","label":"round-6-pick-2","action":"click","ok":true,"effect":"Chose: \"John F. Kennedy\", reveal: \"✗ It was Abraham Lincoln · their page →Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:43.062Z","game":"whose","diff":"curator","cat":"Politics","selector":"#nextBtn","label":"round-6-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:43.477Z","game":"whose","diff":"curator","cat":"Politics","selector":"#stage","label":"round-7-render","action":"inspect","ok":true,"effect":"stage_html_len=121, choices=4, imgs_ok=6, imgs_broken=1","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:43.936Z","game":"whose","diff":"curator","cat":"Politics","selector":".choice","label":"round-7-pick-0","action":"click","ok":true,"effect":"Chose: \"Woodrow Wilson\", reveal: \"✗ It was Yuri Gagarin · their page →Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:44.187Z","game":"whose","diff":"curator","cat":"Politics","selector":"#nextBtn","label":"round-7-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:44.594Z","game":"whose","diff":"curator","cat":"Politics","selector":"#stage","label":"round-8-render","action":"inspect","ok":true,"effect":"stage_html_len=123, choices=4, imgs_ok=7, imgs_broken=1","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:45.048Z","game":"whose","diff":"curator","cat":"Politics","selector":".choice","label":"round-8-pick-3","action":"click","ok":true,"effect":"Chose: \"John Maynard Keynes\", reveal: \"✓ Correct — John Maynard Keynes · their page →Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:45.299Z","game":"whose","diff":"curator","cat":"Politics","selector":"#nextBtn","label":"round-8-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:45.707Z","game":"whose","diff":"curator","cat":"Politics","selector":"#stage","label":"round-9-render","action":"inspect","ok":true,"effect":"stage_html_len=143, choices=4, imgs_ok=8, imgs_broken=1","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:46.160Z","game":"whose","diff":"curator","cat":"Politics","selector":".choice","label":"round-9-pick-2","action":"click","ok":true,"effect":"Chose: \"Napoleon\", reveal: \"✗ It was Johann Wolfgang von Goethe · their page →Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:14:41.160Z","selector":".ap-x","label":"Artist popup × close","action":"click","ok":false,"effect":"ERROR: locator.click: Timeout 3000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('.ap-x').first()\u001b[22m\n\u001b[2m    - locator resolved to <button class=\"ap-x\" aria-label=\"Close\">×</button>\u001b[22m\n\u001b[2m  - attemp","errors":["locator.click: Timeout 3000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('.ap-x').first()\u001b[22m\n\u001b[2m    - locator resolved to <button class=\"ap-x\" aria-label=\"Close\">×</button>\u001b[22m\n\u001b[2m  - attempting click action\u001b[22m\n\u001b[2m    2 × waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m  "]}
+{"run":2,"ts":"2026-08-03T21:14:46.409Z","game":"whose","diff":"curator","cat":"Politics","selector":"#nextBtn","label":"round-9-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:46.821Z","game":"whose","diff":"curator","cat":"Politics","selector":"#stage","label":"round-10-render","action":"inspect","ok":true,"effect":"stage_html_len=134, choices=4, imgs_ok=9, imgs_broken=1","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:47.270Z","game":"whose","diff":"curator","cat":"Politics","selector":".choice","label":"round-10-pick-0","action":"click","ok":true,"effect":"Chose: \"Geoffrey Chaucer\", reveal: \"✗ It was Herbert Hoover · their page →See results\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:47.524Z","game":"whose","diff":"curator","cat":"Politics","selector":"#nextBtn","label":"round-10-next","action":"click","ok":true,"effect":"Next text: \"See results\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:47.929Z","game":"whose","diff":"curator","cat":"Politics","selector":"#results","label":"results-screen","action":"inspect","ok":true,"effect":"score=30, verdict=\"Everyone starts somewhere.\", best=\"Best (whose · curator): 30\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:48.382Z","game":"whose","diff":"curator","cat":"Politics","selector":"#againBtn","label":"play-again","action":"click","ok":true,"effect":"Setup panel returned: true","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:49.462Z","game":"century","diff":"curator","cat":"All","selector":"#gamePick .gcard[data-g=\"century\"]","label":"game-card-century","action":"click","ok":true,"effect":"card selected","errors":["REQUEST_FAILED: POST https://www.google-analytics.com/g/collect?v=2&tid=G-2HEVP6TD0J&gtm=45je67v1v9260226174za200zd9260226174&_p=1785791675263&gcd=13l3l3l3l1l1&npa=0&dma=0&_eu=AAAAAAQ&are=1&cid=1264535497.1785791406&frm=0&ngs=1&pscdl=noapi&rcb=0&sr=1600x900&uaa=arm&uab=64&uafvl=HeadlessChrome%3B149.0.7827.55%7CChromium%3B149.0.7827.55%7CNot)A%253BBrand%3B24.0.0.0&uam=&uamb=0&uap=macOS&uapv=26.4.0&uaw=0&ul=en-us&_s=2&tag_exp=115938465~115938469~118897920~118897930~119259605~119896802&sid=1785791405&sct=1&seg=1&dl=http%3A%2F%2Flocalhost%2Fgame&dt=The%20Signature%20Games%20%E2%80%94%20Celebrity%20Signatures&en=user_engagement&_et=13112&tfd=13131 — net::ERR_ABORTED"]}
+{"run":2,"ts":"2026-08-03T21:14:49.465Z","game":"century","diff":"curator","cat":"All","selector":"#catLabel/#catOpts","label":"category-row-visibility","action":"inspect","ok":true,"effect":"catLabel=block, catOpts=flex, expected_visible=true, actual=true","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:49.659Z","game":"century","diff":"curator","cat":"All","selector":"#diffOpts .opt[data-d=\"curator\"]","label":"diff-curator","action":"click","ok":true,"effect":"selected","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:49.855Z","game":"century","diff":"curator","cat":"All","selector":"#catOpts .opt[data-c=\"All\"]","label":"cat-All","action":"click","ok":true,"effect":"selected","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:49.902Z","game":"century","diff":"curator","cat":"All","selector":"#goBtn","label":"begin-button","action":"click","ok":true,"effect":"Begin clicked","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:49.903Z","game":"century","diff":"curator","cat":"All","selector":"#play","label":"play-panel-appeared","action":"wait","ok":true,"effect":"play panel shown in 48ms","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:49.907Z","game":"century","diff":"curator","cat":"All","selector":"https://upload.wikimedia.org/wikipedia/commons/3/39/Signatur_Friedrich_de_la_Motte_Fouqu%C3%A9.PNG","label":"round-1-image","action":"inspect","ok":false,"effect":"Image broken/404: https://upload.wikimedia.org/wikipedia/commons/3/39/Signatur_Friedrich_de_la_Motte_Fouqu%C3%A9.PNG","errors":["Image 404 or broken: https://upload.wikimedia.org/wikipedia/commons/3/39/Signatur_Friedrich_de_la_Motte_Fouqu%C3%A9.PNG"]}
+{"run":2,"ts":"2026-08-03T21:14:49.907Z","game":"century","diff":"curator","cat":"All","selector":"#stage","label":"round-1-render","action":"inspect","ok":true,"effect":"stage_html_len=146, choices=4, imgs_ok=0, imgs_broken=1","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:50.369Z","game":"century","diff":"curator","cat":"All","selector":".choice","label":"round-1-pick-0","action":"click","ok":true,"effect":"Chose: \"16th century\", reveal: \"✗ Friedrich de la Motte Fouqué died 1843 (19th century) · their page →Next →\"","errors":["REQUEST_FAILED: GET https://upload.wikimedia.org/wikipedia/commons/3/39/Signatur_Friedrich_de_la_Motte_Fouqu%C3%A9.PNG — net::ERR_BLOCKED_BY_ORB"]}
+{"run":2,"ts":"2026-08-03T21:14:50.633Z","game":"century","diff":"curator","cat":"All","selector":"#nextBtn","label":"round-1-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:51.043Z","game":"century","diff":"curator","cat":"All","selector":"https://upload.wikimedia.org/wikipedia/commons/a/ad/Sarojini_Naidu_signature.png","label":"round-2-image","action":"inspect","ok":false,"effect":"Image broken/404: https://upload.wikimedia.org/wikipedia/commons/a/ad/Sarojini_Naidu_signature.png","errors":["REQUEST_FAILED: GET https://upload.wikimedia.org/wikipedia/commons/a/ad/Sarojini_Naidu_signature.png — net::ERR_BLOCKED_BY_ORB","Image 404 or broken: https://upload.wikimedia.org/wikipedia/commons/a/ad/Sarojini_Naidu_signature.png"]}
+{"run":2,"ts":"2026-08-03T21:14:51.044Z","game":"century","diff":"curator","cat":"All","selector":"#stage","label":"round-2-render","action":"inspect","ok":true,"effect":"stage_html_len=128, choices=4, imgs_ok=0, imgs_broken=2","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:51.493Z","game":"century","diff":"curator","cat":"All","selector":".choice","label":"round-2-pick-3","action":"click","ok":true,"effect":"Chose: \"18th century\", reveal: \"✗ Sarojini Naidu died 1949 (20th century) · their page →Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:51.745Z","game":"century","diff":"curator","cat":"All","selector":"#nextBtn","label":"round-2-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:52.158Z","game":"century","diff":"curator","cat":"All","selector":"https://upload.wikimedia.org/wikipedia/commons/a/a5/Ludwig_B%C3%BCchner_%281824-1899%29_%28signature%29.png","label":"round-3-image","action":"inspect","ok":false,"effect":"Image broken/404: https://upload.wikimedia.org/wikipedia/commons/a/a5/Ludwig_B%C3%BCchner_%281824-1899%29_%28signature%29.png","errors":["REQUEST_FAILED: GET https://upload.wikimedia.org/wikipedia/commons/a/a5/Ludwig_B%C3%BCchner_%281824-1899%29_%28signature%29.png — net::ERR_BLOCKED_BY_ORB","Image 404 or broken: https://upload.wikimedia.org/wikipedia/commons/a/a5/Ludwig_B%C3%BCchner_%281824-1899%29_%28signature%29.png"]}
+{"run":2,"ts":"2026-08-03T21:14:52.159Z","game":"century","diff":"curator","cat":"All","selector":"#stage","label":"round-3-render","action":"inspect","ok":true,"effect":"stage_html_len=155, choices=4, imgs_ok=0, imgs_broken=3","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:52.621Z","game":"century","diff":"curator","cat":"All","selector":".choice","label":"round-3-pick-2","action":"click","ok":true,"effect":"Chose: \"20th century\", reveal: \"✗ Ludwig Büchner died 1899 (19th century) · their page →Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:52.883Z","game":"century","diff":"curator","cat":"All","selector":"#nextBtn","label":"round-3-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:53.294Z","game":"century","diff":"curator","cat":"All","selector":"https://upload.wikimedia.org/wikipedia/commons/1/11/Fran%C3%A7ois-Joseph_Talma_signature.png","label":"round-4-image","action":"inspect","ok":false,"effect":"Image broken/404: https://upload.wikimedia.org/wikipedia/commons/1/11/Fran%C3%A7ois-Joseph_Talma_signature.png","errors":["REQUEST_FAILED: GET https://upload.wikimedia.org/wikipedia/commons/1/11/Fran%C3%A7ois-Joseph_Talma_signature.png — net::ERR_BLOCKED_BY_ORB","Image 404 or broken: https://upload.wikimedia.org/wikipedia/commons/1/11/Fran%C3%A7ois-Joseph_Talma_signature.png"]}
+{"run":2,"ts":"2026-08-03T21:14:53.295Z","game":"century","diff":"curator","cat":"All","selector":"#stage","label":"round-4-render","action":"inspect","ok":true,"effect":"stage_html_len=140, choices=4, imgs_ok=0, imgs_broken=4","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:53.743Z","game":"century","diff":"curator","cat":"All","selector":".choice","label":"round-4-pick-0","action":"click","ok":true,"effect":"Chose: \"19th century\", reveal: \"✓ Correct — François-Joseph Talma died 1826 (19th century) · their page →Next →\"","errors":["REQUEST_FAILED: POST https://www.google-analytics.com/g/collect?v=2&tid=G-2HEVP6TD0J&gtm=45je67v1v9260226174za200zd9260226174&_p=1785791688390&gcd=13l3l3l3l1l1&npa=0&dma=0&_eu=AAAAAAQ&are=1&cid=1264535497.1785791406&frm=0&ngs=1&pscdl=noapi&rcb=16&sr=1600x900&uaa=arm&uab=64&uafvl=HeadlessChrome%3B149.0.7827.55%7CChromium%3B149.0.7827.55%7CNot)A%253BBrand%3B24.0.0.0&uam=&uamb=0&uap=macOS&uapv=26.4.0&uaw=0&ul=en-us&_s=1&tag_exp=115938466~115938468~118395333~118897920~118897930~119896802&sid=1785791405&sct=1&seg=1&dl=http%3A%2F%2Flocalhost%2Fgame&dt=The%20Signature%20Games%20%E2%80%94%20Celebrity%20Signatures&en=page_view&_ee=1&tfd=5020 — net::ERR_ABORTED"]}
+{"run":2,"ts":"2026-08-03T21:14:53.995Z","game":"century","diff":"curator","cat":"All","selector":"#nextBtn","label":"round-4-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:54.401Z","game":"century","diff":"curator","cat":"All","selector":"https://upload.wikimedia.org/wikipedia/commons/0/08/Signature_%C3%89mile_Faguet_in_Les_Maitres_sonneurs_%28page_19_crop%29.jpg","label":"round-5-image","action":"inspect","ok":false,"effect":"Image broken/404: https://upload.wikimedia.org/wikipedia/commons/0/08/Signature_%C3%89mile_Faguet_in_Les_Maitres_sonneurs_%28page_19_crop%29.jpg","errors":["REQUEST_FAILED: GET https://upload.wikimedia.org/wikipedia/commons/0/08/Signature_%C3%89mile_Faguet_in_Les_Maitres_sonneurs_%28page_19_crop%29.jpg — net::ERR_BLOCKED_BY_ORB","Image 404 or broken: https://upload.wikimedia.org/wikipedia/commons/0/08/Signature_%C3%89mile_Faguet_in_Les_Maitres_sonneurs_%28page_19_crop%29.jpg"]}
+{"run":2,"ts":"2026-08-03T21:14:54.402Z","game":"century","diff":"curator","cat":"All","selector":"#stage","label":"round-5-render","action":"inspect","ok":true,"effect":"stage_html_len=174, choices=4, imgs_ok=0, imgs_broken=5","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:54.855Z","game":"century","diff":"curator","cat":"All","selector":".choice","label":"round-5-pick-3","action":"click","ok":true,"effect":"Chose: \"17th century\", reveal: \"✗ Émile Faguet died 1916 (20th century) · their page →Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:55.106Z","game":"century","diff":"curator","cat":"All","selector":"#nextBtn","label":"round-5-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:55.514Z","game":"century","diff":"curator","cat":"All","selector":"https://upload.wikimedia.org/wikipedia/commons/f/f3/William_Blackstone_signature.svg","label":"round-6-image","action":"inspect","ok":false,"effect":"Image broken/404: https://upload.wikimedia.org/wikipedia/commons/f/f3/William_Blackstone_signature.svg","errors":["REQUEST_FAILED: GET https://upload.wikimedia.org/wikipedia/commons/f/f3/William_Blackstone_signature.svg — net::ERR_BLOCKED_BY_ORB","Image 404 or broken: https://upload.wikimedia.org/wikipedia/commons/f/f3/William_Blackstone_signature.svg"]}
+{"run":2,"ts":"2026-08-03T21:14:55.514Z","game":"century","diff":"curator","cat":"All","selector":"#stage","label":"round-6-render","action":"inspect","ok":true,"effect":"stage_html_len=132, choices=4, imgs_ok=0, imgs_broken=6","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:55.967Z","game":"century","diff":"curator","cat":"All","selector":".choice","label":"round-6-pick-2","action":"click","ok":true,"effect":"Chose: \"18th century\", reveal: \"✓ Correct — William Blackstone died 1780 (18th century) · their page →Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:56.218Z","game":"century","diff":"curator","cat":"All","selector":"#nextBtn","label":"round-6-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:56.632Z","game":"century","diff":"curator","cat":"All","selector":"https://upload.wikimedia.org/wikipedia/commons/8/86/Zora_Neale_Hurston_signature.svg","label":"round-7-image","action":"inspect","ok":false,"effect":"Image broken/404: https://upload.wikimedia.org/wikipedia/commons/8/86/Zora_Neale_Hurston_signature.svg","errors":["REQUEST_FAILED: GET https://upload.wikimedia.org/wikipedia/commons/8/86/Zora_Neale_Hurston_signature.svg — net::ERR_BLOCKED_BY_ORB","Image 404 or broken: https://upload.wikimedia.org/wikipedia/commons/8/86/Zora_Neale_Hurston_signature.svg"]}
+{"run":2,"ts":"2026-08-03T21:14:56.633Z","game":"century","diff":"curator","cat":"All","selector":"#stage","label":"round-7-render","action":"inspect","ok":true,"effect":"stage_html_len=132, choices=4, imgs_ok=0, imgs_broken=7","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:57.092Z","game":"century","diff":"curator","cat":"All","selector":".choice","label":"round-7-pick-0","action":"click","ok":true,"effect":"Chose: \"20th century\", reveal: \"✓ Correct — Zora Neale Hurston died 1960 (20th century) · their page →Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:57.355Z","game":"century","diff":"curator","cat":"All","selector":"#nextBtn","label":"round-7-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:57.770Z","game":"century","diff":"curator","cat":"All","selector":"https://upload.wikimedia.org/wikipedia/commons/9/92/PGRS_2_044_Katkov_-_sign.jpg","label":"round-8-image","action":"inspect","ok":false,"effect":"Image broken/404: https://upload.wikimedia.org/wikipedia/commons/9/92/PGRS_2_044_Katkov_-_sign.jpg","errors":["REQUEST_FAILED: GET https://upload.wikimedia.org/wikipedia/commons/9/92/PGRS_2_044_Katkov_-_sign.jpg — net::ERR_BLOCKED_BY_ORB","Image 404 or broken: https://upload.wikimedia.org/wikipedia/commons/9/92/PGRS_2_044_Katkov_-_sign.jpg"]}
+{"run":2,"ts":"2026-08-03T21:14:57.771Z","game":"century","diff":"curator","cat":"All","selector":"#stage","label":"round-8-render","action":"inspect","ok":true,"effect":"stage_html_len=128, choices=4, imgs_ok=0, imgs_broken=8","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:58.228Z","game":"century","diff":"curator","cat":"All","selector":".choice","label":"round-8-pick-3","action":"click","ok":true,"effect":"Chose: \"18th century\", reveal: \"✗ Mikhail Katkov died 1887 (19th century) · their page →Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:58.481Z","game":"century","diff":"curator","cat":"All","selector":"#nextBtn","label":"round-8-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:58.895Z","game":"century","diff":"curator","cat":"All","selector":"https://upload.wikimedia.org/wikipedia/commons/e/ef/%D0%9A%D1%83%D0%B7%D0%BC%D0%B8%D0%BD_%D0%9C%D0%B8%D1%85%D0%B0%D0%B8%D0%BB_%D0%B0%D0%B2%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84.JPG","label":"round-9-image","action":"inspect","ok":false,"effect":"Image broken/404: https://upload.wikimedia.org/wikipedia/commons/e/ef/%D0%9A%D1%83%D0%B7%D0%BC%D0%B8%D0%BD_%D0%9C%D0%B8%D1%85%D0%B0%D0%B8%D0%BB_%D0%B0%D0%B2%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84.JPG","errors":["REQUEST_FAILED: GET https://upload.wikimedia.org/wikipedia/commons/e/ef/%D0%9A%D1%83%D0%B7%D0%BC%D0%B8%D0%BD_%D0%9C%D0%B8%D1%85%D0%B0%D0%B8%D0%BB_%D0%B0%D0%B2%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84.JPG — net::ERR_BLOCKED_BY_ORB","Image 404 or broken: https://upload.wikimedia.org/wikipedia/commons/e/ef/%D0%9A%D1%83%D0%B7%D0%BC%D0%B8%D0%BD_%D0%9C%D0%B8%D1%85%D0%B0%D0%B8%D0%BB_%D0%B0%D0%B2%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84.JPG"]}
+{"run":2,"ts":"2026-08-03T21:14:58.896Z","game":"century","diff":"curator","cat":"All","selector":"#stage","label":"round-9-render","action":"inspect","ok":true,"effect":"stage_html_len=226, choices=4, imgs_ok=0, imgs_broken=9","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:59.353Z","game":"century","diff":"curator","cat":"All","selector":".choice","label":"round-9-pick-2","action":"click","ok":true,"effect":"Chose: \"21st century\", reveal: \"✗ Mikhail Kuzmin died 1936 (20th century) · their page →Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:14:59.606Z","game":"century","diff":"curator","cat":"All","selector":"#nextBtn","label":"round-9-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:15:00.020Z","game":"century","diff":"curator","cat":"All","selector":"#stage","label":"round-10-render","action":"inspect","ok":true,"effect":"stage_html_len=138, choices=4, imgs_ok=1, imgs_broken=9","errors":[]}
+{"run":2,"ts":"2026-08-03T21:15:00.481Z","game":"century","diff":"curator","cat":"All","selector":".choice","label":"round-10-pick-0","action":"click","ok":true,"effect":"Chose: \"12th century\", reveal: \"✓ Correct — Emperor Gaozong of Song died 1187 (12th century) · their page →See r\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:15:00.746Z","game":"century","diff":"curator","cat":"All","selector":"#nextBtn","label":"round-10-next","action":"click","ok":true,"effect":"Next text: \"See results\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:15:01.150Z","game":"century","diff":"curator","cat":"All","selector":"#results","label":"results-screen","action":"inspect","ok":true,"effect":"score=42, verdict=\"The gallery guide is that way…\", best=\"Best (century · curator): 42\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:15:01.604Z","game":"century","diff":"curator","cat":"All","selector":"#againBtn","label":"play-again","action":"click","ok":true,"effect":"Setup panel returned: true","errors":[]}
+{"run":2,"ts":"2026-08-03T21:15:02.683Z","game":"early","diff":"curator","cat":"All","selector":"#gamePick .gcard[data-g=\"early\"]","label":"game-card-early","action":"click","ok":true,"effect":"card selected","errors":["REQUEST_FAILED: POST https://www.google-analytics.com/g/collect?v=2&tid=G-2HEVP6TD0J&gtm=45je67v1v9260226174za200zd9260226174&_p=1785791688390&gcd=13l3l3l3l1l1&npa=0&dma=0&_eu=AAAAAAQ&are=1&cid=1264535497.1785791406&frm=0&ngs=1&pscdl=noapi&rcb=16&sr=1600x900&uaa=arm&uab=64&uafvl=HeadlessChrome%3B149.0.7827.55%7CChromium%3B149.0.7827.55%7CNot)A%253BBrand%3B24.0.0.0&uam=&uamb=0&uap=macOS&uapv=26.4.0&uaw=0&ul=en-us&_s=2&tag_exp=115938466~115938468~118395333~118897920~118897930~119896802&sid=1785791405&sct=1&seg=1&dl=http%3A%2F%2Flocalhost%2Fgame&dt=The%20Signature%20Games%20%E2%80%94%20Celebrity%20Signatures&en=user_engagement&_et=13208&tfd=13228 — net::ERR_ABORTED"]}
+{"run":2,"ts":"2026-08-03T21:15:02.687Z","game":"early","diff":"curator","cat":"All","selector":"#catLabel/#catOpts","label":"category-row-visibility","action":"inspect","ok":true,"effect":"catLabel=none, catOpts=none, expected_visible=false, actual=false","errors":[]}
+{"run":2,"ts":"2026-08-03T21:15:02.881Z","game":"early","diff":"curator","cat":"All","selector":"#diffOpts .opt[data-d=\"curator\"]","label":"diff-curator","action":"click","ok":true,"effect":"selected","errors":[]}
+{"run":2,"ts":"2026-08-03T21:15:02.926Z","game":"early","diff":"curator","cat":"All","selector":"#goBtn","label":"begin-button","action":"click","ok":true,"effect":"Begin clicked","errors":[]}
+{"run":2,"ts":"2026-08-03T21:15:02.927Z","game":"early","diff":"curator","cat":"All","selector":"#play","label":"play-panel-appeared","action":"wait","ok":true,"effect":"play panel shown in 46ms","errors":[]}
+{"run":2,"ts":"2026-08-03T21:15:02.931Z","game":"early","diff":"curator","cat":"All","selector":"https://commons.wikimedia.org/wiki/Special:FilePath/Auguste%20rodin%2C%20genio%20del%20riposo%20eterno%2C%201899%20ca..JPG?width=400","label":"round-1-image","action":"inspect","ok":false,"effect":"Image broken/404: https://commons.wikimedia.org/wiki/Special:FilePath/Auguste%20rodin%2C%20genio%20del%20riposo%20eterno%2C%201899%20ca..JPG?width=400","errors":["Image 404 or broken: https://commons.wikimedia.org/wiki/Special:FilePath/Auguste%20rodin%2C%20genio%20del%20riposo%20eterno%2C%201899%20ca..JPG?width=400"]}
+{"run":2,"ts":"2026-08-03T21:15:02.933Z","game":"early","diff":"curator","cat":"All","selector":"https://commons.wikimedia.org/wiki/Special:FilePath/Auguste%20Rodin%20signature.svg?width=400","label":"round-1-image","action":"inspect","ok":false,"effect":"Image broken/404: https://commons.wikimedia.org/wiki/Special:FilePath/Auguste%20Rodin%20signature.svg?width=400","errors":["Image 404 or broken: https://commons.wikimedia.org/wiki/Special:FilePath/Auguste%20Rodin%20signature.svg?width=400"]}
+{"run":2,"ts":"2026-08-03T21:15:02.933Z","game":"early","diff":"curator","cat":"All","selector":"#stage","label":"round-1-render","action":"inspect","ok":true,"effect":"stage_html_len=475, choices=2, imgs_ok=0, imgs_broken=2","errors":[]}
+{"run":2,"ts":"2026-08-03T21:15:03.382Z","game":"early","diff":"curator","cat":"All","selector":".choice","label":"round-1-pick-0","action":"click","ok":true,"effect":"Chose: \"A is earlier\", reveal: \"✓ Correct — Auguste Rodin: A is from 1899, the other from 1903 · see the timelin\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:15:03.631Z","game":"early","diff":"curator","cat":"All","selector":"#nextBtn","label":"round-1-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:15:04.039Z","game":"early","diff":"curator","cat":"All","selector":"#stage","label":"round-2-render","action":"inspect","ok":true,"effect":"stage_html_len=454, choices=2, imgs_ok=2, imgs_broken=2","errors":[]}
+{"run":2,"ts":"2026-08-03T21:15:04.482Z","game":"early","diff":"curator","cat":"All","selector":".choice","label":"round-2-pick-1","action":"click","ok":true,"effect":"Chose: \"B is earlier\", reveal: \"✓ Correct — Sarah Bernhardt: B is from 1901, the other from 1907 · see the timel\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:15:04.746Z","game":"early","diff":"curator","cat":"All","selector":"#nextBtn","label":"round-2-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:15:05.156Z","game":"early","diff":"curator","cat":"All","selector":"#stage","label":"round-3-render","action":"inspect","ok":true,"effect":"stage_html_len=582, choices=2, imgs_ok=4, imgs_broken=2","errors":[]}
+{"run":2,"ts":"2026-08-03T21:15:05.608Z","game":"early","diff":"curator","cat":"All","selector":".choice","label":"round-3-pick-1","action":"click","ok":true,"effect":"Chose: \"B is earlier\", reveal: \"✗ Alexis Rudier: A is from 1879, the other from 2012 · see the timeline →Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:15:05.854Z","game":"early","diff":"curator","cat":"All","selector":"#nextBtn","label":"round-3-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:15:06.262Z","game":"early","diff":"curator","cat":"All","selector":"#stage","label":"round-4-render","action":"inspect","ok":true,"effect":"stage_html_len=439, choices=2, imgs_ok=6, imgs_broken=2","errors":[]}
+{"run":2,"ts":"2026-08-03T21:15:06.702Z","game":"early","diff":"curator","cat":"All","selector":".choice","label":"round-4-pick-0","action":"click","ok":true,"effect":"Chose: \"A is earlier\", reveal: \"✓ Correct — Ossip Zadkine: A is from 1943, the other from 1955 · see the timelin\"","errors":["REQUEST_FAILED: POST https://www.google-analytics.com/g/collect?v=2&tid=G-2HEVP6TD0J&gtm=45je67v1v9260226174za200zd9260226174&_p=1785791701614&gcd=13l3l3l3l1l1&npa=0&dma=0&_eu=AAAAAAQ&are=1&cid=1264535497.1785791406&frm=0&ngs=1&pscdl=noapi&rcb=12&sr=1600x900&uaa=arm&uab=64&uafvl=HeadlessChrome%3B149.0.7827.55%7CChromium%3B149.0.7827.55%7CNot)A%253BBrand%3B24.0.0.0&uam=&uamb=0&uap=macOS&uapv=26.4.0&uaw=0&ul=en-us&_s=1&tag_exp=115938466~115938469~118897920~118897930~119527019~119896803&sid=1785791405&sct=1&seg=1&dl=http%3A%2F%2Flocalhost%2Fgame&dt=The%20Signature%20Games%20%E2%80%94%20Celebrity%20Signatures&en=page_view&_ee=1&tfd=5024 — net::ERR_ABORTED"]}
+{"run":2,"ts":"2026-08-03T21:15:06.954Z","game":"early","diff":"curator","cat":"All","selector":"#nextBtn","label":"round-4-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:15:07.363Z","game":"early","diff":"curator","cat":"All","selector":"https://commons.wikimedia.org/wiki/Special:FilePath/Signature%20of%20Ernest%20Laurent%20(1904)%20(cropped).JPG?width=400","label":"round-5-image","action":"inspect","ok":false,"effect":"Image broken/404: https://commons.wikimedia.org/wiki/Special:FilePath/Signature%20of%20Ernest%20Laurent%20(1904)%20(cropped).JPG?width=400","errors":["Image 404 or broken: https://commons.wikimedia.org/wiki/Special:FilePath/Signature%20of%20Ernest%20Laurent%20(1904)%20(cropped).JPG?width=400"]}
+{"run":2,"ts":"2026-08-03T21:15:07.363Z","game":"early","diff":"curator","cat":"All","selector":"#stage","label":"round-5-render","action":"inspect","ok":true,"effect":"stage_html_len=490, choices=2, imgs_ok=7, imgs_broken=3","errors":[]}
+{"run":2,"ts":"2026-08-03T21:15:07.813Z","game":"early","diff":"curator","cat":"All","selector":".choice","label":"round-5-pick-1","action":"click","ok":true,"effect":"Chose: \"B is earlier\", reveal: \"✗ Ernest Laurent: A is from 1883, the other from 1904 · see the timeline →Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:15:08.063Z","game":"early","diff":"curator","cat":"All","selector":"#nextBtn","label":"round-5-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:15:08.474Z","game":"early","diff":"curator","cat":"All","selector":"#stage","label":"round-6-render","action":"inspect","ok":true,"effect":"stage_html_len=479, choices=2, imgs_ok=9, imgs_broken=3","errors":[]}
+{"run":2,"ts":"2026-08-03T21:15:08.924Z","game":"early","diff":"curator","cat":"All","selector":".choice","label":"round-6-pick-1","action":"click","ok":true,"effect":"Chose: \"B is earlier\", reveal: \"✓ Correct — Giovanni Bellini: B is from 1426, the other from 1510 · see the time\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:15:09.178Z","game":"early","diff":"curator","cat":"All","selector":"#nextBtn","label":"round-6-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:15:09.588Z","game":"early","diff":"curator","cat":"All","selector":"#stage","label":"round-7-render","action":"inspect","ok":true,"effect":"stage_html_len=484, choices=2, imgs_ok=11, imgs_broken=3","errors":[]}
+{"run":2,"ts":"2026-08-03T21:15:10.035Z","game":"early","diff":"curator","cat":"All","selector":".choice","label":"round-7-pick-0","action":"click","ok":true,"effect":"Chose: \"A is earlier\", reveal: \"✓ Correct — Luc-Olivier Merson: A is from 1881, the other from 1898 · see the ti\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:15:10.302Z","game":"early","diff":"curator","cat":"All","selector":"#nextBtn","label":"round-7-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:15:10.714Z","game":"early","diff":"curator","cat":"All","selector":"https://commons.wikimedia.org/wiki/Special:FilePath/RR5010-0008R%202%20%D1%80%D1%83%D0%B1%D0%BB%D1%8F%202001%20%D0%BC%D0%B5%D0%B4%D0%BD%D0%BE-%D0%BD%D0%B8%D0%BA%D0%B5%D0%BB%D0%B5%D0%B2%D1%8B%D0%B9%2040-%D0%BB%D0%B5%D1%82%D0%B8%D0%B5%20%D0%BF%D0%BE%D0%BB%D0%B5%D1%82%D0%B0%20%D0%AE.%20%D0%90.%20%D0%93%D0%B0%D0%B3%D0%B0%D1%80%D0%B8%D0%BD%D0%B0%20%D1%80%D0%B5%D0%B2%D0%B5%D1%80%D1%81.gif?width=400","label":"round-8-image","action":"inspect","ok":false,"effect":"Image broken/404: https://commons.wikimedia.org/wiki/Special:FilePath/RR5010-0008R%202%20%D1%80%D1%83%D0%B1%D0%BB%D1%8F%202001%20%D0%BC%D0%B5%D0%B4%D0%BD%D0%BE-%D0%BD%D0%B8%D0%BA%D0%B5%D0%BB%D0%B5%D0%B2%D1%8B%D0%B9%2040-%D0%BB%D0%B5%D1%82%D0%B8%D0%B5%20%D0%BF%D0%BE%D0%BB%D0%B5%D1%82%D0%B0%20%D0%AE.%20%D0%90.%20%D0%93%D0%B0%D0%B3%D0%B0%D1%80%D0%B8%D0%BD%D0%B0%20%D1%80%D0%B5%D0%B2%D0%B5%D1%80%D1%81.gif?width=400","errors":["Image 404 or broken: https://commons.wikimedia.org/wiki/Special:FilePath/RR5010-0008R%202%20%D1%80%D1%83%D0%B1%D0%BB%D1%8F%202001%20%D0%BC%D0%B5%D0%B4%D0%BD%D0%BE-%D0%BD%D0%B8%D0%BA%D0%B5%D0%BB%D0%B5%D0%B2%D1%8B%D0%B9%2040-%D0%BB%D0%B5%D1%82%D0%B8%D0%B5%20%D0%BF%D0%BE%D0%BB%D0%B5%D1%82%D0%B0%20%D0%AE.%20%D0%90.%20%D0%93%D0%B0%D0%B3%D0%B0%D1%80%D0%B8%D0%BD%D0%B0%20%D1%80%D0%B5%D0%B2%D0%B5%D1%80%D1%81.gif?width=400"]}
+{"run":2,"ts":"2026-08-03T21:15:10.717Z","game":"early","diff":"curator","cat":"All","selector":"https://commons.wikimedia.org/wiki/Special:FilePath/Yuri%20Gagarin%20Communist%20party%20ID%20card%2C%20National%20Air%20and%20Space%20Museum%2C%20April%202019.jpg?width=400","label":"round-8-image","action":"inspect","ok":false,"effect":"Image broken/404: https://commons.wikimedia.org/wiki/Special:FilePath/Yuri%20Gagarin%20Communist%20party%20ID%20card%2C%20National%20Air%20and%20Space%20Museum%2C%20April%202019.jpg?width=400","errors":["Image 404 or broken: https://commons.wikimedia.org/wiki/Special:FilePath/Yuri%20Gagarin%20Communist%20party%20ID%20card%2C%20National%20Air%20and%20Space%20Museum%2C%20April%202019.jpg?width=400"]}
+{"run":2,"ts":"2026-08-03T21:15:10.717Z","game":"early","diff":"curator","cat":"All","selector":"#stage","label":"round-8-render","action":"inspect","ok":true,"effect":"stage_html_len=818, choices=2, imgs_ok=11, imgs_broken=5","errors":[]}
+{"run":2,"ts":"2026-08-03T21:15:11.175Z","game":"early","diff":"curator","cat":"All","selector":".choice","label":"round-8-pick-1","action":"click","ok":true,"effect":"Chose: \"B is earlier\", reveal: \"✗ Yuri Gagarin: A is from 2001, the other from 2019 · see the timeline →Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:15:11.425Z","game":"early","diff":"curator","cat":"All","selector":"#nextBtn","label":"round-8-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:15:11.840Z","game":"early","diff":"curator","cat":"All","selector":"https://commons.wikimedia.org/wiki/Special:FilePath/Macchia%20nera%20I%20(Black%20Spot%20I)%20(Wassily%20Kandinsky%2C%201912)%20in%20mostra%20al%20Palazzo%20Roverella%2C%20Rovigo%2C%20aprile%202022%2003.jpg?width=400","label":"round-9-image","action":"inspect","ok":false,"effect":"Image broken/404: https://commons.wikimedia.org/wiki/Special:FilePath/Macchia%20nera%20I%20(Black%20Spot%20I)%20(Wassily%20Kandinsky%2C%201912)%20in%20mostra%20al%20Palazzo%20Roverella%2C%20Rovigo%2C%20aprile%202022%2003.jpg?width=400","errors":["Image 404 or broken: https://commons.wikimedia.org/wiki/Special:FilePath/Macchia%20nera%20I%20(Black%20Spot%20I)%20(Wassily%20Kandinsky%2C%201912)%20in%20mostra%20al%20Palazzo%20Roverella%2C%20Rovigo%2C%20aprile%202022%2003.jpg?width=400"]}
+{"run":2,"ts":"2026-08-03T21:15:11.845Z","game":"early","diff":"curator","cat":"All","selector":"#stage","label":"round-9-render","action":"inspect","ok":true,"effect":"stage_html_len=612, choices=2, imgs_ok=12, imgs_broken=6","errors":[]}
+{"run":2,"ts":"2026-08-03T21:15:12.302Z","game":"early","diff":"curator","cat":"All","selector":".choice","label":"round-9-pick-1","action":"click","ok":true,"effect":"Chose: \"B is earlier\", reveal: \"✗ Wassily Kandinsky: A is from 1912, the other from 1913 · see the timeline →Nex\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:15:12.549Z","game":"early","diff":"curator","cat":"All","selector":"#nextBtn","label":"round-9-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:15:12.966Z","game":"early","diff":"curator","cat":"All","selector":"https://commons.wikimedia.org/wiki/Special:FilePath/Luc-Olivier%20Merson%20signature%201889%20(cropped).JPG?width=400","label":"round-10-image","action":"inspect","ok":false,"effect":"Image broken/404: https://commons.wikimedia.org/wiki/Special:FilePath/Luc-Olivier%20Merson%20signature%201889%20(cropped).JPG?width=400","errors":["Image 404 or broken: https://commons.wikimedia.org/wiki/Special:FilePath/Luc-Olivier%20Merson%20signature%201889%20(cropped).JPG?width=400"]}
+{"run":2,"ts":"2026-08-03T21:15:12.967Z","game":"early","diff":"curator","cat":"All","selector":"#stage","label":"round-10-render","action":"inspect","ok":true,"effect":"stage_html_len=484, choices=2, imgs_ok=13, imgs_broken=7","errors":[]}
+{"run":2,"ts":"2026-08-03T21:15:13.424Z","game":"early","diff":"curator","cat":"All","selector":".choice","label":"round-10-pick-0","action":"click","ok":true,"effect":"Chose: \"A is earlier\", reveal: \"✓ Correct — Luc-Olivier Merson: A is from 1881, the other from 1889 · see the ti\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:15:13.677Z","game":"early","diff":"curator","cat":"All","selector":"#nextBtn","label":"round-10-next","action":"click","ok":true,"effect":"Next text: \"See results\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:15:14.086Z","game":"early","diff":"curator","cat":"All","selector":"#results","label":"results-screen","action":"inspect","ok":true,"effect":"score=64, verdict=\"A promising apprentice.\", best=\"Best (early · curator): 64\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:15:14.539Z","game":"early","diff":"curator","cat":"All","selector":"#againBtn","label":"play-again","action":"click","ok":true,"effect":"Setup panel returned: true","errors":[]}
+{"run":1,"ts":"2026-08-03T21:14:46.186Z","selector":".info-chip","label":"First card Details chip → open popup","action":"click-details","ok":false,"effect":"ERROR: locator.hover: Timeout 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('.card').first()\u001b[22m\n\u001b[2m    - locator resolved to <div class=\"card\">…</div>\u001b[22m\n\u001b[2m  - attempting hover action\u001b[22m\n\u001b","errors":["locator.hover: Timeout 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('.card').first()\u001b[22m\n\u001b[2m    - locator resolved to <div class=\"card\">…</div>\u001b[22m\n\u001b[2m  - attempting hover action\u001b[22m\n\u001b[2m    2 × waiting for element to be visible and stable\u001b[22m\n\u001b[2m      - element is not visible\u001b[22m"]}
+{"run":1,"ts":"2026-08-03T21:15:18.406Z","selector":null,"label":"Escape key closes drawer","action":"escape","ok":true,"effect":"drawerOpen:false, popOpen:false","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:19.608Z","selector":"#filtersHint","label":"☰ Categories/sort/views button","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":false,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false}}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:20.206Z","selector":"#layoutChips .chip[data-l=\"gallery\"]","label":"Layout: back to Gallery","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false}}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:20.697Z","selector":"#layoutChips .chip[data-l=\"wall\"]","label":"Layout: Wall","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"wall\",\"colsVisible\":false}}","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:23.396Z","game":"art","diff":"icons","cat":"All","selector":"#gamePick .gcard[data-g=\"art\"]","label":"game-card-art","action":"click","ok":true,"effect":"card selected","errors":["REQUEST_FAILED: POST https://www.google-analytics.com/g/collect?v=2&tid=G-2HEVP6TD0J&gtm=45je67v1v9260226174za200zd9260226174&_p=1785791722307&gcd=13l3l3l3l1l1&npa=0&dma=0&are=1&cid=777999539.1785791722&frm=0&ngs=1&pscdl=noapi&rcb=3&sr=1600x900&uaa=arm&uab=64&uafvl=HeadlessChrome%3B149.0.7827.55%7CChromium%3B149.0.7827.55%7CNot)A%253BBrand%3B24.0.0.0&uam=&uamb=0&uap=macOS&uapv=26.4.0&uaw=0&ul=en-us&_s=1&tag_exp=115616985~115938466~115938469~118897920~118897930~119896802&sid=1785791722&sct=1&seg=0&dl=http%3A%2F%2Flocalhost%2Fgame&dt=The%20Signature%20Games%20%E2%80%94%20Celebrity%20Signatures&en=page_view&_fv=1&_nsi=1&_ss=1&_ee=1&tfd=167 — net::ERR_ABORTED"]}
+{"run":3,"ts":"2026-08-03T21:15:23.400Z","game":"art","diff":"icons","cat":"All","selector":"#catLabel/#catOpts","label":"category-row-visibility","action":"inspect","ok":true,"effect":"catLabel=none, catOpts=none, expected_visible=false, actual=false","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:23.592Z","game":"art","diff":"icons","cat":"All","selector":"#diffOpts .opt[data-d=\"icons\"]","label":"diff-icons","action":"click","ok":true,"effect":"selected","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:23.636Z","game":"art","diff":"icons","cat":"All","selector":"#goBtn","label":"begin-button","action":"click","ok":true,"effect":"Begin clicked","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:22.504Z","selector":"#layoutChips .chip[data-l=\"vitrine\"]","label":"Layout: Vitrine","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"wall\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"vitrine\",\"colsVisible\":false}}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:23.954Z","selector":"#layoutChips .chip[data-l=\"ledger\"]","label":"Layout: Ledger","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"vitrine\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"ledger\",\"colsVisible\":false}}","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:25.146Z","game":"art","diff":"icons","cat":"All","selector":"#play","label":"play-panel-appeared","action":"wait","ok":true,"effect":"play panel shown in 1553ms","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:25.151Z","game":"art","diff":"icons","cat":"All","selector":"#stage","label":"round-1-render","action":"inspect","ok":true,"effect":"stage_html_len=152, choices=4, imgs_ok=1, imgs_broken=0","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:24.662Z","selector":"#layoutChips .chip[data-l=\"plaque\"]","label":"Layout: Plaque","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"ledger\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"plaque\",\"colsVisible\":false}}","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:25.590Z","game":"art","diff":"icons","cat":"All","selector":".choice","label":"round-1-pick-0","action":"click","ok":true,"effect":"Chose: \"William Morris\", reveal: \"✗ It was William Hogarth · “Burning the Rumps at Temple Bar, plate eleven from H\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:25.591Z","game":"art","diff":"icons","cat":"All","selector":"#reveal a","label":"round-1-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/184616","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:25.842Z","game":"art","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-1-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:26.248Z","game":"art","diff":"icons","cat":"All","selector":"https://www.artic.edu/iiif/2/68452725-eba5-06e3-46d2-50c678a5d672/full/600,/0/default.jpg","label":"round-2-image","action":"inspect","ok":false,"effect":"Image broken/404: https://www.artic.edu/iiif/2/68452725-eba5-06e3-46d2-50c678a5d672/full/600,/0/default.jpg","errors":["Image 404 or broken: https://www.artic.edu/iiif/2/68452725-eba5-06e3-46d2-50c678a5d672/full/600,/0/default.jpg"]}
+{"run":3,"ts":"2026-08-03T21:15:26.249Z","game":"art","diff":"icons","cat":"All","selector":"#stage","label":"round-2-render","action":"inspect","ok":true,"effect":"stage_html_len=152, choices=4, imgs_ok=1, imgs_broken=1","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:25.415Z","selector":"#layoutChips .chip[data-l=\"float\"]","label":"Layout: Float","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"plaque\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"float\",\"colsVisible\":false}}","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:26.702Z","game":"art","diff":"icons","cat":"All","selector":".choice","label":"round-2-pick-3","action":"click","ok":true,"effect":"Chose: \"Lewis Carroll\", reveal: \"✗ It was Diego Velázquez · “Kitchen Scene”, 1618–20 → · their page →Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:26.703Z","game":"art","diff":"icons","cat":"All","selector":"#reveal a","label":"round-2-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/21934","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:26.953Z","game":"art","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-2-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:26.272Z","selector":"#layoutChips .chip[data-l=\"gallery\"]","label":"Layout: Gallery","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"float\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false}}","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:27.359Z","game":"art","diff":"icons","cat":"All","selector":"#stage","label":"round-3-render","action":"inspect","ok":true,"effect":"stage_html_len=152, choices=4, imgs_ok=2, imgs_broken=1","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:27.813Z","game":"art","diff":"icons","cat":"All","selector":".choice","label":"round-3-pick-2","action":"click","ok":true,"effect":"Chose: \"Raphael\", reveal: \"✓ Correct — Raphael · “Upraised Right Hand, with Palm Facing Outward: Study for \"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:27.814Z","game":"art","diff":"icons","cat":"All","selector":"#reveal a","label":"round-3-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/114932","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:27.103Z","selector":"#catChips .chip[data-c=\"All\"]","label":"Category: back to All","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false}}","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:28.063Z","game":"art","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-3-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:28.470Z","game":"art","diff":"icons","cat":"All","selector":"#stage","label":"round-4-render","action":"inspect","ok":true,"effect":"stage_html_len=152, choices=4, imgs_ok=3, imgs_broken=1","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:27.944Z","selector":"#catChips .chip[data-c=\"Authors\"]","label":"Category: Authors","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/?cat=Authors\",\"cards\":5686,\"bodyLayout\":\"gallery\",\"colsVisible\":false}}","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:28.924Z","game":"art","diff":"icons","cat":"All","selector":".choice","label":"round-4-pick-0","action":"click","ok":true,"effect":"Chose: \"Sergei Eisenstein\", reveal: \"✗ It was Émile Zola · “L'Assommoir”, 1878 → · their page →Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:28.925Z","game":"art","diff":"icons","cat":"All","selector":"#reveal a","label":"round-4-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/69746","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:29.177Z","game":"art","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-4-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:28.741Z","selector":"#catChips .chip[data-c=\"Artists\"]","label":"Category: Artists","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/?cat=Authors\",\"cards\":5686,\"bodyLayout\":\"gallery\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/?cat=Artists\",\"cards\":1262,\"bodyLayout\":\"gallery\",\"colsVisible\":false}}","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:29.584Z","game":"art","diff":"icons","cat":"All","selector":"#stage","label":"round-5-render","action":"inspect","ok":true,"effect":"stage_html_len=152, choices=4, imgs_ok=4, imgs_broken=1","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:29.299Z","selector":"#catChips .chip[data-c=\"Politics\"]","label":"Category: Politics","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/?cat=Artists\",\"cards\":1262,\"bodyLayout\":\"gallery\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/?cat=Politics\",\"cards\":54,\"bodyLayout\":\"gallery\",\"colsVisible\":false}}","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:30.035Z","game":"art","diff":"icons","cat":"All","selector":".choice","label":"round-5-pick-3","action":"click","ok":true,"effect":"Chose: \"Ilya Repin\", reveal: \"✗ It was Henri de Toulouse-Lautrec · “At the Moulin Rouge”, 1892–95 → · their pa\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:30.036Z","game":"art","diff":"icons","cat":"All","selector":"#reveal a","label":"round-5-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/61128","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:29.780Z","selector":"#catChips .chip[data-c=\"Declaration of Independence\"]","label":"Category: Declaration","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/?cat=Politics\",\"cards\":54,\"bodyLayout\":\"gallery\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/?cat=Declaration%20of%20Independence\",\"cards\":56,\"bodyLayout\":\"gallery\",\"colsVisible\":false}}","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:30.287Z","game":"art","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-5-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:30.702Z","game":"art","diff":"icons","cat":"All","selector":"#stage","label":"round-6-render","action":"inspect","ok":true,"effect":"stage_html_len=152, choices=4, imgs_ok=5, imgs_broken=1","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:30.237Z","selector":"#catChips .chip[data-c=\"Oldest Signatures\"]","label":"Category: Oldest Signatures","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/?cat=Declaration%20of%20Independence\",\"cards\":56,\"bodyLayout\":\"gallery\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/?cat=Oldest%20Signatures\",\"cards\":18,\"bodyLayout\":\"gallery\",\"colsVisible\":false}}","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:31.162Z","game":"art","diff":"icons","cat":"All","selector":".choice","label":"round-6-pick-2","action":"click","ok":true,"effect":"Chose: \"Amedeo Modigliani\", reveal: \"✓ Correct — Amedeo Modigliani · “Caryatid”, c. 1913 → · their page →Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:31.163Z","game":"art","diff":"icons","cat":"All","selector":"#reveal a","label":"round-6-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/45254","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:31.411Z","game":"art","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-6-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:30.709Z","selector":"#catChips .chip[data-c=\"All\"]","label":"Category: All","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/?cat=Oldest%20Signatures\",\"cards\":18,\"bodyLayout\":\"gallery\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false}}","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:31.816Z","game":"art","diff":"icons","cat":"All","selector":"#stage","label":"round-7-render","action":"inspect","ok":true,"effect":"stage_html_len=152, choices=4, imgs_ok=6, imgs_broken=1","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:31.492Z","selector":"#density","label":"Density slider → 5","action":"range","value":"5","ok":true,"effect":"set to 5; --cols:5","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:32.258Z","game":"art","diff":"icons","cat":"All","selector":".choice","label":"round-7-pick-0","action":"click","ok":true,"effect":"Chose: \"Auguste Rodin\", reveal: \"✓ Correct — Auguste Rodin · “A Burgher of Calais (Jean d'Aire)”, Modeled 1889 → \"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:32.259Z","game":"art","diff":"icons","cat":"All","selector":"#reveal a","label":"round-7-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/719","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:32.512Z","game":"art","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-7-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:32.170Z","selector":"#density","label":"Density slider → 7","action":"range","value":"7","ok":true,"effect":"set to 7; --cols:7","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:32.920Z","game":"art","diff":"icons","cat":"All","selector":"#stage","label":"round-8-render","action":"inspect","ok":true,"effect":"stage_html_len=152, choices=4, imgs_ok=7, imgs_broken=1","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:33.370Z","game":"art","diff":"icons","cat":"All","selector":".choice","label":"round-8-pick-3","action":"click","ok":true,"effect":"Chose: \"Gustave Doré\", reveal: \"✗ It was Alfred Sisley · “A Turn in the Road”, 1873 → · their page →Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:33.371Z","game":"art","diff":"icons","cat":"All","selector":"#reveal a","label":"round-8-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/96559","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:32.914Z","selector":"#density","label":"Density slider → 3","action":"range","value":"3","ok":true,"effect":"set to 3; --cols:3","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:33.620Z","game":"art","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-8-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:34.025Z","game":"art","diff":"icons","cat":"All","selector":"#stage","label":"round-9-render","action":"inspect","ok":true,"effect":"stage_html_len=152, choices=4, imgs_ok=8, imgs_broken=1","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:33.619Z","selector":"#sort","label":"Sort: reset to cat","action":"select","value":"cat","ok":true,"effect":"selected cat; cards:7076","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:34.479Z","game":"art","diff":"icons","cat":"All","selector":".choice","label":"round-9-pick-2","action":"click","ok":true,"effect":"Chose: \"Gustave Doré\", reveal: \"✓ Correct — Gustave Doré · “Sir Lancelot Approaching the Castle of Astolat”, n.d\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:34.480Z","game":"art","diff":"icons","cat":"All","selector":"#reveal a","label":"round-9-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/43672","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:34.110Z","selector":"#sort","label":"Sort: Signature count","action":"select","value":"sigcount","ok":true,"effect":"selected sigcount; cards:7076","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:34.730Z","game":"art","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-9-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:34.554Z","selector":"#sort","label":"Sort: Museums","action":"select","value":"museums","ok":true,"effect":"selected museums; cards:7076","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:35.136Z","game":"art","diff":"icons","cat":"All","selector":"#stage","label":"round-10-render","action":"inspect","ok":true,"effect":"stage_html_len=152, choices=4, imgs_ok=9, imgs_broken=1","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:34.977Z","selector":"#sort","label":"Sort: Death date","action":"select","value":"death","ok":true,"effect":"selected death; cards:7076","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:35.577Z","game":"art","diff":"icons","cat":"All","selector":".choice","label":"round-10-pick-0","action":"click","ok":true,"effect":"Chose: \"Sandro Botticelli\", reveal: \"✗ It was John Ruskin · “Peacock Feather”, 1877 → · their page →See results\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:35.577Z","game":"art","diff":"icons","cat":"All","selector":"#reveal a","label":"round-10-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/44559","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:35.403Z","selector":"#sort","label":"Sort: Deceased first","action":"select","value":"deceased","ok":true,"effect":"selected deceased; cards:7076","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:35.830Z","game":"art","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-10-next","action":"click","ok":true,"effect":"Next text: \"See results\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:36.233Z","game":"art","diff":"icons","cat":"All","selector":"#results","label":"results-screen","action":"inspect","ok":true,"effect":"score=42, verdict=\"The gallery guide is that way…\", best=\"Best (art · icons): 42\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:35.822Z","selector":"#sort","label":"Sort: Living first","action":"select","value":"living","ok":true,"effect":"selected living; cards:7076","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:36.249Z","selector":"#sort","label":"Sort: License A→Z","action":"select","value":"license","ok":true,"effect":"selected license; cards:7076","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:36.689Z","game":"art","diff":"icons","cat":"All","selector":"#againBtn","label":"play-again","action":"click","ok":true,"effect":"Setup panel returned: true","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:36.678Z","selector":"#sort","label":"Sort: Risk high→low","action":"select","value":"risk-desc","ok":true,"effect":"selected risk-desc; cards:7076","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:37.145Z","selector":"#sort","label":"Sort: Risk low→high","action":"select","value":"risk","ok":true,"effect":"selected risk; cards:7076","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:37.767Z","game":"early","diff":"icons","cat":"All","selector":"#gamePick .gcard[data-g=\"early\"]","label":"game-card-early","action":"click","ok":true,"effect":"card selected","errors":["REQUEST_FAILED: POST https://www.google-analytics.com/g/collect?v=2&tid=G-2HEVP6TD0J&gtm=45je67v1v9260226174za200zd9260226174&_p=1785791722307&gcd=13l3l3l3l1l1&npa=0&dma=0&_eu=AAAAAAQ&are=1&cid=777999539.1785791722&frm=0&ngs=1&pscdl=noapi&rcb=3&sr=1600x900&uaa=arm&uab=64&uafvl=HeadlessChrome%3B149.0.7827.55%7CChromium%3B149.0.7827.55%7CNot)A%253BBrand%3B24.0.0.0&uam=&uamb=0&uap=macOS&uapv=26.4.0&uaw=0&ul=en-us&_s=2&tag_exp=115616985~115938466~115938469~118897920~118897930~119896802&sid=1785791722&sct=1&seg=1&dl=http%3A%2F%2Flocalhost%2Fgame&dt=The%20Signature%20Games%20%E2%80%94%20Celebrity%20Signatures&en=user_engagement&_et=14327&tfd=14494 — net::ERR_ABORTED"]}
+{"run":3,"ts":"2026-08-03T21:15:37.771Z","game":"early","diff":"icons","cat":"All","selector":"#catLabel/#catOpts","label":"category-row-visibility","action":"inspect","ok":true,"effect":"catLabel=none, catOpts=none, expected_visible=false, actual=false","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:37.967Z","game":"early","diff":"icons","cat":"All","selector":"#diffOpts .opt[data-d=\"icons\"]","label":"diff-icons","action":"click","ok":true,"effect":"selected","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:37.564Z","selector":"#sort","label":"Sort: Usable first","action":"select","value":"usable","ok":true,"effect":"selected usable; cards:7076","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:38.012Z","game":"early","diff":"icons","cat":"All","selector":"#goBtn","label":"begin-button","action":"click","ok":true,"effect":"Begin clicked","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:38.013Z","game":"early","diff":"icons","cat":"All","selector":"#play","label":"play-panel-appeared","action":"wait","ok":true,"effect":"play panel shown in 45ms","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:38.017Z","game":"early","diff":"icons","cat":"All","selector":"https://commons.wikimedia.org/wiki/Special:FilePath/Auguste%20Rodin's%20signature.JPG?width=400","label":"round-1-image","action":"inspect","ok":false,"effect":"Image broken/404: https://commons.wikimedia.org/wiki/Special:FilePath/Auguste%20Rodin's%20signature.JPG?width=400","errors":["Image 404 or broken: https://commons.wikimedia.org/wiki/Special:FilePath/Auguste%20Rodin's%20signature.JPG?width=400"]}
+{"run":3,"ts":"2026-08-03T21:15:38.019Z","game":"early","diff":"icons","cat":"All","selector":"https://commons.wikimedia.org/wiki/Special:FilePath/Auguste%20Rodin%20signature.svg?width=400","label":"round-1-image","action":"inspect","ok":false,"effect":"Image broken/404: https://commons.wikimedia.org/wiki/Special:FilePath/Auguste%20Rodin%20signature.svg?width=400","errors":["Image 404 or broken: https://commons.wikimedia.org/wiki/Special:FilePath/Auguste%20Rodin%20signature.svg?width=400"]}
+{"run":3,"ts":"2026-08-03T21:15:38.020Z","game":"early","diff":"icons","cat":"All","selector":"#stage","label":"round-1-render","action":"inspect","ok":true,"effect":"stage_html_len=438, choices=2, imgs_ok=0, imgs_broken=2","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:37.989Z","selector":"#sort","label":"Sort: Notability","action":"select","value":"notability","ok":true,"effect":"selected notability; cards:7076","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:38.479Z","game":"early","diff":"icons","cat":"All","selector":".choice","label":"round-1-pick-0","action":"click","ok":true,"effect":"Chose: \"A is earlier\", reveal: \"✓ Correct — Auguste Rodin: A is from 1898, the other from 1903 · see the timelin\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:38.731Z","game":"early","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-1-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:38.419Z","selector":"#sort","label":"Sort: Rank","action":"select","value":"rank","ok":true,"effect":"selected rank; cards:7076","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:39.139Z","game":"early","diff":"icons","cat":"All","selector":"#stage","label":"round-2-render","action":"inspect","ok":true,"effect":"stage_html_len=439, choices=2, imgs_ok=2, imgs_broken=2","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:38.841Z","selector":"#sort","label":"Sort: Name Z→A","action":"select","value":"name-desc","ok":true,"effect":"selected name-desc; cards:7076","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:39.577Z","game":"early","diff":"icons","cat":"All","selector":".choice","label":"round-2-pick-1","action":"click","ok":true,"effect":"Chose: \"B is earlier\", reveal: \"✓ Correct — Antoine Bourdelle: B is from 1925, the other from 1929 · see the tim\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:39.265Z","selector":"#sort","label":"Sort: Name A→Z","action":"select","value":"name","ok":true,"effect":"selected name; cards:7076","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:39.828Z","game":"early","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-2-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:39.739Z","selector":"#sort","label":"Sort: Category then rank","action":"select","value":"cat","ok":true,"effect":"selected cat; cards:7076","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:40.235Z","game":"early","diff":"icons","cat":"All","selector":"#stage","label":"round-3-render","action":"inspect","ok":true,"effect":"stage_html_len=457, choices=2, imgs_ok=4, imgs_broken=2","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:40.200Z","selector":"#useFilter","label":"Use filter: All signatures","action":"select","value":"all","ok":true,"effect":"selected all; cards:7076","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:40.675Z","game":"early","diff":"icons","cat":"All","selector":".choice","label":"round-3-pick-1","action":"click","ok":true,"effect":"Chose: \"B is earlier\", reveal: \"✗ Louis XIV of France: A is from 1693, the other from 1700 · see the timeline →N\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:40.928Z","game":"early","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-3-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:40.621Z","selector":"#useFilter","label":"Use filter: Permission needed","action":"select","value":"permission-needed","ok":true,"effect":"selected permission-needed; cards:0","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:41.335Z","game":"early","diff":"icons","cat":"All","selector":"#stage","label":"round-4-render","action":"inspect","ok":true,"effect":"stage_html_len=454, choices=2, imgs_ok=6, imgs_broken=2","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:40.968Z","selector":"#useFilter","label":"Use filter: Free to use","action":"select","value":"yes","ok":true,"effect":"selected yes; cards:7058","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:41.365Z","selector":".d-links a[href=\"/upload\"]","label":"Drawer link: Upload your signature","action":"nav-check","ok":true,"effect":"exists:true, href:/upload, text:Upload your signature","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:41.392Z","selector":".d-links a[href=\"/game\"]","label":"Drawer link: The Signature Games","action":"nav-check","ok":true,"effect":"exists:true, href:/game, text:The Signature Games","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:41.419Z","selector":".d-links a[href=\"/murals\"]","label":"Drawer link: Signature murals","action":"nav-check","ok":true,"effect":"exists:true, href:/murals, text:Signature murals","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:41.787Z","game":"early","diff":"icons","cat":"All","selector":".choice","label":"round-4-pick-0","action":"click","ok":true,"effect":"Chose: \"A is earlier\", reveal: \"✗ Sarah Bernhardt: B is from 1901, the other from 1907 · see the timeline →Next \"","errors":["REQUEST_FAILED: POST https://www.google-analytics.com/g/collect?v=2&tid=G-2HEVP6TD0J&gtm=45je67v1v9260226174za200zd9260226174&_p=1785791736696&gcd=13l3l3l3l1l1&npa=0&dma=0&_eu=AAAAAAQ&are=1&cid=777999539.1785791722&frm=0&ngs=1&pscdl=noapi&rcb=16&sr=1600x900&uaa=arm&uab=64&uafvl=HeadlessChrome%3B149.0.7827.55%7CChromium%3B149.0.7827.55%7CNot)A%253BBrand%3B24.0.0.0&uam=&uamb=0&uap=macOS&uapv=26.4.0&uaw=0&ul=en-us&_s=1&tag_exp=115938465~115938469~118897920~118897930~119527019~119896803~120222309&sid=1785791722&sct=1&seg=1&dl=http%3A%2F%2Flocalhost%2Fgame&dt=The%20Signature%20Games%20%E2%80%94%20Celebrity%20Signatures&en=page_view&_ee=1&tfd=5022 — net::ERR_ABORTED"]}
+{"run":1,"ts":"2026-08-03T21:15:41.445Z","selector":".drawer .tab[data-v=\"grid\"]","label":"Drawer tab: back to Grid","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/?use=yes\",\"cards\":7058,\"bodyLayout\":\"gallery\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/?use=yes\",\"cards\":7058,\"bodyLayout\":\"gallery\",\"colsVisible\":false}}","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:42.038Z","game":"early","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-4-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:42.448Z","game":"early","diff":"icons","cat":"All","selector":"#stage","label":"round-5-render","action":"inspect","ok":true,"effect":"stage_html_len=488, choices=2, imgs_ok=8, imgs_broken=2","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:41.950Z","selector":".drawer .tab[data-v=\"collages\"]","label":"Drawer tab: Collages","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/?use=yes\",\"cards\":7058,\"bodyLayout\":\"gallery\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/?use=yes\",\"cards\":7058,\"bodyLayout\":\"gallery\",\"colsVisible\":true}}","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:42.897Z","game":"early","diff":"icons","cat":"All","selector":".choice","label":"round-5-pick-1","action":"click","ok":true,"effect":"Chose: \"B is earlier\", reveal: \"✓ Correct — Alfred Stevens: B is from 1870, the other from 2000 · see the timeli\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:43.148Z","game":"early","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-5-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:42.464Z","selector":".drawer .tab[data-v=\"grid\"]","label":"Drawer tab: Grid","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/?use=yes\",\"cards\":7058,\"bodyLayout\":\"gallery\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/?use=yes\",\"cards\":7058,\"bodyLayout\":\"gallery\",\"colsVisible\":false}}","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:43.556Z","game":"early","diff":"icons","cat":"All","selector":"#stage","label":"round-6-render","action":"inspect","ok":true,"effect":"stage_html_len=557, choices=2, imgs_ok=10, imgs_broken=2","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:43.331Z","selector":"#dback","label":"Drawer backdrop","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/?use=yes\",\"cards\":7058,\"bodyLayout\":\"gallery\",\"colsVisible\":false},\"after\":{\"drawerOpen\":false,\"popOpen\":false,\"url\":\"http://localhost:9920/?use=yes\",\"cards\":7058,\"bodyLayout\":\"gallery\",\"colsVisible\":false}}","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:43.994Z","game":"early","diff":"icons","cat":"All","selector":".choice","label":"round-6-pick-1","action":"click","ok":true,"effect":"Chose: \"B is earlier\", reveal: \"✓ Correct — Émile Gallé: B is from 1846, the other from 1920 · see the timeline \"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:44.245Z","game":"early","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-6-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:44.652Z","game":"early","diff":"icons","cat":"All","selector":"https://commons.wikimedia.org/wiki/Special:FilePath/Danksagung%20Goethe%20an%20Loge%20Amalia%20zu%20Weimar%201830.jpg?width=400","label":"round-7-image","action":"inspect","ok":false,"effect":"Image broken/404: https://commons.wikimedia.org/wiki/Special:FilePath/Danksagung%20Goethe%20an%20Loge%20Amalia%20zu%20Weimar%201830.jpg?width=400","errors":["REQUEST_FAILED: GET https://upload.wikimedia.org/wikipedia/commons/2/25/Danksagung_Goethe_an_Loge_Amalia_zu_Weimar_1830.jpg?utm_source=commons.wikimedia.org&utm_campaign=index&utm_content=thumbnail_unscaled — net::ERR_BLOCKED_BY_ORB","Image 404 or broken: https://commons.wikimedia.org/wiki/Special:FilePath/Danksagung%20Goethe%20an%20Loge%20Amalia%20zu%20Weimar%201830.jpg?width=400"]}
+{"run":3,"ts":"2026-08-03T21:15:44.652Z","game":"early","diff":"icons","cat":"All","selector":"#stage","label":"round-7-render","action":"inspect","ok":true,"effect":"stage_html_len=491, choices=2, imgs_ok=11, imgs_broken=3","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:43.853Z","selector":"#drawerX","label":"Drawer × close","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/?use=yes\",\"cards\":7058,\"bodyLayout\":\"gallery\",\"colsVisible\":false},\"after\":{\"drawerOpen\":false,\"popOpen\":false,\"url\":\"http://localhost:9920/?use=yes\",\"cards\":7058,\"bodyLayout\":\"gallery\",\"colsVisible\":false}}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:44.752Z","selector":"a.hbtn[href=\"/game\"]","label":"Hero CTA: Play the games","action":"nav-check","ok":true,"effect":"exists:true, href:/game, text:Play the games","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:44.770Z","selector":"a.hbtn[href=\"/murals\"]","label":"Hero CTA: Order a mural","action":"nav-check","ok":true,"effect":"exists:true, href:/murals, text:Order a mural","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:45.091Z","game":"early","diff":"icons","cat":"All","selector":".choice","label":"round-7-pick-0","action":"click","ok":true,"effect":"Chose: \"A is earlier\", reveal: \"✓ Correct — Johann Wolfgang von Goethe: A is from 1821, the other from 1830 · se\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:45.343Z","game":"early","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-7-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:44.787Z","selector":"a.hbtn[href=\"#collection\"]","label":"Hero CTA: Browse the collection","action":"anchor-click","ok":true,"effect":"scrollY after: 402","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:45.751Z","game":"early","diff":"icons","cat":"All","selector":"#stage","label":"round-8-render","action":"inspect","ok":true,"effect":"stage_html_len=779, choices=2, imgs_ok=13, imgs_broken=3","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:46.189Z","game":"early","diff":"icons","cat":"All","selector":".choice","label":"round-8-pick-1","action":"click","ok":true,"effect":"Chose: \"B is earlier\", reveal: \"✗ Adolf Hitler: A is from 1937, the other from 1938 · see the timeline →Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:45.693Z","selector":"#burger","label":"Hamburger — open drawer","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":false,\"popOpen\":false,\"url\":\"http://localhost:9920/?use=yes#collection\",\"cards\":7058,\"bodyLayout\":\"gallery\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/?use=yes#collection\",\"cards\":7058,\"bodyLayout\":\"gallery\",\"colsVisible\":false}}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:46.214Z","selector":"nav.gnav a[href=\"/upload\"]","label":"Nav: Upload yours","action":"nav-check","ok":true,"effect":"exists:true, href:/upload, text:Upload yours","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:46.243Z","selector":"nav.gnav a[href=\"/game\"]","label":"Nav: Games","action":"nav-check","ok":true,"effect":"exists:true, href:/game, text:Games","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:46.274Z","selector":"nav.gnav a[href=\"/murals\"]","label":"Nav: Murals","action":"nav-check","ok":true,"effect":"exists:true, href:/murals, text:Murals","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:46.440Z","game":"early","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-8-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:46.295Z","selector":"#q","label":"Search: clear","action":"clear","ok":true,"effect":"cleared; cards:7058","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:46.848Z","game":"early","diff":"icons","cat":"All","selector":"#stage","label":"round-9-render","action":"inspect","ok":true,"effect":"stage_html_len=484, choices=2, imgs_ok=15, imgs_broken=3","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:46.622Z","selector":"#q","label":"Search: type \"xyzzy\" (no results)","action":"type","value":"xyzzy","ok":true,"effect":"typed \"xyzzy\"; cards:0, empty hidden:false","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:47.298Z","game":"early","diff":"icons","cat":"All","selector":".choice","label":"round-9-pick-1","action":"click","ok":true,"effect":"Chose: \"B is earlier\", reveal: \"✓ Correct — Luc-Olivier Merson: B is from 1889, the other from 1898 · see the ti\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:46.985Z","selector":"#q","label":"Search: type \"kahlo\"","action":"type","value":"kahlo","ok":true,"effect":"typed \"kahlo\"; cards:1, empty hidden:true","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:47.551Z","game":"early","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-9-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:47.342Z","selector":"#q","label":"Search: type \"monet\"","action":"type","value":"monet","ok":true,"effect":"typed \"monet\"; cards:1, empty hidden:true","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:47.699Z","selector":"a.logo","label":"Logo link (home)","action":"nav-check","ok":true,"effect":"exists:true, href:/, text:","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:47.958Z","game":"early","diff":"icons","cat":"All","selector":"#stage","label":"round-10-render","action":"inspect","ok":true,"effect":"stage_html_len=520, choices=2, imgs_ok=17, imgs_broken=3","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:48.410Z","game":"early","diff":"icons","cat":"All","selector":".choice","label":"round-10-pick-0","action":"click","ok":true,"effect":"Chose: \"A is earlier\", reveal: \"✓ Correct — Giovanni Boldini: A is from 1842, the other from 1872 · see the time\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:48.662Z","game":"early","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-10-next","action":"click","ok":true,"effect":"Next text: \"See results\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:49.066Z","game":"early","diff":"icons","cat":"All","selector":"#results","label":"results-screen","action":"inspect","ok":true,"effect":"score=80, verdict=\"A promising apprentice.\", best=\"Best (early · icons): 80\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:49.522Z","game":"early","diff":"icons","cat":"All","selector":"#againBtn","label":"play-again","action":"click","ok":true,"effect":"Setup panel returned: true","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:50.600Z","game":"century","diff":"icons","cat":"Politics","selector":"#gamePick .gcard[data-g=\"century\"]","label":"game-card-century","action":"click","ok":true,"effect":"card selected","errors":["REQUEST_FAILED: POST https://www.google-analytics.com/g/collect?v=2&tid=G-2HEVP6TD0J&gtm=45je67v1v9260226174za200zd9260226174&_p=1785791736696&gcd=13l3l3l3l1l1&npa=0&dma=0&_eu=AAAAAAQ&are=1&cid=777999539.1785791722&frm=0&ngs=1&pscdl=noapi&rcb=16&sr=1600x900&uaa=arm&uab=64&uafvl=HeadlessChrome%3B149.0.7827.55%7CChromium%3B149.0.7827.55%7CNot)A%253BBrand%3B24.0.0.0&uam=&uamb=0&uap=macOS&uapv=26.4.0&uaw=0&ul=en-us&_s=2&tag_exp=115938465~115938469~118897920~118897930~119527019~119896803~120222309&sid=1785791722&sct=1&seg=1&dl=http%3A%2F%2Flocalhost%2Fgame&dt=The%20Signature%20Games%20%E2%80%94%20Celebrity%20Signatures&en=user_engagement&_et=12817&tfd=12839 — net::ERR_ABORTED"]}
+{"run":3,"ts":"2026-08-03T21:15:50.604Z","game":"century","diff":"icons","cat":"Politics","selector":"#catLabel/#catOpts","label":"category-row-visibility","action":"inspect","ok":true,"effect":"catLabel=block, catOpts=flex, expected_visible=true, actual=true","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:50.668Z","selector":"#artistPop","label":"Popup deep: structure check","action":"inspect","ok":true,"effect":"{\"popOpen\":true,\"artistName\":\"Claude Monet\",\"ctaHref\":\"/murals?name=Claude%20Monet\",\"sigNaturalW\":475,\"life\":\"† 1926 · Painter in the permanent collections of Metropolitan Museum of Art, Art Institute of Chicago, Rijksmuseum, Museum of Modern Art, Musée d'Orsay, National Gallery, National Gallery of Art, Los Angeles County Museum of Art, San Francisco Museum of Modern Art, Philadelphia Museum of Art, J. Paul Getty Museum, Cleveland Museum of Art, Solomon R. Guggenheim Museum, Museum of Fine Arts Boston; cross-wiki notability: 153 language Wikipedias\",\"hasTags\":1,\"hasBadge\":1,\"hasEvo\":false,\"hasMuralCta\":true}","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:50.670Z","selector":".ap-sig img","label":"Popup sig img: HTTP check","action":"check-img","ok":true,"effect":"src=https://upload.wikimedia.org/wikipedia/commons/0/0b/Claude_Monet_Signature.svg, ok=true","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:50.801Z","game":"century","diff":"icons","cat":"Politics","selector":"#diffOpts .opt[data-d=\"icons\"]","label":"diff-icons","action":"click","ok":true,"effect":"selected","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:50.996Z","game":"century","diff":"icons","cat":"Politics","selector":"#catOpts .opt[data-c=\"Politics\"]","label":"cat-Politics","action":"click","ok":true,"effect":"selected","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:51.039Z","game":"century","diff":"icons","cat":"Politics","selector":"#goBtn","label":"begin-button","action":"click","ok":true,"effect":"Begin clicked","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:51.040Z","game":"century","diff":"icons","cat":"Politics","selector":"#play","label":"play-panel-appeared","action":"wait","ok":true,"effect":"play panel shown in 44ms","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:51.044Z","game":"century","diff":"icons","cat":"Politics","selector":"https://upload.wikimedia.org/wikipedia/commons/3/31/Franklin_Roosevelt_Signature.svg","label":"round-1-image","action":"inspect","ok":false,"effect":"Image broken/404: https://upload.wikimedia.org/wikipedia/commons/3/31/Franklin_Roosevelt_Signature.svg","errors":["Image 404 or broken: https://upload.wikimedia.org/wikipedia/commons/3/31/Franklin_Roosevelt_Signature.svg"]}
+{"run":3,"ts":"2026-08-03T21:15:51.044Z","game":"century","diff":"icons","cat":"Politics","selector":"#stage","label":"round-1-render","action":"inspect","ok":true,"effect":"stage_html_len=132, choices=4, imgs_ok=0, imgs_broken=1","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:51.495Z","game":"century","diff":"icons","cat":"Politics","selector":".choice","label":"round-1-pick-0","action":"click","ok":true,"effect":"Chose: \"19th century\", reveal: \"✗ Franklin Delano Roosevelt died 1945 (20th century) · their page →Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:51.749Z","game":"century","diff":"icons","cat":"Politics","selector":"#nextBtn","label":"round-1-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:52.164Z","game":"century","diff":"icons","cat":"Politics","selector":"#stage","label":"round-2-render","action":"inspect","ok":true,"effect":"stage_html_len=134, choices=4, imgs_ok=1, imgs_broken=1","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:52.623Z","game":"century","diff":"icons","cat":"Politics","selector":".choice","label":"round-2-pick-3","action":"click","ok":true,"effect":"Chose: \"17th century\", reveal: \"✗ Theodore Roosevelt died 1919 (20th century) · their page →Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:52.872Z","game":"century","diff":"icons","cat":"Politics","selector":"#nextBtn","label":"round-2-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:53.279Z","game":"century","diff":"icons","cat":"Politics","selector":"#stage","label":"round-3-render","action":"inspect","ok":true,"effect":"stage_html_len=189, choices=4, imgs_ok=2, imgs_broken=1","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:53.718Z","game":"century","diff":"icons","cat":"Politics","selector":".choice","label":"round-3-pick-2","action":"click","ok":true,"effect":"Chose: \"16th century\", reveal: \"✗ Thomas Hobbes died 1679 (17th century) · their page →Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:53.970Z","game":"century","diff":"icons","cat":"Politics","selector":"#nextBtn","label":"round-3-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:54.379Z","game":"century","diff":"icons","cat":"Politics","selector":"#stage","label":"round-4-render","action":"inspect","ok":true,"effect":"stage_html_len=132, choices=4, imgs_ok=3, imgs_broken=1","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:54.673Z","selector":"#apWorks","label":"Popup works: loaded after 4s","action":"check-works","ok":true,"effect":"works:6, brokenImgs:0, text:Water Lilies · 1906 · Art Institute of ChicagoArrival of the Normandy Train, Gare Saint-Lazare · 187","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:54.674Z","selector":"#apBody a[href*=\"wikidata\"]","label":"Popup: Wikidata link","action":"check-link","ok":true,"effect":"href:https://www.wikidata.org/wiki/Q296","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:54.831Z","game":"century","diff":"icons","cat":"Politics","selector":".choice","label":"round-4-pick-0","action":"click","ok":true,"effect":"Chose: \"18th century\", reveal: \"✗ Nikita Khrushchev died 1971 (20th century) · their page →Next →\"","errors":["REQUEST_FAILED: POST https://www.google-analytics.com/g/collect?v=2&tid=G-2HEVP6TD0J&gtm=45je67v1v9260226174za200zd9260226174&_p=1785791749531&gcd=13l3l3l3l1l1&npa=0&dma=0&_eu=AAAAAAQ&are=1&cid=777999539.1785791722&frm=0&ngs=1&pscdl=noapi&rcb=0&sr=1600x900&uaa=arm&uab=64&uafvl=HeadlessChrome%3B149.0.7827.55%7CChromium%3B149.0.7827.55%7CNot)A%253BBrand%3B24.0.0.0&uam=&uamb=0&uap=macOS&uapv=26.4.0&uaw=0&ul=en-us&_s=1&tag_exp=115938466~115938468~118897920~118897930~119896802&sid=1785791722&sct=1&seg=1&dl=http%3A%2F%2Flocalhost%2Fgame&dt=The%20Signature%20Games%20%E2%80%94%20Celebrity%20Signatures&en=page_view&_ee=1&tfd=5018 — net::ERR_ABORTED"]}
+{"run":1,"ts":"2026-08-03T21:15:54.994Z","selector":".ap-x","label":"Popup × close (deep test)","action":"click","ok":true,"effect":"hidden:true","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:55.079Z","game":"century","diff":"icons","cat":"Politics","selector":"#nextBtn","label":"round-4-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:55.486Z","game":"century","diff":"icons","cat":"Politics","selector":"#stage","label":"round-5-render","action":"inspect","ok":true,"effect":"stage_html_len=120, choices=4, imgs_ok=4, imgs_broken=1","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:55.942Z","game":"century","diff":"icons","cat":"Politics","selector":".choice","label":"round-5-pick-3","action":"click","ok":true,"effect":"Chose: \"14th century\", reveal: \"✓ Correct — Geoffrey Chaucer died 1400 (14th century) · their page →Next →\"","errors":[]}
+{"run":1,"ts":"2026-08-03T21:15:55.979Z","selector":"#collagesView","label":"Collages: content","action":"check","ok":true,"effect":"{\"collageCount\":5,\"collageImgs\":5,\"collageNotes\":0,\"downloadLinks\":[\"/output/collage-oldest-signatures.png\",\"/output/collage-declaration-of-independence.png\",\"/output/collage-politics.png\",\"/output/collage-artists.png\",\"/output/collage-authors.png\"],\"notBuilt\":[]}","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:56.191Z","game":"century","diff":"icons","cat":"Politics","selector":"#nextBtn","label":"round-5-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:56.599Z","game":"century","diff":"icons","cat":"Politics","selector":"#stage","label":"round-6-render","action":"inspect","ok":true,"effect":"stage_html_len=122, choices=4, imgs_ok=5, imgs_broken=1","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:57.051Z","game":"century","diff":"icons","cat":"Politics","selector":".choice","label":"round-6-pick-2","action":"click","ok":true,"effect":"Chose: \"16th century\", reveal: \"✗ Pablo Neruda died 1973 (20th century) · their page →Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:57.302Z","game":"century","diff":"icons","cat":"Politics","selector":"#nextBtn","label":"round-6-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:57.712Z","game":"century","diff":"icons","cat":"Politics","selector":"#stage","label":"round-7-render","action":"inspect","ok":true,"effect":"stage_html_len=125, choices=4, imgs_ok=6, imgs_broken=1","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:58.163Z","game":"century","diff":"icons","cat":"Politics","selector":".choice","label":"round-7-pick-0","action":"click","ok":true,"effect":"Chose: \"19th century\", reveal: \"✓ Correct — Victor Hugo died 1885 (19th century) · their page →Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:58.414Z","game":"century","diff":"icons","cat":"Politics","selector":"#nextBtn","label":"round-7-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:58.823Z","game":"century","diff":"icons","cat":"Politics","selector":"#stage","label":"round-8-render","action":"inspect","ok":true,"effect":"stage_html_len=131, choices=4, imgs_ok=7, imgs_broken=1","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:59.275Z","game":"century","diff":"icons","cat":"Politics","selector":".choice","label":"round-8-pick-3","action":"click","ok":true,"effect":"Chose: \"17th century\", reveal: \"✗ John Quincy Adams died 1848 (19th century) · their page →Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:59.524Z","game":"century","diff":"icons","cat":"Politics","selector":"#nextBtn","label":"round-8-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:15:59.934Z","game":"century","diff":"icons","cat":"Politics","selector":"#stage","label":"round-9-render","action":"inspect","ok":true,"effect":"stage_html_len=127, choices=4, imgs_ok=8, imgs_broken=1","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:00.385Z","game":"century","diff":"icons","cat":"Politics","selector":".choice","label":"round-9-pick-2","action":"click","ok":true,"effect":"Chose: \"19th century\", reveal: \"✗ Francis Bacon died 1626 (17th century) · their page →Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:00.635Z","game":"century","diff":"icons","cat":"Politics","selector":"#nextBtn","label":"round-9-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:01.040Z","game":"century","diff":"icons","cat":"Politics","selector":"#stage","label":"round-10-render","action":"inspect","ok":true,"effect":"stage_html_len=141, choices=4, imgs_ok=9, imgs_broken=1","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:01.341Z","selector":"/api/signatures","label":"API: /api/signatures","action":"fetch","ok":true,"effect":"{\"ok\":true,\"count\":7076,\"status\":200}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:01.349Z","selector":"/api/signature-evolution","label":"API: /api/signature-evolution","action":"fetch","ok":true,"effect":"{\"ok\":true,\"keys\":162,\"status\":200}","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:01.495Z","game":"century","diff":"icons","cat":"Politics","selector":".choice","label":"round-10-pick-0","action":"click","ok":true,"effect":"Chose: \"18th century\", reveal: \"✗ Adolf Hitler died 1945 (20th century) · their page →See results\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:01.747Z","game":"century","diff":"icons","cat":"Politics","selector":"#nextBtn","label":"round-10-next","action":"click","ok":true,"effect":"Next text: \"See results\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:02.151Z","game":"century","diff":"icons","cat":"Politics","selector":"#results","label":"results-screen","action":"inspect","ok":true,"effect":"score=20, verdict=\"Everyone starts somewhere.\", best=\"Best (century · icons): 20\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:02.309Z","selector":"#layoutChips .chip[data-l=\"gallery\"]","label":"Layout: Gallery","action":"click","ok":true,"effect":"body[data-layout]=gallery, cards=7076","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:02.606Z","game":"century","diff":"icons","cat":"Politics","selector":"#againBtn","label":"play-again","action":"click","ok":true,"effect":"Setup panel returned: true","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:03.018Z","selector":"#layoutChips .chip[data-l=\"float\"]","label":"Layout: Float","action":"click","ok":true,"effect":"body[data-layout]=float, cards=7076","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:03.685Z","game":"whose","diff":"icons","cat":"Artists","selector":"#gamePick .gcard[data-g=\"whose\"]","label":"game-card-whose","action":"click","ok":true,"effect":"card selected","errors":["REQUEST_FAILED: POST https://www.google-analytics.com/g/collect?v=2&tid=G-2HEVP6TD0J&gtm=45je67v1v9260226174za200zd9260226174&_p=1785791749531&gcd=13l3l3l3l1l1&npa=0&dma=0&_eu=AAAAAAQ&are=1&cid=777999539.1785791722&frm=0&ngs=1&pscdl=noapi&rcb=0&sr=1600x900&uaa=arm&uab=64&uafvl=HeadlessChrome%3B149.0.7827.55%7CChromium%3B149.0.7827.55%7CNot)A%253BBrand%3B24.0.0.0&uam=&uamb=0&uap=macOS&uapv=26.4.0&uaw=0&ul=en-us&_s=2&tag_exp=115938466~115938468~118897920~118897930~119896802&sid=1785791722&sct=1&seg=1&dl=http%3A%2F%2Flocalhost%2Fgame&dt=The%20Signature%20Games%20%E2%80%94%20Celebrity%20Signatures&en=user_engagement&_et=13068&tfd=13087 — net::ERR_ABORTED"]}
+{"run":3,"ts":"2026-08-03T21:16:03.688Z","game":"whose","diff":"icons","cat":"Artists","selector":"#catLabel/#catOpts","label":"category-row-visibility","action":"inspect","ok":true,"effect":"catLabel=block, catOpts=flex, expected_visible=true, actual=true","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:03.886Z","game":"whose","diff":"icons","cat":"Artists","selector":"#diffOpts .opt[data-d=\"icons\"]","label":"diff-icons","action":"click","ok":true,"effect":"selected","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:03.890Z","selector":"#layoutChips .chip[data-l=\"plaque\"]","label":"Layout: Plaque","action":"click","ok":true,"effect":"body[data-layout]=plaque, cards=7076","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:04.079Z","game":"whose","diff":"icons","cat":"Artists","selector":"#catOpts .opt[data-c=\"Artists\"]","label":"cat-Artists","action":"click","ok":true,"effect":"selected","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:04.124Z","game":"whose","diff":"icons","cat":"Artists","selector":"#goBtn","label":"begin-button","action":"click","ok":true,"effect":"Begin clicked","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:04.125Z","game":"whose","diff":"icons","cat":"Artists","selector":"#play","label":"play-panel-appeared","action":"wait","ok":true,"effect":"play panel shown in 46ms","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:04.128Z","game":"whose","diff":"icons","cat":"Artists","selector":"https://upload.wikimedia.org/wikipedia/commons/5/5c/John_Ruskin_signature_1880.svg","label":"round-1-image","action":"inspect","ok":false,"effect":"Image broken/404: https://upload.wikimedia.org/wikipedia/commons/5/5c/John_Ruskin_signature_1880.svg","errors":["Image 404 or broken: https://upload.wikimedia.org/wikipedia/commons/5/5c/John_Ruskin_signature_1880.svg"]}
+{"run":3,"ts":"2026-08-03T21:16:04.128Z","game":"whose","diff":"icons","cat":"Artists","selector":"#stage","label":"round-1-render","action":"inspect","ok":true,"effect":"stage_html_len=130, choices=4, imgs_ok=0, imgs_broken=1","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:04.536Z","selector":"#layoutChips .chip[data-l=\"ledger\"]","label":"Layout: Ledger","action":"click","ok":true,"effect":"body[data-layout]=ledger, cards=7076","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:04.579Z","game":"whose","diff":"icons","cat":"Artists","selector":".choice","label":"round-1-pick-0","action":"click","ok":true,"effect":"Chose: \"Auguste Rodin\", reveal: \"✗ It was John Ruskin · their page →Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:04.830Z","game":"whose","diff":"icons","cat":"Artists","selector":"#nextBtn","label":"round-1-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:05.098Z","selector":"#layoutChips .chip[data-l=\"vitrine\"]","label":"Layout: Vitrine","action":"click","ok":true,"effect":"body[data-layout]=vitrine, cards=7076","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:05.235Z","game":"whose","diff":"icons","cat":"Artists","selector":"#stage","label":"round-2-render","action":"inspect","ok":true,"effect":"stage_html_len=132, choices=4, imgs_ok=1, imgs_broken=1","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:05.690Z","game":"whose","diff":"icons","cat":"Artists","selector":".choice","label":"round-2-pick-3","action":"click","ok":true,"effect":"Chose: \"Albrecht Dürer\", reveal: \"✓ Correct — Albrecht Dürer · their page →Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:05.942Z","game":"whose","diff":"icons","cat":"Artists","selector":"#nextBtn","label":"round-2-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:06.348Z","game":"whose","diff":"icons","cat":"Artists","selector":"#stage","label":"round-3-render","action":"inspect","ok":true,"effect":"stage_html_len=137, choices=4, imgs_ok=2, imgs_broken=1","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:06.801Z","game":"whose","diff":"icons","cat":"Artists","selector":".choice","label":"round-3-pick-2","action":"click","ok":true,"effect":"Chose: \"Édouard Manet\", reveal: \"✗ It was Gustav Klimt · their page →Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:07.052Z","game":"whose","diff":"icons","cat":"Artists","selector":"#nextBtn","label":"round-3-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:07.458Z","game":"whose","diff":"icons","cat":"Artists","selector":"#stage","label":"round-4-render","action":"inspect","ok":true,"effect":"stage_html_len=141, choices=4, imgs_ok=3, imgs_broken=1","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:07.913Z","game":"whose","diff":"icons","cat":"Artists","selector":".choice","label":"round-4-pick-0","action":"click","ok":true,"effect":"Chose: \"Anthony van Dyck\", reveal: \"✗ It was Stéphane Mallarmé · their page →Next →\"","errors":["REQUEST_FAILED: POST https://www.google-analytics.com/g/collect?v=2&tid=G-2HEVP6TD0J&gtm=45je67v1v9260226174za200zd9260226174&_p=1785791762613&gcd=13l3l3l3l1l1&npa=0&dma=0&_eu=AAAAAAQ&are=1&cid=777999539.1785791722&frm=0&ngs=1&pscdl=noapi&rcb=3&sr=1600x900&uaa=arm&uab=64&uafvl=HeadlessChrome%3B149.0.7827.55%7CChromium%3B149.0.7827.55%7CNot)A%253BBrand%3B24.0.0.0&uam=&uamb=0&uap=macOS&uapv=26.4.0&uaw=0&ul=en-us&_s=1&tag_exp=115616985~115938465~115938469~118897920~118897930~119896803&sid=1785791722&sct=1&seg=1&dl=http%3A%2F%2Flocalhost%2Fgame&dt=The%20Signature%20Games%20%E2%80%94%20Celebrity%20Signatures&en=page_view&_ee=1&tfd=5019 — net::ERR_ABORTED"]}
+{"run":2,"ts":"2026-08-03T21:16:08.124Z","selector":"#layoutChips .chip[data-l=\"wall\"]","label":"Layout: Wall","action":"click","ok":true,"effect":"body[data-layout]=wall, cards=7076","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:08.164Z","game":"whose","diff":"icons","cat":"Artists","selector":"#nextBtn","label":"round-4-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:08.570Z","game":"whose","diff":"icons","cat":"Artists","selector":"#stage","label":"round-5-render","action":"inspect","ok":true,"effect":"stage_html_len=126, choices=4, imgs_ok=4, imgs_broken=1","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:09.023Z","game":"whose","diff":"icons","cat":"Artists","selector":".choice","label":"round-5-pick-3","action":"click","ok":true,"effect":"Chose: \"Artemisia Gentileschi\", reveal: \"✗ It was Gustave Doré · their page →Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:09.275Z","game":"whose","diff":"icons","cat":"Artists","selector":"#nextBtn","label":"round-5-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:09.681Z","game":"whose","diff":"icons","cat":"Artists","selector":"#stage","label":"round-6-render","action":"inspect","ok":true,"effect":"stage_html_len=121, choices=4, imgs_ok=5, imgs_broken=1","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:10.134Z","game":"whose","diff":"icons","cat":"Artists","selector":".choice","label":"round-6-pick-2","action":"click","ok":true,"effect":"Chose: \"Edgar Degas\", reveal: \"✗ It was Paul Cézanne · their page →Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:09.051Z","selector":"#density","label":"Density slider → 3","action":"range","value":"3","ok":true,"effect":"set to 3; --cols:3","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:10.385Z","game":"whose","diff":"icons","cat":"Artists","selector":"#nextBtn","label":"round-6-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:10.793Z","game":"whose","diff":"icons","cat":"Artists","selector":"#stage","label":"round-7-render","action":"inspect","ok":true,"effect":"stage_html_len=124, choices=4, imgs_ok=6, imgs_broken=1","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:10.209Z","selector":"#density","label":"Density slider → 7","action":"range","value":"7","ok":true,"effect":"set to 7; --cols:7","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:11.246Z","game":"whose","diff":"icons","cat":"Artists","selector":".choice","label":"round-7-pick-0","action":"click","ok":true,"effect":"Chose: \"Caravaggio\", reveal: \"✓ Correct — Caravaggio · their page →Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:11.497Z","game":"whose","diff":"icons","cat":"Artists","selector":"#nextBtn","label":"round-7-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:10.980Z","selector":"#density","label":"Density slider → 5","action":"range","value":"5","ok":true,"effect":"set to 5; --cols:5","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:11.741Z","selector":"a.logo","label":"Logo link (home)","action":"nav-check","ok":true,"effect":"exists:true, href:/, text:","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:11.903Z","game":"whose","diff":"icons","cat":"Artists","selector":"#stage","label":"round-8-render","action":"inspect","ok":true,"effect":"stage_html_len=135, choices=4, imgs_ok=7, imgs_broken=1","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:11.777Z","selector":"#q","label":"Search: type \"monet\"","action":"type","value":"monet","ok":true,"effect":"typed \"monet\"; cards:1, empty hidden:true","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:12.357Z","game":"whose","diff":"icons","cat":"Artists","selector":".choice","label":"round-8-pick-3","action":"click","ok":true,"effect":"Chose: \"Rembrandt\", reveal: \"✗ It was Katsushika Hokusai · their page →Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:12.160Z","selector":"#q","label":"Search: type \"kahlo\"","action":"type","value":"kahlo","ok":true,"effect":"typed \"kahlo\"; cards:1, empty hidden:true","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:12.608Z","game":"whose","diff":"icons","cat":"Artists","selector":"#nextBtn","label":"round-8-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:12.517Z","selector":"#q","label":"Search: type \"xyzzy\" (no results)","action":"type","value":"xyzzy","ok":true,"effect":"typed \"xyzzy\"; cards:0, empty hidden:false","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:13.013Z","game":"whose","diff":"icons","cat":"Artists","selector":"#stage","label":"round-9-render","action":"inspect","ok":true,"effect":"stage_html_len=129, choices=4, imgs_ok=8, imgs_broken=1","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:12.875Z","selector":"#q","label":"Search: clear","action":"clear","ok":true,"effect":"cleared; cards:7076","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:13.362Z","selector":"nav.gnav a[href=\"/murals\"]","label":"Nav: Murals","action":"nav-check","ok":true,"effect":"exists:true, href:/murals, text:Murals","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:13.391Z","selector":"nav.gnav a[href=\"/game\"]","label":"Nav: Games","action":"nav-check","ok":true,"effect":"exists:true, href:/game, text:Games","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:13.469Z","game":"whose","diff":"icons","cat":"Artists","selector":".choice","label":"round-9-pick-2","action":"click","ok":true,"effect":"Chose: \"Johannes Vermeer\", reveal: \"✗ It was Jackson Pollock · their page →Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:13.456Z","selector":"nav.gnav a[href=\"/upload\"]","label":"Nav: Upload yours","action":"nav-check","ok":true,"effect":"exists:true, href:/upload, text:Upload yours","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:13.719Z","game":"whose","diff":"icons","cat":"Artists","selector":"#nextBtn","label":"round-9-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:14.124Z","game":"whose","diff":"icons","cat":"Artists","selector":"#stage","label":"round-10-render","action":"inspect","ok":true,"effect":"stage_html_len=126, choices=4, imgs_ok=9, imgs_broken=1","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:14.580Z","game":"whose","diff":"icons","cat":"Artists","selector":".choice","label":"round-10-pick-0","action":"click","ok":true,"effect":"Chose: \"G. K. Chesterton\", reveal: \"✗ It was Jean Cocteau · their page →See results\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:14.831Z","game":"whose","diff":"icons","cat":"Artists","selector":"#nextBtn","label":"round-10-next","action":"click","ok":true,"effect":"Next text: \"See results\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:15.238Z","game":"whose","diff":"icons","cat":"Artists","selector":"#results","label":"results-screen","action":"inspect","ok":true,"effect":"score=20, verdict=\"Everyone starts somewhere.\", best=\"Best (whose · icons): 20\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:15.692Z","game":"whose","diff":"icons","cat":"Artists","selector":"#againBtn","label":"play-again","action":"click","ok":true,"effect":"Setup panel returned: true","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:13.498Z","selector":"#burger","label":"Hamburger — open drawer","action":"click","ok":false,"effect":"ERROR: locator.click: Timeout 3000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('#burger').first()\u001b[22m\n\u001b[2m    - locator resolved to <button id=\"burger\" class=\"burger\" aria-expanded=\"true\" aria-label=\"","errors":["locator.click: Timeout 3000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('#burger').first()\u001b[22m\n\u001b[2m    - locator resolved to <button id=\"burger\" class=\"burger\" aria-expanded=\"true\" aria-label=\"Open menu\">…</button>\u001b[22m\n\u001b[2m  - attempting click action\u001b[22m\n\u001b[2m    2 × waiting for element to b"]}
+{"run":3,"ts":"2026-08-03T21:16:16.769Z","game":"lightning","diff":"icons","cat":"All","selector":"#gamePick .gcard[data-g=\"lightning\"]","label":"game-card-lightning","action":"click","ok":true,"effect":"card selected","errors":["REQUEST_FAILED: POST https://www.google-analytics.com/g/collect?v=2&tid=G-2HEVP6TD0J&gtm=45je67v1v9260226174za200zd9260226174&_p=1785791762613&gcd=13l3l3l3l1l1&npa=0&dma=0&_eu=AAAAAAQ&are=1&cid=777999539.1785791722&frm=0&ngs=1&pscdl=noapi&rcb=3&sr=1600x900&uaa=arm&uab=64&uafvl=HeadlessChrome%3B149.0.7827.55%7CChromium%3B149.0.7827.55%7CNot)A%253BBrand%3B24.0.0.0&uam=&uamb=0&uap=macOS&uapv=26.4.0&uaw=0&ul=en-us&_s=2&tag_exp=115616985~115938465~115938469~118897920~118897930~119896803&sid=1785791722&sct=1&seg=1&dl=http%3A%2F%2Flocalhost%2Fgame&dt=The%20Signature%20Games%20%E2%80%94%20Celebrity%20Signatures&en=user_engagement&_et=13070&tfd=13090 — net::ERR_ABORTED"]}
+{"run":3,"ts":"2026-08-03T21:16:16.773Z","game":"lightning","diff":"icons","cat":"All","selector":"#catLabel/#catOpts","label":"category-row-visibility","action":"inspect","ok":true,"effect":"catLabel=none, catOpts=none, expected_visible=false, actual=false","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:16.970Z","game":"lightning","diff":"icons","cat":"All","selector":"#diffOpts .opt[data-d=\"icons\"]","label":"diff-icons","action":"click","ok":true,"effect":"selected","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:17.012Z","game":"lightning","diff":"icons","cat":"All","selector":"#goBtn","label":"begin-button","action":"click","ok":true,"effect":"Begin clicked","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:18.019Z","game":"lightning","diff":"icons","cat":"All","selector":"#play","label":"play-panel-appeared","action":"wait","ok":true,"effect":"play panel shown in 1049ms","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:18.024Z","game":"lightning","diff":"icons","cat":"All","selector":"https://www.artic.edu/iiif/2/cb34b0a8-bc51-d063-aab1-47c7debf3a7b/full/600,/0/default.jpg","label":"round-1-image","action":"inspect","ok":false,"effect":"Image broken/404: https://www.artic.edu/iiif/2/cb34b0a8-bc51-d063-aab1-47c7debf3a7b/full/600,/0/default.jpg","errors":["Image 404 or broken: https://www.artic.edu/iiif/2/cb34b0a8-bc51-d063-aab1-47c7debf3a7b/full/600,/0/default.jpg"]}
+{"run":3,"ts":"2026-08-03T21:16:18.026Z","game":"lightning","diff":"icons","cat":"All","selector":"#timerbar","label":"round-1-timer","action":"inspect","ok":true,"effect":"Timer bar visible, fill class: tb-fill run","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:16.568Z","selector":"a.hbtn[href=\"#collection\"]","label":"Hero CTA: Browse the collection","action":"anchor-click","ok":false,"effect":"ERROR: locator.click: Timeout 3000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('a.hbtn[href=\"#collection\"]').first()\u001b[22m\n\u001b[2m    - locator resolved to <a class=\"hbtn\" href=\"#collection\">Browse the col","errors":["locator.click: Timeout 3000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('a.hbtn[href=\"#collection\"]').first()\u001b[22m\n\u001b[2m    - locator resolved to <a class=\"hbtn\" href=\"#collection\">Browse the collection</a>\u001b[22m\n\u001b[2m  - attempting click action\u001b[22m\n\u001b[2m    2 × waiting for element to be visible,"]}
+{"run":2,"ts":"2026-08-03T21:16:19.595Z","selector":"a.hbtn[href=\"/murals\"]","label":"Hero CTA: Order a mural","action":"nav-check","ok":true,"effect":"exists:true, href:/murals, text:Order a mural","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:19.624Z","selector":"a.hbtn[href=\"/game\"]","label":"Hero CTA: Play the games","action":"nav-check","ok":true,"effect":"exists:true, href:/game, text:Play the games","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:19.646Z","selector":"#drawerX","label":"Drawer × close","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false},\"after\":{\"drawerOpen\":false,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false}}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:20.192Z","selector":"#dback","label":"Drawer backdrop","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false},\"after\":{\"drawerOpen\":false,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false}}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:21.208Z","selector":".drawer .tab[data-v=\"grid\"]","label":"Drawer tab: Grid","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false}}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:22.118Z","selector":".drawer .tab[data-v=\"collages\"]","label":"Drawer tab: Collages","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":true}}","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:23.528Z","game":"lightning","diff":"icons","cat":"All","selector":"#reveal","label":"round-1-timer-out","action":"wait","ok":true,"effect":"Reveal after timeout: \"⏱ Time! Artist: Edgar DegasNext →\"","errors":["REQUEST_FAILED: POST https://www.google-analytics.com/g/collect?v=2&tid=G-2HEVP6TD0J&gtm=45je67v1v9260226174za200zd9260226174&_p=1785791775699&gcd=13l3l3l3l1l1&npa=0&dma=0&_eu=AAAAAAQ&are=1&cid=777999539.1785791722&frm=0&ngs=1&pscdl=noapi&rcb=18&sr=1600x900&uaa=arm&uab=64&uafvl=HeadlessChrome%3B149.0.7827.55%7CChromium%3B149.0.7827.55%7CNot)A%253BBrand%3B24.0.0.0&uam=&uamb=0&uap=macOS&uapv=26.4.0&uaw=0&ul=en-us&_s=1&tag_exp=115938466~115938468~118897920~118897930~119896802~120125304&sid=1785791722&sct=1&seg=1&dl=http%3A%2F%2Flocalhost%2Fgame&dt=The%20Signature%20Games%20%E2%80%94%20Celebrity%20Signatures&en=page_view&_ee=1&tfd=5016 — net::ERR_ABORTED"]}
+{"run":3,"ts":"2026-08-03T21:16:23.530Z","game":"lightning","diff":"icons","cat":"All","selector":".choice","label":"round-1-choices-disabled","action":"inspect","ok":true,"effect":"Choices disabled after timeout: true","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:23.530Z","game":"lightning","diff":"icons","cat":"All","selector":"#stage","label":"round-1-render","action":"inspect","ok":true,"effect":"stage_html_len=193, choices=4, imgs_ok=0, imgs_broken=1","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:22.630Z","selector":".drawer .tab[data-v=\"grid\"]","label":"Drawer tab: back to Grid","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false}}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:23.559Z","selector":".d-links a[href=\"/murals\"]","label":"Drawer link: Signature murals","action":"nav-check","ok":true,"effect":"exists:true, href:/murals, text:Signature murals","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:23.588Z","selector":".d-links a[href=\"/game\"]","label":"Drawer link: The Signature Games","action":"nav-check","ok":true,"effect":"exists:true, href:/game, text:The Signature Games","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:23.612Z","selector":".d-links a[href=\"/upload\"]","label":"Drawer link: Upload your signature","action":"nav-check","ok":true,"effect":"exists:true, href:/upload, text:Upload your signature","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:23.860Z","game":"lightning","diff":"icons","cat":"All","selector":"#timerbar","label":"round-2-timer","action":"inspect","ok":true,"effect":"Timer bar visible, fill class: tb-fill run","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:23.861Z","game":"lightning","diff":"icons","cat":"All","selector":"#stage","label":"round-2-render","action":"inspect","ok":true,"effect":"stage_html_len=195, choices=4, imgs_ok=1, imgs_broken=1","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:23.639Z","selector":"#useFilter","label":"Use filter: Free to use","action":"select","value":"yes","ok":true,"effect":"selected yes; cards:7058","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:24.317Z","game":"lightning","diff":"icons","cat":"All","selector":".choice","label":"round-2-pick-3","action":"click","ok":true,"effect":"Chose: \"The Assumption of the Virgin\", reveal: \"✗ Painting: Ballet at the Paris Opéra · see it →Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:24.317Z","game":"lightning","diff":"icons","cat":"All","selector":"#reveal a","label":"round-2-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/61603","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:24.074Z","selector":"#useFilter","label":"Use filter: Permission needed","action":"select","value":"permission-needed","ok":true,"effect":"selected permission-needed; cards:0","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:24.567Z","game":"lightning","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-2-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:24.420Z","selector":"#useFilter","label":"Use filter: All signatures","action":"select","value":"all","ok":true,"effect":"selected all; cards:7076","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:24.974Z","game":"lightning","diff":"icons","cat":"All","selector":"#timerbar","label":"round-3-timer","action":"inspect","ok":true,"effect":"Timer bar visible, fill class: tb-fill run","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:24.975Z","game":"lightning","diff":"icons","cat":"All","selector":"#stage","label":"round-3-render","action":"inspect","ok":true,"effect":"stage_html_len=193, choices=4, imgs_ok=2, imgs_broken=1","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:24.825Z","selector":"#sort","label":"Sort: Category then rank","action":"select","value":"cat","ok":true,"effect":"selected cat; cards:7076","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:25.428Z","game":"lightning","diff":"icons","cat":"All","selector":".choice","label":"round-3-pick-2","action":"click","ok":true,"effect":"Chose: \"Michelangelo\", reveal: \"✗ Artist: Diego VelázquezNext →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:25.254Z","selector":"#sort","label":"Sort: Name A→Z","action":"select","value":"name","ok":true,"effect":"selected name; cards:7076","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:25.717Z","selector":"#sort","label":"Sort: Name Z→A","action":"select","value":"name-desc","ok":true,"effect":"selected name-desc; cards:7076","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:26.298Z","selector":"#sort","label":"Sort: Rank","action":"select","value":"rank","ok":true,"effect":"selected rank; cards:7076","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:26.804Z","selector":"#sort","label":"Sort: Notability","action":"select","value":"notability","ok":true,"effect":"selected notability; cards:7076","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:27.309Z","selector":"#sort","label":"Sort: Usable first","action":"select","value":"usable","ok":true,"effect":"selected usable; cards:7076","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:27.764Z","selector":"#sort","label":"Sort: Risk low→high","action":"select","value":"risk","ok":true,"effect":"selected risk; cards:7076","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:28.188Z","selector":"#sort","label":"Sort: Risk high→low","action":"select","value":"risk-desc","ok":true,"effect":"selected risk-desc; cards:7076","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:28.642Z","selector":"#sort","label":"Sort: License A→Z","action":"select","value":"license","ok":true,"effect":"selected license; cards:7076","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:29.155Z","selector":"#sort","label":"Sort: Living first","action":"select","value":"living","ok":true,"effect":"selected living; cards:7076","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:29.621Z","selector":"#sort","label":"Sort: Deceased first","action":"select","value":"deceased","ok":true,"effect":"selected deceased; cards:7076","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:30.074Z","selector":"#sort","label":"Sort: Death date","action":"select","value":"death","ok":true,"effect":"selected death; cards:7076","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:30.529Z","selector":"#sort","label":"Sort: Museums","action":"select","value":"museums","ok":true,"effect":"selected museums; cards:7076","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:31.074Z","selector":"#sort","label":"Sort: Signature count","action":"select","value":"sigcount","ok":true,"effect":"selected sigcount; cards:7076","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:31.586Z","selector":"#sort","label":"Sort: reset to cat","action":"select","value":"cat","ok":true,"effect":"selected cat; cards:7076","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:32.026Z","selector":"#catChips .chip[data-c=\"All\"]","label":"Category: All","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false}}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:32.870Z","selector":"#catChips .chip[data-c=\"Oldest Signatures\"]","label":"Category: Oldest Signatures","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/?cat=Oldest%20Signatures\",\"cards\":18,\"bodyLayout\":\"gallery\",\"colsVisible\":false}}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:33.409Z","selector":"#catChips .chip[data-c=\"Declaration of Independence\"]","label":"Category: Declaration","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/?cat=Oldest%20Signatures\",\"cards\":18,\"bodyLayout\":\"gallery\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/?cat=Declaration%20of%20Independence\",\"cards\":56,\"bodyLayout\":\"gallery\",\"colsVisible\":false}}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:33.865Z","selector":"#catChips .chip[data-c=\"Politics\"]","label":"Category: Politics","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/?cat=Declaration%20of%20Independence\",\"cards\":56,\"bodyLayout\":\"gallery\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/?cat=Politics\",\"cards\":54,\"bodyLayout\":\"gallery\",\"colsVisible\":false}}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:34.329Z","selector":"#catChips .chip[data-c=\"Artists\"]","label":"Category: Artists","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/?cat=Politics\",\"cards\":54,\"bodyLayout\":\"gallery\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/?cat=Artists\",\"cards\":1262,\"bodyLayout\":\"gallery\",\"colsVisible\":false}}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:34.865Z","selector":"#catChips .chip[data-c=\"Authors\"]","label":"Category: Authors","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/?cat=Artists\",\"cards\":1262,\"bodyLayout\":\"gallery\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/?cat=Authors\",\"cards\":5686,\"bodyLayout\":\"gallery\",\"colsVisible\":false}}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:35.600Z","selector":"#catChips .chip[data-c=\"All\"]","label":"Category: back to All","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/?cat=Authors\",\"cards\":5686,\"bodyLayout\":\"gallery\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false}}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:36.475Z","selector":"#layoutChips .chip[data-l=\"gallery\"]","label":"Layout: Gallery","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false}}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:37.004Z","selector":"#layoutChips .chip[data-l=\"float\"]","label":"Layout: Float","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"float\",\"colsVisible\":false}}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:37.770Z","selector":"#layoutChips .chip[data-l=\"plaque\"]","label":"Layout: Plaque","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"float\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"plaque\",\"colsVisible\":false}}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:38.654Z","selector":"#layoutChips .chip[data-l=\"ledger\"]","label":"Layout: Ledger","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"plaque\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"ledger\",\"colsVisible\":false}}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:39.456Z","selector":"#layoutChips .chip[data-l=\"vitrine\"]","label":"Layout: Vitrine","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"ledger\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"vitrine\",\"colsVisible\":false}}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:40.205Z","selector":"#layoutChips .chip[data-l=\"wall\"]","label":"Layout: Wall","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"vitrine\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"wall\",\"colsVisible\":false}}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:41.831Z","selector":"#layoutChips .chip[data-l=\"gallery\"]","label":"Layout: back to Gallery","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"wall\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false}}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:42.578Z","selector":"#filtersHint","label":"☰ Categories/sort/views button","action":"click","ok":false,"effect":"ERROR: locator.click: Timeout 3000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('#filtersHint').first()\u001b[22m\n\u001b[2m    - locator resolved to <button id=\"filtersHint\" class=\"filters-hint\">☰ Categories, sor","errors":["locator.click: Timeout 3000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('#filtersHint').first()\u001b[22m\n\u001b[2m    - locator resolved to <button id=\"filtersHint\" class=\"filters-hint\">☰ Categories, sort & views</button>\u001b[22m\n\u001b[2m  - attempting click action\u001b[22m\n\u001b[2m    2 × waiting for element to be v"]}
+{"run":2,"ts":"2026-08-03T21:16:45.610Z","selector":null,"label":"Escape key closes drawer","action":"escape","ok":true,"effect":"drawerOpen:false, popOpen:false","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:45.969Z","selector":".info-chip","label":"First card Details chip → open popup","action":"click-details","ok":true,"effect":"popOpen:true, artist:GAR.AMA (Uruk scribe)","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:47.315Z","selector":".ap-x","label":"Artist popup × close","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":false,\"popOpen\":true,\"url\":\"http://localhost:9920/?artist=lexical-list-oldest-autograph-ms-2494-4\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false},\"after\":{\"drawerOpen\":false,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false}}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:47.854Z","selector":".info-chip","label":"Re-open artist popup (backdrop close)","action":"click-details","ok":true,"effect":"popOpen:true, artist:GAR.AMA (Uruk scribe)","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:49.177Z","selector":".ap-back","label":"Artist popup backdrop close","action":"click","ok":false,"effect":"ERROR: locator.click: Timeout 3000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('.ap-back').first()\u001b[22m\n\u001b[2m    - locator resolved to <div class=\"ap-back\"></div>\u001b[22m\n\u001b[2m  - attempting click action\u001b[2","errors":["locator.click: Timeout 3000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('.ap-back').first()\u001b[22m\n\u001b[2m    - locator resolved to <div class=\"ap-back\"></div>\u001b[22m\n\u001b[2m  - attempting click action\u001b[22m\n\u001b[2m    2 × waiting for element to be visible, enabled and stable\u001b[22m\n\u001b[2m      - element is vis"]}
+{"run":3,"ts":"2026-08-03T21:16:55.430Z","game":"lightning","diff":"icons","cat":"All","selector":"#reveal a","label":"round-3-reveal-link","action":"inspect","ok":false,"effect":"No reveal link found after pick","errors":["Missing reveal link in lightning round 3"]}
+{"run":3,"ts":"2026-08-03T21:16:55.679Z","game":"lightning","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-3-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:56.086Z","game":"lightning","diff":"icons","cat":"All","selector":"#timerbar","label":"round-4-timer","action":"inspect","ok":true,"effect":"Timer bar visible, fill class: tb-fill run","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:56.086Z","game":"lightning","diff":"icons","cat":"All","selector":"#stage","label":"round-4-render","action":"inspect","ok":true,"effect":"stage_html_len=195, choices=4, imgs_ok=3, imgs_broken=1","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:56.539Z","game":"lightning","diff":"icons","cat":"All","selector":".choice","label":"round-4-pick-0","action":"click","ok":true,"effect":"Chose: \"Moses\", reveal: \"✗ Painting: Portrait of Philip IV · see it →Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:56.540Z","game":"lightning","diff":"icons","cat":"All","selector":"#reveal a","label":"round-4-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/41211","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:56.791Z","game":"lightning","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-4-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:57.196Z","game":"lightning","diff":"icons","cat":"All","selector":"#timerbar","label":"round-5-timer","action":"inspect","ok":true,"effect":"Timer bar visible, fill class: tb-fill run","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:57.197Z","game":"lightning","diff":"icons","cat":"All","selector":"#stage","label":"round-5-render","action":"inspect","ok":true,"effect":"stage_html_len=193, choices=4, imgs_ok=4, imgs_broken=1","errors":[]}
+{"run":3,"ts":"2026-08-03T21:16:57.650Z","game":"lightning","diff":"icons","cat":"All","selector":".choice","label":"round-5-pick-3","action":"click","ok":true,"effect":"Chose: \"Frank Lloyd Wright\", reveal: \"✗ Artist: El GrecoNext →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:16:52.222Z","selector":".info-chip","label":"Re-open artist popup (escape close)","action":"click-details","ok":false,"effect":"ERROR: locator.hover: Timeout 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('.card').first()\u001b[22m\n\u001b[2m    - locator resolved to <div class=\"card\">…</div>\u001b[22m\n\u001b[2m  - attempting hover action\u001b[22m\n\u001b","errors":["locator.hover: Timeout 30000ms exceeded.\nCall log:\n\u001b[2m  - waiting for locator('.card').first()\u001b[22m\n\u001b[2m    - locator resolved to <div class=\"card\">…</div>\u001b[22m\n\u001b[2m  - attempting hover action\u001b[22m\n\u001b[2m    2 × waiting for element to be visible and stable\u001b[22m\n\u001b[2m      - element is visible and stab"]}
+{"run":2,"ts":"2026-08-03T21:17:22.479Z","selector":null,"label":"Escape key closes artist popup","action":"escape","ok":true,"effect":"drawerOpen:false, popOpen:false","errors":[]}
+{"run":2,"ts":"2026-08-03T21:17:22.838Z","selector":".drawer .tab[data-v=\"collages\"]","label":"Collages tab: switch + check","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":true}}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:17:23.791Z","selector":".drawer .tab[data-v=\"grid\"]","label":"Collages → Grid: switch back","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false}}","errors":[]}
+{"run":3,"ts":"2026-08-03T21:17:27.651Z","game":"lightning","diff":"icons","cat":"All","selector":"#reveal a","label":"round-5-reveal-link","action":"inspect","ok":false,"effect":"No reveal link found after pick","errors":["Missing reveal link in lightning round 5"]}
+{"run":3,"ts":"2026-08-03T21:17:27.906Z","game":"lightning","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-5-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:17:28.089Z","selector":"#artistPop","label":"Popup deep: structure check","action":"inspect","ok":true,"effect":"{\"popOpen\":true,\"artistName\":\"GAR.AMA (Uruk scribe)\",\"ctaHref\":\"/murals?name=GAR.AMA%20(Uruk%20scribe)\",\"sigNaturalW\":468,\"life\":\"† c. 3100 BCE · Cited by the Schøyen Collection as the earliest extant autograph signature — a named scribe signing a lexical list.\",\"hasTags\":1,\"hasBadge\":1,\"hasEvo\":false,\"hasMuralCta\":true}","errors":[]}
+{"run":2,"ts":"2026-08-03T21:17:28.091Z","selector":".ap-sig img","label":"Popup sig img: HTTP check","action":"check-img","ok":false,"effect":"src=https://images.metmuseum.org/CRDImages/an/web-large/DP293243.jpg, ok=false","errors":[]}
+{"run":3,"ts":"2026-08-03T21:17:28.312Z","game":"lightning","diff":"icons","cat":"All","selector":"#timerbar","label":"round-6-timer","action":"inspect","ok":true,"effect":"Timer bar visible, fill class: tb-fill run","errors":[]}
+{"run":3,"ts":"2026-08-03T21:17:28.312Z","game":"lightning","diff":"icons","cat":"All","selector":"#stage","label":"round-6-render","action":"inspect","ok":true,"effect":"stage_html_len=195, choices=4, imgs_ok=5, imgs_broken=1","errors":[]}
+{"run":3,"ts":"2026-08-03T21:17:28.763Z","game":"lightning","diff":"icons","cat":"All","selector":".choice","label":"round-6-pick-2","action":"click","ok":true,"effect":"Chose: \"Self-Portrait in a Fur Cap\", reveal: \"✗ Painting: The Assumption of the Virgin · see it →Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:17:28.764Z","game":"lightning","diff":"icons","cat":"All","selector":"#reveal a","label":"round-6-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/87479","errors":[]}
+{"run":3,"ts":"2026-08-03T21:17:29.015Z","game":"lightning","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-6-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:17:29.420Z","game":"lightning","diff":"icons","cat":"All","selector":"#timerbar","label":"round-7-timer","action":"inspect","ok":true,"effect":"Timer bar visible, fill class: tb-fill run","errors":[]}
+{"run":3,"ts":"2026-08-03T21:17:29.421Z","game":"lightning","diff":"icons","cat":"All","selector":"#stage","label":"round-7-render","action":"inspect","ok":true,"effect":"stage_html_len=193, choices=4, imgs_ok=6, imgs_broken=1","errors":[]}
+{"run":3,"ts":"2026-08-03T21:17:29.874Z","game":"lightning","diff":"icons","cat":"All","selector":".choice","label":"round-7-pick-0","action":"click","ok":true,"effect":"Chose: \"Diego Velázquez\", reveal: \"✗ Artist: Sandro BotticelliNext →\"","errors":[]}
+{"run":2,"ts":"2026-08-03T21:17:32.094Z","selector":"#apWorks","label":"Popup works: loaded after 4s","action":"check-works","ok":true,"effect":"works:1, brokenImgs:0, text:no openly-licensed works found in the open museum APIs — see Wikidata","errors":["console.error: Access to fetch at 'https://images.metmuseum.org/CRDImages/an/web-large/DP293243.jpg' from origin 'http://localhost:9920' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.","console.error: Failed to load resource: net::ERR_FAILED"]}
+{"run":2,"ts":"2026-08-03T21:17:32.099Z","selector":"#apBody a[href*=\"wikidata\"]","label":"Popup: Wikidata link","action":"check-link","ok":false,"effect":"href:undefined","errors":[]}
+{"run":2,"ts":"2026-08-03T21:17:32.486Z","selector":".ap-x","label":"Popup × close (deep test)","action":"click","ok":true,"effect":"hidden:true","errors":[]}
+{"run":2,"ts":"2026-08-03T21:17:33.623Z","selector":"#collagesView","label":"Collages: content","action":"check","ok":true,"effect":"{\"collageCount\":5,\"collageImgs\":5,\"collageNotes\":0,\"downloadLinks\":[\"/output/collage-oldest-signatures.png\",\"/output/collage-declaration-of-independence.png\",\"/output/collage-politics.png\",\"/output/collage-artists.png\",\"/output/collage-authors.png\"],\"notBuilt\":[]}","errors":[]}
+{"run":3,"ts":"2026-08-03T21:17:38.022Z","selector":"/api/signatures","label":"API: /api/signatures","action":"fetch","ok":true,"effect":"{\"ok\":true,\"count\":7076,\"status\":200}","errors":[]}
+{"run":3,"ts":"2026-08-03T21:17:38.031Z","selector":"/api/signature-evolution","label":"API: /api/signature-evolution","action":"fetch","ok":true,"effect":"{\"ok\":true,\"keys\":162,\"status\":200}","errors":[]}
+{"run":3,"ts":"2026-08-03T21:17:38.981Z","selector":"#layoutChips .chip[data-l=\"gallery\"]","label":"Layout: Gallery","action":"click","ok":true,"effect":"body[data-layout]=gallery, cards=7076","errors":[]}
+{"run":3,"ts":"2026-08-03T21:17:39.586Z","selector":"#layoutChips .chip[data-l=\"float\"]","label":"Layout: Float","action":"click","ok":true,"effect":"body[data-layout]=float, cards=7076","errors":[]}
+{"run":3,"ts":"2026-08-03T21:17:40.412Z","selector":"#layoutChips .chip[data-l=\"plaque\"]","label":"Layout: Plaque","action":"click","ok":true,"effect":"body[data-layout]=plaque, cards=7076","errors":[]}
+{"run":3,"ts":"2026-08-03T21:17:41.022Z","selector":"#layoutChips .chip[data-l=\"ledger\"]","label":"Layout: Ledger","action":"click","ok":true,"effect":"body[data-layout]=ledger, cards=7076","errors":[]}
+{"run":3,"ts":"2026-08-03T21:17:41.583Z","selector":"#layoutChips .chip[data-l=\"vitrine\"]","label":"Layout: Vitrine","action":"click","ok":true,"effect":"body[data-layout]=vitrine, cards=7076","errors":[]}
+{"run":3,"ts":"2026-08-03T21:17:44.441Z","selector":"#layoutChips .chip[data-l=\"wall\"]","label":"Layout: Wall","action":"click","ok":true,"effect":"body[data-layout]=wall, cards=7076","errors":[]}
+{"run":3,"ts":"2026-08-03T21:17:45.352Z","selector":"#layoutChips .chip[data-l=\"wall\"]","label":"Layout: Wall","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"wall\",\"colsVisible\":false}}","errors":[]}
+{"run":3,"ts":"2026-08-03T21:17:47.425Z","selector":".drawer .tab[data-v=\"collages\"]","label":"Collages tab: switch + check","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"wall\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"wall\",\"colsVisible\":true}}","errors":[]}
+{"run":3,"ts":"2026-08-03T21:17:48.227Z","selector":"#drawerX","label":"Drawer × close","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"wall\",\"colsVisible\":false},\"after\":{\"drawerOpen\":false,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"wall\",\"colsVisible\":false}}","errors":[]}
+{"run":3,"ts":"2026-08-03T21:17:50.972Z","selector":"#layoutChips .chip[data-l=\"plaque\"]","label":"Layout: Plaque","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"wall\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"plaque\",\"colsVisible\":false}}","errors":[]}
+{"run":3,"ts":"2026-08-03T21:17:53.638Z","selector":"#layoutChips .chip[data-l=\"gallery\"]","label":"Layout: back to Gallery","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"plaque\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false}}","errors":[]}
+{"run":3,"ts":"2026-08-03T21:17:54.339Z","selector":null,"label":"Escape key closes artist popup","action":"escape","ok":true,"effect":"drawerOpen:false, popOpen:false","errors":[]}
+{"run":3,"ts":"2026-08-03T21:17:54.694Z","selector":".drawer .tab[data-v=\"collages\"]","label":"Drawer tab: Collages","action":"click","ok":true,"effect":"{\"before\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":false},\"after\":{\"drawerOpen\":true,\"popOpen\":false,\"url\":\"http://localhost:9920/\",\"cards\":7076,\"bodyLayout\":\"gallery\",\"colsVisible\":true}}","errors":[]}
+{"run":3,"ts":"2026-08-03T21:17:59.823Z","game":"lightning","diff":"icons","cat":"All","selector":"#reveal a","label":"round-7-reveal-link","action":"inspect","ok":false,"effect":"No reveal link found after pick","errors":["Missing reveal link in lightning round 7"]}
+{"run":3,"ts":"2026-08-03T21:18:00.074Z","game":"lightning","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-7-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:18:00.481Z","game":"lightning","diff":"icons","cat":"All","selector":"#timerbar","label":"round-8-timer","action":"inspect","ok":true,"effect":"Timer bar visible, fill class: tb-fill run","errors":[]}
+{"run":3,"ts":"2026-08-03T21:18:00.482Z","game":"lightning","diff":"icons","cat":"All","selector":"#stage","label":"round-8-render","action":"inspect","ok":true,"effect":"stage_html_len=195, choices=4, imgs_ok=7, imgs_broken=1","errors":[]}
+{"run":3,"ts":"2026-08-03T21:18:00.934Z","game":"lightning","diff":"icons","cat":"All","selector":".choice","label":"round-8-pick-3","action":"click","ok":true,"effect":"Chose: \"The Bull\", reveal: \"✗ Painting: Portrait Bust of a Young Man · see it →Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:18:00.935Z","game":"lightning","diff":"icons","cat":"All","selector":"#reveal a","label":"round-8-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/85117","errors":[]}
+{"run":3,"ts":"2026-08-03T21:18:01.186Z","game":"lightning","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-8-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:18:01.593Z","game":"lightning","diff":"icons","cat":"All","selector":"#timerbar","label":"round-9-timer","action":"inspect","ok":true,"effect":"Timer bar visible, fill class: tb-fill run","errors":[]}
+{"run":3,"ts":"2026-08-03T21:18:01.594Z","game":"lightning","diff":"icons","cat":"All","selector":"#stage","label":"round-9-render","action":"inspect","ok":true,"effect":"stage_html_len=193, choices=4, imgs_ok=8, imgs_broken=1","errors":[]}
+{"run":3,"ts":"2026-08-03T21:18:02.046Z","game":"lightning","diff":"icons","cat":"All","selector":".choice","label":"round-9-pick-2","action":"click","ok":true,"effect":"Chose: \"Franz Marc\", reveal: \"✗ Artist: Frank Lloyd WrightNext →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:17:55.662Z","selector":".info-chip","label":"Re-open artist popup (backdrop close)","action":"click-details","ok":false,"effect":"ERROR: locator.hover: Target page, context or browser has been closed\nCall log:\n\u001b[2m  - waiting for locator('.card').first()\u001b[22m\n\u001b[2m    - locator resolved to <div class=\"card\">…</div>\u001b[22m\n\u001b[2m  - attempti","errors":["locator.hover: Target page, context or browser has been closed\nCall log:\n\u001b[2m  - waiting for locator('.card').first()\u001b[22m\n\u001b[2m    - locator resolved to <div class=\"card\">…</div>\u001b[22m\n\u001b[2m  - attempting hover action\u001b[22m\n\u001b[2m    2 × waiting for element to be visible and stable\u001b[22m\n\u001b[2m      - eleme"]}
+{"run":3,"ts":"2026-08-03T21:18:09.814Z","selector":"#useFilter","label":"Use filter: Free to use","action":"select","value":"yes","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.814Z","selector":"#burger","label":"Hamburger — open drawer","action":"click","ok":false,"effect":"ERROR: locator.count: Target page, context or browser has been closed","errors":["locator.count: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.815Z","selector":"#sort","label":"Sort: Risk low→high","action":"select","value":"risk","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.815Z","selector":"#sort","label":"Sort: Usable first","action":"select","value":"usable","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.815Z","selector":"#layoutChips .chip[data-l=\"vitrine\"]","label":"Layout: Vitrine","action":"click","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.816Z","selector":"#sort","label":"Sort: Name Z→A","action":"select","value":"name-desc","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.816Z","selector":"#q","label":"Search: type \"xyzzy\" (no results)","action":"type","value":"xyzzy","ok":false,"effect":"ERROR: locator.fill: Target page, context or browser has been closed","errors":["locator.fill: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.816Z","selector":"#catChips .chip[data-c=\"All\"]","label":"Category: back to All","action":"click","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.816Z","selector":".info-chip","label":"Re-open artist popup (escape close)","action":"click-details","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.816Z","selector":"#catChips .chip[data-c=\"Oldest Signatures\"]","label":"Category: Oldest Signatures","action":"click","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.817Z","selector":".drawer .tab[data-v=\"grid\"]","label":"Drawer tab: Grid","action":"click","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.817Z","selector":".ap-back","label":"Artist popup backdrop close","action":"click","ok":false,"effect":"ERROR: locator.count: Target page, context or browser has been closed","errors":["locator.count: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.817Z","selector":"a.hbtn[href=\"#collection\"]","label":"Hero CTA: Browse the collection","action":"anchor-click","ok":false,"effect":"ERROR: locator.count: Target page, context or browser has been closed","errors":["locator.count: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.817Z","selector":null,"label":"Escape key closes drawer","action":"escape","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.817Z","selector":"#sort","label":"Sort: Museums","action":"select","value":"museums","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.817Z","selector":"#catChips .chip[data-c=\"All\"]","label":"Category: All","action":"click","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.817Z","selector":"#layoutChips .chip[data-l=\"ledger\"]","label":"Layout: Ledger","action":"click","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.818Z","selector":"#sort","label":"Sort: Deceased first","action":"select","value":"deceased","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.818Z","selector":"#sort","label":"Sort: reset to cat","action":"select","value":"cat","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.818Z","selector":".d-links a[href=\"/upload\"]","label":"Drawer link: Upload your signature","action":"nav-check","ok":false,"effect":"ERROR: locator.count: Target page, context or browser has been closed","errors":["locator.count: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.818Z","selector":".drawer .tab[data-v=\"grid\"]","label":"Collages → Grid: switch back","action":"click","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.818Z","selector":"a.hbtn[href=\"/game\"]","label":"Hero CTA: Play the games","action":"nav-check","ok":false,"effect":"ERROR: locator.count: Target page, context or browser has been closed","errors":["locator.count: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.818Z","selector":"#useFilter","label":"Use filter: Permission needed","action":"select","value":"permission-needed","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.818Z","selector":"#density","label":"Density slider → 7","action":"range","value":"7","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.819Z","selector":"#sort","label":"Sort: Notability","action":"select","value":"notability","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.819Z","selector":".d-links a[href=\"/game\"]","label":"Drawer link: The Signature Games","action":"nav-check","ok":false,"effect":"ERROR: locator.count: Target page, context or browser has been closed","errors":["locator.count: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.819Z","selector":"a.logo","label":"Logo link (home)","action":"nav-check","ok":false,"effect":"ERROR: locator.count: Target page, context or browser has been closed","errors":["locator.count: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.819Z","selector":"#q","label":"Search: type \"kahlo\"","action":"type","value":"kahlo","ok":false,"effect":"ERROR: locator.fill: Target page, context or browser has been closed","errors":["locator.fill: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.819Z","selector":".d-links a[href=\"/murals\"]","label":"Drawer link: Signature murals","action":"nav-check","ok":false,"effect":"ERROR: locator.count: Target page, context or browser has been closed","errors":["locator.count: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.819Z","selector":"#sort","label":"Sort: License A→Z","action":"select","value":"license","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.819Z","selector":"#layoutChips .chip[data-l=\"gallery\"]","label":"Layout: Gallery","action":"click","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.820Z","selector":"#sort","label":"Sort: Living first","action":"select","value":"living","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.820Z","selector":"#density","label":"Density slider → 3","action":"range","value":"3","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.820Z","selector":"a.hbtn[href=\"/murals\"]","label":"Hero CTA: Order a mural","action":"nav-check","ok":false,"effect":"ERROR: locator.count: Target page, context or browser has been closed","errors":["locator.count: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.820Z","selector":"#sort","label":"Sort: Category then rank","action":"select","value":"cat","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.820Z","selector":"nav.gnav a[href=\"/upload\"]","label":"Nav: Upload yours","action":"nav-check","ok":false,"effect":"ERROR: locator.count: Target page, context or browser has been closed","errors":["locator.count: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.821Z","selector":"#sort","label":"Sort: Name A→Z","action":"select","value":"name","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.821Z","selector":"#density","label":"Density slider → 5","action":"range","value":"5","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.821Z","selector":"#catChips .chip[data-c=\"Declaration of Independence\"]","label":"Category: Declaration","action":"click","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.821Z","selector":"#catChips .chip[data-c=\"Artists\"]","label":"Category: Artists","action":"click","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.821Z","selector":".info-chip","label":"First card Details chip → open popup","action":"click-details","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.821Z","selector":"#q","label":"Search: clear","action":"clear","ok":false,"effect":"ERROR: locator.fill: Target page, context or browser has been closed","errors":["locator.fill: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.821Z","selector":"#sort","label":"Sort: Risk high→low","action":"select","value":"risk-desc","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.821Z","selector":"#catChips .chip[data-c=\"Politics\"]","label":"Category: Politics","action":"click","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.822Z","selector":"#sort","label":"Sort: Death date","action":"select","value":"death","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.822Z","selector":".ap-x","label":"Artist popup × close","action":"click","ok":false,"effect":"ERROR: locator.count: Target page, context or browser has been closed","errors":["locator.count: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.822Z","selector":"#catChips .chip[data-c=\"Authors\"]","label":"Category: Authors","action":"click","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.822Z","selector":"#filtersHint","label":"☰ Categories/sort/views button","action":"click","ok":false,"effect":"ERROR: locator.count: Target page, context or browser has been closed","errors":["locator.count: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.822Z","selector":"#layoutChips .chip[data-l=\"float\"]","label":"Layout: Float","action":"click","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.822Z","selector":"nav.gnav a[href=\"/game\"]","label":"Nav: Games","action":"nav-check","ok":false,"effect":"ERROR: locator.count: Target page, context or browser has been closed","errors":["locator.count: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.822Z","selector":"#sort","label":"Sort: Rank","action":"select","value":"rank","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.823Z","selector":"#q","label":"Search: type \"monet\"","action":"type","value":"monet","ok":false,"effect":"ERROR: locator.fill: Target page, context or browser has been closed","errors":["locator.fill: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.823Z","selector":"#useFilter","label":"Use filter: All signatures","action":"select","value":"all","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.823Z","selector":"#dback","label":"Drawer backdrop","action":"click","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.823Z","selector":"#sort","label":"Sort: Signature count","action":"select","value":"sigcount","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.823Z","selector":"nav.gnav a[href=\"/murals\"]","label":"Nav: Murals","action":"nav-check","ok":false,"effect":"ERROR: locator.count: Target page, context or browser has been closed","errors":["locator.count: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.823Z","selector":".drawer .tab[data-v=\"grid\"]","label":"Drawer tab: back to Grid","action":"click","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.824Z","selector":"#artistPop","label":"Popup deep test","action":"deep","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:09.824Z","selector":"#collagesView","label":"Collages content check","action":"check","ok":false,"effect":"ERROR: page.evaluate: Target page, context or browser has been closed","errors":["page.evaluate: Target page, context or browser has been closed"]}
+{"run":3,"ts":"2026-08-03T21:18:32.048Z","game":"lightning","diff":"icons","cat":"All","selector":"#reveal a","label":"round-9-reveal-link","action":"inspect","ok":false,"effect":"No reveal link found after pick","errors":["Missing reveal link in lightning round 9"]}
+{"run":3,"ts":"2026-08-03T21:18:32.298Z","game":"lightning","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-9-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:18:32.704Z","game":"lightning","diff":"icons","cat":"All","selector":"#timerbar","label":"round-10-timer","action":"inspect","ok":true,"effect":"Timer bar visible, fill class: tb-fill run","errors":[]}
+{"run":3,"ts":"2026-08-03T21:18:32.705Z","game":"lightning","diff":"icons","cat":"All","selector":"#stage","label":"round-10-render","action":"inspect","ok":true,"effect":"stage_html_len=195, choices=4, imgs_ok=9, imgs_broken=1","errors":[]}
+{"run":3,"ts":"2026-08-03T21:18:33.157Z","game":"lightning","diff":"icons","cat":"All","selector":".choice","label":"round-10-pick-0","action":"click","ok":true,"effect":"Chose: \"Portrait of Philip IV\", reveal: \"✗ Painting: Self-Portrait in a Fur Cap · see it →Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:18:33.158Z","game":"lightning","diff":"icons","cat":"All","selector":"#reveal a","label":"round-10-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/76295","errors":[]}
+{"run":3,"ts":"2026-08-03T21:18:33.409Z","game":"lightning","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-10-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:18:33.815Z","game":"lightning","diff":"icons","cat":"All","selector":"#timerbar","label":"round-11-timer","action":"inspect","ok":true,"effect":"Timer bar visible, fill class: tb-fill run","errors":[]}
+{"run":3,"ts":"2026-08-03T21:18:33.816Z","game":"lightning","diff":"icons","cat":"All","selector":"#stage","label":"round-11-render","action":"inspect","ok":true,"effect":"stage_html_len=193, choices=4, imgs_ok=10, imgs_broken=1","errors":[]}
+{"run":3,"ts":"2026-08-03T21:18:34.269Z","game":"lightning","diff":"icons","cat":"All","selector":".choice","label":"round-11-pick-3","action":"click","ok":true,"effect":"Chose: \"André Breton\", reveal: \"✗ Artist: Franz MarcNext →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:19:04.270Z","game":"lightning","diff":"icons","cat":"All","selector":"#reveal a","label":"round-11-reveal-link","action":"inspect","ok":false,"effect":"No reveal link found after pick","errors":["Missing reveal link in lightning round 11"]}
+{"run":3,"ts":"2026-08-03T21:19:04.521Z","game":"lightning","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-11-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:19:04.927Z","game":"lightning","diff":"icons","cat":"All","selector":"#timerbar","label":"round-12-timer","action":"inspect","ok":true,"effect":"Timer bar visible, fill class: tb-fill run","errors":[]}
+{"run":3,"ts":"2026-08-03T21:19:04.928Z","game":"lightning","diff":"icons","cat":"All","selector":"#stage","label":"round-12-render","action":"inspect","ok":true,"effect":"stage_html_len=195, choices=4, imgs_ok=11, imgs_broken=1","errors":[]}
+{"run":3,"ts":"2026-08-03T21:19:05.380Z","game":"lightning","diff":"icons","cat":"All","selector":".choice","label":"round-12-pick-2","action":"click","ok":true,"effect":"Chose: \"Portrait of Philip IV\", reveal: \"✗ Painting: The Bull · see it →Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:19:05.381Z","game":"lightning","diff":"icons","cat":"All","selector":"#reveal a","label":"round-12-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/61204","errors":[]}
+{"run":3,"ts":"2026-08-03T21:19:05.633Z","game":"lightning","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-12-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:19:06.039Z","game":"lightning","diff":"icons","cat":"All","selector":"#timerbar","label":"round-13-timer","action":"inspect","ok":true,"effect":"Timer bar visible, fill class: tb-fill run","errors":[]}
+{"run":3,"ts":"2026-08-03T21:19:06.040Z","game":"lightning","diff":"icons","cat":"All","selector":"#stage","label":"round-13-render","action":"inspect","ok":true,"effect":"stage_html_len=193, choices=4, imgs_ok=12, imgs_broken=1","errors":[]}
+{"run":3,"ts":"2026-08-03T21:19:06.491Z","game":"lightning","diff":"icons","cat":"All","selector":".choice","label":"round-13-pick-0","action":"click","ok":true,"effect":"Chose: \"El Greco\", reveal: \"✗ Artist: André BretonNext →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:19:36.491Z","game":"lightning","diff":"icons","cat":"All","selector":"#reveal a","label":"round-13-reveal-link","action":"inspect","ok":false,"effect":"No reveal link found after pick","errors":["Missing reveal link in lightning round 13"]}
+{"run":3,"ts":"2026-08-03T21:19:36.746Z","game":"lightning","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-13-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:19:37.153Z","game":"lightning","diff":"icons","cat":"All","selector":"#timerbar","label":"round-14-timer","action":"inspect","ok":true,"effect":"Timer bar visible, fill class: tb-fill run","errors":[]}
+{"run":3,"ts":"2026-08-03T21:19:37.154Z","game":"lightning","diff":"icons","cat":"All","selector":"#stage","label":"round-14-render","action":"inspect","ok":true,"effect":"stage_html_len=195, choices=4, imgs_ok=13, imgs_broken=1","errors":[]}
+{"run":3,"ts":"2026-08-03T21:19:37.603Z","game":"lightning","diff":"icons","cat":"All","selector":".choice","label":"round-14-pick-3","action":"click","ok":true,"effect":"Chose: \"The Assumption of the Virgin\", reveal: \"✗ Painting: Art of Engraving, from Encyclopédie · see it →Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:19:37.604Z","game":"lightning","diff":"icons","cat":"All","selector":"#reveal a","label":"round-14-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/40842","errors":[]}
+{"run":3,"ts":"2026-08-03T21:19:37.855Z","game":"lightning","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-14-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:19:38.264Z","game":"lightning","diff":"icons","cat":"All","selector":"#timerbar","label":"round-15-timer","action":"inspect","ok":true,"effect":"Timer bar visible, fill class: tb-fill run","errors":[]}
+{"run":3,"ts":"2026-08-03T21:19:38.265Z","game":"lightning","diff":"icons","cat":"All","selector":"#stage","label":"round-15-render","action":"inspect","ok":true,"effect":"stage_html_len=193, choices=4, imgs_ok=14, imgs_broken=1","errors":[]}
+{"run":3,"ts":"2026-08-03T21:19:38.717Z","game":"lightning","diff":"icons","cat":"All","selector":".choice","label":"round-15-pick-2","action":"click","ok":true,"effect":"Chose: \"El Greco\", reveal: \"✗ Artist: MichelangeloNext →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:20:08.718Z","game":"lightning","diff":"icons","cat":"All","selector":"#reveal a","label":"round-15-reveal-link","action":"inspect","ok":false,"effect":"No reveal link found after pick","errors":["Missing reveal link in lightning round 15"]}
+{"run":3,"ts":"2026-08-03T21:20:08.967Z","game":"lightning","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-15-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:20:09.373Z","game":"lightning","diff":"icons","cat":"All","selector":"#timerbar","label":"round-16-timer","action":"inspect","ok":true,"effect":"Timer bar visible, fill class: tb-fill run","errors":[]}
+{"run":3,"ts":"2026-08-03T21:20:09.374Z","game":"lightning","diff":"icons","cat":"All","selector":"#stage","label":"round-16-render","action":"inspect","ok":true,"effect":"stage_html_len=195, choices=4, imgs_ok=15, imgs_broken=1","errors":[]}
+{"run":3,"ts":"2026-08-03T21:20:09.827Z","game":"lightning","diff":"icons","cat":"All","selector":".choice","label":"round-16-pick-0","action":"click","ok":true,"effect":"Chose: \"The Assumption of the Virgin\", reveal: \"✗ Painting: Moses · see it →See results\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:20:09.828Z","game":"lightning","diff":"icons","cat":"All","selector":"#reveal a","label":"round-16-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/55033","errors":[]}
+{"run":3,"ts":"2026-08-03T21:20:10.080Z","game":"lightning","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-16-next","action":"click","ok":true,"effect":"Next text: \"See results\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:20:10.484Z","game":"lightning","diff":"icons","cat":"All","selector":"#results","label":"results-screen","action":"inspect","ok":true,"effect":"score=0, verdict=\"The gallery guide is that way…\", best=\"Best (lightning · icons): 0\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:20:10.484Z","game":"lightning","diff":"icons","cat":"All","selector":"#misses","label":"lightning-bonus-line","action":"inspect","ok":true,"effect":"Bonus line HTML: \"<div class=\"ap-sub\" style=\"margin-top:8px\">⚡ Named BOTH on 0 of 8 paintings — <b>+0 bonus</b></div><b>Worth a second look:</b><br><a href=\"/?artist=Q46373\" target=\"_blank\" rel=\"noopener noreferrer\">Ed\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:20:10.938Z","game":"lightning","diff":"icons","cat":"All","selector":"#againBtn","label":"play-again","action":"click","ok":true,"effect":"Setup panel returned: true","errors":[]}
+{"run":3,"ts":"2026-08-03T21:20:12.017Z","game":"match","diff":"icons","cat":"All","selector":"#gamePick .gcard[data-g=\"match\"]","label":"game-card-match","action":"click","ok":true,"effect":"card selected","errors":["REQUEST_FAILED: POST https://www.google-analytics.com/g/collect?v=2&tid=G-2HEVP6TD0J&gtm=45je67v1v9260226174za200zd9260226174&_p=1785791775699&gcd=13l3l3l3l1l1&npa=0&dma=0&_eu=AAAAAAQ&are=1&cid=777999539.1785791722&frm=0&ngs=1&pscdl=noapi&rcb=18&sr=1600x900&uaa=arm&uab=64&uafvl=HeadlessChrome%3B149.0.7827.55%7CChromium%3B149.0.7827.55%7CNot)A%253BBrand%3B24.0.0.0&uam=&uamb=0&uap=macOS&uapv=26.4.0&uaw=0&ul=en-us&_s=2&tag_exp=115938466~115938468~118897920~118897930~119896802~120125304&sid=1785791722&sct=1&seg=1&dl=http%3A%2F%2Flocalhost%2Fgame&dt=The%20Signature%20Games%20%E2%80%94%20Celebrity%20Signatures&en=user_engagement&_et=235234&tfd=235304 — net::ERR_ABORTED"]}
+{"run":3,"ts":"2026-08-03T21:20:12.021Z","game":"match","diff":"icons","cat":"All","selector":"#catLabel/#catOpts","label":"category-row-visibility","action":"inspect","ok":true,"effect":"catLabel=none, catOpts=none, expected_visible=false, actual=false","errors":[]}
+{"run":3,"ts":"2026-08-03T21:20:12.217Z","game":"match","diff":"icons","cat":"All","selector":"#diffOpts .opt[data-d=\"icons\"]","label":"diff-icons","action":"click","ok":true,"effect":"selected","errors":[]}
+{"run":3,"ts":"2026-08-03T21:20:12.260Z","game":"match","diff":"icons","cat":"All","selector":"#goBtn","label":"begin-button","action":"click","ok":true,"effect":"Begin clicked","errors":[]}
+{"run":3,"ts":"2026-08-03T21:20:18.313Z","game":"match","diff":"icons","cat":"All","selector":"#play","label":"play-panel-appeared","action":"wait","ok":true,"effect":"play panel shown in 6096ms","errors":["REQUEST_FAILED: POST https://www.google-analytics.com/g/collect?v=2&tid=G-2HEVP6TD0J&gtm=45je67v1v9260226174za200zd9260226174&_p=1785792010946&gcd=13l3l3l3l1l1&npa=0&dma=0&_eu=AAAAAAQ&are=1&cid=777999539.1785791722&frm=0&ngs=1&pscdl=noapi&rcb=11&sr=1600x900&uaa=arm&uab=64&uafvl=HeadlessChrome%3B149.0.7827.55%7CChromium%3B149.0.7827.55%7CNot)A%253BBrand%3B24.0.0.0&uam=&uamb=0&uap=macOS&uapv=26.4.0&uaw=0&ul=en-us&_s=1&tag_exp=115938466~115938469~118395333~118897920~118897930~119896803&sid=1785791722&sct=1&seg=1&dl=http%3A%2F%2Flocalhost%2Fgame&dt=The%20Signature%20Games%20%E2%80%94%20Celebrity%20Signatures&en=page_view&_ee=1&tfd=5019 — net::ERR_ABORTED"]}
+{"run":3,"ts":"2026-08-03T21:20:18.317Z","game":"match","diff":"icons","cat":"All","selector":"#stage","label":"round-1-render","action":"inspect","ok":true,"effect":"stage_html_len=159, choices=4, imgs_ok=1, imgs_broken=0","errors":[]}
+{"run":3,"ts":"2026-08-03T21:20:18.760Z","game":"match","diff":"icons","cat":"All","selector":".choice","label":"round-1-pick-0","action":"click","ok":true,"effect":"Chose: \"\", reveal: \"✓ Correct — “Self-Portrait” → by TitianNext →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:20:18.762Z","game":"match","diff":"icons","cat":"All","selector":"#reveal a","label":"round-1-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/55006","errors":[]}
+{"run":3,"ts":"2026-08-03T21:20:19.010Z","game":"match","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-1-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:20:19.421Z","game":"match","diff":"icons","cat":"All","selector":"#stage","label":"round-2-render","action":"inspect","ok":true,"effect":"stage_html_len=127, choices=4, imgs_ok=2, imgs_broken=0","errors":[]}
+{"run":3,"ts":"2026-08-03T21:20:19.871Z","game":"match","diff":"icons","cat":"All","selector":".choice","label":"round-2-pick-3","action":"click","ok":true,"effect":"Chose: \"\", reveal: \"✗ Their piece was “River Estuary” → by Nicolas PoussinNext →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:20:19.872Z","game":"match","diff":"icons","cat":"All","selector":"#reveal a","label":"round-2-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/81403","errors":[]}
+{"run":3,"ts":"2026-08-03T21:20:20.121Z","game":"match","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-2-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:20:20.528Z","game":"match","diff":"icons","cat":"All","selector":"#stage","label":"round-3-render","action":"inspect","ok":true,"effect":"stage_html_len=138, choices=4, imgs_ok=3, imgs_broken=0","errors":[]}
+{"run":3,"ts":"2026-08-03T21:20:20.968Z","game":"match","diff":"icons","cat":"All","selector":".choice","label":"round-3-pick-2","action":"click","ok":true,"effect":"Chose: \"\", reveal: \"✓ Correct — “Madame de Pastoret and Her Son” → by Jacques-Louis DavidNext →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:20:20.969Z","game":"match","diff":"icons","cat":"All","selector":"#reveal a","label":"round-3-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/27307","errors":[]}
+{"run":3,"ts":"2026-08-03T21:20:21.218Z","game":"match","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-3-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:20:21.623Z","game":"match","diff":"icons","cat":"All","selector":"#stage","label":"round-4-render","action":"inspect","ok":true,"effect":"stage_html_len=137, choices=4, imgs_ok=4, imgs_broken=0","errors":[]}
+{"run":3,"ts":"2026-08-03T21:20:22.079Z","game":"match","diff":"icons","cat":"All","selector":".choice","label":"round-4-pick-0","action":"click","ok":true,"effect":"Chose: \"\", reveal: \"✓ Correct — “Art of Engraving, from Encyclopédie” → by André BretonNext →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:20:22.080Z","game":"match","diff":"icons","cat":"All","selector":"#reveal a","label":"round-4-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/40842","errors":[]}
+{"run":3,"ts":"2026-08-03T21:20:22.330Z","game":"match","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-4-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:20:22.735Z","game":"match","diff":"icons","cat":"All","selector":"#stage","label":"round-5-render","action":"inspect","ok":true,"effect":"stage_html_len=128, choices=4, imgs_ok=5, imgs_broken=0","errors":[]}
+{"run":3,"ts":"2026-08-03T21:20:23.192Z","game":"match","diff":"icons","cat":"All","selector":".choice","label":"round-5-pick-3","action":"click","ok":true,"effect":"Chose: \"\", reveal: \"✗ Their piece was “Judgement of Paris” → by Paolo VeroneseNext →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:20:23.195Z","game":"match","diff":"icons","cat":"All","selector":"#reveal a","label":"round-5-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/3958","errors":[]}
+{"run":3,"ts":"2026-08-03T21:20:23.441Z","game":"match","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-5-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:20:23.846Z","game":"match","diff":"icons","cat":"All","selector":"#stage","label":"round-6-render","action":"inspect","ok":true,"effect":"stage_html_len=129, choices=4, imgs_ok=6, imgs_broken=0","errors":[]}
+{"run":3,"ts":"2026-08-03T21:20:24.287Z","game":"match","diff":"icons","cat":"All","selector":".choice","label":"round-6-pick-2","action":"click","ok":true,"effect":"Chose: \"\", reveal: \"✓ Correct — “Old Man with a Gold Chain” → by RembrandtNext →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:20:24.288Z","game":"match","diff":"icons","cat":"All","selector":"#reveal a","label":"round-6-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/95998","errors":[]}
+{"run":3,"ts":"2026-08-03T21:20:24.537Z","game":"match","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-6-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:20:24.944Z","game":"match","diff":"icons","cat":"All","selector":"#stage","label":"round-7-render","action":"inspect","ok":true,"effect":"stage_html_len=134, choices=4, imgs_ok=7, imgs_broken=0","errors":[]}
+{"run":3,"ts":"2026-08-03T21:20:25.384Z","game":"match","diff":"icons","cat":"All","selector":".choice","label":"round-7-pick-0","action":"click","ok":true,"effect":"Chose: \"\", reveal: \"✗ Their piece was “Cow Lying Beside a Tree, plate 7 from Eight Bulls and Cows” →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:20:25.385Z","game":"match","diff":"icons","cat":"All","selector":"#reveal a","label":"round-7-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/131977","errors":[]}
+{"run":3,"ts":"2026-08-03T21:20:25.635Z","game":"match","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-7-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:20:26.041Z","game":"match","diff":"icons","cat":"All","selector":"#stage","label":"round-8-render","action":"inspect","ok":true,"effect":"stage_html_len=124, choices=4, imgs_ok=8, imgs_broken=0","errors":[]}
+{"run":3,"ts":"2026-08-03T21:20:26.482Z","game":"match","diff":"icons","cat":"All","selector":".choice","label":"round-8-pick-3","action":"click","ok":true,"effect":"Chose: \"\", reveal: \"✗ Their piece was “L'Assommoir” → by Émile ZolaNext →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:20:26.482Z","game":"match","diff":"icons","cat":"All","selector":"#reveal a","label":"round-8-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/69746","errors":[]}
+{"run":3,"ts":"2026-08-03T21:20:26.732Z","game":"match","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-8-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:20:27.137Z","game":"match","diff":"icons","cat":"All","selector":"#stage","label":"round-9-render","action":"inspect","ok":true,"effect":"stage_html_len=132, choices=4, imgs_ok=9, imgs_broken=0","errors":[]}
+{"run":3,"ts":"2026-08-03T21:20:27.579Z","game":"match","diff":"icons","cat":"All","selector":".choice","label":"round-9-pick-2","action":"click","ok":true,"effect":"Chose: \"\", reveal: \"✗ Their piece was “Stacks of Wheat (End of Summer)” → by Claude MonetSee results\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:20:27.580Z","game":"match","diff":"icons","cat":"All","selector":"#reveal a","label":"round-9-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/64818","errors":[]}
+{"run":3,"ts":"2026-08-03T21:20:27.830Z","game":"match","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-9-next","action":"click","ok":true,"effect":"Next text: \"See results\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:20:28.236Z","game":"match","diff":"icons","cat":"All","selector":"#results","label":"results-screen","action":"inspect","ok":true,"effect":"score=42, verdict=\"The gallery guide is that way…\", best=\"Best (match · icons): 42\"","errors":[]}
+{"run":3,"ts":"2026-08-03T21:20:28.690Z","game":"match","diff":"icons","cat":"All","selector":"#againBtn","label":"play-again","action":"click","ok":true,"effect":"Setup panel returned: true","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:37.760Z","game":"whose","diff":"icons","cat":"All","selector":"#gamePick .gcard[data-g=\"whose\"]","label":"game-card-whose","action":"click","ok":true,"effect":"card selected","errors":["REQUEST_FAILED: POST https://www.google-analytics.com/g/collect?v=2&tid=G-2HEVP6TD0J&gtm=45je67v1v9260226174za200zd9260226174&_p=1785792036670&gcd=13l3l3l3l1l1&npa=0&dma=0&are=1&cid=1336036224.1785792037&frm=0&ngs=1&pscdl=noapi&rcb=7&sr=1600x900&uaa=arm&uab=64&uafvl=HeadlessChrome%3B149.0.7827.55%7CChromium%3B149.0.7827.55%7CNot)A%253BBrand%3B24.0.0.0&uam=&uamb=0&uap=macOS&uapv=26.4.0&uaw=0&ul=en-us&_s=1&tag_exp=115616985~115938465~115938468~118897920~118897930~119896803&sid=1785792036&sct=1&seg=0&dl=http%3A%2F%2Flocalhost%2Fgame&dt=The%20Signature%20Games%20%E2%80%94%20Celebrity%20Signatures&en=page_view&_fv=1&_nsi=1&_ss=1&_ee=1&tfd=160 — net::ERR_ABORTED"]}
+{"run":4,"ts":"2026-08-03T21:20:37.764Z","game":"whose","diff":"icons","cat":"All","selector":"#catLabel/#catOpts","label":"category-row-visibility","action":"inspect","ok":true,"effect":"catLabel=block, catOpts=flex, expected_visible=true, actual=true","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:37.955Z","game":"whose","diff":"icons","cat":"All","selector":"#diffOpts .opt[data-d=\"icons\"]","label":"diff-icons","action":"click","ok":true,"effect":"selected","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:38.150Z","game":"whose","diff":"icons","cat":"All","selector":"#catOpts .opt[data-c=\"All\"]","label":"cat-All","action":"click","ok":true,"effect":"selected","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:38.200Z","game":"whose","diff":"icons","cat":"All","selector":"#goBtn","label":"begin-button","action":"click","ok":true,"effect":"Begin clicked","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:38.201Z","game":"whose","diff":"icons","cat":"All","selector":"#play","label":"play-panel-appeared","action":"wait","ok":true,"effect":"play panel shown in 50ms","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:38.206Z","game":"whose","diff":"icons","cat":"All","selector":"https://upload.wikimedia.org/wikipedia/commons/8/85/JM_Keynes_signature.svg","label":"round-1-image","action":"inspect","ok":false,"effect":"Image broken/404: https://upload.wikimedia.org/wikipedia/commons/8/85/JM_Keynes_signature.svg","errors":["Image 404 or broken: https://upload.wikimedia.org/wikipedia/commons/8/85/JM_Keynes_signature.svg"]}
+{"run":4,"ts":"2026-08-03T21:20:38.207Z","game":"whose","diff":"icons","cat":"All","selector":"#stage","label":"round-1-render","action":"inspect","ok":true,"effect":"stage_html_len=123, choices=4, imgs_ok=0, imgs_broken=1","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:38.663Z","game":"whose","diff":"icons","cat":"All","selector":".choice","label":"round-1-pick-0","action":"click","ok":true,"effect":"Chose: \"John Maynard Keynes\", reveal: \"✓ Correct — John Maynard Keynes · their page →Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:38.913Z","game":"whose","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-1-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:39.320Z","game":"whose","diff":"icons","cat":"All","selector":"#stage","label":"round-2-render","action":"inspect","ok":true,"effect":"stage_html_len=131, choices=4, imgs_ok=1, imgs_broken=1","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:39.773Z","game":"whose","diff":"icons","cat":"All","selector":".choice","label":"round-2-pick-3","action":"click","ok":true,"effect":"Chose: \"Benjamin Franklin\", reveal: \"✓ Correct — Benjamin Franklin · their page →Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:40.030Z","game":"whose","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-2-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:40.438Z","game":"whose","diff":"icons","cat":"All","selector":"#stage","label":"round-3-render","action":"inspect","ok":true,"effect":"stage_html_len=203, choices=4, imgs_ok=2, imgs_broken=1","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:40.885Z","game":"whose","diff":"icons","cat":"All","selector":".choice","label":"round-3-pick-2","action":"click","ok":true,"effect":"Chose: \"Jules Verne\", reveal: \"✗ It was Gottfried Wilhelm Leibniz · their page →Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:41.137Z","game":"whose","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-3-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:41.544Z","game":"whose","diff":"icons","cat":"All","selector":"#stage","label":"round-4-render","action":"inspect","ok":true,"effect":"stage_html_len=129, choices=4, imgs_ok=3, imgs_broken=1","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:41.995Z","game":"whose","diff":"icons","cat":"All","selector":".choice","label":"round-4-pick-0","action":"click","ok":true,"effect":"Chose: \"Leo Tolstoy\", reveal: \"✗ It was Charles Dickens · their page →Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:42.247Z","game":"whose","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-4-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:42.655Z","game":"whose","diff":"icons","cat":"All","selector":"#stage","label":"round-5-render","action":"inspect","ok":true,"effect":"stage_html_len=187, choices=4, imgs_ok=4, imgs_broken=1","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:43.108Z","game":"whose","diff":"icons","cat":"All","selector":".choice","label":"round-5-pick-3","action":"click","ok":true,"effect":"Chose: \"Voltaire\", reveal: \"✓ Correct — Voltaire · their page →Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:43.359Z","game":"whose","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-5-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:43.765Z","game":"whose","diff":"icons","cat":"All","selector":"#stage","label":"round-6-render","action":"inspect","ok":true,"effect":"stage_html_len=130, choices=4, imgs_ok=5, imgs_broken=1","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:44.219Z","game":"whose","diff":"icons","cat":"All","selector":".choice","label":"round-6-pick-2","action":"click","ok":true,"effect":"Chose: \"Franklin Delano Roosevelt\", reveal: \"✗ It was John F. Kennedy · their page →Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:44.473Z","game":"whose","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-6-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:44.885Z","game":"whose","diff":"icons","cat":"All","selector":"#stage","label":"round-7-render","action":"inspect","ok":true,"effect":"stage_html_len=170, choices=4, imgs_ok=6, imgs_broken=1","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:45.330Z","game":"whose","diff":"icons","cat":"All","selector":".choice","label":"round-7-pick-0","action":"click","ok":true,"effect":"Chose: \"Gottfried Wilhelm Leibniz\", reveal: \"✗ It was Nicolaus Copernicus · their page →Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:45.580Z","game":"whose","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-7-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:45.988Z","game":"whose","diff":"icons","cat":"All","selector":"#stage","label":"round-8-render","action":"inspect","ok":true,"effect":"stage_html_len=127, choices=4, imgs_ok=7, imgs_broken=1","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:46.444Z","game":"whose","diff":"icons","cat":"All","selector":".choice","label":"round-8-pick-3","action":"click","ok":true,"effect":"Chose: \"Mark Twain\", reveal: \"✗ It was Martin Luther · their page →Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:46.692Z","game":"whose","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-8-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:47.099Z","game":"whose","diff":"icons","cat":"All","selector":"#stage","label":"round-9-render","action":"inspect","ok":true,"effect":"stage_html_len=132, choices=4, imgs_ok=8, imgs_broken=1","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:47.552Z","game":"whose","diff":"icons","cat":"All","selector":".choice","label":"round-9-pick-2","action":"click","ok":true,"effect":"Chose: \"James Joyce\", reveal: \"✗ It was Friedrich Schiller · their page →Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:47.803Z","game":"whose","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-9-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:48.210Z","game":"whose","diff":"icons","cat":"All","selector":"#stage","label":"round-10-render","action":"inspect","ok":true,"effect":"stage_html_len=126, choices=4, imgs_ok=9, imgs_broken=1","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:48.663Z","game":"whose","diff":"icons","cat":"All","selector":".choice","label":"round-10-pick-0","action":"click","ok":true,"effect":"Chose: \"Alfred Nobel\", reveal: \"✓ Correct — Alfred Nobel · their page →See results\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:48.918Z","game":"whose","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-10-next","action":"click","ok":true,"effect":"Next text: \"See results\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:49.324Z","game":"whose","diff":"icons","cat":"All","selector":"#results","label":"results-screen","action":"inspect","ok":true,"effect":"score=42, verdict=\"The gallery guide is that way…\", best=\"Best (whose · icons): 42\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:49.775Z","game":"whose","diff":"icons","cat":"All","selector":"#againBtn","label":"play-again","action":"click","ok":true,"effect":"Setup panel returned: true","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:50.853Z","game":"art","diff":"icons","cat":"All","selector":"#gamePick .gcard[data-g=\"art\"]","label":"game-card-art","action":"click","ok":true,"effect":"card selected","errors":["REQUEST_FAILED: POST https://www.google-analytics.com/g/collect?v=2&tid=G-2HEVP6TD0J&gtm=45je67v1v9260226174za200zd9260226174&_p=1785792036670&gcd=13l3l3l3l1l1&npa=0&dma=0&_eu=AAAAAAQ&are=1&cid=1336036224.1785792037&frm=0&ngs=1&pscdl=noapi&rcb=7&sr=1600x900&uaa=arm&uab=64&uafvl=HeadlessChrome%3B149.0.7827.55%7CChromium%3B149.0.7827.55%7CNot)A%253BBrand%3B24.0.0.0&uam=&uamb=0&uap=macOS&uapv=26.4.0&uaw=0&ul=en-us&_s=2&tag_exp=115616985~115938465~115938468~118897920~118897930~119896803&sid=1785792036&sct=1&seg=1&dl=http%3A%2F%2Flocalhost%2Fgame&dt=The%20Signature%20Games%20%E2%80%94%20Celebrity%20Signatures&en=user_engagement&_et=13062&tfd=13225 — net::ERR_ABORTED"]}
+{"run":4,"ts":"2026-08-03T21:20:50.856Z","game":"art","diff":"icons","cat":"All","selector":"#catLabel/#catOpts","label":"category-row-visibility","action":"inspect","ok":true,"effect":"catLabel=none, catOpts=none, expected_visible=false, actual=false","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:51.052Z","game":"art","diff":"icons","cat":"All","selector":"#diffOpts .opt[data-d=\"icons\"]","label":"diff-icons","action":"click","ok":true,"effect":"selected","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:51.096Z","game":"art","diff":"icons","cat":"All","selector":"#goBtn","label":"begin-button","action":"click","ok":true,"effect":"Begin clicked","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:52.104Z","game":"art","diff":"icons","cat":"All","selector":"#play","label":"play-panel-appeared","action":"wait","ok":true,"effect":"play panel shown in 1051ms","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:52.117Z","game":"art","diff":"icons","cat":"All","selector":"#stage","label":"round-1-render","action":"inspect","ok":true,"effect":"stage_html_len=152, choices=4, imgs_ok=1, imgs_broken=0","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:52.569Z","game":"art","diff":"icons","cat":"All","selector":".choice","label":"round-1-pick-0","action":"click","ok":true,"effect":"Chose: \"Pierre-Auguste Renoir\", reveal: \"✗ It was Titian · “Self-Portrait”, n.d. → · their page →Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:52.570Z","game":"art","diff":"icons","cat":"All","selector":"#reveal a","label":"round-1-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/55006","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:52.816Z","game":"art","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-1-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:53.223Z","game":"art","diff":"icons","cat":"All","selector":"#stage","label":"round-2-render","action":"inspect","ok":true,"effect":"stage_html_len=152, choices=4, imgs_ok=2, imgs_broken=0","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:53.678Z","game":"art","diff":"icons","cat":"All","selector":".choice","label":"round-2-pick-3","action":"click","ok":true,"effect":"Chose: \"Michelangelo\", reveal: \"✗ It was Leonardo da Vinci · “Two Putti with Lamb”, n.d. → · their page →Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:53.680Z","game":"art","diff":"icons","cat":"All","selector":"#reveal a","label":"round-2-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/95701","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:53.931Z","game":"art","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-2-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:54.337Z","game":"art","diff":"icons","cat":"All","selector":"#stage","label":"round-3-render","action":"inspect","ok":true,"effect":"stage_html_len=152, choices=4, imgs_ok=3, imgs_broken=0","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:54.789Z","game":"art","diff":"icons","cat":"All","selector":".choice","label":"round-3-pick-2","action":"click","ok":true,"effect":"Chose: \"Wassily Kandinsky\", reveal: \"✗ It was El Greco · “Saint Martin and the Beggar”, c. 1597–c. 1600 → · their pag\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:54.790Z","game":"art","diff":"icons","cat":"All","selector":"#reveal a","label":"round-3-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/67362","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:55.040Z","game":"art","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-3-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":["REQUEST_FAILED: POST https://www.google-analytics.com/g/collect?v=2&tid=G-2HEVP6TD0J&gtm=45je67v1v9260226174za200zd9260226174&_p=1785792049786&gcd=13l3l3l3l1l1&npa=0&dma=0&_eu=AAAAAAQ&are=1&cid=1336036224.1785792037&frm=0&ngs=1&pscdl=noapi&rcb=9&sr=1600x900&uaa=arm&uab=64&uafvl=HeadlessChrome%3B149.0.7827.55%7CChromium%3B149.0.7827.55%7CNot)A%253BBrand%3B24.0.0.0&uam=&uamb=0&uap=macOS&uapv=26.4.0&uaw=0&ul=en-us&_s=1&tag_exp=115616985~115938465~115938468~118897920~118897930~119896803&sid=1785792036&sct=1&seg=1&dl=http%3A%2F%2Flocalhost%2Fgame&dt=The%20Signature%20Games%20%E2%80%94%20Celebrity%20Signatures&en=page_view&_ee=1&tfd=5029 — net::ERR_ABORTED"]}
+{"run":4,"ts":"2026-08-03T21:20:55.448Z","game":"art","diff":"icons","cat":"All","selector":"#stage","label":"round-4-render","action":"inspect","ok":true,"effect":"stage_html_len=152, choices=4, imgs_ok=4, imgs_broken=0","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:55.885Z","game":"art","diff":"icons","cat":"All","selector":".choice","label":"round-4-pick-0","action":"click","ok":true,"effect":"Chose: \"Jackson Pollock\", reveal: \"✗ It was Eugène Delacroix · “Sheet of Sketches”, 1826 → · their page →Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:55.886Z","game":"art","diff":"icons","cat":"All","selector":"#reveal a","label":"round-4-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/14446","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:56.136Z","game":"art","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-4-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:56.544Z","game":"art","diff":"icons","cat":"All","selector":"#stage","label":"round-5-render","action":"inspect","ok":true,"effect":"stage_html_len=152, choices=4, imgs_ok=5, imgs_broken=0","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:56.999Z","game":"art","diff":"icons","cat":"All","selector":".choice","label":"round-5-pick-3","action":"click","ok":true,"effect":"Chose: \"Jean Cocteau\", reveal: \"✗ It was Edvard Munch · “Consolation”, 1894 → · their page →Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:57.001Z","game":"art","diff":"icons","cat":"All","selector":"#reveal a","label":"round-5-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/17215","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:57.263Z","game":"art","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-5-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:57.669Z","game":"art","diff":"icons","cat":"All","selector":"#stage","label":"round-6-render","action":"inspect","ok":true,"effect":"stage_html_len=152, choices=4, imgs_ok=6, imgs_broken=0","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:58.107Z","game":"art","diff":"icons","cat":"All","selector":".choice","label":"round-6-pick-2","action":"click","ok":true,"effect":"Chose: \"Peter Paul Rubens\", reveal: \"✗ It was Albrecht Dürer · “Calvary”, c. 1503–04 → · their page →Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:58.108Z","game":"art","diff":"icons","cat":"All","selector":"#reveal a","label":"round-6-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/11056","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:58.361Z","game":"art","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-6-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:58.766Z","game":"art","diff":"icons","cat":"All","selector":"#stage","label":"round-7-render","action":"inspect","ok":true,"effect":"stage_html_len=152, choices=4, imgs_ok=7, imgs_broken=0","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:59.205Z","game":"art","diff":"icons","cat":"All","selector":".choice","label":"round-7-pick-0","action":"click","ok":true,"effect":"Chose: \"William Hogarth\", reveal: \"✓ Correct — William Hogarth · “Strolling Actresses Dressing in a Barn”, May 1738\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:59.207Z","game":"art","diff":"icons","cat":"All","selector":"#reveal a","label":"round-7-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/80820","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:59.470Z","game":"art","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-7-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:20:59.876Z","game":"art","diff":"icons","cat":"All","selector":"#stage","label":"round-8-render","action":"inspect","ok":true,"effect":"stage_html_len=152, choices=4, imgs_ok=8, imgs_broken=0","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:00.316Z","game":"art","diff":"icons","cat":"All","selector":".choice","label":"round-8-pick-3","action":"click","ok":true,"effect":"Chose: \"Auguste Rodin\", reveal: \"✗ It was Sandro Botticelli · “Virgin and Child with an Angel”, 1475–85 → · their\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:00.317Z","game":"art","diff":"icons","cat":"All","selector":"#reveal a","label":"round-8-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/80530","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:00.566Z","game":"art","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-8-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:00.973Z","game":"art","diff":"icons","cat":"All","selector":"#stage","label":"round-9-render","action":"inspect","ok":true,"effect":"stage_html_len=152, choices=4, imgs_ok=9, imgs_broken=0","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:01.433Z","game":"art","diff":"icons","cat":"All","selector":".choice","label":"round-9-pick-2","action":"click","ok":true,"effect":"Chose: \"Walter Gropius\", reveal: \"✗ It was Camille Pissarro · “The Place du Havre, Paris”, 1893 → · their page →Ne\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:01.436Z","game":"art","diff":"icons","cat":"All","selector":"#reveal a","label":"round-9-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/81551","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:01.692Z","game":"art","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-9-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:02.098Z","game":"art","diff":"icons","cat":"All","selector":"#stage","label":"round-10-render","action":"inspect","ok":true,"effect":"stage_html_len=152, choices=4, imgs_ok=10, imgs_broken=0","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:02.551Z","game":"art","diff":"icons","cat":"All","selector":".choice","label":"round-10-pick-0","action":"click","ok":true,"effect":"Chose: \"Edvard Munch\", reveal: \"✗ It was Pierre-Auguste Renoir · “Two Sisters (On the Terrace)”, 1881 → · their \"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:02.552Z","game":"art","diff":"icons","cat":"All","selector":"#reveal a","label":"round-10-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/14655","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:02.806Z","game":"art","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-10-next","action":"click","ok":true,"effect":"Next text: \"See results\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:03.214Z","game":"art","diff":"icons","cat":"All","selector":"#results","label":"results-screen","action":"inspect","ok":true,"effect":"score=10, verdict=\"Everyone starts somewhere.\", best=\"Best (art · icons): 10\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:03.665Z","game":"art","diff":"icons","cat":"All","selector":"#againBtn","label":"play-again","action":"click","ok":true,"effect":"Setup panel returned: true","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:04.741Z","game":"match","diff":"icons","cat":"All","selector":"#gamePick .gcard[data-g=\"match\"]","label":"game-card-match","action":"click","ok":true,"effect":"card selected","errors":["REQUEST_FAILED: POST https://www.google-analytics.com/g/collect?v=2&tid=G-2HEVP6TD0J&gtm=45je67v1v9260226174za200zd9260226174&_p=1785792049786&gcd=13l3l3l3l1l1&npa=0&dma=0&_eu=AAAAAAQ&are=1&cid=1336036224.1785792037&frm=0&ngs=1&pscdl=noapi&rcb=9&sr=1600x900&uaa=arm&uab=64&uafvl=HeadlessChrome%3B149.0.7827.55%7CChromium%3B149.0.7827.55%7CNot)A%253BBrand%3B24.0.0.0&uam=&uamb=0&uap=macOS&uapv=26.4.0&uaw=0&ul=en-us&_s=2&tag_exp=115616985~115938465~115938468~118897920~118897930~119896803&sid=1785792036&sct=1&seg=1&dl=http%3A%2F%2Flocalhost%2Fgame&dt=The%20Signature%20Games%20%E2%80%94%20Celebrity%20Signatures&en=user_engagement&_et=13864&tfd=13894 — net::ERR_ABORTED"]}
+{"run":4,"ts":"2026-08-03T21:21:04.745Z","game":"match","diff":"icons","cat":"All","selector":"#catLabel/#catOpts","label":"category-row-visibility","action":"inspect","ok":true,"effect":"catLabel=none, catOpts=none, expected_visible=false, actual=false","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:04.941Z","game":"match","diff":"icons","cat":"All","selector":"#diffOpts .opt[data-d=\"icons\"]","label":"diff-icons","action":"click","ok":true,"effect":"selected","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:04.985Z","game":"match","diff":"icons","cat":"All","selector":"#goBtn","label":"begin-button","action":"click","ok":true,"effect":"Begin clicked","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:08.512Z","game":"match","diff":"icons","cat":"All","selector":"#play","label":"play-panel-appeared","action":"wait","ok":true,"effect":"play panel shown in 3571ms","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:08.517Z","game":"match","diff":"icons","cat":"All","selector":"#stage","label":"round-1-render","action":"inspect","ok":true,"effect":"stage_html_len=136, choices=4, imgs_ok=1, imgs_broken=0","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:08.970Z","game":"match","diff":"icons","cat":"All","selector":".choice","label":"round-1-pick-0","action":"click","ok":true,"effect":"Chose: \"\", reveal: \"✗ Their piece was “Peacock Feather” → by John RuskinNext →\"","errors":["REQUEST_FAILED: POST https://www.google-analytics.com/g/collect?v=2&tid=G-2HEVP6TD0J&gtm=45je67v1v9260226174za200zd9260226174&_p=1785792063673&gcd=13l3l3l3l1l1&npa=0&dma=0&_eu=AAAAAAQ&are=1&cid=1336036224.1785792037&frm=0&ngs=1&pscdl=noapi&rcb=1&sr=1600x900&uaa=arm&uab=64&uafvl=HeadlessChrome%3B149.0.7827.55%7CChromium%3B149.0.7827.55%7CNot)A%253BBrand%3B24.0.0.0&uam=&uamb=0&uap=macOS&uapv=26.4.0&uaw=0&ul=en-us&_s=1&tag_exp=115938466~115938469~118897920~118897930~119896802&sid=1785792036&sct=1&seg=1&dl=http%3A%2F%2Flocalhost%2Fgame&dt=The%20Signature%20Games%20%E2%80%94%20Celebrity%20Signatures&en=page_view&_ee=1&tfd=5018 — net::ERR_ABORTED"]}
+{"run":4,"ts":"2026-08-03T21:21:08.971Z","game":"match","diff":"icons","cat":"All","selector":"#reveal a","label":"round-1-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/44559","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:09.219Z","game":"match","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-1-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:09.626Z","game":"match","diff":"icons","cat":"All","selector":"#stage","label":"round-2-render","action":"inspect","ok":true,"effect":"stage_html_len=150, choices=4, imgs_ok=2, imgs_broken=0","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:10.068Z","game":"match","diff":"icons","cat":"All","selector":".choice","label":"round-2-pick-3","action":"click","ok":true,"effect":"Chose: \"\", reveal: \"✓ Correct — “Self-Portrait” → by Vincent van GoghNext →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:10.070Z","game":"match","diff":"icons","cat":"All","selector":"#reveal a","label":"round-2-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/80607","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:10.334Z","game":"match","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-2-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:10.740Z","game":"match","diff":"icons","cat":"All","selector":"#stage","label":"round-3-render","action":"inspect","ok":true,"effect":"stage_html_len=137, choices=4, imgs_ok=3, imgs_broken=0","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:11.178Z","game":"match","diff":"icons","cat":"All","selector":".choice","label":"round-3-pick-2","action":"click","ok":true,"effect":"Chose: \"\", reveal: \"✓ Correct — “Caryatid” → by Amedeo ModiglianiNext →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:11.180Z","game":"match","diff":"icons","cat":"All","selector":"#reveal a","label":"round-3-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/45254","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:11.443Z","game":"match","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-3-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:11.849Z","game":"match","diff":"icons","cat":"All","selector":"#stage","label":"round-4-render","action":"inspect","ok":true,"effect":"stage_html_len=141, choices=4, imgs_ok=4, imgs_broken=0","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:12.289Z","game":"match","diff":"icons","cat":"All","selector":".choice","label":"round-4-pick-0","action":"click","ok":true,"effect":"Chose: \"\", reveal: \"✓ Correct — “Shower Below the Summit (Sanka hakuu), from the series \"Thirty-Six \"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:12.291Z","game":"match","diff":"icons","cat":"All","selector":"#reveal a","label":"round-4-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/87008","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:12.539Z","game":"match","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-4-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:12.946Z","game":"match","diff":"icons","cat":"All","selector":"#stage","label":"round-5-render","action":"inspect","ok":true,"effect":"stage_html_len=126, choices=4, imgs_ok=5, imgs_broken=0","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:13.400Z","game":"match","diff":"icons","cat":"All","selector":".choice","label":"round-5-pick-3","action":"click","ok":true,"effect":"Chose: \"\", reveal: \"✗ Their piece was “Final Study for \"Bathers at Asnières\"” → by Georges SeuratNex\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:13.401Z","game":"match","diff":"icons","cat":"All","selector":"#reveal a","label":"round-5-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/20199","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:13.650Z","game":"match","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-5-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:14.057Z","game":"match","diff":"icons","cat":"All","selector":"#stage","label":"round-6-render","action":"inspect","ok":true,"effect":"stage_html_len=142, choices=4, imgs_ok=6, imgs_broken=0","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:14.498Z","game":"match","diff":"icons","cat":"All","selector":".choice","label":"round-6-pick-2","action":"click","ok":true,"effect":"Chose: \"\", reveal: \"✗ Their piece was “Self-Portrait as a Chimera” → by Sarah BernhardtNext →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:14.500Z","game":"match","diff":"icons","cat":"All","selector":"#reveal a","label":"round-6-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/260045","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:14.748Z","game":"match","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-6-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:15.158Z","game":"match","diff":"icons","cat":"All","selector":"#stage","label":"round-7-render","action":"inspect","ok":true,"effect":"stage_html_len=128, choices=4, imgs_ok=7, imgs_broken=0","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:15.614Z","game":"match","diff":"icons","cat":"All","selector":".choice","label":"round-7-pick-0","action":"click","ok":true,"effect":"Chose: \"\", reveal: \"✗ Their piece was “A Hilly Landscape with Figures Near a Ravine” → by Pieter Bru\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:15.616Z","game":"match","diff":"icons","cat":"All","selector":"#reveal a","label":"round-7-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/93281","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:15.873Z","game":"match","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-7-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:16.279Z","game":"match","diff":"icons","cat":"All","selector":"#stage","label":"round-8-render","action":"inspect","ok":true,"effect":"stage_html_len=146, choices=4, imgs_ok=8, imgs_broken=0","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:16.720Z","game":"match","diff":"icons","cat":"All","selector":".choice","label":"round-8-pick-3","action":"click","ok":true,"effect":"Chose: \"\", reveal: \"✗ Their piece was “Cranial Dissection, plate five from Myologie complete” → by T\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:16.721Z","game":"match","diff":"icons","cat":"All","selector":"#reveal a","label":"round-8-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/149494","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:16.970Z","game":"match","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-8-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:17.384Z","game":"match","diff":"icons","cat":"All","selector":"#stage","label":"round-9-render","action":"inspect","ok":true,"effect":"stage_html_len=138, choices=4, imgs_ok=9, imgs_broken=0","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:17.832Z","game":"match","diff":"icons","cat":"All","selector":".choice","label":"round-9-pick-2","action":"click","ok":true,"effect":"Chose: \"\", reveal: \"✗ Their piece was “The Gulf of Salerno” → by Frank Lloyd WrightNext →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:17.833Z","game":"match","diff":"icons","cat":"All","selector":"#reveal a","label":"round-9-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/180711","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:18.081Z","game":"match","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-9-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:18.487Z","game":"match","diff":"icons","cat":"All","selector":"#stage","label":"round-10-render","action":"inspect","ok":true,"effect":"stage_html_len=126, choices=4, imgs_ok=10, imgs_broken=0","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:18.928Z","game":"match","diff":"icons","cat":"All","selector":".choice","label":"round-10-pick-0","action":"click","ok":true,"effect":"Chose: \"\", reveal: \"✓ Correct — “Charles X in his Coronation Robes” → by Jean-Auguste-Dominique Ingr\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:18.929Z","game":"match","diff":"icons","cat":"All","selector":"#reveal a","label":"round-10-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/12104","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:19.179Z","game":"match","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-10-next","action":"click","ok":true,"effect":"Next text: \"See results\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:19.582Z","game":"match","diff":"icons","cat":"All","selector":"#results","label":"results-screen","action":"inspect","ok":true,"effect":"score=46, verdict=\"The gallery guide is that way…\", best=\"Best (match · icons): 46\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:20.038Z","game":"match","diff":"icons","cat":"All","selector":"#againBtn","label":"play-again","action":"click","ok":true,"effect":"Setup panel returned: true","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:21.117Z","game":"early","diff":"icons","cat":"All","selector":"#gamePick .gcard[data-g=\"early\"]","label":"game-card-early","action":"click","ok":true,"effect":"card selected","errors":["REQUEST_FAILED: POST https://www.google-analytics.com/g/collect?v=2&tid=G-2HEVP6TD0J&gtm=45je67v1v9260226174za200zd9260226174&_p=1785792063673&gcd=13l3l3l3l1l1&npa=0&dma=0&_eu=AAAAAAQ&are=1&cid=1336036224.1785792037&frm=0&ngs=1&pscdl=noapi&rcb=1&sr=1600x900&uaa=arm&uab=64&uafvl=HeadlessChrome%3B149.0.7827.55%7CChromium%3B149.0.7827.55%7CNot)A%253BBrand%3B24.0.0.0&uam=&uamb=0&uap=macOS&uapv=26.4.0&uaw=0&ul=en-us&_s=2&tag_exp=115938466~115938469~118897920~118897930~119896802&sid=1785792036&sct=1&seg=1&dl=http%3A%2F%2Flocalhost%2Fgame&dt=The%20Signature%20Games%20%E2%80%94%20Celebrity%20Signatures&en=user_engagement&_et=16360&tfd=16378 — net::ERR_ABORTED"]}
+{"run":4,"ts":"2026-08-03T21:21:21.120Z","game":"early","diff":"icons","cat":"All","selector":"#catLabel/#catOpts","label":"category-row-visibility","action":"inspect","ok":true,"effect":"catLabel=none, catOpts=none, expected_visible=false, actual=false","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:21.317Z","game":"early","diff":"icons","cat":"All","selector":"#diffOpts .opt[data-d=\"icons\"]","label":"diff-icons","action":"click","ok":true,"effect":"selected","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:21.361Z","game":"early","diff":"icons","cat":"All","selector":"#goBtn","label":"begin-button","action":"click","ok":true,"effect":"Begin clicked","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:21.361Z","game":"early","diff":"icons","cat":"All","selector":"#play","label":"play-panel-appeared","action":"wait","ok":true,"effect":"play panel shown in 44ms","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:21.365Z","game":"early","diff":"icons","cat":"All","selector":"https://commons.wikimedia.org/wiki/Special:FilePath/Gustave%20Courbet%20signature.svg?width=400","label":"round-1-image","action":"inspect","ok":false,"effect":"Image broken/404: https://commons.wikimedia.org/wiki/Special:FilePath/Gustave%20Courbet%20signature.svg?width=400","errors":["Image 404 or broken: https://commons.wikimedia.org/wiki/Special:FilePath/Gustave%20Courbet%20signature.svg?width=400"]}
+{"run":4,"ts":"2026-08-03T21:21:21.366Z","game":"early","diff":"icons","cat":"All","selector":"https://commons.wikimedia.org/wiki/Special:FilePath/Courbet%20-%20Portrait%20of%20Armand%20Gautier%2C%201867%20-%201871.jpg?width=400","label":"round-1-image","action":"inspect","ok":false,"effect":"Image broken/404: https://commons.wikimedia.org/wiki/Special:FilePath/Courbet%20-%20Portrait%20of%20Armand%20Gautier%2C%201867%20-%201871.jpg?width=400","errors":["Image 404 or broken: https://commons.wikimedia.org/wiki/Special:FilePath/Courbet%20-%20Portrait%20of%20Armand%20Gautier%2C%201867%20-%201871.jpg?width=400"]}
+{"run":4,"ts":"2026-08-03T21:21:21.367Z","game":"early","diff":"icons","cat":"All","selector":"#stage","label":"round-1-render","action":"inspect","ok":true,"effect":"stage_html_len=478, choices=2, imgs_ok=0, imgs_broken=2","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:21.816Z","game":"early","diff":"icons","cat":"All","selector":".choice","label":"round-1-pick-0","action":"click","ok":true,"effect":"Chose: \"A is earlier\", reveal: \"✗ Gustave Courbet: B is from 1867, the other from 1871 · see the timeline →Next \"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:22.067Z","game":"early","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-1-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:22.475Z","game":"early","diff":"icons","cat":"All","selector":"#stage","label":"round-2-render","action":"inspect","ok":true,"effect":"stage_html_len=484, choices=2, imgs_ok=2, imgs_broken=2","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:22.927Z","game":"early","diff":"icons","cat":"All","selector":".choice","label":"round-2-pick-1","action":"click","ok":true,"effect":"Chose: \"B is earlier\", reveal: \"✓ Correct — René Magritte: B is from 1898, the other from 1960 · see the timelin\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:23.182Z","game":"early","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-2-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:23.590Z","game":"early","diff":"icons","cat":"All","selector":"#stage","label":"round-3-render","action":"inspect","ok":true,"effect":"stage_html_len=719, choices=2, imgs_ok=4, imgs_broken=2","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:24.039Z","game":"early","diff":"icons","cat":"All","selector":".choice","label":"round-3-pick-1","action":"click","ok":true,"effect":"Chose: \"B is earlier\", reveal: \"✗ Jan van Eyck: A is from 1433, the other from 1896 · see the timeline →Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:24.291Z","game":"early","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-3-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:24.696Z","game":"early","diff":"icons","cat":"All","selector":"https://commons.wikimedia.org/wiki/Special:FilePath/Aim%C3%A9e%20Brune-Pag%C3%A8s%20-%20Signature%201834.jpg?width=400","label":"round-4-image","action":"inspect","ok":false,"effect":"Image broken/404: https://commons.wikimedia.org/wiki/Special:FilePath/Aim%C3%A9e%20Brune-Pag%C3%A8s%20-%20Signature%201834.jpg?width=400","errors":["Image 404 or broken: https://commons.wikimedia.org/wiki/Special:FilePath/Aim%C3%A9e%20Brune-Pag%C3%A8s%20-%20Signature%201834.jpg?width=400"]}
+{"run":4,"ts":"2026-08-03T21:21:24.697Z","game":"early","diff":"icons","cat":"All","selector":"https://commons.wikimedia.org/wiki/Special:FilePath/Aimee%20Brune-Pages%20-%20Le%20Retour%2C%201831%20signature.webp?width=400","label":"round-4-image","action":"inspect","ok":false,"effect":"Image broken/404: https://commons.wikimedia.org/wiki/Special:FilePath/Aimee%20Brune-Pages%20-%20Le%20Retour%2C%201831%20signature.webp?width=400","errors":["Image 404 or broken: https://commons.wikimedia.org/wiki/Special:FilePath/Aimee%20Brune-Pages%20-%20Le%20Retour%2C%201831%20signature.webp?width=400"]}
+{"run":4,"ts":"2026-08-03T21:21:24.698Z","game":"early","diff":"icons","cat":"All","selector":"#stage","label":"round-4-render","action":"inspect","ok":true,"effect":"stage_html_len=494, choices=2, imgs_ok=4, imgs_broken=4","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:25.150Z","game":"early","diff":"icons","cat":"All","selector":".choice","label":"round-4-pick-0","action":"click","ok":true,"effect":"Chose: \"A is earlier\", reveal: \"✗ Aimée Brune-Pagès: B is from 1831, the other from 1834 · see the timeline →Nex\"","errors":["REQUEST_FAILED: POST https://www.google-analytics.com/g/collect?v=2&tid=G-2HEVP6TD0J&gtm=45je67v1v9260226174za200zd9260226174&_p=1785792080046&gcd=13l3l3l3l1l1&npa=0&dma=0&_eu=AAAAAAQ&are=1&cid=1336036224.1785792037&frm=0&ngs=1&pscdl=noapi&rcb=19&sr=1600x900&uaa=arm&uab=64&uafvl=HeadlessChrome%3B149.0.7827.55%7CChromium%3B149.0.7827.55%7CNot)A%253BBrand%3B24.0.0.0&uam=&uamb=0&uap=macOS&uapv=26.4.0&uaw=0&ul=en-us&_s=1&tag_exp=115616986~115938466~115938468~118897920~118897930~119896803~120222307&sid=1785792036&sct=1&seg=1&dl=http%3A%2F%2Flocalhost%2Fgame&dt=The%20Signature%20Games%20%E2%80%94%20Celebrity%20Signatures&en=page_view&_ee=1&tfd=5019 — net::ERR_ABORTED"]}
+{"run":4,"ts":"2026-08-03T21:21:25.401Z","game":"early","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-4-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:25.808Z","game":"early","diff":"icons","cat":"All","selector":"#stage","label":"round-5-render","action":"inspect","ok":true,"effect":"stage_html_len=662, choices=2, imgs_ok=6, imgs_broken=4","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:26.261Z","game":"early","diff":"icons","cat":"All","selector":".choice","label":"round-5-pick-1","action":"click","ok":true,"effect":"Chose: \"B is earlier\", reveal: \"✗ Theodore Roosevelt: A is from 1858, the other from 1905 · see the timeline →Ne\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:26.512Z","game":"early","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-5-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:26.920Z","game":"early","diff":"icons","cat":"All","selector":"#stage","label":"round-6-render","action":"inspect","ok":true,"effect":"stage_html_len=502, choices=2, imgs_ok=8, imgs_broken=4","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:27.359Z","game":"early","diff":"icons","cat":"All","selector":".choice","label":"round-6-pick-1","action":"click","ok":true,"effect":"Chose: \"B is earlier\", reveal: \"✗ Joseph-Victor Ranvier: A is from 1870, the other from 1871 · see the timeline \"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:27.609Z","game":"early","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-6-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:28.018Z","game":"early","diff":"icons","cat":"All","selector":"#stage","label":"round-7-render","action":"inspect","ok":true,"effect":"stage_html_len=562, choices=2, imgs_ok=10, imgs_broken=4","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:28.469Z","game":"early","diff":"icons","cat":"All","selector":".choice","label":"round-7-pick-0","action":"click","ok":true,"effect":"Chose: \"A is earlier\", reveal: \"✓ Correct — Jan van Eyck: A is from 1433, the other from 1439 · see the timeline\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:28.720Z","game":"early","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-7-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:29.128Z","game":"early","diff":"icons","cat":"All","selector":"#stage","label":"round-8-render","action":"inspect","ok":true,"effect":"stage_html_len=474, choices=2, imgs_ok=12, imgs_broken=4","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:29.568Z","game":"early","diff":"icons","cat":"All","selector":".choice","label":"round-8-pick-1","action":"click","ok":true,"effect":"Chose: \"B is earlier\", reveal: \"✓ Correct — Frédéric Bazille: B is from 1841, the other from 1867 · see the time\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:29.819Z","game":"early","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-8-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:30.226Z","game":"early","diff":"icons","cat":"All","selector":"#stage","label":"round-9-render","action":"inspect","ok":true,"effect":"stage_html_len=491, choices=2, imgs_ok=14, imgs_broken=4","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:30.678Z","game":"early","diff":"icons","cat":"All","selector":".choice","label":"round-9-pick-1","action":"click","ok":true,"effect":"Chose: \"B is earlier\", reveal: \"✗ Amedeo Modigliani: A is from 1916, the other from 1919 · see the timeline →Nex\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:30.932Z","game":"early","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-9-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:31.342Z","game":"early","diff":"icons","cat":"All","selector":"#stage","label":"round-10-render","action":"inspect","ok":true,"effect":"stage_html_len=424, choices=2, imgs_ok=16, imgs_broken=4","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:31.790Z","game":"early","diff":"icons","cat":"All","selector":".choice","label":"round-10-pick-0","action":"click","ok":true,"effect":"Chose: \"A is earlier\", reveal: \"✓ Correct — Tani Bunchō: A is from 1789, the other from 1811 · see the timeline \"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:32.040Z","game":"early","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-10-next","action":"click","ok":true,"effect":"Next text: \"See results\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:32.447Z","game":"early","diff":"icons","cat":"All","selector":"#results","label":"results-screen","action":"inspect","ok":true,"effect":"score=42, verdict=\"The gallery guide is that way…\", best=\"Best (early · icons): 42\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:32.900Z","game":"early","diff":"icons","cat":"All","selector":"#againBtn","label":"play-again","action":"click","ok":true,"effect":"Setup panel returned: true","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:33.978Z","game":"century","diff":"icons","cat":"All","selector":"#gamePick .gcard[data-g=\"century\"]","label":"game-card-century","action":"click","ok":true,"effect":"card selected","errors":["REQUEST_FAILED: POST https://www.google-analytics.com/g/collect?v=2&tid=G-2HEVP6TD0J&gtm=45je67v1v9260226174za200zd9260226174&_p=1785792080046&gcd=13l3l3l3l1l1&npa=0&dma=0&_eu=AAAAAAQ&are=1&cid=1336036224.1785792037&frm=0&ngs=1&pscdl=noapi&rcb=19&sr=1600x900&uaa=arm&uab=64&uafvl=HeadlessChrome%3B149.0.7827.55%7CChromium%3B149.0.7827.55%7CNot)A%253BBrand%3B24.0.0.0&uam=&uamb=0&uap=macOS&uapv=26.4.0&uaw=0&ul=en-us&_s=2&tag_exp=115616986~115938466~115938468~118897920~118897930~119896803~120222307&sid=1785792036&sct=1&seg=1&dl=http%3A%2F%2Flocalhost%2Fgame&dt=The%20Signature%20Games%20%E2%80%94%20Celebrity%20Signatures&en=user_engagement&_et=12850&tfd=12870 — net::ERR_ABORTED"]}
+{"run":4,"ts":"2026-08-03T21:21:33.981Z","game":"century","diff":"icons","cat":"All","selector":"#catLabel/#catOpts","label":"category-row-visibility","action":"inspect","ok":true,"effect":"catLabel=block, catOpts=flex, expected_visible=true, actual=true","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:34.178Z","game":"century","diff":"icons","cat":"All","selector":"#diffOpts .opt[data-d=\"icons\"]","label":"diff-icons","action":"click","ok":true,"effect":"selected","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:34.376Z","game":"century","diff":"icons","cat":"All","selector":"#catOpts .opt[data-c=\"All\"]","label":"cat-All","action":"click","ok":true,"effect":"selected","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:34.424Z","game":"century","diff":"icons","cat":"All","selector":"#goBtn","label":"begin-button","action":"click","ok":true,"effect":"Begin clicked","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:34.425Z","game":"century","diff":"icons","cat":"All","selector":"#play","label":"play-panel-appeared","action":"wait","ok":true,"effect":"play panel shown in 49ms","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:34.429Z","game":"century","diff":"icons","cat":"All","selector":"https://upload.wikimedia.org/wikipedia/commons/6/65/FreudSignature.svg","label":"round-1-image","action":"inspect","ok":false,"effect":"Image broken/404: https://upload.wikimedia.org/wikipedia/commons/6/65/FreudSignature.svg","errors":["Image 404 or broken: https://upload.wikimedia.org/wikipedia/commons/6/65/FreudSignature.svg"]}
+{"run":4,"ts":"2026-08-03T21:21:34.429Z","game":"century","diff":"icons","cat":"All","selector":"#stage","label":"round-1-render","action":"inspect","ok":true,"effect":"stage_html_len=118, choices=4, imgs_ok=0, imgs_broken=1","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:34.915Z","game":"century","diff":"icons","cat":"All","selector":".choice","label":"round-1-pick-0","action":"click","ok":true,"effect":"Chose: \"20th century\", reveal: \"✓ Correct — Sigmund Freud died 1939 (20th century) · their page →Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:35.168Z","game":"century","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-1-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:35.582Z","game":"century","diff":"icons","cat":"All","selector":"#stage","label":"round-2-render","action":"inspect","ok":true,"effect":"stage_html_len=126, choices=4, imgs_ok=1, imgs_broken=1","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:36.041Z","game":"century","diff":"icons","cat":"All","selector":".choice","label":"round-2-pick-3","action":"click","ok":true,"effect":"Chose: \"16th century\", reveal: \"✗ Albert Camus died 1960 (20th century) · their page →Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:36.307Z","game":"century","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-2-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:36.715Z","game":"century","diff":"icons","cat":"All","selector":"#stage","label":"round-3-render","action":"inspect","ok":true,"effect":"stage_html_len=170, choices=4, imgs_ok=2, imgs_broken=1","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:37.165Z","game":"century","diff":"icons","cat":"All","selector":".choice","label":"round-3-pick-2","action":"click","ok":true,"effect":"Chose: \"17th century\", reveal: \"✗ Immanuel Kant died 1804 (19th century) · their page →Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:37.417Z","game":"century","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-3-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:37.825Z","game":"century","diff":"icons","cat":"All","selector":"#stage","label":"round-4-render","action":"inspect","ok":true,"effect":"stage_html_len=132, choices=4, imgs_ok=3, imgs_broken=1","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:38.276Z","game":"century","diff":"icons","cat":"All","selector":".choice","label":"round-4-pick-0","action":"click","ok":true,"effect":"Chose: \"19th century\", reveal: \"✗ Franklin Delano Roosevelt died 1945 (20th century) · their page →Next →\"","errors":["REQUEST_FAILED: POST https://www.google-analytics.com/g/collect?v=2&tid=G-2HEVP6TD0J&gtm=45je67v1v9260226174za200zd9260226174&_p=1785792092911&gcd=13l3l3l3l1l1&npa=0&dma=0&_eu=AAAAAAQ&are=1&cid=1336036224.1785792037&frm=0&ngs=1&pscdl=noapi&rcb=12&sr=1600x900&uaa=arm&uab=64&uafvl=HeadlessChrome%3B149.0.7827.55%7CChromium%3B149.0.7827.55%7CNot)A%253BBrand%3B24.0.0.0&uam=&uamb=0&uap=macOS&uapv=26.4.0&uaw=0&ul=en-us&_s=1&tag_exp=115616985~115938465~115938469~118897920~118897930~119337768~119896803~120222308&sid=1785792036&sct=1&seg=1&dl=http%3A%2F%2Flocalhost%2Fgame&dt=The%20Signature%20Games%20%E2%80%94%20Celebrity%20Signatures&en=page_view&_ee=1&tfd=5022 — net::ERR_ABORTED"]}
+{"run":4,"ts":"2026-08-03T21:21:38.526Z","game":"century","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-4-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:38.936Z","game":"century","diff":"icons","cat":"All","selector":"#stage","label":"round-5-render","action":"inspect","ok":true,"effect":"stage_html_len=127, choices=4, imgs_ok=4, imgs_broken=1","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:39.389Z","game":"century","diff":"icons","cat":"All","selector":".choice","label":"round-5-pick-3","action":"click","ok":true,"effect":"Chose: \"18th century\", reveal: \"✗ Blaise Pascal died 1662 (17th century) · their page →Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:39.638Z","game":"century","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-5-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:40.055Z","game":"century","diff":"icons","cat":"All","selector":"#stage","label":"round-6-render","action":"inspect","ok":true,"effect":"stage_html_len=132, choices=4, imgs_ok=5, imgs_broken=1","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:40.519Z","game":"century","diff":"icons","cat":"All","selector":".choice","label":"round-6-pick-2","action":"click","ok":true,"effect":"Chose: \"17th century\", reveal: \"✗ Albrecht Dürer died 1528 (16th century) · their page →Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:40.761Z","game":"century","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-6-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:41.171Z","game":"century","diff":"icons","cat":"All","selector":"#stage","label":"round-7-render","action":"inspect","ok":true,"effect":"stage_html_len=133, choices=4, imgs_ok=6, imgs_broken=1","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:41.624Z","game":"century","diff":"icons","cat":"All","selector":".choice","label":"round-7-pick-0","action":"click","ok":true,"effect":"Chose: \"19th century\", reveal: \"✗ William Shakespeare died 1616 (17th century) · their page →Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:41.875Z","game":"century","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-7-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:42.289Z","game":"century","diff":"icons","cat":"All","selector":"#stage","label":"round-8-render","action":"inspect","ok":true,"effect":"stage_html_len=123, choices=4, imgs_ok=7, imgs_broken=1","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:42.750Z","game":"century","diff":"icons","cat":"All","selector":".choice","label":"round-8-pick-3","action":"click","ok":true,"effect":"Chose: \"21st century\", reveal: \"✗ Vladimir Lenin died 1924 (20th century) · their page →Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:43.015Z","game":"century","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-8-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:43.423Z","game":"century","diff":"icons","cat":"All","selector":"#stage","label":"round-9-render","action":"inspect","ok":true,"effect":"stage_html_len=136, choices=4, imgs_ok=8, imgs_broken=1","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:43.873Z","game":"century","diff":"icons","cat":"All","selector":".choice","label":"round-9-pick-2","action":"click","ok":true,"effect":"Chose: \"20th century\", reveal: \"✓ Correct — Sarah Bernhardt died 1923 (20th century) · their page →Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:44.124Z","game":"century","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-9-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:44.532Z","game":"century","diff":"icons","cat":"All","selector":"#stage","label":"round-10-render","action":"inspect","ok":true,"effect":"stage_html_len=130, choices=4, imgs_ok=9, imgs_broken=1","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:44.985Z","game":"century","diff":"icons","cat":"All","selector":".choice","label":"round-10-pick-0","action":"click","ok":true,"effect":"Chose: \"17th century\", reveal: \"✗ Ernest Hemingway died 1961 (20th century) · their page →See results\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:45.237Z","game":"century","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-10-next","action":"click","ok":true,"effect":"Next text: \"See results\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:45.641Z","game":"century","diff":"icons","cat":"All","selector":"#results","label":"results-screen","action":"inspect","ok":true,"effect":"score=20, verdict=\"Everyone starts somewhere.\", best=\"Best (century · icons): 20\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:46.095Z","game":"century","diff":"icons","cat":"All","selector":"#againBtn","label":"play-again","action":"click","ok":true,"effect":"Setup panel returned: true","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:47.173Z","game":"lightning","diff":"icons","cat":"All","selector":"#gamePick .gcard[data-g=\"lightning\"]","label":"game-card-lightning","action":"click","ok":true,"effect":"card selected","errors":["REQUEST_FAILED: POST https://www.google-analytics.com/g/collect?v=2&tid=G-2HEVP6TD0J&gtm=45je67v1v9260226174za200zd9260226174&_p=1785792092911&gcd=13l3l3l3l1l1&npa=0&dma=0&_eu=AAAAAAQ&are=1&cid=1336036224.1785792037&frm=0&ngs=1&pscdl=noapi&rcb=12&sr=1600x900&uaa=arm&uab=64&uafvl=HeadlessChrome%3B149.0.7827.55%7CChromium%3B149.0.7827.55%7CNot)A%253BBrand%3B24.0.0.0&uam=&uamb=0&uap=macOS&uapv=26.4.0&uaw=0&ul=en-us&_s=2&tag_exp=115616985~115938465~115938469~118897920~118897930~119337768~119896803~120222308&sid=1785792036&sct=1&seg=1&dl=http%3A%2F%2Flocalhost%2Fgame&dt=The%20Signature%20Games%20%E2%80%94%20Celebrity%20Signatures&en=user_engagement&_et=13177&tfd=13199 — net::ERR_ABORTED"]}
+{"run":4,"ts":"2026-08-03T21:21:47.177Z","game":"lightning","diff":"icons","cat":"All","selector":"#catLabel/#catOpts","label":"category-row-visibility","action":"inspect","ok":true,"effect":"catLabel=none, catOpts=none, expected_visible=false, actual=false","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:47.374Z","game":"lightning","diff":"icons","cat":"All","selector":"#diffOpts .opt[data-d=\"icons\"]","label":"diff-icons","action":"click","ok":true,"effect":"selected","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:47.416Z","game":"lightning","diff":"icons","cat":"All","selector":"#goBtn","label":"begin-button","action":"click","ok":true,"effect":"Begin clicked","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:47.920Z","game":"lightning","diff":"icons","cat":"All","selector":"#play","label":"play-panel-appeared","action":"wait","ok":true,"effect":"play panel shown in 546ms","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:47.925Z","game":"lightning","diff":"icons","cat":"All","selector":"#timerbar","label":"round-1-timer","action":"inspect","ok":true,"effect":"Timer bar visible, fill class: tb-fill run","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:53.427Z","game":"lightning","diff":"icons","cat":"All","selector":"#reveal","label":"round-1-timer-out","action":"wait","ok":true,"effect":"Reveal after timeout: \"⏱ Time! Artist: Anthony van DyckNext →\"","errors":["REQUEST_FAILED: POST https://www.google-analytics.com/g/collect?v=2&tid=G-2HEVP6TD0J&gtm=45je67v1v9260226174za200zd9260226174&_p=1785792106103&gcd=13l3l3l3l1l1&npa=0&dma=0&_eu=AAAAAAQ&are=1&cid=1336036224.1785792037&frm=0&ngs=1&pscdl=noapi&rcb=8&sr=1600x900&uaa=arm&uab=64&uafvl=HeadlessChrome%3B149.0.7827.55%7CChromium%3B149.0.7827.55%7CNot)A%253BBrand%3B24.0.0.0&uam=&uamb=0&uap=macOS&uapv=26.4.0&uaw=0&ul=en-us&_s=1&tag_exp=115938465~115938468~118897920~118897930~119896803&sid=1785792036&sct=1&seg=1&dl=http%3A%2F%2Flocalhost%2Fgame&dt=The%20Signature%20Games%20%E2%80%94%20Celebrity%20Signatures&en=page_view&_ee=1&tfd=5018 — net::ERR_ABORTED"]}
+{"run":4,"ts":"2026-08-03T21:21:53.430Z","game":"lightning","diff":"icons","cat":"All","selector":".choice","label":"round-1-choices-disabled","action":"inspect","ok":true,"effect":"Choices disabled after timeout: true","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:53.431Z","game":"lightning","diff":"icons","cat":"All","selector":"#stage","label":"round-1-render","action":"inspect","ok":true,"effect":"stage_html_len=193, choices=4, imgs_ok=1, imgs_broken=0","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:53.764Z","game":"lightning","diff":"icons","cat":"All","selector":"#timerbar","label":"round-2-timer","action":"inspect","ok":true,"effect":"Timer bar visible, fill class: tb-fill run","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:53.765Z","game":"lightning","diff":"icons","cat":"All","selector":"#stage","label":"round-2-render","action":"inspect","ok":true,"effect":"stage_html_len=195, choices=4, imgs_ok=2, imgs_broken=0","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:54.221Z","game":"lightning","diff":"icons","cat":"All","selector":".choice","label":"round-2-pick-3","action":"click","ok":true,"effect":"Chose: \"Woman Bathing\", reveal: \"✗ Painting: Titian and His Mistress · see it →Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:54.223Z","game":"lightning","diff":"icons","cat":"All","selector":"#reveal a","label":"round-2-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/55983","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:54.473Z","game":"lightning","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-2-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:54.883Z","game":"lightning","diff":"icons","cat":"All","selector":"#timerbar","label":"round-3-timer","action":"inspect","ok":true,"effect":"Timer bar visible, fill class: tb-fill run","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:54.883Z","game":"lightning","diff":"icons","cat":"All","selector":"#stage","label":"round-3-render","action":"inspect","ok":true,"effect":"stage_html_len=193, choices=4, imgs_ok=3, imgs_broken=0","errors":[]}
+{"run":4,"ts":"2026-08-03T21:21:55.347Z","game":"lightning","diff":"icons","cat":"All","selector":".choice","label":"round-3-pick-2","action":"click","ok":true,"effect":"Chose: \"Titian\", reveal: \"✗ Artist: Mary CassattNext →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:22:25.348Z","game":"lightning","diff":"icons","cat":"All","selector":"#reveal a","label":"round-3-reveal-link","action":"inspect","ok":false,"effect":"No reveal link found after pick","errors":["Missing reveal link in lightning round 3"]}
+{"run":4,"ts":"2026-08-03T21:22:25.597Z","game":"lightning","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-3-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:22:26.003Z","game":"lightning","diff":"icons","cat":"All","selector":"#timerbar","label":"round-4-timer","action":"inspect","ok":true,"effect":"Timer bar visible, fill class: tb-fill run","errors":[]}
+{"run":4,"ts":"2026-08-03T21:22:26.004Z","game":"lightning","diff":"icons","cat":"All","selector":"#stage","label":"round-4-render","action":"inspect","ok":true,"effect":"stage_html_len=195, choices=4, imgs_ok=4, imgs_broken=0","errors":[]}
+{"run":4,"ts":"2026-08-03T21:22:26.456Z","game":"lightning","diff":"icons","cat":"All","selector":".choice","label":"round-4-pick-0","action":"click","ok":true,"effect":"Chose: \"Still Life—Strawberries, Nuts, &c.\", reveal: \"✗ Painting: Woman Bathing · see it →Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:22:26.457Z","game":"lightning","diff":"icons","cat":"All","selector":"#reveal a","label":"round-4-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/13506","errors":[]}
+{"run":4,"ts":"2026-08-03T21:22:26.709Z","game":"lightning","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-4-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:22:27.116Z","game":"lightning","diff":"icons","cat":"All","selector":"#timerbar","label":"round-5-timer","action":"inspect","ok":true,"effect":"Timer bar visible, fill class: tb-fill run","errors":[]}
+{"run":4,"ts":"2026-08-03T21:22:27.116Z","game":"lightning","diff":"icons","cat":"All","selector":"#stage","label":"round-5-render","action":"inspect","ok":true,"effect":"stage_html_len=193, choices=4, imgs_ok=5, imgs_broken=0","errors":[]}
+{"run":4,"ts":"2026-08-03T21:22:27.569Z","game":"lightning","diff":"icons","cat":"All","selector":".choice","label":"round-5-pick-3","action":"click","ok":true,"effect":"Chose: \"Anthony van Dyck\", reveal: \"✗ Artist: TitianNext →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:22:57.569Z","game":"lightning","diff":"icons","cat":"All","selector":"#reveal a","label":"round-5-reveal-link","action":"inspect","ok":false,"effect":"No reveal link found after pick","errors":["Missing reveal link in lightning round 5"]}
+{"run":4,"ts":"2026-08-03T21:22:57.820Z","game":"lightning","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-5-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:22:58.225Z","game":"lightning","diff":"icons","cat":"All","selector":"#timerbar","label":"round-6-timer","action":"inspect","ok":true,"effect":"Timer bar visible, fill class: tb-fill run","errors":[]}
+{"run":4,"ts":"2026-08-03T21:22:58.226Z","game":"lightning","diff":"icons","cat":"All","selector":"#stage","label":"round-6-render","action":"inspect","ok":true,"effect":"stage_html_len=195, choices=4, imgs_ok=6, imgs_broken=0","errors":[]}
+{"run":4,"ts":"2026-08-03T21:22:58.680Z","game":"lightning","diff":"icons","cat":"All","selector":".choice","label":"round-6-pick-2","action":"click","ok":true,"effect":"Chose: \"Titian and His Mistress\", reveal: \"✗ Painting: The Submersion of Pharaoh's Army in the Red Sea · see it →Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:22:58.681Z","game":"lightning","diff":"icons","cat":"All","selector":"#reveal a","label":"round-6-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/181315","errors":[]}
+{"run":4,"ts":"2026-08-03T21:22:58.933Z","game":"lightning","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-6-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:22:59.338Z","game":"lightning","diff":"icons","cat":"All","selector":"#timerbar","label":"round-7-timer","action":"inspect","ok":true,"effect":"Timer bar visible, fill class: tb-fill run","errors":[]}
+{"run":4,"ts":"2026-08-03T21:22:59.339Z","game":"lightning","diff":"icons","cat":"All","selector":"#stage","label":"round-7-render","action":"inspect","ok":true,"effect":"stage_html_len=193, choices=4, imgs_ok=7, imgs_broken=0","errors":[]}
+{"run":4,"ts":"2026-08-03T21:22:59.792Z","game":"lightning","diff":"icons","cat":"All","selector":".choice","label":"round-7-pick-0","action":"click","ok":true,"effect":"Chose: \"Raphael\", reveal: \"✗ Artist: Beatrix PotterNext →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:23:29.792Z","game":"lightning","diff":"icons","cat":"All","selector":"#reveal a","label":"round-7-reveal-link","action":"inspect","ok":false,"effect":"No reveal link found after pick","errors":["Missing reveal link in lightning round 7"]}
+{"run":4,"ts":"2026-08-03T21:23:30.044Z","game":"lightning","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-7-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:23:30.450Z","game":"lightning","diff":"icons","cat":"All","selector":"#timerbar","label":"round-8-timer","action":"inspect","ok":true,"effect":"Timer bar visible, fill class: tb-fill run","errors":[]}
+{"run":4,"ts":"2026-08-03T21:23:30.450Z","game":"lightning","diff":"icons","cat":"All","selector":"#stage","label":"round-8-render","action":"inspect","ok":true,"effect":"stage_html_len=195, choices=4, imgs_ok=8, imgs_broken=0","errors":[]}
+{"run":4,"ts":"2026-08-03T21:23:30.903Z","game":"lightning","diff":"icons","cat":"All","selector":".choice","label":"round-8-pick-3","action":"click","ok":true,"effect":"Chose: \"Still Life—Strawberries, Nuts, &c.\", reveal: \"✗ Painting: Sleeping Infant Faun Visited by an Inquisitive Rabbit · see it →Next\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:23:30.903Z","game":"lightning","diff":"icons","cat":"All","selector":"#reveal a","label":"round-8-reveal-link","action":"inspect","ok":true,"effect":"Reveal link: https://www.artic.edu/artworks/560","errors":[]}
+{"run":4,"ts":"2026-08-03T21:23:31.155Z","game":"lightning","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-8-next","action":"click","ok":true,"effect":"Next text: \"Next →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:23:31.561Z","game":"lightning","diff":"icons","cat":"All","selector":"#timerbar","label":"round-9-timer","action":"inspect","ok":true,"effect":"Timer bar visible, fill class: tb-fill run","errors":[]}
+{"run":4,"ts":"2026-08-03T21:23:31.561Z","game":"lightning","diff":"icons","cat":"All","selector":"#stage","label":"round-9-render","action":"inspect","ok":true,"effect":"stage_html_len=193, choices=4, imgs_ok=9, imgs_broken=0","errors":[]}
+{"run":4,"ts":"2026-08-03T21:23:32.014Z","game":"lightning","diff":"icons","cat":"All","selector":".choice","label":"round-9-pick-2","action":"click","ok":true,"effect":"Chose: \"Claude Monet\", reveal: \"✓ Artist: Claude MonetNext →\"","errors":[]}
+{"run":4,"ts":"2026-08-03T21:23:35.271Z","game":"lightning","diff":"icons","cat":"All","selector":"#reveal a","label":"round-9-reveal-link","action":"inspect","ok":false,"effect":"No reveal link found after pick","errors":["Missing reveal link in lightning round 9"]}
+{"run":4,"ts":"2026-08-03T21:23:36.474Z","game":"lightning","diff":"icons","cat":"All","selector":"#nextBtn","label":"round-9-next","action":"click","ok":false,"effect":"Next button not visible after pick+wait","errors":[]}
+{"run":4,"ts":"2026-08-03T21:23:36.476Z","game":"lightning","diff":"icons","cat":"All","selector":"#stage","label":"round-10-stage","action":"inspect","ok":false,"effect":"Stage inspect failed","errors":["Error: locator.innerHTML: Target page, context or browser has been closed"]}
+{"run":4,"ts":"2026-08-03T21:23:36.477Z","game":"lightning","diff":"icons","cat":"All","selector":"#timerbar","label":"round-10-timer","action":"inspect","ok":false,"effect":"Timer check failed","errors":["Error: locator.getAttribute: Target page, context or browser has been closed"]}
+{"run":4,"ts":"2026-08-03T21:23:36.478Z","game":"lightning","diff":"icons","cat":"All","selector":"#choices","label":"round-10-choices","action":"inspect","ok":false,"effect":"Choice inspect failed","errors":["Error: locator.all: Target page, context or browser has been closed"]}
+{"run":4,"ts":"2026-08-03T21:23:36.478Z","game":"lightning","diff":"icons","cat":"All","selector":"#stage","label":"round-10-render","action":"inspect","ok":false,"effect":"stage_html_len=0, choices=0, imgs_ok=9, imgs_broken=0","errors":[]}
+{"run":4,"ts":"2026-08-03T21:23:36.478Z","game":"lightning","diff":"icons","cat":"All","selector":".choice","label":"round-10-pick","action":"click","ok":false,"effect":"Choice click failed","errors":["Error: locator.all: Target page, context or browser has been closed"]}
+{"run":4,"ts":"2026-08-03T21:23:36.479Z","game":"lightning","diff":"icons","cat":"All","selector":"#reveal a","label":"round-10-reveal-link","action":"inspect","ok":false,"effect":"No reveal link found after pick","errors":["Missing reveal link in lightning round 10"]}
diff --git a/screenrecord/rec/run0/page@0647016d982221a1fe900c1840e6137c.mp4 b/screenrecord/rec/run0/page@0647016d982221a1fe900c1840e6137c.mp4
new file mode 100644
index 0000000..09f2626
Binary files /dev/null and b/screenrecord/rec/run0/page@0647016d982221a1fe900c1840e6137c.mp4 differ
diff --git a/screenrecord/rec/run0/page@132bd296b39d3b1aa89f178e875872b8.mp4 b/screenrecord/rec/run0/page@132bd296b39d3b1aa89f178e875872b8.mp4
new file mode 100644
index 0000000..e06a75d
Binary files /dev/null and b/screenrecord/rec/run0/page@132bd296b39d3b1aa89f178e875872b8.mp4 differ
diff --git a/screenrecord/rec/run0/page@389e0070fb0f53072a02e201a1d39b94.mp4 b/screenrecord/rec/run0/page@389e0070fb0f53072a02e201a1d39b94.mp4
new file mode 100644
index 0000000..f35a1c4
Binary files /dev/null and b/screenrecord/rec/run0/page@389e0070fb0f53072a02e201a1d39b94.mp4 differ
diff --git a/screenrecord/rec/run0/page@3cd1340a9f795dfa77fee107dd42b186.mp4 b/screenrecord/rec/run0/page@3cd1340a9f795dfa77fee107dd42b186.mp4
new file mode 100644
index 0000000..57a54e6
Binary files /dev/null and b/screenrecord/rec/run0/page@3cd1340a9f795dfa77fee107dd42b186.mp4 differ
diff --git a/screenrecord/rec/run0/page@672ecf6b0ba2e0c8477e0729ffa95655.mp4 b/screenrecord/rec/run0/page@672ecf6b0ba2e0c8477e0729ffa95655.mp4
new file mode 100644
index 0000000..59f0667
Binary files /dev/null and b/screenrecord/rec/run0/page@672ecf6b0ba2e0c8477e0729ffa95655.mp4 differ
diff --git a/screenrecord/rec/run0/page@95748996b98a04424eb89029ed59900d.mp4 b/screenrecord/rec/run0/page@95748996b98a04424eb89029ed59900d.mp4
new file mode 100644
index 0000000..8cde433
Binary files /dev/null and b/screenrecord/rec/run0/page@95748996b98a04424eb89029ed59900d.mp4 differ
diff --git a/screenrecord/rec/run0/page@d53150f4fc5f7157ff9b327bcc85a6f7.mp4 b/screenrecord/rec/run0/page@d53150f4fc5f7157ff9b327bcc85a6f7.mp4
new file mode 100644
index 0000000..e1a06d5
Binary files /dev/null and b/screenrecord/rec/run0/page@d53150f4fc5f7157ff9b327bcc85a6f7.mp4 differ
diff --git a/screenrecord/rec/run0/page@ece429832621fdc53eb7bdbe5ffe9935.mp4 b/screenrecord/rec/run0/page@ece429832621fdc53eb7bdbe5ffe9935.mp4
new file mode 100644
index 0000000..9f1920e
Binary files /dev/null and b/screenrecord/rec/run0/page@ece429832621fdc53eb7bdbe5ffe9935.mp4 differ
diff --git a/screenrecord/rec/run1/page@09e5454e881013074dead68e52820662.mp4 b/screenrecord/rec/run1/page@09e5454e881013074dead68e52820662.mp4
new file mode 100644
index 0000000..e923edb
Binary files /dev/null and b/screenrecord/rec/run1/page@09e5454e881013074dead68e52820662.mp4 differ
diff --git a/screenrecord/rec/run1/page@2e16f317b77a99fd179e90b70d6dc6c0.mp4 b/screenrecord/rec/run1/page@2e16f317b77a99fd179e90b70d6dc6c0.mp4
new file mode 100644
index 0000000..beafec7
Binary files /dev/null and b/screenrecord/rec/run1/page@2e16f317b77a99fd179e90b70d6dc6c0.mp4 differ
diff --git a/screenrecord/rec/run1/page@5acccd111aa180017e3c3d3abe87cef4.mp4 b/screenrecord/rec/run1/page@5acccd111aa180017e3c3d3abe87cef4.mp4
new file mode 100644
index 0000000..d0e5ede
Binary files /dev/null and b/screenrecord/rec/run1/page@5acccd111aa180017e3c3d3abe87cef4.mp4 differ
diff --git a/screenrecord/rec/run1/page@b814d48e2e10052ebaca97130a7789bd.mp4 b/screenrecord/rec/run1/page@b814d48e2e10052ebaca97130a7789bd.mp4
new file mode 100644
index 0000000..e7d5674
Binary files /dev/null and b/screenrecord/rec/run1/page@b814d48e2e10052ebaca97130a7789bd.mp4 differ
diff --git a/screenrecord/rec/run1/page@bc094f397b8c213a7a61c8feaf3eb43b.mp4 b/screenrecord/rec/run1/page@bc094f397b8c213a7a61c8feaf3eb43b.mp4
new file mode 100644
index 0000000..056ed7e
Binary files /dev/null and b/screenrecord/rec/run1/page@bc094f397b8c213a7a61c8feaf3eb43b.mp4 differ
diff --git a/screenrecord/rec/run2/page@0e1b81dcf8e068dd5e0431e85fe8f2c7.mp4 b/screenrecord/rec/run2/page@0e1b81dcf8e068dd5e0431e85fe8f2c7.mp4
new file mode 100644
index 0000000..1380f9e
Binary files /dev/null and b/screenrecord/rec/run2/page@0e1b81dcf8e068dd5e0431e85fe8f2c7.mp4 differ
diff --git a/screenrecord/rec/run2/page@7a161f93a291136330d8f7621fe3a4ed.mp4 b/screenrecord/rec/run2/page@7a161f93a291136330d8f7621fe3a4ed.mp4
new file mode 100644
index 0000000..8f0c347
Binary files /dev/null and b/screenrecord/rec/run2/page@7a161f93a291136330d8f7621fe3a4ed.mp4 differ
diff --git a/screenrecord/rec/run2/page@7af0dbbbe7c306dc710790e56f508c9e.mp4 b/screenrecord/rec/run2/page@7af0dbbbe7c306dc710790e56f508c9e.mp4
new file mode 100644
index 0000000..33449c3
Binary files /dev/null and b/screenrecord/rec/run2/page@7af0dbbbe7c306dc710790e56f508c9e.mp4 differ
diff --git a/screenrecord/rec/run2/page@e1bc67e02815f554ce57ace028f8ea11.mp4 b/screenrecord/rec/run2/page@e1bc67e02815f554ce57ace028f8ea11.mp4
new file mode 100644
index 0000000..d1d90c6
Binary files /dev/null and b/screenrecord/rec/run2/page@e1bc67e02815f554ce57ace028f8ea11.mp4 differ
diff --git a/screenrecord/rec/run3/page@3b44d8ba298d928946343af1a2d4e46c.mp4 b/screenrecord/rec/run3/page@3b44d8ba298d928946343af1a2d4e46c.mp4
new file mode 100644
index 0000000..a3e91f6
Binary files /dev/null and b/screenrecord/rec/run3/page@3b44d8ba298d928946343af1a2d4e46c.mp4 differ
diff --git a/screenrecord/rec/run3/page@4adcd3d9e98a0707841a95dd82a044f7.mp4 b/screenrecord/rec/run3/page@4adcd3d9e98a0707841a95dd82a044f7.mp4
new file mode 100644
index 0000000..52ce2b5
Binary files /dev/null and b/screenrecord/rec/run3/page@4adcd3d9e98a0707841a95dd82a044f7.mp4 differ
diff --git a/screenrecord/rec/run3/page@5eea223bc7ae9bf0ac39ccf7495221c2.mp4 b/screenrecord/rec/run3/page@5eea223bc7ae9bf0ac39ccf7495221c2.mp4
new file mode 100644
index 0000000..9a9a8df
Binary files /dev/null and b/screenrecord/rec/run3/page@5eea223bc7ae9bf0ac39ccf7495221c2.mp4 differ
diff --git a/screenrecord/rec/run3/page@cf3d061226f40c22fc8bf3fbd48fe003.mp4 b/screenrecord/rec/run3/page@cf3d061226f40c22fc8bf3fbd48fe003.mp4
new file mode 100644
index 0000000..8b8f2d9
Binary files /dev/null and b/screenrecord/rec/run3/page@cf3d061226f40c22fc8bf3fbd48fe003.mp4 differ
diff --git a/screenrecord/rec/run4/page@5191324244d1c7f49ce143eb293ca185.mp4 b/screenrecord/rec/run4/page@5191324244d1c7f49ce143eb293ca185.mp4
new file mode 100644
index 0000000..5885744
Binary files /dev/null and b/screenrecord/rec/run4/page@5191324244d1c7f49ce143eb293ca185.mp4 differ
diff --git a/screenrecord/rec/run4/page@5191324244d1c7f49ce143eb293ca185.webm b/screenrecord/rec/run4/page@5191324244d1c7f49ce143eb293ca185.webm
new file mode 100644
index 0000000..366176d
Binary files /dev/null and b/screenrecord/rec/run4/page@5191324244d1c7f49ce143eb293ca185.webm differ
diff --git a/screenrecord/rec/run4/page@bb2982ab6024853b100f11aefb3da07b.mp4 b/screenrecord/rec/run4/page@bb2982ab6024853b100f11aefb3da07b.mp4
new file mode 100644
index 0000000..fa10bb6
Binary files /dev/null and b/screenrecord/rec/run4/page@bb2982ab6024853b100f11aefb3da07b.mp4 differ
diff --git a/screenrecord/rec/run4/page@bb2982ab6024853b100f11aefb3da07b.webm b/screenrecord/rec/run4/page@bb2982ab6024853b100f11aefb3da07b.webm
new file mode 100644
index 0000000..0c7db88
Binary files /dev/null and b/screenrecord/rec/run4/page@bb2982ab6024853b100f11aefb3da07b.webm differ
diff --git a/screenrecord/rec/run4/page@e40ee13d1a3b575716a3f84a9bbd6a22.webm b/screenrecord/rec/run4/page@e40ee13d1a3b575716a3f84a9bbd6a22.webm
new file mode 100644
index 0000000..234dd88
Binary files /dev/null and b/screenrecord/rec/run4/page@e40ee13d1a3b575716a3f84a9bbd6a22.webm differ
diff --git a/screenrecord/run-debug.mjs b/screenrecord/run-debug.mjs
new file mode 100644
index 0000000..5dabd50
--- /dev/null
+++ b/screenrecord/run-debug.mjs
@@ -0,0 +1,514 @@
+/**
+ * screenrecord debug agent — CelebritySignatures /upload page
+ * 5 runs, each with a different click-order combination.
+ * Reads debug-log.jsonl first, appends after each action.
+ * Converts .webm -> .mp4 via ffmpeg.
+ */
+import { createRequire } from 'node:module';
+import fs from 'node:fs';
+import path from 'node:path';
+import { execSync, spawn } from 'node:child_process';
+import { fileURLToPath } from 'node:url';
+
+const __dirname = path.dirname(fileURLToPath(import.meta.url));
+const require = createRequire(import.meta.url);
+
+// Playwright from global npm
+process.env.NODE_PATH = process.env.HOME + '/.npm-global/lib/node_modules';
+const { chromium } = require(process.env.HOME + '/.npm-global/lib/node_modules/playwright');
+
+const URL_BASE = 'http://localhost:9920';
+const PAGE_URL = URL_BASE + '/upload';
+const LOG_FILE = path.join(__dirname, 'debug-log.jsonl');
+const REC_DIR  = path.join(__dirname, 'rec');
+
+// Test credentials — one account for all runs (idempotent signup)
+const TEST_EMAIL = 'screenrec-test@example.com';
+const TEST_PW    = 'secret123';
+const TEST_NAME  = 'Rec Test';
+
+// ---- log helpers ----
+const priorLines = fs.existsSync(LOG_FILE)
+  ? fs.readFileSync(LOG_FILE, 'utf8').trim().split('\n').filter(Boolean).map(l => JSON.parse(l))
+  : [];
+const priorErrors = priorLines.filter(r => r.errors && r.errors.length > 0);
+
+function appendLog(obj) {
+  fs.appendFileSync(LOG_FILE, JSON.stringify(obj) + '\n');
+}
+
+// ---- order for each run ----
+function orderFor(run, els) {
+  if (run === 0) return [...els];
+  if (run === 1) return [...els].reverse();
+  if (run === 2) {
+    // checkboxes and file inputs first, then text inputs, then buttons/links
+    const priority = el => {
+      if (el.type === 'checkbox') return 0;
+      if (el.type === 'file') return 1;
+      if (el.type === 'text' || el.type === 'email' || el.type === 'password') return 2;
+      if (el.type === 'button') return 3;
+      return 4;
+    };
+    return [...els].sort((a, b) => priority(a) - priority(b));
+  }
+  if (run === 3) {
+    // seeded shuffle
+    const s = [...els];
+    for (let i = s.length - 1; i > 0; i--) {
+      const j = (i * 7 + run * 13) % (i + 1);
+      [s[i], s[j]] = [s[j], s[i]];
+    }
+    return s;
+  }
+  if (run === 4) {
+    // errored selectors first
+    const bad = new Set(priorErrors.map(e => e.selector));
+    return [...els].sort((a, b) => (bad.has(b.selector) ? 1 : 0) - (bad.has(a.selector) ? 1 : 0));
+  }
+  return [...els];
+}
+
+// ---- snapshot helper: grab relevant DOM state ----
+async function domSnapshot(page) {
+  return page.evaluate(() => ({
+    authFormsVisible: document.getElementById('authForms')?.style.display !== 'none',
+    whoamiVisible:    document.getElementById('whoami')?.style.display !== 'none',
+    uploadCardVisible: document.getElementById('uploadCard')?.style.display !== 'none',
+    dashCardVisible:   document.getElementById('dashCard')?.style.display !== 'none',
+    authMsg:           document.getElementById('authMsg')?.textContent || '',
+    upMsg:             document.getElementById('upMsg')?.textContent || '',
+    whoEmail:          document.getElementById('whoEmail')?.textContent || '',
+    totalEarned:       document.getElementById('totalEarned')?.textContent || '',
+    dashRows:          document.querySelector('#dashTable tbody')?.innerText?.trim() || '',
+    attestChecked:     document.getElementById('attest')?.checked || false,
+    previewVisible:    document.getElementById('preview')?.style.display === 'block',
+  }));
+}
+
+// ---- Convert webm to mp4 ----
+function convertToMp4(webmPath) {
+  const mp4Path = webmPath.replace('.webm', '.mp4');
+  try {
+    execSync(`ffmpeg -y -i "${webmPath}" -c:v libx264 -preset fast -crf 22 "${mp4Path}" 2>/dev/null`);
+    return mp4Path;
+  } catch (e) {
+    console.warn(`ffmpeg convert failed for ${webmPath}: ${e.message}`);
+    return null;
+  }
+}
+
+// ---- MAIN ----
+async function main() {
+  console.log(`\n=== screenrecord debug agent ===`);
+  console.log(`Prior log lines: ${priorLines.length}, prior errors: ${priorErrors.length}`);
+  console.log(`Target: ${PAGE_URL}`);
+  console.log(`Test account: ${TEST_EMAIL} / ${TEST_PW}`);
+  console.log(`Runs: 5 (0=dom-order, 1=reverse, 2=inputs-first, 3=shuffle, 4=errors-first)\n`);
+
+  const runSummaries = [];
+
+  for (let run = 0; run < 5; run++) {
+    console.log(`\n--- RUN ${run} ---`);
+    const runDir = path.join(REC_DIR, `run${run}`);
+    fs.mkdirSync(runDir, { recursive: true });
+
+    const browser = await chromium.launch({ headless: true });
+    const ctx = await browser.newContext({
+      viewport: { width: 1600, height: 900 },
+      recordVideo: { dir: runDir, size: { width: 1600, height: 900 } },
+    });
+    const page = await ctx.newPage();
+
+    // Collect console errors and page errors
+    const errs = [];
+    page.on('console', msg => {
+      if (msg.type() === 'error') {
+        errs.push({ type: 'console.error', text: msg.text() });
+      }
+    });
+    page.on('pageerror', e => {
+      errs.push({ type: 'pageerror', text: String(e) });
+    });
+
+    // Navigate
+    try {
+      await page.goto(PAGE_URL, { waitUntil: 'domcontentloaded', timeout: 15000 });
+      await page.waitForTimeout(1200); // let refresh() / GA load
+    } catch (e) {
+      appendLog({ run, ts: new Date().toISOString(), selector: 'navigate', label: 'page load', action: 'goto', ok: false, effect: null, errors: [{ type: 'nav', text: String(e) }] });
+      console.log(`  FAIL: page load — ${e.message}`);
+      await ctx.close();
+      await browser.close();
+      continue;
+    }
+
+    // ================================================================
+    // STEP 1: Check stat callout ($10 / 50%)
+    // ================================================================
+    {
+      const statText = await page.evaluate(() => document.querySelector('main .card')?.innerText || '');
+      const hasTen = statText.includes('$10');
+      const hasFifty = statText.includes('50%');
+      const errSnap = errs.splice(0);
+      appendLog({ run, ts: new Date().toISOString(), selector: '.card:first-child', label: 'stat callout $10/50%', action: 'check', ok: hasTen && hasFifty, effect: `$10=${hasTen} 50%=${hasFifty}`, errors: errSnap });
+      console.log(`  stat callout $10=${hasTen} 50%=${hasFifty}`);
+    }
+
+    // ================================================================
+    // STEP 2: Auth initial state — should show form, not whoami
+    // ================================================================
+    {
+      const before = await domSnapshot(page);
+      const ok = before.authFormsVisible && !before.whoamiVisible;
+      const errSnap = errs.splice(0);
+      appendLog({ run, ts: new Date().toISOString(), selector: '#authForms', label: 'auth initial state', action: 'check', ok, effect: JSON.stringify(before), errors: errSnap });
+      console.log(`  auth initial state ok=${ok} (forms=${before.authFormsVisible} whoami=${before.whoamiVisible})`);
+    }
+
+    // ================================================================
+    // STEP 3: Upload + dashboard cards should be HIDDEN when logged out
+    // ================================================================
+    {
+      const snap = await domSnapshot(page);
+      const ok = !snap.uploadCardVisible && !snap.dashCardVisible;
+      appendLog({ run, ts: new Date().toISOString(), selector: '#uploadCard,#dashCard', label: 'cards hidden when logged out', action: 'check', ok, effect: `upload=${snap.uploadCardVisible} dash=${snap.dashCardVisible}`, errors: [] });
+      console.log(`  cards hidden when logged out: ok=${ok}`);
+    }
+
+    // ================================================================
+    // STEP 4: Fill auth form and CREATE ACCOUNT (run 0,2,4) or SIGN IN (1,3)
+    //         Always ensure we end up signed in.
+    // ================================================================
+    {
+      // Fill in email + password + name
+      await page.locator('#aEmail').fill(TEST_EMAIL);
+      await page.locator('#aPw').fill(TEST_PW);
+      await page.locator('#aName').fill(TEST_NAME);
+      await page.waitForTimeout(300);
+
+      let signedIn = false;
+      if (run % 2 === 0) {
+        // Try signup (idempotent — server returns error if already exists)
+        console.log(`  clicking Create Account...`);
+        const errsBefore = errs.splice(0);
+        await page.locator('#signupBtn').click();
+        await page.waitForTimeout(1500);
+        const afterMsg = await page.evaluate(() => document.getElementById('authMsg')?.textContent || '');
+        const afterSnap = await domSnapshot(page);
+        const errSnap = errs.splice(0);
+        // If "account created" or already-existing → then sign in
+        if (afterSnap.whoamiVisible) {
+          signedIn = true;
+          appendLog({ run, ts: new Date().toISOString(), selector: '#signupBtn', label: 'Create account', action: 'click', ok: true, effect: afterMsg, errors: errSnap });
+          console.log(`  signup ok → signed in as ${afterSnap.whoEmail}`);
+        } else {
+          appendLog({ run, ts: new Date().toISOString(), selector: '#signupBtn', label: 'Create account', action: 'click', ok: false, effect: afterMsg, errors: [...errsBefore, ...errSnap] });
+          console.log(`  signup result: "${afterMsg}" — trying login`);
+          // Fall through to login
+          await page.locator('#aEmail').fill(TEST_EMAIL);
+          await page.locator('#aPw').fill(TEST_PW);
+          await page.waitForTimeout(200);
+          await page.locator('#loginBtn').click();
+          await page.waitForTimeout(1500);
+          const loginSnap = await domSnapshot(page);
+          const loginMsg  = await page.evaluate(() => document.getElementById('authMsg')?.textContent || '');
+          const loginErrs = errs.splice(0);
+          signedIn = loginSnap.whoamiVisible;
+          appendLog({ run, ts: new Date().toISOString(), selector: '#loginBtn', label: 'Sign in (fallback after signup already-exists)', action: 'click', ok: signedIn, effect: loginMsg, errors: loginErrs });
+          console.log(`  login result: "${loginMsg}" signed_in=${signedIn}`);
+        }
+      } else {
+        // Try login directly
+        console.log(`  clicking Sign in...`);
+        const errsBefore = errs.splice(0);
+        await page.locator('#loginBtn').click();
+        await page.waitForTimeout(1500);
+        const afterMsg  = await page.evaluate(() => document.getElementById('authMsg')?.textContent || '');
+        const afterSnap = await domSnapshot(page);
+        const errSnap   = errs.splice(0);
+        signedIn = afterSnap.whoamiVisible;
+        if (!signedIn) {
+          // Account might not exist yet on odd runs — try signup
+          appendLog({ run, ts: new Date().toISOString(), selector: '#loginBtn', label: 'Sign in', action: 'click', ok: false, effect: afterMsg, errors: [...errsBefore, ...errSnap] });
+          console.log(`  login failed: "${afterMsg}" — trying signup`);
+          await page.locator('#aEmail').fill(TEST_EMAIL);
+          await page.locator('#aPw').fill(TEST_PW);
+          await page.locator('#aName').fill(TEST_NAME);
+          await page.waitForTimeout(200);
+          await page.locator('#signupBtn').click();
+          await page.waitForTimeout(1500);
+          const signupSnap = await domSnapshot(page);
+          const signupMsg  = await page.evaluate(() => document.getElementById('authMsg')?.textContent || '');
+          const signupErrs = errs.splice(0);
+          signedIn = signupSnap.whoamiVisible;
+          appendLog({ run, ts: new Date().toISOString(), selector: '#signupBtn', label: 'Create account (fallback)', action: 'click', ok: signedIn, effect: signupMsg, errors: signupErrs });
+          console.log(`  signup fallback: "${signupMsg}" signed_in=${signedIn}`);
+        } else {
+          appendLog({ run, ts: new Date().toISOString(), selector: '#loginBtn', label: 'Sign in', action: 'click', ok: true, effect: afterMsg, errors: [...errsBefore, ...errSnap] });
+          console.log(`  login ok → signed in as ${afterSnap.whoEmail}`);
+        }
+      }
+
+      // ================================================================
+      // STEP 5: Verify upload + dashboard cards appear after sign in
+      // ================================================================
+      if (signedIn) {
+        const snap = await domSnapshot(page);
+        const ok = snap.uploadCardVisible && snap.dashCardVisible;
+        appendLog({ run, ts: new Date().toISOString(), selector: '#uploadCard,#dashCard', label: 'cards visible after sign in', action: 'check', ok, effect: `upload=${snap.uploadCardVisible} dash=${snap.dashCardVisible} whoEmail=${snap.whoEmail}`, errors: errs.splice(0) });
+        console.log(`  cards after sign in: upload=${snap.uploadCardVisible} dash=${snap.dashCardVisible} ok=${ok}`);
+
+        // ================================================================
+        // STEP 6: Dashboard — check empty state / data
+        // ================================================================
+        {
+          const dbSnap = await domSnapshot(page);
+          const hasEmptyState = dbSnap.dashRows.includes('no uploads yet') || dbSnap.dashRows.length > 0;
+          appendLog({ run, ts: new Date().toISOString(), selector: '#dashTable', label: 'dashboard table state', action: 'check', ok: hasEmptyState, effect: `rows="${dbSnap.dashRows}" totalEarned="${dbSnap.totalEarned}"`, errors: errs.splice(0) });
+          console.log(`  dashboard: rows="${dbSnap.dashRows}" earned="${dbSnap.totalEarned}"`);
+        }
+
+        // ================================================================
+        // STEP 7: Upload card — VALIDATION paths (run-order varied)
+        // ================================================================
+        const uploadCard = page.locator('#uploadCard');
+        await uploadCard.scrollIntoViewIfNeeded();
+        await page.waitForTimeout(300);
+
+        // Vary which validation we test first based on run
+        const validationOrder = orderFor(run, [
+          { id: 'test-no-file-no-attest', label: 'submit with no file no attest' },
+          { id: 'test-no-file-with-attest', label: 'submit with attest but no file' },
+          { id: 'test-attest-checkbox', label: 'attest checkbox toggle' },
+          { id: 'test-name-field', label: 'celebName field fill' },
+        ]);
+
+        for (const v of validationOrder) {
+          if (v.id === 'test-no-file-no-attest') {
+            // Ensure attest unchecked, then click Submit
+            const attestState = await page.evaluate(() => document.getElementById('attest')?.checked);
+            if (attestState) await page.locator('#attest').click();
+            await page.evaluate(() => { const p = document.getElementById('preview'); if(p) p.style.display='none'; });
+            // Clear the dataUrl internal state
+            await page.evaluate(() => { window._testDataUrl = null; });
+            await page.locator('#uploadBtn').scrollIntoViewIfNeeded();
+            const beforeSnap = await domSnapshot(page);
+            const e0 = errs.splice(0);
+            await page.locator('#uploadBtn').click();
+            await page.waitForTimeout(500);
+            const afterMsg = await page.evaluate(() => document.getElementById('upMsg')?.textContent || '');
+            const e1 = errs.splice(0);
+            const ok = afterMsg === 'choose a signature file first';
+            appendLog({ run, ts: new Date().toISOString(), selector: '#uploadBtn', label: 'submit with no file (validation)', action: 'click', ok, effect: `upMsg="${afterMsg}"`, errors: [...e0, ...e1] });
+            console.log(`  no-file validation: "${afterMsg}" ok=${ok}`);
+          }
+
+          if (v.id === 'test-no-file-with-attest') {
+            // Check attest, still no file
+            const attestState = await page.evaluate(() => document.getElementById('attest')?.checked);
+            if (!attestState) await page.locator('#attest').click();
+            await page.waitForTimeout(200);
+            const e0 = errs.splice(0);
+            await page.locator('#uploadBtn').click();
+            await page.waitForTimeout(500);
+            const afterMsg = await page.evaluate(() => document.getElementById('upMsg')?.textContent || '');
+            const e1 = errs.splice(0);
+            // With attest checked but no file, should still say "choose a signature file first"
+            const ok = afterMsg === 'choose a signature file first';
+            appendLog({ run, ts: new Date().toISOString(), selector: '#uploadBtn', label: 'submit with attest but no file', action: 'click', ok, effect: `upMsg="${afterMsg}"`, errors: [...e0, ...e1] });
+            console.log(`  attest+no-file validation: "${afterMsg}" ok=${ok}`);
+            // Uncheck attest again for next test
+            if (await page.evaluate(() => document.getElementById('attest')?.checked)) {
+              await page.locator('#attest').click();
+            }
+          }
+
+          if (v.id === 'test-attest-checkbox') {
+            // Toggle attest checkbox and observe
+            const before = await page.evaluate(() => document.getElementById('attest')?.checked);
+            await page.locator('#attest').click();
+            await page.waitForTimeout(200);
+            const after = await page.evaluate(() => document.getElementById('attest')?.checked);
+            const ok = before !== after;
+            appendLog({ run, ts: new Date().toISOString(), selector: '#attest', label: 'attest checkbox toggle', action: 'click', ok, effect: `before=${before} after=${after}`, errors: errs.splice(0) });
+            console.log(`  attest toggle: ${before} -> ${after} ok=${ok}`);
+            // Leave unchecked for next test
+            if (after) await page.locator('#attest').click();
+          }
+
+          if (v.id === 'test-name-field') {
+            // Fill celebrity name field
+            await page.locator('#celebName').fill('Test Celebrity Name');
+            await page.waitForTimeout(200);
+            const val = await page.evaluate(() => document.getElementById('celebName')?.value || '');
+            const ok = val === 'Test Celebrity Name';
+            appendLog({ run, ts: new Date().toISOString(), selector: '#celebName', label: 'celebName text input', action: 'fill', ok, effect: `value="${val}"`, errors: errs.splice(0) });
+            console.log(`  celebName fill: "${val}" ok=${ok}`);
+          }
+        }
+
+        // ================================================================
+        // STEP 8: File input — headless can't attach real files, test detection
+        // ================================================================
+        {
+          // Test that the file input exists and is visible
+          const fileInputExists = await page.evaluate(() => !!document.getElementById('sigFile'));
+          const fileInputAccept = await page.evaluate(() => document.getElementById('sigFile')?.accept || '');
+          appendLog({ run, ts: new Date().toISOString(), selector: '#sigFile', label: 'file input existence + accept attr', action: 'check', ok: fileInputExists, effect: `accept="${fileInputAccept}"`, errors: errs.splice(0) });
+          console.log(`  file input exists=${fileInputExists} accept="${fileInputAccept}"`);
+
+          // Simulate a file via page.setInputFiles (a 1-pixel PNG)
+          const fakePngBase64 = 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==';
+          const pngBuf = Buffer.from(fakePngBase64, 'base64');
+          try {
+            await page.locator('#sigFile').setInputFiles({
+              name: 'test-sig.png',
+              mimeType: 'image/png',
+              buffer: pngBuf,
+            });
+            await page.waitForTimeout(800); // FileReader async
+            const previewVisible = await page.evaluate(() => document.getElementById('preview')?.style.display === 'block');
+            const dataUrlSet = await page.evaluate(() => {
+              // Check if the module-scoped dataUrl was set by looking at the preview src
+              const src = document.getElementById('preview')?.src || '';
+              return src.startsWith('data:image/') || src.startsWith('blob:');
+            });
+            appendLog({ run, ts: new Date().toISOString(), selector: '#sigFile', label: 'file input setInputFiles (fake PNG)', action: 'setFile', ok: previewVisible, effect: `preview=${previewVisible} dataUrlSet=${dataUrlSet}`, errors: errs.splice(0) });
+            console.log(`  file input: preview=${previewVisible} dataUrl set=${dataUrlSet}`);
+
+            // Now test submit WITH file but WITHOUT attest
+            const attestChecked = await page.evaluate(() => document.getElementById('attest')?.checked);
+            if (attestChecked) await page.locator('#attest').click(); // uncheck
+            await page.locator('#uploadBtn').click();
+            await page.waitForTimeout(500);
+            const noAttestMsg = await page.evaluate(() => document.getElementById('upMsg')?.textContent || '');
+            const noAttestOk = noAttestMsg === 'the attestation checkbox is required';
+            appendLog({ run, ts: new Date().toISOString(), selector: '#uploadBtn', label: 'submit with file but no attest', action: 'click', ok: noAttestOk, effect: `upMsg="${noAttestMsg}"`, errors: errs.splice(0) });
+            console.log(`  no-attest validation (file present): "${noAttestMsg}" ok=${noAttestOk}`);
+
+            // Now with BOTH file + attest — do a real submission
+            await page.locator('#attest').click(); // check it
+            await page.waitForTimeout(200);
+            await page.locator('#celebName').fill('Rec Test Celeb');
+            await page.waitForTimeout(200);
+            const e0 = errs.splice(0);
+            await page.locator('#uploadBtn').click();
+            await page.waitForTimeout(2000);
+            const submitMsg = await page.evaluate(() => document.getElementById('upMsg')?.textContent || '');
+            const submitOk  = submitMsg.includes('submitted') || submitMsg.includes('review');
+            const e1 = errs.splice(0);
+            appendLog({ run, ts: new Date().toISOString(), selector: '#uploadBtn', label: 'submit with file + attest (real upload)', action: 'click', ok: submitOk, effect: `upMsg="${submitMsg}"`, errors: [...e0, ...e1] });
+            console.log(`  full upload submit: "${submitMsg}" ok=${submitOk}`);
+
+            // Refresh dashboard to see new entry
+            await page.waitForTimeout(1000);
+            const dashAfterUpload = await domSnapshot(page);
+            appendLog({ run, ts: new Date().toISOString(), selector: '#dashTable', label: 'dashboard after upload', action: 'check', ok: true, effect: `rows="${dashAfterUpload.dashRows}" earned="${dashAfterUpload.totalEarned}"`, errors: errs.splice(0) });
+            console.log(`  dashboard after upload: rows="${dashAfterUpload.dashRows}"`);
+
+          } catch (fileErr) {
+            appendLog({ run, ts: new Date().toISOString(), selector: '#sigFile', label: 'file input setInputFiles', action: 'setFile', ok: false, effect: null, errors: [{ type: 'script', text: String(fileErr) }] });
+            console.log(`  file input error: ${fileErr.message}`);
+          }
+        }
+
+        // ================================================================
+        // STEP 9: Sign OUT
+        // ================================================================
+        {
+          await page.locator('#logoutLink').scrollIntoViewIfNeeded();
+          const e0 = errs.splice(0);
+          await page.locator('#logoutLink').click();
+          await page.waitForTimeout(1500);
+          const afterSnap = await domSnapshot(page);
+          const ok = afterSnap.authFormsVisible && !afterSnap.whoamiVisible;
+          const e1 = errs.splice(0);
+          appendLog({ run, ts: new Date().toISOString(), selector: '#logoutLink', label: 'sign out link', action: 'click', ok, effect: `forms=${afterSnap.authFormsVisible} whoami=${afterSnap.whoamiVisible}`, errors: [...e0, ...e1] });
+          console.log(`  sign out: ok=${ok} forms=${afterSnap.authFormsVisible} whoami=${afterSnap.whoamiVisible}`);
+        }
+
+        // ================================================================
+        // STEP 10: Sign BACK IN
+        // ================================================================
+        {
+          await page.locator('#aEmail').fill(TEST_EMAIL);
+          await page.locator('#aPw').fill(TEST_PW);
+          const e0 = errs.splice(0);
+          await page.locator('#loginBtn').click();
+          await page.waitForTimeout(1500);
+          const afterSnap = await domSnapshot(page);
+          const loginMsg  = await page.evaluate(() => document.getElementById('authMsg')?.textContent || '');
+          const ok = afterSnap.whoamiVisible;
+          const e1 = errs.splice(0);
+          appendLog({ run, ts: new Date().toISOString(), selector: '#loginBtn', label: 'sign back in after logout', action: 'click', ok, effect: `msg="${loginMsg}" whoEmail="${afterSnap.whoEmail}"`, errors: [...e0, ...e1] });
+          console.log(`  sign back in: "${loginMsg}" ok=${ok} email="${afterSnap.whoEmail}"`);
+        }
+
+      } else {
+        appendLog({ run, ts: new Date().toISOString(), selector: 'auth', label: 'SKIPPED upload/dashboard tests — could not sign in', action: 'skip', ok: false, effect: null, errors: errs.splice(0) });
+        console.log(`  SKIP: could not sign in — skipping upload/dash tests for run ${run}`);
+      }
+    }
+
+    // ================================================================
+    // STEP 11: "back to gallery" link
+    // ================================================================
+    {
+      const backLink = page.locator('h1 a');
+      await backLink.scrollIntoViewIfNeeded();
+      const href = await backLink.getAttribute('href');
+      const text = await backLink.innerText();
+      const ok = href === '/' && text.includes('back to the gallery');
+      appendLog({ run, ts: new Date().toISOString(), selector: 'h1 a', label: 'back to gallery link', action: 'check', ok, effect: `href="${href}" text="${text}"`, errors: errs.splice(0) });
+      console.log(`  back link: href="${href}" text="${text}" ok=${ok}`);
+      // Don't click it — would navigate away; just verify
+    }
+
+    // ================================================================
+    // STEP 12: Check for any remaining console errors
+    // ================================================================
+    const remaining = errs.splice(0);
+    if (remaining.length > 0) {
+      appendLog({ run, ts: new Date().toISOString(), selector: 'page', label: 'end-of-run console errors', action: 'check', ok: false, effect: null, errors: remaining });
+      console.log(`  end-of-run errors (${remaining.length}): ${remaining.map(e => e.text).join('; ')}`);
+    }
+
+    // Close context — triggers video save
+    await ctx.close();
+    await browser.close();
+
+    // Find the recorded webm file
+    const recFiles = fs.readdirSync(runDir).filter(f => f.endsWith('.webm'));
+    let mp4Path = null;
+    for (const wf of recFiles) {
+      const webmPath = path.join(runDir, wf);
+      console.log(`  converting ${wf} -> mp4...`);
+      mp4Path = convertToMp4(webmPath);
+      if (mp4Path) console.log(`  mp4: ${mp4Path}`);
+      else console.log(`  (no ffmpeg conversion, left as .webm)`);
+    }
+
+    const summary = {
+      run,
+      webmFiles: recFiles.map(f => path.join(runDir, f)),
+      mp4: mp4Path,
+      errorCount: priorLines.filter(l => l.run === run && l.errors && l.errors.length > 0).length,
+    };
+    runSummaries.push(summary);
+    console.log(`  run ${run} done — recording: ${mp4Path || recFiles[0] || 'none'}`);
+  }
+
+  console.log('\n=== all runs complete ===');
+  return runSummaries;
+}
+
+main().then(summaries => {
+  console.log('\nRun summaries:');
+  summaries.forEach(s => console.log(`  run${s.run}: ${s.mp4 || (s.webmFiles[0] || 'no recording')}`));
+  console.log('\nDebug log:', LOG_FILE);
+  process.exit(0);
+}).catch(e => {
+  console.error('Fatal error:', e);
+  process.exit(1);
+});
diff --git a/scripts/fetch-portraits.mjs b/scripts/fetch-portraits.mjs
new file mode 100644
index 0000000..c456d4d
--- /dev/null
+++ b/scripts/fetch-portraits.mjs
@@ -0,0 +1,63 @@
+#!/usr/bin/env node
+// Portrait fetcher — for every person in the merged dataset, pull their
+// Wikidata P18 ("image") filename → a Wikimedia Commons thumbnail URL.
+// Commons images are freely licensed (CC/PD by Commons policy), so they're
+// safe to show. Output: data/portraits.json = { "<QID>": "<thumbUrl>" }.
+// Used to (1) show a portrait on the card chip and (2) show the person's
+// image in the popup for NON-artists (politicians, astronauts, authors…)
+// who have no artworks.
+//
+// Usage: node scripts/fetch-portraits.mjs
+// Cost: $0 — Wikidata wbgetentities, no keys.
+
+import { readFile, writeFile } from 'node:fs/promises';
+import { join } from 'node:path';
+import { fileURLToPath } from 'node:url';
+import { UA, sleep } from './lib/wikidata-common.mjs';
+
+const DATA = join(fileURLToPath(new URL('..', import.meta.url)), 'data');
+const loadJson = async (f) => { try { return JSON.parse(await readFile(join(DATA, f), 'utf8')); } catch { return []; } };
+const qidOf = (r) => (r.wikidata || '').split('/').pop();
+
+const people = [
+  ...await loadJson('celebrity_signatures.json'),
+  ...await loadJson('artists.json'),
+  ...await loadJson('authors.json'),
+];
+const qids = [...new Set(people.map(qidOf).filter((q) => /^Q\d+$/.test(q)))];
+console.log(`${qids.length} unique people to look up`);
+
+// resume: keep any portraits already resolved
+let out = {};
+try { out = JSON.parse(await readFile(join(DATA, 'portraits.json'), 'utf8')); } catch {}
+const todo = qids.filter((q) => !(q in out));
+console.log(`${todo.length} still need a portrait (${Object.keys(out).length} cached)`);
+
+const commonsThumb = (file) =>
+  `https://commons.wikimedia.org/wiki/Special:FilePath/${encodeURIComponent(file.replace(/ /g, '_'))}?width=120`;
+
+let found = 0;
+for (let i = 0; i < todo.length; i += 50) {
+  const ids = todo.slice(i, i + 50);
+  const url = `https://www.wikidata.org/w/api.php?action=wbgetentities&ids=${ids.join('|')}&props=claims&format=json&origin=*`;
+  let j;
+  try {
+    const res = await fetch(url, { headers: { 'User-Agent': UA } });
+    if (!res.ok) { if (res.status === 429) { process.stdout.write('(429 60s) '); await sleep(60000); i -= 50; continue; } await sleep(500); continue; }
+    j = await res.json();
+  } catch { await sleep(2000); i -= 50; continue; }
+  for (const [qid, e] of Object.entries(j.entities || {})) {
+    const img = e.claims?.P18?.[0]?.mainsnak?.datavalue?.value;
+    if (img) { out[qid] = commonsThumb(img); found++; }
+    else out[qid] = null; // record the miss so we don't re-query
+  }
+  if ((i / 50) % 10 === 0) {
+    await writeFile(join(DATA, 'portraits.json'), JSON.stringify(out));
+    process.stdout.write(`\r${i + ids.length}/${todo.length} checked · ${found} portraits`);
+  }
+  await sleep(200);
+}
+// drop the null misses from the shipped file (front-end only needs hits)
+const hits = Object.fromEntries(Object.entries(out).filter(([, v]) => v));
+await writeFile(join(DATA, 'portraits.json'), JSON.stringify(hits));
+console.log(`\nwrote data/portraits.json — ${Object.keys(hits).length} portraits of ${qids.length} people`);
diff --git a/scripts/screenrecord-game.mjs b/scripts/screenrecord-game.mjs
new file mode 100644
index 0000000..346898c
--- /dev/null
+++ b/scripts/screenrecord-game.mjs
@@ -0,0 +1,525 @@
+/**
+ * screenrecord-game.mjs — 5-run Playwright screen recorder for /game
+ * Covers all 6 games: whose, art, match, early, century, lightning
+ * Each run uses a DISTINCT click-order combination.
+ * Appends to screenrecord/debug-log.jsonl after every action.
+ */
+import pkg from '/Users/macstudio3/.npm-global/lib/node_modules/playwright/index.js';
+const { chromium } = pkg;
+import fs from 'fs';
+import path from 'path';
+
+const BASE = '/Users/macstudio3/Projects/CelebritySignatures';
+const LOG   = path.join(BASE, 'screenrecord/debug-log.jsonl');
+const URL   = 'http://localhost:9920/game';
+
+// Read prior runs
+const prior = fs.existsSync(LOG)
+  ? fs.readFileSync(LOG,'utf8').trim().split('\n').filter(Boolean).map(l=>{try{return JSON.parse(l);}catch{return null;}}).filter(Boolean)
+  : [];
+const priorErrors = prior.filter(r => r.errors && r.errors.length > 0);
+console.log(`[screenrecord] Prior log entries: ${prior.length}, with errors: ${priorErrors.length}`);
+
+const append = obj => fs.appendFileSync(LOG, JSON.stringify(obj)+'\n');
+
+// The 6 games + difficulties to test per run
+const GAMES = ['whose','art','match','early','century','lightning'];
+const DIFFS = ['icons','scholar','curator','deep'];
+const CATS  = ['All','Artists','Authors','Politics'];
+
+// Per-run: which game+difficulty+category combos to try (deterministic seeds)
+function runsFor(runIdx) {
+  if (runIdx === 0) {
+    // DOM order: all 6 games, icons difficulty, All category
+    return GAMES.map(g => ({ game:g, diff:'icons', cat:'All' }));
+  }
+  if (runIdx === 1) {
+    // Reverse order, scholar difficulty
+    return [...GAMES].reverse().map(g => ({ game:g, diff:'scholar', cat:'All' }));
+  }
+  if (runIdx === 2) {
+    // Art-first (art-based games first), curator difficulty; vary categories
+    const artFirst = ['art','match','lightning','whose','century','early'];
+    return artFirst.map((g,i) => ({ game:g, diff:'curator', cat: g==='whose'||g==='century' ? CATS[i%CATS.length] : 'All' }));
+  }
+  if (runIdx === 3) {
+    // Seeded shuffle: icons; hit errored games first
+    const erroredGames = new Set(priorErrors.map(e=>e.game).filter(Boolean));
+    const sorted = [...GAMES].sort((a,b)=>(erroredGames.has(b)?1:0)-(erroredGames.has(a)?1:0));
+    // then shuffle rest with seed
+    const rest = sorted.slice(erroredGames.size);
+    for(let i=rest.length-1;i>0;i--){const j=(i*7+3*13)%(i+1);[rest[i],rest[j]]=[rest[j],rest[i]];}
+    const combo = [...sorted.slice(0,erroredGames.size), ...rest];
+    return combo.map(g => ({ game:g, diff:'icons', cat: g==='whose'?'Artists':g==='century'?'Politics':'All' }));
+  }
+  if (runIdx === 4) {
+    // Re-hit everything that errored + deep cuts on those, icons on stable ones
+    const erroredGames = new Set(priorErrors.map(e=>e.game).filter(Boolean));
+    return GAMES.map(g => ({ game:g, diff: erroredGames.has(g)?'deep':'icons', cat:'All' }));
+  }
+  return GAMES.map(g => ({ game:g, diff:'icons', cat:'All' }));
+}
+
+async function wait(ms) { return new Promise(r=>setTimeout(r,ms)); }
+
+async function runGame(page, errs, run, {game: gameKey, diff, cat}) {
+  const ts = () => new Date().toISOString();
+  const errors = () => { const e=[...errs]; errs.length=0; return e; };
+
+  async function logAction(selector, label, action, ok, effect, extraErrors=[]) {
+    const e = [...errors(), ...extraErrors];
+    const entry = { run, ts:ts(), game:gameKey, diff, cat, selector, label, action, ok, effect, errors:e };
+    append(entry);
+    if (e.length) console.log(`  [ERRORS] ${e.join(' | ')}`);
+  }
+
+  console.log(`\n  [RUN ${run}] Game: ${gameKey} | Diff: ${diff} | Cat: ${cat}`);
+
+  // Navigate fresh
+  try {
+    await page.goto(URL, { waitUntil:'domcontentloaded', timeout:15000 });
+    await wait(800);
+  } catch(e) {
+    await logAction('page','navigation','goto', false, 'Navigation failed', [String(e)]);
+    return { game:gameKey, ok:false, error:'Navigation failed' };
+  }
+
+  // ── 1. Select game card ──
+  const cardSel = `#gamePick .gcard[data-g="${gameKey}"]`;
+  try {
+    await page.locator(cardSel).scrollIntoViewIfNeeded();
+    const beforeClass = await page.locator(cardSel).getAttribute('class');
+    await page.locator(cardSel).click();
+    await wait(200);
+    const afterClass = await page.locator(cardSel).getAttribute('class');
+    const on = afterClass?.includes('on') ?? false;
+    await logAction(cardSel, `game-card-${gameKey}`, 'click', on, on?'card selected':'card not selected');
+    if (!on) {
+      return { game:gameKey, ok:false, error:'Game card did not activate' };
+    }
+  } catch(e) {
+    await logAction(cardSel, `game-card-${gameKey}`, 'click', false, 'Click failed', [String(e)]);
+    return { game:gameKey, ok:false, error:String(e) };
+  }
+
+  // ── 2. Verify category row visibility ──
+  const catRowVisible = gameKey==='whose' || gameKey==='century';
+  try {
+    const catLabel = page.locator('#catLabel');
+    const catOpts  = page.locator('#catOpts');
+    const labelDisplay = await catLabel.evaluate(el => getComputedStyle(el).display);
+    const optsDisplay  = await catOpts.evaluate(el => getComputedStyle(el).display);
+    const visible = labelDisplay !== 'none' && optsDisplay !== 'none';
+    const expected = catRowVisible;
+    const ok = visible === expected;
+    await logAction('#catLabel/#catOpts', 'category-row-visibility', 'inspect', ok,
+      `catLabel=${labelDisplay}, catOpts=${optsDisplay}, expected_visible=${expected}, actual=${visible}`);
+    if (!ok) {
+      await logAction('#catLabel/#catOpts', 'category-row-visibility', 'inspect', false,
+        `REGRESSION: category row visible=${visible} but expected=${expected} for game=${gameKey}`,
+        [`Category row visibility bug for ${gameKey}`]);
+    }
+  } catch(e) {
+    await logAction('#catLabel', 'category-row-visibility', 'inspect', false, 'Check failed', [String(e)]);
+  }
+
+  // ── 3. Select difficulty ──
+  const diffSel = `#diffOpts .opt[data-d="${diff}"]`;
+  try {
+    await page.locator(diffSel).scrollIntoViewIfNeeded();
+    await page.locator(diffSel).click();
+    await wait(150);
+    const on = await page.locator(diffSel).evaluate(el=>el.classList.contains('on'));
+    await logAction(diffSel, `diff-${diff}`, 'click', on, on?'selected':'not selected');
+  } catch(e) {
+    await logAction(diffSel, `diff-${diff}`, 'click', false, 'Click failed', [String(e)]);
+  }
+
+  // ── 4. Select category (if applicable) ──
+  if (catRowVisible) {
+    const catSel = `#catOpts .opt[data-c="${cat}"]`;
+    try {
+      await page.locator(catSel).scrollIntoViewIfNeeded();
+      await page.locator(catSel).click();
+      await wait(150);
+      const on = await page.locator(catSel).evaluate(el=>el.classList.contains('on'));
+      await logAction(catSel, `cat-${cat}`, 'click', on, on?'selected':'not selected');
+    } catch(e) {
+      await logAction(catSel, `cat-${cat}`, 'click', false, 'Click failed', [String(e)]);
+    }
+  }
+
+  // ── 5. Click Begin ──
+  let alertMsg = null;
+  page.once('dialog', async dialog => {
+    alertMsg = dialog.message();
+    await dialog.dismiss();
+  });
+
+  const beginT = Date.now();
+  try {
+    await page.locator('#goBtn').scrollIntoViewIfNeeded();
+    await page.locator('#goBtn').click();
+    await logAction('#goBtn', 'begin-button', 'click', true, 'Begin clicked');
+  } catch(e) {
+    await logAction('#goBtn', 'begin-button', 'click', false, 'Click failed', [String(e)]);
+    return { game:gameKey, ok:false, error:String(e) };
+  }
+
+  // Wait for either play panel or alert (error)
+  let started = false;
+  let prepTextLog = [];
+  for (let i=0; i<60; i++) {
+    // Check for alert (error condition)
+    if (alertMsg) {
+      await logAction('#goBtn', 'begin-result', 'wait', false, `Alert: ${alertMsg}`, [`game start failed: ${alertMsg}`]);
+      return { game:gameKey, ok:false, error:alertMsg };
+    }
+    // Check if play panel appeared
+    try {
+      const playHidden = await page.locator('#play').getAttribute('hidden');
+      if (playHidden === null) { started = true; break; }
+    } catch {}
+    // Log prep text
+    try {
+      const prepHidden = await page.locator('#prep').getAttribute('hidden');
+      if (prepHidden === null) {
+        const txt = await page.locator('#prep').textContent();
+        if (txt && !prepTextLog.includes(txt)) { prepTextLog.push(txt); console.log(`    prep: ${txt}`); }
+      }
+    } catch {}
+    await wait(500);
+  }
+
+  if (!started) {
+    const took = Date.now()-beginT;
+    await logAction('#play', 'play-panel-appeared', 'wait', false, `Timeout after ${took}ms. Alert: ${alertMsg||'none'}`, [alertMsg||'Timeout waiting for play panel']);
+    return { game:gameKey, ok:false, error: alertMsg || 'Timeout waiting for play panel' };
+  }
+
+  const loadTime = Date.now()-beginT;
+  await logAction('#play', 'play-panel-appeared', 'wait', true, `play panel shown in ${loadTime}ms`);
+
+  // ── 6. Play through all rounds ──
+  let roundsPlayed = 0;
+  let finished = false;
+  let lightning_timer_tested = false;
+  let lightning_timeout_seen = false;
+  let lightning_pairs_checked = false;
+  let stage_renders = 0;
+  let choices_renders = 0;
+  let images_found = 0;
+  let images_broken = 0;
+  let timer_appeared = false;
+  let next_btn_worked = 0;
+
+  for (let roundN = 0; roundN < 25; roundN++) {
+    // Check if results panel appeared
+    try {
+      const resultsHidden = await page.locator('#results').getAttribute('hidden');
+      if (resultsHidden === null) { finished = true; break; }
+    } catch {}
+    // Check if play panel still visible
+    try {
+      const playHidden = await page.locator('#play').getAttribute('hidden');
+      if (playHidden !== null) { break; }
+    } catch {}
+
+    // --- Inspect stage ---
+    let stageHtml = '';
+    try {
+      stageHtml = await page.locator('#stage').innerHTML();
+      if (stageHtml.trim().length > 0) stage_renders++;
+    } catch(e) {
+      await logAction('#stage', `round-${roundN+1}-stage`, 'inspect', false, 'Stage inspect failed', [String(e)]);
+    }
+
+    // Check for images in stage
+    try {
+      const imgs = await page.locator('#stage img').all();
+      for (const img of imgs) {
+        const src = await img.getAttribute('src') || '';
+        const naturalWidth = await img.evaluate(el => el.naturalWidth);
+        if (naturalWidth > 0) images_found++;
+        else {
+          images_broken++;
+          await logAction(src, `round-${roundN+1}-image`, 'inspect', false, `Image broken/404: ${src}`, [`Image 404 or broken: ${src}`]);
+        }
+      }
+    } catch {}
+
+    // Check for timer bar (lightning only)
+    if (gameKey==='lightning') {
+      try {
+        const timerHidden = await page.locator('#timerbar').getAttribute('hidden');
+        if (timerHidden === null) {
+          timer_appeared = true;
+          // Inspect the fill class
+          const fillClass = await page.locator('#tbFill').getAttribute('class');
+          await logAction('#timerbar', `round-${roundN+1}-timer`, 'inspect', true, `Timer bar visible, fill class: ${fillClass}`);
+
+          // On first lightning round (artist question), let it time out
+          if (!lightning_timer_tested) {
+            lightning_timer_tested = true;
+            console.log(`    [LIGHTNING] Letting timer expire for round ${roundN+1}...`);
+            await wait(5500); // wait 5.5s for timeout
+            // Check reveal for "⏱ Time!"
+            const revealText = await page.locator('#reveal').textContent().catch(()=>'');
+            lightning_timeout_seen = revealText.includes('Time!');
+            await logAction('#reveal', `round-${roundN+1}-timer-out`, 'wait', lightning_timeout_seen,
+              `Reveal after timeout: "${revealText.slice(0,100)}"`,
+              lightning_timeout_seen ? [] : ['Timer did not produce Time! in reveal']);
+            // Check choices are disabled
+            const choicesDisabled = await page.locator('.choice').evaluateAll(btns => btns.every(b=>b.disabled));
+            await logAction('.choice', `round-${roundN+1}-choices-disabled`, 'inspect', choicesDisabled,
+              `Choices disabled after timeout: ${choicesDisabled}`,
+              choicesDisabled ? [] : ['Choices not disabled after timer expired']);
+          }
+        } else {
+          if (gameKey==='lightning') {
+            // Timer is hidden — might be between rounds. Only flag if in an active round.
+            const revealEmpty = (await page.locator('#reveal').textContent().catch(()=>'')).trim().length === 0;
+            if (revealEmpty && roundN > 0) {
+              await logAction('#timerbar', `round-${roundN+1}-timer-hidden`, 'inspect', false,
+                'Timer bar hidden during active lightning round with empty reveal',
+                ['Lightning timer bar not showing for active round']);
+            }
+          }
+        }
+      } catch(e) {
+        await logAction('#timerbar', `round-${roundN+1}-timer`, 'inspect', false, 'Timer check failed', [String(e)]);
+      }
+    }
+
+    // --- Inspect choices ---
+    let choiceCount = 0;
+    try {
+      const choices = await page.locator('.choice').all();
+      choiceCount = choices.length;
+      if (choiceCount > 0) choices_renders++;
+      else {
+        await logAction('#choices', `round-${roundN+1}-choices`, 'inspect', false, 'No choices rendered',
+          ['No choice buttons rendered for round '+roundN]);
+      }
+    } catch(e) {
+      await logAction('#choices', `round-${roundN+1}-choices`, 'inspect', false, 'Choice inspect failed', [String(e)]);
+    }
+
+    await logAction('#stage', `round-${roundN+1}-render`, 'inspect', stage_renders > roundN,
+      `stage_html_len=${stageHtml.length}, choices=${choiceCount}, imgs_ok=${images_found}, imgs_broken=${images_broken}`);
+
+    // --- Click a choice ---
+    try {
+      const choices = await page.locator('.choice:not([disabled])').all();
+      if (choices.length === 0) {
+        // Maybe already waiting for next, click next btn
+        const nextBtn = page.locator('#nextBtn');
+        const nextVisible = await nextBtn.isVisible().catch(()=>false);
+        if (nextVisible) {
+          await nextBtn.click();
+          await wait(300);
+          continue;
+        }
+        await logAction('.choice', `round-${roundN+1}-pick`, 'click', false, 'No enabled choices found');
+        await wait(500);
+        continue;
+      }
+
+      // Pick first available choice for most rounds, last for some variety
+      const pickIdx = (roundN % 3 === 0) ? 0 : (roundN % 3 === 1) ? choices.length-1 : Math.floor(choices.length/2);
+      const chosen = choices[Math.min(pickIdx, choices.length-1)];
+      const choiceText = await chosen.textContent().catch(()=>'');
+      await chosen.scrollIntoViewIfNeeded();
+      await chosen.click();
+      await wait(400);
+
+      const revealText = await page.locator('#reveal').textContent().catch(()=>'');
+      const revealHasContent = revealText.trim().length > 0;
+      await logAction('.choice', `round-${roundN+1}-pick-${pickIdx}`, 'click', revealHasContent,
+        `Chose: "${choiceText.slice(0,40)}", reveal: "${revealText.slice(0,80)}"`);
+
+      roundsPlayed++;
+    } catch(e) {
+      await logAction('.choice', `round-${roundN+1}-pick`, 'click', false, 'Choice click failed', [String(e)]);
+    }
+
+    // --- Check for reveal link in art/match/lightning ---
+    if (['art','match','lightning'].includes(gameKey)) {
+      try {
+        const revealLink = await page.locator('#reveal a').first().getAttribute('href').catch(()=>null);
+        if (!revealLink) {
+          await logAction('#reveal a', `round-${roundN+1}-reveal-link`, 'inspect', false,
+            'No reveal link found after pick',
+            [`Missing reveal link in ${gameKey} round ${roundN+1}`]);
+        } else {
+          await logAction('#reveal a', `round-${roundN+1}-reveal-link`, 'inspect', true,
+            `Reveal link: ${revealLink.slice(0,80)}`);
+        }
+      } catch {}
+    }
+
+    // --- Click Next → ───
+    await wait(200);
+    try {
+      const nextBtn = page.locator('#nextBtn');
+      const nextVisible = await nextBtn.isVisible().catch(()=>false);
+      if (nextVisible) {
+        const nextText = await nextBtn.textContent().catch(()=>'');
+        await nextBtn.scrollIntoViewIfNeeded();
+        await nextBtn.click();
+        next_btn_worked++;
+        await logAction('#nextBtn', `round-${roundN+1}-next`, 'click', true, `Next text: "${nextText}"`);
+        await wait(400);
+      } else {
+        // Wait a bit — might be loading
+        await wait(1000);
+        const nextBtn2 = page.locator('#nextBtn');
+        const nextVisible2 = await nextBtn2.isVisible().catch(()=>false);
+        if (nextVisible2) {
+          await nextBtn2.click();
+          next_btn_worked++;
+          await logAction('#nextBtn', `round-${roundN+1}-next`, 'click', true, 'Next appeared after 1s');
+          await wait(400);
+        } else {
+          await logAction('#nextBtn', `round-${roundN+1}-next`, 'click', false, 'Next button not visible after pick+wait');
+        }
+      }
+    } catch(e) {
+      await logAction('#nextBtn', `round-${roundN+1}-next`, 'click', false, 'Next click failed', [String(e)]);
+    }
+  }
+
+  // ── 7. Check results screen ──
+  let resultsOk = false;
+  let resultsScore = null;
+  let resultsVerdict = null;
+  let resultsBest = null;
+  let lightningBonusLine = null;
+
+  try {
+    const resultsHidden = await page.locator('#results').getAttribute('hidden');
+    resultsOk = resultsHidden === null;
+  } catch {}
+
+  if (resultsOk) {
+    try { resultsScore = await page.locator('#finalScore').textContent(); } catch {}
+    try { resultsVerdict = await page.locator('#verdict').textContent(); } catch {}
+    try { resultsBest = await page.locator('#best').textContent(); } catch {}
+    if (gameKey==='lightning') {
+      try { lightningBonusLine = await page.locator('#misses').innerHTML(); } catch {}
+    }
+
+    await logAction('#results', 'results-screen', 'inspect', resultsOk,
+      `score=${resultsScore}, verdict="${resultsVerdict}", best="${resultsBest}"`);
+
+    if (gameKey==='lightning') {
+      const hasBonusLine = (lightningBonusLine||'').includes('Named BOTH');
+      await logAction('#misses', 'lightning-bonus-line', 'inspect', hasBonusLine,
+        `Bonus line HTML: "${(lightningBonusLine||'').slice(0,200)}"`,
+        hasBonusLine ? [] : ['Lightning bonus "Named BOTH on X paintings" line missing from results']);
+    }
+
+    // Check best score stored
+    if (!resultsBest || !resultsBest.includes(gameKey)) {
+      await logAction('#best', 'best-score', 'inspect', false,
+        `Best score text missing game key: "${resultsBest}"`,
+        ['Best score line does not include game key']);
+    }
+  } else {
+    await logAction('#results', 'results-screen', 'inspect', false, `Results panel did not appear after ${roundsPlayed} rounds`,
+      ['Results screen did not appear']);
+  }
+
+  // ── 8. Play again ──
+  if (resultsOk) {
+    try {
+      await page.locator('#againBtn').scrollIntoViewIfNeeded();
+      await page.locator('#againBtn').click();
+      await wait(400);
+      const setupHidden = await page.locator('#setup').getAttribute('hidden');
+      const setupVisible = setupHidden === null;
+      await logAction('#againBtn', 'play-again', 'click', setupVisible,
+        `Setup panel returned: ${setupVisible}`,
+        setupVisible ? [] : ['Play again did not return to setup panel']);
+    } catch(e) {
+      await logAction('#againBtn', 'play-again', 'click', false, 'Play again click failed', [String(e)]);
+    }
+  }
+
+  return {
+    game: gameKey, ok: resultsOk, roundsPlayed, stage_renders, choices_renders,
+    images_found, images_broken, timer_appeared, lightning_timeout_seen,
+    next_btn_worked, resultsScore, resultsVerdict, resultsBest, lightningBonusLine
+  };
+}
+
+async function main() {
+  for (let run=0; run<5; run++) {
+    console.log(`\n${'='.repeat(60)}\n[RUN ${run}] Starting...\n${'='.repeat(60)}`);
+    const TK_AGENT = process.env.TK_AGENT || 'screenrecord';
+
+    const browser = await chromium.launch({ headless: true });
+    const ctx = await browser.newContext({
+      viewport: { width: 1600, height: 900 },
+      recordVideo: { dir: path.join(BASE, `screenrecord/rec/run${run}`), size: { width: 1600, height: 900 } }
+    });
+    const page = await ctx.newPage();
+    const errs = [];
+    page.on('console', m => { if (m.type()==='error') errs.push(`CONSOLE_ERR: ${m.text()}`); });
+    page.on('pageerror', e => errs.push(`PAGE_ERR: ${e.message||String(e)}`));
+    page.on('requestfailed', req => {
+      const url = req.url();
+      if (!url.includes('gtag') && !url.includes('fonts.googleapis')) {
+        errs.push(`REQUEST_FAILED: ${req.method()} ${url} — ${req.failure()?.errorText||'unknown'}`);
+      }
+    });
+    page.on('response', resp => {
+      const url = resp.url();
+      if (resp.status() >= 400 && !url.includes('gtag')) {
+        errs.push(`HTTP_${resp.status()}: ${url}`);
+      }
+    });
+
+    const combos = runsFor(run);
+    const runResults = [];
+
+    for (const combo of combos) {
+      errs.length = 0; // Reset per game
+      try {
+        const result = await runGame(page, errs, run, combo);
+        runResults.push(result);
+        console.log(`  [RESULT] ${combo.game}: ok=${result.ok}, rounds=${result.roundsPlayed||0}, errors=${result.error||'none'}`);
+      } catch(e) {
+        console.error(`  [FATAL] ${combo.game}: ${e.message}`);
+        append({ run, ts:new Date().toISOString(), game:combo.game, diff:combo.diff, cat:combo.cat,
+          selector:'top-level', label:'fatal', action:'run', ok:false, effect:'fatal error', errors:[String(e)] });
+        runResults.push({ game:combo.game, ok:false, error:String(e) });
+      }
+    }
+
+    await ctx.close();
+    await browser.close();
+
+    // Convert .webm -> .mp4
+    const recDir = path.join(BASE, `screenrecord/rec/run${run}`);
+    const webms = fs.readdirSync(recDir).filter(f=>f.endsWith('.webm'));
+    for (const webm of webms) {
+      const src = path.join(recDir, webm);
+      const dst = src.replace('.webm','.mp4');
+      try {
+        const { execSync } = await import('child_process');
+        execSync(`/opt/homebrew/bin/ffmpeg -y -i "${src}" -c:v libx264 -preset fast -crf 22 "${dst}" 2>/dev/null`, {timeout:120000});
+        fs.unlinkSync(src);
+        console.log(`  [ffmpeg] ${webm} -> .mp4`);
+      } catch(fe) {
+        console.log(`  [ffmpeg] conversion failed for ${webm}: ${fe.message?.slice(0,80)}`);
+      }
+    }
+
+    console.log(`\n[RUN ${run}] Complete. Results:`, runResults.map(r=>`${r.game}:${r.ok?'OK':'FAIL'}`).join(', '));
+  }
+
+  console.log('\n[screenrecord] All 5 runs complete. Log:', LOG);
+}
+
+main().catch(e => { console.error('[FATAL]', e); process.exit(1); });
diff --git a/scripts/screenrecord-murals.mjs b/scripts/screenrecord-murals.mjs
new file mode 100644
index 0000000..814e50f
--- /dev/null
+++ b/scripts/screenrecord-murals.mjs
@@ -0,0 +1,590 @@
+/**
+ * screenrecord-murals.mjs
+ * 5-pass Playwright screen recorder for http://localhost:9920/murals
+ * Each run uses a distinct element-ordering combination.
+ * Appends JSONL to screenrecord/debug-log.jsonl after every action.
+ */
+import { chromium } from '/Users/macstudio3/.npm-global/lib/node_modules/playwright/index.mjs';
+import fs from 'fs';
+import path from 'path';
+import { fileURLToPath } from 'url';
+import { execSync } from 'child_process';
+
+const __dirname = path.dirname(fileURLToPath(import.meta.url));
+const BASE = path.resolve(__dirname, '..');
+const LOG  = path.join(BASE, 'screenrecord/debug-log.jsonl');
+const RECBASE = path.join(BASE, 'screenrecord/rec');
+const URL  = 'http://localhost:9920/murals';
+
+// ── read prior runs ──
+const prior = fs.existsSync(LOG)
+  ? fs.readFileSync(LOG,'utf8').trim().split('\n').filter(Boolean).map(l=>{try{return JSON.parse(l)}catch{return null}}).filter(Boolean)
+  : [];
+const priorErrors = prior.filter(r => r.errors && r.errors.length > 0);
+const priorErrSelectors = new Set(priorErrors.map(e => e.selector));
+console.log(`Prior log lines: ${prior.length}, prior errors: ${priorErrors.length}`);
+if (priorErrors.length) {
+  console.log('Prior errored selectors:', [...priorErrSelectors].slice(0,10));
+}
+
+const append = o => fs.appendFileSync(LOG, JSON.stringify(o)+'\n');
+
+// ── ordering strategies ──
+function orderFor(run, els) {
+  if (run === 0) return [...els];   // DOM order
+  if (run === 1) return [...els].reverse();  // reverse
+  if (run === 2) {
+    // sliders / range inputs first, then number inputs, then buttons/links
+    const priority = el => el.type === 'range' ? 0 : el.type === 'number' ? 1 : el.type === 'search' ? 2 : 3;
+    return [...els].sort((a,b) => priority(a) - priority(b));
+  }
+  if (run === 3) {
+    // seeded shuffle
+    const s = [...els];
+    for(let i = s.length-1; i > 0; i--){
+      const j = (i*7 + 13*3) % (i+1);
+      [s[i],s[j]] = [s[j],s[i]];
+    }
+    return s;
+  }
+  if (run === 4) {
+    // errored-first from prior runs
+    return [...els].sort((a,b) => (priorErrSelectors.has(b.sel)?1:0) - (priorErrSelectors.has(a.sel)?1:0));
+  }
+  return [...els];
+}
+
+// ── define the interactive surface ──
+// This is the complete list of elements to exercise.
+// We discover dynamic elements inside the page after boot.
+
+const STATIC_ELEMENTS = [
+  // NAV LINKS (hash links are safe; / link navigates away so we observe then come back)
+  { sel: 'header nav a[href="#studio"]',  label: 'Nav: Wall studio',        action: 'click', type: 'link' },
+  { sel: 'header nav a[href="#order"]',   label: 'Nav: Order',              action: 'click', type: 'link' },
+  { sel: 'header nav a[href="/"]',        label: 'Nav: Signature archive',  action: 'click-navigate', type: 'link' },
+
+  // NAME FINDER
+  { sel: '#finderInput',  label: 'Finder: search input',  action: 'type:lincoln', type: 'search' },
+  { sel: '#finderInput',  label: 'Finder: clear + type babe ruth', action: 'clear+type:babe ruth', type: 'search' },
+  { sel: '#finderInput',  label: 'Finder: clear + type einstein', action: 'clear+type:einstein', type: 'search' },
+
+  // STUDIO: MURAL SELECT
+  { sel: '#selMural',  label: 'Studio: Mural select - declaration', action: 'select-option:d',  type: 'select' },
+  { sel: '#selMural',  label: 'Studio: Mural select - politics',    action: 'select-option:p',  type: 'select' },
+  { sel: '#selMural',  label: 'Studio: Mural select - composers',   action: 'select-option:co', type: 'select' },
+
+  // STUDIO: CUSTOM SIZE INPUTS
+  { sel: '#murW',  label: 'Studio: Mural width - set 30',   action: 'set-value:30',  type: 'number' },
+  { sel: '#murH',  label: 'Studio: Mural height - set 10',  action: 'set-value:10',  type: 'number' },
+  { sel: '#murW',  label: 'Studio: Mural width - set 16',   action: 'set-value:16',  type: 'number' },
+  { sel: '#murH',  label: 'Studio: Mural height - set 8',   action: 'set-value:8',   type: 'number' },
+  { sel: '#murW',  label: 'Studio: Mural width - set 40',   action: 'set-value:40',  type: 'number' },
+  { sel: '#murH',  label: 'Studio: Mural height - set 16',  action: 'set-value:16',  type: 'number' },
+
+  // STUDIO: WALL SLIDERS
+  { sel: '#wallW',  label: 'Studio: Wall width slider - 40',  action: 'set-slider:40',  type: 'range' },
+  { sel: '#wallH',  label: 'Studio: Wall height slider - 16', action: 'set-slider:16',  type: 'range' },
+  { sel: '#wallW',  label: 'Studio: Wall width slider - 60',  action: 'set-slider:60',  type: 'range' },
+  { sel: '#wallH',  label: 'Studio: Wall height slider - 20', action: 'set-slider:20',  type: 'range' },
+  { sel: '#wallW',  label: 'Studio: Wall width slider - 24',  action: 'set-slider:24',  type: 'range' },
+  { sel: '#wallH',  label: 'Studio: Wall height slider - 12', action: 'set-slider:12',  type: 'range' },
+
+  // STUDIO: CENTER BUTTON
+  { sel: '#btnCenter',  label: 'Studio: Center on wall',  action: 'click', type: 'button' },
+
+  // STUDIO: SCENE PRESETS (will be discovered dynamically after boot)
+  { sel: '#scenePresets button[data-scene="study"]',    label: 'Scene preset: Study',   action: 'click', type: 'button' },
+  { sel: '#scenePresets button[data-scene="lounge"]',   label: 'Scene preset: Lounge',  action: 'click', type: 'button' },
+  { sel: '#scenePresets button[data-scene="gallery"]',  label: 'Scene preset: Gallery', action: 'click', type: 'button' },
+  { sel: '#scenePresets button[data-scene="plain"]',    label: 'Scene preset: Plain',   action: 'click', type: 'button' },
+
+  // ORDER FORM INPUTS
+  { sel: 'input[name="name"]',   label: 'Order: Name input',        action: 'type:John Test',         type: 'input' },
+  { sel: 'input[name="email"]',  label: 'Order: Email input',       action: 'type:test@example.com',  type: 'input' },
+  { sel: 'input[name="wall_w"]', label: 'Order: Wall width input',  action: 'set-value:24',           type: 'number' },
+  { sel: 'input[name="wall_h"]', label: 'Order: Wall height input', action: 'set-value:12',           type: 'number' },
+  { sel: 'textarea[name="notes"]', label: 'Order: Notes textarea', action: 'type:Test order for master bedroom. Target install October.',  type: 'input' },
+  { sel: '#orderForm button[type="submit"]', label: 'Order: Submit form', action: 'click', type: 'button' },
+];
+
+// Dynamic elements to discover per-page-load (gallery cards)
+const GALLERY_CARD_ELEMENTS = [
+  // Show names toggles (first 4 cards)
+  { sel: '.m-card:nth-child(1) .name-toggle',  label: 'Gallery card 1: Show names toggle',   action: 'click', type: 'button' },
+  { sel: '.m-card:nth-child(1) .name-toggle',  label: 'Gallery card 1: Hide names toggle',   action: 'click', type: 'button' },
+  { sel: '.m-card:nth-child(2) .name-toggle',  label: 'Gallery card 2: Show names toggle',   action: 'click', type: 'button' },
+  { sel: '.m-card:nth-child(3) .name-toggle',  label: 'Gallery card 3: Show names toggle',   action: 'click', type: 'button' },
+
+  // Roster drawers
+  { sel: '.m-card:nth-child(1) .roster-trig',  label: 'Gallery card 1: Roster drawer open',  action: 'click', type: 'button' },
+  { sel: '.m-card:nth-child(2) .roster-trig',  label: 'Gallery card 2: Roster drawer open',  action: 'click', type: 'button' },
+  { sel: '.m-card:nth-child(3) .roster-trig',  label: 'Gallery card 3: Roster drawer open',  action: 'click', type: 'button' },
+
+  // Place on wall buttons
+  { sel: '.m-card:nth-child(1) [data-place]',  label: 'Gallery card 1: Place on wall',  action: 'click', type: 'button' },
+  { sel: '.m-card:nth-child(2) [data-place]',  label: 'Gallery card 2: Place on wall',  action: 'click', type: 'button' },
+  { sel: '.m-card:nth-child(3) [data-place]',  label: 'Gallery card 3: Place on wall',  action: 'click', type: 'button' },
+];
+
+// Roster filter search (only after a roster is open)
+const ROSTER_FILTER = [
+  { sel: '.m-card:nth-child(1) .r-search',  label: 'Roster filter search: type adams',  action: 'type:adams',  type: 'search' },
+  { sel: '.m-card:nth-child(2) .r-search',  label: 'Roster filter search: type bach',   action: 'type:bach',   type: 'search' },
+];
+
+// Mural drag action (special handling)
+const DRAG_ACTION = { sel: '#muralEl', label: 'Studio: Drag mural element', action: 'drag', type: 'drag' };
+
+const ALL_ELEMENTS = [...GALLERY_CARD_ELEMENTS, ...STATIC_ELEMENTS];
+
+async function doAction(page, el, errs, run) {
+  const ts = new Date().toISOString();
+  const result = { run, ts, selector: el.sel, label: el.label, action: el.action, ok: false, effect: '', errors: [] };
+
+  try {
+    // Clear per-action error buffer
+    errs.splice(0);
+
+    // Locate element
+    const handle = page.locator(el.sel).first();
+    const exists = await handle.count() > 0;
+    if (!exists) {
+      result.effect = 'ELEMENT_NOT_FOUND';
+      result.errors = [`Element not found: ${el.sel}`];
+      append(result);
+      return result;
+    }
+
+    // scrollIntoView
+    await handle.scrollIntoViewIfNeeded({ timeout: 5000 }).catch(() => {});
+    await page.waitForTimeout(200);
+
+    // snapshot before
+    const before = await page.evaluate((sel) => {
+      const el = document.querySelector(sel);
+      if (!el) return null;
+      return {
+        text: el.textContent?.trim().slice(0, 120),
+        value: el.value || null,
+        class: el.className?.slice(0, 80),
+        display: getComputedStyle(el).display,
+        visible: !!(el.offsetWidth || el.offsetHeight),
+      };
+    }, el.sel).catch(() => null);
+
+    // perform action
+    if (el.action === 'click-navigate') {
+      // Click a link that navigates away, then go back
+      await handle.click({ timeout: 8000, force: true });
+      await page.waitForTimeout(1500);
+      await page.goBack({ waitUntil: 'domcontentloaded' }).catch(() => {});
+      await page.waitForTimeout(500);
+      result.ok = true;
+      result.effect = 'CLICKED_NAVIGATE_WENT_BACK';
+      append(result);
+      return result;
+
+    } else if (el.action === 'click') {
+      // Scroll into view with extra top offset to clear sticky header (~80px)
+      await page.evaluate((sel) => {
+        const el = document.querySelector(sel);
+        if (el) {
+          const rect = el.getBoundingClientRect();
+          if (rect.top < 90) window.scrollBy(0, rect.top - 100);
+        }
+      }, el.sel).catch(() => {});
+      await page.waitForTimeout(150);
+      await handle.click({ timeout: 8000, force: true });
+
+    } else if (el.action.startsWith('type:')) {
+      const text = el.action.slice(5);
+      await handle.fill(text, { timeout: 5000 });
+      await handle.dispatchEvent('input');
+
+    } else if (el.action.startsWith('clear+type:')) {
+      const text = el.action.slice(11);
+      await handle.fill('', { timeout: 5000 });
+      await handle.fill(text, { timeout: 5000 });
+      await handle.dispatchEvent('input');
+
+    } else if (el.action.startsWith('set-value:')) {
+      const val = el.action.slice(10);
+      await handle.fill(val, { timeout: 5000 });
+      await handle.dispatchEvent('input');
+      await handle.dispatchEvent('change');
+
+    } else if (el.action.startsWith('set-slider:')) {
+      const val = el.action.slice(11);
+      await handle.fill(val, { timeout: 5000 });
+      await handle.dispatchEvent('input');
+
+    } else if (el.action.startsWith('select-option:')) {
+      const val = el.action.slice(14);
+      await handle.selectOption(val, { timeout: 5000 });
+
+    } else if (el.action === 'drag') {
+      // Drag mural 100px right then back
+      const box = await handle.boundingBox();
+      if (box) {
+        const cx = box.x + box.width/2;
+        const cy = box.y + box.height/2;
+        await page.mouse.move(cx, cy);
+        await page.mouse.down();
+        await page.waitForTimeout(100);
+        await page.mouse.move(cx + 80, cy + 20, { steps: 10 });
+        await page.waitForTimeout(200);
+        await page.mouse.move(cx + 150, cy, { steps: 10 });
+        await page.waitForTimeout(200);
+        await page.mouse.up();
+      }
+    }
+
+    await page.waitForTimeout(400);
+
+    // snapshot after
+    const after = await page.evaluate((sel) => {
+      const el = document.querySelector(sel);
+      if (!el) return null;
+      return {
+        text: el.textContent?.trim().slice(0, 120),
+        value: el.value || null,
+        class: el.className?.slice(0, 80),
+        display: getComputedStyle(el).display,
+        visible: !!(el.offsetWidth || el.offsetHeight),
+      };
+    }, el.sel).catch(() => null);
+
+    // capture readout state for studio actions
+    let studioReadout = null;
+    if (el.sel.includes('mur') || el.sel.includes('wall') || el.sel === '#btnCenter' || el.action === 'drag') {
+      studioReadout = await page.evaluate(() => {
+        const r = document.querySelector('#readout');
+        return r ? r.textContent?.trim().slice(0, 300) : null;
+      }).catch(() => null);
+    }
+
+    // check sig count change for mural size changes
+    let sigCount = null;
+    if (el.sel.includes('mur') || el.sel.includes('selMural')) {
+      sigCount = await page.evaluate(() => {
+        const r = document.querySelector('#readout');
+        if (!r) return null;
+        const m = r.textContent.match(/Signatures shown:\s*(\d+)/);
+        return m ? parseInt(m[1]) : null;
+      }).catch(() => null);
+    }
+
+    // check order summary
+    let orderSummary = null;
+    if (el.sel.includes('mur') || el.sel.includes('wall') || el.sel.includes('selMural')) {
+      orderSummary = await page.evaluate(() => {
+        const s = document.querySelector('#orderSummary');
+        return s ? s.textContent?.trim().slice(0, 200) : null;
+      }).catch(() => null);
+    }
+
+    result.ok = true;
+    result.effect = JSON.stringify({
+      before: before?.text?.slice(0,60) || before?.value,
+      after: after?.text?.slice(0,60) || after?.value,
+      studioReadout: studioReadout?.slice(0,200),
+      sigCount,
+      orderSummary: orderSummary?.slice(0,100),
+    });
+
+  } catch(err) {
+    result.ok = false;
+    result.effect = 'ACTION_FAILED';
+    result.errors = [String(err)];
+  }
+
+  // attach any console errors that fired
+  if (errs.length) {
+    result.errors = [...result.errors, ...errs.slice()];
+    errs.splice(0);
+  }
+
+  append(result);
+  return result;
+}
+
+async function runRosterFilter(page, errs, run, cardN, filterText) {
+  // Only works if roster is open
+  const sel = `.m-card:nth-child(${cardN}) .r-search`;
+  const el = { sel, label: `Roster card ${cardN}: filter "${filterText}"`, action: `type:${filterText}`, type: 'search' };
+  const handle = page.locator(sel).first();
+  const visible = await handle.count() > 0;
+  if (!visible) {
+    append({ run, ts: new Date().toISOString(), selector: sel, label: el.label, action: el.action, ok: false, effect: 'ROSTER_NOT_OPEN', errors: [] });
+    return;
+  }
+  await doAction(page, el, errs, run);
+}
+
+async function doRosterItemClick(page, errs, run, cardN) {
+  // Click first roster item to trigger provenance modal
+  const sel = `.m-card:nth-child(${cardN}) .r-item:first-child`;
+  const handle = page.locator(sel).first();
+  if (await handle.count() === 0) {
+    append({ run, ts: new Date().toISOString(), selector: sel, label: `Roster card ${cardN}: click first item`, action: 'click', ok: false, effect: 'NO_ROSTER_ITEMS', errors: [] });
+    return;
+  }
+  await doAction(page, { sel, label: `Roster card ${cardN}: click roster item → provenance modal`, action: 'click', type: 'button' }, errs, run);
+  await page.waitForTimeout(300);
+
+  // Check modal opened
+  const modalOpen = await page.evaluate(() => {
+    const m = document.querySelector('#provModal');
+    return m && m.classList.contains('open');
+  }).catch(() => false);
+
+  append({ run, ts: new Date().toISOString(), selector: '#provModal', label: 'Provenance modal: opened?', action: 'observe', ok: modalOpen, effect: modalOpen ? 'MODAL_OPEN' : 'MODAL_NOT_OPEN', errors: [] });
+
+  if (modalOpen) {
+    // Close modal
+    await doAction(page, { sel: '#provX', label: 'Provenance modal: close (X button)', action: 'click', type: 'button' }, errs, run);
+  }
+}
+
+async function doDrag(page, errs, run) {
+  const el = page.locator('#muralEl').first();
+  if (await el.count() === 0) {
+    append({ run, ts: new Date().toISOString(), selector: '#muralEl', label: 'Studio: Drag mural', action: 'drag', ok: false, effect: 'MURAL_EL_NOT_FOUND', errors: [] });
+    return;
+  }
+
+  errs.splice(0);
+  const ts = new Date().toISOString();
+  try {
+    await el.scrollIntoViewIfNeeded({ timeout: 5000 }).catch(() => {});
+    await page.waitForTimeout(300);
+
+    const box = await el.boundingBox();
+    if (!box) throw new Error('no boundingBox');
+
+    const before = await page.evaluate(() => {
+      const m = document.querySelector('#muralEl');
+      return m ? { left: m.style.left, top: m.style.top } : null;
+    });
+
+    const cx = box.x + box.width/2;
+    const cy = box.y + box.height/2;
+    await page.mouse.move(cx, cy);
+    await page.mouse.down();
+    await page.waitForTimeout(150);
+    await page.mouse.move(cx + 60, cy - 20, { steps: 15 });
+    await page.waitForTimeout(150);
+    await page.mouse.move(cx + 120, cy, { steps: 15 });
+    await page.waitForTimeout(200);
+    await page.mouse.up();
+    await page.waitForTimeout(400);
+
+    const after = await page.evaluate(() => {
+      const m = document.querySelector('#muralEl');
+      return m ? { left: m.style.left, top: m.style.top } : null;
+    });
+
+    const readout = await page.evaluate(() => {
+      const r = document.querySelector('#readout');
+      return r ? r.textContent?.trim().slice(0, 300) : null;
+    });
+
+    const moved = before && after && (before.left !== after.left || before.top !== after.top);
+    append({ run, ts, selector: '#muralEl', label: 'Studio: Drag mural', action: 'drag', ok: moved, effect: JSON.stringify({ before, after, readout: readout?.slice(0,150), moved }), errors: errs.splice(0) });
+
+  } catch(err) {
+    append({ run, ts, selector: '#muralEl', label: 'Studio: Drag mural', action: 'drag', ok: false, effect: 'DRAG_FAILED', errors: [String(err), ...errs.splice(0)] });
+  }
+}
+
+// ── main 5-run loop ──
+const RUN_LABELS = [
+  'run0: DOM order',
+  'run1: reverse order',
+  'run2: sliders-first',
+  'run3: seeded shuffle',
+  'run4: errored-first',
+];
+
+for (let run = 0; run < 5; run++) {
+  console.log(`\n=== ${RUN_LABELS[run]} ===`);
+
+  const recDir = path.join(RECBASE, `run${run}`);
+  fs.mkdirSync(recDir, { recursive: true });
+
+  const browser = await chromium.launch({ headless: true });
+  const ctx = await browser.newContext({
+    viewport: { width: 1440, height: 900 },
+    recordVideo: { dir: recDir, size: { width: 1440, height: 900 } },
+  });
+  const page = await ctx.newPage();
+
+  const consoleErrs = [];
+  const pageErrs = [];
+  page.on('console', msg => { if (msg.type() === 'error') consoleErrs.push(`CONSOLE_ERR: ${msg.text()}`); });
+  page.on('pageerror', err => pageErrs.push(`PAGE_ERR: ${String(err)}`));
+
+  const combinedErrs = () => [...consoleErrs, ...pageErrs];
+
+  // Navigate
+  try {
+    await page.goto(URL, { waitUntil: 'domcontentloaded', timeout: 15000 });
+  } catch(e) {
+    append({ run, ts: new Date().toISOString(), selector: 'page', label: 'PAGE LOAD', action: 'goto', ok: false, effect: 'LOAD_FAILED', errors: [String(e)] });
+    await ctx.close(); await browser.close();
+    continue;
+  }
+
+  // Wait for boot() to complete (gallery should be populated)
+  try {
+    await page.waitForSelector('#gallery .m-card', { timeout: 10000 });
+    await page.waitForSelector('#scenePresets button', { timeout: 8000 });
+  } catch(e) {
+    append({ run, ts: new Date().toISOString(), selector: '#gallery', label: 'BOOT WAIT', action: 'wait', ok: false, effect: 'GALLERY_NOT_RENDERED', errors: [String(e), ...combinedErrs()] });
+    await ctx.close(); await browser.close();
+    continue;
+  }
+  await page.waitForTimeout(1000);
+
+  // Log page load status
+  const pageTitle = await page.title();
+  const muralCount = await page.evaluate(() => document.querySelectorAll('#gallery .m-card').length);
+  const sigsLoaded = await page.evaluate(() => typeof SIGS !== 'undefined' && SIGS.length > 0).catch(() => false);
+  append({ run, ts: new Date().toISOString(), selector: 'page', label: 'PAGE LOAD', action: 'goto', ok: true,
+    effect: JSON.stringify({ title: pageTitle, muralCards: muralCount, sigsLoaded }), errors: combinedErrs().splice(0) });
+  consoleErrs.splice(0); pageErrs.splice(0);
+
+  console.log(`  Page loaded: ${muralCount} mural cards, sigsLoaded=${sigsLoaded}`);
+
+  // ── Build the ordered element list for this run ──
+  const orderedEls = orderFor(run, ALL_ELEMENTS);
+
+  // ── Execute each element action ──
+  for (const el of orderedEls) {
+    const errs = combinedErrs();
+    consoleErrs.splice(0); pageErrs.splice(0);
+
+    // Special case: roster filter search requires roster to be open first
+    if (el.sel.includes('r-search')) {
+      // Check if already open
+      const open = await page.evaluate((sel) => {
+        const el = document.querySelector(sel);
+        return el ? el.offsetParent !== null : false;
+      }, el.sel).catch(() => false);
+      if (!open) {
+        append({ run, ts: new Date().toISOString(), selector: el.sel, label: el.label, action: el.action, ok: false, effect: 'SKIPPED_ROSTER_CLOSED', errors: [] });
+        continue;
+      }
+    }
+
+    const r = await doAction(page, el, consoleErrs, run);
+    const cErrs = combinedErrs();
+    if (cErrs.length) {
+      // Attach any new errors that fired after the action settled
+      const prev = JSON.parse(fs.readFileSync(LOG,'utf8').trim().split('\n').pop() || '{}');
+      if (prev.errors) prev.errors.push(...cErrs);
+      consoleErrs.splice(0); pageErrs.splice(0);
+    }
+
+    if (!r.ok) console.log(`  FAIL [run${run}] ${el.label}: ${r.effect}`);
+    else console.log(`  ok   [run${run}] ${el.label}`);
+  }
+
+  // ── Extra targeted actions ──
+
+  // Open roster on card 1 & 2 (may already be open from gallery elements)
+  // Ensure card 1 roster is open, then filter
+  console.log('  [extra] Ensuring roster card 1 open...');
+  const rosterOpen1 = await page.evaluate(() => {
+    const body = document.querySelector('[data-rosterbody]');
+    return body && body.classList.contains('open');
+  }).catch(() => false);
+  if (!rosterOpen1) {
+    const trig = page.locator('.m-card:nth-child(1) .roster-trig').first();
+    if (await trig.count() > 0) { await trig.scrollIntoViewIfNeeded().catch(()=>{}); await trig.click().catch(()=>{}); await page.waitForTimeout(600); }
+  }
+  await runRosterFilter(page, consoleErrs, run, 1, 'wash');
+  await page.waitForTimeout(400);
+  await doRosterItemClick(page, consoleErrs, run, 1);
+  await page.waitForTimeout(500);
+
+  // Open roster card 2
+  const rosterOpen2 = await page.evaluate(() => {
+    const bodies = document.querySelectorAll('[data-rosterbody]');
+    return bodies[1] && bodies[1].classList.contains('open');
+  }).catch(() => false);
+  if (!rosterOpen2) {
+    const trig = page.locator('.m-card:nth-child(2) .roster-trig').first();
+    if (await trig.count() > 0) { await trig.scrollIntoViewIfNeeded().catch(()=>{}); await trig.click().catch(()=>{}); await page.waitForTimeout(600); }
+  }
+  await runRosterFilter(page, consoleErrs, run, 2, 'hancock');
+  await page.waitForTimeout(400);
+
+  // ── Drag mural ──
+  console.log('  [extra] Dragging mural...');
+  await page.$('#studio')?.then(el => el?.scrollIntoView?.()).catch(()=>{});
+  await page.evaluate(() => { const s = document.querySelector('#studio'); if(s) s.scrollIntoView({block:'center'}); });
+  await page.waitForTimeout(500);
+  await doDrag(page, consoleErrs, run);
+
+  // ── Verify collage image loads in first card ──
+  const img1Loaded = await page.evaluate(() => {
+    const img = document.querySelector('.m-card:nth-child(1) img');
+    return img ? { src: img.src, complete: img.complete, naturalW: img.naturalWidth } : null;
+  }).catch(() => null);
+  append({ run, ts: new Date().toISOString(), selector: '.m-card:nth-child(1) img', label: 'Gallery card 1: collage image load', action: 'observe', ok: !!(img1Loaded?.complete && img1Loaded?.naturalW > 0), effect: JSON.stringify(img1Loaded), errors: [] });
+
+  // ── Check price & signatures readout in studio ──
+  const readoutCheck = await page.evaluate(() => {
+    const r = document.querySelector('#readout');
+    if (!r) return null;
+    const text = r.textContent;
+    const priceMatch = text.match(/Price:\s*\$[\d,]+/);
+    const sigMatch = text.match(/Signatures shown:\s*(\d+)/);
+    const sqftMatch = text.match(/(\d+)\s*sq\s*ft/i) || text.match(/Mural:.*?(\d+)×(\d+)/);
+    return { text: text.slice(0,300), price: priceMatch?.[0], sigs: sigMatch?.[0], sqft: sqftMatch?.[0] };
+  }).catch(() => null);
+  append({ run, ts: new Date().toISOString(), selector: '#readout', label: 'Studio: readout check (price + sig count)', action: 'observe', ok: !!(readoutCheck?.price && readoutCheck?.sigs), effect: JSON.stringify(readoutCheck), errors: [] });
+
+  // ── Check order summary synced ──
+  const orderSummaryCheck = await page.evaluate(() => {
+    const s = document.querySelector('#orderSummary');
+    return s ? s.textContent?.trim().slice(0,200) : null;
+  }).catch(() => null);
+  append({ run, ts: new Date().toISOString(), selector: '#orderSummary', label: 'Order: summary synced with studio', action: 'observe', ok: !!(orderSummaryCheck && orderSummaryCheck.length > 10), effect: orderSummaryCheck, errors: [] });
+
+  // ── Escape key closes modal (if open) ──
+  await page.keyboard.press('Escape');
+  await page.waitForTimeout(200);
+
+  // ── Capture final console errors ──
+  const finalErrs = [...consoleErrs, ...pageErrs];
+  if (finalErrs.length) {
+    append({ run, ts: new Date().toISOString(), selector: 'page', label: 'FINAL CONSOLE ERRORS', action: 'observe', ok: false, effect: '', errors: finalErrs });
+  }
+
+  console.log(`  Closing run${run}...`);
+  await ctx.close();
+  await browser.close();
+
+  // ── Convert webm → mp4 ──
+  const webms = fs.readdirSync(recDir).filter(f => f.endsWith('.webm'));
+  for (const w of webms) {
+    const inp = path.join(recDir, w);
+    const out = inp.replace('.webm', '.mp4');
+    try {
+      execSync(`ffmpeg -y -i "${inp}" -c:v libx264 -preset fast -crf 22 "${out}" 2>/dev/null`);
+      console.log(`  converted: ${out}`);
+    } catch(e) {
+      console.log(`  ffmpeg failed for ${w}: ${e.message?.slice(0,100)}`);
+    }
+  }
+
+  // Brief cooldown between runs
+  await new Promise(r => setTimeout(r, 1000));
+}
+
+console.log('\n=== All 5 runs complete ===');
+console.log(`Debug log: ${LOG}`);
+console.log(`Recordings: ${RECBASE}/run{0..4}/`);
diff --git a/scripts/screenrecord.mjs b/scripts/screenrecord.mjs
new file mode 100644
index 0000000..b35ca6f
--- /dev/null
+++ b/scripts/screenrecord.mjs
@@ -0,0 +1,615 @@
+// Celebrity Signatures — screen-record + UI debug
+// 5 runs × distinct click-order combinations
+// Output: screenrecord/rec/run{0..4}/*.mp4
+// Log:    screenrecord/debug-log.jsonl (append-only, cross-reload memory)
+
+import pkg from '/Users/macstudio3/.npm-global/lib/node_modules/playwright/index.js';
+const { chromium } = pkg;
+import fs from 'fs';
+import { execSync } from 'child_process';
+
+const ROOT = '/Users/macstudio3/Projects/CelebritySignatures';
+const LOG = `${ROOT}/screenrecord/debug-log.jsonl`;
+const RECDIR = `${ROOT}/screenrecord/rec`;
+const URL = 'http://localhost:9920/';
+
+// ── Read prior runs ──
+const prior = fs.existsSync(LOG)
+  ? fs.readFileSync(LOG, 'utf8').trim().split('\n').filter(Boolean)
+      .map(l => { try { return JSON.parse(l); } catch { return null; } }).filter(Boolean)
+  : [];
+const priorErrors = prior.filter(r => r.errors && r.errors.length > 0);
+const priorErrorSelectors = new Set(priorErrors.map(e => e.selector).filter(Boolean));
+console.log(`Prior log: ${prior.length} entries, ${priorErrors.length} with errors`);
+if (priorErrorSelectors.size) console.log('Prior errors on:', [...priorErrorSelectors].join(', '));
+
+const append = (o) => fs.appendFileSync(LOG, JSON.stringify(o) + '\n');
+
+const ORDERED_ELS_RUN_DESCRIPTIONS = [
+  'DOM order (natural)',
+  'Reverse DOM order',
+  'Sliders-first',
+  'Seeded shuffle (seed=42)',
+  'Errored-elements-first (from prior runs)',
+];
+
+// ── Seeded shuffle ──
+function seededShuffle(arr, seed) {
+  const s = [...arr];
+  let state = seed;
+  const rand = () => { state = (state * 1664525 + 1013904223) & 0xffffffff; return (state >>> 0) / 0x100000000; };
+  for (let i = s.length - 1; i > 0; i--) { const j = Math.floor(rand() * (i + 1)); [s[i], s[j]] = [s[j], s[i]]; }
+  return s;
+}
+
+function orderFor(run, els) {
+  if (run === 0) return [...els];
+  if (run === 1) return [...els].reverse();
+  if (run === 2) return [...els].sort((a, b) => (b.action === 'range' ? 1 : 0) - (a.action === 'range' ? 1 : 0));
+  if (run === 3) return seededShuffle([...els], 42);
+  if (run === 4) return [...els].sort((a, b) => (priorErrorSelectors.has(b.sel) ? 1 : 0) - (priorErrorSelectors.has(a.sel) ? 1 : 0));
+  return [...els];
+}
+
+// ── Helpers ──
+async function waitForData(page) {
+  await page.waitForFunction(() => document.querySelectorAll('.card').length > 0, { timeout: 15000 });
+}
+
+async function ensureDrawerOpen(page) {
+  const isOpen = await page.evaluate(() => document.querySelector('#drawer')?.classList.contains('open'));
+  if (!isOpen) {
+    await page.click('#burger');
+    await page.waitForTimeout(350);
+  }
+  // Ensure we're on grid tab so controls are visible
+  const controlsVisible = await page.evaluate(() => {
+    const el = document.querySelector('#controls');
+    return el && getComputedStyle(el).display !== 'none';
+  });
+  if (!controlsVisible) {
+    // Switch to grid tab to restore controls
+    const gridTab = await page.$('.drawer .tab[data-v="grid"]');
+    if (gridTab) { await gridTab.click(); await page.waitForTimeout(200); }
+  }
+}
+
+async function ensureDrawerClosed(page) {
+  const isOpen = await page.evaluate(() => document.querySelector('#drawer')?.classList.contains('open'));
+  if (isOpen) {
+    await page.click('#drawerX');
+    await page.waitForTimeout(300);
+  }
+}
+
+async function safeScrollIntoView(page, locator) {
+  try {
+    await locator.scrollIntoViewIfNeeded({ timeout: 2000 });
+  } catch {
+    // Fallback: JS scroll
+    try {
+      const el = await locator.elementHandle({ timeout: 500 });
+      if (el) await el.evaluate(n => n.scrollIntoView({ block: 'center' }));
+    } catch { /* ignore */ }
+  }
+}
+
+// ── Popup hover-click helper ──
+async function hoverAndClickFirstInfoChip(page) {
+  await ensureDrawerClosed(page);
+  // Scroll to top of page to find cards
+  await page.evaluate(() => window.scrollTo(0, 0));
+  await page.waitForTimeout(200);
+  const card = page.locator('.card').first();
+  await safeScrollIntoView(page, card);
+  await card.hover();
+  await page.waitForTimeout(250);
+  const chip = card.locator('.info-chip');
+  await chip.click({ timeout: 3000 });
+  await page.waitForTimeout(600);
+}
+
+// ── Static element list ──
+const STATIC_ELEMENTS = [
+  // TOPBAR
+  { sel: 'a.logo',                                     label: 'Logo link (home)',                        action: 'nav-check' },
+  { sel: '#q',                                         label: 'Search: type "monet"',                    action: 'type',    value: 'monet' },
+  { sel: '#q',                                         label: 'Search: type "kahlo"',                    action: 'type',    value: 'kahlo' },
+  { sel: '#q',                                         label: 'Search: type "xyzzy" (no results)',       action: 'type',    value: 'xyzzy' },
+  { sel: '#q',                                         label: 'Search: clear',                           action: 'clear' },
+  { sel: 'nav.gnav a[href="/murals"]',                 label: 'Nav: Murals',                             action: 'nav-check' },
+  { sel: 'nav.gnav a[href="/game"]',                   label: 'Nav: Games',                              action: 'nav-check' },
+  { sel: 'nav.gnav a[href="/upload"]',                 label: 'Nav: Upload yours',                       action: 'nav-check' },
+  { sel: '#burger',                                    label: 'Hamburger — open drawer',                 action: 'click' },
+  // HERO CTAs
+  { sel: 'a.hbtn[href="#collection"]',                 label: 'Hero CTA: Browse the collection',         action: 'anchor-click' },
+  { sel: 'a.hbtn[href="/murals"]',                     label: 'Hero CTA: Order a mural',                 action: 'nav-check' },
+  { sel: 'a.hbtn[href="/game"]',                       label: 'Hero CTA: Play the games',                action: 'nav-check' },
+  // DRAWER close
+  { sel: '#drawerX',                                   label: 'Drawer × close',                          action: 'click', prereq: 'openDrawer' },
+  { sel: '#dback',                                     label: 'Drawer backdrop',                         action: 'click', prereq: 'openDrawer' },
+  // DRAWER tabs
+  { sel: '.drawer .tab[data-v="grid"]',                label: 'Drawer tab: Grid',                        action: 'click', prereq: 'openDrawer' },
+  { sel: '.drawer .tab[data-v="collages"]',            label: 'Drawer tab: Collages',                    action: 'click', prereq: 'openDrawer' },
+  { sel: '.drawer .tab[data-v="grid"]',                label: 'Drawer tab: back to Grid',                action: 'click', prereq: 'openDrawer' },
+  // DRAWER nav links (verified without navigation)
+  { sel: '.d-links a[href="/murals"]',                 label: 'Drawer link: Signature murals',           action: 'nav-check' },
+  { sel: '.d-links a[href="/game"]',                   label: 'Drawer link: The Signature Games',        action: 'nav-check' },
+  { sel: '.d-links a[href="/upload"]',                 label: 'Drawer link: Upload your signature',      action: 'nav-check' },
+  // DRAWER controls — all require drawer open + grid tab
+  { sel: '#useFilter',                                 label: 'Use filter: Free to use',                 action: 'select', value: 'yes',                prereq: 'openDrawerGrid' },
+  { sel: '#useFilter',                                 label: 'Use filter: Permission needed',           action: 'select', value: 'permission-needed',   prereq: 'openDrawerGrid' },
+  { sel: '#useFilter',                                 label: 'Use filter: All signatures',              action: 'select', value: 'all',                prereq: 'openDrawerGrid' },
+  { sel: '#sort',                                      label: 'Sort: Category then rank',                action: 'select', value: 'cat',                prereq: 'openDrawerGrid' },
+  { sel: '#sort',                                      label: 'Sort: Name A→Z',                          action: 'select', value: 'name',              prereq: 'openDrawerGrid' },
+  { sel: '#sort',                                      label: 'Sort: Name Z→A',                          action: 'select', value: 'name-desc',         prereq: 'openDrawerGrid' },
+  { sel: '#sort',                                      label: 'Sort: Rank',                              action: 'select', value: 'rank',              prereq: 'openDrawerGrid' },
+  { sel: '#sort',                                      label: 'Sort: Notability',                        action: 'select', value: 'notability',        prereq: 'openDrawerGrid' },
+  { sel: '#sort',                                      label: 'Sort: Usable first',                      action: 'select', value: 'usable',            prereq: 'openDrawerGrid' },
+  { sel: '#sort',                                      label: 'Sort: Risk low→high',                     action: 'select', value: 'risk',              prereq: 'openDrawerGrid' },
+  { sel: '#sort',                                      label: 'Sort: Risk high→low',                     action: 'select', value: 'risk-desc',         prereq: 'openDrawerGrid' },
+  { sel: '#sort',                                      label: 'Sort: License A→Z',                       action: 'select', value: 'license',           prereq: 'openDrawerGrid' },
+  { sel: '#sort',                                      label: 'Sort: Living first',                       action: 'select', value: 'living',            prereq: 'openDrawerGrid' },
+  { sel: '#sort',                                      label: 'Sort: Deceased first',                    action: 'select', value: 'deceased',          prereq: 'openDrawerGrid' },
+  { sel: '#sort',                                      label: 'Sort: Death date',                        action: 'select', value: 'death',             prereq: 'openDrawerGrid' },
+  { sel: '#sort',                                      label: 'Sort: Museums',                           action: 'select', value: 'museums',           prereq: 'openDrawerGrid' },
+  { sel: '#sort',                                      label: 'Sort: Signature count',                   action: 'select', value: 'sigcount',          prereq: 'openDrawerGrid' },
+  { sel: '#sort',                                      label: 'Sort: reset to cat',                      action: 'select', value: 'cat',               prereq: 'openDrawerGrid' },
+  { sel: '#density',                                   label: 'Density slider → 3',                      action: 'range',  value: 3,                   prereq: 'openDrawerGrid' },
+  { sel: '#density',                                   label: 'Density slider → 7',                      action: 'range',  value: 7,                   prereq: 'openDrawerGrid' },
+  { sel: '#density',                                   label: 'Density slider → 5',                      action: 'range',  value: 5,                   prereq: 'openDrawerGrid' },
+  // CATEGORY CHIPS
+  { sel: '#catChips .chip[data-c="All"]',              label: 'Category: All',                           action: 'click', prereq: 'openDrawerGrid' },
+  { sel: '#catChips .chip[data-c="Oldest Signatures"]',label: 'Category: Oldest Signatures',             action: 'click', prereq: 'openDrawerGrid' },
+  { sel: '#catChips .chip[data-c="Declaration of Independence"]', label: 'Category: Declaration',        action: 'click', prereq: 'openDrawerGrid' },
+  { sel: '#catChips .chip[data-c="Politics"]',         label: 'Category: Politics',                      action: 'click', prereq: 'openDrawerGrid' },
+  { sel: '#catChips .chip[data-c="Artists"]',          label: 'Category: Artists',                       action: 'click', prereq: 'openDrawerGrid' },
+  { sel: '#catChips .chip[data-c="Authors"]',          label: 'Category: Authors',                       action: 'click', prereq: 'openDrawerGrid' },
+  { sel: '#catChips .chip[data-c="All"]',              label: 'Category: back to All',                   action: 'click', prereq: 'openDrawerGrid' },
+  // LAYOUT CHIPS
+  { sel: '#layoutChips .chip[data-l="gallery"]',       label: 'Layout: Gallery',                         action: 'click', prereq: 'openDrawerGrid' },
+  { sel: '#layoutChips .chip[data-l="float"]',         label: 'Layout: Float',                           action: 'click', prereq: 'openDrawerGrid' },
+  { sel: '#layoutChips .chip[data-l="plaque"]',        label: 'Layout: Plaque',                          action: 'click', prereq: 'openDrawerGrid' },
+  { sel: '#layoutChips .chip[data-l="ledger"]',        label: 'Layout: Ledger',                          action: 'click', prereq: 'openDrawerGrid' },
+  { sel: '#layoutChips .chip[data-l="vitrine"]',       label: 'Layout: Vitrine',                         action: 'click', prereq: 'openDrawerGrid' },
+  { sel: '#layoutChips .chip[data-l="wall"]',          label: 'Layout: Wall',                            action: 'click', prereq: 'openDrawerGrid' },
+  { sel: '#layoutChips .chip[data-l="gallery"]',       label: 'Layout: back to Gallery',                 action: 'click', prereq: 'openDrawerGrid' },
+  // SECTION HEAD BUTTON
+  { sel: '#filtersHint',                               label: '☰ Categories/sort/views button',          action: 'click' },
+  // ESCAPE to close drawer
+  { sel: null,                                         label: 'Escape key closes drawer',                action: 'escape', prereq: 'openDrawerGrid' },
+  // CARD → ARTIST POPUP
+  { sel: '.info-chip',                                 label: 'First card Details chip → open popup',    action: 'click-details' },
+  { sel: '.ap-x',                                      label: 'Artist popup × close',                    action: 'click' },
+  { sel: '.info-chip',                                 label: 'Re-open artist popup (backdrop close)',    action: 'click-details' },
+  { sel: '.ap-back',                                   label: 'Artist popup backdrop close',             action: 'click' },
+  { sel: '.info-chip',                                 label: 'Re-open artist popup (escape close)',      action: 'click-details' },
+  { sel: null,                                         label: 'Escape key closes artist popup',          action: 'escape' },
+  // COLLAGES TAB (last, standalone)
+  { sel: '.drawer .tab[data-v="collages"]',            label: 'Collages tab: switch + check',            action: 'click', prereq: 'openDrawer' },
+  { sel: '.drawer .tab[data-v="grid"]',                label: 'Collages → Grid: switch back',            action: 'click', prereq: 'openDrawer' },
+];
+
+// ── Per-element action executor ──
+async function doAction(page, el, errs, run) {
+  const { sel, label, action, value, prereq } = el;
+  const ts = new Date().toISOString();
+  let ok = false;
+  let effect = '';
+  const capturedErrs = errs.splice(0);
+
+  try {
+    // Handle prereqs
+    if (prereq === 'openDrawer') await ensureDrawerOpen(page);
+    if (prereq === 'openDrawerGrid') {
+      await ensureDrawerOpen(page);
+      // Ensure we're on grid tab (controls visible)
+      const onGrid = await page.evaluate(() => {
+        const controls = document.querySelector('#controls');
+        return controls && getComputedStyle(controls).display !== 'none';
+      });
+      if (!onGrid) {
+        const gridTab = page.locator('.drawer .tab[data-v="grid"]').first();
+        await gridTab.click({ timeout: 2000 });
+        await page.waitForTimeout(200);
+      }
+    }
+
+    if (action === 'nav-check') {
+      const loc = page.locator(sel).first();
+      const count = await loc.count();
+      const href = count > 0 ? await loc.getAttribute('href') : null;
+      const text = count > 0 ? (await loc.textContent())?.trim() : null;
+      effect = `exists:${count>0}, href:${href}, text:${text}`;
+      ok = count > 0;
+    } else if (action === 'anchor-click') {
+      // Scroll to anchor without navigating away
+      const loc = page.locator(sel).first();
+      const count = await loc.count();
+      if (!count) { effect = 'element not found'; return; }
+      await loc.scrollIntoViewIfNeeded({ timeout: 2000 }).catch(() => {});
+      await loc.click({ timeout: 3000 });
+      await page.waitForTimeout(500);
+      const scrollY = await page.evaluate(() => window.scrollY);
+      effect = `scrollY after: ${scrollY}`;
+      ok = scrollY > 0;
+    } else if (action === 'type') {
+      const loc = page.locator(sel).first();
+      await loc.fill(value);
+      await page.waitForTimeout(350);
+      const cardCount = await page.evaluate(() => document.querySelectorAll('.card').length);
+      const emptyHidden = await page.evaluate(() => document.querySelector('#empty')?.hidden);
+      effect = `typed "${value}"; cards:${cardCount}, empty hidden:${emptyHidden}`;
+      ok = true;
+    } else if (action === 'clear') {
+      const loc = page.locator(sel).first();
+      await loc.fill('');
+      await page.waitForTimeout(300);
+      const cardCount = await page.evaluate(() => document.querySelectorAll('.card').length);
+      effect = `cleared; cards:${cardCount}`;
+      ok = true;
+    } else if (action === 'select') {
+      const loc = page.locator(sel).first();
+      const vis = await loc.isVisible({ timeout: 2000 }).catch(() => false);
+      if (!vis) { effect = `select not visible (controls hidden?)`; ok = false; return; }
+      await loc.selectOption(value, { timeout: 3000 });
+      await page.waitForTimeout(300);
+      const cardCount = await page.evaluate(() => document.querySelectorAll('.card').length);
+      effect = `selected ${value}; cards:${cardCount}`;
+      ok = true;
+    } else if (action === 'range') {
+      const loc = page.locator(sel).first();
+      const vis = await loc.isVisible({ timeout: 2000 }).catch(() => false);
+      if (!vis) { effect = `slider not visible`; ok = false; return; }
+      await loc.fill(String(value));
+      await loc.dispatchEvent('input');
+      await page.waitForTimeout(200);
+      const cols = await page.evaluate(() => getComputedStyle(document.documentElement).getPropertyValue('--cols').trim());
+      effect = `set to ${value}; --cols:${cols}`;
+      ok = cols.trim() === String(value);
+    } else if (action === 'click') {
+      if (!sel) { ok = true; effect = 'no-op'; return; }
+      const loc = page.locator(sel).first();
+      const count = await loc.count();
+      if (!count) { effect = 'element not found'; ok = false; return; }
+      await safeScrollIntoView(page, loc);
+      const beforeState = await page.evaluate(() => ({
+        drawerOpen: document.querySelector('#drawer')?.classList.contains('open'),
+        popOpen: !document.querySelector('#artistPop')?.hidden,
+        url: location.href,
+        cards: document.querySelectorAll('.card').length,
+        bodyLayout: document.body.dataset.layout,
+        colsVisible: document.querySelector('#collagesView') && !document.querySelector('#collagesView').hidden,
+      }));
+      await loc.click({ timeout: 3000 });
+      await page.waitForTimeout(400);
+      const afterState = await page.evaluate(() => ({
+        drawerOpen: document.querySelector('#drawer')?.classList.contains('open'),
+        popOpen: !document.querySelector('#artistPop')?.hidden,
+        url: location.href,
+        cards: document.querySelectorAll('.card').length,
+        bodyLayout: document.body.dataset.layout,
+        colsVisible: document.querySelector('#collagesView') && !document.querySelector('#collagesView').hidden,
+      }));
+      effect = JSON.stringify({ before: beforeState, after: afterState });
+      ok = true;
+    } else if (action === 'escape') {
+      if (prereq === 'openDrawerGrid') {
+        await ensureDrawerOpen(page);
+      }
+      await page.keyboard.press('Escape');
+      await page.waitForTimeout(350);
+      const drawerOpen = await page.evaluate(() => document.querySelector('#drawer')?.classList.contains('open'));
+      const popOpen = await page.evaluate(() => !document.querySelector('#artistPop')?.hidden);
+      effect = `drawerOpen:${drawerOpen}, popOpen:${popOpen}`;
+      ok = !drawerOpen && !popOpen;
+    } else if (action === 'click-details') {
+      await hoverAndClickFirstInfoChip(page);
+      const popOpen = await page.evaluate(() => !document.querySelector('#artistPop')?.hidden);
+      const popName = await page.evaluate(() => document.querySelector('.ap-name')?.textContent?.trim());
+      effect = `popOpen:${popOpen}, artist:${popName}`;
+      ok = popOpen;
+    }
+  } catch (err) {
+    effect = `ERROR: ${err.message?.slice(0, 200)}`;
+    capturedErrs.push(`${err.message?.slice(0, 300)}`);
+    ok = false;
+  }
+
+  const newErrs = errs.splice(0);
+  const allErrs = [...capturedErrs, ...newErrs];
+  append({ run, ts, selector: sel, label, action, value: value !== undefined ? String(value) : undefined, ok, effect, errors: allErrs });
+  console.log(`  [run${run}] ${ok ? 'OK  ' : 'FAIL'} | ${label.slice(0, 55).padEnd(55)} | ${effect.slice(0, 70)}`);
+}
+
+// ── Main: 5 runs ──
+for (let run = 0; run < 5; run++) {
+  console.log(`\n${'='.repeat(60)}\nRUN ${run}: ${ORDERED_ELS_RUN_DESCRIPTIONS[run]}\n${'='.repeat(60)}`);
+  const runDir = `${RECDIR}/run${run}`;
+  fs.mkdirSync(runDir, { recursive: true });
+
+  const browser = await chromium.launch({ headless: true });
+  const ctx = await browser.newContext({
+    viewport: { width: 1600, height: 900 },
+    recordVideo: { dir: runDir, size: { width: 1600, height: 900 } },
+  });
+  const page = await ctx.newPage();
+
+  const errs = [];
+  page.on('console', msg => {
+    if (msg.type() === 'error') {
+      const t = msg.text();
+      if (!t.includes('favicon') && !t.includes('gtag') && !t.includes('ERR_NAME_NOT_RESOLVED')) {
+        errs.push(`console.error: ${t.slice(0, 300)}`);
+      }
+    }
+  });
+  page.on('pageerror', e => errs.push(`pageerror: ${String(e).slice(0, 300)}`));
+  const notFounds = [];
+  page.on('response', resp => { if (resp.status() === 404) notFounds.push(`404: ${resp.url()}`); });
+
+  // Load page
+  try {
+    await page.goto(URL, { waitUntil: 'domcontentloaded', timeout: 15000 });
+    await waitForData(page);
+    console.log(`  Page loaded OK`);
+  } catch (err) {
+    append({ run, ts: new Date().toISOString(), selector: null, label: 'PAGE LOAD', action: 'navigate', ok: false, effect: err.message, errors: [err.message] });
+    await ctx.close(); await browser.close(); continue;
+  }
+
+  const initErrs = errs.splice(0);
+  if (initErrs.length) {
+    append({ run, ts: new Date().toISOString(), selector: null, label: 'PAGE LOAD ERRORS', action: 'load', ok: false, effect: 'errors on load', errors: initErrs });
+    console.log(`  Load errors: ${initErrs.slice(0,2).join(' | ')}`);
+  }
+
+  // API checks
+  const apiRes = await page.evaluate(async () => {
+    try { const r = await fetch('/api/signatures'); const d = await r.json(); return { ok: r.ok, count: Array.isArray(d)?d.length:'n/a', status: r.status }; }
+    catch(e) { return { ok: false, error: String(e) }; }
+  });
+  append({ run, ts: new Date().toISOString(), selector: '/api/signatures', label: 'API: /api/signatures', action: 'fetch', ok: apiRes.ok, effect: JSON.stringify(apiRes), errors: [] });
+  console.log(`  /api/signatures: ${JSON.stringify(apiRes)}`);
+
+  const evoRes = await page.evaluate(async () => {
+    try { const r = await fetch('/api/signature-evolution'); const d = await r.json(); return { ok: r.ok, keys: Object.keys(d||{}).length, status: r.status }; }
+    catch(e) { return { ok: false, error: String(e) }; }
+  });
+  append({ run, ts: new Date().toISOString(), selector: '/api/signature-evolution', label: 'API: /api/signature-evolution', action: 'fetch', ok: evoRes.ok, effect: JSON.stringify(evoRes), errors: [] });
+  console.log(`  /api/signature-evolution: ${JSON.stringify(evoRes)}`);
+
+  // ── Layout sweep (all 6 views) ──
+  await page.click('#burger');
+  await page.waitForTimeout(300);
+  for (const [k, name] of [['gallery','Gallery'],['float','Float'],['plaque','Plaque'],['ledger','Ledger'],['vitrine','Vitrine'],['wall','Wall']]) {
+    const chipSel = `#layoutChips .chip[data-l="${k}"]`;
+    try {
+      const chip = page.locator(chipSel).first();
+      await safeScrollIntoView(page, chip);
+      await chip.click({ timeout: 2000 });
+      await page.waitForTimeout(250);
+      const bodyLayout = await page.evaluate(() => document.body.dataset.layout);
+      const cards = await page.evaluate(() => document.querySelectorAll('.card').length);
+      const chipErrs = errs.splice(0);
+      append({ run, ts: new Date().toISOString(), selector: chipSel, label: `Layout: ${name}`, action: 'click', ok: bodyLayout === k, effect: `body[data-layout]=${bodyLayout}, cards=${cards}`, errors: chipErrs });
+      console.log(`  Layout ${name}: body[data-layout]=${bodyLayout}, cards=${cards} — ${bodyLayout===k ? 'OK' : 'FAIL'}`);
+    } catch(err) {
+      append({ run, ts: new Date().toISOString(), selector: chipSel, label: `Layout: ${name}`, action: 'click', ok: false, effect: `ERROR: ${err.message?.slice(0,100)}`, errors: [err.message] });
+      console.log(`  Layout ${name}: ERROR ${err.message?.slice(0,60)}`);
+    }
+  }
+  // Reset layout + close drawer
+  await page.locator('#layoutChips .chip[data-l="gallery"]').first().click().catch(() => {});
+  await page.waitForTimeout(200);
+  await page.click('#drawerX').catch(() => {});
+  await page.waitForTimeout(300);
+
+  // ── Per-element ordered pass ──
+  const ordered = orderFor(run, STATIC_ELEMENTS);
+  console.log(`  Running ${ordered.length} element actions (order: ${ORDERED_ELS_RUN_DESCRIPTIONS[run]})...`);
+  for (const el of ordered) {
+    await doAction(page, el, errs, run);
+  }
+
+  // ── Deep popup test (beyond element list) ──
+  try {
+    await ensureDrawerClosed(page);
+    await page.evaluate(() => { const c = document.querySelector('#catChips .chip[data-c="All"]'); if(c) c.click(); });
+    await page.waitForTimeout(300);
+    await hoverAndClickFirstInfoChip(page);
+    await page.waitForTimeout(1200);
+    const popOpen = await page.evaluate(() => !document.querySelector('#artistPop')?.hidden);
+    const artistName = await page.evaluate(() => document.querySelector('.ap-name')?.textContent?.trim());
+    const ctaHref = await page.evaluate(() => document.querySelector('.ap-cta a')?.getAttribute('href'));
+    const sigSrc = await page.evaluate(() => document.querySelector('.ap-sig img')?.src);
+    const sigNaturalW = await page.evaluate(() => document.querySelector('.ap-sig img')?.naturalWidth || 0);
+    const life = await page.evaluate(() => document.querySelector('.ap-life')?.textContent?.trim());
+    const hasTags = await page.evaluate(() => document.querySelectorAll('#apBody .tag').length);
+    const hasBadge = await page.evaluate(() => document.querySelectorAll('#apBody .badge').length);
+    const hasEvo = await page.evaluate(() => document.querySelector('.evo-strip') !== null);
+    const hasMuralCta = await page.evaluate(() => !!document.querySelector('.ap-cta a'));
+    const popErrs = errs.splice(0);
+    append({ run, ts: new Date().toISOString(), selector: '#artistPop', label: 'Popup deep: structure check', action: 'inspect', ok: popOpen && hasMuralCta, effect: JSON.stringify({ popOpen, artistName, ctaHref, sigNaturalW, life, hasTags, hasBadge, hasEvo, hasMuralCta }), errors: popErrs });
+    console.log(`  Popup: open=${popOpen}, artist=${artistName}, cta=${ctaHref}, sig-loaded=${sigNaturalW>0}, evo=${hasEvo}`);
+
+    // Check signature image actually loads
+    const sigOk = await page.evaluate(async (src) => {
+      try { const r = await fetch(src); return r.ok && r.headers.get('content-type')?.startsWith('image'); } catch { return false; }
+    }, sigSrc);
+    append({ run, ts: new Date().toISOString(), selector: '.ap-sig img', label: 'Popup sig img: HTTP check', action: 'check-img', ok: !!sigOk, effect: `src=${sigSrc?.slice(0,80)}, ok=${sigOk}`, errors: [] });
+    console.log(`  Popup sig img OK: ${sigOk}, src: ${sigSrc?.slice(0,60)}`);
+
+    // Wait for works
+    await page.waitForTimeout(4000);
+    const worksCount = await page.evaluate(() => document.querySelectorAll('#apWorks a').length);
+    const worksText = await page.evaluate(() => document.querySelector('#apWorks')?.textContent?.slice(0, 150).trim());
+    const worksImgBroken = await page.evaluate(() => {
+      return Array.from(document.querySelectorAll('#apWorks img')).filter(i => i.naturalWidth === 0 && i.complete).length;
+    });
+    append({ run, ts: new Date().toISOString(), selector: '#apWorks', label: 'Popup works: loaded after 4s', action: 'check-works', ok: worksCount > 0 || (worksText||'').includes('no openly'), effect: `works:${worksCount}, brokenImgs:${worksImgBroken}, text:${worksText?.slice(0,100)}`, errors: errs.splice(0) });
+    console.log(`  Works: ${worksCount} tiles, ${worksImgBroken} broken imgs, text: ${worksText?.slice(0,60)}`);
+
+    // Wikidata link present
+    const wikiHref = await page.evaluate(() => document.querySelector('#apBody a[href*="wikidata"]')?.href);
+    const sourceHref = await page.evaluate(() => document.querySelector('#apBody a[href*="backup_source"], #apBody .ap-sub a:last-child')?.href);
+    append({ run, ts: new Date().toISOString(), selector: '#apBody a[href*="wikidata"]', label: 'Popup: Wikidata link', action: 'check-link', ok: !!wikiHref, effect: `href:${wikiHref}`, errors: [] });
+    console.log(`  Wikidata link: ${wikiHref?.slice(0,60)}`);
+
+    // Close via ×
+    await page.click('.ap-x');
+    await page.waitForTimeout(300);
+    const closed = await page.evaluate(() => document.querySelector('#artistPop')?.hidden);
+    append({ run, ts: new Date().toISOString(), selector: '.ap-x', label: 'Popup × close (deep test)', action: 'click', ok: closed, effect: `hidden:${closed}`, errors: errs.splice(0) });
+    console.log(`  Popup closed: ${closed}`);
+  } catch(err) {
+    append({ run, ts: new Date().toISOString(), selector: '#artistPop', label: 'Popup deep test', action: 'deep', ok: false, effect: `ERROR: ${err.message?.slice(0,200)}`, errors: [err.message] });
+    console.log(`  Popup deep test ERROR: ${err.message?.slice(0,100)}`);
+  }
+
+  // ── Collages content check ──
+  try {
+    await ensureDrawerOpen(page);
+    await page.locator('.drawer .tab[data-v="collages"]').first().click({ timeout: 2000 });
+    await page.waitForTimeout(600);
+    const collageCount = await page.evaluate(() => document.querySelectorAll('.collage').length);
+    const collageImgs = await page.evaluate(() => document.querySelectorAll('.collage img').length);
+    const collageNotes = await page.evaluate(() => document.querySelectorAll('.collage .note').length);
+    const downloadLinks = await page.evaluate(() => Array.from(document.querySelectorAll('.collage a[download]')).map(a=>a.getAttribute('href')));
+    // Check which collages have "not built yet" errors
+    const notBuilt = await page.evaluate(() =>
+      Array.from(document.querySelectorAll('.collage .c')).filter(c=>c.textContent.includes('not built yet')).map(c=>c.closest('.collage')?.querySelector('b')?.textContent)
+    );
+    const colErrs = errs.splice(0);
+    append({ run, ts: new Date().toISOString(), selector: '#collagesView', label: 'Collages: content', action: 'check', ok: collageCount > 0, effect: JSON.stringify({ collageCount, collageImgs, collageNotes, downloadLinks, notBuilt }), errors: colErrs });
+    console.log(`  Collages: ${collageCount} items, ${collageImgs} imgs, ${collageNotes} notes, ${downloadLinks.length} download links`);
+    if (notBuilt.length) console.log(`  Collages not built yet: ${notBuilt.join(', ')}`);
+    await page.locator('.drawer .tab[data-v="grid"]').first().click({ timeout: 2000 }).catch(() => {});
+    await page.waitForTimeout(200);
+    await page.click('#drawerX').catch(() => {});
+    await page.waitForTimeout(200);
+  } catch(err) {
+    append({ run, ts: new Date().toISOString(), selector: '#collagesView', label: 'Collages content check', action: 'check', ok: false, effect: `ERROR: ${err.message?.slice(0,150)}`, errors: [err.message] });
+    console.log(`  Collages ERROR: ${err.message?.slice(0,80)}`);
+  }
+
+  // ── 404s & final errors ──
+  if (notFounds.length) {
+    append({ run, ts: new Date().toISOString(), selector: null, label: '404 responses', action: 'network', ok: false, effect: notFounds.join(' | ').slice(0,500), errors: notFounds });
+    console.log(`  404s (${notFounds.length}): ${notFounds.slice(0,3).join(' | ')}`);
+  }
+  const finalErrs = errs.splice(0);
+  if (finalErrs.length) {
+    append({ run, ts: new Date().toISOString(), selector: null, label: 'End-of-run errors', action: 'end', ok: false, effect: 'residual', errors: finalErrs });
+  }
+
+  await page.waitForTimeout(400);
+  await ctx.close();
+  await browser.close();
+
+  // Convert .webm → .mp4
+  const webms = fs.existsSync(runDir) ? fs.readdirSync(runDir).filter(f => f.endsWith('.webm')) : [];
+  for (const w of webms) {
+    const inF = `${runDir}/${w}`, outF = `${runDir}/${w.replace('.webm','.mp4')}`;
+    try {
+      execSync(`ffmpeg -y -i "${inF}" -c:v libx264 -preset fast -crf 22 "${outF}" 2>/dev/null`);
+      fs.unlinkSync(inF);
+      console.log(`  Converted ${w} → .mp4`);
+    } catch(e) { console.log(`  ffmpeg failed for ${w} (leaving .webm)`); }
+  }
+  console.log(`  Run ${run} done.`);
+}
+
+console.log(`\nAll 5 runs complete. Log: ${LOG}`);
+
+// ── Generate DEBUG-REPORT.md ──
+const allEntries = fs.readFileSync(LOG, 'utf8').trim().split('\n').filter(Boolean)
+  .map(l => { try { return JSON.parse(l); } catch { return null; } }).filter(Boolean);
+
+// Only this session's 5 runs (runs 0-4, last batch)
+// Take the last batch: find the last run=0 and go from there
+let batchStart = 0;
+for (let i = allEntries.length - 1; i >= 0; i--) {
+  if (allEntries[i].run === 0) { batchStart = i; break; }
+}
+const entries = allEntries.slice(batchStart);
+const errEntries = entries.filter(e => e.errors && e.errors.length > 0);
+const failEntries = entries.filter(e => !e.ok);
+
+// Group errors by selector
+const bySelector = {};
+for (const e of errEntries) {
+  const k = e.selector || '(page-level)';
+  if (!bySelector[k]) bySelector[k] = [];
+  bySelector[k].push(e);
+}
+
+// Order-dependent: fail in some run, ok in another
+const byKey = {};
+for (const e of entries) {
+  const k = `${e.selector}|||${e.label}`;
+  if (!byKey[k]) byKey[k] = [];
+  byKey[k].push(e);
+}
+const orderDependent = Object.entries(byKey).filter(([, arr]) => arr.some(e => e.ok) && arr.some(e => !e.ok) && arr.some(e => e.errors?.length > 0));
+
+// Recordings
+const recPaths = [];
+for (let r = 0; r < 5; r++) {
+  const rd = `${RECDIR}/run${r}`;
+  if (fs.existsSync(rd)) {
+    const files = fs.readdirSync(rd).filter(f => f.endsWith('.mp4') || f.endsWith('.webm'));
+    recPaths.push(`Run ${r} (${ORDERED_ELS_RUN_DESCRIPTIONS[r]}): ${files.map(f=>`${rd}/${f}`).join(', ') || 'no file'}`);
+  }
+}
+
+// Highest-leverage fix = selector with most errors
+const topErr = Object.entries(bySelector).sort(([,a],[,b]) => b.length - a.length)[0];
+
+const reportContent = `# Celebrity Signatures — Screen Record Debug Report
+Generated: ${new Date().toISOString()}
+5 runs × distinct click-order combinations
+API: ${JSON.stringify((entries.find(e=>e.selector==='/api/signatures')||{}).effect)}
+
+## HIGHEST-LEVERAGE FIX
+${topErr
+  ? `**\`${topErr[0]}\`** — ${topErr[1].length} error(s) across runs\n${topErr[1].map(e=>`- Run${e.run} | ${e.label}: ${e.errors.join('; ').slice(0,200)}`).join('\n')}`
+  : '**No selector-level errors found.**\n\nSee page-level / 404 section for issues.'}
+
+## Per-Run Recordings
+${recPaths.join('\n')}
+
+## Console Errors & Pageerrors (by selector)
+${Object.keys(bySelector).length === 0 ? '_None_' :
+  Object.entries(bySelector).map(([sel, arr]) =>
+    `### \`${sel}\`\n${arr.map(e => `- Run${e.run} | **${e.label}** | ${e.errors.join(' | ').slice(0,300)}`).join('\n')}`
+  ).join('\n\n')}
+
+## Failed Actions (ok=false)
+${failEntries.length === 0 ? '_None_' :
+  failEntries.map(e => `- Run${e.run} | \`${e.selector||'n/a'}\` | ${e.label} | ${(e.effect||'').slice(0,150)}`).join('\n')}
+
+## Order-Dependent Failures
+_Selectors that fail in some run orderings but succeed in others:_
+${orderDependent.length === 0 ? '_None detected_' :
+  orderDependent.map(([key, arr]) => {
+    const [sel, lab] = key.split('|||');
+    return `### ${lab} (\`${sel}\`)\n${arr.map(e=>`- Run${e.run}: ok=${e.ok}${e.errors?.length?', ERRORS: '+e.errors.join('; ').slice(0,200):''}`).join('\n')}`;
+  }).join('\n\n')}
+
+## Network 404s
+${entries.filter(e=>e.label==='404 responses').map(e=>`- Run${e.run}: ${e.effect.slice(0,400)}`).join('\n') || '_None_'}
+
+## Summary
+| Metric | Value |
+|---|---|
+| Total actions | ${entries.length} |
+| OK | ${entries.filter(e=>e.ok).length} |
+| Failed | ${failEntries.length} |
+| With errors | ${errEntries.length} |
+| Selectors with errors | ${Object.keys(bySelector).length} |
+| Order-dependent | ${orderDependent.length} |
+`;
+
+fs.writeFileSync(`${ROOT}/screenrecord/DEBUG-REPORT.md`, reportContent);
+console.log(`DEBUG-REPORT.md written to ${ROOT}/screenrecord/DEBUG-REPORT.md`);

← 92e20cb ⚡ Lightning Round (6th game): a real museum painting flashes  ·  back to CelebritySignatures  ·  Celeb Signatures: slow 16s ease-in-out float on hero logo (p b10be7b →