modules: re-point ethflow-watcher onto the pool observe path#470
Conversation
The videre client face gains observe: put an externally-obtained
receipt (an on-chain placement the pool never submitted) under the
registry's status watch. The registry resolves the venue and admits the
watch without touching the adapter; refusal at the watch cap is a typed
unavailable. HostVenues and the typed VenueClient carry the new verb;
the transport trait defaults it to unsupported so existing transports
opt in.
ethflow-watcher flips onto that seam: the module is now a
the legacy cow-api extension. on_chain_logs computes each placement's
orderbook UID and observes it at the cow venue; the registry polls the
adapter and fans intent-status transitions back, and the module
journals observed:{uid} on the first one. Observe-only is preserved: no
call path reaches quote, submit, status, or cancel.
The shepherd-backtest rlib replay drives the same strategy pair over a
recording pool transport and delivers the open transition the registry
would poll, keeping the Observed classification exact-UID strict. The
ethflow boot e2e moves from the cow-api extension suite to the venue
platform suite.
lgahdl
left a comment
There was a problem hiding this comment.
Clean migration, well cross-checked. The new observe path resolves the venue before touching the watch set (rejecting unknown/dead venues, unit-tested both ways), so it can't waste watch-set capacity on a bogus venue string — receipt content itself stays opaque, same as it always was for submit-sourced receipts, so this isn't a new trust boundary so much as the same pre-existing opacity reached via a second call path. The WIT/trait change is purely additive (observe added, no existing signature touched; VenueTransport::observe has a default Unsupported body so no existing implementor breaks), observe-only is enforced and tested (strategy_never_submits), the shepherd-backtest touch is a necessary, correctly-scoped consequence of on_chain_logs's signature change rather than scope creep, and the re-homed boot-order invariant test on stop-loss mirrors the original line-for-line.
One soft note, not a defect in this diff: after this PR, stop-loss is the only module left on the legacy cow-api cone, and nothing here tracks that final retirement step — worth linking a follow-up issue now so shepherd-cow-host and its test surface don't stay indefinitely maintained for one module with no visible trigger to finish the job. Approving.
What
Re-point ethflow-watcher off
shepherd:cow/cow-apionto the viderevidere:venue/clientpool observe path (observe-only, no submit). Teach videre-host to watch externally-obtained receipts.Why
Ethflow observation should ride the generic seam like twap's submit path, removing another legacy cow-api consumer ahead of the cone retirement.
Testing
Full gate green (fmt, check, clippy -D warnings, nextest 826, doctests). The cow-boot invariant test re-homed onto stop-loss (the remaining cow-api module) since both twap and ethflow are now off cow-api.
AI Assistance
Implemented and red-teamed with Claude; the stack-rebase conflict (both re-points obsoleted the cow-boot tests) was hand-resolved.
Closes #328.