Docs: remove TimeCurve/FeeRouter mentions from satellite docs
## Summary Finish the Arena v2 documentation migration by removing or rewriting **stale TimeCurve / FeeRouter / v1 launchpad** prose that remains in **satellite** docs (everything outside the already-trimmed [`docs/testing/invariants-and-business-logic.md`](docs/testing/invariants-and-business-logic.md)). Parent cleanup: [#263](https://gitlab.com/PlasticDigits/yieldomega/-/issues/263) (bulk invariant deletion + anchor CI). Epic: [#238](https://gitlab.com/PlasticDigits/yieldomega/-/issues/238). **Goal:** Operators, QA, agents, and contributors reading `docs/`, `skills/`, and `.cursor/skills/` must not be instructed to configure, test, or preserve retired v1 economics (`TimeCurve.endSale`, `FeeRouter.distributeFees`, `idx_timecurve_*`, `VITE_FEE_ROUTER_*`, `/timecurve/*` QA paths). --- ## Current codebase ### Already aligned (do not regress) | Layer | Arena v2 state | |-------|----------------| | **Contracts (dev/prod deploy)** | [`DeployDev.s.sol`](contracts/script/DeployDev.s.sol) / [`DeployProduction.s.sol`](contracts/script/DeployProduction.s.sol) deploy **TimeArena** + vaults only ([#259](https://gitlab.com/PlasticDigits/yieldomega/-/issues/259)) | | **Indexer** | Arena-only decode; `GET /v1/arena/*`; no `TimeCurve*` `DecodedEvent` variants ([#260](https://gitlab.com/PlasticDigits/yieldomega/-/issues/260)) | | **Frontend** | Primary route **`/arena`**; `VITE_TIME_ARENA_ADDRESS` ([#256](https://gitlab.com/PlasticDigits/yieldomega/-/issues/256)); `.env.example` has **no** `VITE_FEE_ROUTER_*` | | **Invariant corpus** | ~362 lines; TimeArena v2 `INV-TIME-ARENA-*` table; `scripts/check-doc-anchors.sh` green ([#263](https://gitlab.com/PlasticDigits/yieldomega/-/issues/263)) | | **Fee routing doc** | [`docs/onchain/fee-routing-and-governance.md`](docs/onchain/fee-routing-and-governance.md) rewritten for DOUB 40/30/30 ([#244](https://gitlab.com/PlasticDigits/yieldomega/-/issues/244)) | | **Bots** | [`bots/timearena/`](bots/timearena/README.md) (not `bots/timecurve/`) ([#245](https://gitlab.com/PlasticDigits/yieldomega/-/issues/245)) | ### Stale surface (grep snapshot on `main`) - **`docs/`:** ~**45 files**, ~**255** `TimeCurve|FeeRouter` token matches (many are full sections, not one-line cross-links). - **`skills/`:** 3 files (mostly “legacy removed” notes — verify wording). - **`.cursor/skills/`:** guardrails already list retired components; confirm no operator steps cite v1 paths. ### High-impact offenders (non-exhaustive) | File | Problem | |------|---------| | [`docs/qa/QA-onboarding-gitlab-issue-body.md`](docs/qa/QA-onboarding-gitlab-issue-body.md) | Entire onboarding + checklist still **TimeCurve page**, `VITE_TIMECURVE_ADDRESS`, `VITE_FEE_ROUTER_ADDRESS`, `bots/timecurve`, `distributePrizes` / five-sink **FeeRouter** tables | | [`docs/indexer/design.md`](docs/indexer/design.md) | `timecurve_buys`, `idx_timecurve_*`, `GET /v1/timecurve/*`, WarBow CL8Y / sale-state sections superseded by Arena ingest | | [`docs/integrations/kumbaya.md`](docs/integrations/kumbaya.md) | Large **“Legacy TimeCurve product flow”** block; `TimeCurveBuyRouter` live-sale checklist; mixed Arena + v1 operator steps | | [`docs/onchain/cl8y-flow-audit.md`](docs/onchain/cl8y-flow-audit.md) | CL8Y matrix centered on `TimeCurve` / `FeeRouter` public flows (historical audit, not Arena DOUB) | | [`docs/operations/deployment-guide.md`](docs/operations/deployment-guide.md) | Retired v1 deploy block (~60+ mentions) — needs **collapsed** “historical mainnet snapshot only” pointer or move to `docs/operations/archive/` **only if** product agrees (default: **delete** per #263 policy) | | [`docs/operations/final-signoff-and-value-movement.md`](docs/operations/final-signoff-and-value-movement.md) | Post-end gates, `verify-timecurve-post-end-gates-anvil.sh` | | [`docs/operations/pause-and-final-signoff.md`](docs/operations/pause-and-final-signoff.md) | TimeCurve pause / redemption gates | | [`docs/onchain/security-and-threat-model.md`](docs/onchain/security-and-threat-model.md) | FeeRouter / TimeCurve threat rows | | [`docs/testing/qa-local-full-stack.md`](docs/testing/qa-local-full-stack.md) | `TimeCurveBuyRouter` registry + `verify-timecurve-buy-router-anvil.sh` | | [`docs/testing/contract-fork-smoke.md`](docs/testing/contract-fork-smoke.md) | `TimeCurveForkTest` as primary example | | [`docs/agent-phases.md`](docs/agent-phases.md), [`docs/agent-implementation-phases.md`](docs/agent-implementation-phases.md) | Phase prompts referencing TimeCurve surfaces | | [`docs/product/vision.md`](docs/product/vision.md), [`docs/glossary.md`](docs/glossary.md) | TimeCurve as flagship primitive | | [`docs/frontend/design.md`](docs/frontend/design.md) | Three-route TimeCurve sub-nav | | [`docs/architecture/repository-layout.md`](docs/architecture/repository-layout.md) | Lists TimeCurve in active layout | | [`scripts/qa/README.md`](scripts/qa/README.md) | “TimeCurve page and fee-router panel” | **Contracts note:** `TimeCurve.sol` / `FeeRouter.sol` may remain in tree for history/fork tests — **out of scope** unless doc claims they are deployed on current dev path. --- ## Why this is needed 1. **#263 follow-up:** Bulk invariant deletion is done; satellite docs still teach v1 sale lifecycle, FeeRouter five-sink splits, and `idx_timecurve_*` indexer work — contradicting [`arena-v2.md`](docs/product/arena-v2.md) and [`invariants` §260](docs/testing/invariants-and-business-logic.md#timearena-v2-gitlab-260). 2. **Operator / QA safety:** Onboarding still requires `VITE_FEE_ROUTER_ADDRESS` and TimeCurve page smoke — causes failed env checks and wrong-route testing on Arena v2 stacks. 3. **Agent automation:** Cursor guardrails + play skills point at Arena, but phase docs and QA body pull agents back to `endSale` / `redeemCharms` / FeeRouter rescue paths ([#241](https://gitlab.com/PlasticDigits/yieldomega/-/issues/241)–[#244](https://gitlab.com/PlasticDigits/yieldomega/-/issues/244)). 4. **Link hygiene:** Broken or misleading anchors waste review time; `check-doc-anchors.sh` only covers `invariants-and-business-logic.md#…` — satellite links to deleted anchors may still exist. --- ## Constraints and guardrails 1. **Delete, do not duplicate Arena content** — same policy as [#263](https://gitlab.com/PlasticDigits/yieldomega/-/issues/263): no `docs/testing/archive/` stubs that repeat [`arena-v2.md`](docs/product/arena-v2.md). 2. **Keep legitimate historical references** only when labeled **retired** in ≤1 short paragraph + link to #238 / #243 / #244 — not full runbooks. 3. **Preserve Arena v2 cross-links:** `TimeArena`, `TimeArenaBuyRouter`, `GET /v1/arena/*`, `VITE_TIME_ARENA_ADDRESS`, `VITE_KUMBAYA_TIME_ARENA_BUY_ROUTER`, play skills under [`skills/`](skills/README.md). 4. **Keep ReferralRegistry + DoubPresaleVesting** docs/tests; strip **TimeCurve-attached** presale boost / sale semantics only ([#263](https://gitlab.com/PlasticDigits/yieldomega/-/issues/263) constraint 4). 5. **MegaETH mainnet snapshot:** If retaining a minimal “legacy mainnet addresses” note in ops docs, it must **not** read as the active deploy path — point to [#259](https://gitlab.com/PlasticDigits/yieldomega/-/issues/259) Arena redeploy. 6. **Env vars:** Do not reintroduce `VITE_FEE_ROUTER_*` in `.env.example` or operator checklists; `VITE_TIMECURVE_ADDRESS` may remain as **documented legacy alias** for e2e only ([`e2e-anvil.md`](docs/testing/e2e-anvil.md)). 7. **AGPL** unchanged; docs-only issue. 8. **Scripts:** Deprecate or redirect `verify-timecurve-*` **in docs** to `verify-time-arena-buy-router-anvil.sh`; script deletion is optional separate PR if still wrapped. --- ## Relevant files **Must touch (priority)** - [`docs/qa/QA-onboarding-gitlab-issue-body.md`](docs/qa/QA-onboarding-gitlab-issue-body.md) — rewrite for **`/arena`**, `bots/timearena`, Arena env vars - [`docs/indexer/design.md`](docs/indexer/design.md) — Arena tables/routes only - [`docs/integrations/kumbaya.md`](docs/integrations/kumbaya.md) — Arena-first; delete legacy TimeCurve flow section - [`docs/testing/qa-local-full-stack.md`](docs/testing/qa-local-full-stack.md) - [`docs/onchain/cl8y-flow-audit.md`](docs/onchain/cl8y-flow-audit.md) — relocate to “historical v1 CL8Y” or trim - [`docs/operations/final-signoff-and-value-movement.md`](docs/operations/final-signoff-and-value-movement.md) - [`docs/operations/pause-and-final-signoff.md`](docs/operations/pause-and-final-signoff.md) - [`docs/onchain/security-and-threat-model.md`](docs/onchain/security-and-threat-model.md) - [`docs/agent-phases.md`](docs/agent-phases.md), [`docs/agent-implementation-phases.md`](docs/agent-implementation-phases.md) - [`docs/product/vision.md`](docs/product/vision.md), [`docs/glossary.md`](docs/glossary.md) - [`docs/frontend/design.md`](docs/frontend/design.md) - [`docs/architecture/repository-layout.md`](docs/architecture/repository-layout.md), [`docs/architecture/data-flows.md`](docs/architecture/data-flows.md) - [`docs/testing/contract-fork-smoke.md`](docs/testing/contract-fork-smoke.md) - [`scripts/qa/README.md`](scripts/qa/README.md) **Likely touch** - [`docs/operations/deployment-guide.md`](docs/operations/deployment-guide.md) — collapse retired v1 block - [`docs/operations/stage2-run-log.md`](docs/operations/stage2-run-log.md), [`docs/operations/stage3-mainnet-operator-runbook.md`](docs/operations/stage3-mainnet-operator-runbook.md) - [`docs/product/referrals.md`](docs/product/referrals.md), [`docs/product/primitives.md`](docs/product/primitives.md) — remove TimeCurve-only anchors - [`docs/testing/ci.md`](docs/testing/ci.md), [`docs/testing/local-swap-testing.md`](docs/testing/local-swap-testing.md) - [`docs/README.md`](docs/README.md), [`docs/contracts/foundry-and-megaeth.md`](docs/contracts/foundry-and-megaeth.md) - [`skills/README.md`](skills/README.md), play skills — ensure zero `play-timecurve-*` resurrection **Verification / CI** - Extend [`scripts/check-doc-anchors.sh`](scripts/check-doc-anchors.sh) **or** add `scripts/check-doc-retired-terms.sh` for operator-facing paths (see acceptance criteria) - [`docs/testing/strategy.md`](docs/testing/strategy.md) — document new grep gates --- ## Recommended solution direction 1. **Inventory:** `rg -l 'TimeCurve|FeeRouter|idx_timecurve|VITE_FEE_ROUTER|redeemCharms|endSale' docs/ skills/ .cursor/` → tier P0 (operator/QA/agent) vs P1 (historical audit). 2. **Rewrite P0** to Arena vocabulary: `/arena`, `TimeArena`, `GET /v1/arena/*`, `YIELDOMEGA_TIME_ARENA_ADDRESS`, `make check-frontend-env` checks for arena addresses only. 3. **Delete P1 bodies** or replace with one-line “retired — see #243/#244” + link to [`arena-v2.md`](docs/product/arena-v2.md). 4. **QA onboarding:** Replace embedded TimeCurve checklist with pointers to [`manual-qa-checklists.md`](docs/testing/manual-qa-checklists.md) §260 / Arena play skills. 5. **Indexer design:** Single “Arena v2 ingest” section; move any v1 event names to a ≤20-line historical appendix **or** delete. 6. **Kumbaya doc:** Split file — top = Arena v2 (`TimeArenaBuyRouter`); bottom historical section **removed** (not moved). 7. **Grep gate in CI** (optional): fail if `docs/qa/`, `docs/testing/qa-local-full-stack.md`, `docs/agent-phases.md` contain `FeeRouter` or `TimeCurve.endSale` (allowlist `invariants` negative-test rows and `fee-routing` “Retired” paragraph). 8. **Cross-link** [`yieldomega-guardrails` SKILL](.cursor/skills/yieldomega-guardrails/SKILL.md) and [`skills/README.md`](skills/README.md) from updated onboarding. --- ## Acceptance criteria - [ ] `rg 'VITE_FEE_ROUTER|FeeRouter\.distributeFees|TimeCurve\.endSale|redeemCharms|idx_timecurve' docs/qa/ docs/testing/qa-local-full-stack.md docs/agent-phases.md docs/agent-implementation-phases.md` → **zero** matches. - [ ] `rg -l 'TimeCurve|FeeRouter' docs/` count reduced by **≥50%** vs baseline (~45 files / ~255 mentions); no file in `docs/qa/` or `docs/agent-phases.md` contains standalone v1 operator instructions. - [ ] [`docs/qa/QA-onboarding-gitlab-issue-body.md`](docs/qa/QA-onboarding-gitlab-issue-body.md) describes **`/arena`**, `bots/timearena`, and `VITE_TIME_ARENA_ADDRESS` (not TimeCurve page / FeeRouter panel). - [ ] [`docs/indexer/design.md`](docs/indexer/design.md) documents **`idx_arena_*`** and **`GET /v1/arena/*`** only; no `GET /v1/timecurve/*` as active API. - [ ] [`docs/integrations/kumbaya.md`](docs/integrations/kumbaya.md) has **no** “Legacy TimeCurve product flow” section longer than a one-line retired pointer. - [ ] Operator-facing docs do not instruct running `verify-timecurve-post-end-gates-anvil.sh` or configuring five-sink FeeRouter for current dev deploy. - [ ] `bash scripts/check-doc-anchors.sh` still passes; no new broken `invariants-and-business-logic.md#…` links from edited files. - [ ] `skills/` and `.cursor/skills/yieldomega-guardrails/SKILL.md` agree with post-edit doc map. --- ## Test plan — documentation paths | Path | Steps | Expected | |------|--------|----------| | **P0 grep gate** | Run acceptance `rg` commands from repo root | Zero hits in operator/agent paths | | **QA onboarding dry-run** | New engineer follows updated QA body on Anvil stack | Lands on `/arena`, `make check-frontend-env` passes without FeeRouter vars | | **Agent smoke** | Cursor agent with guardrails asked “how do I run local QA?” | Cites `start-qa-local-full-stack.sh`, `/arena`, `bots/timearena` — not TimeCurve page | | **Indexer doc vs code** | Compare `design.md` to `indexer/src/decoder.rs` + `api_arena.rs` | Documented tables/routes match Arena-only code | | **Kumbaya E2E doc** | Follow [`e2e-anvil.md`](docs/testing/e2e-anvil.md) + kumbaya.md | ETH pay uses `TimeArenaBuyRouter`; no live-sale `TimeCurve.ended()` prerequisite | | **Link crawl** | `rg 'invariants-and-business-logic\.md#' docs/` + sample GitLab render | No dead anchors | | **Skills index** | Read [`skills/README.md`](skills/README.md) | Only `play-*-time-arena*` play skills | --- ## Test plan — misuse / abuse vectors (doc integrity) | Vector | Risk | Test | |--------|------|------| | **Revived FeeRouter env** | Operator sets `VITE_FEE_ROUTER_*` from QA body | `rg 'VITE_FEE_ROUTER' docs/qa docs/testing/qa-local-full-stack.md` → zero | | **Wrong-route QA** | QA tests `/timecurve` or “TimeCurve page” instead of `/arena` | Updated QA body checklist requires `/arena` mount | | **Indexer regression doc** | Contributor re-adds `idx_timecurve_buy` tasks | `design.md` grep `idx_timecurve` → zero or historical appendix only | | **Sale-end harness** | Someone runs post-end gate script from ops doc | `rg 'post-end-gates|verify-timecurve-post-end' docs/operations/` → zero or explicit **obsolete** | | **Agent phase drift** | Phase prompts reference `TimeCurve.t.sol` for arena economics | `agent-phases.md` cites `TimeArena.t.sol` / `anvil-arena-*` | | **Partial edit** | File header says Arena v2 but body still FeeRouter tables | Full-file read of P0 files | | **Broken cross-links** | Skills point at deleted doc anchors | `check-doc-anchors.sh` + manual skills link check | --- ## Verification criteria (definition of done) 1. **Quantitative:** P0 `rg` gates in acceptance criteria all **zero**; `docs/` `TimeCurve|FeeRouter` mention count **≤125** (~50% reduction) unless justified in issue close comment. 2. **Qualitative:** Reviewer confirms no operator doc presents v1 five-sink routing or sale-end lifecycle as **current** behavior without a **retired** label. 3. **Automated:** `bash scripts/check-doc-anchors.sh` passes; if new `check-doc-retired-terms.sh` added, it passes in CI. 4. **Regression:** `cd indexer && cargo test` and `cd frontend && npm test` unchanged (docs-only). `bash scripts/e2e-anvil.sh` passes on clean host (no doc-driven env drift). 5. **Epic linkage:** Close comment lists files touched count and any deferred items (e.g. shrinking `deployment-guide.md` retired block into external archive). --- ## Related - Parent: [#263](https://gitlab.com/PlasticDigits/yieldomega/-/issues/263) - Epic: [#238](https://gitlab.com/PlasticDigits/yieldomega/-/issues/238) - Retired stacks: [#243](https://gitlab.com/PlasticDigits/yieldomega/-/issues/243), [#244](https://gitlab.com/PlasticDigits/yieldomega/-/issues/244) - Arena deploy: [#259](https://gitlab.com/PlasticDigits/yieldomega/-/issues/259)
issue