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