Files
oh-my-pi/packages/coding-agent/test
enieuwy a93a53185b fix(session): key attribution off what served, not off the fallback chain
Review of the previous commit found the same defect in four more places,
each a variant of one mistake: the unproven-model gate was expressed as
"a retry fallback is armed and has not served", so it only protected the
one swap path that arms a chain.

- The cooldown-expiry restore to the primary deletes the fallback record
  before swapping, so the gate vanished with it and an unproven, just-
  restored primary was credited immediately.
- A session's first-ever fallback arm constructs the record only after
  the swap, so there was nothing to mark and the guard was a no-op.
- The Fireworks Fast degrade swaps models without arming a chain at all,
  so a live row showed the degraded base model as the configured primary.
- The fresh-versus-resumed heuristic read the message list, which
  compaction collapses, so a resumed-and-compacted session seeded its
  startup candidate as already proven.

Attribution now names the last model that settled a turn here, full stop.
A switch of any kind — into a candidate, back to a restored primary, or a
capability degrade — moves it only once the new model answers. Before
anything has served there is no earlier work to miscredit, so the
configured model is both the only answer and a safe one.

Fallback routing is tracked as its own flag rather than inferred from the
chain record, because the degrade path routes without a chain, and it is
set before each swap so the synchronous `model_changed` fan-out cannot
observe a model mid-relabel. The resumed-session heuristic is gone: it
was only needed to decide whether an unserved candidate could be trusted,
and nothing is trusted before it serves.
2026-08-08 13:16:11 +08:00
..
2026-07-27 16:43:53 +02:00
2026-08-02 20:39:23 +02:00
2026-07-27 16:43:53 +02:00
2026-07-27 16:43:53 +02:00
2026-08-02 20:39:23 +02:00
2026-07-27 16:43:53 +02:00
2026-08-02 20:39:23 +02:00
2026-07-01 00:07:30 +00:00
2026-08-05 03:07:16 +02:00
2026-05-30 18:08:51 +02:00
2026-07-27 16:43:53 +02:00
2026-07-30 04:25:32 +02:00
2026-06-24 13:44:47 +00:00