Fog observation limits
A retained Qwen reply from observation-names-clean.json invented fog beginning beyond column 3. Native observations establish visible enemy positions, not a per-row fog boundary or whether an entire empty-looking row is visible.
The shared enemy context now explicitly carries unknown boundary columns and unknown fully visible rows when fog masking is active. Dave and plant turns use that same context, including older clients without observed enemy positions. Existing nearest-enemy columns remain available. The prompt asks for a natural answer about actually observed enemies, without reciting limitations when they are irrelevant. No player-facing explanation, action authority, game bytes, account configuration or save format changes.
The regression fails before the change. All 470 isolated NPC/route checks, pnpm build and pnpm typecheck pass afterward. The first draft of the regression incorrectly kept a Plantern light capability after removing fog; correcting that invalid test request preserves the existing plant_changed guard.
output/visible-threats/fog-boundary-limits.json in the game worktree retains one sample per EN/ZH case from Qwen and Gemini using actual compiled observations through the local production service. All four preserve speech-only decisions and omit an invented exact fog boundary. Both English answers identify the near-house Conehead. One Qwen Chinese answer says "the lane on the right" for a row, an imprecise spatial description that remains a writing-quality gap. These samples do not prove universally grounded model output. No player data, settings, notebook or Yumina billing rows were written; actual provider usage occurred. Earlier failing samples remain available.
Publication is pending. Current public game build remains 69da0f96fc.
