| name | check-model-fallback |
| description | Detect Fable→Opus model-fallback events in Claude Code transcripts and queue attribution-check tasks. Wall-clock trigger, every 4h. |
Check Model Fallback
Claude Fable 5's safety classifiers fall back to Claude Opus 4.8 on sensitive
topics. Each assistant message in the session transcript records the model
that actually served it, so a fallback appears as claude-opus-* messages
inside an otherwise claude-fable-* session.
This matters for attribution: article frontmatter records ai_system, and
the citation convention maps it to an AI pseudonym (Fabcinq, C. vs
Oquatre-huit, C. — expand-topic SKILL.md §5.5). A fallback mid-fork means
text attributed to Fable was generated by Opus.
When to Use
- Automatic: wall-clock trigger every 4 hours (registered in
tools/evolution/time_trigger.py:check_model_fallback). Originally an
every-cycle trigger, but only ~25% of loop iterations consume a cycle slot,
stretching "every cycle" to ~29h of uptime — too slow for session-level
sticks.
- Manual: invoke
/check-model-fallback after working on sensitive-adjacent
content if you suspect a fallback occurred.
Instructions
-
Run the detector (it persists its own scan high-water mark in
../unfinishablemap_log/model-fallback-state.json):
uv run python scripts/check_model_fallback.py --queue-task
-
Summarise the result by counts (e.g. "0 mixed-model transcripts" or
"1 fallback-suspected, P2 task queued") and list any [FALLBACK-SUSPECTED]
or [QUEUED] lines verbatim.
-
Stop. Do not edit articles or todo.md directly — the script queues the
attribution task itself (deduplicated by transcript session id). Do not
commit; the evolution loop's agent-commit step handles that.
Reading the output
[FALLBACK-SUSPECTED] — fable-family messages mixed with any other model
in one transcript, regardless of which dominates. The fallback STICKS at
session level (confirmed 2026-06-10/11: 5x fable then 1276x opus over
~34h — once trigger content is in the session context, every subsequent
request re-trips the classifier until a fresh session). A stuck session is
therefore dominant-opus with a small fable head; the queued task says
SESSION-LEVEL STICK when this shape is detected and calls for bulk
annotation of the whole window. The script queues a P2 task pointing at
the time window; a later fork (or human) cross-references the changelog
and annotates ai_system where content was written.
[MIXED-MODELS] — same-file mixing with no fable messages at all (e.g. a
deliberate mid-session /model switch between other models).
Informational only; no task is queued.
- Haiku messages are ignored everywhere — background/title/subagent use is
routine.
Important
- Detection is client-side best-effort: if the API reports a fallback
response as still
claude-fable-*, nothing here can see it.
- Never put the literal backoff sentinel tokens in the summary note.
- The state file lives outside the repo (in
../unfinishablemap_log/), so
cycle_post's YAML re-serialization cannot strip it.