padosoft-failure-visibilitylisted
Install: claude install-skill padosoft/skills
# Failure visibility
Two symptoms, one bug: **the caller cannot tell success from failure.**
1. A call that failed, whose return value nobody looked at.
2. A failure served with a success status, or an empty body, or a `null`.
Both leave a system that looks healthy while it loses work.
---
## 1. Never ignore the return value of a side-effecting call
Many APIs report failure by **returning a value**, not by throwing — especially file and storage APIs, and
HTTP clients configured not to throw.
```php
$ok = Storage::disk($disk)->put($target, $content);
if ($ok === false) {
throw new RuntimeException("Unable to persist {$target} on disk {$disk}.");
}
```
The shape to recognise: a controller calls `Storage::put(...)` without checking the return, the disk is
configured with `throw => false`, a full disk returns `false`, **the controller answers `202 Accepted`**, and
the job that comes later dies with "file not found". From the client's side, ingestion silently drops
documents — and the only signal anyone gets arrives hours later, somewhere else.
Applies to storage put/delete/copy/move/makeDirectory, `file_put_contents`, `copy`, `rename`, `unlink`,
`mkdir`, and any library call that returns `false` on failure.
**Never log and continue.** A log line is not a return path: the caller still believes it worked.
### Two related bans
- **The `@` silencer** — `@mkdir(...)` hides the error and the return value in one character.
- **World-writable permissions** — `0777` on a d