An interface extracted for a second implementation that arrived

An interface added in 2023 against the rule that says not to, and a second implementation in 2025 that vindicated it by accident.

interface StorageAdapter
{
    public function put(string $path, StreamInterface $contents): void;
    public function get(string $path): StreamInterface;
    public function delete(string $path): void;
}

// 2023: one implementation. flagged in review as
// speculative and kept anyway, because the argument
// was "a second storage provider is a business
// requirement we have been told about".

// 2025: the second provider, for the offsite backup.

The rule about interfaces with one implementation is a good rule and this was a legitimate exception, which is only visible in hindsight — the same argument was made for four other interfaces in 2023 and none of them acquired a second implementation. Being told about a requirement is weaker evidence than it feels like, and one in five is roughly the hit rate.