<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Tagmac Cankaya</title>
    <description>The latest articles on DEV Community by Tagmac Cankaya (@tagmac_cankaya).</description>
    <link>https://dev.to/tagmac_cankaya</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3960754%2F5975a06f-bce9-415c-bb13-8483ba02bdb5.jpg</url>
      <title>DEV Community: Tagmac Cankaya</title>
      <link>https://dev.to/tagmac_cankaya</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tagmac_cankaya"/>
    <language>en</language>
    <item>
      <title>Why Claude Code switches from Fable 5 to Opus — and the workspace hygiene that stops false positives</title>
      <dc:creator>Tagmac Cankaya</dc:creator>
      <pubDate>Mon, 29 Jun 2026 08:50:55 +0000</pubDate>
      <link>https://dev.to/tagmac_cankaya/why-claude-code-switches-from-fable-5-to-opus-and-the-workspace-hygiene-that-stops-false-positives-27li</link>
      <guid>https://dev.to/tagmac_cankaya/why-claude-code-switches-from-fable-5-to-opus-and-the-workspace-hygiene-that-stops-false-positives-27li</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Behavior described as of June 2026 — Anthropic tunes these classifiers, so details may change. Sources at the end.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Short answer:&lt;/strong&gt; Claude Fable 5 runs safety classifiers (mainly offensive-cybersecurity and biology). When one flags a request, Claude Code re-runs it on Opus and the session &lt;strong&gt;stays&lt;/strong&gt; on Opus. The classifier reads &lt;strong&gt;everything the model reads — including your auto-loaded &lt;code&gt;CLAUDE.md&lt;/code&gt;&lt;/strong&gt; — so a session can fall back on its &lt;em&gt;first message&lt;/em&gt;, before you type anything. For legitimate work the most durable fix is &lt;strong&gt;workspace hygiene&lt;/strong&gt;: keep auto-loaded docs neutral and architecture-only, and move mechanism-heavy domain text into files that aren't auto-loaded.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What this is — and isn't.&lt;/strong&gt; This is about removing &lt;em&gt;false positives&lt;/em&gt; for legitimate work. We hit it ourselves: our own project docs had accumulated combat metaphors and security-flavored wording as a plain writing reflex ("attack the problem", "kill the stale process"), a classifier read that standing language as signal, and the honest fix was cleaning &lt;em&gt;our own&lt;/em&gt; language. If your work genuinely is offensive security or biology, the fallback is &lt;a href="https://code.claude.com/docs/en/model-config#automatic-model-fallback" rel="noopener noreferrer"&gt;expected, documented routing&lt;/a&gt; — rewording is not a way around it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The symptom
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;You select Fable 5 (&lt;code&gt;/model fable&lt;/code&gt;), and mid-session — or on the &lt;strong&gt;first message&lt;/strong&gt; — a notice appears and responses start coming from &lt;strong&gt;Opus 4.8&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;The switch is &lt;strong&gt;sticky&lt;/strong&gt;: the picker stays on Opus for the rest of the conversation.&lt;/li&gt;
&lt;li&gt;Switching back with &lt;code&gt;/model fable&lt;/code&gt; often re-triggers, because the flagged content is still in context.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This matches public reports — GitHub issues &lt;a href="https://github.com/anthropics/claude-code/issues/66670" rel="noopener noreferrer"&gt;#66670&lt;/a&gt;, &lt;a href="https://github.com/anthropics/claude-code/issues/66916" rel="noopener noreferrer"&gt;#66916&lt;/a&gt;, &lt;a href="https://github.com/anthropics/claude-code/issues/67246" rel="noopener noreferrer"&gt;#67246&lt;/a&gt; describe benign sessions (startup code review, grant applications, normal engineering) being switched.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it happens
&lt;/h2&gt;

&lt;p&gt;Per &lt;a href="https://support.claude.com/en/articles/15363606-why-claude-switched-models-in-your-conversation-with-fable-5" rel="noopener noreferrer"&gt;Anthropic's help article&lt;/a&gt; and the &lt;a href="https://code.claude.com/docs/en/model-config#automatic-model-fallback" rel="noopener noreferrer"&gt;Claude Code docs&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fable 5 ships automated safety checks for a few categories — offensive cybersecurity and biology/life-science are the two that matter for most developers.&lt;/li&gt;
&lt;li&gt;The checks review &lt;strong&gt;"everything the model reads, not just your latest message — including memory, content from connectors, web search results, and files."&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;The docs say it directly: &lt;strong&gt;"Fallback can trigger on the first request of a session … because the first request carries workspace context such as your CLAUDE.md content and git status."&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;The checks are &lt;strong&gt;"intentionally broad"&lt;/strong&gt; (Anthropic's wording) — which is why false positives on legitimate work happen.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The part most teams miss: the trigger is often not what you &lt;em&gt;do&lt;/em&gt; but how your standing docs &lt;em&gt;talk&lt;/em&gt;. Engineering writing drifts toward combat metaphor — attack, kill, hit the target, defend the perimeter — and mechanism shorthand from security/biology ("immune layer", "honeypot", "payload"). Each instance is innocent; accumulated across a &lt;code&gt;CLAUDE.md&lt;/code&gt; that ships with every session's first message, it reads like signal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recovering when it happens
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Fastest:&lt;/strong&gt; start a fresh session and re-select Fable. A flagged conversation keeps its flagged context; fighting it costs more than starting clean.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Diagnose:&lt;/strong&gt; run &lt;code&gt;claude --safe-mode&lt;/code&gt; — it disables customizations (CLAUDE.md, skills, MCP servers, hooks). If fallback stops, your trigger is in those files. (Git status + directory names are still included.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Take control of the switch:&lt;/strong&gt; run &lt;code&gt;/config&lt;/code&gt; and turn off &lt;em&gt;"switch models when a message is flagged"&lt;/em&gt;. A flag then pauses the session and offers: switch to Opus, or &lt;strong&gt;edit the prompt and retry on Fable&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/model fable&lt;/code&gt; switches back any time, with the re-trigger caveat above.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The settings.json gotcha: sessions silently starting on the wrong model
&lt;/h2&gt;

&lt;p&gt;A related but different failure: Claude Code keeps starting on your tier's default (Opus/Sonnet) even though you saved Fable. Since v2.1.153, &lt;code&gt;/model&lt;/code&gt; writes your choice into the &lt;code&gt;model&lt;/code&gt; field of &lt;code&gt;~/.claude/settings.json&lt;/code&gt; — so check what actually landed there:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;import json,pathlib;print(repr(json.load(open(pathlib.Path.home()/&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;.claude&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;settings.json&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;))[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;]))&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the value is anything other than a clean id/alias — stray terminal-escape characters, or a suffix on an id that doesn't support it (the &lt;code&gt;[1m]&lt;/code&gt; 1M-context suffix is documented for &lt;code&gt;opus&lt;/code&gt;/&lt;code&gt;sonnet&lt;/code&gt;) — Claude Code may not recognize it and quietly falls through to the default. We hit a corrupted value of exactly this shape. The fix is one line, by hand:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"claude-fable-5"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then verify at the next session start (the active model shows in &lt;code&gt;/status&lt;/code&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  Prevention: workspace hygiene
&lt;/h2&gt;

&lt;p&gt;Four practices that removed our false positives, in order of leverage:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Keep auto-loaded docs architecture-only.&lt;/strong&gt; &lt;code&gt;CLAUDE.md&lt;/code&gt; should carry file layout, names, commands, status — not domain mechanism. If your project legitimately touches a sensitive-sounding domain (health data, defensive security, lab-adjacent tooling), move the &lt;em&gt;mechanism narrative&lt;/em&gt; into a separate doc that is &lt;strong&gt;not&lt;/strong&gt; auto-loaded (e.g. &lt;code&gt;DOMAIN.md&lt;/code&gt;) and reference it by name.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Result-language over mechanism-language.&lt;/strong&gt; Say what the system produces, not how the sensitive part works. The honest content is unchanged — the framing names outcomes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Neutral verbs over combat metaphor.&lt;/strong&gt; Approach the problem, stop the process, reach the audience. Reads better to humans too — the metaphors were never load-bearing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run a checker before it bites.&lt;/strong&gt; We generalized the script we used on our own workspace into a small, dependency-free checker — it scans your &lt;code&gt;CLAUDE.md&lt;/code&gt; files for flag-prone standing language (protecting code spans, filenames, identifiers), sanity-checks your &lt;code&gt;settings.json&lt;/code&gt; model id, and prints suggestions. It never modifies your files:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-O&lt;/span&gt; https://tagmac.dev/tools/claudemd-hygiene-check.py
python claudemd-hygiene-check.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Python 3 stdlib only, exit code 1 on findings (slots into CI or a pre-commit hook).&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://support.claude.com/en/articles/15363606-why-claude-switched-models-in-your-conversation-with-fable-5" rel="noopener noreferrer"&gt;Anthropic Help Center — Why Claude switched models in your conversation with Fable 5&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://code.claude.com/docs/en/model-config" rel="noopener noreferrer"&gt;Claude Code docs — Model configuration&lt;/a&gt; (automatic fallback, &lt;code&gt;--safe-mode&lt;/code&gt;, &lt;code&gt;/config&lt;/code&gt; toggle, &lt;code&gt;[1m]&lt;/code&gt; suffix, &lt;code&gt;/model&lt;/code&gt; persistence)&lt;/li&gt;
&lt;li&gt;Public reports: &lt;a href="https://github.com/anthropics/claude-code/issues/66670" rel="noopener noreferrer"&gt;claude-code#66670&lt;/a&gt; · &lt;a href="https://github.com/anthropics/claude-code/issues/66916" rel="noopener noreferrer"&gt;#66916&lt;/a&gt; · &lt;a href="https://github.com/anthropics/claude-code/issues/67246" rel="noopener noreferrer"&gt;#67246&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://tagmac.dev/guides/why-claude-fable-falls-back-to-opus" rel="noopener noreferrer"&gt;tagmac.dev&lt;/a&gt;. We run every practice here on our own operations first.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>claude</category>
      <category>ai</category>
      <category>productivity</category>
      <category>programming</category>
    </item>
    <item>
      <title>Indexed but invisible: the half of AI-search/SEO everyone skips (real Search Console data)</title>
      <dc:creator>Tagmac Cankaya</dc:creator>
      <pubDate>Mon, 29 Jun 2026 08:36:08 +0000</pubDate>
      <link>https://dev.to/tagmac_cankaya/indexed-but-invisible-the-half-of-ai-searchseo-everyone-skips-real-search-console-data-32pc</link>
      <guid>https://dev.to/tagmac_cankaya/indexed-but-invisible-the-half-of-ai-searchseo-everyone-skips-real-search-console-data-32pc</guid>
      <description>&lt;p&gt;I run a small AI-systems studio (&lt;a href="https://tagmac.dev" rel="noopener noreferrer"&gt;tagmac.dev&lt;/a&gt;). When I launched the site, I did the thing everyone tells you to do for AI search and SEO: I made the pages &lt;em&gt;answer-shaped&lt;/em&gt; and trustworthy. Then I watched what actually happened in Google Search Console. The lesson surprised me, so I'm writing it down with real numbers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Part 1 — the on-page half (the part you control)
&lt;/h2&gt;

&lt;p&gt;Answer engines — ChatGPT, Google's AI Overviews, Perplexity — don't optimize to be &lt;em&gt;clicked&lt;/em&gt;, they optimize to be &lt;em&gt;quoted&lt;/em&gt;. They lift a clear, trustworthy passage from a page and cite it. So I scored my own homepage with an honest on-page citability check. It came back &lt;strong&gt;D — 48/100&lt;/strong&gt;. The page looked nice; it just wasn't built to be quoted.&lt;/p&gt;

&lt;p&gt;The fixes were unglamorous and fast:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Answer-first opening&lt;/strong&gt; — the first sentence became a direct, quotable definition instead of a marketing intro.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A real FAQ + &lt;code&gt;FAQPage&lt;/code&gt; schema&lt;/strong&gt; — answering the exact questions people type, in liftable Q&amp;amp;A form.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;E-E-A-T&lt;/strong&gt; — a named author, and one checkable claim instead of vague ones.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Freshness&lt;/strong&gt; — a visible "updated" date and a machine-readable &lt;code&gt;dateModified&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conversion links&lt;/strong&gt; — a clear next step linked &lt;em&gt;from&lt;/em&gt; the answer, not buried.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Same page, no redesign: &lt;strong&gt;A — 88/100&lt;/strong&gt;. Good. On-page is the lever you fully control, and it moves in an afternoon.&lt;/p&gt;

&lt;h2&gt;
  
  
  Part 2 — the half everyone skips (the part that actually decides it)
&lt;/h2&gt;

&lt;p&gt;Here's what surprised me. With an A-grade page, the site reached almost no one. A naive &lt;code&gt;site:&lt;/code&gt; check even looked empty, so my first assumption was "I'm not indexed."&lt;/p&gt;

&lt;p&gt;I was wrong — and this is the important part. When I opened &lt;strong&gt;Google Search Console&lt;/strong&gt; properly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;2 pages indexed&lt;/strong&gt;, technically healthy, sitemap submitted and read fine.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;21 impressions in 28 days.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;0 clicks. Average position ~5.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Every single impression was for my &lt;strong&gt;own name&lt;/strong&gt; ("tagmac", "tağmaç ne demek"). &lt;strong&gt;Zero impressions for any commercial query.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I wasn't an un-indexed island. I was &lt;strong&gt;indexed and invisible.&lt;/strong&gt; Getting &lt;em&gt;discovered&lt;/em&gt; was the easy half (verify in Search Console + Bing Webmaster Tools, submit a sitemap, earn one inbound link). The hard half is &lt;strong&gt;authority&lt;/strong&gt;: a brand-new domain has none, and without real inbound links and trust signals you get indexed but you don't &lt;em&gt;rank&lt;/em&gt; for anything competitive — you only show up when someone already searches your name.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;site:&lt;/code&gt; scraping won't tell you this. Search Console will. The gap between "indexed" and "ranking" is the whole game, and it's the part no tool can shortcut.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest checklist
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;On the page (do this first — it's free and fast):&lt;/strong&gt;&lt;br&gt;
direct quotable answer up top · FAQ + &lt;code&gt;FAQPage&lt;/code&gt;/&lt;code&gt;Article&lt;/code&gt; schema · named author · visible + machine-readable date · evidence · clear conversion links · question-shaped headings · no accidental &lt;code&gt;noindex&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Off the page (the slow half that decides whether anyone sees it):&lt;/strong&gt;&lt;br&gt;
verify + submit in Search Console and Bing Webmaster · &lt;strong&gt;check Search Console's Performance + Pages reports, not &lt;code&gt;site:&lt;/code&gt;&lt;/strong&gt; · earn real inbound links from already-indexed sites · claim a Google Business Profile if you serve a place · keep name/description consistent everywhere · then be patient — authority compounds, it doesn't switch on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The trap to avoid:&lt;/strong&gt; assuming "my page looks fine, so I'll wait and traffic will come." Indexed ≠ visible. Measure the right surface (Search Console), fix on-page in an afternoon, and treat authority as the long game it actually is.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I wrote this up in more detail (with the before/after table) on my site: &lt;a href="https://tagmac.dev/guides/how-to-show-up-in-chatgpt-and-ai-search" rel="noopener noreferrer"&gt;How to show up in ChatGPT and AI search&lt;/a&gt;. If you want to see where a page stands, there's a free &lt;a href="https://tagmac.dev/en#find" rel="noopener noreferrer"&gt;AI-visibility check&lt;/a&gt; that scores these levers and shows who shows up instead of you.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>seo</category>
      <category>ai</category>
      <category>webdev</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
