Gemini 3.8 Flash gets its own pricing row
Branch feat/gemini-38-flash-pricing, 2026-09-02. Google shipped gemini-3.8-flash GA today. OrchestKit's one real model-pricing table is src/hooks/src/lib/models.vocab.json, read by the cost-estimator hook. This page shows what the row does and why the resolver had to be tested, not just fed.
1. The pricing table, before and after the promo ends
| Model | Input / MTok | Output / MTok | Cache read | Cache write | Note |
|---|
Dated doubling. The Gemini row is a promo through 2026-12-31. On 2027-01-01 Google doubles it to $1.50 / $7.50 / $0.15. The vocab row, its mirror in the analytics skill and the test pin all name that date, so the re-stamp is a one-line diff in three files, not an archaeology job. Cache write is the input rate because Google bills cache creation at input plus per-hour storage, no 1.25x write premium; the cache-convention test carries that as a named exception.
2. The resolver: type an id, see which row bills it
The lesson this PR honours. A prefix or substring resolver bills a new model at its predecessor's rates (platform memory, 2026-09-01). getPricing() does exact match, then alias, then substring in either direction, then the sonnet fallback. So a new id gets its OWN row plus a test that resolveModelKey(id) === id, and a test that the unpriced predecessor does NOT inherit the row. The Cyber id is the one substring neighbour that would inherit; it is not GA, has no public price, and is deliberately not a row, so the page shows the hazard rather than hiding it.
3. Where the id landed
| Surface | Change | Why there |
|---|---|---|
src/hooks/src/lib/models.vocab.json | row in pricing only, dated note in $comment | the authoritative table; not in fullIds or aliases, those are the Claude vocabulary that agent frontmatter validates and CC cannot run an agent on Gemini |
src/hooks/src/__tests__/lib/cost-estimator.test.ts | 3 tests: own row at promo price, resolves to itself, predecessor does not inherit; write-ratio exception | the resolver test the lesson demands |
src/skills/analytics/references/cost-estimation.md | mirror row plus the 2027-01-01 and Cyber note | the only doc that mirrors the vocab table |
src/skills/llm-integration/SKILL.md | Judge model row gains gemini-3.8-flash | cost tier under Haiku and a third vendor for the different-model judge rule; no price, the skill's house rule forbids hardcoding prices |
src/skills/llm-integration/scripts/ollama-provider-template.py | REASONING route: stale gemini-3-flash-preview to gemini-3.8-flash | the one task-class map in the repo; Claude rows untouched |
src/agents/llm-integrator.md | new google provider, tier balanced | Google's own positioning: primary general-purpose model |
- No allowlist hook exists (grep for allowed_models, KNOWN_MODELS, model_tiers: 0 hits). The Fable consent gates match
claude-fableby prefix and are untouched. - The routing doc the doctor reference links to,
docs/model-routing.md, was deleted in #1302; the link is dangling and is left for its own PR. gemini-3.8-flash-cyber: not available, Fairwind Program only, no row anywhere.