First cut 2026-07-15 (user request, tablet session KY564). Purpose: a shared checklist for manual passes now,
and the enumeration an automated end-to-end suite grows from later — WalletConnect flows can be automated headlessly via the
XPROOF project's headless-WC facility (Playwright). AUTO = automatable today,
MANUAL = needs eyes (animation/visual judgement).
| Dimension | Values | Notes |
| Device / input | desktop (mouse), tablet (touch), phone (touch, small) | touch-drag vs mouse-drag vs tap-to-offer paths differ; known device-dependent snags live here |
| Browser | Chrome, Edge, Firefox, Android WebView/Samsung Internet, iOS Safari | thumb-render inconsistencies already logged in BOARD-POLISH1 (3)(4)(6) |
| Network | playnet, testnet, mainnet | playnet: no WC, manual labels only; mainnet: real-value guard rails |
| Trading mode | proposal (board), orderBook, debug | board = proposal only today |
| Chip layout 🧪 | shelves, organic | both live until the desktop verdict (BOARD-LAYOUT1) |
| Net view 🧪 | on (standard), off | off is the escape hatch; withdraw-all only applies when on |
| Account source | WalletConnect (HashPack et al), manual entry, mixed | profile WC list vs game accounts are separate stores (KAT-ACCTNORM1) |
| Accounts per player | 1, 2, many (> max-on-ring) | wheel windowing + divider wedges engage past the cap |
| Players | solo (2 own accounts), 2 players, many (> max-on-ring) | party-only + cluster semantics need ≥3 |
| Asset kind | HBAR, FT (decimals known/unknown), NFT, mixed baskets | unknown-decimals guard = AMOUNT-SCALE1 incident |
| Association state | associated, not associated + auto-assoc slots (unlimited / limited / full) | warning-cue logic under review (SIGN-ASSETASSOC1) |
| Lock rule | all, active, cluster | party-only filter follows it |
| Board motion | you-at-bottom toggle, party-only toggle, wheel scroll, max-on-ring change, resize/orientation | each must clear stale trail lines; chips must not jump (glide) |
| Settings | each ⚙ control × persistence (reload) × live effect | skin, net, self-bottom, max-on-ring, anim speed, trail after-glow, chip layout, party-only, pickable |
| Signing outcome | success, failure, EXPIRY (no receipt ever), partial sigs, witness sig | expiry verdict signal-driven (backend resolve broadcast); square 🟩/🟥 banner |
| Connection health | stable, WS drop/reconnect, slow mirror, mid-flow refresh | add-account late-land (30s+60s poll) lives here |
| # | Case | Expected | |
| F1 | Add account — WC connect, fresh pairing, join all | composer jumps re-pick step; account lands ≤30s or late-land toast; footer selects it | AUTO |
| F2 | Add account — manual entry, selected assets subset | bracket-notation join; only ticked assets arrive | AUTO |
| F3 | Add account — EMPTY footer list | ➕ button (not dead select) opens composer | AUTO |
| F4 | Offer fungible slice (drag AND tap-to-offer) | amount prompt; chip flies pile→basket dropping ghost at rim; 3-point line; store balance decrements | MANUAL |
| F5 | Offer NFT (drag AND tap-to-offer) | arc flight store→rim (ghost dropped)→straight→basket; no kinked lines | MANUAL |
| F6 | Withdraw netted stack (net on) | confirm names FULL amount; all legs return; after-glow lines cleared; chips glide home | AUTO |
| F7 | Reject received offer | chip animates back to giver; same clearing as F6 | AUTO |
| F8 | Lock / unlock via arc tap + footer | arc thickens orange; hover preview dashed; all-locked → signing phase | MANUAL |
| F9 | Sign — party account (WC prompt → approve) | green status arc; sign saved; banner "signing mode" visible | AUTO |
| F10 | Sign — NON-party account | button still ✍ Sign (witness tooltip), never Lock, no error | AUTO |
| F11 | Transaction success | confetti burst from hub (canvas-confetti), 🟩 banner + alert, board resets | MANUAL |
| F12 | Transaction EXPIRY (let countdown lapse, sign nothing) | ~11-16s after countdown: wiper sweep + persistent 🟥 toast (closable, never auto-dismisses) — never silence | AUTO |
| F13 | ▶ preview replay | flights ghost→basket + pile→ghost trail segments; spotlight fat-tire + blurred edge; ghosts inside the light | MANUAL |
| # | Case | Expected | |
| L1 | Rim band reserved | store chips never enter the ghost band; ghosts alone at the counter (both layouts) | AUTO |
| L2 | Coin-label band | no chip overlaps the curved account number (34px basket inset) | MANUAL |
| L3 | Ghost colinearity | pile→ghost→basket on one straight line; hover lights all three | AUTO |
| L4 | Dense store (10+ mixed chips) | shelves: tidy rows, spill outward only; organic: no neighbour-wedge invasion | MANUAL |
| L5 | Narrow wedge (many players) | chips wider than the chord centred, no neighbour overlap | MANUAL |
| L6 | Layout toggle shelves↔organic | every chip FLIP-glides; no stale cache arrangement; trails cleared | MANUAL |
| L7 | Every board motion (dim: Board motion) | trail lines removed at motion start; chips settle without jump | MANUAL |
| L8 | Mobile scroll attempt | board does not drag/bounce (dvh + overscroll fix); hub stays centred | MANUAL |
One number crosses five components and produced three distinct silent-fallback bugs in one day
(2026-07-15) — each decode path falls back to a plausible default (120s, the SDK default) instead of failing loud,
so wrong values are invisible unless a NON-default duration is configured. Rule of thumb for all timing tests:
always test with a duration ≠ 120 and ≠ 40 (the two defaults in play) and within Hedera's legal 15–180s — below 15s the NODE precheck-rejects submission with INVALID_TRANSACTION_DURATION (found live 2026-07-15: a 5s game silently killed every SIGNED tx while unsigned ones expired normally, masking it); all layers now clamp, e.g. use 16s — then every fallback is
visible as a wrong number.
Expected end-to-end timeline for duration D with no signatures:
countdown shows D from validStart → hits 0 at validStart+D → backend fails it by validStart+D+10s(+≤5s poll)
→ board wiper + 🟥 within ~2s of that broadcast. Anything else = a specific component below.
| # | Test | Pins | |
| U1-U12 | node qa-validdur-tests.js (backend repo root) — decode matrix: Long int64 (bug #1), SignedTransaction wrapper (bug #2), cross-shape misuse silent-fallback modes, absent field, garbage, REAL production fixture bytes, expiry arithmetic | kpoolHelpers decoders + worker expiry contract | AUTO ✅ |
| T1 | create game duration=15 → inspect create-request elog + strike-window elog | form → API → game.config → postCluster (the 15-became-40 leg) | AUTO |
| T2 | strike → txRead detail=1 → decode bodyBytesHex → assert 15 | postCluster → deal.js → signed bytes | AUTO |
| T3 | strike → worker "expiry set" elog: usedDurationS=15, source=record | worker input priority (record → bytes → default) | AUTO |
| T4 | let it lapse → resolveTxFailed broadcast by validStart+15+10(+5) | worker deadline arithmetic + cadence | AUTO |
| T5 | board: kdiag board:signing:window shows durationSource=broadcast, expiry=validStart+15s from the FIRST event (no fallback-guess flash) | getTxPublicRecord broadcast → boardDetectSigning priority | MANUAL→AUTO |
| T6 | board: wiper + 🟥 verdict within ~2s of tx vanishing from pending; banner staged ⏳→✍ across validStart when txDelaySeconds > 0 | signal-driven verdict + banner stages | MANUAL |
| T7 | pre-deploy tx (no broadcast field): countdown upgrades fallback→bytes-decode when the signstatus poll lands (visible in board:signing:window) | source-priority fallback chain | MANUAL |
T1–T4 are backend-only (curl + log grep — no browser, no WC): natural katrun scenario when automated
(KATRUN-KFLOW1 pattern; kflowSpec.js already defines the test:start→test:verdict unit shape). T5–T7 need the board;
kdiag events (board:signing:window, board:signstatus.validDurationSeconds, backend
KATOMIA-VALIDDUR1 elogs) are the assertion surface for kflow units per KFLOW1.
| Item | Where seen | Status |
| Offer animation missing on own drops (touch) | Samsung S6 tablet, KY564 1/300 | fix shipped 2026-07-15 (own-move skip removed) — retest |
| NFT under coin label | same session | band fix shipped — retest |
| Thumbs render as text on some browsers | Edge/Firefox/mobile (BOARD-POLISH1) | open, enrichment/thumb-cache family |
| Auto-association dotted-red false alarm | HashPack auto-assoc accounts | advice pending (SIGN-ASSETASSOC1) — cue should check free slots |
Maintenance: add a row when a bug is found or a feature lands; promote MANUAL→AUTO as the headless-WC
suite grows. Served at /m/katomia/kontext/qa-test-dimensions.html.