Gap Analysis Report #331
Labels
No labels
agent:fix_bugfix
agent:fix_conflicts
agent:fix_security
agent:gap_analysis
agent:implement
agent:open_issues
agents
agent:security_audit
agent:verify
area
timecurve
arena
arena-v2
audit
block:feature_review
block:security
bug
contracts
design
devops
docs
documentation
enhancement
epic
feature
frontend
indexer
low priority
megaeth
operations
ops
performance
QA
qa checklist
referrals
removal
security
smart-contracts
tech-debt
testing
time-arena
timecurve
visual-qa
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
code/yieldomega#331
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Focus on a fun, clear ux that can be played in short bursts throughout the day, has a clear sense of progression, clear visual hierarchy for someone making a quick glance in between other tasks, and has a clear sense of "a battle is happening" whenever the dapp is opened.
Gap Analysis Report — GitLab #331
Date: 2026-06-19
Scope: Fun, glanceable play UX for short daily bursts — progression clarity, visual hierarchy, and a persistent “battle is happening” feel on open.
Branch:
main(synced)Report path:
gaps/GAP_1781838538.mdExecutive summary
Yieldomega’s Arena v2 stack is mechanically mature: onchain
TimeArenacovers four podium timers, XP/level progression (L1–L5), WarBow PvP, and rich buy events; the indexer exposes timers, podiums, buys, activity, wallet stats, and platform usage; the play surface (/→ArenaSimplePage) is a polished command console with hero countdown, podium carousel, inline CHARM buy, progression gates (#299), and WarBow at L4+.Against issue #331’s UX goals, the largest gaps are spectator energy and glance hierarchy on the play route, not missing core game logic:
/; steals/guards invisible; static first paint until pollsTest health (local run): contracts (non-fork) ~200+ PASS;
TimeArenaTest115/115; indexer 80/80; frontend Vitest 694/694; frontend lint 1 error (prefer-constinuseArenaPendingRevengeTargets.ts) would fail CI merge gate. Anvil E2E and arena verify scripts are not merge-gated.Strategic takeaway: Close #331 primarily on the frontend play surface by reusing existing indexer feeds and components already shipped on AUDIT (
/arena/protocol), plus small API polish (polled_at_ms, optional “since last visit”). Onchain/indexer foundations are sufficient; the product gap is what the player sees in the first 3 seconds on/.Findings by theme
1. “Battle is happening” — Critical
What works
ArenaTimerHerourgency styling (timer-hero--warning/--critical) and rising sparks.useLastBuyHeadShakeNonce+ trophy shake on new Last Buy head.usePeerBuyHeadSfx/useArenaSimplePageSfx— bell on peer head buy; timer heartbeat under 13m / 2m.timeArenaUx.ts— rich battle narratives (hard reset, ambush, streak break).ArenaWarbowHeroPanel— steal/guard/revenge at L4+.chain_timerpoller: 1s fast near deadlines, 3s idle max (chain_timer_poll.rs).Gaps
ArenaLiveBuysActivitySectionwired inArenaProtocolPage.tsx; E2E explicitly assertsarena-live-buys-activitycount 0 on/(e2e/arena.spec.tsL45–46). Play route polls buys only (fetchArenaBuysAsBuyItems, 5s backoff) — notfetchArenaActivity(steals/guards/revenges).ActivePlayerIndicatornever mountedActivePlayerIndicator.tsx) and is exported; no imports elsewhere infrontend/.—) until indexer responds; no skeleton “last buy 12s ago” strip.platform-usageAPI built but unused on playfetchArenaPlatformUsageinindexerApi.ts;PlatformUsageSubsection.tsxorphaned — network velocity never surfaces on/.ArenaWarbowGatePreviewis decorative (aria-hidden) not live indexer head.useChangedRankBurstonArenaSimplePodiumSection(AUDIT grid); carousel slides lack equivalent motion.2. Quick-glance visual hierarchy — High
What works
docs/frontend/arena-views.md(#291): carousel on/, four-podium grid on/arena/protocol.arena-command-consoleglass layout with Last Buy as primary column (ArenaSimplePage.tsx).ArenaTimerChips— compact per-podium countdown + top-3 rows in side rail.Gaps
<h2>(formatTimerSectionTitle/useTimerPodiumSlideMeta) competes with hero digits inside carousel.phaseBadge("saleActive")used onArenaProtocolPage, notArenaSimplePage.ArenaPodiumTimerChip.tsx— epoch, countdown, viewer score, 3 places with prize + score per chip.arena-command-console__warbow-laneafter main grid.RootLayout.tsx— noIndexerStatusBaron/during play.3. Progression sense — High
What works
XpGained,LevelUp,FeatureUnlockedevents; level cap 5 (arena-v2.md,TimeArena.t.sol).GET /v1/arena/wallet/{address}/stats—level,xp_toward_next, prizes, epoch CHARM/CRED.FEATURE_UNLOCK_LEVELmatrix (#299),LockedUntilLevel,FeatureMechanicModalon level-up, buy projected-effects pills.Gaps
ArenaXpHeroinsideArenaCharmCredCard(“YOUR WALLET”), not adjacent to timer/buy CTA.ARENA_PROGRESSION_TIERSdefined inarenaProgression.ts(“shown in the XP hero lock row”) but only referenced in tests;indexerFirstDisplay.test.tsassertsarena-xp-hero__tiersabsent.lockWalletSurfacebefore first buy — little “do one thing now” path.FeatureMechanicModal— paragraphs, not a quick burst reward moment.idx_arena_feature_unlockedpersisted (persist.rs); wallet stats echo current level only.4. Short-burst playability — Medium
What works
YIELDOMEGA_DEPLOY_NO_COOLDOWN=1for rapid QA buys.Gaps
TimeArena.buyCooldownSecdefault 300 (DeployProduction.s.sol,DevStackIntegration.t.sol); conflicts with “several actions per day” burst fantasy on mainnet.ArenaSimplePage.tsxfor a 30-second session.5. Contracts & onchain — Low (for #331)
Strengths: 115
TimeArenaTestcases covering timers, podiums, XP, WarBow, routing, gas bounds (test_xp_high_level_buy_gas_bounded_no_level_up,TimeArenaWarbowBenchmark.t.sol). Four independent podium deadlines; scoring/timer split documented inPARAMETERS.md.Minor gaps relevant to UX delivery:
buyCooldownSecis intentional anti-spam; tune for burst UX if #331 is authoritative over cooldown policy.TimeArenaABI surface — correct per spec but increases integrator/audit load.6. Indexer & API — Medium
Strengths: Routes for timers, podiums, buys, activity (union SQL), wallet stats, WarBow, platform-usage; integration smoke in
integration_stage2.rs.Gaps
polled_at_msnot in/v1/arena/timersHTTP bodychain_timer.rs; frontend usesDate.now()(indexerApi.ts) — countdown drift vs indexer poll time.VITE_INDEXER_URL, display hooks return empty — correct architecture, weak offline/battle-resumed story.7. Frontend engineering quality — Medium
mainuseArenaPendingRevengeTargets.tsL41prefer-const— CInpm run lintfails.ArenaXp.sol+arenaXpMath.ts— drift risk for progression UI.fetchLegacyArenaSaleState/coreReadRowsFromArenaTimersbridge TimeCurve-shaped types.8. Testing & CI — High
What runs and passes locally
FOUNDRY_PROFILE=ci forge test --no-match-contract Forkcargo testnpm testnpm run typechecknpm run lintCoverage holes for #331 UX
arena.spec.tschecks mount + intentional absence of activity feed; no assertions for XP bar, carousel navigation, peer-buy visual feedback, progression unlock, WarBow flows.verify-podium-live-anvil.sh,verify-wallet-profile-anvil.sh, etc. exist locally but not in.github/workflows/unit-tests.yml.e2e-anvil.ymlisworkflow_dispatchonly — not merge gate.YIELDOMEGA_E2E_INDEXER=1path documented but optional.frontend-content-audit.md; not automated in CI.timeArenaUx.test.ts, carousel locks, head-shake nonce); weak on “battle on open” and progression glance.Recommended next steps
P0 — Battle energy on
/(closes #331 core)ArenaLiveBuysActivitySection(or wireActivePlayerIndicator+ last buy) above/belowArenaTimerHero, reusinglistBuyImpactTicksfromtimeArenaUx.ts. Keep dense feed on AUDIT.phaseBadge("saleActive")near timer panel title (parity with AUDIT).ArenaSimplePagebuy loop tofetchArenaActivity(or faster dedicated endpoint) at ≤3s to include steals/guards/revenges.ActivePlayerIndicatoron peer head buy / timer extension (samerecentBuyssource as SFX/shake).P1 — Glance hierarchy & progression
ARENA_PROGRESSION_TIERSinArenaXpHero— 5-icon unlock roadmap (unlocked / next / locked); updateindexerFirstDisplay.test.tsexpectation.ArenaTimerHeroown the countdown glance.ArenaTimerChips/ indexer timers) without full AUDIT grid.buildArenaBuyProjectedEffectLines).P2 — Backend polish & burst policy
polled_at_msin/v1/arena/timers— align client countdown with indexer poll instant.GET /v1/arena/session-summary?address=&since=for re-open energy.platform-usageon play — compact “arena intensity” chip using existing API.P3 — Testing & CI
useArenaPendingRevengeTargets.ts(constnotlet).anvil-arena-03-wallet-writes.spec.tsto assert visible activity after Anvil buy on/.frontend-content-audit.md— live strip, progression glance, battle-on-open checklist.verify-wallet-profile-anvil.sh) when Postgres + Anvil runner available.Test run log
Generated by gap-analysis agent workflow for GitLab #331. No MR opened; no commit made per issue instructions.
Tradeoff is complexity - users want activity but not excessive ux elements. Most of the proposed ideas involve increasing the complexity of the ux, which is not acceptable. Additionally, warbow is an advanced play feature, and users battle for timers immediately - all 4 are competitive. The side cards are visually large and visible, so do not need to be updated.
Approved ONLY:
SYSTEM: Must include full unit, e2e, fuzz, and happy/sad path tests
polled_at_ms not in /v1/arena/timers HTTP body: Fix
Shallow API integration tests: Fix
Frontend UX unit tests: Add for existing features & for new visual ones, must be done after all visual issues closed
E2E play feel: Add for existing features & for new visual ones, must be done after all visual issues closed
VISUAL: As these are VISUAL they must comply with our Cyberminimalist Glass System global design standard, and verification must include uploading a screenshot to the issue demonstrating compliance on both desktop, tablet, and mobile.
Locks dominate new wallets: Instead, locked elements except for the next level (eg if level 1, only show locks on level 2) to reduce visual load.
Level-up celebration is text modal: Create a confetti burst popover with Level Up and verty concise text explaining unlocked feature. But only for Level 2+ (since Level 1 is just connecting new wallet)
Feature-unlock history ingested, not served: Store the UTC timestamp in our database for each wallet when it reached a levelup, and deliver that via the indexer to be displayed in the account view modal we already have (shown when users click a player in the app). Show in a Level History session with 1, 2, 3, 4,5 where level 1 is there first buy, and levels 2-5 is when they leveld up. Shown in local time.
No post-buy micro-moment on play: Add a toast for each effect the buy had, that fades fairly quickly
No “while you were away” summary: Indexer should store delta between now and last time that browser was closed, stored per browser not per wallet. :While You Were Away" Modal opens when reopened. Should show time passed, if an epoch ended for any of the podiums (if so then who the winners were, the prizes, and a congratulations if they were a winner), their ranking change (if any), show number of buys, updates to podiums, number of unique players,
mentioned in issue #332
mentioned in issue #333
mentioned in issue #334
mentioned in issue #335
mentioned in issue #336
mentioned in issue #337
mentioned in issue #338
mentioned in issue #339
mentioned in issue #340
Child issues opened from gap analysis triage
Reviewed parent comment (2026-06-19) — approved items only. Related work bundled; rejected complexity / undecided UX expansions skipped.
Opened (8)
polled_at_msonGET /v1/arena/timers+ deepen integration test JSON shape assertionsLockedUntilLevelonly on next unlock tier (not L3–L5 when at L1)/session-summaryendpoint (since_ms, per-browser localStorage)--workers=5Bundles: (1) indexer timer/API hardening → #333; (2) progression visuals → #334, #335, #336; (3) session feedback visuals → #337, #338; (4) test gate → #339, #340 (depend on visuals).
All issues include parent SYSTEM requirement: unit + integration/E2E + happy/sad paths in their test plans.
Skipped — rejected (UX complexity / explicit review)
Parent: "Tradeoff is complexity… Most proposed ideas involve increasing the complexity of the ux, which is not acceptable." Also: WarBow is advanced; users battle all 4 timers immediately; side cards are visually large — do not update.
/phaseBadge) on playfetchArenaActivityon playActivePlayerIndicatorARENA_PROGRESSION_TIERSin XP heroplatform-usageintensity chip on playSkipped — not listed in approved-only comment
prefer-constlint inuseArenaPendingRevengeTargets.ts#331rows in content audit onlyExecution order (suggested)
No MR opened; no commit made per parent instructions.
mentioned in merge request !509
mentioned in merge request !510
mentioned in commit
916025477amentioned in merge request !514
mentioned in commit
bbf6bbb3f7mentioned in commit
f2d5283eaementioned in merge request !515
mentioned in commit
8f69524756mentioned in commit
0c307de8a5