Back to Blog
Tiago Duarte

Anthropic Changed What Fable 5 Answers Without Changing Its Version Number

Anthropic Changed What Fable 5 Answers Without Changing Its Version Number

What changed in Claude Fable 5 on August 7, 2026?

Anthropic retrained the safety classifier sitting in front of Claude Fable 5, and biology-topic fallbacks to Opus 5 dropped about 85%. The model version did not change. Pricing did not change. Nothing in your configuration changed. What changed is the set of prompts that get answered by the model you configured.

At launch, the classifier erred hard toward caution. Users reported blocks on mitochondria, RNA sequencing, cancer biology, and ordinary cellular anatomy questions, all of which got rerouted to Opus 5. The fix was structural: Anthropic rewrote the classifier's constitution, the rule set defining safeguarded versus allowed content, carved out benign use cases in detail, generated new training data from the revised rules, and retrained the classifier. Dual-use territory still falls back, specifically virology, toxicology, and molecular design, with professional biology research pending a trusted-access pathway.

Why is a classifier in front of a model a capability variable you cannot version?

A classifier reads the prompt before the model does and can route it somewhere else. That routing is a runtime decision made on content, not a setting you control. It ships on the vendor's schedule with no version bump, so two identical requests a week apart can be served by two different models under the same model string in your metadata.

This is a different failure than a deprecated snapshot ID. A retired model ID throws an error, and errors get noticed. A classifier fallback returns a valid 200 with a well-formed body produced by a model you did not pick. Latency shifts. Response length and formatting shift. Your JSON parser probably still succeeds. If you built a strict output contract, you might catch it as a schema failure. If you are parsing loosely, which most integrations do, nothing anywhere tells you the routing happened.

Which surface are you actually on?

The 85% figure is an aggregate across product surfaces. Broken out: about 67% on Claude.ai, about 55% on Cowork, about 17% on Claude Code, and about 7% on Claude Platform, the API. If your Salesforce integration calls the API, you got the smallest of the four improvements. The headline number is not your number.

That spread matters if you are the person writing the client update. Quoting 85% to a team whose agent runs through the API overstates their improvement by roughly an order of magnitude. The consumer surfaces absorbed most of the change; the integration path absorbed the least. Anyone building an Agentforce or Apex-side integration on a Claude backend is on the 7% line, not the 67% one.

Why will your cost dashboard not flag the fallback?

Opus 5 launched on July 24, 2026 at $5 per million input tokens and $25 per million output, half of Fable 5's $10 and $50. So a classifier fallback routes traffic to the cheaper model. Your spend goes down, not up. Anomaly detection tuned to catch a cost spike sees a small dip and stays quiet.

That inversion is what makes this hard to catch operationally. The three signals a team normally watches all point the wrong way or say nothing. Cost drops slightly. Error rate stays at zero because the request succeeded. Latency moves, but latency moves for a dozen unrelated reasons and nobody opens an investigation over a 300ms shift on a subset of prompts. The only field that tells the truth is the one most integrations throw away.

How do you log which model actually answered?

The response body echoes the model that produced it. Read that field, compare it against the model you requested, and persist both plus a boolean. One column named Fell_Back__c turns an invisible routing decision into something you can query, chart against latency, and correlate with support tickets. Two fields and a flag.

Do not run DML inside the callout transaction for this. Publish a Platform Event after the callout returns and let a subscriber write the record, so logging never adds a governor-limit failure mode to the path it is supposed to observe.

public with sharing class ModelCallLogger {

    public static Agent_Call_Event__e build(
        String modelAlias,
        String configuredModel,
        HttpResponse res,
        Long elapsedMs
    ) {
        String servedModel = 'unparsed';
        try {
            Map<String, Object> body =
                (Map<String, Object>) JSON.deserializeUntyped(res.getBody());
            if (body.get('model') != null) {
                servedModel = String.valueOf(body.get('model'));
            }
        } catch (Exception e) {
            // keep 'unparsed' and move on; never fail the call to log the call
        }

        return new Agent_Call_Event__e(
            Model_Alias__c      = modelAlias,
            Configured_Model__c = configuredModel,
            Served_Model__c     = servedModel,
            Fell_Back__c        = (servedModel != configuredModel),
            Elapsed_Ms__c       = elapsedMs
        );
    }
}

Collect the events across the transaction and publish once with EventBus.publish. After a week of traffic you can answer a question you previously could not: which topics in this org get routed away from the model we picked, and what does that do to response time. Before the logging exists, that question has no answer and the conversation defaults to opinion.

How do you test for this before a client finds it?

Generic prompts do not trigger topic classifiers, so a generic test suite proves nothing. Build a golden set from the client's real vocabulary: 20 to 40 prompts pulled from actual cases, ticket text, and product names. Run it on every release and record served model and P95 latency per prompt, not just pass or fail.

For a life-sciences, hospital, or health-insurance client, that means the test set contains real biology terms, because those are exactly the strings the classifier is tuned on. A claims agent summarizing oncology treatment authorizations is handling cancer biology vocabulary every day, whether or not anyone described the project that way in the SOW. The same logic applies to any domain where a vendor runs topic-based safeguards: chemicals, firearms adjacent retail, security tooling. Test with the words the users type.

Where else does the same pattern show up?

Agentforce 360 received DoD Impact Level 5 authorization on August 5, 2026. Per DefenseScoop reporting, Salesforce attested that Anthropic-supplied generative AI models and capabilities were disabled to obtain it. Same product name on the invoice, different capability envelope in the environment. A hardened deployment is not feature-equivalent to a commercial org.

The IL5 detail is press reporting rather than first-party disclosure, so verify it against the target environment before putting it in a design document. The general shape is what carries over: platform capability and model-dependent behavior are two separate things, and a name at the top of a config file guarantees neither one. Drawing that line during scoping, rather than during a regulated go-live, is the cheaper time to do it.

When is this not worth the work?

If your agents run only on Agentforce-managed models over ordinary CRM vocabulary, Salesforce owns the routing and you will probably never observe a topic-triggered fallback. The logging earns its place when you call a model API directly from Apex, Flow, or an MCP server, and your domain vocabulary overlaps with what the vendor's classifiers watch for.

Even then, calibrate the effort. This is not a project. It is two custom fields, a boolean, and one Platform Event on a callout path you already wrote. If you are already logging request duration, you are three fields away from also knowing which model produced the answer you charged the client for. The reason to add it now is that the fallback is silent by design, and the week you need the data is the week you cannot go back and collect it.