Maker.
Don't pay spread. Collect it.
Thesis-informed two-sided limit orders on Kalshi and Polymarket. Same causal tree your taker uses, executed inside the spread instead of across it. Adverse-selection detection, regime-aware spread widening, inventory caps, fill-attribution. CLI engine, REST/API control, MCP adapter, BYOK on the venues. The bench at the front of the bourse, not the runner crossing to the other side.

Banchiere · Quattrocento Firenze — florins on one tray, ducats on the other, brass balance dead-center. The original two-sided quote.
What the maker tracks
Seven fields per quote. Re-evaluated on every tick.
A maker is a small bench at the front of the bourse: balance scale on the table, ledger open, two-sided quote up. The runtime computes the seven fields below for every market it quotes; the kill chain pulls quotes the moment any of them flips.
quoteSurfacebid + ask both at top-of-book; symmetric by default, skewed by thesis edge.
skewBiasEdge-driven size asymmetry — score near max, inventory leans toward conviction side.
adverseSelectionBook-imbalance + flow-toxicity + news-trigger detector; pulls quotes on any of the three.
regimeWidenSpread auto-widens on dispersing regime, vol-of-mid spike, or pre-event window.
inventoryCapPer-market, per-thesis, per-venue caps; most restrictive wins; favored-side size drops on breach.
fillAttributionP&L decomposed into spread capture, skew P&L, rebate / reward income.
kallShortcutHeartbeat news kill triggers any maker quote that conflicts with thesis falsification.
Why a thesis-skewed maker beats vanilla MM
Manual quote on venue UI
You see every market with full context
Cannot react below human reaction time; no skew automation; no kill chain
Standard MM bot
Familiar, tight on equities/perps
Wrong objective for event contracts; no thesis tree, no rebate optimization
Polymarket reward bot only
Optimizes the quadratic reward pool
Single venue; no cross-venue match; no edge-aware skew; no kill chain
SimpleFunctions Maker
Thesis-skewed quotes + adverse selection + caps
Surfaces only when post-slippage spread + reward clears your floor
Who runs the maker
Six recurring shapes. The shape that repeats is two-sided depth where the kill chain catches the moment your quote turns into adverse selection.
Sports MM ops
Run sfmm on Polymarket sports — quadratic-score-optimal, edge-skewed, circuit-handled.
Cross-venue MMs
Quote both sides on a Kalshi event AND its Polymarket pair; cross-venue inventory net.
Thesis-driven liquidity
Quote inside the spread on contracts your thesis favors; accumulate on the favored side.
Quiet-market scalpers
Patient quoting in low-volatility regimes; spread + occasional toxic-flow alert handles the rest.
Event-window providers
Pre-event widen, fade pause, requote post-event at new mid; capture the regime transition.
Fund desks with rebates
Polymarket sports rebates + Kalshi liquidity rewards rolled into one P&L attribution.
Maker endpoints
Same intent surface as taker. Different "kind" — bid + ask + size + kill chain. CLI engine handles tick-cadence; REST/API exposes remote control; MCP adapter is available for compatible agents.
Quote a market
POST /api/intents { kind:"quote", ticker, bid, ask, size, thesis }openLive regime + book
GET /api/public/markets?keyword=...&include=regime,bookopenThesis edge feed
GET /api/public/edges?thesis={id}openCLI quote engine
sf quote create TICKER --thesis-id ID --skew-from-edgeopenMCP adapter — sf.quote
mcp call simplefunctions.quote { ticker, thesis, side: "both" }openA maker tick, end-to-end
Five steps. Plain-English thesis to two-sided quote with a kill chain standing guard.
$ sf quote create KXFEDDEC-25DEC31 \
--thesis-id fed-dovish-q4 \
--skew-from-edge --size 100
✓ Thesis edge: +6¢ on YES (strong)
✓ Quote: bid 38¢ × 130 / ask 40¢ × 70
symmetric size would be 100 / 100
thesis lean → +30 on bid, -30 on ask
Score: 0.43/min · regime: trending[11:14:32] book ratio 1.78x bid-side · ok
[11:14:47] book ratio 0.62x bid-side · WATCH
[11:14:48] flow toxicity 0.41 · WATCH
[11:14:49] ⚠ adverse-selection trigger
[11:14:49] pulled bid 38¢ × 130
[11:14:59] cooldown · recompute fair
[11:15:00] ✓ requote bid 37¢ × 80 / ask 40¢ × 100
spread widened, size cappedHeartbeat #851
regime: trending → dispersing
cross-venue divergence 6.4¢ (was 1.2¢)
vol-of-mid +2.3σ above 24h baseline
✓ widening spread on KXFEDDEC + 4 others
bid 37¢ → 36¢
ask 40¢ → 41¢
size unchanged · skew preserved$ sf fills --thesis fed-dovish-q4 --attribute
KXFEDDEC-25DEC31 (5h quoting window)
spread captured: +$340 · 100% fills both sides
skew P&L: +$180 · YES inventory + 60
rebate / reward: +$45 · venue rebate tier
adverse selection: -$50 · 1 toxic-flow hit
──────────────────────────────────
net: +$515 · annualized 18%Live edges to skew against
Updated every 15 minutes · data from Kalshi and Polymarket
Maker or taker — when
Maker · here
When liquidity is thin and the move is patient.
Quote inside the spread, earn the spread, manage adverse selection with thesis-aware quoting and inventory caps. Best when the orderbook is shallow and time is on your side.
Taker →
When the edge is large and depth is real.
Cross the spread for immediacy. Best for news-driven moves where the orderbook has not yet caught up. Most desks run both.
FAQ
What is a maker strategy on prediction markets?
A maker posts limit orders inside the spread on both sides of a market and earns the spread when both sides fill, plus any liquidity rebates the venue pays (Polymarket sports rewards, for instance). The maker is the counterparty to takers — you provide immediacy, they pay spread for it. Risk is adverse selection: the price runs against your quote before the other side fills.
How is "thesis-informed" different from a standard MM bot?
A standard MM bot sets symmetric quotes around mid. A thesis-informed maker takes the same causal tree your taker workflow uses and skews quotes toward the side your thesis favors. If your thesis says +5¢ on the YES side, you size more on the bid (where you accumulate YES) than on the ask. Score stays near max, inventory leans the right way.
How does adverse-selection detection work?
Three signals: (1) book imbalance flipping against your quote (depth ratio drops below 0.6x your side), (2) trade-flow toxicity proxy (VPIN-style) crossing a threshold, (3) news triggers from the heartbeat. Any of the three pulls quotes for a configurable cool-off; the engine recomputes fair from the new mid before requoting.
How are inventory caps managed?
Per-market: max contracts on either side; the engine drops the favored-side size when you breach. Per-thesis: aggregated YES/NO exposure across all matched contracts; flat trades are allowed but accumulating is gated. Per-venue: USDC / margin caps on Polymarket and Kalshi separately. All three stack; the most restrictive wins.
When does the runtime widen the spread?
Three triggers: heartbeat-emitted regime label flipping to "dispersing" (cross-venue divergence > 5¢), volatility-of-mid jumping > 2σ, or upcoming high-impact event (FOMC, CPI, lineup announcement) within the configured pre-event window. Default widen is +1¢ each side; configurable per market.
Polymarket sports liquidity rewards — does this engine collect them?
Yes — sfmm (the sports-specific bot) is purpose-built for the Polymarket quadratic scoring function. QuoteEngine v2 in @spfunctions/cli is the general-purpose engine; both share the same intent surface. See /sports for the sports-specific economics.
Maker vs taker — when do I run which?
Taker when the edge is large, depth is real, and the news is fresh — pay spread for immediacy. Maker when liquidity is thin, the move is patient, and you can afford to wait for the other side to fill. Most desks run both side by side, with the taker workflow consuming the same thesis tree the maker uses.
BYOK execution — what does that actually mean?
You hold the venue credentials. The runtime stores nothing custodial; orders are signed with your Kalshi RSA private key or your Polymarket Ethereum key, executed directly against the venues. Custody and KYC stay at the venue level.
How fast does the engine requote?
QuoteEngine v2 is event-driven over WebSocket: sub-100ms requoting on a venue tick, sub-second on a heartbeat thesis update. Pre-event widening fires immediately; circuit breakers cool 10s by default before requoting at the new mid.
How is this audited / logged?
Every quote is logged: timestamp, mid, your bid/ask + size, regime label, trade-flow score, fill or cancel reason. Persisted in /api/intents and /api/fills. Per-thesis attribution rolls up: how much of P&L came from spread capture vs from skew vs from rewards. Same audit trail as the taker workflow.
Related surfaces
Taker strategy
Cross the spread when the edge is large and depth is real.
Sports market making
Polymarket sports liquidity rewards — quadratic-score-optimal MM.
Quant trading
Microstructure features, regime detection, depth-adjusted edge.
Edge discovery
How thesis-vs-market edges are surfaced and ranked.
For funds
Cross-venue tools, audit trail, BYOK execution for fund desks.
Portfolio Autopilot
Wrap maker + taker into a portfolio agent that allocates capital.
Prediction market API
CLI, REST/Data API, real-time WebSocket streams, MCP adapter.