Gap Analysis Report #309

Closed
opened 2026-06-13 06:56:41 +00:00 by PlasticDigits · 32 comments
PlasticDigits commented 2026-06-13 06:56:41 +00:00 (Migrated from gitlab.com)
No description provided.
PlasticDigits commented 2026-06-13 07:02:52 +00:00 (Migrated from gitlab.com)

Gap Analysis Report — Yieldomega (GitLab #309)

Date: 2026-06-13
Branch: main (synced with origin/main)
Scope: Full-repo gap analysis — contracts, frontend, indexer, scripts, CI, docs, bots
Method: Product spec review (time-arena.md, arena-v2.md, invariants), automated test runs, codebase exploration


Executive Summary

Yieldomega Arena v2 is substantially implemented across all three packages: onchain core (TimeArena, PodiumVaults, routing libraries), indexer HTTP API (GET /v1/arena/*), and a unified play surface at / with AUDIT at /arena/protocol. Automated gates are strong at the unit layer (157/162 Forge tests, 632 Vitest tests, 43 Rust tests) but integration and E2E coverage lag behind documented invariants.

The largest gaps fall into five themes:

  1. Spec ↔ implementation drift — WarBow BP bonuses declared but unwired; CRED buy charm-weight dilution of DOUB-funded pools; product docs (time-arena.md, arena-views.md, content audit) stale vs shipped UI (route / vs /arena, podiums on AUDIT only).
  2. Indexer event coverage incomplete — Six live TimeArena events lack durable Postgres projections (LevelUp, FeatureUnlocked, FirstBuyCredScheduled, PausedSet, WarbowPodiumFinalized, WarBowFlagClaimed no-op persist).
  3. CI / testing pyramid gap — 15+ Anvil+Postgres verify scripts are invariant gates but not in CI; merge-gate Playwright is chain-less UI smoke; Stage 2 integration has no workflow; Rabby wrong-network gates are manual-only.
  4. Frontend UX/docs misalignment — Decision row and sub-nav removed but docs still require them; forbidden "sale" copy on play surface; WarBow targets skip wallet profile modal; large untested page components (ArenaSimplePage, useArenaSaleSession).
  5. Ops / production readiness — Epic #238 maintainer sign-off (#259) open; MegaETH WSS realtime (#237) deferred; DoubPresaleVesting in mainnet registry without indexer ingest path.

Risk posture: No obvious fund-theft vectors without owner keys. Highest risks are economic (CRED dilution), centralization (finalizeWarbowPodium), stranded WarBow DOUB, and stale derived indexer state when eth_call side-effects fail silently.


Test Suite Results

Package Command Result Notes
Contracts forge test 157 pass / 5 fail 4× DoubAirdropMegaethFork (missing doub.csv); 1× DevStackIntegration (cooldown env)
Indexer cargo clippy -D warnings + cargo test PASS 39 unit + 4 integration
Frontend typecheck + npm test PASS 116 files, 632 tests; lint not run in this pass (21 warnings known)

Findings by Area

1. Contracts — Features vs Spec

Sev Finding Detail
High WarBow ambush / streak-break BP unwired WARBOW_AMBUSH_BONUS_BP (200) and WARBOW_STREAK_BREAK_MULT_BP (100) declared in TimeArena.sol but never applied in _applyBuyWarBowBp or steal/revenge paths
High buyWithCred dilutes epoch CRED pool _accrueCharmOnly adds epochCharmWad without contributing to epochCredPool; CRED-only buyer can claim pro-rata share of DOUB-funded 35-CRED pool
High WarBow DOUB stranded in TimeArena Steal/guard/revenge pulls accumulate DOUB in arena contract; no routing to vaults or owner sweep
High "Always live" vs deadline gate _requireLive() blocks all buys/WarBow after Last Buy deadline until rollPodiumEpoch(0); conflicts with arena-v2 "always live when not paused"
High Pause blocks flag claim claimWarBowFlag uses _requireLive() → blocked when paused; ops doc says flag claim is not paused (#264)
High finalizeWarbowPodium owner-trusted Admin supplies winner addresses off-chain; no on-chain BP enforcement at finalize
Med Prize-routing remainder target Spec says remainder → Time Booster (cat 1); code assigns amount % 4 to cat 3 (WarBow)
Med time-arena.md stale Uncapped XP vs MAX_PLAYER_LEVEL = 5; first-buy 150 CRED vs FIRST_BUY_CRED_BONUS = 1100e18 in code
Med WarBow DOUB not prize-funded Unlike buys, WarBow spends don't increment totalDoubRaised or prize vaults — should be explicit in spec
Low DRY / gas Duplicated charm bounds; up to 12 safeTransfers per buy; bubble-sort on 3 podium slots (negligible)

2. Contracts — Security & Testing

Sev Finding Detail
Med Missing negative tests Pause blocking buy/WarBow/flag; steal-band reverts; revenge expiry; double finalize; rebasing DOUB (NonStandardERC20.t.sol referenced but absent)
Med AdminSellVault legacy surface Comment says "30% admin share"; notifyFunded never called from TimeArena (0% admin on buys #300)
Low doubOwedForBuy not view May call Kumbaya spot/TWAP; surprises integrators
✅ Well mitigated Balance-delta parity (#123), ReentrancyGuard, router-only buyFor, UUPS + onlyOwner, fee-on-transfer check

3. Frontend — Features & UX

Sev Finding Detail
Crit Docs/spec drift vs shipped UI Play route is / not /arena; four-podium grid only on AUDIT (/arena/protocol); decision row removed; ArenaSubnav (BUY+AUDIT) not rendered
High Forbidden "sale" copy ArenaSimplePage.tsx: "The sale has not opened yet…" — violates content audit (#298) always-live framing
High Wallet profile gap on WarBow ArenaWarbowHeroPanel PlayerIdentity lacks onOpenProfile → explorer links instead of modal (#258)
High Major components untested ArenaSimplePage, ArenaWarbowHeroPanel, ArenaCharmCredCard, useArenaSaleSession (~1600 LOC), WalletProfileModal shell
High Dead/orphan UI modules TimerHeroLiveBuys.tsx, ArenaBuyModals.tsx not imported; arena-live-buys-modals.spec.ts tests retired UI
Med Accessibility gaps No axe/Playwright a11y suite; WarBow listbox lacks arrow-key roving; modal focus-trap untested
Med ESLint warnings 21 warnings (react-refresh, hook deps in useArenaSaleSession)
✅ Compliant Indexer-first display (#301 static gate); shared primitives (#294); arena CSS naming (#280)

4. Indexer — API & Ingest

Sev Finding Detail
Crit INV-INDEXER-112 incomplete Six TimeArena events lack durable projections: FirstBuyCredScheduled, LevelUp, FeatureUnlocked, PausedSet, WarbowPodiumFinalized, WarBowFlagClaimed (decode + no-op persist)
Crit DoubPresaleVesting registry without ingest Mainnet registry lists proxy; zero decode/migrate/API path
High BuyViaKumbaya blind spot TimeArenaBuyRouter excluded from index_addresses(); Kumbaya-routed buys may be invisible
High Best-effort ingest side-effects WarBow BP and live podium eth_call failures log warn but don't fail block tx → stale derived tables
High Missing platform-usage API (#231) Documented aggregates have DB primitives but no route; AUDIT falls back to timers
High Silent API data loss List handlers drop corrupt rows via filter_map without error
Med RPC load (#306) Chain timer poller ~30+ JSON-RPC calls/cycle at 1 Hz; ingest adds more per log
Med Deferred realtime (#237) No WSS, SSE, or GET /v1/realtime/*; browsers must poll
Med Design doc drift design.md omits last-buy-epoch-pricing and warbow/latest-bp (both implemented)
Low Offset pagination only Design asks for cursor watermarks; all lists use limit/offset

5. Testing, CI & Ops

Sev Finding Detail
Crit Stage 2 integration no CI workflow Needs chain + DB + wallet; only manual run log exists
Crit 15+ Anvil verify scripts not in CI verify-podium-live-anvil.sh, verify-wallet-profile-anvil.sh, verify-cred-buy-anvil.sh, etc. — invariant gates, local-only
Crit Merge-gate Playwright chain-less Placeholder addresses; all anvil-*.spec.ts skip unless ANVIL_E2E=1
Crit Indexer-first not in E2E e2e-anvil.sh sets empty VITE_INDEXER_URL
Crit Rabby wrong-network (#95) manual-only Mock wallet cannot switch chains; verify-rabby-chain-mismatch.sh Cloud Agent only
High npm run lint missing from CI Invariant #301 lists lint; frontend-test job runs typecheck + test only
High Anvil E2E dispatch-only e2e-anvil.yml manual; excludes anvil-referrals.spec.ts by default
High Production sign-off open (#259) Epic #238 maintainer QA table not accepted
High MegaETH WSS (#237) deferred Since 2026-05-30 replan; enforced by local script only
Med Script DRY debt 8+ verify scripts duplicate Anvil/indexer spawn boilerplate; dual Kumbaya env aliases
Med Doc dead links e2e-anvil.md references nonexistent anvil-collection.spec.ts
Med Legacy TimeCurve script verify-timecurve-post-end-gates-anvil.sh still present
Low GitLab vs GitHub CI Repo on GitLab; CI is GitHub Actions only — no pipeline parity documented

6. Documentation & Agent Phases

Sev Finding Detail
Med Dual product specs time-arena.md vs arena-v2.md — progression, CRED bonus, remainder routing disagree
Med Content audit vs E2E vs code Three sources disagree on route, podiums placement, sub-nav, decision row
Med Phase 14 prompt stale Says "propose workflow" but workflows exist; Stage 2/3 exit criteria still manual
Med Invariants doc large (~800 lines) No generated CI-vs-local matrix
Low Phases 7–8 retired No completion checklist for doc cleanup (#274, #276)

7. Bots & Simulations

Sev Finding Detail
Med Naming drift bots/timearena/ but Python package timecurve_bot; CI job bots-timecurve-test
Low No stack integration Bot pytest in CI; no E2E with live Anvil stack
✅ Covered simulations-test and bots-timecurve-test in merge gate

Coverage Matrix (Spec → Code → Test → CI)

Feature Onchain Indexer Frontend Unit tests Anvil verify CI
DOUB buy + 100% podium routing ✅ ✅ ✅ ✅ strong ✅ partial (forge only)
Epoch CHARM +10%/day (#305) ✅ ✅ ✅ ✅ ✅ forge only
buyWithCred (#268) ✅ ⚠️ dilution partial ✅ partial ✅ script script local
Four podium timers (#271) ✅ ✅ ✅ ✅ ✅ forge only
WarBow PvP (#252) ✅ ⚠️ BP gaps partial ✅ ⚠️ profile ✅ partial none
Wallet profile (#258) N/A ✅ partial vitest ✅ script script local
Indexer-first display (#301) N/A N/A ✅ vitest static ❌ ❌
Referral flat CRED (#272) ✅ ✅ ✅ ✅ partial forge only
Realtime WSS (#237) N/A ❌ deferred N/A defer script defer script ❌
Wrong-network gate (#95) N/A N/A ✅ vitest logic ❌ Rabby manual

P0 — Economic / security clarity (contracts)

  1. Resolve CRED dilution (H2) — Exclude CRED buys from epochCharmWad pro-rata, or document + test intentional economics.
  2. Wire or remove WarBow BP constants (H1) — Implement ambush/streak-break in _applyBuyWarBowBp or delete dead constants.
  3. Align liveness + pause semantics (H4/H5) — Decide post-deadline behavior and flag-claim-during-pause; add Forge negative tests.

P1 — Indexer completeness

  1. Close #112 event gaps — Persist at minimum LevelUp, FeatureUnlocked, WarBowFlagClaimed, PausedSet, WarbowPodiumFinalized, FirstBuyCredScheduled.
  2. Harden ingest side-effects — Fail block or queue retry when podium/BP snapshot eth_call fails.
  3. Decide BuyViaKumbaya scope — Add router to registry + decode, or document co-emission of Buy.

P2 — Frontend / docs reconciliation

  1. Update product docs — arena-views.md, content audit, time-arena.md to match shipped IA (/ play, AUDIT podiums, header nav).
  2. Fix forbidden copy — Replace "sale has not opened" with always-live language.
  3. Wire wallet profile through WarBow panel — Pass onOpenWalletProfile to PlayerIdentity.
  4. Quarantine dead code — Remove or archive TimerHeroLiveBuys, ArenaBuyModals, orphaned E2E spec.

P3 — CI / testing pyramid

  1. Add npm run lint to frontend-test job — Align with invariant #301.
  2. Tier-2 CI job (nightly) — Run verify-issue-237-wss-deferred.sh, check-frontend-vite-env.sh, one representative Anvil+PG script.
  3. Stage 2 CI spike — Postgres service + verify-podium-live-anvil.sh-class script on schedule.
  4. Extend Anvil E2E defaults — Include anvil-referrals.spec.ts; run with indexer URL set for #301 smoke.

P4 — Ops / production

  1. Complete #259 maintainer sign-off — DeployProduction QA table.
  2. DoubPresaleVesting — Add indexer path or remove from mainnet registry until ready.
  3. Extract shared verify helper — Reduce Anvil+indexer+Postgres script duplication.
  4. Track #237 / #231 as explicit delivery milestones with acceptance criteria.

Artifacts

# Gap Analysis Report — Yieldomega (GitLab #309) **Date:** 2026-06-13 **Branch:** `main` (synced with `origin/main`) **Scope:** Full-repo gap analysis — contracts, frontend, indexer, scripts, CI, docs, bots **Method:** Product spec review (`time-arena.md`, `arena-v2.md`, invariants), automated test runs, codebase exploration --- ## Executive Summary Yieldomega Arena v2 is **substantially implemented** across all three packages: onchain core (`TimeArena`, `PodiumVaults`, routing libraries), indexer HTTP API (`GET /v1/arena/*`), and a unified play surface at `/` with AUDIT at `/arena/protocol`. Automated gates are strong at the unit layer (**157/162** Forge tests, **632** Vitest tests, **43** Rust tests) but **integration and E2E coverage lag behind documented invariants**. The largest gaps fall into five themes: 1. **Spec ↔ implementation drift** — WarBow BP bonuses declared but unwired; CRED buy charm-weight dilution of DOUB-funded pools; product docs (`time-arena.md`, `arena-views.md`, content audit) stale vs shipped UI (route `/` vs `/arena`, podiums on AUDIT only). 2. **Indexer event coverage incomplete** — Six live `TimeArena` events lack durable Postgres projections (`LevelUp`, `FeatureUnlocked`, `FirstBuyCredScheduled`, `PausedSet`, `WarbowPodiumFinalized`, `WarBowFlagClaimed` no-op persist). 3. **CI / testing pyramid gap** — 15+ Anvil+Postgres verify scripts are invariant gates but **not in CI**; merge-gate Playwright is chain-less UI smoke; Stage 2 integration has no workflow; Rabby wrong-network gates are manual-only. 4. **Frontend UX/docs misalignment** — Decision row and sub-nav removed but docs still require them; forbidden "sale" copy on play surface; WarBow targets skip wallet profile modal; large untested page components (`ArenaSimplePage`, `useArenaSaleSession`). 5. **Ops / production readiness** — Epic #238 maintainer sign-off (#259) open; MegaETH WSS realtime (#237) deferred; `DoubPresaleVesting` in mainnet registry without indexer ingest path. **Risk posture:** No obvious fund-theft vectors without owner keys. Highest risks are economic (CRED dilution), centralization (`finalizeWarbowPodium`), stranded WarBow DOUB, and stale derived indexer state when `eth_call` side-effects fail silently. --- ## Test Suite Results | Package | Command | Result | Notes | |---------|---------|--------|-------| | Contracts | `forge test` | **157 pass / 5 fail** | 4× `DoubAirdropMegaethFork` (missing `doub.csv`); 1× `DevStackIntegration` (cooldown env) | | Indexer | `cargo clippy -D warnings` + `cargo test` | **PASS** | 39 unit + 4 integration | | Frontend | `typecheck` + `npm test` | **PASS** | 116 files, 632 tests; lint not run in this pass (21 warnings known) | --- ## Findings by Area ### 1. Contracts — Features vs Spec | Sev | Finding | Detail | |-----|---------|--------| | **High** | WarBow ambush / streak-break BP unwired | `WARBOW_AMBUSH_BONUS_BP` (200) and `WARBOW_STREAK_BREAK_MULT_BP` (100) declared in `TimeArena.sol` but never applied in `_applyBuyWarBowBp` or steal/revenge paths | | **High** | `buyWithCred` dilutes epoch CRED pool | `_accrueCharmOnly` adds `epochCharmWad` without contributing to `epochCredPool`; CRED-only buyer can claim pro-rata share of DOUB-funded 35-CRED pool | | **High** | WarBow DOUB stranded in `TimeArena` | Steal/guard/revenge pulls accumulate DOUB in arena contract; no routing to vaults or owner sweep | | **High** | "Always live" vs deadline gate | `_requireLive()` blocks all buys/WarBow after Last Buy deadline until `rollPodiumEpoch(0)`; conflicts with arena-v2 "always live when not paused" | | **High** | Pause blocks flag claim | `claimWarBowFlag` uses `_requireLive()` → blocked when paused; ops doc says flag claim is not paused (#264) | | **High** | `finalizeWarbowPodium` owner-trusted | Admin supplies winner addresses off-chain; no on-chain BP enforcement at finalize | | **Med** | Prize-routing remainder target | Spec says remainder → Time Booster (cat 1); code assigns `amount % 4` to cat 3 (WarBow) | | **Med** | `time-arena.md` stale | Uncapped XP vs `MAX_PLAYER_LEVEL = 5`; first-buy 150 CRED vs `FIRST_BUY_CRED_BONUS = 1100e18` in code | | **Med** | WarBow DOUB not prize-funded | Unlike buys, WarBow spends don't increment `totalDoubRaised` or prize vaults — should be explicit in spec | | **Low** | DRY / gas | Duplicated charm bounds; up to 12 `safeTransfer`s per buy; bubble-sort on 3 podium slots (negligible) | ### 2. Contracts — Security & Testing | Sev | Finding | Detail | |-----|---------|--------| | **Med** | Missing negative tests | Pause blocking buy/WarBow/flag; steal-band reverts; revenge expiry; double finalize; rebasing DOUB (`NonStandardERC20.t.sol` referenced but absent) | | **Med** | `AdminSellVault` legacy surface | Comment says "30% admin share"; `notifyFunded` never called from `TimeArena` (0% admin on buys #300) | | **Low** | `doubOwedForBuy` not `view` | May call Kumbaya spot/TWAP; surprises integrators | | ✅ | Well mitigated | Balance-delta parity (#123), ReentrancyGuard, router-only `buyFor`, UUPS + onlyOwner, fee-on-transfer check | ### 3. Frontend — Features & UX | Sev | Finding | Detail | |-----|---------|--------| | **Crit** | Docs/spec drift vs shipped UI | Play route is `/` not `/arena`; four-podium grid only on AUDIT (`/arena/protocol`); decision row removed; `ArenaSubnav` (BUY+AUDIT) not rendered | | **High** | Forbidden "sale" copy | `ArenaSimplePage.tsx`: "The sale has not opened yet…" — violates content audit (#298) always-live framing | | **High** | Wallet profile gap on WarBow | `ArenaWarbowHeroPanel` `PlayerIdentity` lacks `onOpenProfile` → explorer links instead of modal (#258) | | **High** | Major components untested | `ArenaSimplePage`, `ArenaWarbowHeroPanel`, `ArenaCharmCredCard`, `useArenaSaleSession` (~1600 LOC), `WalletProfileModal` shell | | **High** | Dead/orphan UI modules | `TimerHeroLiveBuys.tsx`, `ArenaBuyModals.tsx` not imported; `arena-live-buys-modals.spec.ts` tests retired UI | | **Med** | Accessibility gaps | No axe/Playwright a11y suite; WarBow listbox lacks arrow-key roving; modal focus-trap untested | | **Med** | ESLint warnings | 21 warnings (react-refresh, hook deps in `useArenaSaleSession`) | | ✅ | Compliant | Indexer-first display (#301 static gate); shared primitives (#294); arena CSS naming (#280) | ### 4. Indexer — API & Ingest | Sev | Finding | Detail | |-----|---------|--------| | **Crit** | `INV-INDEXER-112` incomplete | Six `TimeArena` events lack durable projections: `FirstBuyCredScheduled`, `LevelUp`, `FeatureUnlocked`, `PausedSet`, `WarbowPodiumFinalized`, `WarBowFlagClaimed` (decode + no-op persist) | | **Crit** | `DoubPresaleVesting` registry without ingest | Mainnet registry lists proxy; zero decode/migrate/API path | | **High** | `BuyViaKumbaya` blind spot | `TimeArenaBuyRouter` excluded from `index_addresses()`; Kumbaya-routed buys may be invisible | | **High** | Best-effort ingest side-effects | WarBow BP and live podium `eth_call` failures log warn but don't fail block tx → stale derived tables | | **High** | Missing platform-usage API (#231) | Documented aggregates have DB primitives but no route; AUDIT falls back to timers | | **High** | Silent API data loss | List handlers drop corrupt rows via `filter_map` without error | | **Med** | RPC load (#306) | Chain timer poller ~30+ JSON-RPC calls/cycle at 1 Hz; ingest adds more per log | | **Med** | Deferred realtime (#237) | No WSS, SSE, or `GET /v1/realtime/*`; browsers must poll | | **Med** | Design doc drift | `design.md` omits `last-buy-epoch-pricing` and `warbow/latest-bp` (both implemented) | | **Low** | Offset pagination only | Design asks for cursor watermarks; all lists use limit/offset | ### 5. Testing, CI & Ops | Sev | Finding | Detail | |-----|---------|--------| | **Crit** | Stage 2 integration no CI workflow | Needs chain + DB + wallet; only manual run log exists | | **Crit** | 15+ Anvil verify scripts not in CI | `verify-podium-live-anvil.sh`, `verify-wallet-profile-anvil.sh`, `verify-cred-buy-anvil.sh`, etc. — invariant gates, local-only | | **Crit** | Merge-gate Playwright chain-less | Placeholder addresses; all `anvil-*.spec.ts` skip unless `ANVIL_E2E=1` | | **Crit** | Indexer-first not in E2E | `e2e-anvil.sh` sets empty `VITE_INDEXER_URL` | | **Crit** | Rabby wrong-network (#95) manual-only | Mock wallet cannot switch chains; `verify-rabby-chain-mismatch.sh` Cloud Agent only | | **High** | `npm run lint` missing from CI | Invariant #301 lists lint; `frontend-test` job runs typecheck + test only | | **High** | Anvil E2E dispatch-only | `e2e-anvil.yml` manual; excludes `anvil-referrals.spec.ts` by default | | **High** | Production sign-off open (#259) | Epic #238 maintainer QA table not accepted | | **High** | MegaETH WSS (#237) deferred | Since 2026-05-30 replan; enforced by local script only | | **Med** | Script DRY debt | 8+ verify scripts duplicate Anvil/indexer spawn boilerplate; dual Kumbaya env aliases | | **Med** | Doc dead links | `e2e-anvil.md` references nonexistent `anvil-collection.spec.ts` | | **Med** | Legacy TimeCurve script | `verify-timecurve-post-end-gates-anvil.sh` still present | | **Low** | GitLab vs GitHub CI | Repo on GitLab; CI is GitHub Actions only — no pipeline parity documented | ### 6. Documentation & Agent Phases | Sev | Finding | Detail | |-----|---------|--------| | **Med** | Dual product specs | `time-arena.md` vs `arena-v2.md` — progression, CRED bonus, remainder routing disagree | | **Med** | Content audit vs E2E vs code | Three sources disagree on route, podiums placement, sub-nav, decision row | | **Med** | Phase 14 prompt stale | Says "propose workflow" but workflows exist; Stage 2/3 exit criteria still manual | | **Med** | Invariants doc large (~800 lines) | No generated CI-vs-local matrix | | **Low** | Phases 7–8 retired | No completion checklist for doc cleanup (#274, #276) | ### 7. Bots & Simulations | Sev | Finding | Detail | |-----|---------|--------| | **Med** | Naming drift | `bots/timearena/` but Python package `timecurve_bot`; CI job `bots-timecurve-test` | | **Low** | No stack integration | Bot pytest in CI; no E2E with live Anvil stack | | ✅ | Covered | `simulations-test` and `bots-timecurve-test` in merge gate | --- ## Coverage Matrix (Spec → Code → Test → CI) | Feature | Onchain | Indexer | Frontend | Unit tests | Anvil verify | CI | |---------|---------|---------|----------|------------|--------------|-----| | DOUB buy + 100% podium routing | ✅ | ✅ | ✅ | ✅ strong | ✅ | partial (forge only) | | Epoch CHARM +10%/day (#305) | ✅ | ✅ | ✅ | ✅ | ✅ | forge only | | `buyWithCred` (#268) | ✅ ⚠️ dilution | partial | ✅ | partial | ✅ script | script local | | Four podium timers (#271) | ✅ | ✅ | ✅ | ✅ | ✅ | forge only | | WarBow PvP (#252) | ✅ ⚠️ BP gaps | partial | ✅ ⚠️ profile | ✅ | partial | none | | Wallet profile (#258) | N/A | ✅ | partial | vitest | ✅ script | script local | | Indexer-first display (#301) | N/A | N/A | ✅ | vitest static | ❌ | ❌ | | Referral flat CRED (#272) | ✅ | ✅ | ✅ | ✅ | partial | forge only | | Realtime WSS (#237) | N/A | ❌ deferred | N/A | defer script | defer script | ❌ | | Wrong-network gate (#95) | N/A | N/A | ✅ | vitest logic | ❌ | Rabby manual | --- ## Recommended Next Steps (Priority Order) ### P0 — Economic / security clarity (contracts) 1. **Resolve CRED dilution (H2)** — Exclude CRED buys from `epochCharmWad` pro-rata, or document + test intentional economics. 2. **Wire or remove WarBow BP constants (H1)** — Implement ambush/streak-break in `_applyBuyWarBowBp` or delete dead constants. 3. **Align liveness + pause semantics (H4/H5)** — Decide post-deadline behavior and flag-claim-during-pause; add Forge negative tests. ### P1 — Indexer completeness 4. **Close #112 event gaps** — Persist at minimum `LevelUp`, `FeatureUnlocked`, `WarBowFlagClaimed`, `PausedSet`, `WarbowPodiumFinalized`, `FirstBuyCredScheduled`. 5. **Harden ingest side-effects** — Fail block or queue retry when podium/BP snapshot `eth_call` fails. 6. **Decide `BuyViaKumbaya` scope** — Add router to registry + decode, or document co-emission of `Buy`. ### P2 — Frontend / docs reconciliation 7. **Update product docs** — `arena-views.md`, content audit, `time-arena.md` to match shipped IA (`/` play, AUDIT podiums, header nav). 8. **Fix forbidden copy** — Replace "sale has not opened" with always-live language. 9. **Wire wallet profile through WarBow panel** — Pass `onOpenWalletProfile` to `PlayerIdentity`. 10. **Quarantine dead code** — Remove or archive `TimerHeroLiveBuys`, `ArenaBuyModals`, orphaned E2E spec. ### P3 — CI / testing pyramid 11. **Add `npm run lint` to `frontend-test` job** — Align with invariant #301. 12. **Tier-2 CI job (nightly)** — Run `verify-issue-237-wss-deferred.sh`, `check-frontend-vite-env.sh`, one representative Anvil+PG script. 13. **Stage 2 CI spike** — Postgres service + `verify-podium-live-anvil.sh`-class script on schedule. 14. **Extend Anvil E2E defaults** — Include `anvil-referrals.spec.ts`; run with indexer URL set for #301 smoke. ### P4 — Ops / production 15. **Complete #259 maintainer sign-off** — DeployProduction QA table. 16. **`DoubPresaleVesting`** — Add indexer path or remove from mainnet registry until ready. 17. **Extract shared verify helper** — Reduce Anvil+indexer+Postgres script duplication. 18. **Track #237 / #231** as explicit delivery milestones with acceptance criteria. --- ## Artifacts - Full report path: `gaps/GAP_1781334121.md` - Issue: https://gitlab.com/PlasticDigits/yieldomega/-/issues/309 - Invariants reference: `docs/testing/invariants-and-business-logic.md` - Test strategy: `docs/testing/strategy.md`
PlasticDigits commented 2026-06-13 07:29:30 +00:00 (Migrated from gitlab.com)

Approved

  • WarBow ambush / streak-break BP unwired - fix
  • buyWithCred dilutes epoch CRED pool - should also add 35 CRED to pool
  • WarBow DOUB stranded in TimeArena - sHould be routed same way as any other DOUB
  • "Always live" vs deadline gate - should not block (unless paused), instead buys/WarBow after last buy deadline should autoroll
  • Pause blocks flag claim - Docs are wrong, all actions should be blocked when paused
  • finalizeWarbowPodium owner-trusted - New autoroll system must be enforced onchain, need a cheap way to track rankings onchain. Need to benchmark with 10k players
  • Prize-routing remainder target - Spec is wrong, remainder should go to lastbuy
  • time-arena.md stale - update docs to match implementation
  • WarBow DOUB not prize-funded - WarBow DOUB should increase totalDoubRaised and route to prize vaults just like any normal buy
  • DRY / gas - fix, optimize
  • Missing negative tests - fix
  • AdminSellVault legacy surface - remove, no platform take
  • doubOwedForBuy not view - Check when twap needed and document
  • Docs/spec drift vs shipped UI - fix docs/spec to match shipped ui
  • Forbidden "sale" copy - fix
  • Wallet profile gap on WarBow - fix
  • Major components untested - fix
  • Dead/orphan UI modules - fix
  • Accessibility gaps - fix
  • ESLint warnings - fix
  • INV-INDEXER-112 incomplete - fix
  • DoubPresaleVesting registry without ingest - remove, no longer used
  • BuyViaKumbaya blind spot - fix
  • Best-effort ingest side-effects - fix
  • Missing platform-usage API - fix
  • Silent API data loss - fix
  • Design doc drift - update to max implementation
  • Offset pagination only - fix
  • Indexer-first not in E2E - fix
  • npm run lint missing from CI - fix
  • Anvil E2E dispatch-only - fix
  • Script DRY debt - fix
  • Doc dead links - fix
  • Legacy TimeCurve script - remove
  • GitLab vs GitHub CI - We are using gitlab not github, and CI must be kept minimal to reduce load on gitlab servers
  • Dual product specs - Update based on latest timestamps and implementation, highlight decision points that are non obvious
  • Content audit vs E2E vs code - Update based on latest timestamps and implementation, highlight decision points that are non obvious
  • Phase 14 prompt stale - remove
  • Invariants doc large (~800 lines) - cleanup
  • Phases 7–8 retired - cleanup
  • Naming drift - update

Rejected

  • RPC load (#306) - handled in 306
  • Deferred realtime (#237) - deferred
  • Stage 2 integration no CI workflow - Rejected, too much overhead
  • 15+ Anvil verify scripts not in CI - Rejected, too much overhead
  • Merge-gate Playwright chain-less - Rejected, post mainnet
  • Rabby wrong-network (#95 (closed)) manual-only - Rejected, excessive complexity
  • Production sign-off open (#259 (closed)) - Rejected, closed is acceptance
  • MegaETH WSS (#237) deferred - will be Handled in 237
  • No stack integration - Too much overhead

P0

  1. CRED buys should also add CRED to the pool & generate CHARM (claimable by charm holders). Buys are to buy CHARM and the utility of CHARM is claiming CRED
  2. Approved
  3. Approved
    P1
  4. Approved
  5. Approved
  6. Approved
    P2
  7. Approved
  8. Approved
  9. Approved
  10. Approved, remove not archive
    P3
  11. Approved
  12. Rejected, too much overhead
  13. Rejected, too much overhead
  14. Approved
    P4
  15. Rejected, closure was signoff
  16. Approved, remove
  17. Approved
  18. Rejected, handled seperately
Approved * WarBow ambush / streak-break BP unwired - fix * buyWithCred dilutes epoch CRED pool - should also add 35 CRED to pool * WarBow DOUB stranded in TimeArena - sHould be routed same way as any other DOUB * "Always live" vs deadline gate - should not block (unless paused), instead buys/WarBow after last buy deadline should autoroll * Pause blocks flag claim - Docs are wrong, all actions should be blocked when paused * finalizeWarbowPodium owner-trusted - New autoroll system must be enforced onchain, need a cheap way to track rankings onchain. Need to benchmark with 10k players * Prize-routing remainder target - Spec is wrong, remainder should go to lastbuy * time-arena.md stale - update docs to match implementation * WarBow DOUB not prize-funded - WarBow DOUB should increase totalDoubRaised and route to prize vaults just like any normal buy * DRY / gas - fix, optimize * Missing negative tests - fix * AdminSellVault legacy surface - remove, no platform take * doubOwedForBuy not view - Check when twap needed and document * Docs/spec drift vs shipped UI - fix docs/spec to match shipped ui * Forbidden "sale" copy - fix * Wallet profile gap on WarBow - fix * Major components untested - fix * Dead/orphan UI modules - fix * Accessibility gaps - fix * ESLint warnings - fix * INV-INDEXER-112 incomplete - fix * DoubPresaleVesting registry without ingest - remove, no longer used * BuyViaKumbaya blind spot - fix * Best-effort ingest side-effects - fix * Missing platform-usage API - fix * Silent API data loss - fix * Design doc drift - update to max implementation * Offset pagination only - fix * Indexer-first not in E2E - fix * npm run lint missing from CI - fix * Anvil E2E dispatch-only - fix * Script DRY debt - fix * Doc dead links - fix * Legacy TimeCurve script - remove * GitLab vs GitHub CI - We are using gitlab not github, and CI must be kept minimal to reduce load on gitlab servers * Dual product specs - Update based on latest timestamps and implementation, highlight decision points that are non obvious * Content audit vs E2E vs code - Update based on latest timestamps and implementation, highlight decision points that are non obvious * Phase 14 prompt stale - remove * Invariants doc large (~800 lines) - cleanup * Phases 7–8 retired - cleanup * Naming drift - update Rejected * RPC load (#306) - handled in 306 * Deferred realtime (#237) - deferred * Stage 2 integration no CI workflow - Rejected, too much overhead * 15+ Anvil verify scripts not in CI - Rejected, too much overhead * Merge-gate Playwright chain-less - Rejected, post mainnet * Rabby wrong-network (#95 (closed)) manual-only - Rejected, excessive complexity * Production sign-off open (#259 (closed)) - Rejected, closed is acceptance * MegaETH WSS (#237) deferred - will be Handled in 237 * No stack integration - Too much overhead P0 1. CRED buys should also add CRED to the pool & generate CHARM (claimable by charm holders). Buys are to buy CHARM and the utility of CHARM is claiming CRED 2. Approved 3. Approved P1 4. Approved 5. Approved 6. Approved P2 7. Approved 8. Approved 9. Approved 10. Approved, remove not archive P3 11. Approved 12. Rejected, too much overhead 13. Rejected, too much overhead 14. Approved P4 15. Rejected, closure was signoff 16. Approved, remove 17. Approved 18. Rejected, handled seperately
PlasticDigits commented 2026-06-13 07:34:16 +00:00 (Migrated from gitlab.com)

mentioned in issue #310

mentioned in issue #310
PlasticDigits commented 2026-06-13 07:34:17 +00:00 (Migrated from gitlab.com)

mentioned in issue #311

mentioned in issue #311
PlasticDigits commented 2026-06-13 07:34:18 +00:00 (Migrated from gitlab.com)

mentioned in issue #312

mentioned in issue #312
PlasticDigits commented 2026-06-13 07:34:19 +00:00 (Migrated from gitlab.com)

mentioned in issue #313

mentioned in issue #313
PlasticDigits commented 2026-06-13 07:34:20 +00:00 (Migrated from gitlab.com)

mentioned in issue #314

mentioned in issue #314
PlasticDigits commented 2026-06-13 07:34:25 +00:00 (Migrated from gitlab.com)

mentioned in issue #315

mentioned in issue #315
PlasticDigits commented 2026-06-13 07:34:26 +00:00 (Migrated from gitlab.com)

mentioned in issue #316

mentioned in issue #316
PlasticDigits commented 2026-06-13 07:34:26 +00:00 (Migrated from gitlab.com)

mentioned in issue #317

mentioned in issue #317
PlasticDigits commented 2026-06-13 07:34:27 +00:00 (Migrated from gitlab.com)

mentioned in issue #318

mentioned in issue #318
PlasticDigits commented 2026-06-13 07:34:27 +00:00 (Migrated from gitlab.com)

mentioned in issue #320

mentioned in issue #320
PlasticDigits commented 2026-06-13 07:34:27 +00:00 (Migrated from gitlab.com)

mentioned in issue #319

mentioned in issue #319
PlasticDigits commented 2026-06-13 07:34:28 +00:00 (Migrated from gitlab.com)

mentioned in issue #321

mentioned in issue #321
PlasticDigits commented 2026-06-13 07:34:28 +00:00 (Migrated from gitlab.com)

mentioned in issue #322

mentioned in issue #322
PlasticDigits commented 2026-06-13 07:34:28 +00:00 (Migrated from gitlab.com)

mentioned in issue #323

mentioned in issue #323
PlasticDigits commented 2026-06-13 07:34:29 +00:00 (Migrated from gitlab.com)

mentioned in issue #324

mentioned in issue #324
PlasticDigits commented 2026-06-13 07:34:42 +00:00 (Migrated from gitlab.com)

Child issues opened from gap analysis triage

Approved items from the 2026-06-13 triage comment were bundled into 15 child issues. No prior child issues existed on #309.

Opened (15)

Issue Bundle Approved items covered
#310 Contracts — WarBow economics WarBow ambush/streak-break BP unwired; WarBow DOUB stranded; WarBow DOUB not prize-funded
#311 Contracts — CRED pool buyWithCred dilutes epoch CRED pool (add 35 CRED per buy)
#312 Contracts — autoroll "Always live" vs deadline gate; finalizeWarbowPodium owner-trusted → onchain autoroll + 10k benchmark
#313 Contracts — routing Prize-routing remainder → Last Buy
#314 Contracts — legacy removal AdminSellVault legacy surface
#315 Contracts — integrator docs doubOwedForBuy not view
#316 Contracts — quality Missing negative tests; DRY / gas
#317 Indexer — ingest INV-INDEXER-112 incomplete; best-effort ingest side-effects
#318 Frontend — UX Forbidden "sale" copy; wallet profile gap on WarBow
#319 Indexer — API/registry DoubPresaleVesting remove; BuyViaKumbaya; platform-usage API; silent API data loss; cursor pagination
#320 Docs — product/ops time-arena.md stale; dual product specs; content audit vs E2E vs code; docs/spec drift; pause docs; indexer design.md drift
#321 Frontend — quality Major components untested; dead/orphan UI (remove); accessibility; ESLint warnings
#322 CI / E2E npm run lint missing from CI; indexer-first not in E2E; Anvil E2E dispatch-only; GitLab vs GitHub CI (minimal GitLab)
#323 Docs / bots Phase 14 prompt stale; invariants doc cleanup; Phases 7–8 retired; bots naming drift
#324 Scripts / docs links Script DRY debt; legacy TimeCurve script; doc dead links

Skipped — rejected

Item Reason
RPC load (#306) Handled in #306
Deferred realtime (#237) Deferred
Stage 2 integration no CI workflow Too much overhead
15+ Anvil verify scripts not in CI Too much overhead
Merge-gate Playwright chain-less Post mainnet
Rabby wrong-network (#95) manual-only Excessive complexity
Production sign-off (#259) Closed = acceptance
MegaETH WSS (#237) Handled in #237
Tier-2 CI nightly job (P3-12) Too much overhead
Stage 2 CI spike (P3-13) Too much overhead
Track #237 / #231 milestones (P4-18) Handled separately
No stack integration (bots) Too much overhead

Skipped — already tracked elsewhere

Item Note
RPC load #306
MegaETH WSS / realtime #237

Bundle notes

  • Contracts split into six implementation issues (#310–#316) plus routing (#313) to keep MRs reviewable; autoroll (#312) coordinates with indexer event work (#317).
  • Frontend split UX (#318) vs quality (#321) so copy/profile can ship independently of test/a11y debt.
  • Indexer split ingest (#317) vs API/registry (#319).
  • Docs product reconciliation (#320) separate from agent/invariants/bots housekeeping (#323).
  • CI (#322) documents minimal GitLab posture per approval — no GitLab pipeline duplication of heavy Anvil gates.
## Child issues opened from gap analysis triage Approved items from the 2026-06-13 triage comment were bundled into **15 child issues**. No prior child issues existed on #309. ### Opened (15) | Issue | Bundle | Approved items covered | |-------|--------|------------------------| | #310 | Contracts — WarBow economics | WarBow ambush/streak-break BP unwired; WarBow DOUB stranded; WarBow DOUB not prize-funded | | #311 | Contracts — CRED pool | `buyWithCred` dilutes epoch CRED pool (add 35 CRED per buy) | | #312 | Contracts — autoroll | "Always live" vs deadline gate; `finalizeWarbowPodium` owner-trusted → onchain autoroll + 10k benchmark | | #313 | Contracts — routing | Prize-routing remainder → Last Buy | | #314 | Contracts — legacy removal | `AdminSellVault` legacy surface | | #315 | Contracts — integrator docs | `doubOwedForBuy` not `view` | | #316 | Contracts — quality | Missing negative tests; DRY / gas | | #317 | Indexer — ingest | `INV-INDEXER-112` incomplete; best-effort ingest side-effects | | #318 | Frontend — UX | Forbidden "sale" copy; wallet profile gap on WarBow | | #319 | Indexer — API/registry | `DoubPresaleVesting` remove; `BuyViaKumbaya`; platform-usage API; silent API data loss; cursor pagination | | #320 | Docs — product/ops | `time-arena.md` stale; dual product specs; content audit vs E2E vs code; docs/spec drift; pause docs; indexer `design.md` drift | | #321 | Frontend — quality | Major components untested; dead/orphan UI (remove); accessibility; ESLint warnings | | #322 | CI / E2E | `npm run lint` missing from CI; indexer-first not in E2E; Anvil E2E dispatch-only; GitLab vs GitHub CI (minimal GitLab) | | #323 | Docs / bots | Phase 14 prompt stale; invariants doc cleanup; Phases 7–8 retired; bots naming drift | | #324 | Scripts / docs links | Script DRY debt; legacy TimeCurve script; doc dead links | ### Skipped — rejected | Item | Reason | |------|--------| | RPC load (#306) | Handled in #306 | | Deferred realtime (#237) | Deferred | | Stage 2 integration no CI workflow | Too much overhead | | 15+ Anvil verify scripts not in CI | Too much overhead | | Merge-gate Playwright chain-less | Post mainnet | | Rabby wrong-network (#95) manual-only | Excessive complexity | | Production sign-off (#259) | Closed = acceptance | | MegaETH WSS (#237) | Handled in #237 | | Tier-2 CI nightly job (P3-12) | Too much overhead | | Stage 2 CI spike (P3-13) | Too much overhead | | Track #237 / #231 milestones (P4-18) | Handled separately | | No stack integration (bots) | Too much overhead | ### Skipped — already tracked elsewhere | Item | Note | |------|------| | RPC load | #306 | | MegaETH WSS / realtime | #237 | ### Bundle notes - **Contracts** split into six implementation issues (#310–#316) plus routing (#313) to keep MRs reviewable; autoroll (#312) coordinates with indexer event work (#317). - **Frontend** split UX (#318) vs quality (#321) so copy/profile can ship independently of test/a11y debt. - **Indexer** split ingest (#317) vs API/registry (#319). - **Docs** product reconciliation (#320) separate from agent/invariants/bots housekeeping (#323). - **CI** (#322) documents minimal GitLab posture per approval — no GitLab pipeline duplication of heavy Anvil gates.
PlasticDigits (Migrated from gitlab.com) closed this issue 2026-06-13 07:53:11 +00:00
PlasticDigits commented 2026-06-13 07:58:37 +00:00 (Migrated from gitlab.com)

mentioned in merge request !457

mentioned in merge request !457
PlasticDigits commented 2026-06-13 07:59:22 +00:00 (Migrated from gitlab.com)

mentioned in commit d034ca7be7

mentioned in commit d034ca7be7d74fdbfa64621544734c053b786617
PlasticDigits commented 2026-06-13 07:59:34 +00:00 (Migrated from gitlab.com)

mentioned in merge request !458

mentioned in merge request !458
PlasticDigits commented 2026-06-13 08:08:37 +00:00 (Migrated from gitlab.com)

mentioned in merge request !461

mentioned in merge request !461
PlasticDigits commented 2026-06-13 08:13:01 +00:00 (Migrated from gitlab.com)

mentioned in merge request !462

mentioned in merge request !462
PlasticDigits commented 2026-06-13 10:19:34 +00:00 (Migrated from gitlab.com)

mentioned in merge request !465

mentioned in merge request !465
PlasticDigits commented 2026-06-13 12:53:07 +00:00 (Migrated from gitlab.com)

mentioned in merge request !466

mentioned in merge request !466
PlasticDigits commented 2026-06-13 12:53:27 +00:00 (Migrated from gitlab.com)

mentioned in merge request !467

mentioned in merge request !467
PlasticDigits commented 2026-06-13 12:56:15 +00:00 (Migrated from gitlab.com)

mentioned in merge request !468

mentioned in merge request !468
PlasticDigits commented 2026-06-13 13:11:24 +00:00 (Migrated from gitlab.com)

mentioned in merge request !471

mentioned in merge request !471
PlasticDigits commented 2026-06-14 02:45:24 +00:00 (Migrated from gitlab.com)

mentioned in merge request !476

mentioned in merge request !476
PlasticDigits commented 2026-06-14 02:51:47 +00:00 (Migrated from gitlab.com)

mentioned in commit f8484fc658

mentioned in commit f8484fc6587c04cd56e8f900ddd19b82f0231186
PlasticDigits commented 2026-06-14 02:52:04 +00:00 (Migrated from gitlab.com)

mentioned in merge request !480

mentioned in merge request !480
PlasticDigits commented 2026-06-14 05:38:32 +00:00 (Migrated from gitlab.com)

mentioned in merge request !486

mentioned in merge request !486
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#309
No description provided.