diff --git a/adventure_expansion_spec.md b/adventure_expansion_spec.md index e51079b..6191211 100644 --- a/adventure_expansion_spec.md +++ b/adventure_expansion_spec.md @@ -135,6 +135,23 @@ going forward, same as every other trophy. ## 2. LLM-authored dispatches (`headline` / `lede`) +**SHIPPED 2026-07-17: Pete `eeeac08`, gogobee `22b7949`. All tests green both +sides, gofmt-clean, screenshot-verified (realistic + max-length prose both sit +cleanly on the card), NOT deployed.** Built as written below (additive +`headline`/`lede`, prose-guard, template fallback), with one architecture +decision the spec did not surface: + +> **This section contradicts `pete_adventure_news_voice.md`**, the older +> foundational doc, which says *Pete* owns the voice and gogobee is "compute, +> not ghostwriter" — the flow there is Pete builds a voiced prompt and calls a +> generic gogobee inference endpoint. That needs a **Pete→gogobee route**, which +> `roster.go:23-25` forbids ("no route back into the game box's network"). The +> network constraint kills the voice-doc design, so §2's gogobee-authors-and- +> pushes model is the only one that fits one-way delivery. Confirmed with the +> owner before building. Cost: the warm-reporter voice now lives in gogobee's +> prompt (`pete_dispatch_voice.go`), softening "gogobee never sees Pete" — a +> deliberate, owner-approved trade, not an oversight. + The template-rendered dispatches are all identical and read as boilerplate. gogobee's LLM writes the prose instead; Pete's templates stop being the renderer and **become the safety net**.