Home/AI Orchestration · Model Risk/Part I

Episode 06 · SOLUTION · Control plane

Replace swagger with stakeable ranges

One uncertainty stack that can actually gate capital

Frequency honesty first: stakeable ranges feed the gate with the crowd object.

Frequency honesty first: stakeable ranges feed the gate with the crowd object.
flowchart TB
 subgraph HONEST["Frequency honesty first"]
 BUCKET["Bucket swagger vs hit rate"]
 SLICE["Decision-slice plot for CEH-001"]
 FREEZE["Freeze thresholds until meaning holds"]
 end
 subgraph RANGE["Stakeable ranges"]
 COV["Coverage target e.g. 90 percent"]
 RS["Spread range around 1.50"]
 RC["Curve range around 2.10"]
 LIVE["Live coverage breaker"]
 end
 subgraph POLICY["Gate consumes ranges + crowd"]
 OV{"Ranges overlap?"}
 IN{"Mark inside a range?"}
 ALLOW["Allow only in overlap"]
 ESC["Escalate on broken coverage"]
 DENY["Deny 1.80 midpoint theater"]
 end
 BUCKET --> SLICE --> FREEZE --> COV
 COV --> RS & RC --> LIVE
 LIVE --> OV
 OV -->|no| ESC
 OV -->|yes| IN
 IN -->|no| DENY
 IN -->|yes| ALLOW
 classDef input fill:#CCFBF1,stroke:#0F766E,color:#134E4A,stroke-width:2px
 classDef decision fill:#FEF3C7,stroke:#B45309,color:#78350F,stroke-width:2px
 classDef risk fill:#FEE2E2,stroke:#B91C1C,color:#7F1D1D,stroke-width:2px
 classDef gate fill:#DCFCE7,stroke:#15803D,color:#14532D,stroke-width:2px
 classDef process fill:#E0E7FF,stroke:#4338CA,color:#312E81,stroke-width:2px
 classDef artifact fill:#F5F5F4,stroke:#57534E,color:#1C1917,stroke-width:2px
 class BUCKET,SLICE input
 class FREEZE,COV,LIVE process
 class RS,RC artifact
 class OV,IN decision
 class ALLOW gate
 class ESC,DENY risk

The problem we left open

In the last post I used confidence theater to name a failure mode that keeps showing up after people think uncertainty is handled.

A score between zero and one looks like a probability. Teams write thresholds around it. Agents route to the loudest number. Two models can both sound sure while marking near 1.50 and 2.10, then someone invents 1.80 as reconciliation. Ranking can still be useful. Staking requires a frequency story the score never owed you.

That creates real headaches in production:

So the question for this post is simple. If a 0..1 score is not automatically a stakeable probability, what do you put in the gate instead?

The solution, as one stack

The core idea is older than today's agent demos, and it still holds: separate ranking from staking. Keep swagger for sorting if you want. For capital, require a range or set with an explicit coverage target on a named population, watch whether that coverage holds when the world moves, and combine it with crowd width so two sharp liars cannot launder a midpoint.

I turn that into five moves. Together they are one solution, not five optional add-ons.

1. Measure frequency honesty before you write thresholds

Before any allow rule mentions 0.9, build a simple honesty check on a held-out slice that resembles the desk's decisions. Bucket predicted confidence and compare to how often the claim came true. If 0.9 buckets land near 0.6, you do not have a threshold problem. You have a meaning problem. Fix meaning first, or every threshold is superstition.

Do this on the decision slice, not only on a generic dataset. Never-traded structures deserve their own honesty plot. A globally pretty curve can hide a rotten local curve. If the GPU budget only allows one honesty plot, pick the slice that spends.

2. Prefer ranges with a coverage promise over lone floats

A stakeable object for a mark looks like: a low, a high, and a target like about ninety percent of similar cases should land inside. The desk may still see a point for conversation. The gate consumes the range. If building a range needs a held-out calibration stream and a rule that widens when data is thin, that is a feature. Thin data should not sound precise.

In plain terms: the system must sometimes say I only know a band. Methods that wrap black-box models with finite-sample coverage promises exist for exactly this job. You do not need to recite their names in a design review. You need the property: when the recipe is followed, the long-run hit rate matches the sticker on the band.

3. Monitor coverage under shift like you monitor uptime

A coverage promise is a living claim. Track hits and misses on live marks. When realized coverage falls below target for the tagged population, trip a breaker: widen bands, force escalate, or disable auto-mark for that structure family. Offline hard-slice packs probe once. This breaker watches online.

Without it, teams recalibrate once, ship, and slowly drift into theater again. With it, the gate gets a time-varying honesty signal, not a one-time certificate. Treat the breaker with the same seriousness you give to an auth outage. Honesty downtime is also downtime.

4. Combine ranges with crowd width, do not replace one with the other

Crowd width asks how much near-winners disagree. A coverage range asks how wide a band must be to keep a promise for one recipe. You need both. A single model can emit a tight band and still sit inside a wide near-winner cloud. A crowd can look narrow while each member's swagger is miscalibrated. The gate should see the union of worries: cloud too wide, or coverage broken, or frames disjoint.

This is where midpoint culture tries to sneak back in. People see two ranges and average their midpoints. That is still invented peace if the ranges do not overlap. The stack only works if overlap is a first-class predicate, not a suggestion in a design doc.

5. Encode the midpoint ban and the overlap rule

Policy language that satisfies a desk:

IF coverage monitor is broken for this structure family escalate

IF spread range and curve range do not overlap escalate

IF proposed mark sits in no range deny

IF overlap exists and cloud width within tolerance allow only inside overlap

NEVER treat max(confidence) as a spend license

That last line is the cultural fix expressed as code. Swagger can remain a diagnostic. It must not be a blotter key.

A concrete walkthrough

Same never-traded structure. Same frames. Now run the stack end to end.

Honesty check: 0.94 bucket on similar marks historically hits ~0.61

thresholds frozen until meaning is fixed

Recalibrate / wrap: emit ranges at 90% target

spread [1.41, 1.63]

curve [1.98, 2.20]

Live coverage last 30 days: on target for vanilla names,

below target for this family to breaker trips

Crowd width: still wide; intervals disjoint

Gate: escalate; deny 1.80; no auto-allow region

The satisfying ending is not a magical point. It is a named deny or escalate with artifacts: honesty plot, ranges, coverage breaker state, crowd width. Anyone can replay why autonomy refused. That replay is the difference between a researched solution and a dashboard that only looked careful.

The flow in one breath

Decision-slice honesty check, then ranges with a coverage target, then a live coverage breaker, then combine with crowd width and frame gap, then allow only on overlap and deny invented midpoints. That is how I want uncertainty to show up in financial AI: as a governable object, not as a confidence sticker.

Curious how others trip breakers when live coverage drifts, without waiting for a blow-up to teach the lesson.

Next. Open Ep07: When the mind that proposes is also the hand that spends. Previous: Ep05 (A number between zero and one can still be theater). Part I index.