Skip to content

Free NPC response recovery — 2026-09-22

Two consecutive real Free Dave probes each received the account-wide free-models-per-day rejection before reaching the configured text fallback. The reply recovered, but every player paid another rejected upstream round trip.

The provider now remembers that exact daily-cap response for 60 seconds, scoped to a SHA-256 credential digest. A subsequent Free request uses its own existing fallback list. Streaming/non-streaming settings, response format, text/vision selection and actual served-model usage remain unchanged. Private or paid selections without a permitted fallback still make their chosen request. Transient throttles do not set this cooldown. It expires automatically; process restart also clears it. No assumption about the provider's daily reset time is required. The process-local map retains at most 128 digests, never credentials. Simultaneous requests already in flight can still reach the exhausted pool.

Before the change, four of seven targeted transport cases failed. Afterward, 684 isolated NPC/provider checks pass, including two consecutive Dave decisions with one usage record per actual generated reply. Hosted build/typecheck and OSS export results are recorded with publication below. No database migration, account setting, AI prompt, native game or save-format change is involved.

Writing remains a separate issue

The original two 3-3 captured lawn states were tested once each with the fixed Qwen fallback and current production prompts. The Chinese answer invented a hit to Dave's pot, despite no recorded hit. Moving observed social instructions out of the quoted lawn and removing hypothetical reactions did not fix the next single sample: it invented familiarity and implied future interest. That candidate was reverted, with its patch and all failed samples retained locally. No paid rerolls were used to choose an attractive reply.

A separate two-turn Free-path probe demonstrated real daily-cap recovery to the same Qwen model. It does not establish every generated reply is grounded. The cooldown fixes repeated failed transport, not that writing weakness.

Local game receipts: output/current-grounding-20260922.json, output/candidate-grounding-20260922.json, and output/free-grounding-20260922.json. All probes used captured game states and wrote no account, notebook or save data.

The candidate transport was also exercised against the real provider: output/free-cooldown-live-20260922.json records exactly three upstream calls for two generated replies: Free 429, fallback 200, fallback 200. The rejected request took 297 ms in that sample; no population-wide latency claim follows from it. The responses still demonstrate the separate writing limitation, including an unrecorded earlier promotion in Chinese. They were retained unchanged.

GitHub's first hosted regression run timed out in the unrelated activity-model oversized-quote fixture. Its single 7,600-newline tokenizer input made the local file take 23 seconds and exceeded the runner's 120-second file limit under load. Separating that input into smaller runs retains 238 prefix tokens, the full overlapping quotes, the >160-KiB payload assertion, and rejection before any journal/provider call. The affected 20 adapter/transport checks now pass in 1.8 seconds locally. Only this fixture changed; no timeout or production rule was relaxed. The preceding GitHub export, warehouse and security checks passed.