2.11.1
Released
Fixes
The AI Coach and the quest narrative are now charged for the model that actually answered, not the one that was asked for. The provider client retries a model OpenRouter has retired against its free router, and that substitution used to be invisible to the caller: the account paid the chosen model's price for a free model's reply, the coaching interview went on naming a model that had failed, and a quest's story was attributed to a model that never wrote it. Both surfaces now reprice the single charge against the served model in one transaction — a free substitute nets to zero — and correct what they store. Where a correction cannot be booked the account keeps the charge it already had and the app says nothing about the cost, rather than promising a price that was never applied. (#528)
The AI Coach now says when a different model answered, states what the turn actually cost, and moves the model picker onto the model that is answering, so the remaining turns stop opening with a provider call that is going to fail. The quest story panel says the same thing about its attribution. (#528)
Technical changes· 4 entries for database, tooling, CI, tests and docs
Database
Added
reprice_ai_credits(), which returns a reference's charge and re-books it against another model as one atomic operation. Correcting a charge with a separate refund and charge could debit an account twice at two different prices if the refund failed, or leave a served action unmetered if the charge did — and both failures were invisible to the caller. Service-role only, for the same reasonrefund_ai_credits()is. (#528)Repaired the OpenAI personas, which had been pointing at
gpt-5andgpt-5-minisince those ids were retired; every request routed to OpenAI 4xxed, which the production ledger records as a charge, a refund and a re-charge against a different provider. They now name the current models and their keys move fromgpt-5/gpt-5-minitogpt-terra/gpt-luna, which name the tier rather than the generation and so survive the next replacement. Personas are updated in place, so no quest loses its configured model. (#528)Retired the
free-gpt-oss-20bpersona:openai/gpt-oss-20b:freehas left OpenRouter's zero-cost catalog, so it was already being served by the free router after a wasted round trip, while advertising a model it was not running. The free tier now offers the router alone, which cannot go stale. (#528)
Tests
Added the first tests for the quest narrative route, covering the charge, the repricing when a substitute model answers, and what is stored and reported afterwards. (#528)