Four decorators around an HTTP client, composed in an order that is obvious once and unrecoverable afterwards. Signing inside retry is mandatory — a retried request needs a…
A job constructed with a model, serialised, and executed against a row that had changed in the intervening four minutes. Framework model serialisation re-fetches by identifier, which is…
A readonly value object that wanted a lazily computed cache, which is exactly what readonly forbids and is usually a signal. The wrapper is the textbook answer and…
Eleven exception classes, all extending one application root, and no intermediate types — which turned out to be right. An intermediate class exists so a caller can catch…
A new PSR-4 root added to composer.json, and an authoritative classmap that had to be regenerated and was not. An authoritative classmap turns a missing entry into a…
A codebase-wide sweep for json_encode and json_decode without the throw flag, eleven years after the flag arrived. Twenty-two silent failures is the finding, and one of them had…
8.4 allows chaining on a new expression without wrapping it, which is a small improvement that invites a bigger mistake. The parentheses were noise on a one-call chain…