fix(providers): remove OpenCode Free while preserving Zen and Go (#16310)
Merged via /merge-batch (2026-10-17 wave, owner-approved rework incl. count-only edits to protected surfaces).
Reconciled on release/v3.8.52 @ 5413a24d (after #16531, #16960, #16965, #16924):
- Migration renumbered 208 -> 207 (`207_remove_opencode_free_provider.sql`; tip ships 206_codex_wakeup_tasks, no gap); test, REMOVED_PROVIDERS (+66 mirrors) and changelog fragment follow.
- #16531: the keyless `opencode` registry stays deleted; its tool-name-length test now covers the keyed Zen/Go entries only (10/10).
- Counts re-measured on the merged tree: 374 providers (375 - OpenCode Free), 204 migrations, 34 recurring pools, 52 free-forever. AGENTS.md, llm.txt (+66 mirrors), skills omni-auth/omni-providers differ from the tip only in digits (verified).
- FREE_TIERS mirrors: tip's #16924 refresh kept, OpenCode Free rows/section removed and pool count 35->34 applied mechanically (66/66); QUICK-START, TROUBLESHOOTING, FREE-TIERS-GUIDE, PROVIDERS-GUIDE, REMOVED_PROVIDERS mirrors retranslated with targeted `i18n:run --files` (330/330, table row counts equal to the source). i18n drift gate reports exactly the tip's inherited 21 drifted sources, 0 drifted targets.
- CodeQL: chat-noauth-model-cooldown test compares the exact upstream hostname instead of a URL substring.
Validation: focused node tests 1737/1737 (PR tests, migrations, blocklist, opencode*, tool-name-length, noauth cooldown) + 1052/1053 across every other test referencing opencode (1 env-only: opencode-ai postinstall binary absent locally); vitest 61/61 + 18/18; typecheck:core, api-typecheck, open-sse typecheck OK; complexity/cognitive/file-size/dead-code within baseline; boundary 774/774; changelog-integrity, docs-sync, docs-counts (strict) OK; provider-consistency OK (374); agent-skills Generated 0; eslint + prettier on changed files clean. CI runs for this head were queued (account runner backlog) and never started; remaining tip reds are the inherited base-red #15306.