Verification: #55 pause + signoff — post-end gate live walkthrough
Follow-up tracker for items deferred from #55 source + selective live verification on Sunday/Monday.
## Background
#55 closed today on cf6fe19 + f2500ec source + selective live verification:
- **Source review (Sunday note):** unified _requireSaleInteractionsEnabled at TimeCurve.sol L295 covers both buy and WarBow paths, charmRedemption + reservePodiumPayouts gates wired at L656-657 and prize-distribution path
- **Live cast verification (today):**
- cast send setBuyFeeRoutingEnabled(false) -> cast call buy(1e18) reverts with exact 'TimeCurve: sale interactions disabled' (matches L295 helper revert string)
- cast send setBuyFeeRoutingEnabled(true) -> cast call buy(1e18) reverts past gate with custom error 0xfb8f41b2 ERC20InsufficientAllowance (proves buy logic now reachable)
- cast send setBuyFeeRoutingEnabled(false) -> cast call warbowSteal(addr, false) reverts with same exact 'TimeCurve: sale interactions disabled' (proves L295 helper is unified across both buy and WarBow paths via cf6fe19)
- **Test pass:** forge 191/191 (includes pause/signoff suite)
## Scope (deferred to follow-up live walkthrough)
These items need a stack where ended=true (sale ended state), which the SKIP_ANVIL_RICH_STATE=1 path doesn't produce. anvil_rich_state.sh provides the post-end state.
- [ ] charmRedemptionEnabled = false on a post-end stack: redeemCharms reverts with 'TimeCurve: charm redemptions disabled' (gates check is at L657 *after* the L656 ended check; can only be exercised once sale is ended)
- [ ] charmRedemptionEnabled flip to true: redeemCharms succeeds for a buyer with non-zero charmWeight
- [ ] reservePodiumPayoutsEnabled = false on a post-end stack with non-zero prize pool: distributePrizes reverts with the corresponding gate string
- [ ] reservePodiumPayoutsEnabled flip to true: distributePrizes succeeds, prizes flow to podium winners
## Out of scope / explicit non-QA items
Per dev framing on #55:
- Per-buy CL8Y routing scope (TBD product row)
- Rabbit Treasury Pausable as separate ceremony
- Implementation child issues per pause-and-final-signoff.md tables
These are stakeholder/governance signoffs and TBD product decisions — not QA-actionable in this issue. They should track as separate issues if/when they become concrete.
## Pre-conditions
- Live Anvil stack with anvil_rich_state.sh executed (post-end state with ended=true)
- Owner private key for setCharmRedemptionEnabled / setReservePodiumPayoutsEnabled toggles
- Buyer addresses with non-zero charmWeight from rich-state setup
- Optional: at least one prize-eligible address for reservePodiumPayouts side
## Acceptance
All 4 rows produce evidence (cast tx hash + revert string or success log) and either PASS or have a filed sub-issue. cc @PlasticDigits
issue