[BUG] Safety classifier false positive: Cyrillic transliteration table in game-decompilation work triggers model auto-switch (Fable 5 → Opus)
Preflight Checklist
- [x] I have searched existing issues and this hasn't been reported yet
- [x] This is a single bug report (please file separate reports for different bugs)
- [x] I am using the latest version of Claude Code
What's Wrong?
Summary
Fable 5's safeguards flagged an assistant message twice during legitimate
reverse-engineering work, each time auto-switching the session to Opus
mid-task. Both occurrences involved manipulating Cyrillic character mapping
tables. Two for two on this activity is not plausibly coincidental.
Context of the work
Open-source project: a matching decompilation of a 1996 PlayStation game
(Vandal Hearts, SLUS_004.47) carried through to a native PC port. The current
task is a translation/localization framework that lets users supply optional
language packs.
To validate whether the framework can support Cyrillic, I was analyzing a
publicly distributed Russian fan translation of the same game. That patch
stores Russian text as 1-byte indices into a REPURPOSED font table: the
translators overwrote 58 of the game's 128 glyph bitmap slots with Cyrillic
letterforms, so the stored bytes are Latin ASCII values that render as
Cyrillic letters on screen.
Recovering the Latin-byte → Cyrillic-letter correspondence is therefore a
necessary step to read the data at all. It is a font-glyph index remap, not
encryption, and nothing is being concealed: this is reading a font table out
of a game binary.
Occurrence 2 — 2026-08-07 (exact trigger)
A Bash tool call running a Python script that:
- defined a dict literal mapping Latin letters to Cyrillic letters
(e.g. {'A':'А','B':'Б','C':'В', ...}, ~32 entries)
- decoded byte strings extracted from the game's data tables through that
mapping and printed the resulting Cyrillic text
- counted which byte codes were used, to size the glyph budget
USEFUL NARROWING SIGNAL: the immediately preceding tool call was near
identical — same style of mapping dict, same decode, same Cyrillic output —
and completed normally. The call that was flagged differed mainly by having
the COMPLETE substitution alphabet rather than a partial one, plus a
systematic pass over all data tables. If the classifier is scoring something
like "completeness of a substitution alphabet over a non-Latin script," that
pair of calls should bracket the threshold precisely.
Occurrence 1 — 2026-08-06 (approximate, from recollection)
Same project, same class of work: analysis of the same Russian fan
translation while scoping Cyrillic support. The exact triggering message was
not captured at the time.
Impact
- Loses model continuity mid-task on long, deeply contextual work.
- The switch is silent enough that it's easy to miss having changed models.
- Reportedly
/modeldoes not restore the selected model afterward
(cf. existing issue about Kept model as Opus).
- Practical effect: an entire category of legitimate work — localization,
ROM hacking, character-encoding archaeology, non-Latin script support — is
harder to do on Fable 5 than on other models.
Hypothesis for the classifier team
A "substitution table + non-Latin script + byte-level decode" pattern may be
scoring as obfuscation or evasion tooling. In this domain that pattern is
simply what reading a remapped font looks like. Legacy games predate Unicode
almost universally, so any localization work on them necessarily involves
exactly this shape of code.
Environment
- Model: Fable 5 (claude-fable-5)
- Claude Code 2.1.221, VS Code extension, Linux
- Occurrences: 2026-08-06 and 2026-08-07
- Claude Code session ID for the 2026-08-07 occurrence:
2793bdf4-653d-4729-8bbd-a1437090e803
(sharing this deliberately — if the flagged message is retrievable
server-side, that is more precise than the reconstruction above, including
the exact preceding call that did NOT flag)
What Should Happen?
Fable to not trigger a safeguard
Error Messages/Logs
Steps to Reproduce
Steps to Reproduce
Environment: Claude Code 2.1.221, model Fable 5, with "Switch models when a
message is flagged" at its default (ON).
The useful form of this repro is a MINIMAL PAIR — one prompt that completes
normally, one that flags — since together they bracket the threshold. Neither
step needs the original game files.
Step 1 (control — completed normally in my session):
Ask Claude Code to write and run a short Python script that defines a
PARTIAL mapping from Latin letters to Cyrillic letters (roughly 6-10
entries), decodes a handful of ASCII byte strings through it, and prints
the Cyrillic result.
→ Runs normally.
Step 2 (trigger — flagged in my session):
In the same session, ask it to complete that mapping to the FULL alphabet
(~32 entries: the uppercase Cyrillic letters plus Ё Ы Э Ю Я Ь), re-run the
decode over a larger set of strings, and additionally count which byte
codes appear.
→ Observed: "Fable 5's safeguards flagged this message." and the session
auto-switches to Opus.
Surrounding context, in case it matters to the classifier: the stated purpose
throughout was recovering the glyph mapping of a game fan-translation so that
a localization framework could support Cyrillic. The intent was never
obscured at any point in the conversation.
Caveat: I do not know whether the classifier is deterministic, so this may
need more than one attempt. The boundary between step 1 and step 2 is my
inference from two adjacent calls in a real session, not something I probed
systematically.
Claude Model
Other
Is this a regression?
I don't know
Last Working Version
_No response_
Claude Code Version
2.1.221
Platform
Anthropic API
Operating System
Other Linux
Terminal/Shell
VS Code integrated terminal
Additional Information
_No response_