Execution-outcome record: Plan 1 (the position_manager execution migration) is IMPLEMENTED. All 11 tasks ran via subagent-driven development with per-task opus reviews plus a final whole-branch opus review — verdict READY TO MERGE, no Critical/Important. On-disk ledger: /Users/levander/coding/pmv2/position_manager/.superpowers/sdd/progress.md.

For Agents

Done, committed on main in BOTH repos, NOT pushed, autotrade mode OFF (unchanged). Nothing armed or deployed. PM head cbd0f4c, fetch head afc785d. Gate green: PM 43+5, polymarket-clob 11, fetch 529 / 0-failed.

What landed

A new position_manager (PM) crate at /Users/levander/coding/pmv2/position_manager now owns:

  • The polymarket-clob signing client (moved in; use_server_time disabled → saves ~20–100 ms/order by dropping the serial GET /time before each POST).
  • place_order for both buy and sell (place_buy ≡ old submit_live, place_sell ≡ old auto_sell).
  • The position ledger code (mark_* / record_* / bump_breaker_count).
  • Onchain eth_call helpers — now with connect_timeout added on the move.
  • Caps/breaker readers (load_caps / load_breaker).
  • FillSink / FillEventSink watcher seam traits — declared but unimplemented (reserved for Plans 2/3).

polymarket_fetch was rewired to depend one-way on PM. submit_live / auto_sell / execute.rs deleted upstream; live buy+sell now route through PM::place_order.

Behavior-preserving — proven

  • 11 ledger SQL strings byte-identical.
  • place_buysubmit_live; place_sellauto_sell.
  • notify strings byte-identical.
  • Locked clob hash/parity tests intact.
  • Gate: PM 43+5, polymarket-clob 11, fetch 529 / 0-failed.

State

RepoHeadBranchPushed?
position_managercbd0f4cmainNO
polymarket_fetchafc785dmainNO

Autotrade mode OFF (unchanged). Nothing armed / deployed.

OPEN USER DECISIONS — resolve before relying on these

  1. Caps expose-only. load_caps / load_breaker exist, but the fetch read path is left unchanged to avoid drift — the DoD (“caps read via load_caps”) is met at API level only, not wired through upstream. Decide whether to accept that gap or do the upstream swap.
  2. Pre-arm notify check. Before arming live: live-test that PM’s notify Arc routes to the autotrade Telegram channel (the reviewer could not verify this statically — the live signer/notify wiring is built at startup only).
  3. Breaker-vs-no-signer check-order flip. A benign reorder: no-signer + breaker now → mark_canceled (old behavior: mark_failed). No POST happens either way; arguably more correct. Decide whether to accept.

Follow-ups

  • Make SigningClient Clone — removes the startup double-build of the live signer.
  • Add a host-injectable signer seam — enables a true end-to-end pm.place_order db-test (currently blocked because SigningClient host is hardcoded and a mock seam was forbidden as test-only prod code; full-path control flow was instead covered by char-by-char review in Task 7).