← back to Marketing Command Center
prove every Quick Post control across browsers
d5e756d1e74a94ef75d346d7a33ba49ebf5f6c4c · 2026-08-30 09:30:28 -0700 · Steve Abrams
Files touched
M cta/CTA-REPORT.mdM screenrecord/quickpost/DEBUG-REPORT.mdM screenrecord/quickpost/debug-log.jsonlM scripts/cta-quickpost.jsM scripts/quickpost-test-lib.jsA scripts/screenrecord-quickpost.jsM verification/e2e-proof.json
Diff
commit d5e756d1e74a94ef75d346d7a33ba49ebf5f6c4c
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Sun Aug 30 09:30:28 2026 -0700
prove every Quick Post control across browsers
---
cta/CTA-REPORT.md | 36 +++-
screenrecord/quickpost/DEBUG-REPORT.md | 17 +-
screenrecord/quickpost/debug-log.jsonl | 301 +++++++++++++++++++++++++++++++++
scripts/cta-quickpost.js | 17 ++
scripts/quickpost-test-lib.js | 4 +-
scripts/screenrecord-quickpost.js | 151 +++++++++++++++++
verification/e2e-proof.json | 8 +-
7 files changed, 518 insertions(+), 16 deletions(-)
diff --git a/cta/CTA-REPORT.md b/cta/CTA-REPORT.md
index a926405..fd3e0cb 100644
--- a/cta/CTA-REPORT.md
+++ b/cta/CTA-REPORT.md
@@ -1,52 +1,82 @@
# CTA Report — Kid-friendly Quick Post
-**Verdict:** PASS — 36/36 component-engine checks clean.
+**Verdict:** PASS — 66/66 component-engine checks clean.
**Safety:** Copy generation and publish endpoints were browser-intercepted. No social post, draft write, email, or paid generation occurred.
## Browser coverage
-- Chrome/Chromium recording: /Users/macstudio3/Projects/marketing-command-center/cta/rec/chrome/page@739562e661da4907648699a2f24b2e69.webm
-- Safari/WebKit recording: /Users/macstudio3/Projects/marketing-command-center/cta/rec/safari/page@1fba19f29feeec101ae10cb9499f401e.webm
+- Chrome/Chromium recording: /Users/macstudio3/Projects/marketing-command-center/cta/rec/chrome/page@8ba4519573f0c023284a9ea81a9c0aa7.webm
+- Safari/WebKit recording: /Users/macstudio3/Projects/marketing-command-center/cta/rec/safari/page@8e8606ef327a6b3f1cb8607227552e4e.webm
- Browserbase: skipped by design because the target is localhost and Browserbase cannot reach the Mac-local service.
## Components
| Browser | Component | Rendered | Worked | Errors |
|---|---|---:|---:|---|
+| chrome | All ideas filter | ✓ | ✓ | — |
+| chrome | DW picks filter | ✓ | ✓ | — |
+| chrome | My uploads filter | ✓ | ✓ | — |
+| chrome | Picture search | ✓ | ✓ | — |
| chrome | Picture asset | ✓ | ✓ | — |
| chrome | Paste-link details | ✓ | ✓ | — |
| chrome | Step Music | ✓ | ✓ | — |
+| chrome | Picture step tab | ✓ | ✓ | — |
+| chrome | Return to Music | ✓ | ✓ | — |
| chrome | Music choice | ✓ | ✓ | — |
| chrome | Back button | ✓ | ✓ | — |
| chrome | Next button | ✓ | ✓ | — |
| chrome | Step Words | ✓ | ✓ | — |
| chrome | Generate suggestions | ✓ | ✓ | — |
| chrome | Choose suggestion | ✓ | ✓ | — |
+| chrome | Edit final words | ✓ | ✓ | — |
+| chrome | Music step tab | ✓ | ✓ | — |
+| chrome | Return to Words | ✓ | ✓ | — |
| chrome | Step Where | ✓ | ✓ | — |
| chrome | Choose all accounts | ✓ | ✓ | — |
| chrome | Clear accounts | ✓ | ✓ | — |
| chrome | Single social account | ✓ | ✓ | — |
| chrome | Instagram account menu | ✓ | ✓ | — |
+| chrome | Words step tab | ✓ | ✓ | — |
+| chrome | Return to Where | ✓ | ✓ | — |
| chrome | Step Check | ✓ | ✓ | — |
+| chrome | Where step tab | ✓ | ✓ | — |
+| chrome | Return to Check | ✓ | ✓ | — |
+| chrome | Check step tab | ✓ | ✓ | — |
+| chrome | Review picture rendered | ✓ | ✓ | — |
| chrome | Confirm checkbox | ✓ | ✓ | — |
| chrome | Post now mocked | ✓ | ✓ | — |
| chrome | Save drafts mocked | ✓ | ✓ | — |
+| safari | All ideas filter | ✓ | ✓ | — |
+| safari | DW picks filter | ✓ | ✓ | — |
+| safari | My uploads filter | ✓ | ✓ | — |
+| safari | Picture search | ✓ | ✓ | — |
| safari | Picture asset | ✓ | ✓ | — |
| safari | Paste-link details | ✓ | ✓ | — |
| safari | Step Music | ✓ | ✓ | — |
+| safari | Picture step tab | ✓ | ✓ | — |
+| safari | Return to Music | ✓ | ✓ | — |
| safari | Music choice | ✓ | ✓ | — |
| safari | Back button | ✓ | ✓ | — |
| safari | Next button | ✓ | ✓ | — |
| safari | Step Words | ✓ | ✓ | — |
| safari | Generate suggestions | ✓ | ✓ | — |
| safari | Choose suggestion | ✓ | ✓ | — |
+| safari | Edit final words | ✓ | ✓ | — |
+| safari | Music step tab | ✓ | ✓ | — |
+| safari | Return to Words | ✓ | ✓ | — |
| safari | Step Where | ✓ | ✓ | — |
| safari | Choose all accounts | ✓ | ✓ | — |
| safari | Clear accounts | ✓ | ✓ | — |
| safari | Single social account | ✓ | ✓ | — |
| safari | Instagram account menu | ✓ | ✓ | — |
+| safari | Words step tab | ✓ | ✓ | — |
+| safari | Return to Where | ✓ | ✓ | — |
| safari | Step Check | ✓ | ✓ | — |
+| safari | Where step tab | ✓ | ✓ | — |
+| safari | Return to Check | ✓ | ✓ | — |
+| safari | Check step tab | ✓ | ✓ | — |
+| safari | Review picture rendered | ✓ | ✓ | — |
| safari | Confirm checkbox | ✓ | ✓ | — |
| safari | Post now mocked | ✓ | ✓ | — |
| safari | Save drafts mocked | ✓ | ✓ | — |
diff --git a/screenrecord/quickpost/DEBUG-REPORT.md b/screenrecord/quickpost/DEBUG-REPORT.md
index ac28b9e..e43d43c 100644
--- a/screenrecord/quickpost/DEBUG-REPORT.md
+++ b/screenrecord/quickpost/DEBUG-REPORT.md
@@ -1,23 +1,24 @@
# Quick Post five-run screen-record report
-**Verdict:** PASS — 78/78 recorded actions clean across five distinct combinations.
+**Verdict:** PASS — 153/153 recorded actions clean across five distinct full-control combinations.
**Safety:** Copy generation, live publish, and draft endpoints were intercepted in the browser. No external post, draft write, email, deploy, or spend occurred.
## Recordings
-- Run 0 (combination-0): /Users/macstudio3/Projects/marketing-command-center/screenrecord/quickpost/rec/run0/page@05baf8ca79eaf1cdef777c417af06282.webm
-- Run 1 (combination-1): /Users/macstudio3/Projects/marketing-command-center/screenrecord/quickpost/rec/run1/page@b19f0fbdfc4fe8c5954671d13e5189e6.webm
-- Run 2 (combination-2): /Users/macstudio3/Projects/marketing-command-center/screenrecord/quickpost/rec/run2/page@b82b7b96c2027e6fa4d47b1150a419a9.webm
-- Run 3 (combination-3): /Users/macstudio3/Projects/marketing-command-center/screenrecord/quickpost/rec/run3/page@cdff33735891eb376b5c756381a052ae.webm
-- Run 4 (combination-4): /Users/macstudio3/Projects/marketing-command-center/screenrecord/quickpost/rec/run4/page@7dad03b8f10f9db7e3e98d87364aa4c2.webm
+- Run 0 (combination-0): /Users/macstudio3/Projects/marketing-command-center/screenrecord/quickpost/rec/run0/page@6fa57673e56f6fc95aa091a71bafd8d2.webm
+- Run 1 (combination-1): /Users/macstudio3/Projects/marketing-command-center/screenrecord/quickpost/rec/run1/page@fc4b65132116a942783153058bfc0c57.webm
+- Run 2 (combination-2): /Users/macstudio3/Projects/marketing-command-center/screenrecord/quickpost/rec/run2/page@ff4128b1082c5689aec1cc78efe7db06.webm
+- Run 3 (combination-3): /Users/macstudio3/Projects/marketing-command-center/screenrecord/quickpost/rec/run3/page@8ace230a880199ceeae6dec5b1ca50f3.webm
+- Run 4 (combination-4): /Users/macstudio3/Projects/marketing-command-center/screenrecord/quickpost/rec/run4/page@7b0f2861267a639f77f3969d13cb7d7c.webm
## Combination coverage
+- Every run: all three filters, search, paste-link control, picture choice, music, topic/suggestions, direct caption edit, all five step tabs, Back/Next, channel selectors, account menu, review action.
- Run 0: DOM-order happy path, asset picker, one account, mocked post.
-- Run 1: paste-link first, choose-all → clear → choose-all, mocked draft.
+- Run 1: reverse filter order, paste-link first, choose-all → clear → choose-all, mocked draft.
- Run 2: validation error first, asset picker, alternate suggestion, mocked post.
-- Run 3: paste-link first, Back/forward revisit, choose-all, mocked draft.
+- Run 3: reverse filter order, paste-link first, extra Back/forward revisit, mocked draft.
- Run 4: persisted prior failures first when present, asset path, mocked post.
## Failures and order-dependent issues
diff --git a/screenrecord/quickpost/debug-log.jsonl b/screenrecord/quickpost/debug-log.jsonl
index 1f09263..e84d65e 100644
--- a/screenrecord/quickpost/debug-log.jsonl
+++ b/screenrecord/quickpost/debug-log.jsonl
@@ -76,3 +76,304 @@
{"run":4,"ts":"2026-08-30T16:03:50.370Z","label":"confirm checkbox","ok":true,"effect":"expected state observed","errors":[]}
{"run":4,"ts":"2026-08-30T16:03:50.507Z","label":"post now mocked","ok":true,"effect":"expected state observed","errors":[]}
{"run":4,"ts":"2026-08-30T16:03:50.507Z","label":"run complete","ok":true,"effect":"combination-4","errors":[]}
+{"run":0,"ts":"2026-08-30T16:26:19.656Z","label":"filter all","ok":true,"effect":"expected state observed","errors":[]}
+{"run":0,"ts":"2026-08-30T16:26:19.833Z","label":"filter catalog","ok":true,"effect":"expected state observed","errors":[]}
+{"run":0,"ts":"2026-08-30T16:26:19.966Z","label":"filter upload","ok":true,"effect":"expected state observed","errors":[]}
+{"run":0,"ts":"2026-08-30T16:26:20.096Z","label":"picture search","ok":true,"effect":"expected state observed","errors":[]}
+{"run":0,"ts":"2026-08-30T16:26:20.279Z","label":"picture asset","ok":true,"effect":"expected state observed","errors":[]}
+{"run":0,"ts":"2026-08-30T16:26:20.437Z","label":"paste-link details","ok":true,"effect":"expected state observed","errors":[]}
+{"run":0,"ts":"2026-08-30T16:26:20.585Z","label":"next to music","ok":true,"effect":"expected state observed","errors":[]}
+{"run":0,"ts":"2026-08-30T16:26:20.721Z","label":"picture step tab","ok":true,"effect":"expected state observed","errors":[]}
+{"run":0,"ts":"2026-08-30T16:26:20.865Z","label":"step tab forward to music","ok":true,"effect":"expected state observed","errors":[]}
+{"run":0,"ts":"2026-08-30T16:26:21.006Z","label":"music choice","ok":true,"effect":"expected state observed","errors":[]}
+{"run":0,"ts":"2026-08-30T16:26:21.147Z","label":"next to words","ok":true,"effect":"expected state observed","errors":[]}
+{"run":0,"ts":"2026-08-30T16:26:21.272Z","label":"topic input","ok":true,"effect":"expected state observed","errors":[]}
+{"run":0,"ts":"2026-08-30T16:26:21.411Z","label":"generate suggestions","ok":true,"effect":"expected state observed","errors":[]}
+{"run":0,"ts":"2026-08-30T16:26:21.561Z","label":"choose suggestion","ok":true,"effect":"expected state observed","errors":[]}
+{"run":0,"ts":"2026-08-30T16:26:21.688Z","label":"edit final words","ok":true,"effect":"expected state observed","errors":[]}
+{"run":0,"ts":"2026-08-30T16:26:21.841Z","label":"music step tab","ok":true,"effect":"expected state observed","errors":[]}
+{"run":0,"ts":"2026-08-30T16:26:21.990Z","label":"step tab forward to words","ok":true,"effect":"expected state observed","errors":[]}
+{"run":0,"ts":"2026-08-30T16:26:22.152Z","label":"next to accounts","ok":true,"effect":"expected state observed","errors":[]}
+{"run":0,"ts":"2026-08-30T16:26:22.290Z","label":"single account","ok":true,"effect":"expected state observed","errors":[]}
+{"run":0,"ts":"2026-08-30T16:26:22.419Z","label":"account menu","ok":true,"effect":"expected state observed","errors":[]}
+{"run":0,"ts":"2026-08-30T16:26:22.556Z","label":"words step tab","ok":true,"effect":"expected state observed","errors":[]}
+{"run":0,"ts":"2026-08-30T16:26:22.701Z","label":"step tab forward to accounts","ok":true,"effect":"expected state observed","errors":[]}
+{"run":0,"ts":"2026-08-30T16:26:22.854Z","label":"next to check","ok":true,"effect":"expected state observed","errors":[]}
+{"run":0,"ts":"2026-08-30T16:26:23.010Z","label":"where step tab","ok":true,"effect":"expected state observed","errors":[]}
+{"run":0,"ts":"2026-08-30T16:26:23.150Z","label":"step tab forward to check","ok":true,"effect":"expected state observed","errors":[]}
+{"run":0,"ts":"2026-08-30T16:26:23.281Z","label":"check step tab","ok":true,"effect":"expected state observed","errors":[]}
+{"run":0,"ts":"2026-08-30T16:26:23.413Z","label":"confirm checkbox","ok":true,"effect":"expected state observed","errors":[]}
+{"run":0,"ts":"2026-08-30T16:26:23.551Z","label":"post now mocked","ok":true,"effect":"expected state observed","errors":[]}
+{"run":0,"ts":"2026-08-30T16:26:23.551Z","label":"run complete","ok":true,"effect":"combination-0","errors":[]}
+{"run":1,"ts":"2026-08-30T16:26:24.431Z","label":"paste-link details","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:26:24.588Z","label":"filter upload","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:26:24.734Z","label":"filter catalog","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:26:24.930Z","label":"filter all","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:26:25.078Z","label":"picture search","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:26:25.238Z","label":"paste picture link","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:26:25.396Z","label":"next to music","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:26:25.537Z","label":"picture step tab","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:26:25.677Z","label":"step tab forward to music","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:26:25.827Z","label":"music choice","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:26:25.971Z","label":"next to words","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:26:26.097Z","label":"topic input","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:26:26.240Z","label":"generate suggestions","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:26:26.396Z","label":"choose suggestion","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:26:26.523Z","label":"edit final words","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:26:26.663Z","label":"music step tab","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:26:26.800Z","label":"step tab forward to words","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:26:26.964Z","label":"next to accounts","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:26:27.100Z","label":"choose all accounts","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:26:27.240Z","label":"clear accounts","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:26:27.372Z","label":"choose all accounts final","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:26:27.498Z","label":"account menu","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:26:27.637Z","label":"words step tab","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:26:27.768Z","label":"step tab forward to accounts","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:26:27.904Z","label":"next to check","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:26:28.052Z","label":"where step tab","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:26:28.209Z","label":"step tab forward to check","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:26:28.345Z","label":"check step tab","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:26:28.495Z","label":"save drafts mocked","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:26:28.495Z","label":"run complete","ok":true,"effect":"combination-1","errors":[]}
+{"run":2,"ts":"2026-08-30T16:26:29.377Z","label":"picture validation","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:26:29.600Z","label":"filter all","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:26:29.849Z","label":"filter catalog","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:26:30.010Z","label":"filter upload","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:26:30.136Z","label":"picture search","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:26:30.303Z","label":"picture asset","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:26:30.433Z","label":"paste-link details","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:26:30.576Z","label":"next to music","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:26:30.717Z","label":"picture step tab","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:26:30.871Z","label":"step tab forward to music","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:26:31.004Z","label":"music choice","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:26:31.144Z","label":"next to words","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:26:31.270Z","label":"topic input","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:26:31.415Z","label":"generate suggestions","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:26:31.561Z","label":"choose suggestion","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:26:31.687Z","label":"edit final words","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:26:31.825Z","label":"music step tab","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:26:31.963Z","label":"step tab forward to words","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:26:32.103Z","label":"next to accounts","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:26:32.240Z","label":"single account","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:26:32.366Z","label":"account menu","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:26:32.504Z","label":"words step tab","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:26:32.639Z","label":"step tab forward to accounts","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:26:32.783Z","label":"next to check","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:26:32.931Z","label":"where step tab","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:26:33.085Z","label":"step tab forward to check","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:26:33.224Z","label":"check step tab","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:26:33.355Z","label":"confirm checkbox","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:26:33.487Z","label":"post now mocked","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:26:33.487Z","label":"run complete","ok":true,"effect":"combination-2","errors":[]}
+{"run":3,"ts":"2026-08-30T16:26:34.618Z","label":"paste-link details","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:26:34.758Z","label":"filter upload","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:26:34.900Z","label":"filter catalog","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:26:35.051Z","label":"filter all","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:26:35.176Z","label":"picture search","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:26:35.331Z","label":"paste picture link","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:26:35.475Z","label":"next to music","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:26:35.607Z","label":"picture step tab","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:26:35.750Z","label":"step tab forward to music","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:26:35.885Z","label":"music choice","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:26:36.025Z","label":"back button","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:26:36.168Z","label":"return to music","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:26:36.303Z","label":"next to words","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:26:36.429Z","label":"topic input","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:26:36.558Z","label":"generate suggestions","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:26:36.709Z","label":"choose suggestion","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:26:36.835Z","label":"edit final words","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:26:36.980Z","label":"music step tab","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:26:37.121Z","label":"step tab forward to words","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:26:37.281Z","label":"next to accounts","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:26:37.418Z","label":"choose all accounts final","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:26:37.543Z","label":"account menu","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:26:37.675Z","label":"words step tab","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:26:37.813Z","label":"step tab forward to accounts","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:26:37.951Z","label":"next to check","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:26:38.100Z","label":"where step tab","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:26:38.251Z","label":"step tab forward to check","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:26:38.386Z","label":"check step tab","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:26:38.518Z","label":"save drafts mocked","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:26:38.519Z","label":"run complete","ok":true,"effect":"combination-3","errors":[]}
+{"run":4,"ts":"2026-08-30T16:26:39.622Z","label":"filter all","ok":true,"effect":"expected state observed","errors":[]}
+{"run":4,"ts":"2026-08-30T16:26:39.780Z","label":"filter catalog","ok":true,"effect":"expected state observed","errors":[]}
+{"run":4,"ts":"2026-08-30T16:26:39.921Z","label":"filter upload","ok":true,"effect":"expected state observed","errors":[]}
+{"run":4,"ts":"2026-08-30T16:26:40.047Z","label":"picture search","ok":true,"effect":"expected state observed","errors":[]}
+{"run":4,"ts":"2026-08-30T16:26:40.219Z","label":"picture asset","ok":true,"effect":"expected state observed","errors":[]}
+{"run":4,"ts":"2026-08-30T16:26:40.356Z","label":"paste-link details","ok":true,"effect":"expected state observed","errors":[]}
+{"run":4,"ts":"2026-08-30T16:26:40.496Z","label":"next to music","ok":true,"effect":"expected state observed","errors":[]}
+{"run":4,"ts":"2026-08-30T16:26:40.634Z","label":"picture step tab","ok":true,"effect":"expected state observed","errors":[]}
+{"run":4,"ts":"2026-08-30T16:26:40.787Z","label":"step tab forward to music","ok":true,"effect":"expected state observed","errors":[]}
+{"run":4,"ts":"2026-08-30T16:26:40.925Z","label":"music choice","ok":true,"effect":"expected state observed","errors":[]}
+{"run":4,"ts":"2026-08-30T16:26:41.063Z","label":"next to words","ok":true,"effect":"expected state observed","errors":[]}
+{"run":4,"ts":"2026-08-30T16:26:41.188Z","label":"topic input","ok":true,"effect":"expected state observed","errors":[]}
+{"run":4,"ts":"2026-08-30T16:26:41.323Z","label":"generate suggestions","ok":true,"effect":"expected state observed","errors":[]}
+{"run":4,"ts":"2026-08-30T16:26:41.479Z","label":"choose suggestion","ok":true,"effect":"expected state observed","errors":[]}
+{"run":4,"ts":"2026-08-30T16:26:41.604Z","label":"edit final words","ok":true,"effect":"expected state observed","errors":[]}
+{"run":4,"ts":"2026-08-30T16:26:41.734Z","label":"music step tab","ok":true,"effect":"expected state observed","errors":[]}
+{"run":4,"ts":"2026-08-30T16:26:41.863Z","label":"step tab forward to words","ok":true,"effect":"expected state observed","errors":[]}
+{"run":4,"ts":"2026-08-30T16:26:42.026Z","label":"next to accounts","ok":true,"effect":"expected state observed","errors":[]}
+{"run":4,"ts":"2026-08-30T16:26:42.166Z","label":"single account","ok":true,"effect":"expected state observed","errors":[]}
+{"run":4,"ts":"2026-08-30T16:26:42.291Z","label":"account menu","ok":true,"effect":"expected state observed","errors":[]}
+{"run":4,"ts":"2026-08-30T16:26:42.425Z","label":"words step tab","ok":true,"effect":"expected state observed","errors":[]}
+{"run":4,"ts":"2026-08-30T16:26:42.568Z","label":"step tab forward to accounts","ok":true,"effect":"expected state observed","errors":[]}
+{"run":4,"ts":"2026-08-30T16:26:42.703Z","label":"next to check","ok":true,"effect":"expected state observed","errors":[]}
+{"run":4,"ts":"2026-08-30T16:26:42.851Z","label":"where step tab","ok":true,"effect":"expected state observed","errors":[]}
+{"run":4,"ts":"2026-08-30T16:26:42.976Z","label":"step tab forward to check","ok":true,"effect":"expected state observed","errors":[]}
+{"run":4,"ts":"2026-08-30T16:26:43.106Z","label":"check step tab","ok":true,"effect":"expected state observed","errors":[]}
+{"run":4,"ts":"2026-08-30T16:26:43.248Z","label":"confirm checkbox","ok":true,"effect":"expected state observed","errors":[]}
+{"run":4,"ts":"2026-08-30T16:26:43.394Z","label":"post now mocked","ok":true,"effect":"expected state observed","errors":[]}
+{"run":4,"ts":"2026-08-30T16:26:43.395Z","label":"run complete","ok":true,"effect":"combination-4","errors":[]}
+{"run":0,"ts":"2026-08-30T16:29:24.220Z","label":"filter all","ok":true,"effect":"expected state observed","errors":[]}
+{"run":0,"ts":"2026-08-30T16:29:24.384Z","label":"filter catalog","ok":true,"effect":"expected state observed","errors":[]}
+{"run":0,"ts":"2026-08-30T16:29:24.529Z","label":"filter upload","ok":true,"effect":"expected state observed","errors":[]}
+{"run":0,"ts":"2026-08-30T16:29:24.660Z","label":"picture search","ok":true,"effect":"expected state observed","errors":[]}
+{"run":0,"ts":"2026-08-30T16:29:24.841Z","label":"picture asset","ok":true,"effect":"expected state observed","errors":[]}
+{"run":0,"ts":"2026-08-30T16:29:24.979Z","label":"paste-link details","ok":true,"effect":"expected state observed","errors":[]}
+{"run":0,"ts":"2026-08-30T16:29:25.124Z","label":"next to music","ok":true,"effect":"expected state observed","errors":[]}
+{"run":0,"ts":"2026-08-30T16:29:25.264Z","label":"picture step tab","ok":true,"effect":"expected state observed","errors":[]}
+{"run":0,"ts":"2026-08-30T16:29:25.425Z","label":"step tab forward to music","ok":true,"effect":"expected state observed","errors":[]}
+{"run":0,"ts":"2026-08-30T16:29:25.560Z","label":"music choice","ok":true,"effect":"expected state observed","errors":[]}
+{"run":0,"ts":"2026-08-30T16:29:25.704Z","label":"next to words","ok":true,"effect":"expected state observed","errors":[]}
+{"run":0,"ts":"2026-08-30T16:29:25.830Z","label":"topic input","ok":true,"effect":"expected state observed","errors":[]}
+{"run":0,"ts":"2026-08-30T16:29:25.974Z","label":"generate suggestions","ok":true,"effect":"expected state observed","errors":[]}
+{"run":0,"ts":"2026-08-30T16:29:26.120Z","label":"choose suggestion","ok":true,"effect":"expected state observed","errors":[]}
+{"run":0,"ts":"2026-08-30T16:29:26.246Z","label":"edit final words","ok":true,"effect":"expected state observed","errors":[]}
+{"run":0,"ts":"2026-08-30T16:29:26.386Z","label":"music step tab","ok":true,"effect":"expected state observed","errors":[]}
+{"run":0,"ts":"2026-08-30T16:29:26.519Z","label":"step tab forward to words","ok":true,"effect":"expected state observed","errors":[]}
+{"run":0,"ts":"2026-08-30T16:29:26.673Z","label":"next to accounts","ok":true,"effect":"expected state observed","errors":[]}
+{"run":0,"ts":"2026-08-30T16:29:26.808Z","label":"single account","ok":true,"effect":"expected state observed","errors":[]}
+{"run":0,"ts":"2026-08-30T16:29:26.934Z","label":"account menu","ok":true,"effect":"expected state observed","errors":[]}
+{"run":0,"ts":"2026-08-30T16:29:27.075Z","label":"words step tab","ok":true,"effect":"expected state observed","errors":[]}
+{"run":0,"ts":"2026-08-30T16:29:27.230Z","label":"step tab forward to accounts","ok":true,"effect":"expected state observed","errors":[]}
+{"run":0,"ts":"2026-08-30T16:29:27.373Z","label":"next to check","ok":true,"effect":"expected state observed","errors":[]}
+{"run":0,"ts":"2026-08-30T16:29:27.520Z","label":"where step tab","ok":true,"effect":"expected state observed","errors":[]}
+{"run":0,"ts":"2026-08-30T16:29:27.660Z","label":"step tab forward to check","ok":true,"effect":"expected state observed","errors":[]}
+{"run":0,"ts":"2026-08-30T16:29:27.799Z","label":"check step tab","ok":true,"effect":"expected state observed","errors":[]}
+{"run":0,"ts":"2026-08-30T16:29:27.925Z","label":"review picture rendered","ok":true,"effect":"expected state observed","errors":[]}
+{"run":0,"ts":"2026-08-30T16:29:28.057Z","label":"confirm checkbox","ok":true,"effect":"expected state observed","errors":[]}
+{"run":0,"ts":"2026-08-30T16:29:28.201Z","label":"post now mocked","ok":true,"effect":"expected state observed","errors":[]}
+{"run":0,"ts":"2026-08-30T16:29:28.201Z","label":"run complete","ok":true,"effect":"combination-0","errors":[]}
+{"run":1,"ts":"2026-08-30T16:29:29.117Z","label":"paste-link details","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:29:29.358Z","label":"filter upload","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:29:29.498Z","label":"filter catalog","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:29:29.649Z","label":"filter all","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:29:29.775Z","label":"picture search","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:29:29.941Z","label":"paste picture link","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:29:30.092Z","label":"next to music","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:29:30.244Z","label":"picture step tab","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:29:30.389Z","label":"step tab forward to music","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:29:30.533Z","label":"music choice","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:29:30.674Z","label":"next to words","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:29:30.800Z","label":"topic input","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:29:30.942Z","label":"generate suggestions","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:29:31.086Z","label":"choose suggestion","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:29:31.211Z","label":"edit final words","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:29:31.343Z","label":"music step tab","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:29:31.475Z","label":"step tab forward to words","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:29:31.630Z","label":"next to accounts","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:29:31.768Z","label":"choose all accounts","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:29:31.908Z","label":"clear accounts","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:29:32.046Z","label":"choose all accounts final","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:29:32.172Z","label":"account menu","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:29:32.309Z","label":"words step tab","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:29:32.440Z","label":"step tab forward to accounts","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:29:32.574Z","label":"next to check","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:29:32.713Z","label":"where step tab","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:29:32.853Z","label":"step tab forward to check","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:29:32.989Z","label":"check step tab","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:29:33.115Z","label":"review picture rendered","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:29:33.254Z","label":"save drafts mocked","ok":true,"effect":"expected state observed","errors":[]}
+{"run":1,"ts":"2026-08-30T16:29:33.254Z","label":"run complete","ok":true,"effect":"combination-1","errors":[]}
+{"run":2,"ts":"2026-08-30T16:29:34.406Z","label":"picture validation","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:29:34.568Z","label":"filter all","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:29:34.709Z","label":"filter catalog","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:29:34.857Z","label":"filter upload","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:29:35.008Z","label":"picture search","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:29:35.185Z","label":"picture asset","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:29:35.323Z","label":"paste-link details","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:29:35.461Z","label":"next to music","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:29:35.590Z","label":"picture step tab","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:29:35.737Z","label":"step tab forward to music","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:29:35.871Z","label":"music choice","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:29:36.005Z","label":"next to words","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:29:36.129Z","label":"topic input","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:29:36.269Z","label":"generate suggestions","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:29:36.414Z","label":"choose suggestion","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:29:36.540Z","label":"edit final words","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:29:36.676Z","label":"music step tab","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:29:36.825Z","label":"step tab forward to words","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:29:36.980Z","label":"next to accounts","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:29:37.117Z","label":"single account","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:29:37.253Z","label":"account menu","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:29:37.391Z","label":"words step tab","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:29:37.532Z","label":"step tab forward to accounts","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:29:37.673Z","label":"next to check","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:29:37.825Z","label":"where step tab","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:29:37.978Z","label":"step tab forward to check","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:29:38.121Z","label":"check step tab","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:29:38.248Z","label":"review picture rendered","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:29:38.387Z","label":"confirm checkbox","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:29:38.525Z","label":"post now mocked","ok":true,"effect":"expected state observed","errors":[]}
+{"run":2,"ts":"2026-08-30T16:29:38.525Z","label":"run complete","ok":true,"effect":"combination-2","errors":[]}
+{"run":3,"ts":"2026-08-30T16:29:39.441Z","label":"paste-link details","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:29:39.582Z","label":"filter upload","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:29:39.717Z","label":"filter catalog","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:29:39.861Z","label":"filter all","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:29:39.986Z","label":"picture search","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:29:40.148Z","label":"paste picture link","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:29:40.287Z","label":"next to music","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:29:40.424Z","label":"picture step tab","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:29:40.570Z","label":"step tab forward to music","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:29:40.700Z","label":"music choice","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:29:40.833Z","label":"back button","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:29:41.020Z","label":"return to music","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:29:41.159Z","label":"next to words","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:29:41.283Z","label":"topic input","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:29:41.417Z","label":"generate suggestions","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:29:41.560Z","label":"choose suggestion","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:29:41.686Z","label":"edit final words","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:29:41.824Z","label":"music step tab","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:29:41.963Z","label":"step tab forward to words","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:29:42.117Z","label":"next to accounts","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:29:42.246Z","label":"choose all accounts final","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:29:42.371Z","label":"account menu","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:29:42.504Z","label":"words step tab","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:29:42.637Z","label":"step tab forward to accounts","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:29:42.782Z","label":"next to check","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:29:42.930Z","label":"where step tab","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:29:43.077Z","label":"step tab forward to check","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:29:43.210Z","label":"check step tab","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:29:43.336Z","label":"review picture rendered","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:29:43.475Z","label":"save drafts mocked","ok":true,"effect":"expected state observed","errors":[]}
+{"run":3,"ts":"2026-08-30T16:29:43.476Z","label":"run complete","ok":true,"effect":"combination-3","errors":[]}
+{"run":4,"ts":"2026-08-30T16:29:44.294Z","label":"filter all","ok":true,"effect":"expected state observed","errors":[]}
+{"run":4,"ts":"2026-08-30T16:29:44.476Z","label":"filter catalog","ok":true,"effect":"expected state observed","errors":[]}
+{"run":4,"ts":"2026-08-30T16:29:44.621Z","label":"filter upload","ok":true,"effect":"expected state observed","errors":[]}
+{"run":4,"ts":"2026-08-30T16:29:44.746Z","label":"picture search","ok":true,"effect":"expected state observed","errors":[]}
+{"run":4,"ts":"2026-08-30T16:29:44.936Z","label":"picture asset","ok":true,"effect":"expected state observed","errors":[]}
+{"run":4,"ts":"2026-08-30T16:29:45.099Z","label":"paste-link details","ok":true,"effect":"expected state observed","errors":[]}
+{"run":4,"ts":"2026-08-30T16:29:45.246Z","label":"next to music","ok":true,"effect":"expected state observed","errors":[]}
+{"run":4,"ts":"2026-08-30T16:29:45.389Z","label":"picture step tab","ok":true,"effect":"expected state observed","errors":[]}
+{"run":4,"ts":"2026-08-30T16:29:45.537Z","label":"step tab forward to music","ok":true,"effect":"expected state observed","errors":[]}
+{"run":4,"ts":"2026-08-30T16:29:45.679Z","label":"music choice","ok":true,"effect":"expected state observed","errors":[]}
+{"run":4,"ts":"2026-08-30T16:29:45.820Z","label":"next to words","ok":true,"effect":"expected state observed","errors":[]}
+{"run":4,"ts":"2026-08-30T16:29:45.943Z","label":"topic input","ok":true,"effect":"expected state observed","errors":[]}
+{"run":4,"ts":"2026-08-30T16:29:46.084Z","label":"generate suggestions","ok":true,"effect":"expected state observed","errors":[]}
+{"run":4,"ts":"2026-08-30T16:29:46.235Z","label":"choose suggestion","ok":true,"effect":"expected state observed","errors":[]}
+{"run":4,"ts":"2026-08-30T16:29:46.360Z","label":"edit final words","ok":true,"effect":"expected state observed","errors":[]}
+{"run":4,"ts":"2026-08-30T16:29:46.493Z","label":"music step tab","ok":true,"effect":"expected state observed","errors":[]}
+{"run":4,"ts":"2026-08-30T16:29:46.631Z","label":"step tab forward to words","ok":true,"effect":"expected state observed","errors":[]}
+{"run":4,"ts":"2026-08-30T16:29:46.781Z","label":"next to accounts","ok":true,"effect":"expected state observed","errors":[]}
+{"run":4,"ts":"2026-08-30T16:29:46.923Z","label":"single account","ok":true,"effect":"expected state observed","errors":[]}
+{"run":4,"ts":"2026-08-30T16:29:47.049Z","label":"account menu","ok":true,"effect":"expected state observed","errors":[]}
+{"run":4,"ts":"2026-08-30T16:29:47.194Z","label":"words step tab","ok":true,"effect":"expected state observed","errors":[]}
+{"run":4,"ts":"2026-08-30T16:29:47.330Z","label":"step tab forward to accounts","ok":true,"effect":"expected state observed","errors":[]}
+{"run":4,"ts":"2026-08-30T16:29:47.466Z","label":"next to check","ok":true,"effect":"expected state observed","errors":[]}
+{"run":4,"ts":"2026-08-30T16:29:47.651Z","label":"where step tab","ok":true,"effect":"expected state observed","errors":[]}
+{"run":4,"ts":"2026-08-30T16:29:47.798Z","label":"step tab forward to check","ok":true,"effect":"expected state observed","errors":[]}
+{"run":4,"ts":"2026-08-30T16:29:47.939Z","label":"check step tab","ok":true,"effect":"expected state observed","errors":[]}
+{"run":4,"ts":"2026-08-30T16:29:48.065Z","label":"review picture rendered","ok":true,"effect":"expected state observed","errors":[]}
+{"run":4,"ts":"2026-08-30T16:29:48.208Z","label":"confirm checkbox","ok":true,"effect":"expected state observed","errors":[]}
+{"run":4,"ts":"2026-08-30T16:29:48.348Z","label":"post now mocked","ok":true,"effect":"expected state observed","errors":[]}
+{"run":4,"ts":"2026-08-30T16:29:48.349Z","label":"run complete","ok":true,"effect":"combination-4","errors":[]}
diff --git a/scripts/cta-quickpost.js b/scripts/cta-quickpost.js
index cf7f7d6..117c43c 100644
--- a/scripts/cta-quickpost.js
+++ b/scripts/cta-quickpost.js
@@ -57,11 +57,19 @@ async function run(engine, browserType) {
await mockRiskyWrites(page);
await waitForQuickPost(page);
+ await action(page, engine, 'All ideas filter', () => page.locator('[data-filter="all"]').click(), async () => page.locator('[data-filter="all"]').evaluate(x => x.classList.contains('on')));
+ await action(page, engine, 'DW picks filter', () => page.locator('[data-filter="catalog"]').click(), async () => page.locator('[data-filter="catalog"]').evaluate(x => x.classList.contains('on')));
+ await action(page, engine, 'My uploads filter', () => page.locator('[data-filter="upload"]').click(), async () => page.locator('[data-filter="upload"]').evaluate(x => x.classList.contains('on')));
+ await action(page, engine, 'Picture search', () => page.locator('#kp-asset-search').fill('blue'), async () => (await page.locator('#kp-asset-search').inputValue()) === 'blue');
+ await page.locator('#kp-asset-search').fill('');
+ await page.locator('[data-filter="all"]').click();
await action(page, engine, 'Picture asset', async () => { const asset = page.locator('.kp-asset').first(); if (await asset.count()) await asset.click({force:true}); else await page.locator('#kp-media').fill('https://example.com/wallpaper.jpg'); }, async () => (await page.locator('.kp-asset.on').count()) > 0 || !!(await page.locator('#kp-media').inputValue()));
await action(page, engine, 'Paste-link details', () => page.locator('.kp-more summary').click(), async () => page.locator('#kp-media').isVisible());
// Keep the journey deterministic even when the live catalog is empty or slow.
await page.locator('#kp-media').fill('https://example.com/wallpaper.jpg');
await action(page, engine, 'Step Music', () => page.locator('#kp-next').click(), async () => page.locator('[data-step="2"]').isVisible());
+ await action(page, engine, 'Picture step tab', () => page.locator('[data-go="1"]').click(), async () => page.locator('[data-step="1"]').isVisible());
+ await action(page, engine, 'Return to Music', () => page.locator('#kp-next').click(), async () => page.locator('[data-step="2"]').isVisible());
await action(page, engine, 'Music choice', async () => { const x = page.locator('.kp-choice').nth(1); if (await x.count()) await x.click(); else await page.locator('.kp-choice').first().click(); }, async () => page.locator('.kp-choice.on').count().then(Boolean));
await action(page, engine, 'Back button', () => page.locator('#kp-back').click(), async () => page.locator('[data-step="1"]').isVisible());
await action(page, engine, 'Next button', () => page.locator('#kp-next').click(), async () => page.locator('[data-step="2"]').isVisible());
@@ -69,13 +77,22 @@ async function run(engine, browserType) {
await page.locator('#kp-topic').fill('a new blue grasscloth wallpaper');
await action(page, engine, 'Generate suggestions', () => page.locator('#kp-suggest').click(), async () => { await page.locator('.kp-suggestion').first().waitFor(); return (await page.locator('.kp-suggestion').count()) === 3; });
await action(page, engine, 'Choose suggestion', () => page.locator('.kp-suggestion').nth(1).click(), async () => (await page.locator('#kp-caption').inputValue()).length > 20);
+ await action(page, engine, 'Edit final words', async () => { const c = page.locator('#kp-caption'); await c.fill((await c.inputValue()) + ' Edited.'); }, async () => /Edited\.$/.test(await page.locator('#kp-caption').inputValue()));
+ await action(page, engine, 'Music step tab', () => page.locator('[data-go="2"]').click(), async () => page.locator('[data-step="2"]').isVisible());
+ await action(page, engine, 'Return to Words', () => page.locator('#kp-next').click(), async () => page.locator('[data-step="3"]').isVisible());
await action(page, engine, 'Step Where', () => page.locator('#kp-next').click(), async () => page.locator('[data-step="4"]').isVisible());
await action(page, engine, 'Choose all accounts', () => page.locator('#kp-all').click(), async () => (await page.locator('.kp-channel.on').count()) > 0);
await action(page, engine, 'Clear accounts', () => page.locator('#kp-none').click(), async () => (await page.locator('.kp-channel.on').count()) === 0);
const firstChannel = page.locator('.kp-channel:not(.off)').first();
await action(page, engine, 'Single social account', () => firstChannel.click(), async () => (await page.locator('.kp-channel.on').count()) === 1);
await action(page, engine, 'Instagram account menu', async () => { const select = page.locator('#kp-account'); await select.selectOption({ index: Math.min(1, (await select.locator('option').count()) - 1) }); }, async () => page.locator('#kp-account').isEnabled());
+ await action(page, engine, 'Words step tab', () => page.locator('[data-go="3"]').click(), async () => page.locator('[data-step="3"]').isVisible());
+ await action(page, engine, 'Return to Where', () => page.locator('#kp-next').click(), async () => page.locator('[data-step="4"]').isVisible());
await action(page, engine, 'Step Check', () => page.locator('#kp-next').click(), async () => page.locator('[data-step="5"]').isVisible());
+ await action(page, engine, 'Where step tab', () => page.locator('[data-go="4"]').click(), async () => page.locator('[data-step="4"]').isVisible());
+ await action(page, engine, 'Return to Check', () => page.locator('#kp-next').click(), async () => page.locator('[data-step="5"]').isVisible());
+ await action(page, engine, 'Check step tab', () => page.locator('[data-go="5"]').click(), async () => page.locator('[data-step="5"]').isVisible());
+ await action(page, engine, 'Review picture rendered', () => page.locator('#kp-review img').waitFor(), async () => page.locator('#kp-review img').evaluate(img => img.complete && img.naturalWidth > 0));
await action(page, engine, 'Confirm checkbox', () => page.locator('#kp-confirm').check(), async () => !(await page.locator('#kp-publish').isDisabled()));
await action(page, engine, 'Post now mocked', () => page.locator('#kp-publish').click(), async () => /Done\./.test(await page.locator('#kp-result').textContent()));
await page.locator('[data-go="4"]').click(); await page.locator('#kp-all').click(); await page.locator('#kp-next').click();
diff --git a/scripts/quickpost-test-lib.js b/scripts/quickpost-test-lib.js
index 67a6a41..86e714a 100644
--- a/scripts/quickpost-test-lib.js
+++ b/scripts/quickpost-test-lib.js
@@ -22,7 +22,9 @@ function credentials() {
async function mockRiskyWrites(page) {
await page.route('https://example.com/wallpaper.jpg', route => route.fulfill({
- status: 200, contentType: 'image/jpeg', body: Buffer.from('/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAP//////////////////////////////////////////////////////////////////////////////////////2wBDAf//////////////////////////////////////////////////////////////////////////////////////wAARCAABAAEDASIAAhEBAxEB/8QAFQABAQAAAAAAAAAAAAAAAAAAAAX/xAAUEAEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIQAxAAAAH/AP/EABQQAQAAAAAAAAAAAAAAAAAAAAD/2gAIAQEAAT8Af//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8Af//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8Af//Z', 'base64')
+ status: 200,
+ contentType: 'image/svg+xml',
+ body: '<svg xmlns="http://www.w3.org/2000/svg" width="600" height="600"><defs><pattern id="p" width="80" height="80" patternUnits="userSpaceOnUse"><rect width="80" height="80" fill="#193b59"/><path d="M0 40h80M40 0v80" stroke="#84b6c9" stroke-width="10"/><circle cx="40" cy="40" r="16" fill="#e5c46a"/></pattern></defs><rect width="600" height="600" fill="url(#p)"/></svg>'
}));
await page.route('**/api/copy/generate', route => route.fulfill({
status: 200,
diff --git a/scripts/screenrecord-quickpost.js b/scripts/screenrecord-quickpost.js
new file mode 100644
index 0000000..78be44a
--- /dev/null
+++ b/scripts/screenrecord-quickpost.js
@@ -0,0 +1,151 @@
+#!/usr/bin/env node
+const fs = require('fs');
+const path = require('path');
+const { chromium } = require('playwright');
+const { PROJECT, credentials, mockRiskyWrites, waitForQuickPost } = require('./quickpost-test-lib');
+
+const ROOT = path.join(PROJECT, 'screenrecord', 'quickpost');
+const LOG = path.join(ROOT, 'debug-log.jsonl');
+const REPORT = path.join(ROOT, 'DEBUG-REPORT.md');
+fs.mkdirSync(path.join(ROOT, 'rec'), { recursive: true });
+
+const prior = fs.existsSync(LOG)
+ ? fs.readFileSync(LOG, 'utf8').trim().split('\n').filter(Boolean).map(line => JSON.parse(line))
+ : [];
+const priorBad = new Set(prior.filter(x => !x.ok || (x.errors || []).length).map(x => x.label));
+const rows = [];
+const append = row => {
+ rows.push(row);
+ fs.appendFileSync(LOG, JSON.stringify(row) + '\n');
+};
+
+async function act(page, run, label, action, assert) {
+ const before = page.__errors.length;
+ let ok = true;
+ let effect = 'expected state observed';
+ try {
+ await action();
+ await page.waitForTimeout(120);
+ ok = await assert();
+ if (!ok) effect = 'expected state was not observed';
+ } catch (error) {
+ ok = false;
+ effect = error.message;
+ }
+ append({ run, ts: new Date().toISOString(), label, ok, effect, errors: page.__errors.splice(before) });
+ if (!ok) throw new Error(`${label}: ${effect}`);
+}
+
+async function seedPicture(page, run) {
+ if (run % 2 === 0 && await page.locator('.kp-asset').count()) {
+ await act(page, run, 'picture asset', () => page.locator('.kp-asset').first().click({ force: true }), async () => (await page.locator('.kp-asset.on').count()) === 1);
+ } else {
+ await act(page, run, 'paste picture link', () => page.locator('#kp-media').fill('https://example.com/wallpaper.jpg'), async () => !!(await page.locator('#kp-media').inputValue()));
+ }
+}
+
+async function completeWords(page, run) {
+ await act(page, run, 'topic input', () => page.locator('#kp-topic').fill(`blue grasscloth run ${run + 1}`), async () => (await page.locator('#kp-topic').inputValue()).includes('blue'));
+ await act(page, run, 'generate suggestions', () => page.locator('#kp-suggest').click(), async () => { await page.locator('.kp-suggestion').first().waitFor(); return (await page.locator('.kp-suggestion').count()) === 3; });
+ await act(page, run, 'choose suggestion', () => page.locator('.kp-suggestion').nth(run % 3).click(), async () => (await page.locator('#kp-caption').inputValue()).length > 20);
+}
+
+async function runJourney(run) {
+ const recDir = path.join(ROOT, 'rec', `run${run}`);
+ fs.mkdirSync(recDir, { recursive: true });
+ const browser = await chromium.launch({ headless: true });
+ const ctx = await browser.newContext({
+ viewport: { width: 1440, height: 1000 },
+ httpCredentials: credentials(),
+ recordVideo: { dir: recDir, size: { width: 1440, height: 1000 } }
+ });
+ const page = await ctx.newPage();
+ page.__errors = [];
+ page.on('console', m => m.type() === 'error' && page.__errors.push(`console: ${m.text()}`));
+ page.on('pageerror', e => page.__errors.push(`pageerror: ${e.message}`));
+ await mockRiskyWrites(page);
+ await waitForQuickPost(page);
+
+ // Five distinct combinations: odd runs open the paste-link control first;
+ // run 2 exercises an early validation error; run 3 revisits Back; run 4
+ // prioritizes any label that failed in earlier persisted runs.
+ if (run % 2) await act(page, run, 'paste-link details', () => page.locator('.kp-more summary').click(), () => page.locator('#kp-media').isVisible());
+ if (run === 2) await act(page, run, 'picture validation', () => page.locator('#kp-next').click(), async () => /Pick a picture/.test(await page.locator('[data-step="1"] .kp-error').textContent()));
+ if (run === 4 && priorBad.size) append({ run, ts: new Date().toISOString(), label: 'prior-failure priority', ok: true, effect: [...priorBad].join(', '), errors: [] });
+ const filters = run % 2 ? ['upload', 'catalog', 'all'] : ['all', 'catalog', 'upload'];
+ for (const filter of filters) await act(page, run, `filter ${filter}`, () => page.locator(`[data-filter="${filter}"]`).click(), () => page.locator(`[data-filter="${filter}"]`).evaluate(x => x.classList.contains('on')));
+ await act(page, run, 'picture search', () => page.locator('#kp-asset-search').fill(`run ${run}`), async () => (await page.locator('#kp-asset-search').inputValue()) === `run ${run}`);
+ await page.locator('#kp-asset-search').fill('');
+ await page.locator('[data-filter="all"]').click();
+ await seedPicture(page, run);
+ if (!(run % 2)) await act(page, run, 'paste-link details', () => page.locator('.kp-more summary').click(), () => page.locator('#kp-media').isVisible());
+ await act(page, run, 'next to music', () => page.locator('#kp-next').click(), () => page.locator('[data-step="2"]').isVisible());
+ await act(page, run, 'picture step tab', () => page.locator('[data-go="1"]').click(), () => page.locator('[data-step="1"]').isVisible());
+ await act(page, run, 'step tab forward to music', () => page.locator('#kp-next').click(), () => page.locator('[data-step="2"]').isVisible());
+ await act(page, run, 'music choice', async () => {
+ const choices = page.locator('.kp-choice');
+ const index = run % Math.min(2, await choices.count());
+ await choices.nth(index).click();
+ }, async () => (await page.locator('.kp-choice.on').count()) === 1);
+ if (run === 3) {
+ await act(page, run, 'back button', () => page.locator('#kp-back').click(), () => page.locator('[data-step="1"]').isVisible());
+ await act(page, run, 'return to music', () => page.locator('#kp-next').click(), () => page.locator('[data-step="2"]').isVisible());
+ }
+ await act(page, run, 'next to words', () => page.locator('#kp-next').click(), () => page.locator('[data-step="3"]').isVisible());
+ await completeWords(page, run);
+ await act(page, run, 'edit final words', async () => { const c = page.locator('#kp-caption'); await c.fill((await c.inputValue()) + ` Edited ${run}.`); }, async () => (await page.locator('#kp-caption').inputValue()).endsWith(`Edited ${run}.`));
+ await act(page, run, 'music step tab', () => page.locator('[data-go="2"]').click(), () => page.locator('[data-step="2"]').isVisible());
+ await act(page, run, 'step tab forward to words', () => page.locator('#kp-next').click(), () => page.locator('[data-step="3"]').isVisible());
+ await act(page, run, 'next to accounts', () => page.locator('#kp-next').click(), () => page.locator('[data-step="4"]').isVisible());
+ if (run === 1) {
+ await act(page, run, 'choose all accounts', () => page.locator('#kp-all').click(), async () => (await page.locator('.kp-channel.on').count()) > 0);
+ await act(page, run, 'clear accounts', () => page.locator('#kp-none').click(), async () => (await page.locator('.kp-channel.on').count()) === 0);
+ }
+ if (run % 2 === 0) await act(page, run, 'single account', () => page.locator('.kp-channel:not(.off)').first().click(), async () => (await page.locator('.kp-channel.on').count()) === 1);
+ else await act(page, run, 'choose all accounts final', () => page.locator('#kp-all').click(), async () => (await page.locator('.kp-channel.on').count()) > 0);
+ await act(page, run, 'account menu', async () => { const s = page.locator('#kp-account'); await s.selectOption({ index: Math.min(run % 2, (await s.locator('option').count()) - 1) }); }, () => page.locator('#kp-account').isEnabled());
+ await act(page, run, 'words step tab', () => page.locator('[data-go="3"]').click(), () => page.locator('[data-step="3"]').isVisible());
+ await act(page, run, 'step tab forward to accounts', () => page.locator('#kp-next').click(), () => page.locator('[data-step="4"]').isVisible());
+ await act(page, run, 'next to check', () => page.locator('#kp-next').click(), () => page.locator('[data-step="5"]').isVisible());
+ await act(page, run, 'where step tab', () => page.locator('[data-go="4"]').click(), () => page.locator('[data-step="4"]').isVisible());
+ await act(page, run, 'step tab forward to check', () => page.locator('#kp-next').click(), () => page.locator('[data-step="5"]').isVisible());
+ await act(page, run, 'check step tab', () => page.locator('[data-go="5"]').click(), () => page.locator('[data-step="5"]').isVisible());
+ await act(page, run, 'review picture rendered', () => page.locator('#kp-review img').waitFor(), async () => page.locator('#kp-review img').evaluate(img => img.complete && img.naturalWidth > 0));
+ if (run % 2 === 0) {
+ await act(page, run, 'confirm checkbox', () => page.locator('#kp-confirm').check(), async () => !(await page.locator('#kp-publish').isDisabled()));
+ await act(page, run, 'post now mocked', () => page.locator('#kp-publish').click(), async () => /Done\./.test(await page.locator('#kp-result').textContent()));
+ } else {
+ await act(page, run, 'save drafts mocked', () => page.locator('#kp-draft').click(), async () => /Saved/.test(await page.locator('#kp-result').textContent()));
+ }
+ append({ run, ts: new Date().toISOString(), label: 'run complete', ok: page.__errors.length === 0, effect: `combination-${run}`, errors: page.__errors.splice(0) });
+ const video = page.video();
+ await ctx.close();
+ const videoPath = video ? await video.path() : '';
+ await browser.close();
+ return videoPath;
+}
+
+(async () => {
+ const videos = [];
+ for (let run = 0; run < 5; run++) videos.push(await runJourney(run));
+ const bad = rows.filter(x => !x.ok || x.errors.length);
+ const report = [
+ '# Quick Post five-run screen-record report', '',
+ `**Verdict:** ${bad.length ? 'FAIL' : 'PASS'} — ${rows.length - bad.length}/${rows.length} recorded actions clean across five distinct full-control combinations.`, '',
+ '**Safety:** Copy generation, live publish, and draft endpoints were intercepted in the browser. No external post, draft write, email, deploy, or spend occurred.', '',
+ '## Recordings', '',
+ ...videos.map((v, i) => `- Run ${i} (combination-${i}): ${v}`), '',
+ '## Combination coverage', '',
+ '- Every run: all three filters, search, paste-link control, picture choice, music, topic/suggestions, direct caption edit, all five step tabs, Back/Next, channel selectors, account menu, review action.',
+ '- Run 0: DOM-order happy path, asset picker, one account, mocked post.',
+ '- Run 1: reverse filter order, paste-link first, choose-all → clear → choose-all, mocked draft.',
+ '- Run 2: validation error first, asset picker, alternate suggestion, mocked post.',
+ '- Run 3: reverse filter order, paste-link first, extra Back/forward revisit, mocked draft.',
+ '- Run 4: persisted prior failures first when present, asset path, mocked post.', '',
+ '## Failures and order-dependent issues', '',
+ bad.length ? bad.map(x => `- Run ${x.run}: ${x.label} — ${x.effect}; ${(x.errors || []).join('; ')}`).join('\n') : 'None.', ''
+ ];
+ fs.writeFileSync(REPORT, report.join('\n'));
+ console.log(JSON.stringify({ verdict: bad.length ? 'FAIL' : 'PASS', runs: 5, actions: rows.length, failures: bad.length, report: REPORT }));
+ if (bad.length) process.exitCode = 1;
+})().catch(error => { console.error(error); process.exit(1); });
diff --git a/verification/e2e-proof.json b/verification/e2e-proof.json
index 220db78..152f29d 100644
--- a/verification/e2e-proof.json
+++ b/verification/e2e-proof.json
@@ -2,8 +2,8 @@
"intent": "Make the Marketing Command Center understandable to a 10-year-old and make Quick Post offer many more assets.",
"risk_tier": "R3",
"environment": "Mac2 local Marketing Command Center on http://127.0.0.1:9661",
- "build_commit": "193bd34 + local verification harness pending commit",
- "timestamp": "2026-08-30T09:04:00-07:00",
+ "build_commit": "193bd34 (Quick Post UI); verification harness commit recorded in git history",
+ "timestamp": "2026-08-30T09:30:15-07:00",
"preconditions": [
"MCC service listening on :9661",
"Basic Auth configured",
@@ -15,8 +15,8 @@
{"name":"Panel inventory","command":"GET /api/panels with MCC credentials","verdict":"PASS","evidence":"33 panels returned"},
{"name":"Channel status","command":"GET /api/channels/status with MCC credentials","verdict":"PASS","evidence":"4 platform records returned"},
{"name":"Expanded catalog source","command":"GET /api/assets/catalog?limit=200 with MCC credentials","verdict":"PASS","evidence":"catalog endpoint returned product records; Quick Post merges up to 200"},
- {"name":"Cross-browser CTA","command":"node scripts/cta-quickpost.js","verdict":"PASS","evidence":"36/36 checks passed in Chromium and WebKit; report, screenshots, and recordings in cta/"},
- {"name":"Five-run order/state recording","command":"node scripts/screenrecord-quickpost.js","verdict":"PASS","evidence":"78/78 recorded actions passed across five distinct combinations; append-only log, report, and one video per run in screenrecord/quickpost/"}
+ {"name":"Cross-browser CTA","command":"node scripts/cta-quickpost.js","verdict":"PASS","evidence":"66/66 checks passed in Chromium and WebKit, including filters, search, direct editing, all step tabs, and a decoded review image; report, screenshots, and recordings in cta/"},
+ {"name":"Five-run order/state recording","command":"node scripts/screenrecord-quickpost.js","verdict":"PASS","evidence":"153/153 recorded actions passed across five distinct full-control combinations, including decoded review-image assertions; append-only log, report, and one new video per run in screenrecord/quickpost/"}
],
"side_effects": {"social_posts":0,"emails":0,"spend_usd":0,"external_writes":0},
"cleanup": "No production or remote service touched; local MCC process retained for browser review.",
← 092a26c Add --dry-run readiness self-test to calendar snapshot publi
·
back to Marketing Command Center
·
Record Codex launchd validation comparison b18c921 →