Goal: make the relationship between the markets inside one event a first-class, declared field — so Verex knows when outcome probabilities must sum to 100%, when they may not, and never renders one as the other.
Companion to negative-risk-markets.md. Neg-risk covers one group type (mutually exclusive). This doc covers the taxonomy around it — and the types where “sum = 100%” is simply the wrong question.
Kalshi, “Will the Clarity Act become law?” — three markets under one event:

| Market | YES |
|---|---|
| Before Jul 1, 2027 | 41¢ |
| Before Oct 1, 2027 | 46¢ |
| Before Jan 1, 2028 | 50¢ |
| Sum | 137% |
This is not mispricing and not a display bug. The three markets are nested: “before Jul 2027” ⊂ “before Oct 2027” ⊂ “before Jan 2028”. They can all be YES at once (one early passage resolves all three), so there is nothing forcing them to sum to anything. The invariant that does apply here is monotonicity — 41 ≤ 46 ≤ 50 — and it holds.
The mistake to design against: assuming “outcomes under one event” ⇒ “probabilities partition 100%”. That only holds for one of the group types below.
| Group type | Example | Invariant | Σ YES | Neg-risk? |
|---|---|---|---|---|
| Binary — a single market | “Will X happen?” | YES + NO = 1 | 100% by construction (CTF split/merge) | n/a |
| Exclusive + exhaustive (categorical) | World Cup winner — 48 teams + “Other” | exactly one YES resolves | = 100% (arbitrage-enforced) | ✅ yes |
| Exclusive, non-exhaustive | a candidate shortlist with no “Other” | at most one YES resolves | ≤ 100% | partial |
| Directional / nested (Kalshi’s term) | the screenshot; TSA “1M+ / 2M+ / 3M+ check-ins” | monotone: A ⊂ B ⇒ P(A) ≤ P(B) | unbounded (137% above) | ❌ no |
| Independent / multi-winner | “Which phrases will the Fed chair say?” | none | = expected number of winners | ❌ no |
Only row 2 makes “normalize to 100%” a meaningful operation. Applying it to the screenshot would print 41/137 = 30% for a market the book says is 41% — a fabricated number.
netting_enabled) exploits the group structure to cut margin:
The displayed % is a last-trade or mid price on one side of a spread, not a normalized probability. For an exclusive + exhaustive group only a band is enforceable:
Σ best_bid_i ≤ 1 ≤ Σ best_ask_i
Cross either bound and there is a riskless trade (below). The true probability vector lives inside that band; picking a single point inside it is a modeling choice, not a fact. Rules Verex should adopt:
Σ ask − 1 is the group’s over-round, a liquidity
quality signal worth surfacing to the MM agent, not to the casual trader.The neg-risk stack (negative-risk-markets.md) makes it an
arbitrage fact, not a convention. Converting NO shares over a set S of k outcomes
yields 1 YES for every outcome not in S, plus (k−1) USDC. Both directions close:
k = N) → receive $(N−1) cash immediately for less than $(N−1). Same trade, mirrored.Directional groups have no such conversion — nested outcomes aren’t a partition, so there is no complete set to mint or redeem. Their invariant (monotonicity) can only be enforced off-chain, in the MM agent and in validation.
group_type ∈ { binary | exclusive | exclusive_open | directional | independent },
plus ordered member markets (order is meaningful for directional).exclusive → route to the Neg Risk Adapter + Neg Risk CTF Exchange; Σ = 1 is enforced
by arbitrage. exclusive_open (no “Other” bucket) → Σ ≤ 1, so no neg-risk conversion.directional → independent binary CTF conditions + an off-chain monotonicity
invariant. The MM agent must never quote a crossing pair (a later threshold priced under
an earlier one), and the indexer should flag violations rather than silently serve them.independent → no invariant at all; the UI must not draw a share-of-100% bar.group_type, the member list, and a sum_yes diagnostic
(bid-sum, ask-sum, over-round) per group.exclusive_open is even offerable.exclusive event? It’s what makes the group
exhaustive — ties directly into augmented neg risk’s Named / Placeholder / Other model.group_type on events — enum + ordered members, declared at creation, surfaced by the APIexclusive, always labeled, raw price still reachablenetting_enabled):
https://help.kalshi.com/en/articles/13823816-collateral-returndocs/images/kalshi/kalshi-100percent.png