Degraded
Realised, but not exactly as declared.
The caller decides whether that is acceptable, and plan() surfaces it before any long-running work starts.
The resolution keeps its own copy of the causes, so changing the list passed in afterwards does not reach it.
Throws
when causes is empty.