77f9260189
TransientError and SourceDeadError read like caller-facing contracts in the taxonomy table, but the retry loop catches both and repackages them as AllSourcesExhausted, so they never arrive. That is only discoverable by reading middleware/retry.py, and a downstream project wrote a whole design section on the false premise before checking. The new table states the split outright, including that GovernanceBackendError now sits on the caller-facing side and SourceNotConfiguredError deliberately does not join the retryable family.