Podium epoch timer should arm on first buy, not at epoch open #330

Closed
opened 2026-06-16 05:49:42 +00:00 by PlasticDigits · 6 comments
PlasticDigits commented 2026-06-16 05:49:42 +00:00 (Migrated from gitlab.com)

Problem

Per-category podium settlement timers (podiumDeadline[cat] / podiumEpoch[cat]) currently begin counting down immediately when:

  1. startArena() runs — all four deadlines are set to block.timestamp + podiumInitialTimerSec[cat] (TimeArena.sol startArena).
  2. rollPodiumEpoch(category) completes — the rolled category’s deadline is reset to block.timestamp + podiumInitialTimerSec[category] (_rollPodiumEpoch).

That means a fresh epoch can expire and autoroll (via _autorollExpiredPodiums on buys/WarBow — #312) before any participant has bought in that epoch. The play UI, AUDIT accordion, and indexer head poll all surface a live dd:HH:MM:SS countdown from day one.

Desired behavior: For each podium category, the epoch N settlement timer should not tick until the first qualifying buy has occurred in that epoch (for that category’s scoring window). Until then, display should read as not started / awaiting first buy, not a shrinking countdown.

Product clarification needed (assignee)

Confirm scope with product:

Option Behavior
A (global arm) Any arena buy / buyWithCred arms all four category timers for their current epochs simultaneously.
B (per-category arm) Category cat timer arms only on the first buy that materially participates in that category’s epoch (e.g. adds timer/score for cat 1/2, WarBow action for cat 3, Last Buy placement for cat 0).

Document the chosen rule in docs/product/arena-v2.md before implementation.


Acceptance criteria

  • On-chain: After startArena() or rollPodiumEpoch(cat), podiumDeadline[cat] is not a live countdown until the epoch’s first qualifying buy (per product decision above).
  • On-chain: First qualifying buy in epoch N for category cat sets the deadline using existing extension / hard-reset / cap rules (initial timer band applies at arm time, not at epoch open).
  • On-chain: rollPodiumEpoch(cat) / _autorollExpiredPodiums cannot settle an epoch whose timer was never armed (no empty-entrant payout roll from idle countdown).
  • On-chain: Last Buy primary deadline stays consistent with cat 0 semantics when cat 0 uses the new arm model.
  • Indexer: GET /v1/arena/timers exposes enough state for clients to distinguish armed vs awaiting-first-buy per category (e.g. boolean flags and/or sentinel deadline handling). Schema version bump + design doc update.
  • Frontend: Play page timer chips, hero carousel, and AUDIT Time remaining rows show awaiting first buy (not 00:00:… counting down) until armed; then show dd:HH:MM:SS countdown.
  • Docs/skills: Product specs, invariants, manual QA, and play skills describe the new epoch-arm semantics.
  • Tests: Forge + Anvil verify scripts + indexer integration smoke cover unarmed epoch, arm-on-first-buy, and no autoroll-before-arm.

Verification checklist

Layer Command / check Expected
Contracts cd contracts && forge test --match-contract TimeArenaTest New/changed tests PASS; existing timer tests updated
Contracts bash scripts/verify-podium-timers-anvil.sh Distinct per-category behavior; no countdown before first buy
Indexer cd indexer && cargo clippy --all-targets -- -D warnings && cargo test PASS
Indexer bash scripts/verify-podium-live-anvil.sh Podium rows sane while timer unarmed
Frontend cd frontend && npm run typecheck && npm test Timer UI tests for unarmed state
API curl -s http://127.0.0.1:3100/v1/arena/timers | jq Per-cat armed flags / semantics documented
Manual Fresh Anvil stack → open / and /arena/protocol Timers show not started until first buy; then count down

1. Contracts (canonical)

Introduce an explicit armed state per category per epoch, e.g.:

  • mapping(uint8 => bool) podiumTimerArmed or podiumDeadline[cat] == type(uint256).max as sentinel unarmed.
  • startArena / _rollPodiumEpoch: set unarmed, not now + initial.
  • On first qualifying buy: if !armed[cat], set podiumDeadline[cat] = block.timestamp + podiumInitialTimerSec[cat] (then apply normal extension for that buy); set armed[cat] = true.
  • Update rollPodiumEpoch guard: require armed and expired (replace "TimeArena: timer live" semantics).
  • Update _autorollExpiredPodiums to skip unarmed categories.
  • Consider emitting PodiumTimerArmed(uint8 category, uint256 epoch) for indexer/UI.

Review interaction with #312 autoroll and #247 diverging rolls.

2. Indexer

3. Frontend

4. Documentation & skills


Likely files to touch

Contracts

Indexer

Frontend

Scripts / bots

Docs & skills


Context / motivation

Observed on AUDIT (Time remaining per podium): epochs 0/1/2 prize pools can be non-zero while countdowns run from startArena or post-roll even with no buys yet in that epoch — creating pressure to roll empty leaderboards. Aligns with operator expectation that competition clock starts on participation, not on epoch index increment alone.

Related: #271 (per-category timer params), #247 (diverging rolls), #312 (autoroll).

## Problem Per-category **podium settlement timers** (`podiumDeadline[cat]` / `podiumEpoch[cat]`) currently begin counting down **immediately** when: 1. **`startArena()`** runs — all four deadlines are set to `block.timestamp + podiumInitialTimerSec[cat]` ([`TimeArena.sol` `startArena`](../../contracts/src/arena/TimeArena.sol)). 2. **`rollPodiumEpoch(category)`** completes — the rolled category’s deadline is reset to `block.timestamp + podiumInitialTimerSec[category]` ([`_rollPodiumEpoch`](../../contracts/src/arena/TimeArena.sol)). That means a fresh epoch can **expire and autoroll** (via `_autorollExpiredPodiums` on buys/WarBow — [#312](https://gitlab.com/PlasticDigits/yieldomega/-/issues/312)) **before any participant has bought** in that epoch. The play UI, AUDIT accordion, and indexer head poll all surface a live `dd:HH:MM:SS` countdown from day one. **Desired behavior:** For each podium category, the **epoch N settlement timer should not tick** until the **first qualifying buy** has occurred **in that epoch** (for that category’s scoring window). Until then, display should read as **not started** / **awaiting first buy**, not a shrinking countdown. ### Product clarification needed (assignee) Confirm scope with product: | Option | Behavior | |--------|----------| | **A (global arm)** | Any arena `buy` / `buyWithCred` arms **all four** category timers for their current epochs simultaneously. | | **B (per-category arm)** | Category `cat` timer arms only on the first buy that **materially participates** in that category’s epoch (e.g. adds timer/score for cat 1/2, WarBow action for cat 3, Last Buy placement for cat 0). | Document the chosen rule in `docs/product/arena-v2.md` before implementation. --- ## Acceptance criteria - [ ] **On-chain:** After `startArena()` or `rollPodiumEpoch(cat)`, `podiumDeadline[cat]` is **not** a live countdown until the epoch’s first qualifying buy (per product decision above). - [ ] **On-chain:** First qualifying buy in epoch N for category `cat` sets the deadline using existing extension / hard-reset / cap rules (initial timer band applies at arm time, not at epoch open). - [ ] **On-chain:** `rollPodiumEpoch(cat)` / `_autorollExpiredPodiums` **cannot** settle an epoch whose timer was never armed (no empty-entrant payout roll from idle countdown). - [ ] **On-chain:** Last Buy primary `deadline` stays consistent with cat 0 semantics when cat 0 uses the new arm model. - [ ] **Indexer:** `GET /v1/arena/timers` exposes enough state for clients to distinguish **armed vs awaiting-first-buy** per category (e.g. boolean flags and/or sentinel deadline handling). Schema version bump + design doc update. - [ ] **Frontend:** Play page timer chips, hero carousel, and AUDIT **Time remaining** rows show **awaiting first buy** (not `00:00:…` counting down) until armed; then show `dd:HH:MM:SS` countdown. - [ ] **Docs/skills:** Product specs, invariants, manual QA, and play skills describe the new epoch-arm semantics. - [ ] **Tests:** Forge + Anvil verify scripts + indexer integration smoke cover unarmed epoch, arm-on-first-buy, and no autoroll-before-arm. --- ## Verification checklist | Layer | Command / check | Expected | |-------|-----------------|----------| | Contracts | `cd contracts && forge test --match-contract TimeArenaTest` | New/changed tests PASS; existing timer tests updated | | Contracts | `bash scripts/verify-podium-timers-anvil.sh` | Distinct per-category behavior; **no** countdown before first buy | | Indexer | `cd indexer && cargo clippy --all-targets -- -D warnings && cargo test` | PASS | | Indexer | `bash scripts/verify-podium-live-anvil.sh` | Podium rows sane while timer unarmed | | Frontend | `cd frontend && npm run typecheck && npm test` | Timer UI tests for unarmed state | | API | `curl -s http://127.0.0.1:3100/v1/arena/timers \| jq` | Per-cat armed flags / semantics documented | | Manual | Fresh Anvil stack → open `/` and `/arena/protocol` | Timers show **not started** until first buy; then count down | --- ## Recommended fixes ### 1. Contracts (canonical) Introduce an explicit **armed** state per category per epoch, e.g.: - `mapping(uint8 => bool) podiumTimerArmed` or `podiumDeadline[cat] == type(uint256).max` as sentinel **unarmed**. - `startArena` / `_rollPodiumEpoch`: set **unarmed**, not `now + initial`. - On first qualifying buy: if `!armed[cat]`, set `podiumDeadline[cat] = block.timestamp + podiumInitialTimerSec[cat]` (then apply normal extension for that buy); set `armed[cat] = true`. - Update `rollPodiumEpoch` guard: require armed **and** expired (replace `"TimeArena: timer live"` semantics). - Update `_autorollExpiredPodiums` to skip unarmed categories. - Consider emitting **`PodiumTimerArmed(uint8 category, uint256 epoch)`** for indexer/UI. Review interaction with [#312](https://gitlab.com/PlasticDigits/yieldomega/-/issues/312) autoroll and [#247](https://gitlab.com/PlasticDigits/yieldomega/-/issues/247) diverging rolls. ### 2. Indexer - Poll new getters / events in [`chain_timer.rs`](../../indexer/src/chain_timer.rs). - Extend [`GET /v1/arena/timers`](../../indexer/src/api_arena.rs) with `podium_timer_armed: bool[]` (or equivalent). - Optionally persist arm events in `idx_arena_podium_epoch` for audit history. - Update [`useArenaProtocolPodiumAudit`](../../frontend/src/pages/arena/useArenaProtocolPodiumAudit.ts) consumers via API types in [`indexerApi.ts`](../../frontend/src/lib/indexerApi.ts). ### 3. Frontend - [`useTimerPodiumSlideMeta.ts`](../../frontend/src/pages/arena/useTimerPodiumSlideMeta.ts), [`ArenaTimerChips.tsx`](../../frontend/src/pages/arena/ArenaTimerChips.tsx), [`useArenaHeroTimer.ts`](../../frontend/src/pages/arena/useArenaHeroTimer.ts): return `undefined` / `"awaiting first buy"` when unarmed. - [`ProtocolPodiumParamsCards.tsx`](../../frontend/src/pages/arena/ProtocolPodiumParamsCards.tsx): same for AUDIT accordion. - Avoid browser RPC mirrors ([#301](https://gitlab.com/PlasticDigits/yieldomega/-/issues/301)); indexer-first only. ### 4. Documentation & skills - Update timer tables in [`docs/product/arena-v2.md`](../../docs/product/arena-v2.md) and [`docs/product/time-arena.md`](../../docs/product/time-arena.md). - Add invariants `INV-TIME-ARENA-PODIUM-TIMER-ARM-*` in [`docs/testing/invariants-and-business-logic.md`](../../docs/testing/invariants-and-business-logic.md). - Manual QA row in [`docs/testing/manual-qa-checklists.md`](../../docs/testing/manual-qa-checklists.md) §271. - [`skills/play-time-arena-doub/SKILL.md`](../../skills/play-time-arena-doub/SKILL.md), [`skills/play-active-time-arena/SKILL.md`](../../skills/play-active-time-arena/SKILL.md). --- ## Likely files to touch ### Contracts - [`contracts/src/arena/TimeArena.sol`](../../contracts/src/arena/TimeArena.sol) - [`contracts/src/arena/libraries/ArenaPodiumTimerConfig.sol`](../../contracts/src/arena/libraries/ArenaPodiumTimerConfig.sol) - [`contracts/test/TimeArena.t.sol`](../../contracts/test/TimeArena.t.sol) - [`contracts/PARAMETERS.md`](../../contracts/PARAMETERS.md) ### Indexer - [`indexer/src/chain_timer.rs`](../../indexer/src/chain_timer.rs) - [`indexer/src/api_arena.rs`](../../indexer/src/api_arena.rs) - [`indexer/src/decoder.rs`](../../indexer/src/decoder.rs) - [`indexer/src/persist.rs`](../../indexer/src/persist.rs) (if persisting arm events) - [`indexer/src/arena_podium_live.rs`](../../indexer/src/arena_podium_live.rs) - [`indexer/tests/integration_stage2.rs`](../../indexer/tests/integration_stage2.rs) - [`indexer/README.md`](../../indexer/README.md) - [`docs/indexer/design.md`](../../docs/indexer/design.md) ### Frontend - [`frontend/src/lib/indexerApi.ts`](../../frontend/src/lib/indexerApi.ts) - [`frontend/src/pages/arena/useArenaHeroTimer.ts`](../../frontend/src/pages/arena/useArenaHeroTimer.ts) - [`frontend/src/pages/arena/useTimerPodiumSlideMeta.ts`](../../frontend/src/pages/arena/useTimerPodiumSlideMeta.ts) - [`frontend/src/pages/arena/ArenaTimerChips.tsx`](../../frontend/src/pages/arena/ArenaTimerChips.tsx) - [`frontend/src/pages/arena/ArenaTimerHero.tsx`](../../frontend/src/pages/arena/ArenaTimerHero.tsx) - [`frontend/src/pages/arena/useArenaProtocolPodiumAudit.ts`](../../frontend/src/pages/arena/useArenaProtocolPodiumAudit.ts) - [`frontend/src/pages/arena/ProtocolPodiumParamsCards.tsx`](../../frontend/src/pages/arena/ProtocolPodiumParamsCards.tsx) - [`frontend/src/pages/arena/ArenaSimplePage.tsx`](../../frontend/src/pages/arena/ArenaSimplePage.tsx) - [`frontend/src/pages/arena/arenaSimplePhase.ts`](../../frontend/src/pages/arena/arenaSimplePhase.ts) - Related tests: `ArenaTimerChips.test.tsx`, `useArenaProtocolPodiumAudit.test.ts`, `arenaV2SaleSessionBridge.test.ts` ### Scripts / bots - [`scripts/verify-podium-timers-anvil.sh`](../../scripts/verify-podium-timers-anvil.sh) - [`scripts/verify-podium-live-anvil.sh`](../../scripts/verify-podium-live-anvil.sh) - [`bots/timearena/src/timearena_bot/state.py`](../../bots/timearena/src/timearena_bot/state.py) (if bot gates on deadlines) ### Docs & skills - [`docs/product/arena-v2.md`](../../docs/product/arena-v2.md) - [`docs/product/time-arena.md`](../../docs/product/time-arena.md) - [`docs/testing/invariants-and-business-logic.md`](../../docs/testing/invariants-and-business-logic.md) - [`docs/testing/manual-qa-checklists.md`](../../docs/testing/manual-qa-checklists.md) - [`docs/frontend/arena-views.md`](../../docs/frontend/arena-views.md) - [`skills/play-time-arena-doub/SKILL.md`](../../skills/play-time-arena-doub/SKILL.md) - [`skills/play-active-time-arena/SKILL.md`](../../skills/play-active-time-arena/SKILL.md) --- ## Context / motivation Observed on AUDIT (**Time remaining** per podium): epochs 0/1/2 prize pools can be non-zero while countdowns run from `startArena` or post-roll even with **no buys yet** in that epoch — creating pressure to roll empty leaderboards. Aligns with operator expectation that **competition clock starts on participation**, not on epoch index increment alone. Related: [#271](https://gitlab.com/PlasticDigits/yieldomega/-/issues/271) (per-category timer params), [#247](https://gitlab.com/PlasticDigits/yieldomega/-/issues/247) (diverging rolls), [#312](https://gitlab.com/PlasticDigits/yieldomega/-/issues/312) (autoroll).
PlasticDigits commented 2026-06-19 02:54:15 +00:00 (Migrated from gitlab.com)

Reminder that for buys to update timer/be qualifying, the wallet has to be high enough level for the podium.

Reminder that for buys to update timer/be qualifying, the wallet has to be high enough level for the podium.
PlasticDigits commented 2026-06-19 03:44:01 +00:00 (Migrated from gitlab.com)

mentioned in commit cc9a848987

mentioned in commit cc9a8489874bc886c1b4c2cada001801b9641075
PlasticDigits commented 2026-06-19 03:44:17 +00:00 (Migrated from gitlab.com)

mentioned in merge request !504

mentioned in merge request !504
PlasticDigits commented 2026-06-19 03:44:17 +00:00 (Migrated from gitlab.com)

Implementation complete — MR !504

Merge request: https://gitlab.com/PlasticDigits/yieldomega/-/merge_requests/134

Per-category podium timers (Option B) now arm on the first qualifying buy in each category, not at epoch open.

Verified (PASS)

Check Command
Contracts cd contracts && forge test --match-contract TimeArenaTest — 118 tests
Anvil timers bash scripts/verify-podium-timers-anvil.sh
Indexer cd indexer && cargo clippy --all-targets -- -D warnings && cargo test
Podium live bash scripts/verify-podium-live-anvil.sh
Frontend typecheck cd frontend && npm run typecheck
Frontend timer unit tests arenaPodiumTimerDisplay, useArenaProtocolPodiumAudit, ArenaTimerChips

SKIP (manual / stack)

  • Full npm run lint / npm test suite
  • Live curl on running stack + Rabby UI on / and /arena/protocol

Issue left open for merge via !504.

## Implementation complete — MR !504 **Merge request:** https://gitlab.com/PlasticDigits/yieldomega/-/merge_requests/134 Per-category podium timers (Option B) now arm on the first qualifying buy in each category, not at epoch open. ### Verified (PASS) | Check | Command | |-------|---------| | Contracts | `cd contracts && forge test --match-contract TimeArenaTest` — 118 tests | | Anvil timers | `bash scripts/verify-podium-timers-anvil.sh` | | Indexer | `cd indexer && cargo clippy --all-targets -- -D warnings && cargo test` | | Podium live | `bash scripts/verify-podium-live-anvil.sh` | | Frontend typecheck | `cd frontend && npm run typecheck` | | Frontend timer unit tests | `arenaPodiumTimerDisplay`, `useArenaProtocolPodiumAudit`, `ArenaTimerChips` | ### SKIP (manual / stack) - Full `npm run lint` / `npm test` suite - Live `curl` on running stack + Rabby UI on `/` and `/arena/protocol` Issue left **open** for merge via !504.
PlasticDigits commented 2026-06-19 03:55:26 +00:00 (Migrated from gitlab.com)

mentioned in commit 71d56404bc

mentioned in commit 71d56404bca180be1a4497e1b968f01075963fb4
PlasticDigits commented 2026-06-19 04:37:32 +00:00 (Migrated from gitlab.com)

Verification complete — MR !504 merged

Third-party QA re-verified #330 on main after merge of !504 (per-category arm-on-first-qualifying-buy, Option B).

Results

Layer Check Result
Contracts cd contracts && forge test --match-contract TimeArenaTest PASS — 118/118
Anvil timers bash scripts/verify-podium-timers-anvil.sh PASS (1st run hit 1s buy-cooldown race; 2nd run OK)
Indexer cargo clippy --all-targets -- -D warnings && cargo test PASS — 76 unit + 4 integration
Podium live bash scripts/verify-podium-live-anvil.sh PASS
Frontend npm run typecheck + timer unit tests (arenaPodiumTimerDisplay, useArenaProtocolPodiumAudit, ArenaTimerChips) PASS — 10/10
API Fresh stack, before buy: curl -s http://127.0.0.1:3100/v1/arena/timers | jq '{podium_timer_armed, podium_deadlines_sec}' PASS — all false / zeros (schema 2.17.0)
API After L1 DOUB buy (account #0): re-fetch timers PASS — podium_timer_armed[0]=true, live deadline; cats 1–3 still unarmed
Manual UI Playwright on http://127.0.0.1:5173/ (fresh arena) PASS — hero/chips show awaiting first buy, no dd:HH:MM:SS countdown
Manual UI Playwright on /arena/protocol (accordions expanded) PASS — unarmed categories show awaiting first buy; Last Buy shows live countdown after buy
Manual UI Play / after first buy PASS — Last Buy chip 1 d 00:01:56; other categories still awaiting
Docs/invariants INV-TIME-ARENA-PODIUM-TIMER-ARM, arena-v2.md, manual QA §330, play skills PASS — present on main

How verified

  1. glab issue view 330 --comments + MR !504 description for acceptance mapping.
  2. Automated forge / Anvil verify scripts + indexer clippy/tests on Cloud VM (native Postgres :5433).
  3. bash scripts/start-qa-local-full-stack.sh --live-sale --no-swarm --no-frontend + npm run dev; headed Playwright checks on / and /arena/protocol; on-chain buy via cast send (Anvil #0, level-gated L1 → cat 0 only).

Follow-ups

  • verify-podium-timers-anvil.sh: first-buy step can flake when YIELDOMEGA_DEPLOY_NO_COOLDOWN=1 leaves buyCooldownSec=1 and deploy/seed txs land in the same second — consider anvil_increaseTime before the first buy (same pattern as verify-podium-live-anvil.sh warp_past_cooldown).
  • npm run lint: unrelated pre-existing prefer-const error in useArenaPendingRevengeTargets.ts (#135); not blocking #330 acceptance (checklist targets typecheck + timer tests).

Closing — implementation verified on main.

## Verification complete — MR !504 merged Third-party QA re-verified **#330** on `main` after merge of !504 (per-category arm-on-first-qualifying-buy, Option B). ### Results | Layer | Check | Result | |-------|-------|--------| | Contracts | `cd contracts && forge test --match-contract TimeArenaTest` | **PASS** — 118/118 | | Anvil timers | `bash scripts/verify-podium-timers-anvil.sh` | **PASS** (1st run hit 1s buy-cooldown race; 2nd run OK) | | Indexer | `cargo clippy --all-targets -- -D warnings && cargo test` | **PASS** — 76 unit + 4 integration | | Podium live | `bash scripts/verify-podium-live-anvil.sh` | **PASS** | | Frontend | `npm run typecheck` + timer unit tests (`arenaPodiumTimerDisplay`, `useArenaProtocolPodiumAudit`, `ArenaTimerChips`) | **PASS** — 10/10 | | API | Fresh stack, before buy: `curl -s http://127.0.0.1:3100/v1/arena/timers \| jq '{podium_timer_armed, podium_deadlines_sec}'` | **PASS** — all `false` / zeros (schema 2.17.0) | | API | After L1 DOUB buy (account #0): re-fetch timers | **PASS** — `podium_timer_armed[0]=true`, live deadline; cats 1–3 still unarmed | | Manual UI | Playwright on `http://127.0.0.1:5173/` (fresh arena) | **PASS** — hero/chips show **awaiting first buy**, no `dd:HH:MM:SS` countdown | | Manual UI | Playwright on `/arena/protocol` (accordions expanded) | **PASS** — unarmed categories show **awaiting first buy**; Last Buy shows live countdown after buy | | Manual UI | Play `/` after first buy | **PASS** — Last Buy chip `1 d 00:01:56`; other categories still awaiting | | Docs/invariants | `INV-TIME-ARENA-PODIUM-TIMER-ARM`, `arena-v2.md`, manual QA §330, play skills | **PASS** — present on main | ### How verified 1. `glab issue view 330 --comments` + MR !504 description for acceptance mapping. 2. Automated forge / Anvil verify scripts + indexer clippy/tests on Cloud VM (native Postgres `:5433`). 3. `bash scripts/start-qa-local-full-stack.sh --live-sale --no-swarm --no-frontend` + `npm run dev`; headed Playwright checks on `/` and `/arena/protocol`; on-chain buy via `cast send` (Anvil #0, level-gated L1 → cat 0 only). ### Follow-ups - **`verify-podium-timers-anvil.sh`**: first-buy step can flake when `YIELDOMEGA_DEPLOY_NO_COOLDOWN=1` leaves `buyCooldownSec=1` and deploy/seed txs land in the same second — consider `anvil_increaseTime` before the first `buy` (same pattern as `verify-podium-live-anvil.sh` `warp_past_cooldown`). - **`npm run lint`**: unrelated pre-existing `prefer-const` error in `useArenaPendingRevengeTargets.ts` (#135); not blocking #330 acceptance (checklist targets typecheck + timer tests). Closing — implementation verified on main.
PlasticDigits (Migrated from gitlab.com) closed this issue 2026-06-19 04:37:33 +00:00
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#330
No description provided.