BETT.GURU
VALIDATION EVIDENCE

Executed tests, traced to the v4 baseline.

Everything on this page is generated from real test runs committed with the code. If a test fails, it is listed as failed. Screenshots are produced by the browser test run itself.

Tested code vs deployed code

A commit cannot contain evidence about itself, so the evidence names the commit it was produced at, and every build recomputes a SHA-256 of the application and test source (generated evidence excluded). Matching hashes mean this deployment was built from exactly the code that was tested.

✓ TESTED SOURCE = DEPLOYED SOURCE
Tested commit
69b03ab (domain) · 69b03ab (browser)
Tested source
01b31de99fbd (domain) · 01b31de99fbd (browser)
Executed
2026-10-30T19:44:02Z · 2026-10-30T19:45:06Z
Deployed commit
31c0078 · main
Deployed source
01b31de99fbd · 68 files
Build
2026-10-31T01:12:52Z · Vercel production

Domain regression — by v4 category

The v4 summary reports 47 automated tests in six categories. The original test source was not included in the v4 bundle, so the suite was recreated from the documented behaviour, findings and reconciliation checks.

vitestexecuted 2026-10-30 19:44:02Ztested commit 69b03absource 01b31de99fbdnode v22.22.064/64 passed

Money & ledger

v4 regression (recreated) · tests/domain/money-ledger.test.ts
  • ✓ML-01a deposit posts one integer-cent ledger entry and the balance is derived from entries17.6ms
  • ✓ML-02toMinor converts user input to integer cents and never returns NaN0.6ms
  • ✓ML-03fmt renders minor units as USD with sign and grouping0.6ms
  • ✓ML-04deposits below the $10 minimum are refused with no ledger movement0.7ms
  • ✓ML-05single deposits above $5,000 are refused0.3ms
  • ✓ML-06the daily deposit limit ($500 default) is enforced across deposits on the same day1.2ms
  • ✓ML-07replaying a deposit with the same key is ignored and returns the original transaction0.8ms
  • ✓ML-08reusing a key with a different payload is an IDEMPOTENCY_CONFLICT and nothing is processed (F4)0.6ms
  • ✓ML-09money commands without a non-empty idempotency key are refused (E1)1.3ms
  • ✓ML-10a withdrawal holds funds immediately and respects minimum and available balance1.6ms
  • ✓ML-11a failed withdrawal is reversed exactly once and the ledger still reconciles2.1ms

Identity & eligibility

v4 regression (recreated) · tests/domain/identity-eligibility.test.ts
  • ✓IE-01a verified adult in a licensed state is eligible to deposit, bet and withdraw4.5ms
  • ✓IE-02an under-21 persona is refused at registration (AGE_BLOCK) and no account is created0.8ms
  • ✓IE-03a persona in an unlicensed state is refused centrally (STATE_BLOCK)0.3ms
  • ✓IE-04rejected and referred KYC block money movement until manual review approves15.1ms
  • ✓IE-05eligibility is a single choke point: no user → NO_USER, unverified → KYC_REQUIRED0.7ms
  • ✓IE-06account isolation: no second identity over an active account; sign-out discards account state (E2)1.6ms

Bet placement & odds

v4 regression (recreated) · tests/domain/placement-odds.test.ts
  • ✓BP-01a single is accepted with exactly one stake debit and a well-formed bet record16.3ms
  • ✓BP-02a parlay across events multiplies prices (odds to 2dp, potential in integer cents)1ms
  • ✓BP-03same-event legs are refused as CORRELATED_LEGS with no debit (F6, no same-game parlays)0.8ms
  • ✓BP-04a moved price refuses placement with PRICE_CHANGED and reports the new price0.8ms
  • ✓BP-05after the customer accepts the new price, a new intent places at the accepted price1.1ms
  • ✓BP-06a suspended market is refused without charging; reopening allows placement1ms
  • ✓BP-07a settled market is closed to new bets (MARKET_CLOSED)0.6ms
  • ✓BP-08stake bounds: $1 minimum, $1,000 maximum, integer cents only0.5ms
  • ✓BP-09a stake above the derived balance is refused with INSUFFICIENT_FUNDS0.8ms
  • ✓BP-10malformed selections are refused with coded errors before funds are touched (F1)0.6ms
  • ✓BP-11every leg needs an explicit, finite accepted price > 1 (F2)0.7ms
  • ✓BP-12empty slips and slips over 10 legs are refused0.3ms
  • ✓BP-13a double-tapped bet places once; a tampered retry with the same key conflicts1.5ms

Settlement

v4 regression (recreated) · tests/domain/settlement.test.ts
  • ✓ST-01final scores are deterministic (EV-2091: Denver 37 – Austin 21)3ms
  • ✓ST-02a winning single pays stake × price exactly once, keyed by bet id20.6ms
  • ✓ST-03a losing bet settles LOST with no payout entry2.4ms
  • ✓ST-04settling the same event twice is ignored — no double payout1.4ms
  • ✓ST-05a parlay stays OPEN until every leg’s event has a result2.8ms
  • ✓ST-06spread and total legs resolve against the line; unknown events are coded, not thrown (E3)1.4ms

Responsible gaming

v4 regression (recreated) · tests/domain/responsible-gaming.test.ts
  • ✓RG-01lowering the daily deposit limit applies immediately15.3ms
  • ✓RG-02raising the limit waits 24 hours and then applies on the clock1.6ms
  • ✓RG-03cooling-off pauses deposits and bets but keeps withdrawals open, then lifts5.5ms
  • ✓RG-04a later, shorter cooling-off cannot shorten an existing one (F3)0.5ms
  • ✓RG-05self-exclusion blocks deposits and bets, allows withdrawals, and cannot be shortened1.5ms
  • ✓RG-06a persona on the self-exclusion register is matched at registration (365 days)0.4ms
  • ✓RG-07restrictions survive sign-out on the platform register and re-bind to a returning identity0.5ms
  • ✓RG-08reconciliation checks each deposit against the limit in force at the time (F5)1.4ms

Hardening

v4 regression (recreated) · tests/domain/hardening.test.ts
  • ✓HD-01invalid durations, limits and clock moves are refused and leave state unchanged (E5)17.6ms
  • ✓HD-02trading commands on invalid selections or events return coded refusals, never exceptions (E3, E4)2.1ms
  • ✓HD-03a hostile session (malformed, replayed, unknown commands) never moves money incorrectly; 13/13 reconciliation holds4.1ms

Scenarios & CEO demo

v5 addition · tests/domain/scenarios-journey.test.ts
  • ✓SC-01every scenario is deterministic and starts from a reconciled ledger26.3ms
  • ✓SC-02all six CEO stages load a scenario; stage 4 places and settles for a $45.00 payout3.1ms

Transaction journey

v5 addition · tests/domain/scenarios-journey.test.ts
  • ✓JT-01pre-flight on a fresh state: identity pending and every later stage not reached0.8ms
  • ✓JT-02pre-flight on the odds scenario asks the customer to accept the new price3ms
  • ✓JT-03a refused attempt marks the refusing stage with the reducer’s own code; later stages are not reached1.2ms
  • ✓JT-04an accepted bet passes every stage; settlement turns from waiting to WON live1.4ms
  • ✓JT-05an idempotent replay is shown as replayed, with other checks skipped0.8ms
  • ✓JT-06every PLACE_BET refusal code the reducer can return is owned by a journey stage0.5ms

v4 parity

The untouched v4 core (reference/v4/bg-core-2.3.0.js, SHA-256 recorded in reference/v4/SHA256SUMS) and the TypeScript domain are driven with identical command sequences — including hostile ones. State, events, errors, reconciliation, KPIs and eligibility must match step by step.

  • ✓reports the same core version2.3ms
  • ✓has identical reference data (personas, fixtures, limits, licensed states)2.3ms
  • ✓produces identical deterministic final scores1ms
  • ✓matches step-by-step: happy path: register → KYC → deposit → parlay → settle55.7ms
  • ✓matches step-by-step: odds change, suspension, idempotency replay and conflict36.4ms
  • ✓matches step-by-step: hostile client probes (F1, F2, F6, E1, E3, E4, E5)52.6ms
  • ✓matches step-by-step: withdrawal lifecycle with exactly-once reversal19.6ms
  • ✓matches step-by-step: responsible gaming: limits, cooling-off, exclusion, re-binding44.6ms
  • ✓matches step-by-step: onboarding refusals and account isolation (E2)32.2ms

Browser tests

Playwright drives the built application in Chromium at desktop and mobile sizes: customer journey, all six CEO stages, reset, persistence and navigation.

playwrightexecuted 2026-10-30 19:45:06Ztested commit 69b03absource 01b31de99fbdnode v22.22.044/44 passed
  • ✓desktop › CEO demo › all six stages load deterministic scenarios, and the run is repeatable after reset1659ms
  • ✓desktop › CEO demo › final stage links to Product Decisions478ms
  • ✓mobile › CEO demo › all six stages load deterministic scenarios, and the run is repeatable after reset2035ms
  • ✓mobile › CEO demo › final stage links to Product Decisions504ms
  • ✓desktop › Platform Lab › customer journey: Avery registers, passes KYC, deposits, bets and is paid once5792ms
  • ✓desktop › Platform Lab › odds change: placement is blocked until the customer accepts the new price603ms
  • ✓desktop › Platform Lab › suspended market: refused with no debit; replay and malformed probes leave reconciliation green636ms
  • ✓desktop › Platform Lab › reset demo clears state; the session survives a reload608ms
  • ✓desktop › Platform Lab › responsible gaming: underage registration is refused with a decision code461ms
  • ✓mobile › Platform Lab › customer journey: Avery registers, passes KYC, deposits, bets and is paid once5798ms
  • ✓mobile › Platform Lab › odds change: placement is blocked until the customer accepts the new price693ms
  • ✓mobile › Platform Lab › suspended market: refused with no debit; replay and malformed probes leave reconciliation green734ms
  • ✓mobile › Platform Lab › reset demo clears state; the session survives a reload658ms
  • ✓mobile › Platform Lab › responsible gaming: underage registration is refused with a decision code493ms
  • ✓desktop › Site › / renders without console errors or horizontal overflow238ms
  • ✓desktop › Site › /lab renders without console errors or horizontal overflow285ms
  • ✓desktop › Site › /demo renders without console errors or horizontal overflow302ms
  • ✓desktop › Site › /decisions renders without console errors or horizontal overflow332ms
  • ✓desktop › Site › /architecture renders without console errors or horizontal overflow245ms
  • ✓desktop › Site › /tests renders without console errors or horizontal overflow237ms
  • ✓desktop › Site › every internal link resolves (no dead links)1102ms
  • ✓desktop › Site › header identifies the site as an independent simulation; favicon is served324ms
  • ✓desktop › Site › header and disclaimer fit without horizontal overflow from 360px to 1920px384ms
  • ✓desktop › Site › evidence: tested source matches the source this build was made from295ms
  • ✓desktop › Site › architecture: selecting a component explains it336ms
  • ✓desktop › Site › decisions: “Run in lab” deep-links a deterministic scenario499ms
  • ✓mobile › Site › / renders without console errors or horizontal overflow221ms
  • ✓mobile › Site › /lab renders without console errors or horizontal overflow276ms
  • ✓mobile › Site › /demo renders without console errors or horizontal overflow270ms
  • ✓mobile › Site › /decisions renders without console errors or horizontal overflow270ms
  • ✓mobile › Site › /architecture renders without console errors or horizontal overflow198ms
  • ✓mobile › Site › /tests renders without console errors or horizontal overflow246ms
  • ✓mobile › Site › every internal link resolves (no dead links)879ms
  • ✓mobile › Site › header identifies the site as an independent simulation; favicon is served302ms
  • ✓mobile › Site › header and disclaimer fit without horizontal overflow from 360px to 1920px370ms
  • ✓mobile › Site › evidence: tested source matches the source this build was made from273ms
  • ✓mobile › Site › architecture: selecting a component explains it327ms
  • ✓mobile › Site › decisions: “Run in lab” deep-links a deterministic scenario473ms
  • ✓desktop › Screenshots › pages1013ms
  • ✓desktop › Screenshots › lab states1151ms
  • ✓desktop › Screenshots › ceo demo693ms
  • ✓mobile › Screenshots › pages1906ms
  • ✓mobile › Screenshots › lab states1339ms
  • ✓mobile › Screenshots › ceo demo484ms
Screenshot desktop-architecture.png
desktop-architecture.png
Screenshot desktop-decisions.png
desktop-decisions.png
Screenshot desktop-demo-stage3.png
desktop-demo-stage3.png
Screenshot desktop-home.png
desktop-home.png
Screenshot desktop-lab-odds-change.png
desktop-lab-odds-change.png
Screenshot desktop-lab-persona.png
desktop-lab-persona.png
Screenshot desktop-lab-settled.png
desktop-lab-settled.png
Screenshot desktop-tests.png
desktop-tests.png
Screenshot mobile-architecture.png
mobile-architecture.png
Screenshot mobile-decisions.png
mobile-decisions.png
Screenshot mobile-demo-stage3.png
mobile-demo-stage3.png
Screenshot mobile-home.png
mobile-home.png
Screenshot mobile-lab-bets.png
mobile-lab-bets.png
Screenshot mobile-lab-control-room.png
mobile-lab-control-room.png
Screenshot mobile-lab-journey.png
mobile-lab-journey.png
Screenshot mobile-lab-odds-change.png
mobile-lab-odds-change.png
Screenshot mobile-lab-persona.png
mobile-lab-persona.png
Screenshot mobile-tests.png
mobile-tests.png

What these tests do not prove

Not proven by these tests: concurrency (single-writer reducer; races are simulated by replay), persistence durability beyond a localStorage round-trip, vendor integrations (KYC, payments, odds are persona-encoded or hashed). Browser tests prove the UI wiring for the scripted paths only.

Reproduce

npm ci
npm run test:evidence   # domain + parity → src/evidence/domain-tests.json
npm run build
npm run e2e             # browser tests + screenshots → src/evidence/e2e-tests.json, public/evidence/