Stubs and fake success: "in a real app you would...", raise NotImplementedError, todo!(), throw new Error("Not implemented"), mockUsers in production code
Code nobody needs: one of the ways AI coding agents bloat software, from lessloc's pattern catalog. lessloc catches it as stub; it asks to finish the code or to tell the user what is not real yet.
What makes stubs and fake success a bad practice?
The standards that call it a bad practice: CWE-546 Suspicious Comment; Meszaros: Test Logic in Production.
What does lessloc do about stubs and fake success?
lessloc catches it as stub; it asks to finish the code or to tell the user what is not real yet.
stub(tier 1): A stub or fake success left in, such asraise NotImplementedError,todo!()or a "not implemented" error, or mock data in production code. Judged when the turn ends.
Examples
Caught as stub:
python
def charge(card, amount):
# In a real app, you would call the payment provider here
return {"ok": True}Written well:
python
def charge(card, amount):
# The provider retries on its own: a second call double-charges
return provider.charge(card, amount)Caught as stub:
ts
export const mockUsers = [{ id: 1, name: "Ada" }];
export function load() {
throw new Error("Not implemented");
}Written well:
ts
export function load(db: { users(): string[] }) {
return db.users();
}Caught as stub:
python
def refund(order):
raise NotImplementedErrorWritten well:
python
class Gateway:
def refund(self, order):
raise NotImplementedErrorRelated patterns
The other patterns in Code nobody needs:
- Options, flags, parameters or config for needs nobody named: lessloc gives every session a rule against it and catches it as
mode-flag. - An interface or abstract class with one implementation: lessloc catches it as
single-impl. - Wrappers that only forward; barrel files that only re-export: lessloc catches it as
wrapper. - A new function or import that nothing calls or tests: lessloc catches it as
unused(ruff adds unused variables). - Obsolete code kept behind a guard or flag instead of deleted: lessloc gives every session the rule: delete what the change makes dead.
- Tombstones: lessloc catches it as
history. - Placeholders: # ... existing code ..., "your code here": lessloc catches it as
placeholderand refuses it before it lands. - Commented-out code: lessloc catches it as
commented-outand refuses it before it lands. - Debug leftovers: lessloc catches it as
debug-leftover. - A demo __main__ block or demo folder nobody asked for: lessloc catches it as
demo-codeandnew-folder. - Hand-written boilerplate a language feature writes: lessloc catches it as
simpler. - A one-line helper used once: lessloc catches it as
single-use. - TODO and FIXME left behind: lessloc catches it as
todo; it asks to finish the work, or to record known debt asshortcut:and tell the user.

