Uncategorized

  • Compose profiles, and the service that should have had one

    A profile applied to the heavy development services, and one that was missed because it is small. Memory was the criterion for adding a profile and the cost…

  • Running PHPUnit inside PHPUnit

    Testing an extension, which means executing a test run and asserting on what it produced. A subprocess rather than an in-process run, because the extension registers against a…

  • A PHPUnit extension, and the event that does not exist

    An extension that needs coverage data, which the event system does not carry. The event system is about test lifecycle rather than about the runner’s outputs, which is…

  • A layer rule that got simpler

    A module deleted, and a rule set that lost four entries and a special case. Three modules depending on a fourth becomes three modules depending on nothing extra,…

  • PSR-3 context, and the field that was finally queried

    A structured logging field added in 2023, never queried, and the one week it was the only thing that helped. A field with no queries against it for…

  • The value object library, five years on

    32 value objects in 2021, 41 now, and a retrospective on which of them earned their place. No symptom — a deliberate look.

  • MCP: a tool that refuses more than it accepts

    A protocol server for a database, and the constraints that make it safe rather than the capabilities that make it useful. A read-only credential is the floor rather…

  • Layout primitives, documented for the first time

    Four hundred lines of layout code that one person could read, described in a page. These had been written in 2021, worked perfectly and were opaque — the…

  • A value object with no invariant, deleted

    Eight single-property wrappers over a string, none of which validated anything. A value object with no invariant is a type alias that PHP does not have, and the…

  • DNS failover, and the resolver that ignored the TTL

    A sixty-second TTL, and traffic that took forty minutes to move. A sixty-second TTL produces four-minute failover for the great majority and a long tail that cannot be…