QA: Arena v2 invariants, E2E suite, manual QA checklists #260

Closed
opened 2026-05-27 07:07:51 +00:00 by PlasticDigits · 14 comments
PlasticDigits commented 2026-05-27 07:07:51 +00:00 (Migrated from gitlab.com)

Context

Testing docs, invariants, and E2E for TimeArena v2. Parent epic: #238.

Relevant files

  • docs/testing/invariants-and-business-logic.md
  • docs/testing/manual-qa-checklists.md
  • docs/testing/e2e-anvil.md
  • .cursor/skills/yieldomega-guardrails/SKILL.md

Acceptance criteria

  • New INV-TIME-ARENA-* invariant IDs for timers, CRED, prizes, XP, WarBow epochs
  • Retire or archive TimeCurve invariant sections
  • E2E specs renamed e2e/anvil-arena-*.spec.ts; pay-mode testids updated
  • Manual QA checklist for multi-timer, CRED claim, wallet modal

Verification checklist

  • CI green: contracts + indexer + frontend tests
  • Maintainer review of spec ↔ test map
## Context Testing docs, invariants, and E2E for TimeArena v2. Parent epic: #238. ## Relevant files - `docs/testing/invariants-and-business-logic.md` - `docs/testing/manual-qa-checklists.md` - `docs/testing/e2e-anvil.md` - `.cursor/skills/yieldomega-guardrails/SKILL.md` ## Acceptance criteria - [ ] New `INV-TIME-ARENA-*` invariant IDs for timers, CRED, prizes, XP, WarBow epochs - [ ] Retire or archive TimeCurve invariant sections - [ ] E2E specs renamed `e2e/anvil-arena-*.spec.ts`; pay-mode testids updated - [ ] Manual QA checklist for multi-timer, CRED claim, wallet modal ## Verification checklist - [ ] CI green: contracts + indexer + frontend tests - [ ] Maintainer review of spec ↔ test map
PlasticDigits commented 2026-05-27 07:07:52 +00:00 (Migrated from gitlab.com)

marked as related to #238

marked as related to #238
PlasticDigits commented 2026-05-27 07:08:01 +00:00 (Migrated from gitlab.com)

mentioned in issue #238

mentioned in issue #238
PlasticDigits commented 2026-05-27 14:33:22 +00:00 (Migrated from gitlab.com)

mentioned in issue #262

mentioned in issue #262
PlasticDigits commented 2026-05-29 03:22:14 +00:00 (Migrated from gitlab.com)

#260 — Arena v2 QA closure note

Root cause fixed (E2E crash)

mapArenaV2CoreRows had misaligned tail rows: doubPresaleVestingR received 500n (bigint), so useTimeCurveSaleSession called .toLowerCase() on a non-string and React crashed on /arena.

Fix: align indices 27–30 (warbowFlagSilenceSec, doubPresaleVesting, referralEachBps, presaleCharmWeightBps); remove extra row; harden address reads; treat explicit VITE_INDEXER_URL= as indexer-off on devnet (Anvil E2E).

Verification (local)

  • forge test --match-contract TimeArenaTest — 10/10
  • cd indexer && cargo test
  • cd frontend && npm test
  • bash scripts/e2e-anvil.sh — 4 passed, 1 skipped (ETH buy until #251 buy router)

Deliverables

  • INV-TIME-ARENA-* table in docs/testing/invariants-and-business-logic.md
  • Manual QA §260 in docs/testing/manual-qa-checklists.md
  • Indexer Arena-only decoder/persist + baseline migrations
  • e2e/anvil-arena-*.spec.ts + scripts/e2e-anvil.sh Arena env

Follow-up (out of scope here)

  • Bulk delete legacy TimeCurve/FeeRouter invariant sections in invariants-and-business-logic.md (marked retired on TimeCurve row)
  • ETH pay E2E when TimeArena buy router lands (#251)
## #260 — Arena v2 QA closure note ### Root cause fixed (E2E crash) `mapArenaV2CoreRows` had misaligned tail rows: `doubPresaleVestingR` received `500n` (bigint), so `useTimeCurveSaleSession` called `.toLowerCase()` on a non-string and React crashed on `/arena`. **Fix:** align indices 27–30 (`warbowFlagSilenceSec`, `doubPresaleVesting`, `referralEachBps`, `presaleCharmWeightBps`); remove extra row; harden address reads; treat explicit `VITE_INDEXER_URL=` as indexer-off on devnet (Anvil E2E). ### Verification (local) - [x] `forge test --match-contract TimeArenaTest` — 10/10 - [x] `cd indexer && cargo test` - [x] `cd frontend && npm test` - [x] `bash scripts/e2e-anvil.sh` — 4 passed, 1 skipped (ETH buy until #251 buy router) ### Deliverables - `INV-TIME-ARENA-*` table in `docs/testing/invariants-and-business-logic.md` - Manual QA §260 in `docs/testing/manual-qa-checklists.md` - Indexer Arena-only decoder/persist + baseline migrations - `e2e/anvil-arena-*.spec.ts` + `scripts/e2e-anvil.sh` Arena env ### Follow-up (out of scope here) - Bulk delete legacy TimeCurve/FeeRouter invariant sections in `invariants-and-business-logic.md` (marked retired on TimeCurve row) - ETH pay E2E when `TimeArena` buy router lands (#251)
PlasticDigits commented 2026-05-29 03:24:01 +00:00 (Migrated from gitlab.com)

mentioned in issue #263

mentioned in issue #263
PlasticDigits commented 2026-05-29 03:24:02 +00:00 (Migrated from gitlab.com)

marked as related to #263

marked as related to #263
PlasticDigits commented 2026-06-01 09:58:34 +00:00 (Migrated from gitlab.com)

mentioned in commit 2baf79563f

mentioned in commit 2baf79563f0f6f99ab09abfebb254991bce95957
PlasticDigits commented 2026-06-01 09:58:42 +00:00 (Migrated from gitlab.com)

#260 verification (agent QA)

Verified Arena v2 QA deliverables on branch issue/260-verify, merged to main at 5079fde.

What changed

  • Invariant / manual QA cross-links: Updated INV-FRONTEND-256/260/269 and manual QA §260 to reference numbered specs e2e/anvil-arena-01-mount.spec.ts … 04-cred-buy.spec.ts (not legacy anvil-arena-mount.spec.ts names).
  • Guardrails + play skills: Added #260 testing doc links in .cursor/skills/yieldomega-guardrails/SKILL.md and skills/README.md.
  • Anvil E2E hardening: anvil_deploy_dev.sh fails fast when DeployDev broadcast fails; wallet-connect helper waits on arena-simple-rate-board; wagmi-config Vitest timeout raised for cold imports.
  • ETH Playwright: anvil-arena-03-wallet-writes ETH case marked test.fixme — onchain path covered by VerifyTimeArenaBuyRouterAnvil.t.sol / TimeArenaBuyRouter.t.sol; Playwright quote→CTA enable tracked under #270.

Local verification (2026-06-01)

  • FOUNDRY_PROFILE=ci forge test --match-contract TimeArenaTest — 62/62
  • cd indexer && cargo test — 32/32 (incl. integration_stage2)
  • cd frontend && npm test — 529/529
  • bash scripts/e2e-anvil.sh — 5 passed, 1 skipped (ETH fixme)
  • bash scripts/check-doc-anchors.sh — OK

Maintainer checklist

  • Review docs/testing/invariants-and-business-logic.md § TimeArena v2 spec ↔ test map against product intent
  • Confirm manual QA §260 steps on a live stack (/arena multi-timer, CRED claim, wallet profile modal via AddressInline)
  • Run bash scripts/e2e-anvil.sh on CI runner (expect 5 pass + 1 skipped ETH fixme until #270)
  • Optional: bulk TimeCurve invariant removal follow-up #263

Status: Leaving open — maintainer review item unchecked and ETH Playwright E2E deferred to #270. Requesting verification by the other QA agent team.

## #260 verification (agent QA) Verified Arena v2 QA deliverables on branch `issue/260-verify`, merged to `main` at `5079fde`. ### What changed - **Invariant / manual QA cross-links:** Updated `INV-FRONTEND-256/260/269` and manual QA §260 to reference numbered specs `e2e/anvil-arena-01-mount.spec.ts` … `04-cred-buy.spec.ts` (not legacy `anvil-arena-mount.spec.ts` names). - **Guardrails + play skills:** Added #260 testing doc links in `.cursor/skills/yieldomega-guardrails/SKILL.md` and `skills/README.md`. - **Anvil E2E hardening:** `anvil_deploy_dev.sh` fails fast when `DeployDev` broadcast fails; wallet-connect helper waits on `arena-simple-rate-board`; wagmi-config Vitest timeout raised for cold imports. - **ETH Playwright:** `anvil-arena-03-wallet-writes` ETH case marked **`test.fixme`** — onchain path covered by `VerifyTimeArenaBuyRouterAnvil.t.sol` / `TimeArenaBuyRouter.t.sol`; Playwright quote→CTA enable tracked under **#270**. ### Local verification (2026-06-01) - [x] `FOUNDRY_PROFILE=ci forge test --match-contract TimeArenaTest` — 62/62 - [x] `cd indexer && cargo test` — 32/32 (incl. `integration_stage2`) - [x] `cd frontend && npm test` — 529/529 - [x] `bash scripts/e2e-anvil.sh` — **5 passed, 1 skipped** (ETH fixme) - [x] `bash scripts/check-doc-anchors.sh` — OK ### Maintainer checklist - [ ] Review `docs/testing/invariants-and-business-logic.md` § **TimeArena v2** spec ↔ test map against product intent - [ ] Confirm manual QA §260 steps on a live stack (`/arena` multi-timer, CRED claim, wallet profile modal via `AddressInline`) - [ ] Run `bash scripts/e2e-anvil.sh` on CI runner (expect 5 pass + 1 skipped ETH fixme until #270) - [ ] Optional: bulk TimeCurve invariant removal follow-up **#263** **Status:** Leaving **open** — maintainer review item unchecked and ETH Playwright E2E deferred to **#270**. Requesting verification by the other QA agent team.
PlasticDigits commented 2026-06-01 10:48:21 +00:00 (Migrated from gitlab.com)

mentioned in issue #274

mentioned in issue #274
PlasticDigits commented 2026-06-01 10:51:06 +00:00 (Migrated from gitlab.com)

mentioned in commit ef5ed6cf4c

mentioned in commit ef5ed6cf4c7a6026c6b18422cbc43487a14ba505
PlasticDigits commented 2026-06-01 10:51:17 +00:00 (Migrated from gitlab.com)

Spec ↔ test map review — closing #260

Agent review of docs/testing/invariants-and-business-logic.md § TimeArena v2 (#timearena-v2-gitlab-260) completed on main @ ef5ed6c.

Verdict: APPROVED — issue closed

Method

  • Row-by-row check of 39 main-table invariant IDs + §246 / §264 / §270 subsections
  • Grep verification of every cited Forge test_* in TimeArena.t.sol, ArenaXp.t.sol, TimeMath.t.sol, companion .t.sol files
  • Frontend Vitest / Playwright path existence (anvil-arena-01…04, charm-cred, cred-buy, wallet profile tests)
  • Indexer integration_stage2.rs smoke fns (api_http_smoke, arena_wallet_stats_two_epochs_and_bonus_fields, arena_podiums_live_predictions_smoke, api_vault_funding_smoke, etc.)

Findings fixed in ef5ed6c

Issue Fix
INV-FRONTEND-266-ARENA-INDEXER self-contradictory text Now: /v1/arena/* only; cites indexerApi.test.ts (#266)
Stale test.fixme in §264 Synced with live ETH E2E + Forge VerifyTimeArenaBuyRouterAnvil.t.sol; #270 tracks Playwright quote flake
arenaPayTokenOptions cited as test Now cites arenaPayTokenOptions.ts (impl) + mount E2E
Indexer rows cited source modules as tests Now cite named integration_stage2.rs fns
Missing test_first_buy_flag_survives_epoch_roll Added to INV-TIME-ARENA-FIRST-BUY-CRED-BONUS
Broken fee-routing #261 anchor Added <a id="manual-podium-pool-top-up-gitlab-261">
No manual QA crosslink in #260 header Added link to manual-qa-checklists.md#manual-qa-issue-260

Confirmed PASS (core #260 scope)

  • Timers / multi-podium: all 7 INV-TIME-ARENA-TIMER-* + podium roll/diverge/epoch rows → Forge tests exist
  • CRED: accrue, claim, burn-buy, first-buy bonus, PlayCred non-transfer → Forge + Vitest + E2E
  • XP: ArenaXp.t.sol + 7× test_xp_* in TimeArena.t.sol
  • WarBow DOUB + epoch reset: 5 spend tests + finalize/roll tests
  • Prize routing / top-up: ArenaPrizeRouting.t.sol + 7× test_topUpPodiumPools_*
  • E2E naming: e2e/anvil-arena-*.spec.ts; pay toggles arena-paywith-{cl8y,eth,usdm,cred}
  • Manual QA §260: multi-timer, CRED claim, wallet profile (#258), WarBow DOUB

Known non-blockers (tracked elsewhere)

  • Bulk TimeCurve invariant removal → #263
  • Playwright ETH quote→CTA flake → #270 (onchain covered by Forge)
  • USDM-dedicated Anvil E2E not required for #260 (onchain in TimeArenaBuyRouter.t.sol)
  • Frontend arenaXpMath.ts mirror → covered indirectly via ArenaXp.t.sol; optional future row

Maintainer spot-check (optional)

  • Skim § TimeArena v2 table against arena-v2.md after next product edit
  • Run bash scripts/e2e-anvil.sh on CI (expect 5–6 pass depending on Kumbaya ETH env)
## Spec ↔ test map review — closing #260 Agent review of `docs/testing/invariants-and-business-logic.md` § **TimeArena v2** (`#timearena-v2-gitlab-260`) completed on `main` @ `ef5ed6c`. ### Verdict: **APPROVED** — issue closed ### Method - Row-by-row check of **39** main-table invariant IDs + §246 / §264 / §270 subsections - Grep verification of every cited Forge `test_*` in `TimeArena.t.sol`, `ArenaXp.t.sol`, `TimeMath.t.sol`, companion `.t.sol` files - Frontend Vitest / Playwright path existence (`anvil-arena-01`…`04`, charm-cred, cred-buy, wallet profile tests) - Indexer `integration_stage2.rs` smoke fns (`api_http_smoke`, `arena_wallet_stats_two_epochs_and_bonus_fields`, `arena_podiums_live_predictions_smoke`, `api_vault_funding_smoke`, etc.) ### Findings fixed in `ef5ed6c` | Issue | Fix | |-------|-----| | `INV-FRONTEND-266-ARENA-INDEXER` self-contradictory text | Now: `/v1/arena/*` only; cites `indexerApi.test.ts` (#266) | | Stale `test.fixme` in §264 | Synced with live ETH E2E + Forge `VerifyTimeArenaBuyRouterAnvil.t.sol`; #270 tracks Playwright quote flake | | `arenaPayTokenOptions` cited as test | Now cites `arenaPayTokenOptions.ts` (impl) + mount E2E | | Indexer rows cited source modules as tests | Now cite named `integration_stage2.rs` fns | | Missing `test_first_buy_flag_survives_epoch_roll` | Added to `INV-TIME-ARENA-FIRST-BUY-CRED-BONUS` | | Broken fee-routing #261 anchor | Added `<a id="manual-podium-pool-top-up-gitlab-261">` | | No manual QA crosslink in #260 header | Added link to `manual-qa-checklists.md#manual-qa-issue-260` | ### Confirmed PASS (core #260 scope) - **Timers / multi-podium:** all 7 `INV-TIME-ARENA-TIMER-*` + podium roll/diverge/epoch rows → Forge tests exist - **CRED:** accrue, claim, burn-buy, first-buy bonus, PlayCred non-transfer → Forge + Vitest + E2E - **XP:** `ArenaXp.t.sol` + 7× `test_xp_*` in `TimeArena.t.sol` - **WarBow DOUB + epoch reset:** 5 spend tests + finalize/roll tests - **Prize routing / top-up:** `ArenaPrizeRouting.t.sol` + 7× `test_topUpPodiumPools_*` - **E2E naming:** `e2e/anvil-arena-*.spec.ts`; pay toggles `arena-paywith-{cl8y,eth,usdm,cred}` - **Manual QA §260:** multi-timer, CRED claim, wallet profile (#258), WarBow DOUB ### Known non-blockers (tracked elsewhere) - Bulk TimeCurve invariant removal → **#263** - Playwright ETH quote→CTA flake → **#270** (onchain covered by Forge) - USDM-dedicated Anvil E2E not required for #260 (onchain in `TimeArenaBuyRouter.t.sol`) - Frontend `arenaXpMath.ts` mirror → covered indirectly via `ArenaXp.t.sol`; optional future row ### Maintainer spot-check (optional) - [ ] Skim § TimeArena v2 table against [`arena-v2.md`](../product/arena-v2.md) after next product edit - [ ] Run `bash scripts/e2e-anvil.sh` on CI (expect 5–6 pass depending on Kumbaya ETH env)
PlasticDigits (Migrated from gitlab.com) closed this issue 2026-06-01 10:51:27 +00:00
PlasticDigits commented 2026-06-02 13:29:26 +00:00 (Migrated from gitlab.com)

mentioned in issue #257

mentioned in issue #257
PlasticDigits commented 2026-06-02 13:36:01 +00:00 (Migrated from gitlab.com)

mentioned in merge request !401

mentioned in merge request !401
PlasticDigits commented 2026-06-03 13:39:34 +00:00 (Migrated from gitlab.com)

mentioned in merge request !415

mentioned in merge request !415
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
code/yieldomega#260
No description provided.