diff --git a/formulas/run-user-test.toml b/formulas/run-user-test.toml new file mode 100644 index 0000000..30176e1 --- /dev/null +++ b/formulas/run-user-test.toml @@ -0,0 +1,109 @@ +# formulas/run-user-test.toml +# +# Persona-based UX evaluation against the harb stack. +# +# Type: sense — produces UX metrics, changes no code or contracts. +# The formula spins up a full self-contained stack, runs Playwright against +# all 5 personas, collects structured reports, then tears the stack down. + +[formula] +id = "run-user-test" +type = "sense" +description = "Persona-based UX evaluation against the harb stack" +depends_on = [973] # evidence directory structure must exist + +# ── Stack management ───────────────────────────────────────────────────────── +# The formula is self-contained: it starts and stops its own stack. + +[stack] +start_cmd = "./scripts/dev.sh start" +health_cmd = "./scripts/dev.sh health" +stop_cmd = "./scripts/dev.sh stop" + +# ── Inputs ─────────────────────────────────────────────────────────────────── +# 5 personas across 2 funnels. Each persona has a dedicated Playwright spec +# that simulates the full journey: connect wallet → mint ETH → buy KRK → +# stake → verify position. + +[[inputs.funnels]] +name = "passive-holder" + + [[inputs.funnels.personas]] + name = "tyler" + display = "Tyler 'Bags' Morrison" + spec = "tests/e2e/usertest/tyler-retail-degen.spec.ts" + + [[inputs.funnels.personas]] + name = "alex" + display = "Alex Rivera" + spec = "tests/e2e/usertest/alex-newcomer.spec.ts" + + [[inputs.funnels.personas]] + name = "sarah" + display = "Sarah Park" + spec = "tests/e2e/usertest/sarah-yield-farmer.spec.ts" + +[[inputs.funnels]] +name = "staker" + + [[inputs.funnels.personas]] + name = "priya" + display = "Dr. Priya Malhotra" + spec = "tests/e2e/usertest/priya-institutional.spec.ts" + + [[inputs.funnels.personas]] + name = "marcus" + display = "Marcus 'Flash' Chen" + spec = "tests/e2e/usertest/marcus-degen.spec.ts" + +# ── Steps ──────────────────────────────────────────────────────────────────── + +[[steps]] +id = "stack-up" +description = "Spin up full stack (boots Docker services, waits for health)" +run = "./scripts/dev.sh start" + +[[steps]] +id = "run-personas" +description = "Run all 5 personas via Playwright (workers=1, sequential to avoid account conflicts)" +run = "./scripts/run-usertest.sh" +after = ["stack-up"] + +[[steps]] +id = "collect" +description = "Aggregate per-persona JSON reports from tmp/usertest-results/ into evidence/user-test/{date}.json" +output = "evidence/user-test/{date}.json" +schema = "evidence/README.md#user-test" +after = ["run-personas"] + +[[steps]] +id = "stack-down" +description = "Tear down stack" +run = "./scripts/dev.sh stop" +after = ["collect"] + +[[steps]] +id = "deliver" +description = "Commit evidence file to main and post summary to issue as comment" +after = ["collect"] + +# ── Products ───────────────────────────────────────────────────────────────── +# Three outputs following the standard evidence delivery pattern: +# 1. evidence file → committed to main +# 2. screenshots → referenced inside the evidence file +# 3. summary → posted as issue comment + +[[products]] +type = "evidence" +path = "evidence/user-test/{date}.json" +schema = "evidence/README.md#user-test" +destination = "commit" + +[[products]] +type = "screenshots" +path = "test-results/usertest/" +destination = "evidence-ref" # paths recorded in the evidence file, not committed separately + +[[products]] +type = "summary" +destination = "issue-comment"