The episode audio was never ours. This release stops serving it.
Listening moves to the source (#570)
AdSense suspended the site for "Google-served ads on screens with replicated content". The literal case was ours: the complete episode MP3, re-hosted on our own domain, with ads around it. That is copyright exposure independent of any ad policy.
The in-house player is gone wherever a source link exists, and Spotify is now styled as the listen action rather than a secondary link:
最近 100 集:spotify_url 96 (96%) / 缺 4 (4%)
Up from 27% on 2026-08-27 — the backfill chain (#561–#563, #565) closed that gap. The remaining 4% keep the player, so no episode loses the ability to play.
getEpisodeAudioUrl now takes spotifyUrl as a required argument. Every play surface routes through it, so a new caller cannot quietly reintroduce the hosted player — that constraint is the part worth keeping.
The files are still stored and still served for that 4%. This removes the reader-facing path, not 60 GB of MP3s; deleting those is a separate, irreversible decision.
Names the ASR got wrong (#566)
Readers reported this on Threads — 「是 warsh」, 「每一篇都有不少錯字」. The transcriber mishears proper nouns (欣興→新興, 績優生→機油生) and each branch of the pipeline inherited whatever it was handed, so a single episode shipped both spellings: the summary corrected, the slides and social cards not.
One correction pass now runs at the join and applies a single map to every artifact. Proposals must be equal-length, same-script, and already present in the episode — the transcript itself is never rewritten, since it is the record of what was actually heard.
A known limit, stated plainly: the backfill path has a human gate, and its first dry run proposed 升息 → 降息 — a rate call inverted, not a homophone. That proposal passes every code-side guard. The live path has no such gate; its only defence against that class is the prompt. The cap is 12 corrections per episode, so the blast radius is bounded — but bounded is not guarded.
Extractor headroom (#571)
The first production ingest after the v0.11.10 model pin logged two completion_tokens=8192 … length limit was reached — a ceiling never hit before. flash-0731 segments 2–3× more finely than v4-pro, so the JSON got longer. Raised to 16384; on flash a full reply costs US$0.0016.
Episode failure rates were unchanged either side of the pin (2/15 vs 4/32), so this removes an avoidable source of truncation rather than fixing a regression.
Also: media paths resolve without GCS credentials (#572), card repair refuses to run when the translations table is unreachable (#573), decks and social-card PNGs rebuilt (#574), and two dead show links fixed (#568 #569).
Verified on staging
staging-api /health 200, 1.17s
staging /sitemap.xml application/xml — 493 URLs, /topics/:tag 0, sector 80
The SEO work from v0.11.10 is intact. The player change could not be checked visually on staging — it is behind Google OAuth and the bypass token is a rotating secret that should not end up in a URL in a transcript. That check happens on production, which is not gated.
Where this leaves AdSense
Both findings now have an answer: the audio is no longer served to readers, and the thin topic pages left the index in v0.11.10. Requesting a review is still premature — the "low value content" half rests on original writing that does not exist yet (/api/articles returns []).
Full changelog: v0.11.10...v0.11.11