Frontend: finish CL8Y unlimited-approval localStorage rename (drop TimeCurve doc token) #277

Closed
opened 2026-06-01 13:14:13 +00:00 by PlasticDigits · 13 comments
PlasticDigits commented 2026-06-01 13:14:13 +00:00 (Migrated from gitlab.com)

Summary

Finish the Arena v2 rename of the opt-in unlimited CL8Y → TimeArena localStorage preference. Canonical storage already uses yieldomega.erc20.cl8yArenaUnlimited.v1, but docs and UI copy still cite the retired cl8yTimeCurveUnlimited.v1 key — the last TimeCurve token in docs/ called out in #276 follow-up.

Parent: #276 · Policy: #274 · Original sizing: #143 · Shared approve gate: #224.


Current codebase

Storage + sizing (already partially migrated)

frontend/src/lib/arenaDoubApprovalPreference.ts:

Constant Value Role
CL8Y_ARENA_UNLIMITED_APPROVAL_STORAGE_KEY yieldomega.erc20.cl8yArenaUnlimited.v1 Canonical write target
CL8Y_ARENA_UNLIMITED_APPROVAL_LEGACY_KEY yieldomega.erc20.cl8yTimeCurveUnlimited.v1 Read-only fallback; removed on next enable write
  • readArenaDoubUnlimitedApproval() returns true if either key is "1".
  • writeCl8yArenaUnlimitedApproval(true) sets canonical key and removes legacy key.
  • arenaDoubApprovalAmountWei(need, unlimited) returns type(uint256).max when opted in, else need + 50 bps headroom (#143).

Consumers

Tests today

frontend/src/lib/arenaDoubApprovalPreference.test.ts — headroom math + canonical key roundtrip; no legacy-key migration test.

Stale surfaces (this issue)

Location Problem
docs/frontend/wallet-connection.md §143 Documents cl8yTimeCurveUnlimited.v1 as active key
ArenaDoubUnlimitedApprovalFieldset.tsx Label: “Remember unlimited CL8Y allowance for TimeCurve”; file comment still says TimeCurve
ensureCl8yKumbayaAllowance.ts Comment/type names EnsureCl8yTimeCurveAllowanceParams, “allowance for TimeCurve” (spender is already timeArenaAddress)

Doc gate impact

After #276, bash scripts/check-doc-satellite-retired-count.sh allows ≤25 mentions / ≤15 files. wallet-connection.md is the only non-invariant doc file still containing TimeCurve (embedded in the legacy key string).


Why this is needed

  1. Doc accuracy for agents/QA — Operators and third-party agents read wallet-connection.md; citing a retired key misleads debugging and violates the #276 intent.
  2. UX consistency — /arena participants should see Time Arena / TimeArena, not retired v1 product naming (#256).
  3. Complete the in-code migration — Canonical key exists; finish docs, UI copy, tests, and optional identifier cleanup without breaking existing wallets that still have the legacy key set.

Constraints and guardrails

Read .cursor/skills/yieldomega-guardrails/SKILL.md before implementation.

  • Do not change approval economics — same 50 bps headroom, same maxUint256 when opted in (#143).
  • Preserve legacy read path until users re-toggle or clear storage — do not drop CL8Y_ARENA_UNLIMITED_APPROVAL_LEGACY_KEY read without a migration test.
  • Spender remains TimeArena proxy — preference only affects CL8Y approve sizing to the configured arena address; no new unlimited paths for DOUB, WETH, USDM, or routers.
  • Toggling off does not revoke onchain allowance — document-only behavior; unchanged.
  • No new env vars — VITE_TIME_ARENA_ADDRESS only for arena writes (#266).
  • Docs-only gate — updating wallet-connection.md should drop docs/ mention count by 1; re-run check-doc-satellite-retired-count.sh.
  • Minimal diff — rename/comments/UI copy + tests; avoid unrelated TimeCurve comment cleanup elsewhere in this issue.

Relevant files

Path Action
frontend/src/lib/arenaDoubApprovalPreference.ts Export legacy key constant for tests or document inline; no behavior change unless adding explicit one-shot migration helper
frontend/src/lib/arenaDoubApprovalPreference.test.ts Add legacy read + migrate-on-write tests
frontend/src/components/ArenaDoubUnlimitedApprovalFieldset.tsx Arena-neutral label + comment
frontend/src/lib/ensureCl8yKumbayaAllowance.ts Optional: rename EnsureCl8yTimeCurveAllowanceParams → Arena-neutral alias (keep export alias if widely imported)
frontend/src/lib/ensureCl8yKumbayaAllowance.test.ts Update if type renamed
docs/frontend/wallet-connection.md Document cl8yArenaUnlimited.v1; one-line note that legacy key is read once then removed
docs/testing/invariants-and-business-logic.md Optional: add INV-FRONTEND-* row under #276 satellite section if doc gate counts change

  1. Docs — Replace cl8yTimeCurveUnlimited.v1 with cl8yArenaUnlimited.v1 in wallet-connection.md; add ≤1 line: “Legacy …cl8yTimeCurveUnlimited.v1 is honored on read and removed when the user re-enables the checkbox.”
  2. UI — Change checkbox text to e.g. “Remember unlimited CL8Y allowance for Time Arena (optional)” (match arena-views.md tone).
  3. Tests — readArenaDoubUnlimitedApproval() true when only legacy key set; after writeCl8yArenaUnlimitedApproval(true), legacy absent and canonical present.
  4. Optional cleanup — Rename EnsureCl8yTimeCurveAllowanceParams with a type alias for backward compatibility; fix file header comments to say TimeArena.
  5. Verification — cd frontend && npm test; bash scripts/check-doc-satellite-retired-count.sh; manual /arena checkbox smoke.

Acceptance criteria

  • docs/frontend/wallet-connection.md documents yieldomega.erc20.cl8yArenaUnlimited.v1 as the active key (legacy key mentioned at most once as retired read-only).
  • rg 'cl8yTimeCurveUnlimited' docs/ — zero matches (or ≤1 in a single “Retired” sentence if team prefers explicit migration note without TimeCurve token — prefer zero).
  • bash scripts/check-doc-satellite-retired-count.sh — exit 0; wallet-connection.md no longer matches TimeCurve|FeeRouter.
  • /arena unlimited-approval checkbox label and component comment use Time Arena / TimeArena, not TimeCurve.
  • Legacy localStorage preference still works for wallets that only have the old key (automated test).
  • Enabling preference migrates legacy → canonical key (automated test).
  • Approval behavior unchanged: arenaDoubApprovalPreference.test.ts + ensureCl8yKumbayaAllowance.test.ts green.
  • cd frontend && npm test — all green.

Test plan — functional paths

# Path Steps Expected
1 Fresh user, unlimited off Clear storage → load /arena → buy CL8Y path Exact (+ headroom) approve when needed; checkbox unchecked
2 Opt in unlimited Check box → buy approve(TimeArena, max) once; subsequent buys skip approve if allowance sufficient
3 Opt out Uncheck box → buy Sized approve again; onchain max allowance may remain (user revokes in wallet if desired)
4 Legacy key only Seed cl8yTimeCurveUnlimited.v1=1 only → load page Checkbox shows checked; buy uses unlimited sizing
5 Legacy migration Legacy only → toggle off/on or enable write Canonical key set; legacy key removed
6 Private mode / quota Simulate localStorage throw Preference false; buys still work with per-tx exact approve
7 Wrong network #95 gate No approve/submit on wrong chain regardless of preference

Automated: extend arenaDoubApprovalPreference.test.ts; run full Vitest suite.


Test plan — attack, hack, and abuse vectors

Vector Risk Mitigation / test
Unlimited CL8Y approve to wrong spender High if UI pointed approve at non-arena address Assert ensureCl8yKumbayaAllowance always uses timeArenaAddress from env/config; wrong-network gate #95
XSS exfiltrating localStorage Low (boolean pref only; no secrets) No change; preference is non-sensitive — do not store keys or mnemonics
Cross-site localStorage injection N/A (same-origin) No change
User tricked into unlimited approve Medium (UX/social) Keep opt-in checkbox + disclosure text; label must name Time Arena spender context clearly
Stale unlimited allowance after arena redeploy Medium (old proxy still approved) Out of scope for key rename — document that users revoke in wallet when addresses change; optional follow-up
Legacy key forever dual-read Low (doc/tech debt) Migration-on-write removes legacy key; test ensures no duplicate writes
Malicious extension rewriting localStorage Low Same as XSS — cannot force onchain approve without wallet signature

Verification criteria

# Doc gates (#274, #276)
bash scripts/check-doc-retired-terms.sh
bash scripts/check-doc-anchors.sh
bash scripts/check-doc-satellite-retired-count.sh

# Doc token spot-check
rg 'TimeCurve|FeeRouter' docs/frontend/wallet-connection.md   # expect: no matches
rg 'cl8yTimeCurveUnlimited' docs/                           # expect: no matches

# Frontend
cd frontend && npm test

# Manual (Anvil)
bash scripts/start-local-anvil-stack.sh
# open /arena, exercise checkbox + one CL8Y buy with pref on/off

Manual QA cross-links: wallet-connection §143 · manual QA §260 · invariants §276.


  • #276 — satellite doc trim (follow-up called out legacy key rename)
  • #274 — P0 retired-term gate
  • #143 / #224 — approval sizing and idempotent approve gate
## Summary Finish the Arena v2 rename of the opt-in **unlimited CL8Y → TimeArena** `localStorage` preference. Canonical storage already uses **`yieldomega.erc20.cl8yArenaUnlimited.v1`**, but **docs and UI copy still cite the retired `cl8yTimeCurveUnlimited.v1` key** — the last `TimeCurve` token in `docs/` called out in [#276](https://gitlab.com/PlasticDigits/yieldomega/-/issues/276) follow-up. Parent: [#276](https://gitlab.com/PlasticDigits/yieldomega/-/issues/276) · Policy: [#274](https://gitlab.com/PlasticDigits/yieldomega/-/issues/274) · Original sizing: [#143](https://gitlab.com/PlasticDigits/yieldomega/-/issues/143) · Shared approve gate: [#224](https://gitlab.com/PlasticDigits/yieldomega/-/issues/224). --- ## Current codebase ### Storage + sizing (already partially migrated) [`frontend/src/lib/arenaDoubApprovalPreference.ts`](frontend/src/lib/arenaDoubApprovalPreference.ts): | Constant | Value | Role | |----------|-------|------| | `CL8Y_ARENA_UNLIMITED_APPROVAL_STORAGE_KEY` | `yieldomega.erc20.cl8yArenaUnlimited.v1` | **Canonical** write target | | `CL8Y_ARENA_UNLIMITED_APPROVAL_LEGACY_KEY` | `yieldomega.erc20.cl8yTimeCurveUnlimited.v1` | **Read-only** fallback; removed on next enable write | - `readArenaDoubUnlimitedApproval()` returns true if **either** key is `"1"`. - `writeCl8yArenaUnlimitedApproval(true)` sets canonical key and **removes** legacy key. - `arenaDoubApprovalAmountWei(need, unlimited)` returns `type(uint256).max` when opted in, else `need + 50 bps` headroom ([#143](https://gitlab.com/PlasticDigits/yieldomega/-/issues/143)). ### Consumers - [`frontend/src/components/ArenaDoubUnlimitedApprovalFieldset.tsx`](frontend/src/components/ArenaDoubUnlimitedApprovalFieldset.tsx) — checkbox on `/arena` buy panels (`data-testid="cl8y-arena-approval-pref"`). - [`frontend/src/lib/ensureCl8yKumbayaAllowance.ts`](frontend/src/lib/ensureCl8yKumbayaAllowance.ts) — reads preference via `readArenaDoubUnlimitedApproval()`; approves CL8Y → **`timeArenaAddress`** only when `allowance < approveAmt` ([#224](https://gitlab.com/PlasticDigits/yieldomega/-/issues/224)). - [`frontend/src/lib/ensureDoubTimeArenaAllowance.ts`](frontend/src/lib/ensureDoubTimeArenaAllowance.ts) — DOUB path uses same sizing helper. ### Tests today [`frontend/src/lib/arenaDoubApprovalPreference.test.ts`](frontend/src/lib/arenaDoubApprovalPreference.test.ts) — headroom math + canonical key roundtrip; **no legacy-key migration test**. ### Stale surfaces (this issue) | Location | Problem | |----------|-----------| | [`docs/frontend/wallet-connection.md`](docs/frontend/wallet-connection.md) §143 | Documents **`cl8yTimeCurveUnlimited.v1`** as active key | | [`ArenaDoubUnlimitedApprovalFieldset.tsx`](frontend/src/components/ArenaDoubUnlimitedApprovalFieldset.tsx) | Label: “Remember unlimited CL8Y allowance for **TimeCurve**”; file comment still says TimeCurve | | [`ensureCl8yKumbayaAllowance.ts`](frontend/src/lib/ensureCl8yKumbayaAllowance.ts) | Comment/type names `EnsureCl8yTimeCurveAllowanceParams`, “allowance for TimeCurve” (spender is already `timeArenaAddress`) | ### Doc gate impact After [#276](https://gitlab.com/PlasticDigits/yieldomega/-/issues/276), `bash scripts/check-doc-satellite-retired-count.sh` allows ≤25 mentions / ≤15 files. **`wallet-connection.md` is the only non-invariant doc file still containing `TimeCurve`** (embedded in the legacy key string). --- ## Why this is needed 1. **Doc accuracy for agents/QA** — Operators and third-party agents read `wallet-connection.md`; citing a retired key misleads debugging and violates the [#276](https://gitlab.com/PlasticDigits/yieldomega/-/issues/276) intent. 2. **UX consistency** — `/arena` participants should see **Time Arena / TimeArena**, not retired v1 product naming ([#256](https://gitlab.com/PlasticDigits/yieldomega/-/issues/256)). 3. **Complete the in-code migration** — Canonical key exists; finish docs, UI copy, tests, and optional identifier cleanup without breaking existing wallets that still have the legacy key set. --- ## Constraints and guardrails Read [`.cursor/skills/yieldomega-guardrails/SKILL.md`](.cursor/skills/yieldomega-guardrails/SKILL.md) before implementation. - **Do not change approval economics** — same 50 bps headroom, same `maxUint256` when opted in ([#143](https://gitlab.com/PlasticDigits/yieldomega/-/issues/143)). - **Preserve legacy read path** until users re-toggle or clear storage — do **not** drop `CL8Y_ARENA_UNLIMITED_APPROVAL_LEGACY_KEY` read without a migration test. - **Spender remains `TimeArena` proxy** — preference only affects **CL8Y** approve sizing to the configured arena address; no new unlimited paths for DOUB, WETH, USDM, or routers. - **Toggling off does not revoke onchain allowance** — document-only behavior; unchanged. - **No new env vars** — `VITE_TIME_ARENA_ADDRESS` only for arena writes ([#266](https://gitlab.com/PlasticDigits/yieldomega/-/issues/266)). - **Docs-only gate** — updating `wallet-connection.md` should drop `docs/` mention count by 1; re-run `check-doc-satellite-retired-count.sh`. - **Minimal diff** — rename/comments/UI copy + tests; avoid unrelated TimeCurve comment cleanup elsewhere in this issue. --- ## Relevant files | Path | Action | |------|--------| | [`frontend/src/lib/arenaDoubApprovalPreference.ts`](frontend/src/lib/arenaDoubApprovalPreference.ts) | Export legacy key constant for tests **or** document inline; no behavior change unless adding explicit one-shot migration helper | | [`frontend/src/lib/arenaDoubApprovalPreference.test.ts`](frontend/src/lib/arenaDoubApprovalPreference.test.ts) | Add legacy read + migrate-on-write tests | | [`frontend/src/components/ArenaDoubUnlimitedApprovalFieldset.tsx`](frontend/src/components/ArenaDoubUnlimitedApprovalFieldset.tsx) | Arena-neutral label + comment | | [`frontend/src/lib/ensureCl8yKumbayaAllowance.ts`](frontend/src/lib/ensureCl8yKumbayaAllowance.ts) | Optional: rename `EnsureCl8yTimeCurveAllowanceParams` → Arena-neutral alias (keep export alias if widely imported) | | [`frontend/src/lib/ensureCl8yKumbayaAllowance.test.ts`](frontend/src/lib/ensureCl8yKumbayaAllowance.test.ts) | Update if type renamed | | [`docs/frontend/wallet-connection.md`](docs/frontend/wallet-connection.md) | Document **`cl8yArenaUnlimited.v1`**; one-line note that legacy key is read once then removed | | [`docs/testing/invariants-and-business-logic.md`](docs/testing/invariants-and-business-logic.md) | Optional: add **`INV-FRONTEND-*`** row under [#276](https://gitlab.com/PlasticDigits/yieldomega/-/issues/276) satellite section if doc gate counts change | --- ## Recommended solution direction 1. **Docs** — Replace `cl8yTimeCurveUnlimited.v1` with `cl8yArenaUnlimited.v1` in `wallet-connection.md`; add ≤1 line: “Legacy `…cl8yTimeCurveUnlimited.v1` is honored on read and removed when the user re-enables the checkbox.” 2. **UI** — Change checkbox text to e.g. “Remember unlimited CL8Y allowance for **Time Arena** (optional)” (match [`arena-views.md`](docs/frontend/arena-views.md) tone). 3. **Tests** — `readArenaDoubUnlimitedApproval()` true when only legacy key set; after `writeCl8yArenaUnlimitedApproval(true)`, legacy absent and canonical present. 4. **Optional cleanup** — Rename `EnsureCl8yTimeCurveAllowanceParams` with a type alias for backward compatibility; fix file header comments to say **TimeArena**. 5. **Verification** — `cd frontend && npm test`; `bash scripts/check-doc-satellite-retired-count.sh`; manual `/arena` checkbox smoke. --- ## Acceptance criteria - [ ] `docs/frontend/wallet-connection.md` documents **`yieldomega.erc20.cl8yArenaUnlimited.v1`** as the active key (legacy key mentioned at most once as retired read-only). - [ ] `rg 'cl8yTimeCurveUnlimited' docs/` — **zero** matches (or ≤1 in a single “Retired” sentence if team prefers explicit migration note without `TimeCurve` token — prefer **zero**). - [ ] `bash scripts/check-doc-satellite-retired-count.sh` — exit 0; **`wallet-connection.md` no longer matches** `TimeCurve|FeeRouter`. - [ ] `/arena` unlimited-approval checkbox label and component comment use **Time Arena / TimeArena**, not TimeCurve. - [ ] Legacy `localStorage` preference still works for wallets that only have the old key (automated test). - [ ] Enabling preference migrates legacy → canonical key (automated test). - [ ] Approval behavior unchanged: `arenaDoubApprovalPreference.test.ts` + `ensureCl8yKumbayaAllowance.test.ts` green. - [ ] `cd frontend && npm test` — all green. --- ## Test plan — functional paths | # | Path | Steps | Expected | |---|------|-------|----------| | 1 | Fresh user, unlimited off | Clear storage → load `/arena` → buy CL8Y path | Exact (+ headroom) approve when needed; checkbox unchecked | | 2 | Opt in unlimited | Check box → buy | `approve(TimeArena, max)` once; subsequent buys skip approve if allowance sufficient | | 3 | Opt out | Uncheck box → buy | Sized approve again; **onchain max allowance may remain** (user revokes in wallet if desired) | | 4 | Legacy key only | Seed `cl8yTimeCurveUnlimited.v1=1` only → load page | Checkbox shows checked; buy uses unlimited sizing | | 5 | Legacy migration | Legacy only → toggle off/on or enable write | Canonical key set; legacy key removed | | 6 | Private mode / quota | Simulate `localStorage` throw | Preference false; buys still work with per-tx exact approve | | 7 | Wrong network | [#95](https://gitlab.com/PlasticDigits/yieldomega/-/issues/95) gate | No approve/submit on wrong chain regardless of preference | **Automated:** extend `arenaDoubApprovalPreference.test.ts`; run full Vitest suite. --- ## Test plan — attack, hack, and abuse vectors | Vector | Risk | Mitigation / test | |--------|------|-------------------| | **Unlimited CL8Y approve to wrong spender** | High if UI pointed approve at non-arena address | Assert `ensureCl8yKumbayaAllowance` always uses `timeArenaAddress` from env/config; wrong-network gate [#95](https://gitlab.com/PlasticDigits/yieldomega/-/issues/95) | | **XSS exfiltrating localStorage** | Low (boolean pref only; no secrets) | No change; preference is non-sensitive — do not store keys or mnemonics | | **Cross-site localStorage injection** | N/A (same-origin) | No change | | **User tricked into unlimited approve** | Medium (UX/social) | Keep opt-in checkbox + disclosure text; label must name **Time Arena** spender context clearly | | **Stale unlimited allowance after arena redeploy** | Medium (old proxy still approved) | Out of scope for key rename — document that users revoke in wallet when addresses change; optional follow-up | | **Legacy key forever dual-read** | Low (doc/tech debt) | Migration-on-write removes legacy key; test ensures no duplicate writes | | **Malicious extension rewriting localStorage** | Low | Same as XSS — cannot force onchain approve without wallet signature | --- ## Verification criteria ```bash # Doc gates (#274, #276) bash scripts/check-doc-retired-terms.sh bash scripts/check-doc-anchors.sh bash scripts/check-doc-satellite-retired-count.sh # Doc token spot-check rg 'TimeCurve|FeeRouter' docs/frontend/wallet-connection.md # expect: no matches rg 'cl8yTimeCurveUnlimited' docs/ # expect: no matches # Frontend cd frontend && npm test # Manual (Anvil) bash scripts/start-local-anvil-stack.sh # open /arena, exercise checkbox + one CL8Y buy with pref on/off ``` **Manual QA cross-links:** [wallet-connection §143](docs/frontend/wallet-connection.md#erc20-approval-sizing-h-01-gitlab-143) · [manual QA §260](docs/testing/manual-qa-checklists.md#manual-qa-issue-260) · [invariants §276](docs/testing/invariants-and-business-logic.md#satellite-docs-gitlab-276). --- ## Related - [#276](https://gitlab.com/PlasticDigits/yieldomega/-/issues/276) — satellite doc trim (follow-up called out legacy key rename) - [#274](https://gitlab.com/PlasticDigits/yieldomega/-/issues/274) — P0 retired-term gate - [#143](https://gitlab.com/PlasticDigits/yieldomega/-/issues/143) / [#224](https://gitlab.com/PlasticDigits/yieldomega/-/issues/224) — approval sizing and idempotent approve gate
PlasticDigits commented 2026-06-01 13:14:14 +00:00 (Migrated from gitlab.com)

marked as related to #276

marked as related to #276
PlasticDigits commented 2026-06-01 13:23:08 +00:00 (Migrated from gitlab.com)

mentioned in commit d2ec836cb4

mentioned in commit d2ec836cb415b0adf18d369b63e03237a1794bee
PlasticDigits commented 2026-06-01 13:23:27 +00:00 (Migrated from gitlab.com)

Implementation complete (merged to main — d2ec836)

Finished the Arena v2 rename of the opt-in unlimited CL8Y → TimeArena localStorage preference (#277).

What changed

Behavior unchanged: 50 bps headroom / maxUint256 when opted in; legacy key still honored on read; migrate-on-write on enable; toggling off does not revoke onchain allowance.

Automated verification (passed)

  • cd frontend && npm test — 534 tests green (includes 3 new #277 tests)
  • bash scripts/check-doc-retired-terms.sh
  • bash scripts/check-doc-anchors.sh
  • bash scripts/check-doc-satellite-retired-count.sh — files=2, mentions=9
  • rg 'cl8yTimeCurveUnlimited' docs/ — zero matches
  • rg 'TimeCurve|FeeRouter' docs/frontend/wallet-connection.md — zero matches

QA verification checklist

  • Load /arena — checkbox label reads "Remember unlimited CL8Y allowance for Time Arena (optional)"
  • Fresh wallet (cleared storage): checkbox unchecked; CL8Y buy uses exact (+50 bps) approve when needed
  • Opt in → buy: approve(TimeArena, max) once; subsequent buys skip approve if allowance sufficient
  • Opt out → buy: sized approve again (onchain max may remain — revoke in wallet if desired)
  • Legacy migration: seed only retired v1 key in DevTools → checkbox checked; after re-enable, canonical key present and legacy key removed
  • Wrong network (#95): no approve/submit regardless of preference

Doc map: wallet-connection §143 · invariants §277

Follow-up (optional, out of scope)

  • Stale unlimited allowance after arena proxy redeploy — users revoke in wallet when addresses change (not introduced by this rename).

Requesting verification from the QA agent team. Issue left open until manual checklist is signed off.

## Implementation complete (merged to `main` — `d2ec836`) Finished the Arena v2 rename of the opt-in unlimited **CL8Y → TimeArena** `localStorage` preference ([#277](https://gitlab.com/PlasticDigits/yieldomega/-/issues/277)). ### What changed - **Docs:** [`docs/frontend/wallet-connection.md`](docs/frontend/wallet-connection.md) §143 now documents canonical key **`yieldomega.erc20.cl8yArenaUnlimited.v1`**; retired v1 key described without embedding the legacy token string (drops last `TimeCurve` mention in non-invariant docs per #276 follow-up). - **UI:** [`ArenaDoubUnlimitedApprovalFieldset.tsx`](frontend/src/components/ArenaDoubUnlimitedApprovalFieldset.tsx) label/comment use **Time Arena** instead of TimeCurve. - **Code:** Exported `CL8Y_ARENA_UNLIMITED_APPROVAL_LEGACY_KEY` for tests; renamed `EnsureCl8yTimeCurveAllowanceParams` → `EnsureCl8yArenaAllowanceParams` with deprecated alias; TimeArena comments in [`ensureCl8yKumbayaAllowance.ts`](frontend/src/lib/ensureCl8yKumbayaAllowance.ts). - **Tests:** Added legacy read + migrate-on-write + dual-key clear tests in [`arenaDoubApprovalPreference.test.ts`](frontend/src/lib/arenaDoubApprovalPreference.test.ts). - **Invariants:** New section [`INV-FRONTEND-277-*`](docs/testing/invariants-and-business-logic.md#frontend-cl8y-arena-approval-storage-gitlab-277). - **Agent cross-links:** [`.cursor/skills/yieldomega-guardrails/SKILL.md`](.cursor/skills/yieldomega-guardrails/SKILL.md) · [`skills/play-time-arena-doub/SKILL.md`](skills/play-time-arena-doub/SKILL.md). **Behavior unchanged:** 50 bps headroom / `maxUint256` when opted in; legacy key still honored on read; migrate-on-write on enable; toggling off does not revoke onchain allowance. ### Automated verification (passed) - [x] `cd frontend && npm test` — 534 tests green (includes 3 new #277 tests) - [x] `bash scripts/check-doc-retired-terms.sh` - [x] `bash scripts/check-doc-anchors.sh` - [x] `bash scripts/check-doc-satellite-retired-count.sh` — files=2, mentions=9 - [x] `rg 'cl8yTimeCurveUnlimited' docs/` — zero matches - [x] `rg 'TimeCurve|FeeRouter' docs/frontend/wallet-connection.md` — zero matches ### QA verification checklist - [ ] Load `/arena` — checkbox label reads **"Remember unlimited CL8Y allowance for Time Arena (optional)"** - [ ] Fresh wallet (cleared storage): checkbox unchecked; CL8Y buy uses exact (+50 bps) approve when needed - [ ] Opt in → buy: `approve(TimeArena, max)` once; subsequent buys skip approve if allowance sufficient - [ ] Opt out → buy: sized approve again (onchain max may remain — revoke in wallet if desired) - [ ] Legacy migration: seed only retired v1 key in DevTools → checkbox checked; after re-enable, canonical key present and legacy key removed - [ ] Wrong network ([#95](https://gitlab.com/PlasticDigits/yieldomega/-/issues/95)): no approve/submit regardless of preference **Doc map:** [wallet-connection §143](docs/frontend/wallet-connection.md#erc20-approval-sizing-h-01-gitlab-143) · [invariants §277](docs/testing/invariants-and-business-logic.md#frontend-cl8y-arena-approval-storage-gitlab-277) ### Follow-up (optional, out of scope) - Stale unlimited allowance after arena proxy redeploy — users revoke in wallet when addresses change (not introduced by this rename). --- Requesting verification from the QA agent team. Issue left open until manual checklist is signed off.
ghost1 commented 2026-06-02 08:31:20 +00:00 (Migrated from gitlab.com)

Cloud agent verification — issue #277 (iteration 1/5)

Verified main at f8500e7 against acceptance criteria and INV-FRONTEND-277-*. No code or doc changes required; implementation already matches the issue (prior merge noted in thread).

Acceptance criteria

Criterion Result How verified
wallet-connection.md documents yieldomega.erc20.cl8yArenaUnlimited.v1 as active key; legacy at most once without embedding retired token PASS Read docs/frontend/wallet-connection.md §143 — canonical key named; legacy described without cl8yTimeCurveUnlimited string
rg 'cl8yTimeCurveUnlimited' docs/ — zero matches PASS rg 'cl8yTimeCurveUnlimited' docs/ → no matches
bash scripts/check-doc-satellite-retired-count.sh exit 0; wallet-connection.md no TimeCurve|FeeRouter PASS files=2 mentions=9 OK; rg 'TimeCurve|FeeRouter' docs/frontend/wallet-connection.md → no matches
/arena checkbox label + component comment use Time Arena, not TimeCurve PASS ArenaDoubUnlimitedApprovalFieldset.tsx: label "Remember unlimited CL8Y allowance for Time Arena (optional)"; file header cites Time Arena / #277
Legacy localStorage still works (automated) PASS arenaDoubApprovalPreference.test.ts — readArenaDoubUnlimitedApproval: true when only legacy key is set (#277)
Enabling preference migrates legacy → canonical (automated) PASS Same file — writeCl8yArenaUnlimitedApproval(true): migrates legacy key to canonical (#277)
Approval behavior unchanged (arenaDoubApprovalPreference + ensureCl8yKumbayaAllowance tests) PASS cd frontend && npm test — 103 files, 534 tests green (includes both suites)
cd frontend && npm test — all green PASS See above
Doc gates (#274, #276) PASS check-doc-retired-terms.sh, check-doc-anchors.sh (40 anchors), check-doc-satellite-retired-count.sh — all exit 0

Invariants (INV-FRONTEND-277-*)

ID Result Evidence
INV-FRONTEND-277-CL8Y-ARENA-STORAGE PASS CL8Y_ARENA_UNLIMITED_APPROVAL_STORAGE_KEY → yieldomega.erc20.cl8yArenaUnlimited.v1; UI label names Time Arena
INV-FRONTEND-277-LEGACY-READ-MIGRATE PASS Legacy key constant + migration tests in arenaDoubApprovalPreference.test.ts
INV-FRONTEND-277-APPROVAL-UNCHANGED PASS Headroom + maxUint256 tests; ensureCl8yKumbayaAllowance.test.ts green
Surface Result
.cursor/skills/yieldomega-guardrails/SKILL.md §9d + invariants pointer PASS
skills/play-time-arena-doub/SKILL.md CL8Y unlimited approve bullet PASS
docs/testing/invariants-and-business-logic.md §277 anchor PASS

Manual functional paths (issue test plan #1–7)

Path Result Notes
Fresh user / opt in / opt out / legacy / migration / private mode / wrong network SKIP Requires Anvil + /arena wallet smoke per issue; not started per agent scope (automated coverage sufficient for close)

Optional follow-up

  • Run /arena checkbox smoke on Anvil when convenient (paths 1–7 in issue body).
  • Consider closing #277 if still open after this verification (implementation already on main).
## Cloud agent verification — issue #277 (iteration 1/5) Verified **`main`** at `f8500e7` against acceptance criteria and `INV-FRONTEND-277-*`. No code or doc changes required; implementation already matches the issue (prior merge noted in thread). ### Acceptance criteria | Criterion | Result | How verified | |-----------|--------|--------------| | `wallet-connection.md` documents **`yieldomega.erc20.cl8yArenaUnlimited.v1`** as active key; legacy at most once without embedding retired token | **PASS** | Read `docs/frontend/wallet-connection.md` §143 — canonical key named; legacy described without `cl8yTimeCurveUnlimited` string | | `rg 'cl8yTimeCurveUnlimited' docs/` — zero matches | **PASS** | `rg 'cl8yTimeCurveUnlimited' docs/` → no matches | | `bash scripts/check-doc-satellite-retired-count.sh` exit 0; `wallet-connection.md` no `TimeCurve\|FeeRouter` | **PASS** | `files=2 mentions=9` OK; `rg 'TimeCurve\|FeeRouter' docs/frontend/wallet-connection.md` → no matches | | `/arena` checkbox label + component comment use Time Arena, not TimeCurve | **PASS** | `ArenaDoubUnlimitedApprovalFieldset.tsx`: label *"Remember unlimited CL8Y allowance for Time Arena (optional)"*; file header cites Time Arena / #277 | | Legacy `localStorage` still works (automated) | **PASS** | `arenaDoubApprovalPreference.test.ts` — `readArenaDoubUnlimitedApproval: true when only legacy key is set (#277)` | | Enabling preference migrates legacy → canonical (automated) | **PASS** | Same file — `writeCl8yArenaUnlimitedApproval(true): migrates legacy key to canonical (#277)` | | Approval behavior unchanged (`arenaDoubApprovalPreference` + `ensureCl8yKumbayaAllowance` tests) | **PASS** | `cd frontend && npm test` — **103 files, 534 tests** green (includes both suites) | | `cd frontend && npm test` — all green | **PASS** | See above | | Doc gates (#274, #276) | **PASS** | `check-doc-retired-terms.sh`, `check-doc-anchors.sh` (40 anchors), `check-doc-satellite-retired-count.sh` — all exit 0 | ### Invariants (`INV-FRONTEND-277-*`) | ID | Result | Evidence | |----|--------|----------| | `INV-FRONTEND-277-CL8Y-ARENA-STORAGE` | **PASS** | `CL8Y_ARENA_UNLIMITED_APPROVAL_STORAGE_KEY` → `yieldomega.erc20.cl8yArenaUnlimited.v1`; UI label names Time Arena | | `INV-FRONTEND-277-LEGACY-READ-MIGRATE` | **PASS** | Legacy key constant + migration tests in `arenaDoubApprovalPreference.test.ts` | | `INV-FRONTEND-277-APPROVAL-UNCHANGED` | **PASS** | Headroom + `maxUint256` tests; `ensureCl8yKumbayaAllowance.test.ts` green | ### Cross-links | Surface | Result | |---------|--------| | `.cursor/skills/yieldomega-guardrails/SKILL.md` §9d + invariants pointer | **PASS** | | `skills/play-time-arena-doub/SKILL.md` CL8Y unlimited approve bullet | **PASS** | | `docs/testing/invariants-and-business-logic.md` §277 anchor | **PASS** | ### Manual functional paths (issue test plan #1–7) | Path | Result | Notes | |------|--------|-------| | Fresh user / opt in / opt out / legacy / migration / private mode / wrong network | **SKIP** | Requires Anvil + `/arena` wallet smoke per issue; not started per agent scope (automated coverage sufficient for close) | ### Optional follow-up - Run `/arena` checkbox smoke on Anvil when convenient (paths 1–7 in issue body). - Consider closing #277 if still open after this verification (implementation already on `main`).
ghost1 commented 2026-06-02 09:25:16 +00:00 (Migrated from gitlab.com)

mentioned in commit 461bde8df6

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

mentioned in merge request !396

mentioned in merge request !396
PlasticDigits commented 2026-06-02 09:48:11 +00:00 (Migrated from gitlab.com)

mentioned in commit 2f06474e2c

mentioned in commit 2f06474e2c17125da80d18df1d9026f4d3ed6d3b
PlasticDigits commented 2026-06-02 10:00:11 +00:00 (Migrated from gitlab.com)

Cloud agent verification — issue #277 (iteration 2/5)

Verified main at 2f06474 against acceptance criteria, INV-FRONTEND-277-*, issue QA checklist, and functional test plan paths 1–7. No repository changes required — implementation already on main (prior merges d2ec836, 461bde8, 2f06474).

Acceptance criteria

Criterion Result How verified
wallet-connection.md documents yieldomega.erc20.cl8yArenaUnlimited.v1 as active key; legacy at most once without embedding retired token PASS Read docs/frontend/wallet-connection.md §143
rg 'cl8yTimeCurveUnlimited' docs/ — zero matches PASS rg 'cl8yTimeCurveUnlimited' docs/ → no matches
bash scripts/check-doc-satellite-retired-count.sh exit 0; wallet-connection.md no TimeCurve|FeeRouter PASS files=2 mentions=9 OK; rg 'TimeCurve|FeeRouter' docs/frontend/wallet-connection.md → no matches
/arena checkbox label + component comment use Time Arena, not TimeCurve PASS ArenaDoubUnlimitedApprovalFieldset.tsx label "Remember unlimited CL8Y allowance for Time Arena (optional)"; Playwright path 1
Legacy localStorage still works (automated) PASS arenaDoubApprovalPreference.test.ts + Playwright path 4
Enabling preference migrates legacy → canonical (automated) PASS arenaDoubApprovalPreference.test.ts + Playwright path 5
Approval behavior unchanged PASS arenaDoubApprovalPreference.test.ts · ensureCl8yKumbayaAllowance.test.ts
cd frontend && npm test — all green PASS 103 files, 534 tests green
Doc gates (#274, #276) PASS check-doc-retired-terms.sh · check-doc-anchors.sh (40 anchors) · check-doc-satellite-retired-count.sh

Invariants (INV-FRONTEND-277-*)

ID Result Evidence
INV-FRONTEND-277-CL8Y-ARENA-STORAGE PASS Canonical key constant + UI label; Playwright path 1
INV-FRONTEND-277-LEGACY-READ-MIGRATE PASS Vitest + Playwright paths 4–5
INV-FRONTEND-277-APPROVAL-UNCHANGED PASS Vitest headroom/max tests + ensureCl8yKumbayaAllowance.test.ts
Surface Result
.cursor/skills/yieldomega-guardrails/SKILL.md §9d PASS
skills/play-time-arena-doub/SKILL.md PASS
docs/testing/invariants-and-business-logic.md §277 anchor PASS

Manual functional paths (issue test plan #1–7)

Stack: bash scripts/start-qa-local-full-stack.sh --live-sale --no-swarm (Anvil 31337, indexer :3100, preview :4173 with VITE_E2E_MOCK_WALLET=1).

Path Result How verified
1 Fresh user, unlimited off PASS Playwright: ADVANCED panel, checkbox unchecked, Time Arena label
2 Opt in unlimited PASS Playwright: check → canonical key =1
3 Opt out PASS Playwright: uncheck → both keys cleared
4 Legacy key only PASS Playwright: seed legacy key → checkbox checked
5 Legacy migration PASS Playwright: off/on → canonical set, legacy removed
6 Private mode / quota PASS Playwright: throw on yieldomega.erc20.* keys → checkbox false, /arena loads
7 Wrong network (#95) PASS (partial) Playwright: arena-simple-chain-write-gate present, no overlay on correct chain, buy CTA enabled; chainMismatchWriteGuard.test.ts covers mismatch copy. Not exercised: wallet on wrong chain (E2E mock is single-chain only).

QA checklist (author comment)

Item Result
Checkbox label on /arena PASS (path 1)
Fresh wallet / opt in / opt out / legacy migration PASS (paths 1–5)
Wrong network gate PASS (partial — see path 7)

Issue left open per verification policy (manual sign-off / redeploy allowance follow-up still tracked in thread).

## Cloud agent verification — issue #277 (iteration 2/5) Verified **`main`** at `2f06474` against acceptance criteria, `INV-FRONTEND-277-*`, issue QA checklist, and functional test plan paths 1–7. **No repository changes required** — implementation already on `main` (prior merges `d2ec836`, `461bde8`, `2f06474`). ### Acceptance criteria | Criterion | Result | How verified | |-----------|--------|--------------| | `wallet-connection.md` documents **`yieldomega.erc20.cl8yArenaUnlimited.v1`** as active key; legacy at most once without embedding retired token | **PASS** | Read `docs/frontend/wallet-connection.md` §143 | | `rg 'cl8yTimeCurveUnlimited' docs/` — zero matches | **PASS** | `rg 'cl8yTimeCurveUnlimited' docs/` → no matches | | `bash scripts/check-doc-satellite-retired-count.sh` exit 0; `wallet-connection.md` no `TimeCurve\|FeeRouter` | **PASS** | `files=2 mentions=9` OK; `rg 'TimeCurve\|FeeRouter' docs/frontend/wallet-connection.md` → no matches | | `/arena` checkbox label + component comment use Time Arena, not TimeCurve | **PASS** | `ArenaDoubUnlimitedApprovalFieldset.tsx` label *"Remember unlimited CL8Y allowance for Time Arena (optional)"*; Playwright path 1 | | Legacy `localStorage` still works (automated) | **PASS** | `arenaDoubApprovalPreference.test.ts` + Playwright path 4 | | Enabling preference migrates legacy → canonical (automated) | **PASS** | `arenaDoubApprovalPreference.test.ts` + Playwright path 5 | | Approval behavior unchanged | **PASS** | `arenaDoubApprovalPreference.test.ts` · `ensureCl8yKumbayaAllowance.test.ts` | | `cd frontend && npm test` — all green | **PASS** | **103 files, 534 tests** green | | Doc gates (#274, #276) | **PASS** | `check-doc-retired-terms.sh` · `check-doc-anchors.sh` (40 anchors) · `check-doc-satellite-retired-count.sh` | ### Invariants (`INV-FRONTEND-277-*`) | ID | Result | Evidence | |----|--------|----------| | `INV-FRONTEND-277-CL8Y-ARENA-STORAGE` | **PASS** | Canonical key constant + UI label; Playwright path 1 | | `INV-FRONTEND-277-LEGACY-READ-MIGRATE` | **PASS** | Vitest + Playwright paths 4–5 | | `INV-FRONTEND-277-APPROVAL-UNCHANGED` | **PASS** | Vitest headroom/max tests + `ensureCl8yKumbayaAllowance.test.ts` | ### Cross-links | Surface | Result | |---------|--------| | `.cursor/skills/yieldomega-guardrails/SKILL.md` §9d | **PASS** | | `skills/play-time-arena-doub/SKILL.md` | **PASS** | | `docs/testing/invariants-and-business-logic.md` §277 anchor | **PASS** | ### Manual functional paths (issue test plan #1–7) Stack: `bash scripts/start-qa-local-full-stack.sh --live-sale --no-swarm` (Anvil `31337`, indexer `:3100`, preview `:4173` with `VITE_E2E_MOCK_WALLET=1`). | Path | Result | How verified | |------|--------|--------------| | 1 Fresh user, unlimited off | **PASS** | Playwright: ADVANCED panel, checkbox unchecked, Time Arena label | | 2 Opt in unlimited | **PASS** | Playwright: check → canonical key `=1` | | 3 Opt out | **PASS** | Playwright: uncheck → both keys cleared | | 4 Legacy key only | **PASS** | Playwright: seed legacy key → checkbox checked | | 5 Legacy migration | **PASS** | Playwright: off/on → canonical set, legacy removed | | 6 Private mode / quota | **PASS** | Playwright: throw on `yieldomega.erc20.*` keys → checkbox false, `/arena` loads | | 7 Wrong network (#95) | **PASS** (partial) | Playwright: `arena-simple-chain-write-gate` present, no overlay on correct chain, buy CTA enabled; `chainMismatchWriteGuard.test.ts` covers mismatch copy. **Not exercised:** wallet on wrong chain (E2E mock is single-chain only). | ### QA checklist (author comment) | Item | Result | |------|--------| | Checkbox label on `/arena` | **PASS** (path 1) | | Fresh wallet / opt in / opt out / legacy migration | **PASS** (paths 1–5) | | Wrong network gate | **PASS** (partial — see path 7) | Issue left **open** per verification policy (manual sign-off / redeploy allowance follow-up still tracked in thread).
PlasticDigits commented 2026-06-02 13:20:40 +00:00 (Migrated from gitlab.com)

Cloud agent verification — issue #277 (iteration 3/5)

Verified main at 7d7d3da against acceptance criteria, INV-FRONTEND-277-*, author QA checklist, and functional test plan paths 1–7. No repository changes required — implementation already matches the issue.

Acceptance criteria

Criterion Result How verified
wallet-connection.md documents yieldomega.erc20.cl8yArenaUnlimited.v1 as active key; legacy at most once without embedding retired token PASS Read docs/frontend/wallet-connection.md §143
rg 'cl8yTimeCurveUnlimited' docs/ — zero matches PASS rg 'cl8yTimeCurveUnlimited' docs/ → no matches
bash scripts/check-doc-satellite-retired-count.sh exit 0; wallet-connection.md no TimeCurve|FeeRouter PASS files=2 mentions=9 OK; rg 'TimeCurve|FeeRouter' docs/frontend/wallet-connection.md → no matches
/arena checkbox label + component comment use Time Arena, not TimeCurve PASS ArenaDoubUnlimitedApprovalFieldset.tsx + Playwright path 1
Legacy localStorage still works (automated) PASS arenaDoubApprovalPreference.test.ts + Playwright path 4
Enabling preference migrates legacy → canonical (automated) PASS arenaDoubApprovalPreference.test.ts + Playwright path 5
Approval behavior unchanged PASS arenaDoubApprovalPreference.test.ts · ensureCl8yKumbayaAllowance.test.ts (15 targeted tests)
cd frontend && npm test — all green PASS 103 files, 534 tests green
Doc gates (#274, #276) PASS check-doc-retired-terms.sh · check-doc-anchors.sh (40 anchors) · check-doc-satellite-retired-count.sh

Invariants (INV-FRONTEND-277-*)

ID Result Evidence
INV-FRONTEND-277-CL8Y-ARENA-STORAGE PASS Canonical key constant + Time Arena UI label; Playwright path 1
INV-FRONTEND-277-LEGACY-READ-MIGRATE PASS Vitest migration tests + Playwright paths 4–5
INV-FRONTEND-277-APPROVAL-UNCHANGED PASS Headroom / maxUint256 tests + ensureCl8yKumbayaAllowance.test.ts
Surface Result
.cursor/skills/yieldomega-guardrails/SKILL.md §9d + invariants pointer PASS
skills/play-time-arena-doub/SKILL.md CL8Y unlimited approve bullet PASS
docs/testing/invariants-and-business-logic.md §277 anchor PASS

Manual functional paths (issue test plan #1–7)

Stack: fresh Anvil 31337 + DeployDev/Kumbaya + Vite preview :4173 (VITE_E2E_MOCK_WALLET=1). Playwright one-off spec (7 tests, 5 workers requested; ran serially by project config).

Path Result How verified
1 Fresh user, unlimited off PASS Checkbox unchecked; label contains “Time Arena”, not “TimeCurve”
2 Opt in unlimited PASS Checkbox → yieldomega.erc20.cl8yArenaUnlimited.v1 = 1
3 Opt out PASS Uncheck → canonical + legacy keys cleared
4 Legacy key only PASS Seed legacy key only → checkbox checked
5 Legacy migration PASS Off/on → canonical set, legacy removed
6 Private mode / quota PASS localStorage throw on yieldomega.erc20.* → checkbox false; /arena loads
7 Wrong network (#95) PASS (partial) arena-simple-chain-write-gate visible; no .chain-mismatch-overlay on chain 31337. Not exercised: real wallet on wrong chain (E2E mock is single-chain). Onchain approve(max) on buy not re-run in this pass — covered by ensureCl8yKumbayaAllowance.test.ts.

QA checklist (author comment)

Item Result
Checkbox label on /arena PASS
Fresh wallet / opt in / opt out / legacy migration PASS
Wrong network gate PASS (partial — see path 7)

Issue left open per verification policy.

Follow-up (optional)

  • Add committed Playwright spec for paths 1–6 so future verifications do not rely on one-off scripts.
  • Exercise wrong-chain wallet manually when multi-chain E2E is available.
## Cloud agent verification — issue #277 (iteration 3/5) Verified **`main`** at `7d7d3da` against acceptance criteria, `INV-FRONTEND-277-*`, author QA checklist, and functional test plan paths 1–7. **No repository changes required** — implementation already matches the issue. ### Acceptance criteria | Criterion | Result | How verified | |-----------|--------|--------------| | `wallet-connection.md` documents **`yieldomega.erc20.cl8yArenaUnlimited.v1`** as active key; legacy at most once without embedding retired token | **PASS** | Read `docs/frontend/wallet-connection.md` §143 | | `rg 'cl8yTimeCurveUnlimited' docs/` — zero matches | **PASS** | `rg 'cl8yTimeCurveUnlimited' docs/` → no matches | | `bash scripts/check-doc-satellite-retired-count.sh` exit 0; `wallet-connection.md` no `TimeCurve\|FeeRouter` | **PASS** | `files=2 mentions=9` OK; `rg 'TimeCurve\|FeeRouter' docs/frontend/wallet-connection.md` → no matches | | `/arena` checkbox label + component comment use Time Arena, not TimeCurve | **PASS** | `ArenaDoubUnlimitedApprovalFieldset.tsx` + Playwright path 1 | | Legacy `localStorage` still works (automated) | **PASS** | `arenaDoubApprovalPreference.test.ts` + Playwright path 4 | | Enabling preference migrates legacy → canonical (automated) | **PASS** | `arenaDoubApprovalPreference.test.ts` + Playwright path 5 | | Approval behavior unchanged | **PASS** | `arenaDoubApprovalPreference.test.ts` · `ensureCl8yKumbayaAllowance.test.ts` (15 targeted tests) | | `cd frontend && npm test` — all green | **PASS** | **103 files, 534 tests** green | | Doc gates (#274, #276) | **PASS** | `check-doc-retired-terms.sh` · `check-doc-anchors.sh` (40 anchors) · `check-doc-satellite-retired-count.sh` | ### Invariants (`INV-FRONTEND-277-*`) | ID | Result | Evidence | |----|--------|----------| | `INV-FRONTEND-277-CL8Y-ARENA-STORAGE` | **PASS** | Canonical key constant + Time Arena UI label; Playwright path 1 | | `INV-FRONTEND-277-LEGACY-READ-MIGRATE` | **PASS** | Vitest migration tests + Playwright paths 4–5 | | `INV-FRONTEND-277-APPROVAL-UNCHANGED` | **PASS** | Headroom / `maxUint256` tests + `ensureCl8yKumbayaAllowance.test.ts` | ### Cross-links | Surface | Result | |---------|--------| | `.cursor/skills/yieldomega-guardrails/SKILL.md` §9d + invariants pointer | **PASS** | | `skills/play-time-arena-doub/SKILL.md` CL8Y unlimited approve bullet | **PASS** | | `docs/testing/invariants-and-business-logic.md` §277 anchor | **PASS** | ### Manual functional paths (issue test plan #1–7) Stack: fresh Anvil `31337` + DeployDev/Kumbaya + Vite preview `:4173` (`VITE_E2E_MOCK_WALLET=1`). Playwright one-off spec (7 tests, 5 workers requested; ran serially by project config). | Path | Result | How verified | |------|--------|--------------| | 1 Fresh user, unlimited off | **PASS** | Checkbox unchecked; label contains “Time Arena”, not “TimeCurve” | | 2 Opt in unlimited | **PASS** | Checkbox → `yieldomega.erc20.cl8yArenaUnlimited.v1` = `1` | | 3 Opt out | **PASS** | Uncheck → canonical + legacy keys cleared | | 4 Legacy key only | **PASS** | Seed legacy key only → checkbox checked | | 5 Legacy migration | **PASS** | Off/on → canonical set, legacy removed | | 6 Private mode / quota | **PASS** | `localStorage` throw on `yieldomega.erc20.*` → checkbox false; `/arena` loads | | 7 Wrong network (#95) | **PASS** (partial) | `arena-simple-chain-write-gate` visible; no `.chain-mismatch-overlay` on chain 31337. **Not exercised:** real wallet on wrong chain (E2E mock is single-chain). Onchain `approve(max)` on buy not re-run in this pass — covered by `ensureCl8yKumbayaAllowance.test.ts`. | ### QA checklist (author comment) | Item | Result | |------|--------| | Checkbox label on `/arena` | **PASS** | | Fresh wallet / opt in / opt out / legacy migration | **PASS** | | Wrong network gate | **PASS** (partial — see path 7) | Issue left **open** per verification policy. ### Follow-up (optional) - Add committed Playwright spec for paths 1–6 so future verifications do not rely on one-off scripts. - Exercise wrong-chain wallet manually when multi-chain E2E is available.
ghost1 commented 2026-06-02 14:25:10 +00:00 (Migrated from gitlab.com)

mentioned in commit 92f37fd76e

mentioned in commit 92f37fd76e2f05bfd4d4ca491ae3fbf101779654
PlasticDigits commented 2026-06-02 14:32:53 +00:00 (Migrated from gitlab.com)

mentioned in merge request !403

mentioned in merge request !403
PlasticDigits (Migrated from gitlab.com) closed this issue 2026-06-03 13:24:42 +00:00
PlasticDigits commented 2026-06-03 13:24:49 +00:00 (Migrated from gitlab.com)

Cloud agent verification — issue #277 (iteration 4/5)

Verified main at 6d520e7 against acceptance criteria, INV-FRONTEND-277-*, author QA checklist, and functional test plan paths 1–7. No repository changes required — implementation already matches the issue.

Acceptance criteria

Criterion Result How verified
wallet-connection.md documents yieldomega.erc20.cl8yArenaUnlimited.v1 as active key; legacy at most once without embedding retired token PASS Read docs/frontend/wallet-connection.md §143
rg 'cl8yTimeCurveUnlimited' docs/ — zero matches PASS rg 'cl8yTimeCurveUnlimited' docs/ → no matches
bash scripts/check-doc-satellite-retired-count.sh exit 0; wallet-connection.md no TimeCurve|FeeRouter PASS files=2 mentions=3 OK; rg 'TimeCurve|FeeRouter' docs/frontend/wallet-connection.md → no matches
/arena checkbox label + component comment use Time Arena, not TimeCurve PASS ArenaDoubUnlimitedApprovalFieldset.tsx + Playwright path 1
Legacy localStorage still works (automated) PASS arenaDoubApprovalPreference.test.ts + Playwright path 4
Enabling preference migrates legacy → canonical (automated) PASS arenaDoubApprovalPreference.test.ts + Playwright path 5
Approval behavior unchanged PASS 13 targeted tests in arenaDoubApprovalPreference.test.ts · ensureCl8yKumbayaAllowance.test.ts
cd frontend && npm test — all green PASS 103 files, 535 tests green
Doc gates (#274, #276) PASS check-doc-retired-terms.sh · check-doc-anchors.sh (43 anchors) · check-doc-satellite-retired-count.sh

Invariants (INV-FRONTEND-277-*)

ID Result Evidence
INV-FRONTEND-277-CL8Y-ARENA-STORAGE PASS Canonical key constant + Time Arena UI label; Playwright path 1
INV-FRONTEND-277-LEGACY-READ-MIGRATE PASS Vitest migration tests + Playwright paths 4–5
INV-FRONTEND-277-APPROVAL-UNCHANGED PASS Headroom / maxUint256 tests + ensureCl8yKumbayaAllowance.test.ts
Surface Result
.cursor/skills/yieldomega-guardrails/SKILL.md §9d + invariants pointer PASS
skills/play-time-arena-doub/SKILL.md CL8Y unlimited approve bullet PASS
docs/testing/invariants-and-business-logic.md §277 anchor PASS

Manual functional paths (issue test plan #1–7)

Stack: YIELDOMEGA_DEPLOY_NO_COOLDOWN=1 PLAYWRIGHT_SPECS=e2e/anvil-arena-277-verification.spec.ts bash scripts/e2e-anvil.sh (Anvil 31337, Vite preview :4173, VITE_E2E_MOCK_WALLET=1). Ephemeral Playwright spec removed after run (not committed).

Path Result How verified
1 Fresh user, unlimited off PASS Checkbox unchecked; label contains “Time Arena”, not “TimeCurve”
2 Opt in unlimited PASS Checkbox → yieldomega.erc20.cl8yArenaUnlimited.v1 = 1
3 Opt out PASS Uncheck → canonical + legacy keys cleared
4 Legacy key only PASS Seed legacy key only → checkbox checked
5 Legacy migration PASS Off/on → canonical set, legacy removed
6 Private mode / quota PASS localStorage throw on yieldomega.erc20.* → checkbox false; /arena loads
7 Wrong network (#95) PASS (partial) arena-simple-chain-write-gate visible; no .chain-mismatch-overlay on chain 31337; buy CTA enabled. Not exercised: real wallet on wrong chain (E2E mock is single-chain). Onchain approve(max) on buy covered by ensureCl8yKumbayaAllowance.test.ts.

QA checklist (author comment)

Item Result
Checkbox label on /arena PASS
Fresh wallet / opt in / opt out / legacy migration PASS
Wrong network gate PASS (partial — see path 7)

Closing issue — all acceptance criteria satisfied on main; no code/docs/skills changes needed this iteration.

Follow-up (optional)

  • Commit a permanent frontend/e2e/anvil-arena-277-*.spec.ts so future verifications do not rely on ephemeral specs.
  • Exercise wrong-chain wallet manually when multi-chain E2E is available.
## Cloud agent verification — issue #277 (iteration 4/5) Verified **`main`** at `6d520e7` against acceptance criteria, `INV-FRONTEND-277-*`, author QA checklist, and functional test plan paths 1–7. **No repository changes required** — implementation already matches the issue. ### Acceptance criteria | Criterion | Result | How verified | |-----------|--------|--------------| | `wallet-connection.md` documents **`yieldomega.erc20.cl8yArenaUnlimited.v1`** as active key; legacy at most once without embedding retired token | **PASS** | Read `docs/frontend/wallet-connection.md` §143 | | `rg 'cl8yTimeCurveUnlimited' docs/` — zero matches | **PASS** | `rg 'cl8yTimeCurveUnlimited' docs/` → no matches | | `bash scripts/check-doc-satellite-retired-count.sh` exit 0; `wallet-connection.md` no `TimeCurve\|FeeRouter` | **PASS** | `files=2 mentions=3` OK; `rg 'TimeCurve\|FeeRouter' docs/frontend/wallet-connection.md` → no matches | | `/arena` checkbox label + component comment use Time Arena, not TimeCurve | **PASS** | `ArenaDoubUnlimitedApprovalFieldset.tsx` + Playwright path 1 | | Legacy `localStorage` still works (automated) | **PASS** | `arenaDoubApprovalPreference.test.ts` + Playwright path 4 | | Enabling preference migrates legacy → canonical (automated) | **PASS** | `arenaDoubApprovalPreference.test.ts` + Playwright path 5 | | Approval behavior unchanged | **PASS** | 13 targeted tests in `arenaDoubApprovalPreference.test.ts` · `ensureCl8yKumbayaAllowance.test.ts` | | `cd frontend && npm test` — all green | **PASS** | **103 files, 535 tests** green | | Doc gates (#274, #276) | **PASS** | `check-doc-retired-terms.sh` · `check-doc-anchors.sh` (43 anchors) · `check-doc-satellite-retired-count.sh` | ### Invariants (`INV-FRONTEND-277-*`) | ID | Result | Evidence | |----|--------|----------| | `INV-FRONTEND-277-CL8Y-ARENA-STORAGE` | **PASS** | Canonical key constant + Time Arena UI label; Playwright path 1 | | `INV-FRONTEND-277-LEGACY-READ-MIGRATE` | **PASS** | Vitest migration tests + Playwright paths 4–5 | | `INV-FRONTEND-277-APPROVAL-UNCHANGED` | **PASS** | Headroom / `maxUint256` tests + `ensureCl8yKumbayaAllowance.test.ts` | ### Cross-links | Surface | Result | |---------|--------| | `.cursor/skills/yieldomega-guardrails/SKILL.md` §9d + invariants pointer | **PASS** | | `skills/play-time-arena-doub/SKILL.md` CL8Y unlimited approve bullet | **PASS** | | `docs/testing/invariants-and-business-logic.md` §277 anchor | **PASS** | ### Manual functional paths (issue test plan #1–7) Stack: `YIELDOMEGA_DEPLOY_NO_COOLDOWN=1 PLAYWRIGHT_SPECS=e2e/anvil-arena-277-verification.spec.ts bash scripts/e2e-anvil.sh` (Anvil `31337`, Vite preview `:4173`, `VITE_E2E_MOCK_WALLET=1`). Ephemeral Playwright spec removed after run (not committed). | Path | Result | How verified | |------|--------|--------------| | 1 Fresh user, unlimited off | **PASS** | Checkbox unchecked; label contains “Time Arena”, not “TimeCurve” | | 2 Opt in unlimited | **PASS** | Checkbox → `yieldomega.erc20.cl8yArenaUnlimited.v1` = `1` | | 3 Opt out | **PASS** | Uncheck → canonical + legacy keys cleared | | 4 Legacy key only | **PASS** | Seed legacy key only → checkbox checked | | 5 Legacy migration | **PASS** | Off/on → canonical set, legacy removed | | 6 Private mode / quota | **PASS** | `localStorage` throw on `yieldomega.erc20.*` → checkbox false; `/arena` loads | | 7 Wrong network (#95) | **PASS** (partial) | `arena-simple-chain-write-gate` visible; no `.chain-mismatch-overlay` on chain 31337; buy CTA enabled. **Not exercised:** real wallet on wrong chain (E2E mock is single-chain). Onchain `approve(max)` on buy covered by `ensureCl8yKumbayaAllowance.test.ts`. | ### QA checklist (author comment) | Item | Result | |------|--------| | Checkbox label on `/arena` | **PASS** | | Fresh wallet / opt in / opt out / legacy migration | **PASS** | | Wrong network gate | **PASS** (partial — see path 7) | Closing issue — all acceptance criteria satisfied on `main`; no code/docs/skills changes needed this iteration. ### Follow-up (optional) - Commit a permanent `frontend/e2e/anvil-arena-277-*.spec.ts` so future verifications do not rely on ephemeral specs. - Exercise wrong-chain wallet manually when multi-chain E2E is available.
PlasticDigits commented 2026-06-21 03:43:53 +00:00 (Migrated from gitlab.com)

mentioned in issue #341

mentioned in issue #341
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#277
No description provided.