What the Polymarket integration does
Veridex integrates with the Polymarket Conditional Token CLOB for two purposes: fetching live quotes (read path) and submitting orders (write path). The read path is available in all non-paper modes; the write path is available only underlive_guarded mode with all operator arming steps completed.
Market resolution uses the public Gamma API. Order book access and order submission use a vendored, pinned, MIT-licensed Polymarket CLOB client — the exact reviewed bytes ship with the repository rather than floating on a pip dependency.
Read path vs write path
Read path — Veridex fetches the order book for the side’s token, parses levels tolerantly (malformed or zero-size levels are dropped), walks the ask ladder to a size-weighted average native fill price for the requested stake size, and converts the result to decimal odds exactly once at the venue boundary. An empty, one-sided, or unfillable book degrades honestly:price=0.0 (the no-price sentinel the edge law treats as no-edge), size=0.0, native_price=None. The read path never fabricates a midpoint or an estimated price.
Write path — Order submission requires POLYMARKET_WRITE_ENABLED, dry_run=False, and an injected write client — the _require_armed triple gate inside the adapter. Even after the route arm gate approves a live order, the adapter applies its own independent lock. Two independent locks must both open before any real order reaches the wire.
The event→market resolver
The resolver turns a structured market reference —"1X2|home|full", "1X2|away|full", "1X2|draw|full", "OU|<line>|full" — into concrete on-chain identifiers. It navigates the live-verified Polymarket market structure: a World Cup fixture slug names an event containing many markets, and 1X2 is three separate binary Yes/No markets (“Will Portugal win…”, “…end in a draw?”, “Will Croatia win…”).
The resolver fails closed rather than guessing a token:
1X2|homeand1X2|awaymatch the “Will <TEAM> win…” market by normalized team name (accent-stripped, punctuation-collapsed, alias-mapped), never positionally. Missing team identity fails closed.1X2|drawselects the “…end in a draw?” market and flags itdraw_market=True. Aside="draw"maps to that market’s YES token — DRAW = YES on the draw-binary market. Routingside="draw"to any other market raisesMarketUnavailablerather than routing to a wrong YES.- An away bet (
1X2|away) maps to the away-wins token (YES on the “Will <away team> win…?” market) — not the away-loses token. This distinction matters: the resolver caught a latent side↔token bug during adversarial review, before it could ever touch money. OU|<line>matches the numeric line on full-match markets only — half/period totals and single-team totals are excluded by pattern.- Zero matches, more than one match, an unknown reference type, an unsupported period, or any malformed field raises
MarketUnavailable. The resolver never guesses.
Price-unit discipline
Veridex works in decimal odds throughout its trust core. The Polymarket native Conditional Token price (a share price in(0,1)) is used as an audit field only.
The quote contract enforces this structurally: Quote.price is decimal odds — the executable cost-to-fill for the requested size — and Quote.native_price is the venue-native value it was derived from, audit-only. There is no ambiguous .price field whose unit depends on the venue. On the write side, the inversion happens exactly once at submit time: round_to_tick(1/order.price).
A native price leaking into .price would silently corrupt every downstream edge, slippage, and policy number. The structural split makes that class of bug unrepresentable rather than merely unlikely.
The real_venue_quote field
The real_venue_quote flag on a policy result is earned, not inferred. It is set from a single explicit class marker, PROVIDES_REAL_VENUE_QUOTE = True, that only a genuine real-venue adapter declares. It is never inferred from the presence of a number: the offline FakeVenueAdapter returns a perfectly plausible fixed price, and its quotes still read real_venue_quote: false.
An edge number renders in the Veridex UI only when a genuine venue quote backs it — the gate checks real_venue_quote === true AND a non-null venue_decimal_price AND a non-null executable_edge_bps. Any missing piece means no edge is shown.
Run-002 venue result
In the Run-002 real-data experiment, the rung-2 venue lane worked: it priced 94.7% of theCumulativeDriftAgent’s in-scope 1X2 decisions against time-aligned Polymarket mids under a bounded-staleness bound (15-minute maximum quote age), with a self-verified pinned coverage hash and venue_source_id.
The estimated edge result was a near-perfect monotonic longshot ramp: +607 bps on 0–20% probability outcomes, decaying monotonically to +33 bps on 80–100% probability outcomes. This is the fingerprint of a favorite-longshot / de-margin-scale divergence — not strategy-specific dislocation. Across the mid-probability haircut bands, the estimated edge went negative (−60 to −117 bps), so the headline number was longshot-driven only.
Run-002 did not demonstrate executable venue edge. These are estimated mids, not fills. real_executable_edge_bps = None. No profit and no fillability claim.
Execution receipts are structurally non-scoring. A fill can never become proof evidence. Running the execution lane produces score stacks and evidence blocks byte-identical to not running it — fills have zero causal impact on CLV, checks, or leaderboard rank.