A hyphen is a different product

Branch fix/pricing-suffix-inherit, 2026-09-03. The cost estimator matched model ids by substring in both directions. That let gemini-3.8-flash-cyber (Fairwind-gated, no public price) and gemini-3.8-flash-lite bill at the 3.8 Flash promo row. Measured with a probe before the fix: CYBER=0.75/3.75.

1. Type an id, compare old and new

OLD: substring either way
NEW: session label only, or family prefix

The rule. Exact match first. Then, if the name extends a priced id, the remainder must be a bracketed CC session label like [1m]; a hyphenated or dated remainder is a different product and takes the unknown-model fallback. If the name is a prefix of a priced id (family shorthand such as claude-opus), it resolves as before. Nothing in the pinned test table moved: 35 tests, two of them new.

2. What changed for each pinned case

InputOld rowNew rowWhy
gemini-3.8-flash-cyber3.8 Flash $0.75fallback $2.00not GA, no price; a neighbour's promo rate was wrong
gemini-3.8-flash-lite3.8 Flash $0.75fallback $2.00different product
claude-opus-5[1m]Opus 5 $5.00Opus 5 $5.00session label, still rides
claude-opus-5-20270101Opus 5 $5.00fallback $2.00dated snapshot of an unpriced id is unknown
claude-opusfirst Opus rowfirst Opus rowfamily prefix, unchanged

Provenance. The platform memory of 2026-09-01 (a prefix resolver bills a new model at its predecessor's rates) motivated the own-row tests in #3905; CodeRabbit raised the suffix direction on core #2389, and the peer session's fix there prompted this one. Same hole, both resolvers.