<?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: iloblique</title>
    <description>The latest articles on DEV Community by iloblique (@iloblique).</description>
    <link>https://dev.to/iloblique</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%2F4215965%2F67105f7b-1084-401b-a591-1a825b80b262.png</url>
      <title>DEV Community: iloblique</title>
      <link>https://dev.to/iloblique</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/iloblique"/>
    <language>en</language>
    <item>
      <title>A booking CRM in one prompt: what you actually get, and what the subscription was paying for</title>
      <dc:creator>iloblique</dc:creator>
      <pubDate>Fri, 13 Nov 2026 05:01:51 +0000</pubDate>
      <link>https://dev.to/iloblique/a-booking-crm-in-one-prompt-what-you-actually-get-and-what-the-subscription-was-paying-for-3df5</link>
      <guid>https://dev.to/iloblique/a-booking-crm-in-one-prompt-what-you-actually-get-and-what-the-subscription-was-paying-for-3df5</guid>
      <description>&lt;p&gt;A booking form with a table behind it is now one prompt away. A booking service is not, and the gap between the two is what a salon or clinic pays a subscription for. That is the answer. The rest of this piece is the proof.&lt;/p&gt;

&lt;p&gt;Over the past month several videos have made the same promise in different words: drop your booking subscription and have AI build your own CRM with client booking, in one prompt, in minutes, for free. On 6 November we checked that promise against vendor documentation, pricing pages and published security audits. Here is the strongest version of it, then what the screen leaves out.&lt;/p&gt;

&lt;h2&gt;
  
  
  The strongest version of the claim
&lt;/h2&gt;

&lt;p&gt;Part of it is true, and we will say so first.&lt;/p&gt;

&lt;p&gt;OpenAI's guide says a Codex project is tied to a folder on your computer, and an empty folder works as the place where Codex creates a new project. OpenAI's curated skills catalog includes &lt;code&gt;vercel-deploy&lt;/code&gt; and &lt;code&gt;netlify-deploy&lt;/code&gt;, so "now put it online" is a supported request. Since July 2026 ChatGPT Sites can publish a site too. Lovable sells a barbershop booking template.&lt;/p&gt;

&lt;p&gt;So an empty folder, one prompt and a public URL is real. If the question is "can I put a working booking prototype online", the answer is yes, and it is a good way to start.&lt;/p&gt;

&lt;p&gt;The claim goes further than that. It says the result &lt;em&gt;replaces the service&lt;/em&gt;. That part does not hold.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is not on the screen
&lt;/h2&gt;

&lt;p&gt;In the demos we reviewed, the screen shows the client-side form: pick a service, a date, leave a contact. That is the top layer of a booking product. Five things sit under it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Two people, one slot.&lt;/strong&gt; A prototype that checks availability and then inserts a row has no transactional protection for the slot. Sooner or later it gives the same 3 p.m. to two clients who pressed the button in the same second. The fix doesn't go in the interface. It is a guarantee in the database.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- the check a prototype does (in the browser or the API):&lt;/span&gt;
&lt;span class="k"&gt;select&lt;/span&gt; &lt;span class="nb"&gt;count&lt;/span&gt;&lt;span class="cm"&gt;(*) from bookings
 where staff_id = $1 and slot &amp;amp;amp;&amp;amp;amp; tstzrange($2, $3);
-- returns 0 for both clients, both inserts succeed

-- the guarantee: the database refuses an overlap, whoever arrives second
create extension if not exists btree_gist;
alter table bookings
  add constraint no_double_booking
  exclude using gist (staff_id with =, slot with &amp;amp;amp;&amp;amp;amp;)
  where (status &amp;amp;lt;&amp;amp;gt; 'cancelled');
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Messages that actually arrive.&lt;/strong&gt; Reminders are what clients notice. WhatsApp reminders go through the WhatsApp Business API, which needs a verified business, a provider's monthly fee and Meta's own message charges on top. Grey bulk sending from an ordinary number gets the number blocked. SMS needs a paid gateway. None of that is code a prompt can write. It is accounts, verification and a monthly bill.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Money and personal data.&lt;/strong&gt; Once you take prepayment or store client phone numbers, law applies to you. In Russia, for example, online prepayment needs an online cash register issuing fiscal receipts under 54-FZ, connected to a fiscal data operator, and client records fall under 152-FZ on personal data. Elsewhere, check your own country's rules; we are not lawyers. Either way, someone has to answer a request about a client's data, and a one-prompt prototype has no one to do it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Who can see what.&lt;/strong&gt; A booking table holds names and phone numbers. A prototype built from one prompt has no server-side authorization and no roles. The documented case is CVE-2025-48757: apps generated on Lovable shipped with Supabase row-level security switched off, so their data could be read without authorization. Audits also found keys left in client code. The rule that closes it is short. Writing it is easy. Remembering it is the hard part.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;alter&lt;/span&gt; &lt;span class="k"&gt;table&lt;/span&gt; &lt;span class="n"&gt;bookings&lt;/span&gt; &lt;span class="n"&gt;enable&lt;/span&gt; &lt;span class="k"&gt;row&lt;/span&gt; &lt;span class="n"&gt;level&lt;/span&gt; &lt;span class="n"&gt;security&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- a client sees only their own booking; staff see their own day&lt;/span&gt;
&lt;span class="k"&gt;create&lt;/span&gt; &lt;span class="n"&gt;policy&lt;/span&gt; &lt;span class="n"&gt;client_reads_own&lt;/span&gt; &lt;span class="k"&gt;on&lt;/span&gt; &lt;span class="n"&gt;bookings&lt;/span&gt;
  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;select&lt;/span&gt; &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;client_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;uid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;create&lt;/span&gt; &lt;span class="n"&gt;policy&lt;/span&gt; &lt;span class="n"&gt;staff_reads_own_day&lt;/span&gt; &lt;span class="k"&gt;on&lt;/span&gt; &lt;span class="n"&gt;bookings&lt;/span&gt;
  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;select&lt;/span&gt; &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;staff_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;uid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;-- no insert policy for anon: public bookings go through one narrow function&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;5. Who fixes it.&lt;/strong&gt; Running the system by chatting with the model works until the first conflict in the data. Then someone has to know where the truth lives, at 2 a.m. if that is when it breaks. That person is part of what the subscription pays for.&lt;/p&gt;

&lt;h2&gt;
  
  
  "Free" has a ceiling
&lt;/h2&gt;

&lt;p&gt;The free tiers are real and fine for a prototype. Here is where they stop, and what starts billing once the prototype becomes a service:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Free, for the prototype
  Lovable free plan   5 credits a day, no more than 30 a month
  Supabase free tier  database up to 500 MB

Paid, once it is a service
  WhatsApp            verified Business API account + Meta message charges
  SMS                 paid gateway
  Prepayment (RU)     online cash register under 54-FZ + fiscal data operator
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What the audits say about generated code
&lt;/h2&gt;

&lt;p&gt;These aren't our numbers. Across the 2025–2026 audits we read, 45–55% of AI-generated code fails basic OWASP security tests. The audits are Veracode's 2025 GenAI Code Security Report, the SusVibes benchmark (arXiv 2512.03262), built on feature tasks from real open-source repositories, and Escape.tech's scan of public apps built on vibe-coding platforms.&lt;/p&gt;

&lt;p&gt;None of these says AI code is unusable. Our reading, and it is ours: it works on the screen and fails where nobody looked.&lt;/p&gt;

&lt;h2&gt;
  
  
  How we build it
&lt;/h2&gt;

&lt;p&gt;We built a clinic booking system under NDA, so no name here. The brief was a folder of Instagram videos and screenshots. Double booking is stopped by a database exclusion constraint plus a transactional booking function. Role access is enforced twice, in application logic and in row-level security, so a bug in one layer doesn't leak data. Every public write goes through a narrow single-purpose function. Doctors see their day in Google, Apple or Outlook through a private calendar feed.&lt;/p&gt;

&lt;p&gt;The repository carries 13 ordered migrations, unit, integration and end-to-end suites, an hourly reminder job and a six-document handover kit. The form was the smallest part of it.&lt;/p&gt;

&lt;p&gt;Our view: build the prototype first. It is the cheapest way to find out what your booking flow actually needs. Then, with that list in hand, decide whether to build the rest or keep paying someone who already did.&lt;/p&gt;

&lt;h2&gt;
  
  
  What would change our mind
&lt;/h2&gt;

&lt;p&gt;If a one-prompt build passes a concurrent-booking test (two clients, one slot, the same second) and arrives with access rules and verified messaging in place with no extra work, this piece is wrong. We would take it down and say so here, at the same length.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;So is the one-prompt promise wrong?&lt;/strong&gt;&lt;br&gt;
Half of it. The prototype is real: an agent creates it in an empty folder and publishes it, and the free tiers carry a test with real clients. The "replaces the service" half is the part that fails. In our reading, generated code tends to skip what nobody asked for, so check access rules and keys by hand, every time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What breaks first when a prototype goes live?&lt;/strong&gt;&lt;br&gt;
In our experience, the slot. Two clients book the same time, or a reminder never arrives because the messaging account was never verified. Neither shows up in a demo with one user.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When does building your own booking system make sense?&lt;/strong&gt;&lt;br&gt;
Our view: when booking is part of what you sell, not just how clients reach you. Think a portal with patient records, doctor schedules and content your staff edit themselves. If you only need a calendar and reminders, a subscription is usually the cheaper engineering.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related case
&lt;/h2&gt;

&lt;p&gt;The same rule runs through RE Intelligence, our analytics of the Dubai real-estate market: the guarantees live in the database. Every number comes from a deterministic query, and the model only narrates what the data already proved. Read the case at &lt;a href="https://iloblique.com/re-intelligence" rel="noopener noreferrer"&gt;iloblique.com/re-intelligence&lt;/a&gt;. The short version of this piece is &lt;a href="https://www.iloblique.com/blog/booking-crm-in-one-prompt-what-the-subscription-pays-for" rel="noopener noreferrer"&gt;on LinkedIn&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you have something worth building, we'd like to hear about it.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;OpenAI Academy, Codex: how to start — &lt;a href="https://openai.com/academy/codex-how-to-start" rel="noopener noreferrer"&gt;https://openai.com/academy/codex-how-to-start&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;OpenAI skills catalog (curated) — &lt;a href="https://github.com/openai/skills/tree/main/skills/.curated" rel="noopener noreferrer"&gt;https://github.com/openai/skills/tree/main/skills/.curated&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Lovable, TrimSync barbershop booking template — &lt;a href="https://lovable.dev/templates/websites/services/trimsync-premium-barbershop-booking-template" rel="noopener noreferrer"&gt;https://lovable.dev/templates/websites/services/trimsync-premium-barbershop-booking-template&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Lovable pricing — &lt;a href="https://lovable.dev/pricing" rel="noopener noreferrer"&gt;https://lovable.dev/pricing&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Supabase pricing — &lt;a href="https://supabase.com/pricing" rel="noopener noreferrer"&gt;https://supabase.com/pricing&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Meta, WhatsApp Business Platform pricing — &lt;a href="https://developers.facebook.com/docs/whatsapp/pricing" rel="noopener noreferrer"&gt;https://developers.facebook.com/docs/whatsapp/pricing&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Veracode, 2025 GenAI Code Security Report — &lt;a href="https://www.veracode.com/press-release/ai-generated-code-poses-major-security-risks-in-nearly-half-of-all-development-tasks-veracode-research-reveals/" rel="noopener noreferrer"&gt;https://www.veracode.com/press-release/ai-generated-code-poses-major-security-risks-in-nearly-half-of-all-development-tasks-veracode-research-reveals/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;SusVibes, arXiv 2512.03262 — &lt;a href="https://arxiv.org/html/2512.03262v2" rel="noopener noreferrer"&gt;https://arxiv.org/html/2512.03262v2&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Escape.tech, vulnerabilities in vibe-coded apps — &lt;a href="https://escape.tech/blog/methodology-how-we-discovered-vulnerabilities-apps-built-with-vibe-coding/" rel="noopener noreferrer"&gt;https://escape.tech/blog/methodology-how-we-discovered-vulnerabilities-apps-built-with-vibe-coding/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;CVE-2025-48757 write-up, Superblocks — &lt;a href="https://www.superblocks.com/blog/lovable-rls-breach" rel="noopener noreferrer"&gt;https://www.superblocks.com/blog/lovable-rls-breach&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://www.iloblique.com/blog/booking-crm-in-one-prompt-what-the-subscription-pays-for" rel="noopener noreferrer"&gt;iloblique.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>openai</category>
      <category>saas</category>
      <category>software</category>
    </item>
    <item>
      <title>Claude Sonnet 4.5 retires on November 30. The migration is not one line</title>
      <dc:creator>iloblique</dc:creator>
      <pubDate>Wed, 11 Nov 2026 05:01:40 +0000</pubDate>
      <link>https://dev.to/iloblique/claude-sonnet-45-retires-on-november-30-the-migration-is-not-one-line-56ab</link>
      <guid>https://dev.to/iloblique/claude-sonnet-45-retires-on-november-30-the-migration-is-not-one-line-56ab</guid>
      <description>&lt;p&gt;On November 30, 2026, Anthropic retires &lt;code&gt;claude-sonnet-4-5-20250929&lt;/code&gt; from the Claude API. After that date, requests to it fail. They do not slow down or fall back to something close. They return an error. As of November 9, that is 21 days away. The same day, fast mode for Claude Opus 4.8 is removed, and that ends in an error too.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2026-09-30  claude-sonnet-4-5-20250929 marked Deprecated     (notice: 61 days)
2026-10-21  API version where temperature / top_p / top_k -&amp;gt; 400
2026-10-30  release notes: fast mode for Claude Opus 4.8 deprecated
2026-11-30  claude-sonnet-4-5-20250929 retired           -&amp;gt; requests fail
2026-11-30  claude-opus-4-8 with speed: "fast" removed    -&amp;gt; requests return an error
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Anthropic's named replacement for Sonnet 4.5 is &lt;code&gt;claude-sonnet-5-5&lt;/code&gt;. The obvious fix is to change one string. It may not be enough. The deprecations page notes that since API version 2026-10-21 the sampling parameters &lt;code&gt;temperature&lt;/code&gt;, &lt;code&gt;top_p&lt;/code&gt; and &lt;code&gt;top_k&lt;/code&gt; return a 400. Code that was tuned with those parameters can fail even with the right model name.&lt;/p&gt;

&lt;p&gt;So the work before November 30 has three steps: find every place the old identifier still runs, fix the request, and rerun your own cases before you switch traffic.&lt;/p&gt;

&lt;p&gt;In our view, this hits one founder hardest: the one whose AI feature was built by a contractor who has since moved on. The model name can sit in code nobody on the team has opened in a year.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: find where the old model still runs
&lt;/h2&gt;

&lt;p&gt;Start from usage, not from the code. Code tells you what could call the model. Usage tells you what actually does.&lt;/p&gt;

&lt;p&gt;Anthropic's deprecations page points to Claude Console → Usage → Export. The CSV breaks usage down by API key and by model. It shows which keys still send traffic to the retiring identifier, and a key can map to a service, an environment or a person.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Claude Console -&amp;gt; Usage -&amp;gt; Export (CSV)

filter:   model = claude-sonnet-4-5-20250929
group by: API key
-&amp;gt; one row per key still calling the old model
-&amp;gt; for each key: which service, who owns it, who can deploy it
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then search the code and config behind those keys. Search beyond the main repository too: env files, a config table, a no-code automation, a function someone deployed by hand.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;grep -rn &lt;span class="s2"&gt;"claude-sonnet-4-5"&lt;/span&gt; .
grep -rn &lt;span class="s2"&gt;"claude-opus-4-8"&lt;/span&gt; .
grep -rn &lt;span class="s2"&gt;"speed"&lt;/span&gt; .                      &lt;span class="c"&gt;# speed: "fast" on Opus 4.8&lt;/span&gt;
grep -rnE &lt;span class="s2"&gt;"temperature|top_p|top_k"&lt;/span&gt; .
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Our opinion: a key with traffic and no owner is the real finding of this step. It is the part of the product nobody is responsible for.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: fix the request, not just the name
&lt;/h2&gt;

&lt;p&gt;A one-line migration looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gd"&gt;- "model": "claude-sonnet-4-5-20250929",&lt;/span&gt;
&lt;span class="gi"&gt;+ "model": "claude-sonnet-5-5",&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What the deprecations page warns about is the rest of the request body. If the integration sets sampling parameters, those lines return a 400 from API version 2026-10-21 on. An illustration:&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="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"claude-sonnet-5-5"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt;-&lt;/span&gt;   &lt;span class="nl"&gt;"temperature"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt;-&lt;/span&gt;   &lt;span class="nl"&gt;"top_p"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;"max_tokens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;"messages"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Deleting the lines is the easy part. The harder part is that they were there for a reason. A low temperature may have been how someone kept a classifier stable or a JSON extractor from drifting. Take the setting away and the behavior it bought has to come from somewhere else: the prompt, a schema, a validation step after the call. That is a code change and a design decision, not a find-and-replace.&lt;/p&gt;

&lt;p&gt;Fast mode is the same kind of change. Per the release notes of October 30, after November 30 requests to &lt;code&gt;claude-opus-4-8&lt;/code&gt; with &lt;code&gt;speed: "fast"&lt;/code&gt; return an error. Any call that sends it needs an edit, and that edit goes through step 3 like the rest.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: rerun your own cases before the switch
&lt;/h2&gt;

&lt;p&gt;A new model passing a demo proves little. What matters is whether it handles your inputs the way the old one did, including the ordinary ones nobody thinks to test.&lt;/p&gt;

&lt;p&gt;A team described exactly this in an r/AI_Agents thread on October 2, 2026. They changed only a prompt. The change passed the cases they had tuned it on. On a set it had not seen, it wrongly blocked 17 of 30 ordinary requests. They now ship any model or prompt change as its own version. A commenter in the same thread named the buyer's fear: not wanting every model release to turn into a testing project for their team.&lt;/p&gt;

&lt;p&gt;That fear is fair. Our answer is a small, boring harness that exists before the next release, not after it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cases/
  tuned/     # inputs the prompt was written against
  holdout/   # real, ordinary inputs it never saw
  edge/      # cases that once broke production

for model in [current, candidate]:
    for case in tuned + holdout + edge:
        out = call(model, case.input)      # same prompt, same code path
        record(model, case.id, check(out, case.expected))

compare pass rate per folder, per model
ship only if holdout does not get worse
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The holdout folder is the point. Tuned cases tell you the prompt still fits what it was aimed at. Holdout cases tell you whether it still behaves on Tuesday's traffic.&lt;/p&gt;

&lt;p&gt;Run the current model through it now, while it still answers. After November 30 there is no baseline to compare against.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the steps leave out
&lt;/h2&gt;

&lt;p&gt;Our recommended order, not Anthropic's. Two things the steps above do not say:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;migrate on a branch, not in place    -&amp;gt; the old path stays runnable until the switch
keep the harness after November 30   -&amp;gt; the next notice starts from a baseline, not from zero
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We do not expect this to be the last retirement. In our view, a team that keeps the harness turns the next deprecation notice into routine work.&lt;/p&gt;

&lt;p&gt;What would change our mind: if your integration sets no sampling parameters and does not use fast mode, step 2 shrinks to the one-line diff. Steps 1 and 3 stay.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Is the 400 tied to the new model or to the API version?&lt;/strong&gt;&lt;br&gt;
The deprecations page ties it to API version 2026-10-21, not to a model name. Our reading: test the full request body on the API version your client actually sends, not only the new model string.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does this touch Claude Opus 4.8 without fast mode?&lt;/strong&gt;&lt;br&gt;
The October 30 release notes describe the removal of fast mode: requests to &lt;code&gt;claude-opus-4-8&lt;/code&gt; with &lt;code&gt;speed: "fast"&lt;/code&gt; return an error after November 30. That entry announces nothing beyond fast mode.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How many test cases do we need?&lt;/strong&gt;&lt;br&gt;
There is no official number. Our view: start with the inputs the prompt was tuned on, a holdout set of real ordinary requests, and every case that has broken production before. The holdout set is the one that catches what the team in the thread above missed.&lt;/p&gt;

&lt;h2&gt;
  
  
  A related case
&lt;/h2&gt;

&lt;p&gt;The same discipline runs through Holt, our language-learning product. No model output reaches a learner unvalidated, and generated material is judged against blind golden sets by a model with no hand in it: 96.7% pass and 0.0% substantive defects on the wave of August 19, 2026. That is the harness from step 3, kept running. The case is at &lt;a href="https://iloblique.com/holt" rel="noopener noreferrer"&gt;iloblique.com/holt&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you have something worth building, we'd like to hear about it.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Anthropic, Model deprecations, Claude API docs (checked November 9, 2026): &lt;a href="https://platform.claude.com/docs/en/about-claude/model-deprecations" rel="noopener noreferrer"&gt;https://platform.claude.com/docs/en/about-claude/model-deprecations&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Anthropic, Claude API release notes, entry of October 30, 2026: &lt;a href="https://platform.claude.com/docs/en/release-notes/overview" rel="noopener noreferrer"&gt;https://platform.claude.com/docs/en/release-notes/overview&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;A thread in r/AI_Agents, October 2, 2026, paraphrased in our words&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://www.iloblique.com/blog/claude-sonnet-4-5-retires-november-30-migration" rel="noopener noreferrer"&gt;iloblique.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>api</category>
      <category>claude</category>
      <category>llm</category>
    </item>
  </channel>
</rss>
