Systems Ninjas (2026). Why conversational bots decay without anyone changing them. Positions and dates as at 2026-09, including a re-verification on 2026-09-02 that found no public primary for either announced retirement date. systemsninjas.com/post/why-chatbots-decay
Take any of it. You do not need to ask. If you find an error in here we would rather hear about it than not, and the correction goes on the page.
Because nothing about it changed, which is exactly the problem. The three most common causes of bot decay are all invisible in a change log: the model underneath it gets retired and silently swapped, a fact it was told once stops being true, and a link someone typed into its instructions stops resolving.
None of these throw an error. The bot keeps answering. It just gets quietly worse, in a voice nobody chose.
This is the only software defect we know of that arrives on a calendar rather than in a diff. You change nothing. A shutdown date passes. The model powering the bot is swapped for one the platform selected, and everything downstream shifts a little: the tone, the length, the willingness to guess.
There is no error to read and no diff to review.
We track this because we had to. Two retirement waves were announced to us for the platform we build on, one in 2026-08 and one in 2026-10, each naming specific models. So far so ordinary. Here is what happened when we tried to verify them.
We could not find a public primary source for either date. The announcement reached us by email. The vendor's public changelog spans the first shutdown date and carries no entry about it. No help-centre article names either date.
And two days after the first wave's date, the vendor's own interface was still offering models it was supposed to have retired. We checked by reading the live application bundle. It lists retired models as available, and it also lists models that the runtime rejects outright if you try to use them.
So the vendor's own product over-reports in BOTH directions, and there is no instrument available to a customer that can confirm a retirement before it lands.
The operational rule we adopted: plan for the date, and do not wait for a confirmation that has no surface to arrive on.
The instinct is that pinning a bot to a model that is being retired is the risky state, and leaving it on the default is the safe one.
It is the other way round.
A bot with no model specified runs the platform default, and the platform default is precisely what auto-migration moves. It changes with no diff, no notice, and no record on your side. A bot pinned to a dying model at least has a date attached to its problem and a person who can act on it.
If you run a bot and nobody can tell you which model it uses, that is the finding.
Depending on how a bot was built, the platform refuses to accept a model setting on it:
422 llm is only allowed when bot type is PROMPT_BASED_BOT
Those bots are exposed to auto-migration with no lever available to anyone. We flag them as such, and we are careful never to write that up as a fixable problem, because a finding with no possible fix is exactly how a safety check gets switched off by the people it nags.
This one is ours to own, because we did it.
A bot's instructions can either contain a fact ("book here: example.com/booking") or reference a variable that holds it. Typing it in is faster and it works perfectly ... until the fact changes.
At a domain rebrand, four live bots turned out to be carrying private copies of the same link. One of them was pointing at a hostname that no longer resolved at all, on a page reached by paid advertising traffic. Nobody edited those bots. Nobody broke them. The world moved and the copies did not.
The rule we now enforce with a checker rather than a reminder: never type a shared fact into a bot's instructions. A price, a date, an address, a link, an opening time. Reference the variable, so there is one place to change it and one place to be wrong.
There are two distinct failures here and it is worth separating them, because most tooling only catches the first:
The second is the one that bites, and it is only detectable by looking for literals where a reference should be.
The subtlest of the three. A person tells a bot a fact in conversation. The bot uses it correctly, right then, and stores nothing.
A week later an automated step asks them for something they already provided, because the record never learned what the conversation knew. From the customer's side that is not a small annoyance. It reads as being ignored by a company that is not paying attention.
A bot that recognises a fact and writes nothing has not learned it. If your bot cannot update the customer record, it has a memory that lasts exactly as long as one conversation.
Not "we will keep an eye on it". Four specific things, all checkable:
We ran a comparison of several models on a live client bot's real instructions, and it produced clean, useful-looking numbers. Some of them were counter-intuitive in the way good findings are, including one where a newer, smaller model performed worst.
Then we found the flaw. The instructions we fed to the models were the RAW template, and a real bot's instructions are a template full of placeholders that get filled in at runtime. On the bot in question, the version we tested was 38% of the real thing. It never errored. It returned plausible tables measuring what those models do without our actual rules in front of them.
So those numbers are withdrawn until the re-run lands. The harness now resolves the placeholders, refuses to run if it cannot read them, and prints how many it substituted.
We are publishing that here for the same reason we publish everything else: a test record containing only wins is a brochure, and everyone reading it knows.
Positions and dates as at 2026-09. The 2026-10 retirement wave has not happened yet, and when it does we will state here whether it executed, because the previous one could not be confirmed either way.
It is one question and the answer is diagnostic on its own. If nobody can tell you, that is the finding, and it means your bot is sitting on the platform default, which is exactly what gets moved without a record. Send us the answer you get and we will tell you what it means and what the exposure actually is.
Ask us what the answer means [email protected] · No client of ours is named anywhere on this page, and if you become one, you will not be either.