Guidance no longer teaches the forbidden Rx-to-Task bridge
MeshWeaver is IObservable<T> end to end, and the Rx observable-to-Task bridge is forbidden
everywhere — tests included, as of the 30 August ruling that retracted the older "tests are the one
sanctioned place" carve-out. Rx completes its TaskCompletionSource without
RunContinuationsAsynchronously, so it resumes the awaiter inline on the thread that signalled,
which in the mesh is a hub's action block or a grain's turn scheduler.
The rule was being enforced in source while the guidance still prescribed the shape. That is the
worse half: a page that presents the bridge as the right thing to write generates new violations
faster than any sweep removes them, and no code scanner ever sees a markdown file. Two categories
mattered most. .github/copilot-instructions.md drives the automatic review on every pull request
here, and it listed the bridge as "the accepted bridge" in test projects — so review was actively
defending the banned shape. And the .csx script examples in the script-execution and
activity-control-plane pages are pasted into mesh nodes, which compile at runtime in the portal,
where no build and no test can catch them.
Every prescriptive occurrence is converted. Where the signature is ours the example now returns
IObservable<T> and subscribes; where a foreign signature genuinely hands back a Task it uses
ReactiveCompletion.ObserveCompletion, which completes asynchronously and keeps its error arm
attached for a fault arriving after the wait settled; and tests assert through the reactive
assertion surface, which owns the wait. The pages that warn against the shape — the war stories,
the anti-pattern blocks, the "delete on sight" checklists — are untouched on purpose: a rule stated
without the shape it forbids is unrecognisable in review.
A new ratchet keeps it that way. It counts the shape only inside a fenced C# code block, so prose warning against it stays free, and its seeded inventory can only shrink.