feat: producer-open-op — establisher + pump handler + registration
- tunnel_establisher: registry lookup -> injected DialFn (ADR-004) ->
Establishment::new(plan) (R-01 plan flow); typed reason table
(unknown_resource/dial_failed/resource_shortage/handler_error)
- make_tunnel_pump_handler: accept_bi + plan downcast + pump_bidi
awaited inline (R-02; no spawn-and-forget, no substrate types)
- register_tunnel_openable: spec + establisher + pump + dial + CF-006
identity witness seam
- TargetHandle +Sync halves (F-1 bound); Substrate + Hash for registry
keys; tunnel_establisher_with_witness for the per-call identity probe
- tests: duplex harness (reverse-POC topology) + 11 integration tests —
round-trip, typed errors, FORBIDDEN fail-closed, CF-005 precedence +
CF-006 witness, plan-flow concurrency (no race), W2 late
registration, INVALID_INPUT schema rejection, both-sides sanity
Verified: cargo test (14 unit + 11 integration), clippy -D warnings
(native + wasm32), fmt --check, wasm32 check — all clean