Transition Gap Analysis #342

Closed
opened 2026-06-25 14:15:53 +00:00 by PlasticDigits · 26 comments
PlasticDigits commented 2026-06-25 14:15:53 +00:00 (Migrated from gitlab.com)

Commonly smart contracts and ux break during state transitions, many of which exist in our dapp including level ups, epoch rolls, prize distrbutuin/claiming, leaderboard changes, and more. Check the behavior, testing, and documentation of state transitions both in contracts, frontend, and indexer, make sure they are properly documented and tested, and propose recommended fixes for gaps.

Commonly smart contracts and ux break during state transitions, many of which exist in our dapp including level ups, epoch rolls, prize distrbutuin/claiming, leaderboard changes, and more. Check the behavior, testing, and documentation of state transitions both in contracts, frontend, and indexer, make sure they are properly documented and tested, and propose recommended fixes for gaps.
PlasticDigits commented 2026-06-25 14:28:39 +00:00 (Migrated from gitlab.com)

Gap Analysis — State Transitions (#342)

Issue: Transition Gap Analysis
Date: 2026-06-25
Branch: main (synced)
Report: gaps/GAP_1782397039.md


Executive summary

Yieldomega’s Arena v2 state machine is well-specified and heavily tested on-chain. Podium rolls, Last Buy epoch re-anchors, CRED claims, XP/level progression, WarBow settlement, and autoroll-on-buy are covered by ~120+ Forge tests, a rich invariant matrix (INV-TIME-ARENA-*), and product docs (time-arena.md, arena-v2.md).

The largest gaps sit at transition boundaries across layers, not in core happy-path contract logic:

  1. Cross-layer timing — The indexer head poller (chain_timer) can advance epochs/deadlines before log ingest catches up; the frontend polls indexer data with placeholderData that latches stale snapshots. Users can see frozen 00:00 timers, old epoch numbers, or stale leaderboards during rollovers.
  2. No unified transition UX — Play route has no explicit states for expired-pending-roll, settling, or epoch-advanced. Permissionless rollPodiumEpoch is documented in copy only; no CTA or settling indicator.
  3. Indexer transition feed incomplete — GET /v1/arena/activity excludes level-ups, CRED claims, podium epoch rolls, and feature unlocks. PodiumTimerArmed is emitted on-chain but not decoded.
  4. Frontend claim lifecycle gaps — claimCred fires writeContractAsync without receipt wait or stats invalidation (unlike claimWarBowFlag).
  5. Contract edge cases untested — Non-commingled PodiumVaults pool wiring, pause behavior during rollPodiumEpoch/claimCred, production MegaETH TWAP hard-reset path integrated with TimeArena.buy, and sparse/empty podium rolls.

Severity distribution: 0 Critical · 5 High · 12 Medium · 8 Low · 4 Info (accepted/documented).

Test suite status (this run):

Package Command Result
Contracts forge test 215 pass / 6 fail — 4 optional fork airdrop tests (missing gitignored doub.csv, expected); 2 Warbow benchmark tests failed (timer not armed, level) — likely env/setup flake, not production regressions
Indexer cargo test 86 pass / 0 fail (80 unit + 6 integration)
Frontend typecheck + lint + npm test 743 pass / 0 fail (3 eslint warnings)

Scope

Per issue #342: analyze behavior, testing, and documentation of state transitions across contracts, frontend, and indexer — including level ups, epoch rolls, prize distribution/claiming, leaderboard changes, sale phase changes, timer rollovers, pause boundaries, and reorg handling.


Transition inventory (current state)

Transition On-chain Indexer ingest API exposure Frontend UX Test depth
Arena start (startArena) TimeArena ArenaStarted /v1/arena/timers Phase badge Good
Last Buy hard reset → epoch bump _reanchorEpochCharmPrice LastBuyEpochStarted, LastBuyEpochCharmAnchored timers + last-buy-epoch-pricing Hero timer rollover Strong
Podium timer arm/extend/reset _armPodiumTimer, _extendPodiumTimer Buy side effects only; PodiumTimerArmed not decoded Head poller deadlines Chips/carousel; unarmed copy Good on-chain; gap indexer decode
Podium epoch roll + payout rollPodiumEpoch, _autorollExpiredPodiums PodiumEpochRolled /podiums, session-summary No settling UI; epoch corner updates on poll Strong on-chain; weak E2E
CRED accrual + claim claimCred CredClaimed wallet stats only ArenaCharmCredCard — no post-tx refresh Strong on-chain
XP / level up _finishBuy + ArenaXp XpGained, LevelUp wallet level_history Celebration popover (L2+) Good unit; no transition E2E
Feature unlock (L1–L5 gates) _finishBuy gates FeatureUnlocked Not listed Carousel locks On-chain good; API gap
WarBow epoch finalize autoroll cat 3 WarbowPodiumFinalized wallet prizes Protocol/docs only Good on-chain
WarBow flag claim claimWarBowFlag WarBow logs wallet stats Button + receipt wait Good
Leaderboard update _updateTopThree, WarBow ranking live podium projection + buy feed /podiums, /buys Leaderboard + head-shake SFX Good unit; poll-lag risk
Pause setPaused PausedSet timers paused Write gates Partial — roll/claim/top-up not in pause matrix
Sale phase (pre-launch → live) arenaStart timestamp Head poller timers/sale-state derivePhase FSM Unit tests; no E2E flip

Findings by area

Contracts — HIGH

H-C1: Non-commingled PodiumVaults pools untested

PodiumVaults.setActivePool / setSeedPool / setFuturePool allow external pool addresses. All Forge tests use default commingled wiring (address(vaults)). Misconfigured production deploy could desync ledger vs ERC-20 balance, causing payout/roll failures or stranded DOUB.

Files: contracts/src/arena/PodiumVaults.sol
Fix: Integration test with separate EOAs — full buy → roll → payout → tranche promotion cycle.

H-C2: Production MegaETH TWAP hard-reset path not integrated in TimeArena tests

TimeArena._sampleCharmAnchor() branches on block.chainid == 4326 → ArenaCharmPriceTwap.compute. Anvil tests use spot oracle. TWAP is tested in isolation (ArenaCharmPriceTwap.t.sol) with optional fork smoke, but no TimeArena.buy hard-reset test on chain 4326.

Risk: DOUB owed at epoch boundary could diverge between test and production paths.
Fix: vm.chainId(4326) test with mocked TWAP or fork; assert lastBuyEpoch, anchor, and doubOwedForBuy.


Contracts — MEDIUM

M-C1: Pause boundary asymmetry undocumented and untested

rollPodiumEpoch, claimCred, and topUpPodiumPools bypass _requireLive() / pause. Pause tests (INV-TIME-ARENA-PAUSE-MUTATING) cover buy/WarBow/flag only.

Fix: Document intended ops behavior in pause-and-final-signoff.md; add test_pause_allows_roll_and_claim or test_pause_blocks_roll per product decision.

M-C2: Sparse/empty podium roll lightly exercised

No explicit tests for poolBal == 0 or zero-address winners during roll. Tranche promotion still runs.

Fix: test_roll_empty_pool_tranche_promotion, test_roll_partial_winners.

M-C3: Same-tx multi-level unlock edge case

_finishBuy uses gateLevel = lvlAfter after XP — a wallet with large XP could unlock L2–L5 timer arms in one buy. Staged tests exist; no single-buy L1→L4+ test.

M-C4: UUPS upgrade smoke missing

Only auth tests for upgrades. No post-upgrade roll/claim/buy smoke.

M-C5: Warbow benchmark tests failing in CI run

TimeArenaWarbowBenchmark.t.sol: test_benchmark_warbow_10k_player_ranking (timer not armed), test_benchmark_warbow_steal_10k_player_ranking (level). Gas benchmarks, not correctness — but failures obscure CI signal.


Contracts — LOW / INFO

  • L-C1: rollSeedToActive standalone path not isolated (#261).
  • L-C2: PlayCred only 2 unit tests; no arena-integrated double-mint edge cases.
  • L-C3: ReferralRegistry.registerCode during live epoch roll — no full TimeArena integration test.
  • L-C4: Fork smoke (TimeArenaFork.t.sol) reads head state only.
  • INFO: WarBow 6-slot ranking accuracy tradeoff documented (#312); autoroll prevents timer expired reverts (#312).

Documentation (contracts): Strong — docs/product/time-arena.md, arena-v2.md, PARAMETERS.md, invariants-and-business-logic.md, docs/architecture/data-flows.md (podium roll flow).


Frontend — HIGH

H-F1: No play-route UX for epoch roll / timer expiry

Timers count to 00:00 with no settling or pending roll state. Copy in podiumCopy.tsx explains mechanics but there is no CTA, spinner, or “waiting for settlement” indicator. Users see frozen countdown until someone rolls on-chain and indexer catches up.

Files: useArenaHeroTimer.ts, ArenaTimerChips.tsx, podiumCopy.tsx

H-F2: Transition visibility bounded by indexer poll lag

All display transitions are poll-driven (1–5s fast, backoff to 30s on failure). React Query placeholderData: (prev) => prev keeps old epoch/standings during refresh. Epoch bump, leaderboard swap, and claimable CRED appear late.

Files: indexer query hooks across usePodiumReads.ts, useArenaHeroTimer.ts, useArenaPlayerLevel.ts

H-F3: Timer clock source split between hero and side chips

Hero uses wall-clock skew (chainNowSec from polled_at_ms + block_timestamp_sec). Non–Last Buy chips use static block_timestamp_sec at last poll — can disagree with hero between polls.

Files: ArenaTimerChips.tsx (L76–86), useTimerPodiumSlideMeta.ts (L77–82)


Frontend — MEDIUM

M-F1: Play route lacks indexer-offline surfacing

useIndexerConnectivity / offline banners exist on protocol page but not ArenaSimplePage.tsx (/). During outage, play UI shows latched stale data with no degraded-mode banner (#96).

M-F2: claimCred has no post-tx lifecycle

ArenaCharmCredCard.tsx calls writeContractAsync only — no waitForWriteReceipt, no invalidateArenaWalletStatsQueries. Contrast with submitClaimWarBowFlag in useArenaSaleSession.ts.

M-F3: No E2E for critical transitions

E2E covers mount/load and buy feel (anvil-arena-05-play-feel.spec.ts, anvil-indexer-first.spec.ts). Missing: pre-launch→live flip, timer zero, CRED/flag claim refresh, competitor buy changing leaderboard rank.

M-F4: Buy RPC event watch active under indexer-first

useWatchContractEvent(Buy) enabled regardless of indexer — triggers RPC refetches alongside polls; potential flicker under load.

M-F5: WarBow finalize — read-only on play route

Operators use protocol/contract directly; no UI feedback when finalize completes.


Frontend — LOW

  • L-F1: Wrong-network blocks writes only; display keeps indexer data — user sees “live” arena but writes fail at action time.
  • L-F2: WYWA modal is return-visit only — active-tab users miss in-session epoch-end recap.
  • L-F3: indexerFirstDisplay.test.ts is static source analysis — runtime RPC reintroduction not caught.
  • L-F4: Referral leaderboard uses separate poll model from arena transitions.

Documentation (frontend): docs/frontend/arena-views.md covers level-up celebration (#335), wallet profile (#336). No dedicated “transition states” UX spec.

Unit test coverage: Good for phase FSM, timer display, level-up celebration logic, buy effect toasts, WYWA activity gate. Gap is runtime transition E2E, not pure-function coverage.


Indexer — HIGH

H-I1: Dual source of truth — head poller vs log ingest

/v1/arena/timers and /podiums epochs come from chain_timer (latest RPC Multicall3). Event tables advance only to chain_pointer. After epoch roll, UI can show new epoch/deadlines before PodiumEpochRolled, live podium rows, or activity reflect the transition.

Files: chain_timer.rs, chain_timer_poll.rs, api_arena.rs, ingestion.rs

H-I2: No unified transition feed

GET /v1/arena/activity union SQL includes only buy, steal, guard, revenge. Excludes level_up, cred_claim, podium_epoch, epoch_started, feature_unlocked. Frontend cannot indexer-first drive celebration/toast stacks for non-buy transitions.

Files: api_arena.rs (ACTIVITY_UNION_SQL)


Indexer — MEDIUM

M-I1: Logs not sorted by log_index before persist

ingestion.rs iterates RPC return order with no sort_by(log_index). Same-block LastBuyEpochStarted after Buy could mis-tag last_buy_epoch on misordered RPC (#278 risk).

M-I2: PodiumTimerArmed not decoded

Emitted in TimeArena.sol; absent from decoder.rs / persist.rs. Timer “armed” transition invisible to API.

M-I3: No confirmation tiers despite design doc

REORG_STRATEGY.md defines realtime/soft/final tiers; no API filter on block_number <= head - N. Leaderboards and wallet stats serve pre-finality data on ~1s MegaETH blocks.

M-I4: No automated reorg E2E

Tests call rollback_after directly; no Anvil reorg walk (find_common_ancestor + re-ingest) script.

M-I5: Ingest RPC side-effects can fail whole block

WarBow BP + live podium eth_calls inside block transaction — transient RPC failure rolls back entire block including transition events.

M-I6: Public /v1/status hides sync lag

chain_pointer / last_indexed_at_ms omitted unless ops flag — clients cannot detect ingest lag.


Indexer — LOW

  • L-I1: FeatureUnlocked / PausedSet indexed but not API-listed historically.
  • L-I2: Retired prize distribution HTTP (fetchArenaPrizeDistributions returns null).
  • L-I3: No script drives live CredClaimed / LevelUp / PodiumEpochRolled end-to-end (verify scripts cover subsets).

Integration tests: integration_stage2.rs — 6 tests pass including reorg rollback for level history (#336), last-buy epoch assignment (#278), session summary podium finalize (#338). Gaps: log ordering, live reorg, transition HTTP surfaces.

Verify scripts (transition-related):

Script Covers
verify-last-buy-epoch-anvil.sh Epoch tagging on buys
verify-podium-live-anvil.sh Live podium vs on-chain
verify-podium-timers-anvil.sh Timer/epoch head alignment
verify-wallet-profile-anvil.sh Level history
verify-vault-funding-anvil.sh Vault funding on buy

Missing: verify-indexer-reorg-anvil.sh, transition activity feed smoke.


Cross-cutting / architecture

flowchart TB
  subgraph risk ["Transition risk window"]
    A[Timer hits zero on-chain]
    B[Autoroll on next buy OR permissionless roll]
    C[Head poller sees new epoch]
    D[Ingest persists PodiumEpochRolled]
    E[Frontend poll reflects change]
  end
  A --> B
  B --> C
  B --> D
  C -->|"often faster"| E
  D -->|"may lag"| E
Concern Contracts Indexer Frontend
Epoch roll correctness Strong Good ingest; head/ingest lag Weak UX
Level up feedback Strong events Wallet stats only Celebration poll-driven
CRED claim Strong Wallet stats only No post-tx refresh
Leaderboard at boundary Strong on-chain Live projection + lag Poll + latched placeholder
Reorg safety N/A (chain finality) Rollback tested synthetically; no live reorg E2E No confirmation tier
Pause during incident Partial coverage Pause via head poller Write gates only

Testing gaps summary

Layer Well covered Gaps
Contracts unit Rolls, autoroll, CRED, XP, WarBow, pause on mutators, epoch charm pricing Non-commingled vaults, pause+roll/claim, sparse roll, TWAP+TimeArena integration, benchmark flake
Indexer integration Event persist, rollback, epoch assignment, wallet level history, session summary Log ordering, reorg E2E, transition activity API
Frontend unit Phase FSM, celebration logic, timer copy, indexer-first static guards Runtime transition wiring
E2E / Anvil Indexer-first load, buy feel, WYWA screenshots Phase flip, timer zero, claims, leaderboard churn
Scripts / smoke Per-feature verify scripts Reorg, full transition feed

DRY, readability, best practices

  • DRY: Transition math is well-factored into libraries (ArenaXp, TimeMath, ArenaPodiumSettlement, ArenaBuyRouting). Frontend has some duplication between hero timer skew and chip timer sources (H-F3) — unify chainNowSec.
  • Gas: WarBow 10k-player benchmarks documented (#312); autoroll multi-category in one tx worth monitoring on congested chains.
  • Language practices: Rust indexer uses transactional block ingest (good). Missing log sort is a correctness best-practice gap. Frontend claimCred should mirror established claimWarBowFlag receipt+invalidation pattern.

P0 — Close cross-layer transition gaps

  1. Define transition state model — Document and implement UX states: live, expired-pending-roll, settling, epoch-advanced, claimable. Map to indexer fields (podium_epochs, podium_prediction, claimable_cred_epoch).
  2. Expose ingest lag on timer/podium responses — Add indexed_head_block (or indexed_through_block) to /v1/arena/timers and /podiums; frontend shows subtle sync indicator when indexed_head_block < chain_head_block.
  3. Extend /v1/arena/activity or add /v1/arena/transitions — Include level_up, cred_claim, podium_epoch, epoch_started, feature_unlocked for indexer-first celebration/toast stacks.

P1 — Harden correctness at boundaries

  1. Sort logs by (block_number, tx_index, log_index) in indexer/src/ingestion.rs before persist.
  2. Decode PodiumTimerArmed in indexer if product needs armed-state UX beyond head poller.
  3. Harden claimCred frontend — receipt wait + invalidateArenaWalletStatsQueries (mirror claimWarBowFlag).
  4. Unify chainNowSec in ArenaTimerChips / useTimerPodiumSlideMeta.
  5. PodiumVaults non-commingled integration test in contracts.
  6. Pause boundary tests + ops doc for rollPodiumEpoch / claimCred / topUpPodiumPools.

P2 — Test and ops coverage

  1. Transition E2E under YIELDOMEGA_E2E_INDEXER=1: warp Anvil past deadline, scripted roll, assert epoch increment + leaderboard refresh + claim button state.
  2. scripts/verify-indexer-reorg-anvil.sh — Anvil reset + re-ingest smoke.
  3. TimeArena + TWAP on chain 4326 — mocked or fork hard-reset test.
  4. Fix or quarantine Warbow benchmark tests — restore clean forge test signal.
  5. Play-route indexer offline banner — reuse protocol degraded-mode pattern (#96).
  6. Sparse podium roll tests — empty pool, partial winners.

P3 — Documentation

  1. Add “Transition UX” section to docs/frontend/arena-views.md linking on-chain events → indexer fields → UI states.
  2. Document pause + settlement runbook in docs/operations/pause-and-final-signoff.md.

Severity summary

Severity Count Examples
High 5 Head poller vs ingest lag; no transition feed; no epoch-roll UX; non-commingled vaults untested; TWAP production path
Medium 12 claimCred post-tx; log ordering; pause asymmetry; no transition E2E; timer clock split; reorg E2E; sparse roll tests
Low 8 WYWA in-session; referral LB poll; fork smoke depth; public status lag
Info 4 WarBow ranking tradeoff; always-live arena; retired v1 sale; static indexer-first tests

Verification commands (this analysis)

# Contracts (4 fork airdrop failures expected without doub.csv)
export PATH="$HOME/.foundry/bin:$PATH"
cd contracts && forge test

# Indexer
source /usr/local/cargo/env 2>/dev/null || true
cd indexer && cargo test

# Frontend
cd frontend && npm run typecheck && npm run lint && npm test

# Transition smoke (optional, needs stack)
bash scripts/verify-last-buy-epoch-anvil.sh
bash scripts/verify-podium-live-anvil.sh
bash scripts/verify-wallet-profile-anvil.sh

Generated by gap analysis workflow for GitLab #342. No MR opened per issue instructions.

# Gap Analysis — State Transitions (#342) **Issue:** [Transition Gap Analysis](https://gitlab.com/PlasticDigits/yieldomega/-/issues/342) **Date:** 2026-06-25 **Branch:** `main` (synced) **Report:** `gaps/GAP_1782397039.md` --- ## Executive summary Yieldomega’s Arena v2 state machine is **well-specified and heavily tested on-chain**. Podium rolls, Last Buy epoch re-anchors, CRED claims, XP/level progression, WarBow settlement, and autoroll-on-buy are covered by ~120+ Forge tests, a rich invariant matrix (`INV-TIME-ARENA-*`), and product docs (`time-arena.md`, `arena-v2.md`). **The largest gaps sit at transition boundaries across layers**, not in core happy-path contract logic: 1. **Cross-layer timing** — The indexer head poller (`chain_timer`) can advance epochs/deadlines before log ingest catches up; the frontend polls indexer data with `placeholderData` that latches stale snapshots. Users can see frozen `00:00` timers, old epoch numbers, or stale leaderboards during rollovers. 2. **No unified transition UX** — Play route has no explicit states for *expired-pending-roll*, *settling*, or *epoch-advanced*. Permissionless `rollPodiumEpoch` is documented in copy only; no CTA or settling indicator. 3. **Indexer transition feed incomplete** — `GET /v1/arena/activity` excludes level-ups, CRED claims, podium epoch rolls, and feature unlocks. `PodiumTimerArmed` is emitted on-chain but not decoded. 4. **Frontend claim lifecycle gaps** — `claimCred` fires `writeContractAsync` without receipt wait or stats invalidation (unlike `claimWarBowFlag`). 5. **Contract edge cases untested** — Non-commingled `PodiumVaults` pool wiring, pause behavior during `rollPodiumEpoch`/`claimCred`, production MegaETH TWAP hard-reset path integrated with `TimeArena.buy`, and sparse/empty podium rolls. **Severity distribution:** 0 Critical · 5 High · 12 Medium · 8 Low · 4 Info (accepted/documented). **Test suite status (this run):** | Package | Command | Result | |---------|---------|--------| | Contracts | `forge test` | **215 pass / 6 fail** — 4 optional fork airdrop tests (missing gitignored `doub.csv`, expected); 2 Warbow benchmark tests failed (`timer not armed`, `level`) — likely env/setup flake, not production regressions | | Indexer | `cargo test` | **86 pass / 0 fail** (80 unit + 6 integration) | | Frontend | `typecheck` + `lint` + `npm test` | **743 pass / 0 fail** (3 eslint warnings) | --- ## Scope Per issue #342: analyze behavior, testing, and documentation of **state transitions** across contracts, frontend, and indexer — including level ups, epoch rolls, prize distribution/claiming, leaderboard changes, sale phase changes, timer rollovers, pause boundaries, and reorg handling. --- ## Transition inventory (current state) | Transition | On-chain | Indexer ingest | API exposure | Frontend UX | Test depth | |------------|----------|------------------|--------------|-------------|------------| | Arena start (`startArena`) | `TimeArena` | `ArenaStarted` | `/v1/arena/timers` | Phase badge | Good | | Last Buy hard reset → epoch bump | `_reanchorEpochCharmPrice` | `LastBuyEpochStarted`, `LastBuyEpochCharmAnchored` | timers + `last-buy-epoch-pricing` | Hero timer rollover | **Strong** | | Podium timer arm/extend/reset | `_armPodiumTimer`, `_extendPodiumTimer` | Buy side effects only; **`PodiumTimerArmed` not decoded** | Head poller deadlines | Chips/carousel; unarmed copy | Good on-chain; **gap indexer decode** | | Podium epoch roll + payout | `rollPodiumEpoch`, `_autorollExpiredPodiums` | `PodiumEpochRolled` | `/podiums`, session-summary | **No settling UI**; epoch corner updates on poll | **Strong** on-chain; weak E2E | | CRED accrual + claim | `claimCred` | `CredClaimed` | wallet stats only | `ArenaCharmCredCard` — **no post-tx refresh** | **Strong** on-chain | | XP / level up | `_finishBuy` + `ArenaXp` | `XpGained`, `LevelUp` | wallet `level_history` | Celebration popover (L2+) | Good unit; no transition E2E | | Feature unlock (L1–L5 gates) | `_finishBuy` gates | `FeatureUnlocked` | Not listed | Carousel locks | On-chain good; API gap | | WarBow epoch finalize | autoroll cat 3 | `WarbowPodiumFinalized` | wallet prizes | Protocol/docs only | Good on-chain | | WarBow flag claim | `claimWarBowFlag` | WarBow logs | wallet stats | Button + receipt wait | Good | | Leaderboard update | `_updateTopThree`, WarBow ranking | live podium projection + buy feed | `/podiums`, `/buys` | Leaderboard + head-shake SFX | Good unit; poll-lag risk | | Pause | `setPaused` | `PausedSet` | timers `paused` | Write gates | **Partial** — roll/claim/top-up not in pause matrix | | Sale phase (pre-launch → live) | `arenaStart` timestamp | Head poller | timers/sale-state | `derivePhase` FSM | Unit tests; **no E2E flip** | --- ## Findings by area ### Contracts — HIGH #### H-C1: Non-commingled `PodiumVaults` pools untested `PodiumVaults.setActivePool` / `setSeedPool` / `setFuturePool` allow external pool addresses. All Forge tests use default commingled wiring (`address(vaults)`). Misconfigured production deploy could desync ledger vs ERC-20 balance, causing payout/roll failures or stranded DOUB. **Files:** `contracts/src/arena/PodiumVaults.sol` **Fix:** Integration test with separate EOAs — full buy → roll → payout → tranche promotion cycle. #### H-C2: Production MegaETH TWAP hard-reset path not integrated in `TimeArena` tests `TimeArena._sampleCharmAnchor()` branches on `block.chainid == 4326` → `ArenaCharmPriceTwap.compute`. Anvil tests use spot oracle. TWAP is tested in isolation (`ArenaCharmPriceTwap.t.sol`) with optional fork smoke, but no `TimeArena.buy` hard-reset test on chain 4326. **Risk:** DOUB owed at epoch boundary could diverge between test and production paths. **Fix:** `vm.chainId(4326)` test with mocked TWAP or fork; assert `lastBuyEpoch`, anchor, and `doubOwedForBuy`. --- ### Contracts — MEDIUM #### M-C1: Pause boundary asymmetry undocumented and untested `rollPodiumEpoch`, `claimCred`, and `topUpPodiumPools` bypass `_requireLive()` / pause. Pause tests (`INV-TIME-ARENA-PAUSE-MUTATING`) cover buy/WarBow/flag only. **Fix:** Document intended ops behavior in `pause-and-final-signoff.md`; add `test_pause_allows_roll_and_claim` or `test_pause_blocks_roll` per product decision. #### M-C2: Sparse/empty podium roll lightly exercised No explicit tests for `poolBal == 0` or zero-address winners during roll. Tranche promotion still runs. **Fix:** `test_roll_empty_pool_tranche_promotion`, `test_roll_partial_winners`. #### M-C3: Same-tx multi-level unlock edge case `_finishBuy` uses `gateLevel = lvlAfter` after XP — a wallet with large XP could unlock L2–L5 timer arms in one buy. Staged tests exist; no single-buy L1→L4+ test. #### M-C4: UUPS upgrade smoke missing Only auth tests for upgrades. No post-upgrade roll/claim/buy smoke. #### M-C5: Warbow benchmark tests failing in CI run `TimeArenaWarbowBenchmark.t.sol`: `test_benchmark_warbow_10k_player_ranking` (`timer not armed`), `test_benchmark_warbow_steal_10k_player_ranking` (`level`). Gas benchmarks, not correctness — but failures obscure CI signal. --- ### Contracts — LOW / INFO - **L-C1:** `rollSeedToActive` standalone path not isolated (#261). - **L-C2:** `PlayCred` only 2 unit tests; no arena-integrated double-mint edge cases. - **L-C3:** `ReferralRegistry.registerCode` during live epoch roll — no full `TimeArena` integration test. - **L-C4:** Fork smoke (`TimeArenaFork.t.sol`) reads head state only. - **INFO:** WarBow 6-slot ranking accuracy tradeoff documented ([#312](https://gitlab.com/PlasticDigits/yieldomega/-/issues/312)); autoroll prevents `timer expired` reverts ([#312](https://gitlab.com/PlasticDigits/yieldomega/-/issues/312)). **Documentation (contracts):** Strong — `docs/product/time-arena.md`, `arena-v2.md`, `PARAMETERS.md`, `invariants-and-business-logic.md`, `docs/architecture/data-flows.md` (podium roll flow). --- ### Frontend — HIGH #### H-F1: No play-route UX for epoch roll / timer expiry Timers count to `00:00` with no *settling* or *pending roll* state. Copy in `podiumCopy.tsx` explains mechanics but there is no CTA, spinner, or “waiting for settlement” indicator. Users see frozen countdown until someone rolls on-chain and indexer catches up. **Files:** `useArenaHeroTimer.ts`, `ArenaTimerChips.tsx`, `podiumCopy.tsx` #### H-F2: Transition visibility bounded by indexer poll lag All display transitions are poll-driven (1–5s fast, backoff to 30s on failure). React Query `placeholderData: (prev) => prev` keeps old epoch/standings during refresh. Epoch bump, leaderboard swap, and claimable CRED appear late. **Files:** indexer query hooks across `usePodiumReads.ts`, `useArenaHeroTimer.ts`, `useArenaPlayerLevel.ts` #### H-F3: Timer clock source split between hero and side chips Hero uses wall-clock skew (`chainNowSec` from `polled_at_ms` + `block_timestamp_sec`). Non–Last Buy chips use static `block_timestamp_sec` at last poll — can disagree with hero between polls. **Files:** `ArenaTimerChips.tsx` (L76–86), `useTimerPodiumSlideMeta.ts` (L77–82) --- ### Frontend — MEDIUM #### M-F1: Play route lacks indexer-offline surfacing `useIndexerConnectivity` / offline banners exist on protocol page but not `ArenaSimplePage.tsx` (`/`). During outage, play UI shows latched stale data with no degraded-mode banner ([#96](https://gitlab.com/PlasticDigits/yieldomega/-/issues/96)). #### M-F2: `claimCred` has no post-tx lifecycle `ArenaCharmCredCard.tsx` calls `writeContractAsync` only — no `waitForWriteReceipt`, no `invalidateArenaWalletStatsQueries`. Contrast with `submitClaimWarBowFlag` in `useArenaSaleSession.ts`. #### M-F3: No E2E for critical transitions E2E covers mount/load and buy feel (`anvil-arena-05-play-feel.spec.ts`, `anvil-indexer-first.spec.ts`). Missing: pre-launch→live flip, timer zero, CRED/flag claim refresh, competitor buy changing leaderboard rank. #### M-F4: Buy RPC event watch active under indexer-first `useWatchContractEvent(Buy)` enabled regardless of indexer — triggers RPC refetches alongside polls; potential flicker under load. #### M-F5: WarBow finalize — read-only on play route Operators use protocol/contract directly; no UI feedback when finalize completes. --- ### Frontend — LOW - **L-F1:** Wrong-network blocks writes only; display keeps indexer data — user sees “live” arena but writes fail at action time. - **L-F2:** WYWA modal is return-visit only — active-tab users miss in-session epoch-end recap. - **L-F3:** `indexerFirstDisplay.test.ts` is static source analysis — runtime RPC reintroduction not caught. - **L-F4:** Referral leaderboard uses separate poll model from arena transitions. **Documentation (frontend):** `docs/frontend/arena-views.md` covers level-up celebration (#335), wallet profile (#336). No dedicated “transition states” UX spec. **Unit test coverage:** Good for phase FSM, timer display, level-up celebration logic, buy effect toasts, WYWA activity gate. Gap is **runtime transition E2E**, not pure-function coverage. --- ### Indexer — HIGH #### H-I1: Dual source of truth — head poller vs log ingest `/v1/arena/timers` and `/podiums` epochs come from `chain_timer` (latest RPC Multicall3). Event tables advance only to `chain_pointer`. After epoch roll, UI can show new epoch/deadlines before `PodiumEpochRolled`, live podium rows, or activity reflect the transition. **Files:** `chain_timer.rs`, `chain_timer_poll.rs`, `api_arena.rs`, `ingestion.rs` #### H-I2: No unified transition feed `GET /v1/arena/activity` union SQL includes only `buy`, `steal`, `guard`, `revenge`. Excludes `level_up`, `cred_claim`, `podium_epoch`, `epoch_started`, `feature_unlocked`. Frontend cannot indexer-first drive celebration/toast stacks for non-buy transitions. **Files:** `api_arena.rs` (`ACTIVITY_UNION_SQL`) --- ### Indexer — MEDIUM #### M-I1: Logs not sorted by `log_index` before persist `ingestion.rs` iterates RPC return order with no `sort_by(log_index)`. Same-block `LastBuyEpochStarted` after `Buy` could mis-tag `last_buy_epoch` on misordered RPC ([#278](https://gitlab.com/PlasticDigits/yieldomega/-/issues/278) risk). #### M-I2: `PodiumTimerArmed` not decoded Emitted in `TimeArena.sol`; absent from `decoder.rs` / `persist.rs`. Timer “armed” transition invisible to API. #### M-I3: No confirmation tiers despite design doc `REORG_STRATEGY.md` defines `realtime`/`soft`/`final` tiers; no API filter on `block_number <= head - N`. Leaderboards and wallet stats serve pre-finality data on ~1s MegaETH blocks. #### M-I4: No automated reorg E2E Tests call `rollback_after` directly; no Anvil reorg walk (`find_common_ancestor` + re-ingest) script. #### M-I5: Ingest RPC side-effects can fail whole block WarBow BP + live podium `eth_call`s inside block transaction — transient RPC failure rolls back entire block including transition events. #### M-I6: Public `/v1/status` hides sync lag `chain_pointer` / `last_indexed_at_ms` omitted unless ops flag — clients cannot detect ingest lag. --- ### Indexer — LOW - **L-I1:** `FeatureUnlocked` / `PausedSet` indexed but not API-listed historically. - **L-I2:** Retired prize distribution HTTP (`fetchArenaPrizeDistributions` returns `null`). - **L-I3:** No script drives live `CredClaimed` / `LevelUp` / `PodiumEpochRolled` end-to-end (verify scripts cover subsets). **Integration tests:** `integration_stage2.rs` — 6 tests pass including reorg rollback for level history (#336), last-buy epoch assignment (#278), session summary podium finalize (#338). Gaps: log ordering, live reorg, transition HTTP surfaces. **Verify scripts (transition-related):** | Script | Covers | |--------|--------| | `verify-last-buy-epoch-anvil.sh` | Epoch tagging on buys | | `verify-podium-live-anvil.sh` | Live podium vs on-chain | | `verify-podium-timers-anvil.sh` | Timer/epoch head alignment | | `verify-wallet-profile-anvil.sh` | Level history | | `verify-vault-funding-anvil.sh` | Vault funding on buy | Missing: `verify-indexer-reorg-anvil.sh`, transition activity feed smoke. --- ### Cross-cutting / architecture ```mermaid flowchart TB subgraph risk ["Transition risk window"] A[Timer hits zero on-chain] B[Autoroll on next buy OR permissionless roll] C[Head poller sees new epoch] D[Ingest persists PodiumEpochRolled] E[Frontend poll reflects change] end A --> B B --> C B --> D C -->|"often faster"| E D -->|"may lag"| E ``` | Concern | Contracts | Indexer | Frontend | |---------|-----------|---------|----------| | Epoch roll correctness | Strong | Good ingest; head/ingest lag | Weak UX | | Level up feedback | Strong events | Wallet stats only | Celebration poll-driven | | CRED claim | Strong | Wallet stats only | No post-tx refresh | | Leaderboard at boundary | Strong on-chain | Live projection + lag | Poll + latched placeholder | | Reorg safety | N/A (chain finality) | Rollback tested synthetically; no live reorg E2E | No confirmation tier | | Pause during incident | Partial coverage | Pause via head poller | Write gates only | --- ### Testing gaps summary | Layer | Well covered | Gaps | |-------|--------------|------| | **Contracts unit** | Rolls, autoroll, CRED, XP, WarBow, pause on mutators, epoch charm pricing | Non-commingled vaults, pause+roll/claim, sparse roll, TWAP+TimeArena integration, benchmark flake | | **Indexer integration** | Event persist, rollback, epoch assignment, wallet level history, session summary | Log ordering, reorg E2E, transition activity API | | **Frontend unit** | Phase FSM, celebration logic, timer copy, indexer-first static guards | Runtime transition wiring | | **E2E / Anvil** | Indexer-first load, buy feel, WYWA screenshots | Phase flip, timer zero, claims, leaderboard churn | | **Scripts / smoke** | Per-feature verify scripts | Reorg, full transition feed | --- ### DRY, readability, best practices - **DRY:** Transition math is well-factored into libraries (`ArenaXp`, `TimeMath`, `ArenaPodiumSettlement`, `ArenaBuyRouting`). Frontend has some duplication between hero timer skew and chip timer sources (H-F3) — unify `chainNowSec`. - **Gas:** WarBow 10k-player benchmarks documented ([#312](https://gitlab.com/PlasticDigits/yieldomega/-/issues/312)); autoroll multi-category in one tx worth monitoring on congested chains. - **Language practices:** Rust indexer uses transactional block ingest (good). Missing log sort is a correctness best-practice gap. Frontend `claimCred` should mirror established `claimWarBowFlag` receipt+invalidation pattern. --- ## Recommended next steps (priority order) ### P0 — Close cross-layer transition gaps 1. **Define transition state model** — Document and implement UX states: `live`, `expired-pending-roll`, `settling`, `epoch-advanced`, `claimable`. Map to indexer fields (`podium_epochs`, `podium_prediction`, `claimable_cred_epoch`). 2. **Expose ingest lag on timer/podium responses** — Add `indexed_head_block` (or `indexed_through_block`) to `/v1/arena/timers` and `/podiums`; frontend shows subtle sync indicator when `indexed_head_block < chain_head_block`. 3. **Extend `/v1/arena/activity` or add `/v1/arena/transitions`** — Include `level_up`, `cred_claim`, `podium_epoch`, `epoch_started`, `feature_unlocked` for indexer-first celebration/toast stacks. ### P1 — Harden correctness at boundaries 4. **Sort logs by `(block_number, tx_index, log_index)`** in `indexer/src/ingestion.rs` before persist. 5. **Decode `PodiumTimerArmed`** in indexer if product needs armed-state UX beyond head poller. 6. **Harden `claimCred` frontend** — receipt wait + `invalidateArenaWalletStatsQueries` (mirror `claimWarBowFlag`). 7. **Unify `chainNowSec`** in `ArenaTimerChips` / `useTimerPodiumSlideMeta`. 8. **PodiumVaults non-commingled integration test** in contracts. 9. **Pause boundary tests + ops doc** for `rollPodiumEpoch` / `claimCred` / `topUpPodiumPools`. ### P2 — Test and ops coverage 10. **Transition E2E** under `YIELDOMEGA_E2E_INDEXER=1`: warp Anvil past deadline, scripted roll, assert epoch increment + leaderboard refresh + claim button state. 11. **`scripts/verify-indexer-reorg-anvil.sh`** — Anvil reset + re-ingest smoke. 12. **TimeArena + TWAP on chain 4326** — mocked or fork hard-reset test. 13. **Fix or quarantine Warbow benchmark tests** — restore clean `forge test` signal. 14. **Play-route indexer offline banner** — reuse protocol degraded-mode pattern ([#96](https://gitlab.com/PlasticDigits/yieldomega/-/issues/96)). 15. **Sparse podium roll tests** — empty pool, partial winners. ### P3 — Documentation 16. Add **“Transition UX”** section to `docs/frontend/arena-views.md` linking on-chain events → indexer fields → UI states. 17. Document **pause + settlement** runbook in `docs/operations/pause-and-final-signoff.md`. --- ## Severity summary | Severity | Count | Examples | |----------|-------|----------| | **High** | 5 | Head poller vs ingest lag; no transition feed; no epoch-roll UX; non-commingled vaults untested; TWAP production path | | **Medium** | 12 | claimCred post-tx; log ordering; pause asymmetry; no transition E2E; timer clock split; reorg E2E; sparse roll tests | | **Low** | 8 | WYWA in-session; referral LB poll; fork smoke depth; public status lag | | **Info** | 4 | WarBow ranking tradeoff; always-live arena; retired v1 sale; static indexer-first tests | --- ## Verification commands (this analysis) ```bash # Contracts (4 fork airdrop failures expected without doub.csv) export PATH="$HOME/.foundry/bin:$PATH" cd contracts && forge test # Indexer source /usr/local/cargo/env 2>/dev/null || true cd indexer && cargo test # Frontend cd frontend && npm run typecheck && npm run lint && npm test # Transition smoke (optional, needs stack) bash scripts/verify-last-buy-epoch-anvil.sh bash scripts/verify-podium-live-anvil.sh bash scripts/verify-wallet-profile-anvil.sh ``` --- *Generated by gap analysis workflow for GitLab #342. No MR opened per issue instructions.*
PlasticDigits commented 2026-06-25 20:03:47 +00:00 (Migrated from gitlab.com)

All recommendations approved.
Pause should block roll.

All recommendations approved. Pause should block roll.
PlasticDigits commented 2026-06-25 20:07:11 +00:00 (Migrated from gitlab.com)

mentioned in issue #343

mentioned in issue #343
PlasticDigits commented 2026-06-25 20:07:15 +00:00 (Migrated from gitlab.com)

mentioned in issue #344

mentioned in issue #344
PlasticDigits commented 2026-06-25 20:07:16 +00:00 (Migrated from gitlab.com)

mentioned in issue #345

mentioned in issue #345
PlasticDigits commented 2026-06-25 20:07:18 +00:00 (Migrated from gitlab.com)

mentioned in issue #346

mentioned in issue #346
PlasticDigits commented 2026-06-25 20:07:19 +00:00 (Migrated from gitlab.com)

mentioned in issue #347

mentioned in issue #347
PlasticDigits commented 2026-06-25 20:07:22 +00:00 (Migrated from gitlab.com)

mentioned in issue #348

mentioned in issue #348
PlasticDigits commented 2026-06-25 20:07:24 +00:00 (Migrated from gitlab.com)

mentioned in issue #349

mentioned in issue #349
PlasticDigits commented 2026-06-25 20:07:28 +00:00 (Migrated from gitlab.com)

mentioned in issue #351

mentioned in issue #351
PlasticDigits commented 2026-06-25 20:07:32 +00:00 (Migrated from gitlab.com)

mentioned in issue #352

mentioned in issue #352
PlasticDigits commented 2026-06-25 20:07:33 +00:00 (Migrated from gitlab.com)

mentioned in issue #353

mentioned in issue #353
PlasticDigits commented 2026-06-25 20:07:35 +00:00 (Migrated from gitlab.com)

mentioned in issue #354

mentioned in issue #354
PlasticDigits commented 2026-06-25 20:07:36 +00:00 (Migrated from gitlab.com)

mentioned in issue #355

mentioned in issue #355
PlasticDigits commented 2026-06-25 20:07:37 +00:00 (Migrated from gitlab.com)

mentioned in issue #350

mentioned in issue #350
PlasticDigits commented 2026-06-25 20:07:46 +00:00 (Migrated from gitlab.com)

Child issues opened from gap analysis

All P0–P3 recommendations were approved on 2026-06-25 (“All recommendations approved. Pause should block roll.”). No items were rejected, requested for revision, or left undecided. No prior child issues existed.

Opened (13 bundled issues)

Issue Title Bundles
#343 Play-route transition state model and UX P0 #1, P1 #7, P3 #16 · H-F1, H-F2, H-F3
#344 Expose indexer ingest lag on arena timer and podium APIs P0 #2 · H-I1 (lag visibility), M-I6
#345 Extend arena activity API with state transition events P0 #3 · H-I2
#346 Indexer ingest correctness: log ordering and PodiumTimerArmed decode P1 #4, P1 #5 · M-I1, M-I2
#347 Harden claimCred post-transaction lifecycle P1 #6
#348 PodiumVaults non-commingled pool integration test P1 #8 · H-C1
#349 Pause blocks roll, claim, and topUp — contract guards, tests, ops doc P1 #9, P3 #17 · M-C1 (pause blocks roll per approval)
#350 Transition E2E: epoch roll, leaderboard refresh, claim state P2 #10
#351 Add verify-indexer-reorg-anvil smoke script P2 #11 · M-I4
#352 TimeArena Last Buy hard reset with TWAP on chain 4326 P2 #12 · H-C2
#353 Fix or quarantine Warbow benchmark forge tests P2 #13 · M-C5
#354 Play-route indexer offline degraded-mode banner P2 #14 · M-F1
#355 Sparse and empty podium roll contract tests P2 #15 · M-C2

Skipped

Category Items
Rejected —
Requested (needs revision) —
Undecided —
Already had child issue —

Not opened as separate issues (subsumed or out of P0–P17 scope)

Lower-severity findings (L-C*, L-F*, L-I*, M-C3/C4, M-I3/I5, INFO rows) remain documented in the gap report (gaps/GAP_1782397039.md) and parent comment; they were not in the approved priority list unless covered by a bundle above.

Suggested implementation order

  1. P0 cross-layer: #344 → #345 → #343 (API fields before UX that consumes them)
  2. P1 correctness: #346, #347, #349, #348
  3. P2 test/ops: #350, #351, #352, #353, #354, #355

No MR opened per parent instructions.

## Child issues opened from gap analysis All P0–P3 recommendations were **approved** on 2026-06-25 (“All recommendations approved. Pause should block roll.”). No items were rejected, requested for revision, or left undecided. No prior child issues existed. ### Opened (13 bundled issues) | Issue | Title | Bundles | |-------|-------|---------| | [#343](https://gitlab.com/PlasticDigits/yieldomega/-/issues/343) | Play-route transition state model and UX | P0 #1, P1 #7, P3 #16 · H-F1, H-F2, H-F3 | | [#344](https://gitlab.com/PlasticDigits/yieldomega/-/issues/344) | Expose indexer ingest lag on arena timer and podium APIs | P0 #2 · H-I1 (lag visibility), M-I6 | | [#345](https://gitlab.com/PlasticDigits/yieldomega/-/issues/345) | Extend arena activity API with state transition events | P0 #3 · H-I2 | | [#346](https://gitlab.com/PlasticDigits/yieldomega/-/issues/346) | Indexer ingest correctness: log ordering and PodiumTimerArmed decode | P1 #4, P1 #5 · M-I1, M-I2 | | [#347](https://gitlab.com/PlasticDigits/yieldomega/-/issues/347) | Harden claimCred post-transaction lifecycle | P1 #6 | | [#348](https://gitlab.com/PlasticDigits/yieldomega/-/issues/348) | PodiumVaults non-commingled pool integration test | P1 #8 · H-C1 | | [#349](https://gitlab.com/PlasticDigits/yieldomega/-/issues/349) | Pause blocks roll, claim, and topUp — contract guards, tests, ops doc | P1 #9, P3 #17 · M-C1 (**pause blocks roll** per approval) | | [#350](https://gitlab.com/PlasticDigits/yieldomega/-/issues/350) | Transition E2E: epoch roll, leaderboard refresh, claim state | P2 #10 | | [#351](https://gitlab.com/PlasticDigits/yieldomega/-/issues/351) | Add verify-indexer-reorg-anvil smoke script | P2 #11 · M-I4 | | [#352](https://gitlab.com/PlasticDigits/yieldomega/-/issues/352) | TimeArena Last Buy hard reset with TWAP on chain 4326 | P2 #12 · H-C2 | | [#353](https://gitlab.com/PlasticDigits/yieldomega/-/issues/353) | Fix or quarantine Warbow benchmark forge tests | P2 #13 · M-C5 | | [#354](https://gitlab.com/PlasticDigits/yieldomega/-/issues/354) | Play-route indexer offline degraded-mode banner | P2 #14 · M-F1 | | [#355](https://gitlab.com/PlasticDigits/yieldomega/-/issues/355) | Sparse and empty podium roll contract tests | P2 #15 · M-C2 | ### Skipped | Category | Items | |----------|-------| | **Rejected** | — | | **Requested (needs revision)** | — | | **Undecided** | — | | **Already had child issue** | — | ### Not opened as separate issues (subsumed or out of P0–P17 scope) Lower-severity findings (L-C*, L-F*, L-I*, M-C3/C4, M-I3/I5, INFO rows) remain documented in the gap report (`gaps/GAP_1782397039.md`) and parent comment; they were not in the approved priority list unless covered by a bundle above. ### Suggested implementation order 1. **P0 cross-layer:** #344 → #345 → #343 (API fields before UX that consumes them) 2. **P1 correctness:** #346, #347, #349, #348 3. **P2 test/ops:** #350, #351, #352, #353, #354, #355 No MR opened per parent instructions.
PlasticDigits commented 2026-06-25 20:55:47 +00:00 (Migrated from gitlab.com)

mentioned in merge request !517

mentioned in merge request !517
PlasticDigits commented 2026-06-25 21:59:23 +00:00 (Migrated from gitlab.com)

mentioned in merge request !518

mentioned in merge request !518
PlasticDigits commented 2026-06-25 22:01:36 +00:00 (Migrated from gitlab.com)

mentioned in merge request !519

mentioned in merge request !519
PlasticDigits commented 2026-06-25 22:05:46 +00:00 (Migrated from gitlab.com)

mentioned in merge request !520

mentioned in merge request !520
PlasticDigits commented 2026-06-25 22:17:17 +00:00 (Migrated from gitlab.com)

mentioned in merge request !521

mentioned in merge request !521
PlasticDigits commented 2026-06-25 22:29:38 +00:00 (Migrated from gitlab.com)

mentioned in merge request !522

mentioned in merge request !522
PlasticDigits commented 2026-06-26 03:56:53 +00:00 (Migrated from gitlab.com)

mentioned in merge request !525

mentioned in merge request !525
PlasticDigits (Migrated from gitlab.com) closed this issue 2026-06-26 06:20:48 +00:00
PlasticDigits commented 2026-06-26 09:10:39 +00:00 (Migrated from gitlab.com)

mentioned in commit a73b577518

mentioned in commit a73b57751864684921e1f64d690f72070e85f895
PlasticDigits commented 2026-06-26 09:11:07 +00:00 (Migrated from gitlab.com)

mentioned in merge request !526

mentioned in merge request !526
PlasticDigits commented 2026-06-28 02:44:49 +00:00 (Migrated from gitlab.com)

mentioned in merge request !528

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