Commit, defer or abstain. Never a probability.
Hikae is the gate. An upstream predictor gives a reading. The gate conforms it into a region at a target coverage, then a closed policy reads the region and the budget the caller carries and returns one word. It reports a region you can audit and a budget you can watch, never how likely it is to be right.
The answers
The gate has three answers, a closed list in the frozen contract GateDecision. Each one is an answer, including the last.
One decision, end to end
A decision passes through four stages. Each stage can end it, and when it does, it keeps what it refused with a reason code from a closed list. The commits run on to the act, and they are kept too: both threads can be replayed from the recorded bytes.
Before the policy runs, the adapter that reads the input can already answer: a testimony that is missing when the class requires one, refused by its verifier, or not bound to the prediction ends the decision there, with its code.
How a region is built
The region is conformal. Take the predictor’s track record on calibration points it did not see, score how wrong it was on each, and keep the score at a rank fixed by the target coverage. For a new reading, every answer whose score is at most that margin is in the region.
The region is a set of labels for a classification (a direction, a venue, a yes or a no) or an interval for a regression (a liquidable amount, a curve residual). One label kept is small enough to act on; every label kept means nothing is ruled out yet. An interval acts when its width is under the caller’s threshold and the intended value lies inside it. The prediction the gate conforms is the frozen Prediction, and what it states is the frozen CoverageVerdict: schema_version, task_class, method, alpha, n_calib, region, qhat, abstain, reason, residual, calib_digest, produced_at.
The closed policy
The policy is a closed predicate with a declared order of priority. The schema draws the order the code declares for a set of labels; for an interval the code declares another order: an interval of zero width abstains with under_calib first, then the budget, then the width, and the intended value last. Its first No ends the decision. When the region is too large, the gate waits while the decision window is open and abstains once it has closed: waiting is an answer only while there is time.
Abstention is a first-class answer, and the idea is old: C. K. Chow (1970) described the tradeoff between errors and rejections, where some would-be correct answers are also turned away. The gate makes that tradeoff explicit, per class, with a stated coverage instead of a hunch.
The budget the caller carries
B_t is caller-carried: the caller keeps B_t and sends it with each call, and the gate returns it unchanged; when the B_t a caller sends is below that caller's floor, the gate abstains with the reason budget_exhausted. The budget is a right to act, metered: not a return, not a deposit, not an oracle. Every decision carries it back in remaining_budget, and profit and loss never enter the policy.
The name of the budget borrows its vocabulary from risk-controlling prediction sets (Stephen Bates, Anastasios N. Angelopoulos, Lihua Lei, Jitendra Malik and Michael I. Jordan (2021)). That is the origin of the word only: what the served gate does with the budget is the rule above, nothing more. See also the token page.
Attestation, and the three strands
An attested conformal decision joins three strands. An attestation carries bytes, a hash and named residual hypotheses: origin, never truth. The conformal region decides. The budget, carried by the caller, meters the right to act. On the served gate the attestation is optional: the attestation is carried by the caller; the verifier is not executed here; BYO classes do not accept `attested`.
GateDecision.Recorded decisions
These decisions were recorded over the MCP transport of an in-process server bound to 127.0.0.1, and are replayed by an integration test. Each row is read from the committed trace; none is typed.
| step | tool | task class | answer | reason |
|---|---|---|---|---|
| cascade-gate | gate | cascade-liquidable-24h | abstain | under_calib |
| btc-dir-gate | gate | btc-dir-15m | commit | covered |
| attested-gate | gate | btc-dir-15m | commit | covered |
The class btc-dir-15m behind the recorded commit is served as declared synthetic — a plumbing fixture, not a measured predictor. The answer it returned, as recorded:
{
"schema_version": "1.0.0",
"action": "commit",
"allow": true,
"tool": "perps_order_preview",
"intent": "up",
"verdict": {
"schema_version": "1.0.0",
"task_class": "btc-dir-15m",
"method": "split",
"alpha": 0.1,
"n_calib": 150,
"region": {
"kind": "set",
"labels": [
"up"
],
"label_schema": "up|down"
},
"qhat": 0,
"abstain": false,
"reason": "covered",
"residual": [],
"calib_digest": "fcebed27fd3f9607bba94898f5ae4ebba548ced519d1d800b49890235358eda6",
"produced_at": "2026-09-04T00:00:00Z"
},
"remaining_budget": 0.1,
"reason": "covered"
}The reason codes
The frozen contract lists 13 codes, one closed list. A new reason needs a versioned revision of the contract, not a deploy. The codes below are read from the schema; the glosses are this page’s.
| code | answer | stage | meaning |
|---|---|---|---|
| covered | commit | Act | the intent lies in a region small enough to act on, and the budget is not below its floor |
| set_too_large | defer | Decide | the set holds every label: nothing is ruled out yet |
| interval_too_wide | defer | Decide | the interval is wider than the act can tolerate |
| intent_not_in_region | abstain | Decide | the intended act lies outside what the region allows |
| under_calib | abstain | Calibrate | too few calibration points to state a region at all |
| no_label_schema | abstain | Calibrate | the task declares no label schema to conform against |
| budget_exhausted | abstain | Decide | the budget the caller sent is below the caller's floor; no bar is lowered |
| clock_expired | abstain | Decide | the region was too large and the decision window has closed, so waiting is no longer an answer |
| upstream_timeout | abstain | Read the input | the upstream sensor or predictor did not answer in time |
| attestation_absent | abstain | Read the input | a class that requires a testimony received none |
| attestation_refused | abstain | Read the input | the verifier refused the testimony: a hash or a signature did not hold |
| binding_broken | abstain | Read the input | the prediction is not bound to the testimony it claims |
| non_evaluable | abstain | Read the input | the input cannot be evaluated against the contract at all |
What the gate says, and what it never says
Coverage holds on average over exchangeable calibration data, at one minus the chosen miscoverage level. It is marginal: it is not conditional on the individual input, and the error of one committed act is not bounded by the level. Coverage conditional on one input cannot be promised in general (Vladimir Vovk (2012)), which is why the gate keeps one region per task class and predictor, and why every other population abstains.
The gate emits a decision; it never calls the tool it names. It holds no key, moves no fund and carries no score field, anywhere: a contract carrying a forbidden key throws instead of serialising.
Sources
- Anastasios N. Angelopoulos and Stephen Bates (2023) Conformal Prediction: A Gentle Introduction. Foundations and Trends in Machine Learning, vol. 16, no. 4, pp. 494-591. read in part Used for the split-conformal quantile and the meaning of marginal coverage.
- Vladimir Vovk (2012) Conditional validity of inductive conformal predictors. Proceedings of the Asian Conference on Machine Learning, PMLR vol. 25, pp. 475-490. read in part Used for why coverage conditional on one input cannot be promised in general, and why a region is kept per category.
- Vladimir Vovk, David Lindsay, Ilia Nouretdinov and Alex Gammerman (2003) the title names the method with a word the site does not print; the paper is the working paper of the series below. On-line Compression Modelling Project (New Series), Working Paper 4. read in full Used for one region per category of a taxonomy fixed in advance, with validity per category and never per case.
- Rina Foygel Barber, Emmanuel J. Candes, Aaditya Ramdas and Ryan J. Tibshirani (2023) Conformal Prediction Beyond Exchangeability. The Annals of Statistics, vol. 51, no. 2, pp. 816-845. read in part Used for the sentence served with a class whose calibration is not exchangeable: no coverage is measured.
- C. K. Chow (1970) On Optimum Recognition Error and Reject Tradeoff. IEEE Transactions on Information Theory, vol. 16, no. 1, pp. 41-46. read in part Used for abstention as a first-class answer: trading errors for rejections.
- Stephen Bates, Anastasios N. Angelopoulos, Lihua Lei, Jitendra Malik and Michael I. Jordan (2021) Distribution-Free, Risk-Controlling Prediction Sets. Journal of the ACM, vol. 68, no. 6, article 43. read in part Used for the origin of the budget vocabulary only; the served budget is not that mechanism.