Repository navigation
Release notes: gate contract 1.1.0, effective 2026-10-06
Published on 2026-10-06, the day the service switched. The specification of version 1.1.0 is at https://github.com/KraidleAI/monark-kata-spec/blob/main/contract-1.1.0/CONTRACT.md. Its /openapi.json has sha256 61c9df97a254a863a68fdc2c493799803397bfa190b85db3ca97673d2a8ccbf0.
1. Timeline
- Before 2026-10-06, the service spoke 1.0.0 only.
- From 2026-10-06, it speaks 1.1.0 only. There is no period in which both versions are accepted.
- A prediction with
schema_version"1.0.0"is refused with HTTP 400, codeschema_version_unsupported. The message names the version the gate speaks (1.1.0) and where the specification is published. The message text is not part of the contract: read thecode.
2. What changes for callers
-
Version.
schema_versionis"1.1.0"in the prediction, the coverage verdict and the gate decision. -
Calibration digest. The verdict field
calib_digestis removed and replaced byscores_sha256. The old field hashed the sorted binary64 scores. The new one is the sha256 of the canonical JSON writing of the scores, in the order the class's table file declares, or in your order for a calibration you send. The name changed because the definition changed. -
calibrate. The output fieldset_digestis removed and replaced byscores_sha256, computed by the same function as the verdict's, over your scores in the order sent. Reordered scores give another digest. The audit loop closes whenscores_sha256,alphaandqhatofcalibrateequal those of the verdict for the same scores, or when both answerunder_calib. -
Exact rank. The split quantile rank is p = ⌈(n + 1)(1 − a)⌉, computed in exact integers. For a calibration you send and for
calibrate, a is the decimal that the shortest round-trip writing of youralphadenotes, with no limit on decimals. For some (n, alpha) pairs the servedqhatmoves by one rank: for n 24 and alpha 0.44 the rank is 14, where 1.0.0 served 15. The ranks ofstable-run-velocity-24h(n 613, alpha 0.1: 553) andliquidation-eligible-coverage(n 170, alpha 0.01: 170) do not change. No new refusal comes from this. -
Verdict fields. The verdict has 17 required fields. New:
qhat_unit(label,scaleorscore),scale,cell_key,policy_row_sha256,policy_table_sha256.methodmay berisk-control. -
No region. When no region is served,
regionandqhatarenull. In 1.0.0 an empty set stood for no region. -
Reasons. New reasons:
calib_silence,calib_vetoed,calib_retired,out_of_support,region_degenerate. A zero-width additive band now answersregion: nullwithregion_degenerate, where 1.0.0 answeredunder_calib. -
Additive band edges. On
stable-run-velocity-24hand on interval calibrations you send, the band edges are taken from the score test (specification, section 8). The served text ofstable-run-velocity-24hno longer carries the sentence on edges rounded to the nearest double. -
Liquidation class.
cell_keyshows the stratum key the server looked up. Yourpredictor_idis not used for that lookup; this was already so in 1.0.0. On strata s1 to s3, which have no calibration, the served text is the class text and no longer the calibrated sentence of stratum s0. -
Decision. The decision gains
request_sha256, the sha256 of the canonical writing of your request envelope. -
Error bodies. Every HTTP 400 body is
{error, operation, message, code}, withissuesoninvalid_input.invalid_inputandinvalid_jsonbodies gainmessageandcode(input_invalid,json_invalid). Codes come from the closed catalogue of the specification, section 13./openapi.jsondescribescodeand the HTTP 500 body with codeoutput_invalid. -
I-JSON requests. A request must be I-JSON (RFC 7493). A string with a lone surrogate (for example in
intentortool) or a number outside binary64 (for example1e400inyhatorintent) is refused with HTTP 400param_invalid. In 1.0.0 these requests answered 200, except a lone surrogate intool, which answered HTTP 500output_invalid. Repeated object keys are still accepted (the last value is kept); do not send them. Refusals that existed already keep their code.calibratewith a score outside binary64 answerscalibrate_input_invalid. -
Reserved class names. The pattern reserved against class names you supply widens from
^(btc|eth|bnb|sol)-(dir|range|mae-down|mae-up)-(1h|4h)$to^[a-z0-9]{2,10}-(dir|range|mae-down|mae-up)-(15m|1h|4h|24h)$. A name in that pattern, compared without ASCII case, is refused withbyo_reserved_kata(btc-dir-15mkeepsbyo_overrides_committed), and a name equal to one of them once ASCII confusables are folded withbyo_lookalike_confusable. For example,my-range-1h,xrp-dir-24handeurusd-dir-1hwere accepted with a calibration before 2026-10-06 and are refused from 2026-10-06. Choose another class name. -
Kata classes. The 32 classes
{btc,eth,bnb,sol}-{dir,range,mae-down,mae-up}-{1h,4h}are served from their policy table files. No kata row is served at 2026-10-06: every well-formed kata call abstains with no region, withunder_calib, ornon_evaluablefor a lean of exactly 0 on adirclass. The grid and staleness checks below run first. A kata request must carry:predictor_idof the formkata:<kataId>@<venue>/<SYMBOL>/<h>, without bucket,<SYMBOL>starting with the class's symbol in upper case,<h>equal to the class's horizon (grammar in section 9 of the specification); otherwisekata_key_invalid;features_digest; otherwisefeatures_digest_required;alphaandnMinequal to the class's values (0.45and6fordirclasses,0.01and299for the others); otherwisepolicy_alpha_mismatchorpolicy_nmin_mismatch, also when no row applies;- on
dirclasses,tauat most 1; otherwisepolicy_tau_cap; yhata number (otherwiseyhat_type_mismatch) in the class's domain (a lean in [−1, 1], or a sigma_hat greater than 0); otherwisekata_yhat_domain;produced_aton the horizon grid (seconds00, every fraction digit0, the instant a multiple of the horizon); otherwiseproduced_at_off_grid;- a call received at most 300 s after
produced_at; otherwiseproduced_at_stale.
A lean of exactly 0 answers
non_evaluable, after all the checks above. -
Tool schemas. The output schemas of
gateandcalibrate, and the description ofgate, change intools/listand in/openapi.jsonwith the formats above./openapi.jsonalso describes the HTTP 400 and 500 bodies of item 11 and lists the existing HTTP 413 answer (request body too large) on every operation. The input schemas do not change.
3. What does not change
- The decision order (specification, section 6).
- The
paramsfields and their meaning.alphaandnMinremain required on every call. On a class that imposes them, a different value is still refused, never replaced. - The
produced_atgrammar and the 300 s future check. - The attestation formats
AttestedPrice,AttestedFlowandAttestedBookkeepschema_version"1.0.0". A request that carriesattestedis still refused withattested_inconsistent. - The reserved key prefix
kata:.btc-dir-15mstill answerstask_class_retired. - No existing error code is renamed or reused. A code you do not know must be read as a refusal.
4. What callers must do
- Send
schema_version"1.1.0". - Read
scores_sha256where you readcalib_digest(verdict) orset_digest(calibrate). Values stored under the old fields cannot be compared with the new ones. - Accept
region: null, the new verdict fields and the new reasons. - Send I-JSON: no lone surrogates, no number outside binary64, no repeated object keys.
- Send
alphaandnMinon every call; on kata classes, the class's values. - If you supply your own calibration under a class name in the widened pattern, rename the class.
- On kata classes, follow the request rules of section 2, item 14, and handle the 400 codes listed there.
- Read errors by
code, not by message. - If you cached the tool schemas from
tools/listor/openapi.json, fetch them again. - If you installed a copy of the MONARK skill, update it from the public mirror.
5. Where the specification lives
The specification, its conformance vectors, its schemas (prediction, coverage-verdict, gate-decision, policy-row, tool-error) and the policy table files are published in the directory contract-1.1.0 of https://github.com/KraidleAI/monark-kata-spec. Versions are published in their own directory and never withdrawn. These notes are also the release notes of the public mirror, release v0.9.0.