What problem does it solve? Writing HTTP code in PHP libraries often couples the code to a specific framework or client, making it hard to reuse and swap implementations. This Skill guides you to build HTTP messages, middleware pipelines, factories, and clients purely against the PSR interfaces, so any compliant implementation can be injected. ## Core Features & Use Cases - PSR-7 Messages: Build and read immutable requests, responses, streams, and URIs with correct with*() reassignment patterns. - PSR-15 Middleware Pipelines: Compose request handlers and middleware with a complete runnable dispatcher template, including error-handler-first ordering and short-circuit auth. - PSR-17 Factories & PSR-18 Clients: Create PSR-7 objects without naming concrete classes and send outbound requests with the correct exception hierarchy (4xx/5xx are responses, not exceptions). - Implementation Selection: Compare nyholm/psr7, guzzlehttp/psr7, and laminas-diactoros, and bridge Symfony HttpFoundation via symfony/psr-http-message-bridge. - Use Case: You are writing a reusable PHP package that calls an external API. Inject a RequestFactoryInterface and ClientInterface so consumers can wire Guzzle, Symfony HttpClient, or any PSR-18 client without changing your code. ## Quick Start Ask the agent to build a PSR-15 middleware pipeline with an error handler and auth middleware using nyholm/psr7 as the implementation.