A crash is honest. It interrupts you, it prints a stack trace, it tells you where to look. You fix it because it insists.
This catalogue is about the other kind. Code that runs. Code that returns. Code that satisfies every assertion you thought to write, and hands the person using your software absolutely nothing.
I have shipped this class of bug at least twenty-four times across two projects: a Windows system monitor that is on the Microsoft Store, and a strategy game in development. Both are built solo and in public, so the record of these mistakes is not a memory. It is a commit history I cannot edit.
What follows is the taxonomy I wish someone had handed me fourteen months ago. Eight classes. Every case is real and dated. Every sweep is one I actually run.
- The eight classes at a glance
- SF-01 · The function nobody calls
- SF-02 · The key that never existed
- SF-03 · The import that never worked
- SF-04 · The success message that is a lie
- SF-05 · The silent catch
- SF-06 · The environment that hides the bug
- SF-07 · Two sources of one truth
- SF-08 · The rule that only exists in the interface
- Running all of this as one pre-release check
- Why one person misses every one of these
- Where AI assistance actually changes this
- What the app does about it
The eight classes at a glance
If you only read one thing on this page, read the middle column. Every entry below is a different answer to the same question: what does your test suite think it is proving, and what is it actually proving?
The catalogue
TryAcquireDataSource and TryAdoptArchitecture directly and nothing in the interface layer ever did. The sweep above returned 46 public mutators, 21 with no caller anywhere, and 5 that were meant to be player actions.
2026-07-10. A method called
set_turbo() existed on the always-on optimizer daemon and had no caller in the codebase. The entire coupling it was written for was dead from the day it was written.2026-07-03. Sixteen assistant intents matched user phrasings at full confidence and had no handler behind them. Confidence 1.00, then silence.
evt["message"]. That key did not exist in any layer of the codebase, ever. The real answer was one dictionary key away and the most informative label the product ever showed a user was the word "Unknown".
cpu_temp, and the query feeding it filtered WHERE cpu_temp > 0. Reading CPU temperature on Windows needs a sensor service most people do not run, so on those machines the column was always zero and the filter excluded every row. Worth noting honestly: a correctness rule I had added the week before, never learn from an estimated temperature, is what zeroed the column. A good decision created a silent outage.
import wmi, a package that was never installed and never bundled. The scan failed on every machine and the failure was caught by a bare except: pass. The first successful hardware identity write in the project's history happened the day I rewired it to the scanner that already worked.
psutil.sensors_temperatures() returns an empty dict on Windows. It does not. On Windows the attribute does not exist at all, so every call raised AttributeError into a try block. I only checked because I was writing an article about repeating claims from memory. The correction is on that page and this line exists so the wrong version does not outlive it.
hasattr explicitly and record which branch you took, so an absent sensor is visibly different from a normal reading.
GetConsoleWindow() returns a hidden proxy window, so ShowWindow(SW_HIDE) succeeds, returns success, and changes nothing on screen. A tester reported it and I could not reproduce it, because my machine used a different terminal host.2026-08-08. The Store build's "create desktop shortcut" feature wrote a shortcut pointing at an Application Id absent from the published manifest. Clicking it opened nothing. Nobody reports a shortcut like that. They stop using it.
except also swallows NameError and AttributeError from code that never worked, plus SystemExit and KeyboardInterrupt, which makes clean shutdown unreliable on top of everything else.
except: followed by pass. Two lines above it, the code read a variable belonging to a different function. NameError, on every call, for four months. The entire fallback path was dead from day one. I found it because some answers felt slightly worse than they should, which is not a debugging method.
False and the product's main AI layer switched itself off. Everything ran. Tests were green. A guard test written the same day, for a blind spot I had not predicted, is the only reason I know.2026-07-15. A repository-wide count found 53 bare
except: clauses.
Optional[str] in annotations and never imported Optional. On my machine it worked perfectly, because I develop on Python 3.14, where PEP 649 defers annotation evaluation and the missing import never fires. On 3.9 through 3.13, the versions I officially support, it raised on import and the whole module silently turned itself off. My own runtime was hiding the bug from me.
C:\Program Files\WindowsApps, which is read only. The app wrote its database, preferences and learning baselines next to its own executable, so every write failed silently on every Store install. Certification does not check this, and users do not report it, because nothing appears to go wrong. The app is simply permanently amnesiac. The rule that came out of it: do not detect an environment by name, probe it. A path check is a guess, a real write probe is a fact.2026-08-08. The package manifest referenced one 32x32 image for every tile slot, including the 150x150 one. Windows stretched it. This is exactly what had been rejected as blurry two months earlier and it survived every release in between, because a manifest references files by name and nothing verifies they exist at the size the name implies.
Scaling Laws. Object.Destroy is a no-op outside play mode. A texture cache that correctly released memory at runtime released nothing in the editor, and only a soak test building every screen in edit mode ever noticed.
2026-07-04 and 2026-07-15. The same base-directory helper existed in six copies. An administrator check existed in five.
2026-07-18. Per-process CPU load was read on a per-core scale. One busy thread on a twelve-thread machine displayed 100 percent while the machine idled at 8. Top-process lists ranked noise and the proactive alert fired at nothing.
TryStartTraining. But Project(), the function the creator screen calls on every slider movement, did not check the ceiling or the precision gates at all. The creator happily priced a run that the START button then refused, with no warning attached to anything the player had touched. I wrote a test file that never opens a panel: it builds blueprints above the ceiling directly and asserts the company says no.
Reprice() the blueprint was built from the raw slider value and the ceiling was applied after. The slider handle snapped back and every number on screen kept the value the player had dragged to. Validation that runs after the read is not validation.
Running all of this as one pre-release check
None of these sweeps is worth much as a thing you remember to do. Vigilance does not scale past a few thousand lines, and it fails exactly when you are tired, which is exactly when this class of bug ships.
What works is making them boring. Every sweep on this page runs in a single script that I fire before tagging a release, and the whole thing finishes in under a minute on a repository of about sixty thousand lines.
The important detail is the last line of the comment. This script does not block a release. It prints a list a human reads, because half of what it finds is legitimate: internal plumbing with no user-facing caller, a helper that genuinely should exist twice, a success message on an operation that really is read-only. A check that cries wolf gets disabled within a week, and then it protects nothing.
The ones that must actually fail a build are narrower and there are only a handful: no bare excepts, no dead imports, no hardcoded version literals, no second copy of a helper that is supposed to be single-source. Those are ratchets. Everything else on this page is a report.
Why one person misses every one of these
There is a reason this catalogue comes from a solo project rather than a team one, and it is not that I am careless, although in several of these entries I clearly was.
The failures here share a shape: they are all invisible from the inside. Nothing crashes. Nothing logs. Nothing looks wrong on the screen you happen to be looking at. Every single one of them requires somebody to ask a question nobody thought to ask, and when you build alone, the set of questions that get asked is exactly the set you already know to ask.
A reviewer supplies that for free. Not because they are smarter, but because they arrive without your assumptions. The reviewer who reads your test file has never been told that the test calls the function directly and that this is fine. They just see a test that does not resemble what a user does, and they say so.
Without one, you need a substitute, and the substitute has to be mechanical. That is the entire argument for the sweeps above. A grep does not get tired, does not assume, and does not politely skip the file it read last week. It is a worse reviewer than a person in every respect except the one that matters here: it is not you, and it does not share your blind spots.
The second substitute is a real user, and it is uncomfortable how much better they are at this than any tooling. Three testers spent five hours each on a release I considered finished and found six stability issues, seventeen intents that matched at full confidence and returned nothing, and a function calling the system snapshot nineteen times per message. None of that was in my test suite. All of it was in their first evening.
Where AI assistance actually changes this
I build with an assistant, openly, and have done for over a year. The honest account of what that changed is narrower than either side of the current argument suggests.
It did not lower the quality of individual functions. Most of the twenty-four cases in my log are ordinary mistakes with ordinary causes, and several predate any assistant.
What it changed is where the standard has to be enforced. An assistant is extremely effective at producing a function that satisfies a description. It has no view of whether a path exists from a human hand to that function, because that path lives in another file, in another layer, usually in another conversation. Writing got faster. Verifying that anything reaches the result did not. Every entry above lives in the gap between those two speeds.
chr(0x2014), which no future text sweep can match, then verify with a negative control: inject an em dash into a real response and watch the test fail.
That is the thesis in one incident. The tool did exactly what I asked, quickly and correctly on its own terms, and disabled the only thing standing between me and the problem it was hired to solve.
Limits, stated out loud
This is one person and two projects. I have no data on whether it generalises to a team, and a team has review, which removes some of these entirely and creates others I have never met.
I also cannot cleanly separate "failures caused by AI assistance" from "failures I would have shipped anyway". Anyone claiming they can, in either direction, is selling something. What I can say is what the log shows, with dates, in public repositories.
What the app does about it
PC Workman is a Windows monitor with a local assistant, and it is built under the rules on this page rather than merely describing them. The suite went from 21 tests in June to 331 in August, and the growth that mattered was not the count. It was that every silent failure which shipped once now has a ratchet test that fails the build if the class returns: hardcoded version literals, dead imports, bare excepts, duplicate helpers, estimated sensor readings entering history, and em dashes in generated text.
None of that makes the software correct. It makes one specific category of wrongness unable to ship twice.
It does not prove anyone can reach it.
This catalogue is free, has no signup and no email wall, and it is a living document. If you have a class of silent failure that is not here, the fastest way to reach me is GitHub.
The narrative version of several of these entries, with more of the story around each, is in the bug that does not crash. If you want to see the rules applied to a real Windows application, PC Workman is open source and on the Microsoft Store.
Sources: PEP 649, Deferred Evaluation Of Annotations · PEP 8 · psutil API reference · Unity, Object.Destroy · Microsoft, AppUserModelIDs