Allocation Market — the vault-capacity epoch, read by the engine #
Companion to architecture.md (the Allocation Layer in the Level-3 DAG), state-layers.md (§12, the epoch state machine), flows.md (Flow 8), event-catalog.md (§6.16–§6.17, the epoch log and the allocation stream) and matching-engine.md (§6, sleeve ceilings).
This document is DOWNSTREAM of five private authority notes — the objective note, the futarchy note, the tokenomics draft, the simulation note and the product thesis (gitignored, kept verbatim, never edited here — CLAUDE.md core law 7). Every rule below cites the note and section it restates, term by term; where a note leaves a value or a rule open, this document pins a FIELD of the epoch document, names its owner, and — since CLAUDE.md law 7(c) as — the CONFIG DEFAULT the first document carries, which the owner replaces from the next epoch (the values: futarchy-system.md §9, the system view of this layer under law 8). §15 records the rulings and the defaults by date, quoting their authors. the economics review (CLAUDE.md §2–4) holds this document to the notes and the spec-sync review holds it to its siblings.
- §1 Scope and the three vectors
- §2 Symbol table, note-scoped
- §3 The epoch document
- §4 Actors, pools, participants and stakes
- §5 The epoch log and the allocation stream
- §6 The epoch state machine
- §7 The raw allocation and the constraint-adjustment map Γ_C
- §8 The ceiling route
- §8b The capital views
- §9 The evaluation data D_T
- §10 The estimator Θ and the settlement objective
- §11 The optimizer, its certificate and its fallback
- §12 Payouts, the tax, the cap and conservation
- §13 The determinism bridge
- §14 Refusals and verification taps
- §15 Rulings, defaults and open values
1. Scope and the three vectors #
The vault supplies deployable capacity V to N − 1 bookmakers and one
cash reserve. Once per epoch, a pari-mutuel market forecasts the
allocation a precommitted optimizer will select after an evaluation window;
the market's closing pool shares — adjusted to the declared caps — become
the bookmakers' credit ceilings for the window's runs; after the window the
optimizer settles the pools (the futarchy note, "Overview"). Three
distinct vectors (the futarchy note, "Overview": "The proposed allocation, the implemented allocation and the settlement assessment serve different purposes"):
flowchart TB S["stakes"] --> WM["w^M<br/>raw market allocation"] WM -->|"individual, growth, leverage and group caps, the cash minimum"| WI["w^I<br/>implemented allocation"] WI --> CEIL["sleeve ceilings"] CEIL --> RUNS["the window's runs"] RUNS --> SER["the balance series at the snapshot interval<br/>derived from the runs"] SER --> EST["the estimator"] EST --> WS["ŵ*<br/>settlement allocation"] WS --> P["payouts"] WM -.->|"settlement prices on the RAW share"| P S -.->|"how long each stake stayed unchanged"| Y["participation yield"]
Diagram source
flowchart TB
S["stakes"] --> WM["w^M<br/>raw market allocation"]
WM -->|"individual, growth, leverage and group caps, the cash minimum"| WI["w^I<br/>implemented allocation"]
WI --> CEIL["sleeve ceilings"]
CEIL --> RUNS["the window's runs"]
RUNS --> SER["the balance series at the snapshot interval<br/>derived from the runs"]
SER --> EST["the estimator"]
EST --> WS["ŵ*<br/>settlement allocation"]
WS --> P["payouts"]
WM -.->|"settlement prices on the RAW share"| P
S -.->|"how long each stake stayed unchanged"| Y["participation yield"]In scope: the vault market in USD-equivalent (the economist, 6 Oct: "Current vision is that Futarchy 1.0. operates with USD-equivalent only" — §15 D5), its epoch document, its records, its folds, its arithmetic, its identities.
Out of scope, and fenced off deliberately: the HOUSE / POL layer — its
three pots, Q = aU + bC + dE, the surplus split and the treasury bonus have
no engine object (core law 4; the draft itself: "the USDC sportsbetting vault
remains separate and unchanged"); its "Outside the scope of this design" list
is adopted whole — Burning
repurchased HOUSE; HOUSE as gas or a chain security budget; Token-gated
sportsbetting access; NAV redemption of POL for HOUSE; Settling allocation
markets on HOUSE price; Retail leverage secured by HOUSE or a required HOUSE
perpetual market; Combining LP deposits, lender principal, credit inventory
and reward reserves. The vault-capacity market specified here is the
futarchy note's ONE pari-mutuel market. The product thesis's per-strategy
YES / NO proposal markets
— the 70 / 30 split to correct predictors, the burned challenger HOUSE — are
not implemented here. "Per-strategy proposal markets versus one pari-mutuel
allocation market" is on core law 7's list of disagreements between the
notes; under law 7(c) as amended the CONFIG DEFAULT of the shape is the ONE
pari-mutuel market this document specifies (futarchy-system.md §9 C1 names
both positions and why the default follows the futarchy note). The CEO's 6
Oct comment ruled out burns ("We don't do burns - this is the previous doc
iterations"); it did not speak to the market shape, so §15 question 3 (the
live note's question 19) still asks for the shape in writing — a ruling
record replaces the default from the next epoch.
The simulation note is informational: nothing in this repository reproduces
it (random draws are banned in transformer code). The ONE value flow across
these lines is the sanctioned one — "The USDC vault's futarchy tax τ can
contribute to available protocol surplus after its obligations" — recorded
here as §12's tax_recipient — of the three amounts B15 publishes for that
account only tax_amount is that inflow; rounding_charge and cap_residue
land with tax_recipient and count toward no surplus until a ruling (CONFIG,
futarchy-system.md §9 C48 (b)). That available surplus, the credit-inventory
pot bought with S_credit and the reward reserve are strictly distinct
accounts, and the surplus is gated behind the vault's obligations and
required reserves — so naming the account the tax goes to is not the
engine's to infer from "protocol owned liquidity in a protocol owned vault":
it is one CEO-owned field and the engine records the address it is given
(§15 question 4); by R18 that field names the POV account, and the note's
obligations gate and its surplus split apply to that account outside the
engine (futarchy-system.md §9 R18).
Three other flows cross the participant/protocol line and are named here rather than left implicit. The ROUNDING CHARGE of §12 — the economist's own rule, his words quoted in §15. The protocol's own SEED in every pool, which has to be an ordinary stake for the pool to be funded, so the protocol is paid by and pays into the market like any staker (§15 question 2). And the payout cap's RESIDUE, which no note contains at all: it is the engine's proposal, its default is v1 — no cap at all — and §15 question 5 asked whether it should exist — CLOSED, no cap (§12; futarchy-system.md §9 R12).
Three accounts, and the engine holds none of them (§15 D3). The GRID
discussion paper names all three — a working draft, not an
authority note and not a ruling record, cited throughout this document only to
corroborate what a note or a recorded ruling already carries, and closing no
question; §15 states that standing in full. The underwriting
vault supplies the deployable capacity V this market allocates. The
prediction stake vault holds the stake pool R on the partner chain and
pays the settlement out of it — a different account from the one being
allocated, which is why V and R are separate fields and never net against
each other. The protocol-owned vault "receives specified protocol income
and pays explicitly budgeted incentives or limited loss coverage" — whether
this market's tax is among that income is NOT something the paper says, and
§15 question 4 still asks it. The engine records each stake as a fact
citing its chain entry, computes the three vectors and the payout table, and
publishes them as records anyone re-derives from the same log (§13).
A note on words: the authority notes say BOOKMAKER and the business paper says DESK or SUPPLIER DESK for the same party — the entity that quotes under a funded account. This document keeps "bookmaker", the notes' term, and "pool" for its outcome in this market.
2. Symbol table, note-scoped #
The notes overload several symbols. This document names each by its note; a letter is context-scoped where it is shared, its row naming the sections it holds in.
| Symbol here | In the notes | Meaning | Where |
|---|---|---|---|
Q_obj |
Q(w;θ) (objective note) |
E[R_V(w)] − λ·CVaR_α[−R_V(w)] − ε‖w‖² — the objective OF RECORD (§15 D1) — the v1/v2 chains' objective; the v3 chain's is Q̂_T below |
§10 |
Q̂_T |
Q̂_T(w) (the futarchy note as rewritten, "Objective") |
wᵀR^month_T − λ_d CVaR^(1)_α(w) − λ_w CVaR^(7)_α(w) − ε‖w‖² — the v3 chain's objective (futarchy-system.md §9 R53); the same letters in §11's uniqueness probes name whichever objective the chain declares |
§10 |
b_i, G_i |
b_i, G_i (the 19 October note, "Individual limits") |
a bookmaker's individual bound min(c_1, G_i, L E_i / V) and its growth-or-bootstrap cap |
§7 |
E_i, L |
E_i, L (the 19 October note) |
a bookmaker's own capital (own_capital 58, mills) and the leverage multiple (leverage_max 62); NOT §11's loss L^(k)(w) |
§7 |
c_c, c_1, `c_ |
S | ` | c_c, c_1, c_2 c_3 c_5 (the 19 October note) |
g, e |
g, e (the 19 October note) |
the growth multiplier and the bootstrap cap — the objective note's n and ε₀; this g is the growth multiplier (B7's abort height is the row below) |
§7 |
g (abort height) |
— (the window fold's own symbol, futarchy-system.md §9 C37) | B7's abort height — the first final at or above the grace end (deadline + verification_grace_blocks); §5 and §15 only, not the growth multiplier of the row above |
§5, §15 |
B, U^peak, F^own, F^credit, η, R^bal |
B, U, F^own, F^credit, η, R^bal (the 19 October note, "Balances and utilisation") |
the balance series (§9) — F^own and F^credit the FREE (undrawn) balances, futarchy-system.md §9 C69; B here is a balance — NOT B_bind of §7 nor the tokenomics draft's reward budget |
§9 |
q95_i, e^util_i |
q_{95,i}, e^util_{i,T} (the 19 October note) |
the per-pool winsor threshold and the utilisation efficiency (§10); e^util is not the bootstrap e — q95_i the v1/v2 chains' (no winsorisation on v3) |
§10 |
H_j, Y_j, y |
H_j, Y_j, y (the 19 October note, "Participation yield") |
the duration-weighted stake, the yield, the reward budget (§12) | §12 |
open_height |
t₁ (the 19 October note, "Opening and initial stakes", "Participation yield") |
the market's open HEIGHT (48), where the yield's duration starts; the 2 October text's t₁ in V_i = w^I_i(t₁) V (§8) is a different symbol — the time the allocation is read, never this field |
§3, §12 |
M (as t₂) |
t₂ (the 19 October note, "Participation yield": "Freeze substake amounts and timestamps at t₂") |
the close HEIGHT (31), where substakes freeze and the yield's duration ends | §3, §12 |
d |
d (the 19 October note, "Participation yield") |
the height of a stake or move row — the note's timestamp read as a block height (§15 D12) | §12 |
s^(d)_{ij}, 𝒯_{ij} |
the same (the 19 October note, "Participation yield") | a SUBSTAKE — the part of participant j's stake in pool i held unchanged since height d — and the set of those heights; s_{ij} = Σ_{d ∈ 𝒯_{ij}} s^(d)_{ij} |
§12 |
D |
D (the 19 October note) |
the allocation precision (allocation_precision 63), default V in mills; NOT D_T, the evidence set |
§7 |
D(k), turn |
— (no note; futarchy-system.md §4 "The v4 chain") | epoch k's deadline close_height(k) + window_blocks(k), the BOUNDARY; an epoch's turn [D(p), D(k)); never D, the allocation precision, nor D_T |
§3, §8b |
L(h), C(h), R(h) |
— (no note; futarchy-system.md §4 "The v4 chain") | for an epoch at height h: L(h) the locked carried lines it covers, C(h) the consumed amounts of the lines it covered released in its turn, R(h) the released amounts of the lines it holds released in its turn; written with their height in every formula; in worked figures and diagrams L, C, R alone name them at the height shown — never the leverage multiple L, a cap c or the stake pool R |
§3, §8b |
Δ (19 Oct) |
Δ (the 19 October note, "Performance collection") |
the snapshot interval, snapshot_blocks (57); the 2 October text's and D2's "Δ = one run" is the per-run observation, a different symbol |
§9 |
Q_mv |
Q(w;θ*) (the 2 October text, "Objective and constraints"; absent from the 19 October note) |
wᵀμ − λwᵀΣw — the note's mean-variance EXAMPLE; not of record (the economist: "an early example / filler") |
§10 note |
Q_kpi |
Q(w,c;θ) (tokenomics draft) |
aU + bC + dE on the HOUSE / POL layer — no engine object |
§1 |
λ, α, ε |
the same (objective note) | risk aversion; tail level; the ridge weight (dust, > 0) — λ the v1/v2 chains' one weight (lambda 10); on v3 λ_d, λ_w below, α common to both horizons |
§3, §10 |
λ_d, λ_w |
the same (the futarchy note as rewritten, "Parameters", "Objective") | the note's daily and weekly risk-penalty weights; lambda_daily 70, lambda_weekly 71 |
§3, §10 |
r_c |
the same ("Parameters"; "Daily, rolling weekly and monthly returns") | the fixed cash rate, effective annual, actual/365; cash_rate_annual 72 — cash's horizon returns pinned as 74–76 (futarchy-system.md §9 C94) |
§3, §9 |
n_T |
the same ("Performance collection"; "Daily, rolling weekly and monthly returns") | the note's day count of [t_2, t_3]; = K under futarchy-system.md §9 C96 |
§9 |
h_w |
h = 7 ("Daily, rolling weekly and monthly returns") |
the weekly horizon in snapshots, 73 | §3, §9 |
K_T^(h) |
the same ("Evaluation data and evidence") | the eligible windows of horizon h — {h … K} on every document (futarchy-system.md §9 C95); a SET, never the number K |
§9, §10 |
β |
the same ("Winsorisation (future step)") | the note's future-step winsorisation percentile (β = 95 %) — no field, no block on the v3 chain; the v1/v2 chains' level is q95 (14, retired on v2; per-pool on v2) | §10 |
B̃ |
— (the note writes B) |
the scoring balance, C95: max(B, 0) at every written row, 0 after the wipe-out row |
§9 |
R^month, R^{bal,h} |
R^month_{i,T}, R^{bal,h}_{i,k} ("Daily, rolling weekly and monthly returns") |
a pool's monthly return B̃_K / B_0 − 1 and its horizon-h return B̃_k / B̃_{k−h} − 1, h ∈ {1, h_w}; R^bal alone is the daily one |
§9, §10 |
τ_pool |
τ (futarchy note, "Participants and stakes": "The fee rate is τ, fixed before the futarchy market opens"; tokenomics draft) |
the pool tax rate on R |
§12 |
shrink_stiffness |
τ (objective note, "Estimates") |
the shrinkage stiffness in δ_i = T_i / (T_i + τ) — v1/v2 chains (retired on a v3 document) |
§10 |
P_i |
P_i (futarchy note, "Outcome payouts": P_i = ŵ*_i S; the 2 October text, "Taxation and fees?") |
pool i's liability — ŵ*_i R before fees ("Settlement"), (1 − τ_pool) ŵ*_i R = (1 − τ_pool) R_i v'_i with the tax ("Taxation and fees?"; B13's record) — never the HOUSE layer's stake pot P |
§12 |
P^desk_i, P̃^desk_i (risk-engine.md §6 writes P_i, P̃_i inside its own section) |
his §5's "PnL" of a bookmaker's period | a bookmaker pool's PERIOD RESULT, Σ pnl over its return_observed rows of the window, and the same net of the liquidation fee — never the pool liability P_i above nor the tokenomics stake pot P |
risk-engine.md §6 RC1 |
L^loss_i (risk-engine.md §6) |
his §5's loss | the magnitude of a negative period result, −P̃^desk_i — never L = leverage_max (62) |
risk-engine.md §6 RC4 |
r_desk, r_lpv, r_pov |
R63's words: "50% to LPV, 10% to POV, 40% to BMs" (futarchy-system.md §9) | the credit's profit shares, fields 82–84 — never a stake r_ij, a return r_k or the cash rate r_c |
§3; risk-engine.md §6 RC3 |
X_i (risk-engine.md §6) |
— | a bookmaker pool's CREDIT EXPOSURE in the epoch: V_i under carry_budget_rule v1, under v2 min(⌊w^I_i · (V + R(h*))⌋ on the allocation grid, ⌊L · E_i⌋) at h* (B5 v5's desk bound: the desk's share, at the split w^I, of the committed budget plus the amounts released into the epoch's pot — the lines it may still be lent — capped by the leverage bound; a desk's credit-side loss never exceeds its line, C90, C121) |
risk-engine.md §6 RC4; futarchy-system.md §4 B5 v5 |
used_k, drawn_credit_k (risk-engine.md §6) |
his simulation's "utilised own and borrowed trading capital" | the capital in positions at snapshot k, max(max(B_k, 0) − F^own_k − F^credit_k, 0), and its credit part min(V_i − F^credit_k, used_k) — the complements of the FREE balances F^own, F^credit |
risk-engine.md §6 RC3; futarchy-system.md §9 C134 |
v_i |
v_i (futarchy note "Settlement") |
the payout multiple on the RAW share, ŵ*_i / w^M_i = ŵ*_i R / R_i |
§12 |
v'_i, v_max |
— (no note; am §12) | the multiple after the payout cap (payout_cap_rule v2's min(v_i, v_max); v'_i = v_i under v1) and the cap's bound (field 49, v2 only) |
§12 |
T_tax, R_net |
T_tax, R_net (the 2 October text, "Taxation and fees?"; the 19 October note, "Pool accounting": τ = 0, stakes net of any entry fee) |
τ_pool R and (1 − τ_pool) R; tax_amount = ⌊T_tax⌋ at B15 (C48 (b)) |
§12 |
Π_ij |
Π_ij (futarchy note, "Participant payouts and PnL"; the 2 October text, "Taxation and fees?") |
participant j's payout on pool i — ⌊r_ij P_i / R_i⌋ in money_unit at B14 (= ⌊r_ij (1 − τ_pool) v'_i⌋, ONE floor, rounding_rule v1) |
§12 |
ℓ, m |
— | the 0-based index of a NET POSITION in B1's first-row order (never the note's participant j) and the number of positions; the ℓ-th stake_payout sits at window_seq + 7 + ℓ, the last at + 6 + m, epoch_settled at + 7 + m — under the v2 layout at + 8 + ℓ, the last at + 7 + m, the Y yield rows at + 8 + m + j and epoch_settled at + 8 + m + Y (futarchy-system.md §9 C49, C50) |
§12 |
tax_amount, rounding_charge, payouts_total |
⌊T_tax⌋ and the "additional protocol charge" of the economist's comment (§15) |
B15's four integers — epoch_settled.cap_residue is ⌊cap_residue⌋, the floored FIELD, distinct from B13's exact rational of the same name: tax_amount = ⌊T_tax⌋, payouts_total = Σ of B14's payouts, rounding_charge = R − payouts_total − tax_amount − ⌊cap_residue⌋ — the dropped fractions of the payouts, the tax and the residue in ONE charge, at most one unit per payout row (futarchy-system.md §9 C48 (b), C50) |
§12 |
cap_residue |
— (no note; am §12) | (1 − τ_pool) Σ_i R_i (v_i − v'_i) — 0 under payout_cap_rule v1 |
§12 |
B_bind |
B (the 2 October text, Γ_C) |
the binding cap set — never the HOUSE layer's reward budget B |
§7 |
w̄_i |
the same (both notes) | the cap of pool i, fixed before betting |
§3, §7 |
n, ε₀ |
the same (objective note, constraint 2) | the growth multiplier; the bootstrap cap | §3 |
b̲ |
the same (objective note, constraint 6) | the liquidity-buffer minimum on cash | §3, §10 |
ρ, u_{i,T} |
the same (both notes) | the target utilization; realized utilized share of V |
§9, §10 |
q95, μ₀ |
the same (objective note) | the winsorization level; the shrinkage prior — v1/v2 chains (retired on a v3 document) | §3, §10 |
Δ |
the same (objective note) | the observation unit — ONE RUN here (§15 D2) | §9 |
V, V_i |
the same (futarchy note) | deployable capacity in mills; pool i's share of it |
§3, §7, §8 |
N, K |
— | the number of pools (cash included); the number of runs in D_T |
§4, §9 |
R, R_i, r_ij |
the futarchy note's S, S_i, s_ij ("Pool balances and market allocation"; the 2 October text's R, R_i, r_ij in "Setup") |
the stake POOL and its parts. The objective note's return objects are never written bare: they are R_it, R^w_it, R̄_i, R_V(w) and R^(k),w |
§4, §9, §12 |
M |
the CEO's "block M" | the close HEIGHT. The 2 October text's M in "Setup" (the 19 October note's M in "Participants and stakes") is its futarchist count, which this document calls the participant count and never abbreviates |
§3, §5 |
R^w[k][i] |
the objective note's R^{(k),w} entry |
the winsorized return of pool i in run k — B9's matrix entry (cash's column cash_return, a MISSING entry 0); never M, the close height — v1/v2 chains; the v3 chain's matrices hold the unfiltered horizon returns (§11 "The terms lift") |
§10, §11 |
κ_j (κ_lower,i, κ_upper,i, κ_z,k, κ_d,k), κ_g |
— (the notes name no multipliers) | the KKT multipliers of the lift's inequality constraints by the C46 enumeration, and under v2 κ_g one per active GROUP ROW (§11 "The group caps in the active set") — never μ̂_i (the estimate) nor μ₀ (the prior) |
§11 |
ν |
— | the multiplier of the simplex equality Σ w = 1, derived by the verifier at the cash coordinate, never recorded |
§11 |
𝒲, written W inside §11 "The method" and the futarchy-system.md B12 and C47 rows |
— | the solver's WORKING SET (C46 indices) — the letter is REUSED there from the 2 October text's W (the weight simplex of its "Market Lifecycle", "Q, W, C, F, Θ"), a scoped reuse this table records by name: outside those spans W is the simplex |
§11 |
Z, T (the method) |
— | Z = {k : z_k ≥ 0 active}, T = {k : tail_k active} — T here is the TAIL SET, not the epoch index of ŵ*_T, D_T, T_i; scoped to §11 "The method" and the B12 / C47 rows |
§11 |
E, e (the method) |
— | the EQP's equality rows and right-hand side (E w = e) — not the expectation E[·] of Q_obj, not e_1/e_cash; scoped as above |
§11 |
a, c, s, y, p, t, x (the method) |
— | a the reduced linear coefficient; c = λ/((1 − α)K) (the objective note's CVaR weight, never the pool tax); s = c|T| − λ the ray's slope; y the EQP multipliers by row; p = w_new − w the direction (not the probe point p of the C45 uniqueness check in the B12 row); t the step length in [0, 1] (not the run index of R_it); x = (w, ζ, z) the lifted point; scoped as above |
§11 |
r_k, k₀ (the method) |
— | r_k = row k of R^w (the objective note's R^{(k),w}, written bare ONLY inside the method as the row vector; never the stakes r_ij); k₀ = min(T ∩ Z) the run whose loss pins ζ |
§11 |
L_t, r_{t,k} (the terms lift, v3) |
L^(h)_k(w) (the futarchy note as rewritten, "Daily and rolling weekly CVaR") |
term t's loss-row matrix — row k (an eligible window of K_T^(h_t)) holds r_{t,k}, the window's horizon returns with cash's pinned return first, and the window's joint portfolio loss is L^(k)_t(w) = −Σ_i L_t[k][i] w_i, the note's L^(h)_k(w); L_t(w) = −L_t w — the vector of portfolio losses; the matrix L_t holds horizon RETURNS, the loss is its negative. Written L_t, never M (the close height); not the leverage L of §7 |
§11 |
t, λ_t, K_t, c_t (the terms lift, v3) |
— (the note's λ_d, λ_w and its tail fraction, "Daily and rolling weekly CVaR") |
the term index t in order daily d, weekly w (never the method's step length t); λ_t its weight; K_t its row count (K_d = K, K_w = K − h_w + 1); c_t = λ_t / ((1 − α) K_t) its tail weight — never a cap c_k of §7, never the pool tax |
§11 |
r (the v3 objective) |
R^month_T ("Objective") |
the monthly return vector of the v3 objective, (cash_return_monthly, R^month_i …), cash first, r_i = 0 for a pool with no series — never the stakes r_ij, never a method row r_k |
§10, §11 |
h (the note's horizon) |
h ("Daily, rolling weekly and monthly returns") |
the note's horizon in days, h ∈ {1, 7} — h_w its weekly value in snapshots (C96: one snapshot one day); never the close height h*, never the simplex equality h(w) |
§9, §10 |
f_k, t_ij, S_seg (the walk) |
— | f_k(t) the sum of the k largest bookmaker weights of w + t p; t_ij = (w_i − w_j)/(p_j − p_i) a breakpoint where bookmakers i and j tie; S_seg a segment's top-k set; k in c_k and top-k is the group SIZE |S| (the futarchy note's c_|S|), while elsewhere in §11 and C47 k is the run index; scoped to §11's group caps and the B12 v2 / C47 / C60 rows |
§11 |
ζ, z_k |
— (the notes name neither; the Rockafellar–Uryasev lift is our reading of the objective note's sample CVaR_α — "Definitions", "Estimates") |
the CVaR threshold the lift optimizes over (recorded); the tail excess max(0, L^(k) − ζ) (reconstructed) |
§10, §11 |
g_j |
— | the j-th inequality constraint of the lift as a function g_j(w, ζ, z) ≤ 0, indexed by the C46 enumeration — never the bare g, B7's abort height (§9) |
§11 |
3. The epoch document #
One document, hashed, closed, total. Every value or rule the notes call precommitted — "fixed before the market opens", "fixed before betting begins", "published before commitments open", "must specify in advance" (the objective note, "Estimation and settlement": six items; the futarchy note, "Important Design Choices": twelve; the tokenomics draft, "Before commitments open") — is a field of one canonical byte document, encoded exactly as every record is (event-catalog §3: deterministic CBOR, integer map keys ascending, no floats, no bignum tags). Its hash is the epoch's identity:
epoch_id = BLAKE3(canonical_bytes(document))— the run manifest's precedent (run_id= the hash of the frozen manifest, state-layers §11).
The decoder is CLOSED — an unknown field id refuses the document — and TOTAL
— a missing field refuses it; no default is ever decoded in (core law 7(b):
"never a code constant, never a decoder default"). A RULE field is a rule
identity: {name: text, version: text, hash: 32 bytes}. Two hashes, stated
apart (futarchy-system.md §2): a BLOCK's hash is the BLAKE3 over its chain
element's rows (1)–(5) — inputs, outputs, config fields, params, rules —
plus its declared rule text (the name and version of row (0) are labels
outside the hash); a RULE FIELD's hash is the BLAKE3 over that rule's own
declared text (a rule spanning several blocks — the estimator (42) for one, the
arithmetic rule (32) — carries that same hash in each of its elements),
carried with its own version inside
the element's rules row (the name and this coverage
— futarchy-system.md §2) — the
engine implements exactly the versions it declares and refuses any other
(event-catalog §7 rule 2's posture). The document is stored content-
addressed beside the epoch log, as gate-details documents are
(model-plugin-layer §10); the log's first record names its hash (§5). After
that record nothing in the document changes: a second epoch_opened naming
a different hash, is corrupted history — refused
at the edge, a typed halt in the fold (§14).
Rationals in the document take the ONE wire form of §5 — {0: sign, 1: num, 2: den} with sign the unsigned integer 0 (non-negative) or 1 (negative),
num and den big-endian byte-string magnitudes with no leading zero
byte, zero spelled as the EMPTY num with sign 0 (a negative zero, a
leading zero byte, a sign other than 0 or 1, den of zero, or a pair not in
lowest terms refuses) — and in this document every magnitude fits 64 bits
(a longer one refuses; the allocation stream's rationals, §5, may exceed
it). Every nested map carries integer
keys like the document itself: a rule identity is {0: name, 1: version, 2: hash}, a pool entry {0: index, 1: name, 2: sleeve_id} (sleeve_id null
for cash), a chain element rows 0–5 as futarchy-system.md §2 numbers them,
a rules-row entry {0: field_id, 1: name, 2: version, 3: hash}, and a
params map keys, by document field id, the SYMBOL (text) in the block's
declared text that the field binds — never a copy of the field's value,
whose one home is the snapshot (futarchy-system.md §2; at the first epoch
every block's params row is empty); every nested map is
CLOSED the same way (an unknown key refused by id at its level). A chain
account id (participants 23, seeder 26, tax_recipient 29) is a BYTE
STRING — the partner chain's raw account bytes, no text spelling, so one
account has one spelling (futarchy-system.md §11 W4). The document's byte
length is capped at the run manifest's 1 MiB (MAX_DOCUMENT_BYTES — a
parser-hardening cap of model-plugin-layer §16's class, not a value of the
layer; futarchy-system.md §11 W6) and its nesting at the codec's depth. The
DECODER enforces the table's TYPE column — the integer widths, the 32-byte
hashes, the array lengths (caps and seed_units one entry per pool), the
rational form and the field-49 key set — and check every INEQUALITY, the
table's own (λ ≥ 0, ρ ∈ (0, 1], min_stake_units ≥ 1, seed_units[i] ≥ 1, shrink_stiffness > 0 — λ and the stiffness on v1/v2 documents, the v3 inequalities in "The v3 document") included, so shape and content refuse apart. Every
array whose meaning is a SET — participants, a chain element's inputs,
outputs, config and rules — is strictly ascending and distinct (byte
order for accounts, record-name order for inputs and outputs, field-id
order for config and rules), so one set has one spelling; pools,
caps, seed_units and the chain are ORDERED by meaning (pool index;
execution order). The rule-identity fields of the table (1, 6, 17, 19, 22,
27, 32, 35–38, 40–47, and 65–66 on a v2 or v3 document, 42 not on v3) are NOT keys of the document map: each lives in
the rules row of exactly one chain element (futarchy-system.md §2) —
except the spanning rules (32, 42, 17, 43, 6, 47, 36 and 37 — the check list below),
which carry one hash in each element that declares them; under caps_rule v2 the spans read from futarchy-system.md §4's v2 rows — caps_rule (6) in B0 v2, B3 v2 and B11 v2; previous_allocation_rule (47) — its v2 text, naming both predecessor cases (a v1 predecessor's capped_share, a v2 predecessor's allocation/v2 V_i / V_prev) — in B0 v2 and B3 v2 under v2 (B11 v2 reads no w^prev); arithmetic_rule (32) in B2, B3 v2, B4 v2, B6b, B8 v3, B9 v2, B10 v2, B11 v2, B12 v2, B13 v2, B14 v2, B14b and B15 v2 (thirteen); missing_row_rule (17) and returns_rule (43) in B6 ALONE under v2 (B9 v2, B10 v2 and B12 v2 read the series, and the estimator's v2 text carries the missing-snapshot reading — C42's v2 clause, C56; under v1 B6, B9, B10 and B12); the estimator (42) in B9 v2, B10 v2 and B12 v2, the fallback rule (36) in B12 v2 and B13 v2 and the rounding rule (37) in B14 v2 and B15 v2, as under v1; 65 by B6b and 66 by B14b alone (each declared in its block's declaration as data, task 143 steps 3c and 3i) — pinned by the v2 chain's declaration (chain::declared_chain_v2, eighteen elements, task 143 step 3j-1; the totality gate tests/futarchy_chain_v2.rs); under caps_rule v3 the spans read from futarchy-system.md §4's v3 rows — caps_rule (6) in B0 v3, B3 v3 and B11 v3; previous_allocation_rule (47) in B0 v3 and B3 v3; arithmetic_rule (32) in B2, B3 v3, B4 v2, B6b v2, B8 v4, B11 v3, B12 v3, B13 v3, B14 v3, B14b v2 and B15 v3 (eleven); missing_row_rule (17) and returns_rule (43) in B6 alone; the fallback rule (36) in B12 v3 and B13 v3; the rounding rule (37) in B14 v3 and B15 v3; 65 by B6b v2 and 66 by B14b v2; the estimator (42) named by no element and outside the v3 totality set — pinned by the v3 chain's declaration (declared_chain_v3(), sixteen elements); under caps_rule v4 the spans read from futarchy-system.md §4's v4 rows — caps_rule (6) in B0 v4, B3 v4 and B11 v4; previous_allocation_rule (47) in B0 v4 and B3 v4; arithmetic_rule (32) in B2, B3 v4, B4 v3, B5 v5, B7 v6, B6b v3, B8 v4, B11 v4, B12 v3, B13 v3, B14 v4, B14b v3 and B15 v4 (thirteen — B5 v5 floors exact rationals onto the allocation grid and B7 v6 re-holds its usable line); missing_row_rule (17) and returns_rule (43) in B6 v3 alone; the fallback rule (36) in B12 v3 and B13 v3; the rounding rule (37) in B14 v4 and B15 v4; 65 by B6b v3, 66 by B14b v3 and window_rule (40) v5 by B7 v6; the estimator (42) named by no element — pinned by the v4 chain's declaration (declared_chain_v4(), sixteen elements); fields 80 and 81 are document keys, not chain rows — and the
decoder's TOTALITY over them is the check that every such id is named by
at least one element, a non-spanning id by exactly one. The decoder is total over the document's VALUE
keys per payout_cap_rule's version — field 49 present if and only if
that rule is v2 — and refuses the retired id 20 as unknown. Money is an integer count of
money_unit; capacity is integer mills (the engine's own unit,
matching-engine §1). The scenario's run report prints each cycle's
document under these field names as cycles[].configuration
(futarchy-system.md §7 "The run report").
| Field (id) | Type | Owner | The note's term and section |
|---|---|---|---|
chain_feed_rule (1) |
rule identity — its declared text fixes the chain, the finality depth at which a block counts final, the chain's TARGET BLOCK INTERVAL (its nominal seconds per block — the conversion window_blocks and verification_grace_blocks are read against, futarchy-system.md §9 C4), and the feed-conformance version the reader applies |
CEO | the partner chain whose vault holds R, the depth at which a block counts FINAL, and the version of the feed-conformance check the reader applies — "the oracle and data sources" (the 19 October note, "Implemented allocation redistribution procedure"; the 2 October text, Design Choices); the finality depth decides which stakes exist, so it is precommitted like any other data-source rule (§5, §15 D3 and D12) |
money_unit (2) |
text | CEO | the stake asset's smallest unit — "USD-equivalent" (§15 D5) |
vault_capacity_mills (3) |
u64 V ≥ 1 (B8 divides by it; a vault of no capacity allocates nothing) |
CEO and economist jointly | "the vault has V units of deployable capacity" (the 2 October text, "Governance problem") |
pools (4) |
array of {index: u32, name: text, sleeve_id: u32 or null} |
CEO | "the bookmaker-indexed pool structure" (the 2 October text, Design Choices); index 1 = cash, sleeve_id null; indices 2..N each bound to one SleeveId (§4) |
caps (5) |
RETIRED on a v2 document (caps_rule v2 — the single and group caps are fields 60–61, the bounds computed by Γ_C v2); v1: array of rationals w̄_i, one per pool |
economist | "the caps w̄_i are fixed before betting begins" (the 2 October text); w̄_1 = 1 (the cash Q/A) |
caps_rule (6) |
rule identity C_i |
economist | "the function C_i(·) is fully specified before the market opens" (the 2 October text) |
growth_multiplier (7) |
rational n > 0 — the 19 October note's g = 2 (R27) |
economist | "w̄_i ≤ n·w^prev_i with precommitted growth multiplier n" (objective note, constraint 2) |
previous_allocation_rule (47) |
rule identity | economist | WHICH vector w^prev is in that inequality: the predecessor epoch's implemented w^I (what the bookmaker actually had) or its settlement ŵ* (what the optimizer judged optimal). The note says only "previous allocation"; v1 reads w^I (§15 question 7); v2's text names the two predecessor cases — a v1 predecessor's recorded capped_share w^I, a v2 predecessor's allocation/v2 V_i / V_prev in lowest terms (0 for every bookmaker under outcome = fallback) — carried by B0 v2 and B3 v2 (futarchy-system.md §4 B3, §9 C73; R6) |
bootstrap_cap (8) |
rational ε₀ ∈ (0, 1] — the 19 October note's e = 0.005 (R28) in the bootstrap max(e, u^prev_i / V) |
economist | bootstrap option (a): "cap new entrants at a small ε₀" (objective note, constraint 2; §15 D10) |
liquidity_buffer_min (9) |
RETIRED on a v2 document (cash_min 59 replaces it); v1: rational b̲ |
economist | "w_{1,t} ≥ b̲ for a precommitted minimum b̲" (objective note, constraint 6). Default 0, and a document with b̲ > 0 is REFUSED: a lower bound cannot be reached by capping; Γ_C's behaviour under it is DECLARED (futarchy-system.md §9 R11 — the bookmakers make room), so the refusal stands for want of a number until gamma_c_rule v2 carries it (§7; §15 question 13) |
lambda (10) |
RETIRED on a v3 document (futarchy-system.md §9 R53; refused as an unknown key — lambda_daily 70 and lambda_weekly 71 replace it); v1/v2: rational λ ≥ 0 |
economist | "a protocol-level risk-aversion parameter fixed before the market opens" (objective note) |
alpha (11) |
rational α ∈ (0, 1) |
economist | "the tail-confidence level, initially proposed as 95 %" (objective note); on v3 common to both horizons, 19/20 (the futarchy note as rewritten, "Parameters"; R53) |
ridge_epsilon (12) |
rational ε > 0 |
economist | "a small precommitted ridge weight" (objective note); ε = 0 refuses — uniqueness rests on it ("Existence and uniqueness"); on v3 1/1 000 000 kept — the note: "The value remains to be specified" (futarchy-system.md §9 C98) |
cash_return (13) |
RETIRED on a v3 document (futarchy-system.md §9 R53; refused as an unknown key — cash_rate_annual 72 and the pins 74–76 replace it); v1/v2: rational μ₁ — per interval on a v2 document (cash's column of B9 v2's and B10's matrix, the readers' and never a row of the series, §9) |
economist | "set w̄_1 = 1 and μ₁ ≈ 0, or use the relevant safe capital return" (the 2 October text, cash Q/A); default 0 (§15) |
winsor_q95 (14) |
RETIRED on a v2 document (B9 v2 computes q95_i per pool — §10); v1: rational ≥ 0 |
economist | "winsorize large positives at the precommitted 95th percentile" (objective note, "Returns") — a pinned return LEVEL, taken from earlier history and written into the document, NOT a percentile the engine computes from D_T (which would not be precommitted at all); one value at portfolio level (§15, the economist's panel-note line) |
shrink_prior_mu0 (15) |
RETIRED on a v3 document (futarchy-system.md §9 R53; refused as an unknown key — no estimator on the v3 chain); v1/v2: rational μ₀ |
economist | the prior in μ̂_i = δ_i R̄_i + (1 − δ_i) μ₀ (objective note, "Estimates") |
shrink_stiffness (16) |
RETIRED on a v3 document (futarchy-system.md §9 R53; refused as an unknown key — no estimator on the v3 chain); v1/v2: rational > 0 | economist | "precommitted stiffness τ" of δ_i = T_i / (T_i + τ) (objective note) |
missing_row_rule (17) |
rule identity | economist | the rule for a bookmaker absent from a run (§9; §15 D11) |
utilization_rho (18) |
rational ρ ∈ (0, 1] |
economist | "precommitted target utilization ρ" (both notes) |
utilization_rule (19) |
rule identity | economist | "the method used to measure u_{i,T}" (the 2 October text, utilization Q/A) — the per-run capital definition and the aggregation over the window; v2 (§9; futarchy-system.md §9 R1, R3): the PEAK over the whole period of drawn PLUS reserved — the economist's own words (§15, R1 and R3) |
runs_n (20) |
RETIRED before any document was written | — | the count-based window of D2, superseded by the team's fixed period and the economist's answers (futarchy-system.md §9 R4, R5); window_blocks (52) replaces it. The id is not reused |
min_distinct_matches (21) |
u32 ≥ 1 | economist and CEO jointly | the product thesis: "evaluation windows are denominated in settled-claim counts plus a minimum number of distinct matches" — the ABORT FLOOR of the window, not its length (§9); under B7 v4 and v5 (B7 v5 the v3 chain's) a reported count, below which the window settles on the fallback (futarchy-system.md §9 C93); its VALUE: futarchy-system.md §9 C6 (10), a pilot document C107 (6, the engine's pick under R62's pending rule) |
delta_rule (22) |
rule identity | economist and CEO jointly | Δ = one run (§15 D2); a time Δ later is a NEW document, never a mid-epoch change |
window_rule (40) |
rule identity | economist | WHICH runs enter D_T — the objective note lists "the return data included in D_T" first among what the protocol "must specify" before betting, so the set cannot be chosen after stakes are in; v2 in §9 (a fixed span of heights; the economist, 2026-10-12: "Every match.") leaves the operator no selection; v3 (B7 v4, the v3 chain's until B7 v5 replaced it): the floor a reported count, never an abort (futarchy-system.md §9 C93, R54); v4 (B7 v5, the v3 chain's): v3's rule with a Failed verdict pending until the rebuilt record's Verified row, run_unrecovered at the grace end (futarchy-system.md §9 C99) |
participants (23) |
array of chain account ids (bytes), ascending and distinct | CEO | "rules determining who may participate" (the 2 October text, token Q/A); a pinned list for the first epochs (§15 D5) |
min_stake_units (24) |
u64 ≥ 1 | CEO | the minimum stake per participant per pool — 1 cent USD-equivalent (§15 D8) |
seed_units (25) |
array of u64 ≥ 1, one per pool | CEO | "minimum seed balances and treatment of empty pools" (the 2 October text); "the first participant supplies real initial stakes r_i1 > 0" (§15 D8) |
seeder (26) |
chain account id (bytes) | CEO | who supplies the seeds (§15 D8); an eligible LP, never the POV account (futarchy-system.md §9 R48, C92) (from the first epoch whose rule chain declares C92's document-check version; before it, seeder ∈ participants alone) |
payout_cap_rule (27) |
rule identity | economist | WHETHER a per-pool payout-multiple cap applies at all: v1 = NO CAP (no v_max field, no residue, nothing diverted — the version with a producer) and v2 = a cap at v_max with the residue to tax_recipient. No note contains such a cap; it is the engine's proposal against the dust-leverage hole, and §15 question 5 asks whether it should exist. "No cap" is a declared VERSION, never a number chosen large enough to be out of the way |
payout_cap_vmax (49) |
rational v_max ≥ 1, present only under payout_cap_rule v2 |
economist | the cap's multiple (§12) |
pool_tax (28) |
rational τ_pool ∈ [0, 1) |
economist | "a precommitted tax rate τ ∈ [0, 1) on the total betting pool R" (the 2 October text, "Taxation and fees?"; the 19 October note fixes τ = 0 in "Parameters" — the rate is the economist's; the ACCOUNT it goes to is tax_recipient, the CEO's) |
tax_recipient (29) |
chain account id (bytes) | CEO | "the protocol treasury or another predeclared recipient" (the 2 October text, "Taxation and fees?"; the 19 October note names no recipient) — the engine records the address it is given and infers nothing about which protocol account it is (§1; §15 question 4) |
stakes_withdrawable (30) |
RETIRED before any document was written — refused as an unknown key; a frozen id keeps its type, so the three-way rule took a new id | CEO | the bool refused moves and exits alike; superseded by stake_mobility (56) |
stake_mobility (56) |
u64 code — 0 none / 1 moves / 2 withdrawals, any other refused at decode (the codes and the id our CONFIG) |
CEO | "whether stakes can be moved or withdrawn before close" (the 2 October text, Design Choices); RULED (§15, futarchy-system.md §9 R16): a move between pools before the close is allowed, an exit is not — default moves; withdrawals admits both row kinds |
match_log_kind (RESERVED — no id) |
per title, the ONE root match-log kind a run's match identity is read from (futarchy-system.md §9 C33) — minted when the title registry exists | engine | a run served from two log kinds of one match would count the match twice in B7's distinct-match floor |
open_height (48) |
u64 | CEO | the height at which the book opens — the first block_final the reader records, so §5's contiguity check has an anchor and "every final block" is checkable rather than trusted |
close_height (31) |
u64 M |
CEO | "we cut off at block M" (§15 D12) — pinned before the first stake |
arithmetic_rule (32) |
rule identity | engine | exact rationals (§13; §15 D6) |
step_budget (33) |
u32 | engine, confirmed by the economist | the optimizer's pivot budget (§11) and, on a v2 document, Γ_C's pass budget (§7, C72) — two counters, one field; exhaustion of the pivots is the settlement fallback ŵ* := w^M (C22), exhaustion of Γ_C's passes the all-cash allocation and the same taxed ŵ* := w^M settlement (C72, C22); the epoch's value must cover both the pivots and Γ_C's worst case of group and redistribution passes (the swarm's arbiter, task 143 step 3b) |
rational_bits_max (34) |
u32 in 128..=MAX_RATIONAL_BITS − 128 (8 064 — the stream decoder's hardening cap 8 192 less B13's headroom: its unbudgeted v_i and P_i carry up to 128 bits more than ŵ*, futarchy-system.md §9 C48 (a), §11 W8; the floor 128 its companion: two 64-bit magnitudes divided fit 128 bits, so a smaller budget would halt B3 v1's shares, exhaust B3 v2's (C72) or halt B11's u / ρ on honest data) |
engine, confirmed by the economist | the bit bound on every Γ_C intermediate (§7, B3), every rational of B10's estimate (§10; futarchy-system.md §9 C44), every bound of B11's feasible set (§10; futarchy-system.md §4 B11) and every optimizer intermediate (§11, §13) |
pivot_rule (35) |
rule identity | engine | lowest-index entering and leaving variable (§11); v2 (B12 v2, task 143 step 3h): every C46 base index before every group row, then the lowest size, the size's blocking row the top-k set of the OPEN segment that starts at t* (a cap met exactly at a breakpoint enters the next segment's set at gap 0); the (size, members) order the order of E's group rows and of leaving, the lowest base index leaving first (futarchy-system.md §9 C47 (b), (c), C60); v3: the lowest term first, then the lowest index (§11) |
fallback_rule (36) |
rule identity | economist | ŵ* := w^M on budget exhaustion (§11; §15 D6) — v2 (taxed) the CONFIG default, futarchy-system.md §9 C22; v3 adds the SPARSE window — fewer distinct matches than the floor — to v2's triggers, the tax still levied (§11; futarchy-system.md §9 C93) |
rounding_rule (37) |
rule identity | economist | how a payout's fraction of a money_unit is settled: v1 = floor each payout, the dropped fractions one declared charge to tax_recipient (the economist's own proposal, §12); v2 = largest remainder, ties to the earlier position in B1's first-row order (§12). The capacity side is its own field (46) |
tie_break_rule (38) |
rule identity | engine | "a deterministic tie-breaking rule" (both notes) — the backstop for an exact numerical tie the ridge leaves (§11) |
previous_epoch_id (39) |
32 bytes | engine | the predecessor's epoch_id, whose capped_share record supplies w^prev = w^I exactly for the transition check (§3's checks) and, through B11, whether a pool had a previous allocation (the ε₀ floor, futarchy-system.md §9 C28 — the field read by B0, B3 v2 and, under v1, B11) and whose allocation record's existence admits the successor (and, under the CEO's no-overlap ruling on a v1, v2 or v3 chain — futarchy-system.md §9 R19 — its epoch_settled or epoch_aborted row too, on the v4 chain its capital release for a v1–v3 successor alone — futarchy-system.md §3, R19); for the FIRST epoch the GENESIS ANCHOR — the BLAKE3 of the partner chain's block hash at open_height (futarchy-system.md §3) — never null, so no two distinct epochs share an id |
objective_rule (41) |
rule identity | engine | the FORM of Q_obj — "Before each market opens, the protocol commits to the objective functional Q(w;θ)" (the 2 October text, "Governance problem"); λ, α and ε are its parameters, this field is the functional itself (§10); v2 the futarchy note's Q̂_T as rewritten (B12 v3, §10; futarchy-system.md §9 R53) |
estimator_rule (42) |
rule identity Θ |
engine | the estimator recipe — winsorize positives at q95 (v2: per pool at the 95th percentile of its own positive interval returns — the futarchy note, "Return filtering and evidence"), shrink toward μ₀, sample joint-tail CVaR in the Rockafellar–Uryasev form: "the estimator for expected returns and tail risk from those returns" (objective note, item 3) (§10); declared by no v3 element — B9 and B10 are absent from the v3 chain (futarchy-system.md §4, §9 R53) |
returns_rule (43) |
rule identity | engine | how a run's return is formed — R_it = pnl_i / capital_i, capital as the run's peak of posted + reservation with the max(posted, 0) sign rule: "the return data included in D_T" (objective note, item 1) (§9) |
gamma_c_rule (44) |
rule identity Γ_C |
engine | the constraint-adjustment algorithm — "the proportional redistribution algorithm Γ_C" (the 2 October text, Design Choices; the 19 October note, "Implemented allocation redistribution procedure"), committed with Q, W, C, F, Θ before the market opens ("Market Lifecycle") (§7) |
optimizer_rule (45) |
rule identity | engine | "the numerical optimization procedure" (objective note, item 5) — the Rockafellar–Uryasev lift, the exact-rational active-set method, AND its initial basis, without which the recorded certificate's bytes are not a function of the inputs (§11); v2 (B12 v2, task 143 step 3h): the group caps as lazily generated group rows with the top-k walk of the ratio test, and capped_share/v2's exhausted read first (§11 "The group caps in the active set", "Fallback"; futarchy-system.md §9 C60, C72); v3 the lift over the TWO CVaR terms (§11 "The terms lift") |
capacity_rounding_rule (46) |
rule identity | engine, from the economist's own line (§15) | how w^I becomes integer mills — v1 floors every pool and gives the whole leftover to cash, the "one rounding, leftover to cash" he confirmed (§15); law 7(d)'s "precommitted rounding rule" for the capacity side, distinct from rounding_rule's payout side |
chain (50) |
the RULE CHAIN — a CBOR array, one element per block in execution order: the block's rule identity, input and output schema ids, the config field ids read, parameter bindings, and the rule-identity fields it implements, each with its own version and its own hash (row 5; futarchy-system.md §2) | engine, the rule versions confirmed by their owners | CLAUDE.md law 8(a): "the chain — which blocks, in what order, with which parameters — is itself data, never code structure"; every rule-identity field of this table is READ from its chain element — the chain is the one home of a rule's identity |
system_hash (51) |
32 bytes — BLAKE3(canonical_bytes(snapshot) ‖ canonical_bytes(chain) ‖ canonical_bytes(risk_chain)), the snapshot being every field EXCEPT 39, 51, the chain fields 50 and 54, and the position fields 31 and 48 (futarchy-system.md §3 fact 2 — the positions are excluded so that successive epochs under the same parameters share a system hash) |
derived; written by the author, re-derived by the loader and by the fold's B0 | CLAUDE.md law 8(b): "The epoch document carries a SYSTEM HASH in a frozen wire field"; also carried by epoch_opened (§5) — the user, 2026-10-13: "Observable, and verifiable" |
window_blocks (52) |
u64 ≥ 1 | economist and CEO jointly | the window's length in partner-chain blocks: the DEADLINE is close_height + window_blocks (§9) — "a 30-day credit allocation span" (the architecture sync's notes; the live note's "a fixed time" paraphrases it); the economist's answer (futarchy-system.md §9 R4); CONFIG default: thirty days at the chain's target block interval (futarchy-system.md §9 C4) |
verification_grace_blocks (53) |
u64 ≥ 0 | engine | how long past the deadline the window waits for an included run's run_verdict row before the epoch aborts as run_unjudged (§9) — the bound state-layers §11 does not supply; CONFIG default one day of blocks (futarchy-system.md §9 C25); under window_rule v4 (B7 v5, the v3 chain's) the same bound covers the rebuild too — a Failed run's rebuilt record's Verified row lands by the grace end or the epoch aborts run_unrecovered (futarchy-system.md §9 C99) |
bookmaker_cap_max (55) |
RETIRED on a v2 document (cap_single 60 replaces it); v1: rational in (0, 1] |
economist | caps_rule v1's ceiling on any one bookmaker: w̄_i = min(bookmaker_cap_max, n · w^I_{i,prev}) for a bookmaker with a previous allocation, the caps field checked EQUAL to it (futarchy-system.md §9 C20; the max(ε₀, …) floor withdrawn — a previous implemented share is never 0, and a recorded share of 0 counts as NO previous allocation, so the bootstrap ε₀ applies to it: the 2 October text's bootstrap ("Objective and constraints") is for "zero previous allocation", and the 19 October note's G_i reads "no previous weight" the same way, "Parameters") — a VALUE of the snapshot (CLAUDE.md law 8(c): never a constant inside a rule's text); CONFIG default 2/5 (the simulation note's "40% allocation cap per bookmaker", Oleh's §4 example; futarchy-system.md §9 C20) |
risk_chain (54) |
the risk engine's chains — defined in futarchy-system.md §6: one array of futarchy-system.md §2 elements in execution order, an element's chain told by its declared text (risk-engine.md §2); a reserved identity named here refuses the document until a version exists | engine | CLAUDE.md law 8(a): "same principle is applied on Futarchy risk" |
snapshot_blocks (57) |
u64 ≥ 1; window_blocks (52) a multiple of it (B0 refuses otherwise — SnapshotGrid) |
economist | the note's Δ: "Record an opening snapshot at t_2 and subsequent snapshots at each precommitted interval Δ … The current interval is one day" (the futarchy note, "Performance collection"; "Parameters": Δ = 1 day) — one day of the chain's blocks at its target interval (futarchy-system.md §9 R34, C4's unit) |
own_capital (58) |
array of u64 in capacity MILLS (the unit of V, V_i, capital_i and pnl_i), one per pool, cash 0 (CONFIG — the note defines E_i for the bookmakers i = 1 … N only); pinned at open and LOCKED until settlement (futarchy-system.md §9 C62) |
CEO and economist jointly | the note's E_i, "the BM's own capital", read by Γ_C's leverage limit w_i ≤ L E_i / V (the futarchy note, "Constraints on implementation" item 4, "Individual limits") and by the balance series as the opening F^own (§9); a VALUE of the snapshot pinned at open (law 8(c)); a pool with 0 receives no credit |
cash_min (59) |
rational c_c ∈ [0, 1) |
economist | "w_0 ≥ c_c — cash meets the minimum allocation"; c_c = 0.1 (the futarchy note, "Parameters"; futarchy-system.md §9 R29); replaces liquidity_buffer_min (9) |
cap_single (60) |
rational c_1 ∈ (0, 1] |
economist | "w_i ≤ c_1 — each individual allocation meets the concentration cap"; c_1 = 0.1 ("Parameters"; R30); replaces caps (5) and bookmaker_cap_max (55) |
cap_groups (61) |
array of {size: u32 ≥ 2, cap: rational}, sizes distinct ascending; a size above the bookmaker count is skipped; the size LIST is a document value — the note's {2, 3, 5} is the default (R31), another list an operator's departure from the note |
economist | "`Σ_{i∈S} w_i ≤ c_ |
leverage_max (62) |
rational L > 0 |
economist | "w_i ≤ L E_i / V, where L is the maximum credit-to-own-capital multiple"; L = 5 ("Parameters"; futarchy-system.md §9 R14, R32) — the reserved value of C13 given its field, read by Γ_C |
allocation_precision (63) |
u64 D ≥ 1; vault_capacity_mills (3) a multiple of it (B0 refuses otherwise — PrecisionGrid, futarchy-system.md §9 C63) |
engine, from the note | "For a precommitted positive integer precision of D allocation units, round each final BM weight down and assign the remainder to cash" (the futarchy note, "Final cash minimum and precision"); default D = vault_capacity_mills, so B4's floor to mills IS the note's rounding (CONFIG) |
participation_reward_units (64) |
u64 y ≥ 0 in money_unit |
CEO | "Let y ≥ 0 be the precommitted total participation reward for the futarchy market, denominated in USD" (the futarchy note, "Participation yield"); default 0 — the note gives no number (CONFIG) |
series_rule (65) |
rule identity | engine | how the balance series is derived from the per-run record (§9; futarchy-system.md §4 B6b) — a chain element names it; v2 (B6b v2): the three return series on B̃ (§9) |
participation_yield_rule (66) |
rule identity | engine, from the note | the yield's substake, duration and rounding rule (§12; futarchy-system.md §4 B14b) — declared by B14b ALONE (chain::b14b, task 143 step 3i), never a spanning rule |
margin_trigger (67) |
rational t_m ∈ (0, 1] |
economist | "Margin call at 80% of BM's own capital" (ruling R14, futarchy-system.md §9; risk-engine.md §7) |
liquidation_trigger (68) |
rational t_l ∈ (0, 1], t_m ≤ t_l checked by B0 |
economist | "90% - liquidation. top-up window - between 80% and 90%" (R14; risk-engine.md §7) |
exposure_caps (69) |
one entry per bookmaker pool in document order, each an array of {scope: u64 — 0 market / 1 family / 2 run, cap: rational in (0, 1]}, scopes distinct ascending |
economist and CEO jointly | the architecture sync's net exposure per market (risk-engine.md §7, C81) |
lambda_daily (70) |
rational λ_d ≥ 0; v3 documents only |
economist | "λ_d = 0.1 - initial daily CVaR penalty weight." (the futarchy note as rewritten, "Parameters"; futarchy-system.md §9 R53) — the weight of the daily term ("Daily and rolling weekly CVaR") |
lambda_weekly (71) |
rational λ_w ≥ 0; v3 only |
economist | "λ_w = 0.1 - initial rolling weekly CVaR penalty weight." ("Parameters"; R53) |
cash_rate_annual (72) |
rational r_c ≥ 0; v3 only |
economist | "r_c = 0.035 - initial fixed cash return of 3.5% effective annually, converted to each scoring horizon using an actual/365 fixed day-count basis." ("Parameters"; R53) — read by the document check's bracket alone; the engine forms no root |
weekly_horizon_snapshots (73) |
u64 h_w, 1 ≤ h_w ≤ K (WeeklyHorizon); v3 only |
economist | the note's h = 7: "Here, h = 1 gives the daily return and h = 7 gives the rolling seven-day return." ("Daily, rolling weekly and monthly returns") — 7 snapshots at one snapshot a day (futarchy-system.md §9 C96) |
cash_return_daily (74) |
rational a / 10^p, its lowest-terms denominator dividing 10^p, held by the bracket at d = 1 (CashReturnBracket(h) (h the pin's field id — 74, 75 or 76)); v3 only |
engine, from the note | "R^h_{0,k} = (1 + r_c)^{h/365} − 1" at h = 1 ("Daily, rolling weekly and monthly returns"), truncated at p decimals — CONFIG C94 |
cash_return_weekly (75) |
the same, held at d = h_w; v3 only |
engine, from the note | the same at h = 7 — CONFIG C94 |
cash_return_monthly (76) |
the same, held at d = K; v3 only |
engine, from the note | "R^month_{0,T} = (1 + r_c)^{n_T/365} − 1" with n_T = K (C96), truncated at p decimals — CONFIG C94 |
cash_return_precision (77) |
u64 p, 1 ≤ p ≤ 18 (CashReturnPrecision); v3 only |
engine | the decimals the three cash pins are truncated at — CONFIG C94 (7(d), the arithmetic representation), 12 |
feed_rules (78) |
array of {0 tag (bytes — a match-log lineage tag the ingest crate's tag registry declares (the three GRID tags and synth/match/v1, event-catalog §6.18 rule 2; no registered tag a prefix of another), non-empty, ending in /v followed by digits, and at most 64 bytes — a longer tag refused, a serialization-class hardening cap beside W8, W9 and W11, futarchy-system.md §11 W12), 1 stall_ms (u64 above 0), 2 continuity (u64: 0 increasing, 1 contiguous)}, tags distinct and ascending, at least one row; known exactly when the risk chain names R7 |
engine | the CEO's PV-05: "Let Radovan define the timeout based on the provider's feed." (futarchy-system.md §9 R43) — the feed gate's rule per lineage tag, routed to a run through the manifest's feed_rule (risk-engine.md §7; CONFIG C102, C103) |
retail_fee_rule (79) |
closed map {0 version (u64), 1 hash (32 bytes)}, a rule identity naming a declared fee rule of model-plugin-layer §12 MF-16's table; optional, known exactly when the risk chain names R2 v2 | economist | the fee rule every run citing the epoch applies, MF-16 held equal to it (risk-engine.md §7, "The retail fee rule's route."); CONFIG C108, v1 "no fee"; a document without it keeps its bytes |
carry_scoring_rule (80) |
closed map {0 version (u64), 1 hash (32 bytes)}, a rule identity naming a declared version of the carry scoring rule (futarchy-system.md §4 "The v4 chain": v1 SNAPSHOT DAY, v2 ACCEPTING CYCLE); present exactly when caps_rule is v4 or later, required there |
economist | convention (a): which window a result landing after the boundary scores in (futarchy-system.md §8; §9 C114, v1 the default); read by B6 v3, B7 v6 and B6b v3 through the config view; a carried run scores by its ACCEPTING epoch's field 80 (futarchy-system.md §9 C123) |
carry_budget_rule (81) |
closed map {0 version (u64), 1 hash (32 bytes)}, a rule identity naming a declared version of the carry budget rule (futarchy-system.md §4 "The v4 chain": v1 INSIDE, v2 OUTSIDE); present exactly when caps_rule is v4 or later, required there |
economist | convention (b): whether the collateral carried across the boundary sits inside the next epoch's committed budget V or outside it (futarchy-system.md §8; §9 C115, v1 the default — FUNDS RISK); read by B5 v5 and B7 v6 through the config view; a carried line weighs by its HOLDING epoch's field 81 (futarchy-system.md §9 C123) |
profit_share_desk (82) |
the §6.17 rational ({0 sign, 1 num, 2 den}, sign 0 or 1, lowest terms), within [0, 1]; present exactly when caps_rule is v5, required there; the three shares 82–84 sum to exactly 1 (ProfitSharesNotOne otherwise) |
economist | the desk's share of the profit attributed to the credit (risk-engine.md §6 RC3; futarchy-system.md §9 C14, R63: "50% to LPV, 10% to POV, 40% to BMs … the fraction of profits earned on the allocated credit"); the operators fixture pins 2/5 |
profit_share_lpv (83) |
as 82 | economist | LPV's share of the profit attributed to the credit (C14, R63); the fixture pins 1/2 |
profit_share_pov (84) |
as 82 | economist | POV's share of the profit attributed to the credit (C14, R63); the fixture pins 1/10 |
grid_fee_fixed (85) |
u64 — capacity mills, no upper bound; present exactly when caps_rule is v5, required there |
the CEO (V) | GRID's fixed fee per desk per epoch, ranked after principal (risk-engine.md §6 RC5; futarchy-system.md §9 C29, C137 — CONFIG 0 until the CEO's value) |
grid_fee_share (86) |
the §6.17 rational within [0, 1]; present exactly when caps_rule is v5, required there |
the CEO (V) | GRID's share of the desk's retained profit, zero on a loss (RC5; C29, C137 — CONFIG 0 until the CEO's value) |
liquidation_fee (87) |
the §6.17 rational within [0, 1]; present exactly when caps_rule is v5, required there |
economist | the fee out of a liquidated desk's RECOVERY before any principal, to POV (RC2; futarchy-system.md §9 C13, C29; CONFIG 1/10); the recovery is zero while no forced close exists (risk-engine.md §12 C85), so the fee row reads 0 |
pov_reserve (88) |
u64 — capacity mills, no upper bound; present exactly when caps_rule is v5, required there |
economist | POV's reserve available to this epoch's loss waterfall, ONE epoch-wide amount pinned before the epoch opens — the vault side's balance read as a value, never formed by the engine (§8b "The engine holds no deposits"; RC4; futarchy-system.md §9 C26, C136 — CONFIG 0: every uncovered loss LPV's, the conservative reading) |
profit_attribution_rule (89) |
closed map {0 version (u64), 1 hash (32 bytes)}, a rule identity naming a declared version of the profit attribution rule (risk-engine.md §6 RC3: v1 UTILISED — its declared text futarchy-system.md §9 C134's CONFIG cell, the identity version 1 + the cell's blake3); present exactly when caps_rule is v5, required there |
economist | HOW a desk's positive NET period result (after the liquidation fee, risk-engine.md §6) is attributed between its own capital and the credit before the shares split the credit's part (futarchy-system.md §9 C134, the R63 register row's "pro rata by financing share"; his simulation's "time-weighted proportions of utilised own and borrowed trading capital"); the alternative reading ALLOCATED (V_i / (E_i + V_i)) named, not declared |
The v2 document (its fields and checks BUILT, task 143 — futarchy::document::CapsRuleFields; B3 v2, B4 v2, B6b, B8 v3, B9 v2, B10 v2, B11 v2, B12 v2 and B14b built as functions — task 143 steps 3b–3i — and the v2 chain BUILT as data, task 143 step 3j-1: chain::declared_chain_v2 names B0 v2, B1, B2, B3 v2, B4 v2, B5 v2, B6, B7, B6b, B8 v3, B9 v2, B10 v2, B11 v2, B12 v2, B13 v2, B14 v2, B14b and B15 v2, a v2 document passes B0 under it, and chain::declared_chain_for is the one dispatch on the version; the composition's v2 branch folds a v2 epoch through epoch_settled, task 143 step 3j-2). A document whose caps_rule (6) is version 2 carries the value keys 57–64 and names the rule identities 65 and 66 in its chain, pins stake_mobility (56) to moves (the note: stakes may be added and reallocated, never withdrawn — none and withdrawals are refused on it, futarchy-system.md §9 C12), and refuses 5, 9, 14 and 55 as unknown keys; its checks: 0 ≤ cash_min < 1, 0 < cap_single ≤ 1, cap_groups sizes distinct ascending ≥ 2 with each cap in (0, 1], leverage_max > 0, allocation_precision ≥ 1, own_capital one entry per pool with cash 0, window_blocks a multiple of snapshot_blocks (SnapshotGrid), vault_capacity_mills a multiple of allocation_precision (PrecisionGrid — so the floored capacities ⌊D w_i⌋ V / D are whole mills and §7's one rounding stays one; futarchy-system.md §9 C63); the v1 checks below that name caps, liquidity_buffer_min, winsor_q95 or bookmaker_cap_max are v1's; a document whose caps_rule is version 1 decodes as before (its byte form unchanged); every chain element naming caps_rule carries the same version, else the decoder refuses (CapsRuleVersionDisagrees), and a version that is neither 1 nor 2 is refused, never read as v1; a chain element's params key of the other version's set is unknown too (W5). On a v2 document the transition check is the link and the successor slot alone — there is no caps field to hold equal, Γ_C v2 forms G_i from the predecessor's recorded share inside B3 (futarchy-system.md §4 B0, B3). The ranges of fields 59–62 are DOMAIN checks of the engine (CONFIG C70 — the note states values, R29–R32, no ranges): c_c < 1 because at c_c = 1 every allocation but the all-cash point is refused and the market has nothing to allocate; the rest the unit interval and positivity. The rule version selects the known-key set — the precedent of field 49 under payout_cap_rule v2 (futarchy-system.md §9 C-table; the economist's note of 19 October 2026 is the source of every v2 value).
The v3 document (the Note on Futarchy as rewritten — futarchy-system.md §9 R53; its chain declared_chain_v3(), futarchy-system.md §4). A document whose caps_rule (6) is version 3 carries v2's value keys 57–64 and the eight keys 70–77, names the rule identities of the v3 chain, and refuses 10, 13, 15 and 16 as unknown keys — the four scoring fields the note retires (the one λ, cash's one return, the shrinkage prior and its stiffness) — beside 5, 9, 14 and 55; the key count is 45, 46 with payout_cap_vmax (49) under payout_cap_rule v2, one key more, 46 or 47, with the optional retail_fee_rule (79, risk-engine.md §7) — v2's keys less 10, 13, 15, 16, plus 70–77, feed_rules (78) and margin_trigger (67) and liquidation_trigger (68), which its risk chain (declared_risk_chain_v3(), futarchy-system.md §6: R7 v2, R0 v1, R1 v2, R2 v2, R5 v1, R6 v1, R6b v1), naming R7 first and R5, R6 and R6b after the admission blocks, requires by the key-set rule below, so the allocation-side keys alone count 42, 43 with field 49. Its checks are v2's, less the two that name a retired field (λ ≥ 0, shrink_stiffness > 0), plus λ_d ≥ 0, λ_w ≥ 0, r_c ≥ 0, 1 ≤ h_w ≤ K with K = window_blocks / snapshot_blocks (WeeklyHorizon — the weekly sample is never empty), 1 ≤ p ≤ 18 (CashReturnPrecision — a and 10^p inside the 64-bit magnitudes of the document's rationals, §5), each cash pin's lowest-terms denominator dividing 10^p, and THE BRACKET CHECK (CONFIG, futarchy-system.md §9 C94): for the pin R = a / 10^p at d days — d = 1 for 74, h_w for 75, K for 76 (one snapshot is one calendar day, C96) — and r_c = u / v in lowest terms, (10^p + a)^365 · v^d ≤ (v + u)^d · 10^{365p} < (10^p + a + 1)^365 · v^d, the truncation's two inequalities a / 10^p ≤ (1 + r_c)^{d/365} − 1 < (a + 1) / 10^p raised to the 365th power; it forms no irrational and accepts exactly one a per pin (CashReturnBracket(h) otherwise), and every integer it forms is held to CASH_BRACKET_BITS_MAX = 65 536 bits (2^16), a code constant of the serialization class beside RATIONAL_BITS_CEILING (futarchy-system.md §11 W11), a wider one refusing the document. The cap covers p ≤ 18, d ≤ 366 and any rate within the 64-bit magnitudes: every integer the check forms, accepted pin or not, is below 2^47 149 — (v + u)^d · 10^{365p} below 2^{366 · 65 + 365 · 60} (with u + v < 2^65, 10^18 < 2^60), and (10^p + a + 1)^365 · v^d below 2^{365 · 65 + 366 · 64} (with 10^p + a + 1 < 2^65, v < 2^64) — and the fixture's integers are 14 558, 14 604 and 14 781 bits. Every chain element naming caps_rule carries version 3 (CapsRuleVersionDisagrees otherwise); a version other than 1, 2, 3 or 4 is refused, never read as an earlier one; a v1 or v2 document carrying any of 70–77 is refused as an unknown key.
The v4 document (overlapping epochs — futarchy-system.md §4 "The v4 chain", §9 C110; its chain declared_chain_v4()). A document whose caps_rule (6) is version 4 carries the v3 document's keys and checks unchanged plus carry_scoring_rule (80) and carry_budget_rule (81), both required (CarryRulesMissing), each pair naming a declared version of its rule (CarryScoringRule, CarryBudgetRule); the key count is the v3 count plus two — 47, 48 with payout_cap_vmax (49) under payout_cap_rule v2, one key more with the optional retail_fee_rule (79), 48 or 49; a v1, v2 or v3 document carrying 80 or 81 is refused as an unknown key. Its successor check is B0 v4's overlap admission (the document checks below), and every chain element naming caps_rule carries version 4 (CapsRuleVersionDisagrees otherwise).
The v5 document (the credit economics — futarchy-system.md §4 "The v5 chain", §9 C134–C138; its chain declared_chain_v5(), its risk chain declared_risk_chain_v4()). A document whose caps_rule (6) is version 5 carries the v4 document's keys and checks unchanged plus the eight credit fields 82–89, every one required (CreditFieldsMissing): the three profit shares 82–84 rationals within [0, 1] summing to exactly 1 (ProfitSharesNotOne), grid_fee_fixed (85) and pov_reserve (88) capacity mills, grid_fee_share (86) and liquidation_fee (87) rationals within [0, 1], profit_attribution_rule (89) a rule identity naming a declared version (ProfitAttributionRule); the key count is the v4 count plus eight — 55, 56 with payout_cap_vmax (49) under payout_cap_rule v2, one key more with the optional retail_fee_rule (79), 56 or 57; a v1–v4 document carrying any of 82–89 is refused as an unknown key, and a v5 document lacking one CreditFieldsMissing. Its successor checks are B0 v4's overlap admission unchanged (a v5 successor opens while its predecessor is still live, so no closing balance of the predecessor exists at admission — THE CUSHION CARRY of C138 is RC1's read at the successor's own settlement, risk-engine.md §6, never a document refusal), and every chain element naming caps_rule carries version 5 (CapsRuleVersionDisagrees otherwise). A v4 document decodes and runs unchanged under its own chain; the v5 chain's rows (futarchy-system.md §4 "The v5 chain") are the v4 chain's with B0, B3, B11 and B15 re-declared at their next versions and the allocation stream's v5 layout (§5).
Document checks (before stakes open; a failure refuses the document,
§14): pools[0].index = 1 with sleeve_id null and caps[0] = 1
(w̄_1 = 1); 0 < w̄_i ≤ 1; Σ_i w̄_i ≥ 1 (true by w̄_1 = 1 — "the
feasibility condition is automatically satisfied because w̄_1 = 1" (the 2 October text, cash Q/A) — checked, never assumed); the caps are caps_rule v1's
OUTPUT, checked EQUAL (the equality reading — CONFIG, futarchy-system.md
§9 C20: the 2 October text's ("Objective and constraints") "w̄_i = C_i(·) … fully specified before the
market opens" over the objective note's constraint 2 as a bare
inequality, so that the rule's hash determines the caps field): for each
bookmaker pool with a previous allocation w̄_i = min(bookmaker_cap_max, n · w^I_{i,prev}) (55; constraint 2 under the per-bookmaker ceiling) and
for each without one w̄_i = ε₀ (the bootstrap — ε₀ applies ONLY where
there is no previous allocation, the objective note's own placement; a
previous implemented share is never 0, since every R_i > 0 and Γ_C
leaves every pool positive, so no floor is needed on the first form, and a
RECORDED previous share that is not positive — exactly 0, or a negative one Γ_C cannot produce, were one ever recorded — counts as NO
previous allocation, so the bootstrap ε₀ applies and no bookmaker is
locked out by a required cap of 0 —
C20); ridge_epsilon > 0; shrink_stiffness > 0;
alpha ∈ (0, 1); open_height < close_height; window_blocks ≥ 1; min_distinct_matches ≥ 1 (MatchFloorZero, futarchy-system.md §9 C6 — a floor of 0 would settle a window with no evidence); vault_capacity_mills ≥ 1 (Range(3) — B8 divides by V); field
51 equals the recomputed system hash; Σ_i w̄_i computed exactly over a
common denominator in a 128-bit accumulator, a sum that does not fit being
a typed refusal and never a wrapped value; the transition's product n · w^I_{i,prev} reduced to lowest terms over 128-bit intermediates and
compared by cross-multiplication in 128 bits, a reduced magnitude above 64
bits being the typed refusal TransitionOverflow, never a wrapped value —
the predecessor's capped_share reaching the check keyed by sleeve_id
(the bookmaker's identity across epochs; cash by its null), a magnitude
over 64 bits refused at that input; every rule-identity field named
by exactly one chain element, except the spanning rules — arithmetic_rule
(32) in B2, B3, B4, B8–B15, estimator_rule (42) in B9, B10, B12 (v1/v2; named by no v3 element), and missing_row_rule (17) and returns_rule (43) in B6, B9, B10 and B12 under v1 (B6 records the row; B9, B10 and B12 form R_it and write the zero when they form the matrix; under v2 B6 alone — §3), and caps_rule (6) and previous_allocation_rule (47) in B0 and B11 (B0 checks the caps and reads w^prev; B11 shares the caps rule's no-previous-allocation test over the same recorded capped_share — the ε₀ floor itself is C28, in B11's own text) — under v2 6 in B0, B3 v2 and B11 v2 and 47 in B0 and B3 v2 (B11 v2 reads no w^prev, §3) — each
and fallback_rule (36) in B12 and B13 (B12 writes the fallback's w^M; B13's tax is decided by the rule's version — v2 taxed, with a producer; v1 untaxed, declared), and rounding_rule (37) in B14 and B15 (B14 floors each payout under it; B15's charge bound is v1's) — with ONE hash in every element that carries it (futarchy-system.md §2, §9
C23); the chain is a DAG over the root
streams and names only rule identities the engine implements, one element
per block of futarchy-system.md §4 (and risk_chain one per existing block of
risk-engine.md §3); fields 67 and 68 present exactly when the risk chain names
R5, R6 or R9, 69 when it names R4, 78 when it names R7, 79 only when it names R2 v2 (optional), 80 and 81 exactly when caps_rule is v4 (required there), with t_m ≤ t_l and field 78 shaped as its row states (risk-engine.md §7's key-set rule; a document not naming R7 keeps its bytes); liquidity_buffer_min = 0 under gamma_c_rule v1 (a buffer above 0
is refused HERE, at the document, not after the close — §7); for a
non-genesis document whose caps_rule is 1, 2 or 3 open_height ≥ the predecessor's TERMINAL height — its
epoch_settled, or its epoch_aborted after an allocation — and, after an
aborted successor, ≥ that abort row's height too; close_height > open_height; the registry refusing a successor while the predecessor is
still live (PredecessorLive) — the CEO's ruling that cycles do not overlap on a v1, v2 or v3 chain (futarchy-system.md §3,
§9 R19, C7), replacing the abutting equality close_height = close_height(predecessor) + window_blocks(predecessor), retired before
any epoch ran — and for a caps_rule v4 document B0 v4's OVERLAP
ADMISSION in its place (futarchy-system.md §3, §4 "The v4 chain"; CONFIG
C110): admitted while the predecessor is still live once its allocation
record is recorded, open_height ≥ that record's height
(OpenBeforeAllocation), close_height ≥ the predecessor's deadline
close_height(predecessor) + window_blocks(predecessor)
(CloseBeforeDeadline), a v1–v3 predecessor admitting a v4 successor
under R19 alone, and a v4 predecessor's slot reading live to every
claimant but a v4 claimant its overlap arm admits, until its capital is released (§8b), so a v1–v3 successor of it
is refused PredecessorLive until that release — the predecessor being the epoch
registry's latest epoch with an allocation record and no successor registered yet (read: an OPEN successor leaves the predecessor the answer with its slot Taken; an ALLOCATED successor becomes the answer; futarchy-system.md §3) — a
registered successor that ABORTED before reaching allocation (an unseeded or unfunded pool, or no votes, at its
close) frees the slot, so the lineage never loses
its admissible predecessor; a predecessor's own later abort (too few
matches, an unjudged run) does not unmake the allocation it implemented,
and its successor's caps stand on the recorded capped_share; a GENESIS
document (field 39 the anchor) is admitted only when the registry holds no
epoch THAT COUNTS FOR ADMISSION — a second lineage cannot open beside a live
one; an epoch that aborted before reaching allocation, genesis or
successor, is recorded but does not count, and the replacement genesis
opens at or after its abort height (CONFIG C51, futarchy-system.md §3, §9
— the registry: futarchy::registry, the loader's admit
run before check_transition, the answer rebuilt from the stored epochs
alone as of the opening); a REPLACEMENT
successor (the slot freed by a pre-allocation abort) needs open_height ≥ the aborted successor's abort
height (and, as for any successor, ≥ the predecessor's terminal height under R19) and
close_height > open_height (futarchy-system.md §3);
0 ≤ liquidity_buffer_min ≤ 1 (above 1 the feasible set is empty); v_max ≥ 1 when payout_cap_rule is v2, and absent under v1 (the decoder's two
typed refusals PayoutCapVmaxPresentUnderV1 and
PayoutCapVmaxMissingUnderV2; and, since the version is read from the
chain, PayoutCapRuleUnnamed when no element names field 27 and
PayoutCapRuleVersionUnknown for a version that is neither 1 nor 2 —
never read as v1);
pool_tax ∈ [0, 1); 0 < bookmaker_cap_max ≤ 1; the table's own
inequalities — λ ≥ 0, ρ ∈ (0, 1], min_stake_units ≥ 1, n > 0 (a
zero or negative multiplier would make every grown cap 0, which 0 < w̄_i
refuses), ε₀ ∈ (0, 1] (a new bookmaker's cap IS ε₀, so it must be a
cap), winsor_q95 ≥ 0 (a level on the POSITIVE returns, the objective
note's "Returns") —
performed by check with the rest; 128 ≤ rational_bits_max ≤ MAX_RATIONAL_BITS − 128 (RATIONAL_BITS_CEILING, 8 064) and the pool count at most MAX_POOLS (256 — the two
hardening caps of futarchy-system.md §11 W8–W9, the floor their companion); every
seed_units[i] ≥ min_stake_units (so ≥ 1); seeder ∈ participants; under the document-check version futarchy-system.md §9 C92 declares, seeder ≠ tax_recipient and tax_recipient ∉ participants (PovListed, futarchy-system.md §9 C92) (from the first epoch whose rule chain declares it, every epoch before it carrying no such check unchanged);
tax_recipient present (the decoder's totality — a missing key refuses); the sleeve ids distinct and none 0 (0 is the
envelope's system sleeve, event-catalog §4); every rule identity one the
engine implements — at this phase the set the futarchy crate DECLARES
(futarchy-system.md §4 B0–B15, §6 R0–R2, R2 v2 and R7 v1, v2 with producers, R7's the scheduler's feed fold since gate G8, risk-engine.md §9), the declared set being the
implemented set until a fold block exists. Group rows Aw ≤ b (the objective note, constraint 3) are
not a field under caps_rule v1 (a document carrying them was refused for want of a NUMBER); cap_groups (61) carries them on a v2 document —
Γ_C's behaviour under them is declared (futarchy-system.md §9 R11), gamma_c_rule v2 carries it when a row is given (§15 D7). They are expected — the objective note's own
constraint 3 offers group caps through Aw ≤ b, and its constraint 5 puts
"compliance, solvency, and risk limits" there too, so the refusal is this
document waiting for a rule it knows is coming rather than a claim that none
is needed.
4. Actors, pools, participants and stakes #
- Pools. Outcome
i = 1is CASH — "Reserve outcome 1 for cash and interpret N as the total number of allocation outcomes: cash plus N − 1 actual bookmakers" (the 2 October text, cash Q/A); its implemented sharew^I_1 V"stays in reserve" (the 2 October text, cash Q/A); its bettors "forecast the optimal cash weight and receive pari-mutuel payouts; their stakes do not earn μ₁ directly". Outcomes2..Nare bookmakers, each the owner of ONESleeveId(stream-core'sSleeveId(u32)) under which it quotes in every run of the window — the engine's bookmaker identity across runs. - Participants (the 2 October text's "Active LPs", staking "based on their
forecasts of ŵ*_T"): the chain accounts in
participants. A stake from any other account is refused at the edge (§5). - Stakes.
r_ijis participantj's NET POSITION on pooli— the sum of that participant's stake rows on the pool net of that participant's withdrawals from it — an integer ofmoney_unit;R_i = Σ_j r_ij,R = Σ_i R_i(the futarchy note, "Pool balances and market allocation" — itsS = Σ_i S_i). Every stake ROW is at leastmin_stake_units, and a withdrawal must leave the net position either 0 or at leastmin_stake_units(so the minimum binds positions, not only rows). Every stake is a RECORDED FACT — the chain transaction that moved the asset into the chain's vault, its block height, the participant, the pool, the amount. The engine keeps no balance: "if you mean here by prediction pool, then this is where we have an onchain vault in our blockchain to hold funds of our predictors" (the CEO, §15 D3) — the PREDICTION STAKE VAULT of §1, which the GRID discussion paper separates from the underwriting vault this market allocates. - Seeds, and why an unseeded pool aborts. The seeder's stake of at
least
seed_units[i]on every pool is the 2 October text's ("Initial stakes and allocation") "real initial stakes r_i1 > 0 … positive initial stakes ensure that every pool is funded and settlement odds are defined"; it is an ordinary stake record (it pays out like any other); the 19 October note keeps the requirement as "Stakes cannot be withdrawn. Reallocation must preserve a positive total stake in every outcome" ("Opening and initial stakes", R36). The 2 October text also states the standing requirement "The protocol should require R_i > 0 ∀i until settlement" — and the arithmetic needs it:v_i = ŵ*_i / w^M_idivides byR_i. The engine cannot create a stake, so it cannot repair an unseeded pool: at the close, a pool withR_i = 0aborts the epoch and every net position is returned in full (§6). That refusal is the document's ownseed_units/seederfields doing their work; whether an epoch should instead proceed on the funded pools alone is the CEO's and the economist's call (§15 question 8), and until they say so the abort is the CONFIG default (futarchy-system.md §9 C8 — the live note's question 15, this document's question 8). - Order and close. The epoch log's order IS the SEQUENCER's acceptance
order — "this is FIFO in terms of accepted stake in our sequencer" (the
CEO, §15 D12); the book closes at
close_heightM— "if the cut off window for a prediction market is N time, then we cut off at block M that correlates to N time"; the engine reads FINAL blocks only — "Celestia DA is only the finality layer for our chain to settle its rollup blocks". A stake at a height ≥Mis refused at the edge; a recorded one halts. - Withdrawal exists only under
stake_mobility(56)withdrawals:0 ≤ x_i ≤ r_ij,R_i − x_i > 0, and the net position left is 0 or at leastmin_stake_units(the 2 October text, "Changing bets and withdrawal" — "the protocol should require R_i > 0 ∀i until settlement"), as astake_withdrawnrecord citing the chain's refund entry; "does not allow withdrawals after close" (the 2 October text, "Collateral and Accounting") — a withdrawal at height ≥Mis refused. RULED by the CEO, 2026-10-13: "A person can rebalance their votes, but pulling out is generally prohibited" — a MOVE between pools is allowed, an exit is not. The move is the note's pure reallocation:xleaves the source pooliunder the bounds above (0 ≤ x ≤ r_ij,R_i − x > 0, the position left 0 or at leastmin_stake_units) and the samexenters the target poolkunder the stake rules above — read (CONFIG): as a stake ROW,x ≥ min_stake_units, onto a pool that already has its first row (a move never seeds a pool), and the seeder's position on a pool never falls belowseed_units[i](v1; RETIRED on a v2 document — futarchy-system.md §9 C12, R36: initial stakes follow the same rules as later stakes) by a move or a withdrawal (the seed is the pool's floor; its hook the 2 October text's design choice ("Important Design Choices") "minimum seed balances and treatment of empty pools", a choice the 19 October note decides against a floor ("Opening and initial stakes", R36) — that text bounds a withdrawal by0 ≤ x ≤ r_ijandR_i − x > 0and its pure reallocation ("Changing bets and withdrawal") adds no other bound, so both readings are STRICTER than the note, and under the floor the seeds are not "freely reallocatable", leaving the note's consistency assumption 6 on "negligible relative to equilibrium market depth") — sor_ij' = r_ij − x,r_kj' = r_kj + x,R_i' = R_i − x,R_k' = R_k + xandR' = R; the raw shares move byx/Rfromitokandw^I = Γ_C(w^M')is re-applied after the move (§7). It is ONEstake_movedrecord {participant,from_pool,to_pool,amount,tx_id,height} folded atomically, paid at settlement as the positions it left —r_ij − xoni,r_kj + xonk(§12). "Generally prohibited" is read with no exception (CONFIG): an exit before the close is refused outright. The row and the three-waystake_mobilityfield (56; 30 retired) have a producer (futarchy-system.md §5, §9 C12 and R16); the refund and payout order is each position's FIRST row of any kind — a position born by a move takes the move's offset, a position drained to 0 keeps its first offset.
5. The epoch log and the allocation stream #
Two streams, two writers (one writer per stream — the stream law).
The epoch log (ROOT, one per epoch, fsync-before-ack, event-catalog §5):
its one writer is the epoch gateway, an impure edge component (⚠ in the
DAG) that (a) records the operator's two actions and (b) tails the partner
chain's FINAL blocks for stakes into the vault — a partner feed, so it owes
data-conformance (both tiers) and the security review when a parser exists. Its
records (grouped by kind, not by append order — a run_included row can
only follow the close, as its own column says):
| Record | Body | Appended when |
|---|---|---|
epoch_opened |
epoch_id (= BLAKE3 of the document's canonical bytes — the hash IS the id, never a second field), system_hash (the document's field 51, repeated on the wire — CLAUDE.md law 8(b)), document_len, gateway_hash |
once, first — the operator opens the epoch through the config loader (futarchy-system.md §7 E1); a second one is corrupted history |
run_included |
run_id, the run manifest's hash (one value, two fields — run_id IS the frozen manifest's hash, state-layers §11; a row whose two ids disagree halts the fold), its allocation_ref (§8), height — the latest final height recorded when the operator included it (the window of §9 places a run by this height) |
after allocation only — the operator includes a run whose manifest cites this epoch's allocation record; a manifest citing another epoch or record, an unlisted sleeve, or a ceiling other than V_i is refused |
block_final |
height, the block's hash |
every final block from open_height through the first final above the grace end (close_height + window_blocks + verification_grace_blocks + 1), where the unjudged abort is decided (futarchy-system.md §9 C37), in height order with NO GAP — the first row's height is open_height and each later row is its predecessor's + 1, so the close at M, the deadline, the grace end and the decision final after it are observed even when no stake or inclusion arrives after them. The reader stops at that decision final: the epoch needs no later height |
stake_recorded |
participant, pool, amount, tx_id, height |
a final block carries a stake into the vault from a listed participant on a listed pool, amount ≥ min_stake_units, height < M; the FIRST row on every pool must be the seeder's of at least seed_units[i] (the 2 October text: "the first participant supplies real initial stakes" (the 19 October note: "The first futarchist … supplies a positive initial stake to every outcome")) — an earlier non-seed stake is refused |
run_verdict |
run_id, verdict (verified or failed), the harness's report hash (CONFIG default: verify::report_hash — BLAKE3 over the domain tag fullhouse:report_hash:v1 then, in file-name order, each len(name) (u64 BE) ‖ name ‖ records (u64 BE) ‖ end_hash — until the harness's verified-run record is specified further; futarchy-system.md §9 C34), height |
the determinism harness's verified-run record arrives for an included run (state-layers §11 Verified / Failed); the gateway records it so the window (§9) depends on a recorded fact, never on harness timing. Re-checked by the fold as run_included is : a run_included row for the run precedes it, one verdict per run (under window_rule v4, B7 v5, a second row for a run only after its failed rows — the rebuilt record's verdict — and a row after a verified one halts VerdictDuplicate; under v2 and v3 any second row halts), height = the latest final height recorded before it, the envelope's replay_ts its height (§14) |
stake_withdrawn |
participant, pool, amount, tx_id, height |
only under stake_mobility withdrawals; the bounds of §4; height < M |
stake_moved |
participant, from_pool, to_pool, amount, tx_id, height |
under stake_mobility moves or withdrawals; from_pool ≠ to_pool, both listed; §4's bounds on both pools — the withdrawal bounds on the source, the stake-row rule on the destination, the seed floor; the tx_id unique across the four row kinds (the top-up's, risk-engine.md §8); height < M |
desk_topup |
pool, amount, tx_id, height |
a final block carries a desk's own-capital deposit; any height from the close through the window's terminal — h* at a close, g (B7's abort height, the first final at or above the grace end, futarchy-system.md §9 C37) at an abort, the abort DECIDED only by the final above g, admitted in Implemented at heights at or above M (risk-engine.md §4, §11) |
The stake_moved row follows the CEO's ruling that votes move but never leave (§4; futarchy-system.md §9 R16).
Refused at the edge — never appended — and a typed halt if ever recorded
(§14): a stake from an unlisted participant or on an unlisted pool, below
the minimum, at height ≥ M, below open_height, ahead of the latest recorded final block, repeating a tx_id, or a non-seed first row on a pool; a
withdrawal under a stake_mobility other than withdrawals, beyond the position, zeroing the pool, leaving dust, or taking the seeder's position below its seed; a
move under none, from an unlisted participant, below open_height, at height ≥ M or ahead of the latest final block, repeating a tx_id, onto the same pool, on an unlisted pool, beyond the position, zeroing the source pool, leaving dust, below the minimum, onto a pool before its first row, or taking the seeder's position below its seed; a
run_included whose manifest fails §8's check.
The chain reader's four feed rules (the partner-feed obligations D12
brings with it — "an external feed with its own conformance checks and a
finality rule"): (1) FINALITY — only blocks the chain reports final are
read, so a re-org below the finality depth cannot change what is already
recorded; a chain that reports a different hash for an already-recorded
height is a feed violation and halts the epoch (§14), never a rewrite —
history only grows (the stream law). (2) CONTIGUITY — heights are
consecutive with no gap, so "every final block" is checkable from the log
itself rather than trusted; a gap refuses at the edge, and a reader that
cannot reach a height does not append past it. (3) ONE READER — the
gateway is the log's only writer, so a stake reaches the log once. The
finality depth and the chain's own conformance checks are the feed's, named
in the epoch document's chain_feed_rule, whose declared text fixes the
depth; data-conformance (both
tiers) and the security review gate the reader when a parser exists.
The FOURTH rule : a block's block_final row precedes
the stake, withdrawal, move and top-up rows of that block (risk-engine.md §8) — a stake at a height above the
latest recorded final height, or below open_height, is refused — and a
tx_id appears at most once in an epoch's log (a replayed row is refused,
never counted twice).
The allocation stream (DERIVED, recomputable, written by the allocation fold — one fold per epoch, consuming the epoch log and, after inclusion, each included run's sealed lifecycle, market-event and settlement streams and its manifest):
| Record | Body | Emitted on |
|---|---|---|
document_checked |
epoch_id, system_hash, the field count, the chain length |
the fold's first row, on epoch_opened: the stored document re-passes every §3 check and both hashes recompute (futarchy-system.md §4 B0); a failure is corrupted history |
book_closed |
the pool totals R_i (integers), R, the stake count, the last admitted record's offset |
the first block_final with height ≥ M, every pool SEEDED (its first row the seeder's of at least seed_units[i]) and every R_i > 0; and at least one vote (a position above zero not the seeder's); otherwise epoch_aborted{pool_unseeded}, {pool_unfunded} or {no_votes} instead; stake_count counts stake rows (not withdrawals or moves), last_admitted_offset is the offset of the last stake, withdrawal OR move row admitted |
raw_share |
w^M_i rationals |
after book_closed (§7, B2) |
capped_share |
w^I_i rationals, the binding set B_bind; v2 (BUILT as gamma_c_v2, task 143 step 3b): the adjusted weights w BEFORE the floor (the note's w^I is B4's V_i / V), b_i per pool (cash 1), the binding set (step 1's clips), the protected groups in processing order, exhausted when the budget ran out (C72) |
after raw_share (§7, B3) |
allocation |
the integer capacities V_i (mills, Σ = V), epoch_id; v2 (BUILT as capacity_rounding_v2, task 143 step 3b): the same with outcome — 0 computed, 1 fallback, no reason field (the catalog's body) |
immediately after capped_share (§7, B4) — the record every manifest of the window cites |
return_observed |
run_id, match_ids, per pool i ≥ 2: pnl_i, capital_i, drawn_i (integers, mills) or missing; the collateral-ticks beside |
an included run's run_verdict{Verified} row is in the epoch log — one row per such verdict in verdict order, stamped with the verdict's height, read from the run's three sealed streams at its run-sealed offset (§9; futarchy-system.md §4 B6) |
margin_called |
pool, loss, base |
a pool's loss reaches margin_trigger of its own capital at a return_observed row — directly after that row, in the allocation stream's one total order (the triggering row's log position, pool ascending, the kind order — risk-engine.md §4 R5, §11) |
margin_cleared |
pool, loss |
a desk_topup or return_observed row brings a margin-called pool's loss below the trigger — a verdict's directly after its return_observed row, a top-up's at the top-up's log position (risk-engine.md §4 R5, §11) |
liquidated |
pool, loss, base |
a pool's loss reaches liquidation_trigger of its own capital — after the pool's margin_called of the same row when both trip (risk-engine.md §4 R6, §11) |
defaulted |
pool, loss, base |
a pool's loss reaches its own capital — after the pool's liquidated of the same row when both trip (risk-engine.md §4 R6b, §11) |
window_closed |
the included run_ids in D_T, the failed run_ids (empty at every close under window_rule v4), K, the distinct-match count (over D_T only), the deadline height |
the window rule of §9 is met: at h*, the smallest final height at or above the deadline at which every included run has its run_verdict row of height ≤ h* (the height reading, futarchy-system.md §9 C37; under window_rule v4 its verified row, a run whose latest row is failed keeping the window pending — futarchy-system.md §9 C99), and no later than the grace end; stamped h*, its offset after every return_observed row; below min_distinct_matches, epoch_aborted{too_few_matches} instead (until the replacing B7 version, futarchy-system.md §9 R52) — under B7 v4 and v5 (B7 v5 the v3 chain's) a window below min_distinct_matches closes with the count reported and B12 v3 settles on the fallback (futarchy-system.md §9 C93); the abort clause is B7 v2/v3's; an included run still without a verdict row at the grace end, epoch_aborted{run_unjudged} instead (the first such run named; decided at the first final above the grace end — C37); under window_rule v4 an included run whose latest row there is failed, epoch_aborted{run_unrecovered} instead (futarchy-system.md §9 C99) |
balance_series |
per bookmaker pool per snapshot k = 0 … K (the opening snapshot at k = 0, interval k's close at k ≥ 1): B, U^peak, F^own, F^credit, η, R^bal (exact rationals, capacity mills) — BUILT as fold_balance_series (task 143 step 3c), in the v2 chain (chain::declared_chain_v2, task 143 step 3j-1) and folded by the composition's v2 branch (fold_to_settlement, task 143 step 3j-2); v2 (B6b v2, the v3 chain): the same rows with R^bal on B̃, per row weekly_return present iff k ≥ h_w, and per pool with a series one monthly_return (§9) |
after window_closed (§9, B6b) |
utilization |
per NON-CASH pool, ascending: PEAK — u_{i,T} (rational, as measured, above 1 possible) and the run that set its peak (the first in D_T order on a tie) — or NONE, no number and no run, for a pool no run of D_T observed (futarchy-system.md §9 C39; for B11 a NONE row is u = 0); v2 (BUILT as fold_utilization_v2, task 143 step 3d): per non-cash pool e^util = max_k η_{i,k} / ρ and peak_used = max_k U^peak_{i,k} (mills) over the balance series, a pool with no series (0, 0) — §10, event-catalog §6.17 |
after window_closed, stamped its h* at the next offset (§9, B8) |
winsorized |
the hash of the K × N winsorized matrix over C41's preimage (futarchy-system.md §9), K, and per document pool — cash first — observed_runs T_i (cash's K, C40); v2 (BUILT as fold_winsorized_v2, task 143 step 3e): the winsorized and the raw matrices' hashes over the intervals k = 1 … K, K, and per document pool — cash first — the threshold q95_i (cash 0), T_i not carried — §10, event-catalog §6.17 |
after utilization, stamped the window's h* at the next offset (§10, B9) — v1/v2 chains only; no v3 block writes it |
estimate |
the winsorized matrix's hash re-stated (C41; under v2 winsorized/v2's matrix_hash), and EITHER per document pool — cash first — mu_hat μ̂_i (rational, either sign) and observed_runs T_i (cash's K; under v2 the pool's recorded snapshots — K surviving, the last snapshot wiped-out, K for no series — C56; v2 BUILT as fold_estimate_v2, task 143 step 3f), OR exhausted — the rational_bits_max a sum, mean, δ or μ̂ would exceed, honest data the budget cannot carry, which B12 reads as a budget exhaustion (futarchy-system.md §9 C44) |
after winsorized, stamped the window's h* at the next offset (§10, B10) — v1/v2 chains only; no v3 block writes it |
feasible_set |
per document pool — cash first — upper (rational: min(w̄_i, cap^util_i), cash w̄_1) and lower (rational: b̲ on cash, 0 elsewhere) — the bounds of F_T^util; the decoder holds rows ascending and at least one, lower ≤ upper, both within [0, 1] |
after estimate (an exhausted one included), stamped the window's h* at the next offset (§10, B11); on a v3 epoch after utilization (the v3 layout below) |
settlement |
weights ŵ* (rationals, one per document pool, cash first, each within [0, 1]), zeta ζ (rational, either sign — recorded because the certificate's stationarity conditions are over (w, ζ, z) and cannot be re-checked without it; z_k := max(0, L^(k)(ŵ*) − ζ) follows from it and the matrix), active_set (ascending distinct indices of the constraint ENUMERATION — futarchy-system.md §9 C46: lower bounds, upper bounds, z_k ≥ 0, the tail constraints; the equality's multiplier ν is NOT recorded, the verifier derives it at the cash coordinate), multipliers (rationals, one per active index, each ≥ 0), steps_used, bits_max_used; OR weights = w^M with exhausted (steps or bits) — the presence of the key is fallback: true; v3 (settlement/v3, B12 v3): zetas — one ζ_t per CVaR term, daily then weekly — in place of zeta, the active set over the enumeration v3 (futarchy-system.md §9 C46), and exhausted also sparse (C93) |
the optimizer returns or exhausts a budget (§11); stamped the window's h* at the offset after feasible_set (the solver's stamp) |
pool_liability |
per pool v_i, v'_i after the cap, the liability (1 − τ_pool) R_i v'_i, T_tax, cap_residue — exact rationals, nothing rounded here (futarchy-system.md §9 C48) |
after settlement (§12, B13) |
stake_payout |
one per NET POSITION (a participant's stakes on a pool net of that participant's withdrawals and moves) in B1's first-row order: {participant, pool, amount = ⌊r_ij P_i / R_i⌋} — the refund's shape, one floor per payout (futarchy-system.md §9 C49) |
after pool_liability, the ℓ-th at + 7 + ℓ (§12, B14) |
participation_yield |
{participant, amount = Y_j} per participant with Y_j > 0, in the order of each participant's first appearance in B1's position list, the seeder among them, money_unit — MINTED 1_000_054, BUILT as a function (task 143 step 3i) |
after the last stake_payout, before epoch_settled, the j-th at first_seq + j (§12, B14b) |
epoch_settled |
{tax_amount = ⌊T_tax⌋, cap_residue = ⌊cap_residue⌋, rounding_charge, payouts_total} — four u64 re-adding to R; the floors B15's, once; no account (tax_recipient is the document's) (futarchy-system.md §9 C50) |
after the m payouts, at + 7 + m (§12, B15) |
epoch_aborted |
reason: pool_unseeded{pool}, pool_unfunded{pool}, no_votes, too_few_matches{distinct, floor}, run_unjudged{run_id} or, under B7 v5 alone, run_unrecovered{run_id}; refunds[] of {participant, pool, amount} — every NET position returned in full, in the order of each position's first row of any kind |
at the close, when a pool's seed is missing or short, any pool stands at R_i = 0, or no position above zero is held by anyone but the seeder (§4, §6); or at the window's close, when fewer than min_distinct_matches distinct matches were observed, or an included run still has no run_verdict row at the grace end, decided at the first final above it (§9, C37); under B7 v4 and v5 (B7 v5 the v3 chain's) a window below min_distinct_matches closes with the count reported and B12 v3 settles on the fallback (futarchy-system.md §9 C93); the abort clause is B7 v2/v3's; under B7 v5 an included run whose latest verdict row at the grace end is failed aborts as run_unrecovered (futarchy-system.md §9 C99); the record is epoch_aborted/v1 on the v1 and v2 chains and epoch_aborted/v2 on the v3 chain, written by B1 v2 and B7 v5 (event-catalog §6.17) |
Rationals on the wire are {0: sign, 1: num, 2: den} — sign the
unsigned integer 0 (non-negative) or 1 (negative), num and den
big-endian byte-string magnitudes with no leading zero byte, zero spelled
as the EMPTY num with sign 0, den ≥ 1, the pair in lowest terms —
one encoding per value, as event-catalog §3 rule 5 requires
(that section's "no bignums" names the CBOR bignum tags 2 and 3; a declared
byte-string field carrying an arbitrary-precision integer is not a tag, and
byte strings are among its allowed types). The same form carries the
document's rationals (§3, where every magnitude fits 64 bits); on the
STREAM the magnitudes of estimate and settlement may exceed 64 bits
(the optimizer's outputs), and every quantity that is not a rational is an
integer. Schema ids: the six epoch-log records and document_checked, book_closed,
raw_share, capped_share, allocation, epoch_aborted,
return_observed (1_000_042) (B6) and the
seventh epoch-log record stake_moved (1_000_043), and
window_closed (1_000_044) (B7) and
utilization (1_000_045) (B8) and
winsorized (1_000_046) (B9 — v1/v2 only) and
estimate (1_000_047) (B10 — v1/v2 only) and
feasible_set (1_000_048) (B11) and
settlement (1_000_049) (B12's record with
its first declared consumer, the certificate's verifier) and pool_liability
(1_000_050) (B13) and stake_payout
(1_000_051) (B14 — its first producer extending
the reserved region to ..=1_000_052) and epoch_settled (1_000_052) (B15 — the v1 region's last id)
(1_000_030..=1_000_052 the v1 region; capped_share/v2 1_000_055 and allocation/v2 1_000_056 MINTED by B3 v2 and B4 v2 (task 143 step 3b), balance_series/v1 1_000_053 by B6b (step 3c), utilization/v2 1_000_057 by B8 v3 (step 3d), winsorized/v2 1_000_058 by B9 v2 (step 3e), feasible_set/v2 1_000_059 by B11 v2 (step 3g), settlement/v2 1_000_060 by B12 v2 (step 3h) and participation_yield/v1 1_000_054 by B14b (step 3i) — the extension complete, C61; run_included/v2 1_000_068 past the risk engine's 1_000_061..=1_000_067 (B5 v3; those seven minted by their first producers, risk-engine.md §11); the v3 layout's records balance_series/v2 1_000_069 (B6b v2) and settlement/v3 1_000_070 (B12 v3), each by its first producer, and epoch_aborted/v2 1_000_072 (B1 v2 and B7 v5, the v3 chain's one abort record; 1_000_071 unminted); event-catalog §6.16–§6.17, §7 rule 4 — an id
mints with the first producer or the first declared consumer); every record
of the v1 chain is minted.
The v2 records and their offsets (the ids of capped_share/v2, allocation/v2, balance_series/v1, participation_yield/v1, utilization/v2, winsorized/v2, feasible_set/v2 and settlement/v2 MINTED, task 143 steps 3b–3i, their offsets with the v2 chain — B12 v2 stamps settlement/v2 at window_seq + 6 already and B14b stamps its rows from the first_seq the composition supplies — futarchy-system.md §4 B6b, B14b, §9 C61): balance_series/v1 (1_000_053) after window_closed; participation_yield/v1 (1_000_054) after the last stake_payout and before epoch_settled; capped_share/v2, allocation/v2, utilization/v2, winsorized/v2, feasible_set/v2, settlement/v2 (1_000_055–1_000_060) in their blocks' places. The settling layout from window_closed at window_seq becomes: balance_series at +1, utilization +2, winsorized +3, estimate +4, feasible_set +5, settlement +6, pool_liability +7, the m payouts at +8 + ℓ, the Y yield rows at +8 + m + j, epoch_settled at +8 + m + Y (BUILT: these are chain::Layout::V2's fields — the layout table, the one home of the offsets, which the composition hands every block it stamps and the registry's walker reads, task 143 steps 3j-1 and 3j-2 — and the composition stamps these places on a v2 epoch, B14b's first row at the layout's yield_first(m); the v1 offsets of this section and of futarchy-system.md §9 C49–C50 are Layout::V1's).
The v3 records and their offsets (futarchy-system.md §4 B6b, B12; event-catalog §6.17): balance_series/v2 (1_000_069) and settlement/v3 (1_000_070), and epoch_aborted/v2 1_000_072 (B1 v2 and B7 v5, the v3 chain's one abort record; 1_000_071 unminted); winsorized and estimate are written by no v3 block. The settling layout from window_closed at window_seq on a v3 epoch (chain::Layout::V3): balance_series/v2 at +1, utilization/v2 +2, feasible_set/v2 +3, settlement/v3 +4, pool_liability +5, the m payouts at +6 + ℓ, the Y yield rows at +6 + m + j, epoch_settled at +6 + m + Y. On a caps_rule v5 epoch (chain::Layout::V5) the layout is the v3 layout through the yield rows, then the credit-economics chain's 6n rows BLOCK-MAJOR — every bookmaker pool's desk_period_result (RC1), then every pool's liquidation_fee (RC2), profit_split (RC3), loss_waterfall (RC4), grid_fee (RC5), desk_account (RC6), the pools ascending inside each block, n the document's bookmaker pools — at +6 + m + Y + r (r = 0 … 6n − 1), and epoch_settled at +6 + m + Y + 6n (futarchy-system.md §4 "The v5 chain", B15 v5; event-catalog §6.17). Under a document whose risk chain names R5–R6b (the v3 document's) the desk records stand among B6's rows in the one total order, so every later record's offset — return_observed row k, window_closed's window_seq and every window-derived offset above — is its layout offset shifted by the desk records before it, the composition's layout assigning it, the window-derived records keeping their relative order (risk-engine.md §11).
6. The epoch state machine #
State is the fold of the two streams above (state-layers, the state law); every transition names its record.
stateDiagram-v2
[*] --> Declared: epoch_opened / document_checked
Declared --> Declared: block_final
Declared --> Open: stake_recorded
Open --> Open: stake_recorded / stake_withdrawn / stake_moved / block_final
Declared --> Aborted: epoch_aborted
Open --> Aborted: epoch_aborted
Open --> Closed: book_closed
Closed --> Implemented: raw_share / capped_share / allocation
Implemented --> Implemented: run_included / run_verdict / return_observed / block_final / desk_topup / margin_called / margin_cleared / liquidated / defaulted
Implemented --> Observed: window_closed
Implemented --> Aborted: epoch_aborted
Observed --> Settled: balance_series / utilization / [winsorized / estimate — v1/v2] / feasible_set / settlement / pool_liability / stake_payout / participation_yield / epoch_settled
Settled --> [*]
Aborted --> [*]
Diagram source
stateDiagram-v2
[*] --> Declared: epoch_opened / document_checked
Declared --> Declared: block_final
Declared --> Open: stake_recorded
Open --> Open: stake_recorded / stake_withdrawn / stake_moved / block_final
Declared --> Aborted: epoch_aborted
Open --> Aborted: epoch_aborted
Open --> Closed: book_closed
Closed --> Implemented: raw_share / capped_share / allocation
Implemented --> Implemented: run_included / run_verdict / return_observed / block_final / desk_topup / margin_called / margin_cleared / liquidated / defaulted
Implemented --> Observed: window_closed
Implemented --> Aborted: epoch_aborted
Observed --> Settled: balance_series / utilization / [winsorized / estimate — v1/v2] / feasible_set / settlement / pool_liability / stake_payout / participation_yield / epoch_settled
Settled --> [*]
Aborted --> [*]Every arrow names the records that cause it, and the conditions are these.
epoch_opened carries the document's hash and its system hash, the document
having passed §3's checks, which the fold re-runs as document_checked
(futarchy-system.md §4 B0). block_final repeats through the window's
deadline and grace, the heights contiguous from open_height.
stake_withdrawn appears only under stake_mobility withdrawals,
stake_moved under moves or withdrawals, both within §4's bounds. The
book CLOSES on the first block_final at or above M with every pool seeded
and positive and at least one vote; if any pool is unseeded (no row at
all) or short of seed_units[i] (the seeder's first row below it),
epoch_aborted{pool_unseeded} is emitted instead, naming the LOWEST-INDEX
failing pool, and epoch_aborted{pool_unfunded} for a seeded pool at R_i = 0 there (a defensive arm — the seed is at least min_stake_units ≥ 1
and a withdrawal or move that would zero a pool halts, so no legal log reaches it),
and epoch_aborted{no_votes} when every position above zero is the seeder's (R20; C8's state reading, CONFIG — a seeder's top-up is not a vote, a voter who fully withdrew holds none); every net position returned in full in the order of its first row of any kind; a first row that is NOT the
seeder's is not an abort but corrupted history — the edge refuses it
(event-catalog §6.16) and the fold halts on a recorded one (§14).
raw_share, capped_share and allocation compute w^M, w^I and the
capacities V_i (§7), which the window's run manifests then cite (§8).
desk_topup is admitted in Implemented at heights at or above M (risk-engine.md §4).
run_included and run_verdict repeat once per run (under window_rule v4 a recovered run has two run_verdict rows, failed then the rebuilt record's verified), and return_observed once per Verified verdict in verdict order, until
the window's deadline (§9); at the close instant — the first final at or above the deadline
by whose height every included run has its verdict row (futarchy-system.md §9 C37; under window_rule v4 its Verified row, a Failed row keeping the window pending until the rebuilt record's Verified row — futarchy-system.md §9 C99), and no later than the grace end — window_closed is appended, or
epoch_aborted{too_few_matches} when fewer than min_distinct_matches
distinct matches were observed (retired from the first epoch whose rule chain declares the replacing B7 version, once that version is declared with the economist's sparse-evidence rule — futarchy-system.md §9 R52, C6, C8; every epoch before it aborts as written — under B7 v4 and v5 (B7 v5 the v3 chain's) a window below min_distinct_matches closes with the count reported and B12 v3 settles on the fallback (futarchy-system.md §9 C93); the abort clause is B7 v2/v3's), or epoch_aborted{run_unjudged} when an
included run still has no run_verdict row at the grace end (decided at the first final above it — futarchy-system.md §9 C37), or, under window_rule v4, epoch_aborted{run_unrecovered} when an included run's latest verdict row there is failed (futarchy-system.md §9 C99). The settling step appends, under a v2 document, balance_series (B6b — in the v2 chain (chain::declared_chain_v2, task 143 step 3j-1) and folded by the composition's v2 branch (fold_to_settlement, task 143 step 3j-2)), utilization,
winsorized, estimate, feasible_set, then settlement (the optimizer's
output or the fallback, §11), pool_liability, one stake_payout per net
position, under a v2 document the participation_yield rows (B14b — task 143 step 3i, in the v2 chain (chain::declared_chain_v2, task 143 step 3j-1) and folded by the composition's v2 branch (fold_to_settlement, task 143 step 3j-2)), then epoch_settled. Under a v3 document the settling step appends balance_series/v2, utilization, feasible_set, settlement/v3, pool_liability, the payouts, the participation_yield rows, then epoch_settled — no winsorized, no estimate (§5's v3 layout).
A second epoch_opened, or any refusal of §14 found in the log, is
corrupted history: a typed halt, never a guess (a stake row carries no
epoch field — the log it sits in IS its epoch, so "citing another epoch"
is not a case). A log that has not reached the close is not corrupted
history: the fold yields document_checked alone — a Declared or Open
epoch at that offset (state-layers §12).
7. The raw allocation and the constraint-adjustment map #
The raw market allocation (the futarchy note, "Pool balances and market allocation"):
w^M_i = R_i / R, an exact rational never materialized rounded;Σ_i w^M_i = 1;w^Mneed not satisfy the caps.
Γ_C — the implemented allocation (the futarchy note, "Constraint adjustment" and "Implemented allocation redistribution procedure"), gamma_c_rule v2 and caps_rule v2, BUILT as gamma_c_v2 (task 143 step 3b), in the v2 chain (chain::declared_chain_v2, task 143 step 3j-1; folded in the first segment on the document's version): the note's procedure as written, in exact rationals, over w = w^M(t_2). (gamma_c_rule v1 — the proportional capping over the pinned box caps of the 2 October text, the v1 chain's version — had no group, leverage or cash-minimum step; a document with b̲ > 0 was refused under it.)
- Individual limits. For every bookmaker pool
b_i = min(c_1, G_i, L E_i / V), withG_i = g w^prev_iifw^prev_i > 0, elsemax(e, u^prev_i / V)(w^prevthe predecessor's IMPLEMENTEDw^I,previous_allocation_rule— its recordedcapped_sharefor a v1 predecessor, whoseu^prev_iis itsutilizationrow'su_i · V_prev, C71; for a v2 predecessorallocation/v2'sV_i / V_previn lowest terms, 0 for every bookmaker underoutcome = fallback(read by the registry's walker, task 143 step 3j-1; the v1 share pre-floor, the v2 share the floored one — futarchy-system.md §9 C73);u^prev_ithe predecessor's peak used capital in MILLS, futarchy-system.md §9 C55 — 0 at a genesis or for a pool new to the document, so such a pool's cap ise);E_i = own_capital_i(58),V = vault_capacity_mills(3),L = leverage_max(62),c_1 = cap_single(60),g = growth_multiplier(7),e = bootstrap_cap(8). Every weight aboveb_iis reduced tob_i; the released allocation is pooled and redistributed by step 3 among the remaining eligible pools and cash. - Group limits (
cap_groups61). A list of protected groups, initially empty. Sort the bookmaker weights descending, ties by document index ascending (the note's "published index"); check the largest two, three and five (a size above the bookmaker count skipped), in that order. For the first groupAabove its cap,H_A = Σ_{i∈A} w_i, reducew_i' = w_i c_|A| / H_Afori ∈ A; addAto the protected list; redistributeH_A − c_|A|outsideAby step 3. Re-sort and repeat until every checked sum satisfies its cap — the note: "These checks cover every group of those sizes"; a protected group cannot become violated again. - Proportional redistribution. Fix reference weights
q_i= the recipient weights at the START of this redistribution, unchanged until it completes (the note: "Keep these reference weights unchanged until that redistribution is complete"). Eligible recipients haveq_i > 0and are cash or a bookmaker with remaining individual capacity, the releasing group excluded — and, CONFIG C72 (the engine's reading, not the note's text), the members of a protected group already at its cap excluded from the start: the note stops them at the first repetition with nothing moved, so the weights are the same and one unit fewer is spent. Increase eligible weights in proportion toq_iuntil the released amount is exhausted, an individual limit binds (that recipient stops), or a protected group reaches its cap (its eligible members stop); apply simultaneous limits together; redistribute the remainder among the rest; cash has no upper cap; with no eligible positive-weight recipient the remainder goes to cash. - The cash minimum (
cash_min59). Ifw_0 < c_cafter steps 1–3 (w_0the note's cash index — this document's pool 1):w_i' = w_i (1 − c_c)/(1 − w_0)for every bookmaker andw_0' = c_c; no redistribution follows. - Precision and verification — B4,
capacity_rounding_rulev2, below: the floor toDunits, then the verification of the floored allocation, the all-cash fallback on a failure or onstep_budget(33) exhaustion — Γ_C counts its passes against the same field the optimizer counts its pivots against (the field's row, §3) — CONFIG C72: step 1 one unit, each group pass that moves weight one, each redistribution repetition one; the check that finds no violated group and no remainder is not a pass; exhaustion fires when a pass is needed and none remains (thestep_budget + 1-th pass, C47 (g)'s convention), and when any step's rationals leaverational_bits_max(34) — the bounds' own formation, the cash minimum and the remainder-to-cash step included; the note's computational budget covers both, so an overrun is the all-cash allocation, never a halt on an otherwise valid input, the record's weights and bounds as they stand when the overrun is found (a bound not yet formed 0); the exhaustedcapped_share/v2carries the weights at the stop besideexhausted— off the simplex, honest data B4 ignores (the simplex tap of §14 applies to a record without the flag); exhausting it IS the all-cash allocation — the note's rule, with no derived pass count in front of it.
The ex-ante procedure carries no utilisation cap: the note's Overview lists "Utilisation" among the constraints as "Proposed; not yet specified or added". The passes are finite — each group pass protects a new group among the finitely many subsets of sizes 2, 3 and 5 (a protected pair does not stop another pair from violating after a redistribution, so the count is not N + 3), each individual pass caps a new pool — and the budget, not a derived count, is what the engine enforces: its exhaustion is the all-cash allocation, the backstop the note asks for ("a deterministic operation or iteration budget").
The note's example, re-derived. w^M = (0.50, 0.30, 0.20) on three bookmakers with c_1 = 0.40 and no other limit binding, w_0 = 0, c_c = 0: step 1 caps the first bookmaker at 0.40 and releases 0.10; step 3's reference weights are (0.30, 0.20) (cash at 0 is not eligible), so the release spreads 3 : 2 — 0.30 + 0.06 = 0.36, 0.20 + 0.04 = 0.24; no group cap is listed; w^I = (0.40, 0.36, 0.24), the note's result ("Constraints on implementation (allowed allocations)" — the note's illustration uses a 40 % limit, not its parameter c_1 = 1/10, R30). The 2 October example (0.60, 0.25, 0.15) under caps (0.40, 0.50, 0.50) → (0.40, 0.375, 0.225) (the 2 October text, "Constraint adjustment of the market allocation") is step 1 with that text's per-pool caps in place of the uniform c_1 (0.375 and 0.225 stay below 0.40, so c_1 = 0.40 gives the same result) and the same step 3 with cash at 0 (in this document's indexing cash is pool 1; the examples' pools are bookmakers).
Integer capacities — one rounding, then verification (capacity_rounding_rule
v2; v1 was the floor alone). The economist's own line (§15) fixes it: one rounding, with the
leftover to cash; the note's D step is the same floor — "round each final BM weight down and assign the remainder to cash" — with D = allocation_precision (63), default vault_capacity_mills: units_i = ⌊w_i D⌋ (w the adjusted weights after the cash minimum — the note's w^I_i = ⌊D w_i⌋ / D is V_i / V) and V_i = units_i · V / D for every bookmaker (D divides V, PrecisionGrid), the D = V default the floor to mills below. So every pool is floored and ALL the leftover goes to
cash:
V_i = ⌊w_i · V⌋for everyi, thenV_1 := V_1 + (V − Σ_i ⌊w_i V⌋)— theD = Vcase over the adjusted weightsw(v1 wrotew^Ifor the capped share it floored; under v2w^Iis the flooredV_i / V).
Cash absorbs the whole remainder, which it always can: its cap is w̄_1 = 1,
so V_1 ≤ V is never violated. Hence Σ_i V_i = V exactly, every
V_i ≤ ⌊w̄_i V⌋, and the rule needs no tie order at all — two observers
cannot disagree about which pool received a spare mill. Instance:
V = 1 000 000 on the example above gives (400 000, 375 000, 225 000)
exactly (the example's capped pool 1 is a bookmaker; its spare-mill case
is not stated on that vector, where cash is not pool 1). On the §12
instance, whose pool 1 IS cash — w^I = (3/5, 1/4, 3/20) — V = 1 000 000
gives (600 000, 250 000, 150 000) and V = 1 000 001 floors to the same
three with the one spare mill to cash: (600 001, 250 000, 150 000), every
V_i ≤ ⌊w̄_i V⌋ holding since cash's cap is 1. The PAYOUT rounding of §12 is a
different rule with a different owner — do not read one for the other.
Verification after the floor (the futarchy note, "Final cash minimum and precision": "Verify non-negativity, the total allocation, the cash minimum, all individual limits and the largest two, three and five sums before implementation"): B4 re-checks the floored V_i / V against every limit of Γ_C; on a failure, or when Γ_C's budget was exhausted (its passes against step_budget or a step past rational_bits_max, C72), the implemented allocation is the all-cash (V, 0, …, 0) and allocation/v2 records outcome = fallback (computed otherwise) — the note's "If the precommitted computational budget is exhausted or final verification fails for otherwise valid inputs, use the all-cash allocation".
(An earlier draft of this paragraph sent the spare mill "to pool 2 by
remainder"; that was the largest-remainder rule, not this one; the rule's own
sentence and its first instance stand.)
8. The ceiling route #
A bookmaker's capacity becomes its risk ceiling — nothing else moves:
-
For every pool
i ≥ 2,V_iis the sleeve'sceiling_millsin every run manifest of the window under the one-live-run chain, and under the shared-line chain (futarchy-system.md §4 B5 v3) the bound of every run'sceiling_mills ≤ V_i, the run's sublimit of the line (matching-engine §6: "sleeve ceilings are run-manifest parameters … the manifest is a declared determinism root"). Cash'sV_1"stays in reserve" (the 2 October text, cash Q/A) (futarchy note) — no sleeve, no manifest entry. -
The run manifest cites the allocation: the frozen field
allocation_ref = {epoch_id, allocation_offset}(the offset of theallocationrecord in the epoch's allocation stream) as run-manifest field 14, a closed nested map{0: epoch_id (32 bytes), 1: allocation_offset}, OMIT-AT-DEFAULT under model-plugin- layer §12 (absent = the run cites no allocation; every earlier manifest keeps its bytes and itsrun_id; a present field is one byte form, a malformed nested map refused byManifestError::AllocationRefWire). The predicate the runtime checks is a SUBSET rule, not an equality — a pool need not quote in every run, and a pool whoseV_i = 0quotes in none (a zero ceiling is already refused by the manifest's own validation, so such a pool simply does not appear, and a manifest naming no sleeve refuses to start —ManifestError::NoBookmakers, the manifest's own validation; §9 then counts the absent pool as a missing row, and §15 question 11 asks what that does to its next cap):every sleeve the manifest names is a bookmaker pool of the cited document, and carries exactly that pool's
V_ias itsceiling_mills; a pool the manifest omits quotes nowhere in that run.That equality is the one-live-run chain's (B5 v1). B5 v2 was the v2 chain's ceiling route until B5 v3 replaced it in place (no live epoch existed, task 147 T4's single declared version); a
caps_rulev2 document naming B5 v2, B6 v1 or B7 v2 is refused (ChainMismatch, field 50) — no epoch opens under a rule the engine no longer runs; onlycaps_rulev1 documents keep the equality,CeilingMismatchand C31's one live run. Under the shared-line chain the predicate is the LINE predicate (futarchy-system.md §4 B5 v3; §9 C31, C89):every sleeve the manifest names is a bookmaker pool of the cited document and carries a
ceiling_mills ≤ V_i, the run's sublimit; the run'srun_included/v2row carries the same sublimits; at that row the sublimits of the sleeve's live runs (record order) plus this run's sum to at mostV_i; a pool the manifest omits quotes nowhere in that run.Under the v3 chain B5 v4 reads the line with VERIFIED liveness and adds the PENDING REFUSAL (futarchy-system.md §4 B5, §9 C100): a run's sublimits stay in the live sum until its
run_verdict{verified}row and never leave it at afailedone, and arun_includednaming a sleeve whose pool has an included run whose latest verdict row BEFORE this row isfailedis refused at the START (SleevePending, afterLineExceeded) and, recorded, halts B7 v5 (SleevePendingInclusion) until that run'sverifiedrow — between the two rows the pool's loss on that match is unknown to the fold, so no new risk is admitted against it.Two consequences worth stating. A sleeve the document does not name can never quote in a run of the window, so every sleeve a run of the window needs must be a pool — including the house-model sleeve a house-line board requires at HEAD; listing the pools is therefore a decision about which sleeves may run at all, and it is the CEO's field (§3). And the cited record must be the epoch's own current
allocation: a manifest citing a settled or superseded epoch's record satisfies the ceiling equality (or the line) but funds nothing this epoch granted, so the gateway refuses arun_includedwhoseallocation_refis not this epoch's record, and the runtime refuses the manifest (ManifestError::Inclusion(InclusionError::CeilingRoute( CeilingRouteError))— the check isfutarchy::check_allocation_ref, the layer's own home of its predicate, with the refusalsForeignEpoch,ForeignOffset,SleeveNotAPool,CeilingMismatch(the one-live-run chain) andLineExceeded(the shared-line chain; aceiling_mills > V_iisLineExceededwithlive_sum0), in that order, whileRowVersion(defensive: the derivation's walker haltsInclusionRowVersionfirst) andSublimitsDisagreeareInclusion::admit's, ahead ofcheck_allocation_ref, so the shared-line START refuses, afterRunandAllocationRef,RowVersion,SublimitsDisagree, then the route, in that order;AllocationForeign(the record names another epoch) andAllocationShape(its capacities do not count the document's pools) — both checked first, ahead ofForeignEpoch; the runtime depends onfutarchy— acyclic, the layer depends on stream-core alone). The predicate gains two clauses, each under its own document condition — the leverage tap under a document carrying fields 58 and 62, the exposure rows under one naming R4; under one naming R9 the edge computes the loss band from its replica of the desk fold and R6 re-derives it at the inclusion row (risk-engine.md §3, §4, §7). The START of an allocation-citing run takes its INCLUSION as a TYPED INPUT DERIVED FROM THE EPOCH LOG (futarchy-system.md §4 B5; state-layers §11):Inclusion::from_epoch(inputs, log, run_id)is the one constructor — the real fold B0–B4 over the sealed log yields the document's checks and theallocationrecord (the fold's own, at the stream layout's offset — never a handed-in record), B5's fold halffold_through_inclusions(epoch_id, close_height, log)— reading the WHOLE sealed log from the closingblock_finalto its end, a log short of the close yielding no inclusions — yields the run's recordedrun_includedrow with its log offset; the derivation's own refusals areInclusionBuildError::{Document, Fold(Halt), NotClosed, RowMissing, Layout}(§14); nothing in anInclusionis a free value. The operator's edge builds it — the two binaries under--epoch <dir>and--epoch-store <dir>, named together, read the epoch store on disk (futarchy-system.md §11 W10) and the pure loaderfutarchy::inclusion_from_storederives it (the registry rebuilt as of the opening andadmitbefore the fold; futarchy-system.md §10) — and hands it toScheduler::new_included(manifest, &inclusion, …)(the host'sDriver::new_included);Scheduler::newrefuses an allocation-citing manifest (InclusionMissing) andnew_includeda manifest citing nothing (InclusionUncited), after the manifest's own validation (so a bad ceiling isBadCeiling, never a gate refusal). The gateInclusion::admitthen checks that the inclusion was derived for THIS run (the row'srun_id= the manifest's run id —Run; the fold already holdsrun_id=manifest_hash), that the row'sallocation_refis the manifest's (AllocationRef) and the SUBSET rule (CeilingRoute(…)), and records the row's offset in every derived stream's lineage (event-catalog §4,included_at). The trust boundary (CONFIG C30 — §9 C30, register row 33, carried by B5's declared rule identity so a change is a new system hash): the runtime never holds a log handle (a log read inside the runtime would be hidden state, CLAUDE.md law 2 — theInclusionis its one typed input); the edge is trusted for the LOG's BYTES — exactly as it is for the root logs it hands a run and for the stored epochs the registry is rebuilt from (law 8(d)) — and for nothing else: a forged inclusion needs a forged log that re-folds to the forged record through every block hash and stake row, the same forgery as a forged root log. The fold proves the rest after the fact: B7 halts the window on a sealed run without its row. A run manifest WITHOUTallocation_refis outside every window and draws no vault capacity — it starts throughScheduler::newat its own ceilings (the demo and replay path; the deployment rule below). CONFIG C31 (§9 C31, register row 34 — the economist's finding, a funds-risk question to the user). The two readings ofV_i: this design's first bullet above ("V_iis the sleeve'sceiling_millsin every run manifest of the window") makesV_ithe ceiling of EACH run, so k runs of overlapping matches could together reserve k·V_i and the vault's reservable exposure could exceedV; the notes readV_ias ONE total per bookmaker — the futarchy note ("Governance problem", "Market mechanics"): "If the vault has V units of deployable capacity, bookmaker i receives V_i = w_i V", boxed asV_i = w^I_i(t₁) V; the product thesis ("One vault, revocable ceilings"): "Approved ceiling: the maximum shared liability an underwriter may reserve" and "The same dollar can never secure two simultaneous worst-case losses". Law 7(c) takes the default closest to the notes, so the default is the per-bookmaker reading — and, until the user rules on HOW the total is shared across simultaneous runs (ceiling_mills ≤ V_iwith the gateway bounding the sum over a sleeve's live runs, or one run at a time), the rule under which both readings coincide: a sleeve has at most ONE live included run per window — the gateway refuses arun_includedfor a run naming a sleeve that already has an included run without arun_verdictrow, and B7 halts on a recorded violation (B6 reads each run's sleeve ids). The manifest rule stays exactlyV_iand B5's code is unchanged; B5's declared text names C31. RULED 2026-10-21 (futarchy-system.md §9 R38, the CEO): the credit line is one shared limit across all of a bookmaker's markets from the first pilot, the one-live-run rule a temporary safeguard superseded by R38 from the first epoch whose rule chain declares the shared-line B5 version, the chain everycaps_rulev2 document gets; B5 v2 was the v2 chain's ceiling route until B5 v3 replaced it in place (no live epoch existed, task 147 T4's single declared version); acaps_rulev2 document naming B5 v2, B6 v1 or B7 v2 is refused (ChainMismatch, field 50) — no epoch opens under a rule the engine no longer runs; onlycaps_rulev1 documents keep the equality,CeilingMismatchand C31's one live run, the manifest rule and B5's code as written. Under the shared-line chain the manifest rule isceiling_mills ≤ V_iwith the line predicate above, the gateway bounding the sum over a sleeve's live runs — the first of the two ways named above, the engine's default mechanism (futarchy-system.md §9 C31, C89). The fixture's E3 rows come in two shapes under a v1 document (futarchy-system.md §7 E3):futarchy_epoch_log(B5's gate) keeps the two inclusions at heights 12 and 13 — a recorded C31 violation B7 will halt on; B6's gate sequences them throughfutarchy_epoch_log_withat 12 and 14 with the first run'srun_verdictat 13 between them and the second's at 15; and in five under a v2 document ((a)–(e), futarchy-system.md §7 E3). The deployment rule, part of C30: a deployment holding an epoch serves vault-funded sleeves only throughnew_included— a run started throughScheduler::newdraws no vault capacity and is outside every window. -
A ceiling change is a quoting restriction only. A sleeve's quote headroom is
ceiling − Σ_open max(posted, 0) − Σ reservation − max(−realized, 0)across every book it rests in (matching-engine §6; R1 v2 since gate G1 (risk-engine.md §9), v1 before itceiling − Σ posted − Σ reservation), and a batch that does not fit is truncated by matching-engine §4's step-3 greedy shrink or, when nothing fits, refused with its §8quote_rejected{capacity}row. That is the whole reach of a ceiling: it bounds NEW quoting — in the exchange's own collateral view and in the market-making layer's worst-case pre-check, which reads the same ceiling before a batch is sent. It never touches a pot (pot = 1000 mills × open interest at every offset, matching-engine §6), an accepted claim or a staged payout. And a ceiling cannot change WITHIN a window at all: oneallocationrecord pins oneV_iper pool and every manifest of the window carries it, so the earliest run that can quote under a different ceiling is the first run of the NEXT epoch's window. Inside a run nothing can change it either — the manifest is frozen and its hash is the run's id (state-layers §11, "the run is its manifest + root logs"). A cut is thus always an event between epochs, and it reaches no market that is already open. -
The product thesis's "approved ceiling / quote reservation / drawn capital" are, in this engine,
ceiling_mills, the resting-quote reservation andmax(posted, 0)of matching-engine §6; its priority rule for scarce free USDC and its capital rent have no engine object here (the vault's free cash is the chain's).
8b. The capital views #
The LPV capital committed to a cycle is locked before its voting opens and
until its obligations settle (futarchy-system.md §9 R44, amended by R47);
the engine shows that commitment as five quantities DERIVED from the epoch
log — a pure read, a fold appending nothing, exposed by d2-cycle report
(futarchy-system.md §11 W15) and, when they exist, by the payout publisher
or the gateway (futarchy-system.md §7 E5; CONFIG
C101):
committed=vault_capacity_mills(3) — the published budget, pinned before the first stake (§3) and immutable afterepoch_opened(law 8(b)); no record of the epoch log changes it; that a withdrawal during voting cannot shrink the funds behind it is the vault side's lock (R44, R47).allocated_i=V_i, per bookmaker pooli ≥ 2, from theallocationrecord (§7).reserved_i= the sublimits of the pool's sleeve still live at the log's end under the chain's liveness — on the v3 chain until each run'sverifiedrow (§8, B5 v4): the line reserved by running or unverified matches; on the v4 chain the epoch's CARRIED lines included, each locked until its release (its Verified row or itscarry_settled/v1row, futarchy-system.md §4 "The v4 chain"; CONFIG C111). The capital a run USED is B6'sdrawn_iandcapital_i, per run, after its verdict (§9), not a view.unreserved_i = V_i − reserved_i— available to the cycle, never to withdrawals: an unused part of the commitment is not withdrawable. On the v4 chain, under eithercarry_budget_ruleversion of the holding epoch,unreserved_iis the desk's ROOM:min(usable_i(h), ⌊L·E_i⌋)less its live sublimits, its own locked carried lines and its own consumed amounts — at least 0 by B5 v5's desk bound (futarchy-system.md §4 "The v4 chain"; §9 C125);V_i − reserved_iandusable_i(h) − reserved_ioverstate it (after G-O4's OUTSIDE release B's room is10 000, not10 020).released⇔epoch_settledis in the log, on a v1, v2 or v3 chain. At a close every included run of such a chain is verified, so everyreserved_iis 0 there. On such a chain, after an abortreleasedis false andreserved_ilists the lines of the runs without averifiedrow; the vault side releases them on the chain's settlement of those matches, outside the epoch log — an abort record alone releases nothing still securing claims (R44). After an abort the commitment not securing claims is the vault side's to release at the abort record (the reading of PV-06's 'alone cannot release capital still securing claims' and 'Release only after the applicable obligations are cleared': what secures no claim carries no obligation at the abort record; CONFIG C101, the economist's release conditions to replace). Therereleasedis the settled path's flag; after an abort the engine exposescommitted − Σ reserved_ias the part securing nothing.- On the v4 chain
releasedis ONE flag, the CAPITAL RELEASE: the epoch's terminal row (epoch_settledorepoch_aborted) in the log and no carried line of it locked (CONFIG C119), true after an abort too once no line of it is locked; the held slot, the settled store entry and its completeness read the same flag. ONE COVERING RULE (futarchy-system.md §4 "The v4 chain"), governing onlycommitted(h),withdrawableand the released part, never the flag: every locked carried line is covered by exactly one epoch, its accepting epoch until that epoch's deadline; the covering moves at each window start and never between them — at the window startclose_heightofj's successor (D(j)itself under the abutting default, later when the successor opens pastD(j)) every locked carried line whose coverer is at or past its own deadline passes to the covering ofj's successor when it pinscarry_budget_rulev1 (INSIDE), whole lines in lineage then inclusion order while its covered sum stays at most itsV, the excess keeping its coverer and eligible again at the next window start; under an OUTSIDE successor nothing passes, each line keeps its coverer and the successor holds, and at the release the released amount (line − consumed) moves into the then-running epoch's commitment (the holding epoch, whose window had started at or before the release and that allocated — futarchy-system.md §9 C117) and leaves the coverer's — except a line released in an INSIDE then-running epoch's turn that the epoch does not cover (an excess line, one that found no room at the window start into that turn, or one released in the turn's gap before that window start), or released in the turn's gap before the then-running epoch's window start, in the turn of an epoch aborted before its allocation, or at a height in no opened epoch's turn (under an OUTSIDE then-running epoch every release in its turn at or after its window start enters itsR(h)), whose released amount joins no running pot and is withdrawable from its coverer's terminal row (futarchy-system.md §9 C106, C124). An epoch'scommitted(h)is, until its terminal row, its ownV(plusR(h)under OUTSIDE) less the carried lines that passed from its covering to another's; after its terminal row, only the carried lines it still covers. Its RELEASED PART at its terminal row is its figure just before that row less the carried lines it still covers, and a later release adds nothing to it: the released amount is the covering or holding successor's, the consumed amount the vault side's loss, so no dollar is both withdrawable and committed, nor committed twice (R44). The release of a carried line that never reaches Verified is a recorded edge row: it leavesreserved_iat itscarry_settled/v1row in the accepting epoch's root log (futarchy-system.md §7 E8; CONFIG C113). The settled store entry is written at the later of the capital release and the first final above the grace end (C37) (futarchy-system.md §11 W10; at the abort row for a v4 epoch that aborts before its allocation, no line held), the flagreleasedat the capital release, and no withdrawal is paid from a locked line.
withdrawable is the VAULT's number, owned by the vault side: deposits
less committed less every other encumbrance — on the v4 chain, under
both carry_budget_rule versions, less the sum of committed(h) over
EVERY epoch whose figure is above 0 (every epoch until its terminal row,
and after it while it covers a locked line, whatever its released flag)
by the covering rule above, so each locked carried line is
subtracted once, inside its one covering epoch's figure, and an earlier
epoch's non-covering part is withdrawable from its terminal row
(futarchy-system.md §9 C125); a figure read from partial inputs, a
capital view whose successors stops before the latest epoch summed,
keeps every line whose passing it cannot read, so a sum of such figures,
none read past the epochs summed,
gives a withdrawable at or below this one, never above it (futarchy-system.md
§7, C125). The engine holds no deposits
and exposes no such field; it supplies committed. The handoff order on
released is the vault side's — return credit, distribute bookmaker PnL,
process withdrawals from released capital, allocate what remains (the R47 row's reading) —
and in the engine it is the records' own: the runs' verdicts and
return_observed rows, epoch_settled, then the next document's
allocation — on a v1, v2 or v3 chain; on the v4 chain the next document's
allocation may precede epoch_settled, its pot formed gross of the carry
(CONFIG C116), and the handoff order runs per release on the capital
release. Cash has no sleeve and no line, so no view row. The word is
"reserved", never "deployed": the line a running match holds is reserved;
what it draws is measured per run.
9. The evaluation data #
"During the evaluation period the protocol observes a precommitted data set
D_T = (R_1, …, R_T), where R_t is the vector of bookmaker returns observed
at time t" (the objective note, "Estimation and settlement" — the note's
R_t there is a RETURN vector, not this document's stake pool R; §2). Here D_T
comes from the engine's own streams — never from a bookmaker's report (the
2 October text's "bookmakers share performance results with the vault" is
read as the vault OBSERVING results — the 19 October note: "The protocol records their performance" (Overview); self-reporting would be a mock and the
cheapest estimator attack).
One observation per run (delta_rule 22 v1 — "Δ = one run", §15 D2: the economist, match first, a time interval later; the 19 October note's Δ is a DIFFERENT symbol, the snapshot interval snapshot_blocks (57), R34 — the per-run observation is the record the series of this section is derived from, and keeps its own name). The order — stakes, then the close, then the evidence — is the
futarchy note's own cycle (Overview: publish the rules, collect predictions, set credit limits, observe trading, assess and settle): stake in pools, compute the raw
w^M(t_2), implement w^I, THEN observe D_T. It needs no rule of its
own here, because §8 already enforces it structurally: a window's run cites an
allocation record, and no such record exists until the book has closed
(§6).
One observation per included run at its run-sealed
offset — a term this document coins for the run's FINAL offset: the sealed
end of its settlement stream, after the last settlement_complete, every
market settled or voided and every pot drained to exactly zero
(matching-engine §6's pot identity). One per run, not the product thesis's
between-match "flat-book checkpoint". Mid-run has no price (state-layers
§7's in-flight carve-out: between a settlement group's first row and its
barrier the folds are legitimately mid-transaction).
The run must have reached Verified, not merely Completed (state-layers
§11): a Completed run still becomes Failed if the determinism harness
re-runs it and a stream hash differs, and an observation already folded into
return_observed could not be withdrawn without rewriting history. So the
fold waits for the harness's verdict, and a run that never reaches Verified
never contributes. Under window_rule v4 (B7 v5, the v3 chain's) a
failed verdict is a recovery incident, never an exclusion: the run's
record is rebuilt — the same manifest re-folded over the same root logs —
and the rebuilt record's verified row, a second run_verdict for the
run, is its one observation; until that row the window waits, and at the
grace end without it the epoch aborts run_unrecovered
(futarchy-system.md §9 C99).
The window, and why the operator does not choose it (window_rule v2 —
a FIXED span of heights; the team, 7 Oct 2026, in the sync's notes: "a 30-day
credit allocation span for specific game categories" — the per-category half
superseded by the economist's one clock (futarchy-system.md §9 R4); the economist (futarchy-system.md §9 R4, R5), asked how long the
period is and whether every title shares one, answered that the length is a
parameter to change and the clock one; asked which matches count, every
match). The objective note
lists "the return data included in D_T" FIRST among the six things "the
protocol must specify" before betting, so a window the operator picks run by
run after stakes are in would not be precommitted at all — it would let
whoever appends run_included select the evidence that settles the market.
The rule therefore leaves no selection, and the length is a document value:
The window is
[M, M + window_blocks); its DEADLINE isM + window_blocks(field 52).D_Tis the runs whose own frozen manifest cites THIS epoch'sallocationrecord and whoserun_includedrow carries aheightbelow the deadline, taken in the order those rows appear in the epoch log, each observed once at its run-sealed offset once itsrun_verdict{verified}row is in the epoch log (§5 — the harness's verdict, recorded); underwindow_rulev2 and v3 a run whose row saysfailedcontributes nothing and is listed failed, and under v4 it keeps the window pending until the rebuilt record'sverifiedrow (futarchy-system.md §9 C99). The window closes on the firstblock_finalat or above the deadline once every such run has its verdict row (under v4 itsverifiedrow) — ath*, the smallest final height at or above the deadline at which every included run has a verdict row of height ≤h*(the HEIGHT reading, CONFIG C37 — a verdict row is stamped with the latest final height) — and no later than the firstblock_finalat or abovedeadline + verification_grace_blocks(field 53) — an included run still without one of height ≤ that final's there ABORTS the epoch (run_unjudged, the first such run in inclusion order named, the abort decided only once a final above that one is in the log — C37 — every net position refunded; under v4 a run whose latest row there isfailedaborts the same way asrun_unrecovered), so that withholding a verdict can never select the evidence (futarchy-system.md §4 B7, §9 C25). A run citing this allocation cannot START before itsrun_includedrow exists (futarchy-system.md §4 B5), so every run that could produce evidence is in the log, and a row at or after the deadline is refused. IfD_Tholds fewer thanmin_distinct_matchesdistinct match ids, the epoch aborts there and every net position is refunded in full (B7 v2 and v3); under B7 v4 and v5 (B7 v5 the v3 chain's), the window closes with the count reported and B12 v3 settles on the fallback (futarchy-system.md §9 C93).
One window for every title ("One clock"). The order is the LOG's, not the order the runs happened to seal: the log's order is the one recorded fact two observers both hold, and the determinism bridge (§13) has nothing else to stand on. The economist confirmed the live note's proposal "every match settled inside the period, in the order settled, nobody chooses afterwards"; the engine's reading of "settled inside the period" is "opened under this allocation before the deadline, its settlement observed at its run-sealed offset" — a run settles on its own replay clock, not the chain's, so this is the one reading two observers can take from the log; the reading is named in the register (futarchy-system.md §9 C4) for his objection. The blocks that compute this are futarchy-system.md §4 B6–B7.
A window always closes. The deadline arrives with the chain's blocks, the grace bounds a run the harness never judges, and below the match floor the epoch aborts rather than waits — the design's earlier hole (v1 had no answer for a window that never filled; §15 question 10) is closed by construction, with the abort as the default for the live note's question 22 (futarchy-system.md §9 C8) — on the v3 chain the window below the floor settles on the stake-split fallback, taxed (C93).
Membership is thus a property of the run's own recorded manifest and of a
height the chain assigned, not of an operator's choice: run_included
RECORDS that a qualifying run exists (and carries its manifest hash so the
citation is checkable, and the height at which it was recorded), it does not
admit one. A sealed run citing this allocation record that is absent from the
log is corrupted history — the same posture as any other missing record
(§14) — and a run_included for a run whose manifest cites another record
is refused at the edge. What the operator does choose is which runs to
CREATE, which is the operational act of serving matches; every created run
that cites the allocation and is included before the deadline is in. K = |D_T|. A run included at or after the deadline belongs to no window of this
epoch.
Per included run, per bookmaker pool i ≥ 2 (returns_rule v1 — the
per-run quantities; utilization_rule v2 aggregates capital_i over the
window as the peak, below;
SleeveId = the pool's sleeve; folds of the run's lifecycle, market-event and
settlement streams through the collateral fold of matching-engine §6; the denominator, the per-market sign rule, the per-run peak and the sampling instant are the engine's readings recorded as CONFIG — futarchy-system.md §9 C35; v1 observes neither own available capital nor a mark-to-market PnL, both named by the objective note's "Data" and neither an engine object this phase):
| Quantity | Definition | The note's term |
|---|---|---|
pnl_i |
the sleeve's realized cash over the run: receipts − payments across every tranche, payout and refund — the collateral view's free for the sleeve, which starts at 0 (the one definition: tranche receipts minus tranche payments (matching-engine §6 — a buyer opening long pays q × p, a seller opening short pays q × (1000 − p)), plus payouts and refunds; at the run-sealed offset every position is closed, so this is realized PnL "at resolution") |
"PnL … at resolution (realized)" (objective note, "Data") |
capital_i |
max over the run's replay_ts boundaries (the state after each replay_ts instant's last record — futarchy-system.md §4 B6, §9 C35) of Σ_markets max(posted_m, 0) + reservation — the peak of drawn plus reserved collateral |
"utilized capital" (the objective note's "Data"; its "PnL over capital" names no denominator — C35's reading) — the engine's per-run PEAK definition, kept unchanged under utilization_rule v2 — §15 question 1 |
drawn_i |
max over the run's replay_ts boundaries of Σ_markets max(posted_m, 0) — capital securing accepted claims |
"utilized credit" (the 2 October text, utilization Q/A); the thesis's "drawn capital" |
R_it |
pnl_i / capital_i, exact rational — with pnl_i and capital_i above it, the content of returns_rule v1 |
"per-unit returns R_it from PnL over capital for each Δ" (objective note, "Returns") |
| collateral-ticks | Σ_heights (drawn + reservation) × Δreplay_ts — the value after each height's last record times the span to the next height |
the thesis's "occupied collateral dollar-second" — recorded beside, informational, never an input to Θ |
The sign rule: a market's posted may be negative (realized profit on
closes, matching-engine §6); capital counts max(posted, 0) per market.
The balance series — the note's snapshots, derived from the runs (B6b, series_rule v1, BUILT as fold_balance_series — task 143 step 3c — in the v2 chain (chain::declared_chain_v2, task 143 step 3j-1) and folded by the composition's v2 branch (fold_to_settlement, task 143 step 3j-2); the futarchy note, "Performance collection", "Balances and utilisation", "Interval returns"; the user's ruling of 2026-10-20: the per-run streams stay the record). The note records, "for each BM i and snapshot k", the free own capital F^own, the unused credit F^credit, the capital reserved for open orders U^orders and committed to open positions U^positions, at snapshots every Δ from t_2. The engine forms them from the per-run rows above and the document:
The GRID: snapshots at
M + k · snapshot_blocks(57) fork = 0 … window_blocks / snapshot_blocks(window_blocksa multiple ofsnapshot_blocks— B0'sSnapshotGridcheck); interval 1 is[M, M + Δ](a verdict stamped atM, the closing final's own height, is legal upstream) and intervalk ≥ 2is(M + (k − 1) Δ, M + k Δ], so a run's interval ismax(1, ⌈(h − M) / Δ⌉)for a verdict heighthup to the deadline; the closing snapshot is at the DEADLINE, and a run whoserun_verdictheight lies in(deadline, h*](inside the grace) belongs to the LAST intervalK; a height belowMor aboveh*is corrupted history, a typed halt (futarchy-system.md §9 C59). A run belongs to the interval containing itsrun_verdictheight — it is observed once, at its end (C52). The opening snapshotk = 0is recorded withB_{i,0},F^own = own_capital_i,F^credit = V_iandU^peak,η,R^balpinned at 0 — recorded values, not observations: B9 v2, B10 and B12 read the snapshotsk ≥ 1(C59).Per bookmaker pool
i ≥ 2and intervalk:U^peak_{i,k}= the maximum over the interval's runs of the run'scapital_i(the peak of posted plus reservation — the note'sU^orders + U^positions), 0 with no run — a per-interval PEAK, not the note's instantaneous stock, because the record carries one peak per run and a run's clock is its own (C52 names the gap); under the shared line, where a pool's runs overlap, the maximum is a DEPARTURE from the note's formula (law 7(a)): the note DEFINESU_{i,k} = U^orders + U^positions("Count each funded amount once", "Balances and utilisation"), and the maximum over runs is CONFIG only because no cross-run instant exists; it understatesu_{i,T}— own capital 0 and no P&L in the interval,B= 100 000: 60 000 + 40 000 drawn at once readsU^peak60 000, η 0.6,e^util2/3 with ρ = 9/10; with own capital 20 000, 60 000/120 000 = 1/2 ande^util5/9 — which at THIS settlement tightensw̄^util = e^util · w^I_iwithe^util_{i,T} = max_{k∈K_T} η_{i,k}/ρandη_{i,k}as below (B11 v2, §10), which can lowerŵ*_iwhere the bound binds, moving settlement payout from the desk's backers to the other pools' stakers (zero-sum before the tax, no LP effect), penalising exactly the concurrency R38 enables, and next epoch changes Γ_C's bootstrap only wherew^prev = 0(C71's case split, after a fallback), where it lowersG_i; the alternative, Σ of the runs' peaks, overstates and loosens the settlement cap; the economist's question stands (futarchy-system.md §9 C89, register row 92);B_{i,k} = own_capital_i + V_i + Σ pnl_iover the runs attributed to intervals1 … k(B_{i,0} = own_capital_i + V_i— realized results accrue to the desk's own capital first: losses by C26's order, gains by C69's reading; profit distributions are between epochs, C68);F_{i,k} = B_{i,k} − U^peak_{i,k}, split intoF^ownandF^creditbelow;η_{i,k} = min(U^peak_{i,k} / B_{i,k}, 1)(C58 — a peak above the balance, a realized loss netted into capacity, counts as full use);R^bal_{i,k} = B_{i,k} / B_{i,k−1} − 1. The split of the free balance (C69, a reading: credit is drawn first, own capital is the cushion that absorbs losses first — C26):F^own_{i,k} = max(min(own_capital_i + Σ pnl_i, F_{i,k}), 0),F^credit_{i,k} = max(F_{i,k}, 0) − F^own_{i,k}, both non-negative, their summax(F, 0); the identityF^own + F^credit + U^peak = Bholds wheneverU^peak ≤ B, and above itη = 1(C58). Losses past own capital lowerBinto the credit; POV's reserves ahead of LPV (C26) are not modelled in the series until a risk-chain block lands (C68's scope; C69). Every amount of the series is in capacity mills —own_capital(58) is pinned in mills for that reason.An interval with no run of pool
iis OBSERVED:U = 0,Bunchanged,R^bal = 0, in the joint vector and in the pool's own series — the note's "Use the same observation times for all BMs" — so a surviving pool'sT_iis the interval count; a wiped-out pool'sT_iis its last snapshotk(its later snapshots MISSING, C42's count). A pool withB_{i,0} = 0(own capital 0 and no credit) writes NO row; its readers takeη = 0,R^bal = 0,e^util = 0— observed zeros,T_i = K, a mean of 0 (C56). Observed zeros are the engine's answer to the note's "missing observations" question (C65): a run spanning several intervals showsU = 0andR^bal = 0until its verdict interval, where its whole result lands — the mean and the CVaR see that shape. A run's result is realized at its verdict, so no unrealised position is carried at a snapshot (the note's entry-price valuation question, C67). The only evidence floor ismin_distinct_matches(21); the note's minimum trading evidence — distinct trades and markets per bookmaker — has no rule yet (C66, open). A desk whoseB_{i,k} ≤ 0atk ≥ 1ends its series there —R^bal_k = B_k / B_{k−1} − 1(at most −1),η_k = 1, later snapshots MISSING for it (C56). Cash's column —cash_return(13) in every interval, never winsorized (C40) — is the READERS' (B9 v2, B10; on v3 the pins 74–76, B12 v3's), never a row of the series. No flow enters a window but the trading result, net of trading fees (futarchy-system.md §9 C29): deposits, withdrawals, credit-limit changes and profit distributions are between epochs — WHILE no risk-chain block exists (risk-engine.md §4: a margin top-up or a liquidation would be an intra-window flow); the note's flow-adjustment question needs no engine rule under a document naming no desk-period block (C68, C82) — the top-updesk_topupis that block's flow andseries_rulev2 adds it toB(risk-engine.md §4, C82).
The balance_series record carries, per pool in document order and per snapshot k = 0 … K, B, U^peak, F^own, F^credit, η, R^bal as exact rationals, the decoder holding η ∈ [0, 1], U^peak ≥ 0, F^own ≥ 0, F^credit ≥ 0 and the opening row's zeros, and no sign bound on B or R^bal (event-catalog §6.17; C59). B8 v3, B9 v2, B10 and B12 read this series in place of the per-run rows; the per-run rows remain the record the series is derived from and re-derived against.
The three return series — daily, rolling weekly, monthly (the futarchy note as rewritten, "Daily, rolling weekly and monthly returns"; B6b v2, series_rule v2, the v3 chain — futarchy-system.md §4 B6b). "The three series" are the daily (h = 1), rolling weekly (h = h_w) and monthly return series of that section, term by term:
R^{bal,h}_{i,k} = B_{i,k} / B_{i,k−h} − 1forh ∈ {1, h_w}andk = h … K, andR^month_i = B_{i,K} / B_{i,0} − 1— the note'sh ∈ {1, 7},k = h, …, n_TandB_{i,n_T} / B_{i,0} − 1, withh_w=weekly_horizon_snapshots(73) = 7 andn_T = K(one snapshot is one calendar day — CONFIG, futarchy-system.md §9 C96). Every ratio is taken on the SCORING balanceB̃ = max(B, 0)— a departure from the note named under 7(a), CONFIG C95: the note'sR^{bal,h}_{i,k} = B_{i,k} / B_{i,k−h} − 1asks only the opening conditionB_{i,k−h} > 0, so a negative closing balance gives a return below −1, whileB̃floors the return at −1 at the wipe-out row, because the lenders' loss on a pool is bounded by the credit extended — the deficit beyond the balance is the desk's own and the risk engine's. Apart from the floor,B̃is 0 at every snapshot after the pool's wipe-out row and a ratio whose opening is 0 is 0 (the open-question defaults, 7(c), CONFIG C95, under the note's open "treatment of zero opening balances, missing observations and insufficient valid windows"); the monthly ratio opens onB_{i,0} > 0(a pool with a zero opening has no series, C56).
The balance_series/v2 record carries v1's rows — R^bal on B̃, which differs from v1's raw ratio only at the wipe-out row, floored there at −1 — plus, per row, weekly_return PRESENT iff k ≥ h_w, and per pool with a series one monthly_return. The series still ends at the wipe-out row (C56) and its readers fill what follows: a daily return 0 after the wipe-out row, a weekly window that opens before the wipe-out and closes at or after it −1, one that opens after it 0, the monthly return −1. Cash is no row: its three returns are the document's pins 74–76, the note's fixed-rate rule R^h_{0,k} = (1 + r_c)^{h/365} − 1 and R^month_{0,T} = (1 + r_c)^{n_T/365} − 1 truncated at p decimals (C94). The eligible windows are K_T^(h) = {h … K} for both horizons — the note's "With complete valid records, K_T^(h) = {h, …, n_T}" read as the engine's CONFIG (C95): records are complete by construction, a run-less interval observed at 0, a wipe-out handled by B̃ and never by excluding a window. The series scored stays C57's total-balance R^bal (futarchy-system.md §9 R52 (i), R53).
Missing rows (missing_row_rule v1 — the ZERO in the joint vector
CONFIRMED by the economist, 2026-10-12: "Count return as zero."; the
exclusion from the pool's OWN series CONFIG — futarchy-system.md §9 C42): a pool whose sleeve is absent from the
run's manifest, or whose capital_i = 0, has no return there — it enters
that run's JOINT loss vector as 0 and is EXCLUDED from its own series; T_i
counts the runs where pool i was observed. The ZERO convention is not
cosmetic — a zero return in the joint vector moves the tail and so ŵ* —
and it is now his, so §15 question 14 is closed. A desk that placed orders
with no fills in that run has a return of 0 there and its open orders still
count toward u_{i,T} (his same comment; the utilization rule above). Cash:
R_1t = cash_return in every run (the futarchy note's μ₁).
Utilization (utilization_rule v2 — the economist's own words,
futarchy-system.md §9 R1, R3). The 2 October text ("How do we estimate the objective when some bookmakers underutilize their allocated weights?") fixed what u_{i,T} MEASURES — "bookmaker
i's utilized credit during the evaluation period, expressed as a fraction of
vault capacity". The economist fixed the two things the note left open. What
counts as utilized: on the simulation's "credit is drawn only on filled
bets, never on open quotes" — "I believe the effective credit is drawn both
on filled bets and opened orders."; on a desk with no bets in a match — "If
BM placed orders there with no fills, it counts as utilization though return
is 0." How it aggregates: "The peak over the whole period initially." —
"Later on, it will be time-weighted probably." So:
u_{i,T} = max over the runs of D_T (the window's included runs with a Verified verdict, C38) of capital_i / V— the peak over the period of drawn PLUS reserved,capital_ibeing each run's peak ofΣ_markets max(posted_m, 0) + reservation(the table above).
The posted D9 default ("drawn credit, never reservations", with the
mean of per-run peaks as v1's aggregation) is REPLACED by this ruling record
before any epoch ran under it; its rationale — that open orders would raise
u at no cost — is recorded in the register row so the economist weighs it
knowingly. "The peak over the whole period" across CONCURRENT runs would need
a cross-run clock the engine does not have (each run's replay_ts is its
own, core law 2); the maximum over runs of each run's peak is the reading the
recorded streams define, named as CONFIG in futarchy-system.md §9 C5 — and
exact as an aggregation under C31's one-live-run rule (superseded by R38
from the first epoch whose rule chain declares the shared-line B5 version,
the chain every caps_rule v2 document gets; only caps_rule v1 documents
keep C31's one live run): a
pool's runs in D_T hold disjoint inclusion-to-verdict spans in record
order, so no instant carries one pool's capital from two runs, each run's
peak being C35's boundary-sampled peak; a sum across concurrent runs is not
what a pool can show — and the time-weighted measure he expects later is a
v3 under the chain's heights. Under the shared line a pool's runs overlap:
the sublimits of its live runs sum to at most V_i at every inclusion row,
so the termwise bound holds without a cross-run instant, while the
maximum over runs no longer equals the pool's concurrent use — it
understates it, a departure from the note's U^orders + U^positions
("Count each funded amount once") taken as CONFIG only because no cross-run
instant exists; at this settlement it tightens the utilisation cap
(e^util_{i,T} = max_{k∈K_T} η_{i,k}/ρ with
η_{i,k} = min(U^peak_{i,k}/B_{i,k}, 1), B11 v2, §10), which can lower
ŵ*_i where the bound binds, moving
payout from the desk's backers to the other pools' stakers (zero-sum before
the tax, no LP effect), next epoch it lowers Γ_C's bootstrap G_i only where
w^prev = 0 (Σ of the runs' peaks would overstate and loosen the settlement
cap), and the economist's question stands
(CONFIG C89, futarchy-system.md §9).
What his words leave unnamed is CONFIG C39 (futarchy-system.md §9): on a tie the peak run named is the first in D_T order; a pool no run
of D_T observed records NONE (for B11, u = 0); u is recorded as
measured even above 1 — never clamped, never a halt — because under the v1 headroom, before G1, a run's C35 capital_i could exceed its ceiling: the engine's headroom SUMMED signed posted over the sleeve's OPEN markets (matching-engine §6 "realized profit expands capacity"; a settled market's position is dropped, so only an open one counts) while capital_i counts max(posted_m, 0) per market (C35), so profit realized by closing in an unsettled market funded posting beyond the line in another open market of the same run and showed u above the desk's own w^I_i — since G1 the headroom clips posted at zero per market and charges the realized loss (R1 v2, risk-engine.md §3), so a close's profit funds nothing beyond the line; the nearest alternative reading is min(capital_i, V_i) / V.
The cap is cap^util_i = u_{i,T}/ρ under utilization_rule v2; v3's e^util is §10's. The block is
futarchy-system.md §4 B8.
10. The estimator and the settlement objective #
The objective of record on the v3 chain (objective_rule v2, B12 v3; the futarchy note as rewritten, "Objective", "Daily and rolling weekly CVaR", "Estimated objective"; futarchy-system.md §9 R53):
Q̂_T(w) = R^month_{V,T}(w) − λ_d CVaR^(1)_{α,T}(w) − λ_w CVaR^(7)_{α,T}(w) − ε‖w‖²,
term by term the note's. R^month_{V,T}(w) = wᵀR^month_T is the monthly portfolio return, R^month_T the pools' unfiltered monthly returns with cash's cash_return_monthly (§9). CVaR^(h)_{α,T}(w) is the empirical CVaR of the JOINT portfolio losses L^(h)_k(w) = −(w_0 R^h_{0,k} + Σ_i w_i R^{bal,h}_{i,k}) over k ∈ K_T^(h) — the note's w_0 this document's pool 1, cash's column its pinned horizon return in every row — "Compute CVaR from these joint portfolio losses, rather than summing individual BM CVaRs"; the daily term (h = 1) has K windows, the weekly term (h = h_w) K − h_w + 1, both at the one α. λ_d, λ_w ≥ 0 are the two weights, and ε > 0 the ridge over all N weights, cash (pool 1) included (‖w‖² = Σ_{i=1}^{N} w_i² — the note's Σ_{i=0}^{N} over its N bookmakers plus cash). Each CVaR is the sample CVaR min_ζ [ζ + (1/((1 − α) K_t)) Σ_k max(0, L^(k)_t(w) − ζ)], which IS the note's "average of the worst 100(1−α)% of observed portfolio losses" with its fractional tail — re-derived on the note's example: 30 observations at α = 19/20 give the weight 1/((1/20) · 30) = 2/3; the function falls while two or more losses exceed ζ (slope at most 1 − 2 · 2/3 < 0) and rises while one does (1 − 2/3 > 0), so its minimum sits at ζ = L_(2), the second-worst loss, and is worth L_(2) + (2/3)(L_(1) − L_(2)) = (L_(1) + ½ L_(2)) / 1.5 — the worst loss plus half the second-worst, divided by 1.5. Nothing is estimated — "No return expectation is estimated and no synthetic monthly paths are generated"; "no bootstrap or simulated monthly paths are used for this objective" — and all three series stay unfiltered: winsorisation is the note's future step ("Winsorisation (future step)"), with no field and no block on the v3 chain. λ_d, λ_w, r_c, α, ε and the measurement rules are pinned in the document before the book opens ("Keep the objective, λ_d, λ_w, r_c, α, ε and all measurement rules fixed as published before t_1").
The bullets below, "The objective of record" and the shrinkage instance are the v1/v2 chains' (objective_rule v1, estimator_rule v1/v2).
"It applies a precommitted estimator θ̂_T = Θ(D_T) and computes Q̂_T(w) =
Q(w; θ̂_T)" (the objective note). Θ is the note's "Suggested construction
of θ", term by term — the content of estimator_rule v1, and of v2 where a bullet says so (estimator_rule_v2, futarchy-system.md §4 B9 v2):
- Winsorize positives (B9 v2, BUILT as
fold_winsorized_v2— task 143 step 3e — in the v2 chain (chain::declared_chain_v2, task 143 step 3j-1) and folded by the composition's v2 branch (fold_to_settlement, task 143 step 3j-2); the futarchy note, "Return filtering and evidence"): per bookmaker poolq95_i= the 95th percentile of ITS strictly positive interval returnsR^bal_{i,k}by NEAREST RANK — the⌈0.95 n⌉-th smallest of thenpositive values, 0 whenn = 0(futarchy-system.md §9 C53: the note names no interpolation);R^w_{i,k} = min(R^bal_{i,k}, q95_i)over the pool's FULL series — "Positive returns above the threshold are capped; zero and negative returns remain unchanged … do not pool returns across BMs"; "Retain the raw observations alongside the winsorised returns" — the record carries both hashes (C41: the winsorized matrix underfh:winsorized-matrix/v1, the raw underfh:raw-series-matrix/v1),Kand the thresholds, notT_i; the joint matrices areK × Nover the intervalsk = 1 … Kwith a 0 where a pool has no recorded row (a pool with no series; a wiped-out pool's later snapshots — C42's joint-vector rule through C56). Cash's columncash_returnverbatim, never winsorized (C40); a surviving pool'sT_ithe interval count, a wiped-out pool's its last snapshotk, a pool with no seriesKobserved zeros (§9: a no-run interval is observed at 0; futarchy-system.md §9 C56). The 2 October reading — one pinned levelwinsor_q95(14) over per-run returns — is v1, retired with its field. - Shrunken means (the objective note; the two notes DISAGREE here — below; B10 v2 BUILT as
fold_estimate_v2over the series, task 143 step 3f, in the v2 chain (chain::declared_chain_v2, task 143 step 3j-1) and folded by the composition's v2 branch (fold_to_settlement, task 143 step 3j-2) —T_iper C56, the mean over the firstT_irows of the pool's column of the recomputed winsorized matrix).μ̂_i = δ_i R̄_i + (1 − δ_i) μ₀,δ_i = T_i / (T_i + shrink_stiffness),R̄_ithe mean of pooli'sT_iwinsorized interval returns — the OBSERVED entries of the matrix, the mask read from the rows (an observed return of exactly 0 counts, a MISSING row does not (v1; under v2 only a wiped-out pool's later snapshots are missing, a no-run interval's 0 counts — C56) — futarchy-system.md §9 C42; both are 0 in the matrix); a pool observed in no run has (v1; under v2T_i ≥ 1, futarchy-system.md §9 C56)T_i = 0,δ_i = 0andμ̂_i = μ₀— the formula with theR̄_iterm at weight 0 (CONFIG, futarchy-system.md §9 C43; B10); every sum, mean,δandμ̂is held torational_bits_max(§13) — one past it makes theestimaterecord's EXHAUSTED outcome, which B12 reads as a budget exhaustion and settles onw^M(§11's fallback; CONFIG C44);μ̂_1 = cash_return. - Joint-tail CVaR. The
Kjoint same-Δ vectorsR^(k),w(missing rows 0, cashcash_return); portfolio lossL^(k)(w) = −wᵀR^(k),w;CVaR_α(L(w)) = min_ζ [ζ + (1/((1 − α)K)) Σ_k max(0, L^(k)(w) − ζ)](Rockafellar–Uryasev — "the expected loss conditional on being in the worst (1 − α) tail", rendered on the sample as the note's "joint-tail CVaR on portfolio losses").
Where the two notes disagree on the estimator (law 7's disagreement sentence; futarchy-system.md §9 C18, C57). The futarchy note of 19 October names "the precommitted bootstrap estimator Θ(D_T)" and specifies no resampling scheme, sample count or seed; its deterministic reading is the EMPIRICAL distribution of D_T, and the sample CVaR over the matrix (above) IS that plug-in. The one departure is the MEAN: the objective note shrinks it toward μ₀ with the stiffness, the futarchy note's plug-in does not. Default under 7(c): the shrinkage is kept (the plug-in is a new estimator_rule version, not a stiffness value — shrink_stiffness > 0 is the document check's; C18), both positions recorded, a ruling or a specified bootstrap replaces it from the next epoch. The SCORED return is R^bal, the total-balance return the note defines — its Overview says "expected return on utilised capital", the objective note's R_it = pnl_i / capital_i (returns_rule v1, §9) IS a return on utilised capital, and the note itself marks "whether scoring uses this total-balance return or return on utilised capital" as "a choice to resolve before settlement rules are finalised" (C57, both positions named). RULED 2026-10-21 (futarchy-system.md §9 R39, the CEO): the scored basis becomes the net return attributable to the LP credit allocated for the window, unused allocation included; C57 is superseded by R39 from the first epoch whose rule chain declares the LP-return series_rule version, declared once the economist's attribution conventions are pinned, and every epoch before it carries C57's R^bal unchanged. R39 takes neither of the note's two positions: it keeps the unused allocation in the denominator (as R^bal does) and removes the bookmaker's own capital (which R^bal's B_{i,k} contains); the Overview's "expected return on utilised capital" becomes the diagnostic the CEO keeps; the note's Q(w) wording is the economist's to reconcile with his attribution conventions. Closed by R53: the note as rewritten estimates nothing — the v3 chain has no estimator block; the objective note's shrinkage is that note's own text, no longer a default on the v3 chain.
The objective of record (the v1/v2 chains') — the content of objective_rule v1 (§15 D1 —
the economist: "Option (a) … is the most currently correct"; the 19 October note writes the same form, Q(w;θ) = E_θ[R_V(w)] − λ CVaR_{α,θ}[−R_V(w)] − ε‖w‖², over N + 1 weights with cash at its index 0 — this document's pool 1):
Q_obj(w) = μ̂ᵀw − λ · CVaR_α(L(w)) − ε ‖w‖².
The 2 October text's Q_mv = wᵀμ − λwᵀΣw is that text's ("Objective and constraints") "for mean-variance
utility" example and is NOT computed here.
The feasible set at settlement (the futarchy note, "Constraints on implementation" and "Utilisation-supported caps"; the objective note's constraint 7), feasible_set v2, BUILT as fold_feasible_set_v2 (task 143 step 3g), in the v2 chain (chain::declared_chain_v2, task 143 step 3j-1) and folded by the composition's v2 branch (fold_to_settlement, task 143 step 3j-2):
F_T^util = { w : Σ_i w_i = 1; w_i ≥ 0; w_1 ≥ c_c (the note'sw_0, this document's pool 1) (cash's lower row); w_i ≤ b_i for every bookmaker (the individual boundmin(c_1, G_i, L E_i / V)of §7, READ fromcapped_share/v2, which recordsb_iper pool); w_i ≤ e^util_i · w^I_i for every bookmaker with e^util_i < 1 (the utilisation bound); Σ_{i∈S} w_i ≤ c_|S| for every S of a listed size (the group caps, §11) },
with e^util_i = max_{k∈K_T} η_{i,k} / ρ from the balance series (B8 v3, utilization_rule v3, BUILT as fold_utilization_v2, task 143 step 3d, in the v2 chain (chain::declared_chain_v2, task 143 step 3j-1) and folded by the composition's v2 branch (fold_to_settlement, task 143 step 3j-2) — the note: "If e^util_{i,T} < 1, impose this additional upper bound … If e^util_{i,T} ≥ 1, impose no additional utilisation bound"; K_T includes the opening snapshot at M — its η the recorded 0, C59, so the max is unchanged by it — and the closing one at the deadline); cash is exempt from the utilisation caps and the group caps. The 2 October reading — cap^util_i = u_{i,T} / ρ as an absolute share with an ε₀ floor for a pool with no previous allocation — is v2 of the rule, superseded (futarchy-system.md §9 C5, C28, C39). "All original implementation constraints continue to apply": the growth, bootstrap and leverage limits are inside b_i. w^I_i is allocation/v2's V_i / V; a fallback epoch's bookmaker by the verification follows the same rule (its own capital may open a series, so e^util_i may reach 1); on an EXHAUSTED capped_share/v2 (a bound not yet formed recorded 0) the allocation is all-cash (B4 v2) and EVERY bookmaker's upper is 0 — the feasible set is the all-cash point, cash (1, c_c) and the groups unchanged — while the settlement is the raw stake split: B12 v2 reads capped_share/v2's exhausted FIRST, before feasible_set/v2, and when set writes ŵ* := w^M taxed under fallback_rule v2 with exhausted code 2 caps, never optimising over the all-cash set, so every pool's v_i is 1 before the tax — CONFIG, futarchy-system.md §9 C72 and C22 (the economist's answer for the optimiser's budget, R13, applied to Γ_C's; the question goes to the economist; the engine's budget convention: the note's b_i lies past rational_bits_max for at least one pool; a per-pool reading would make settlement depend on document order, since the overrun zeroes the pools after it; a typed halt would freeze the epoch on honest data, C44's principle); the record feasible_set/v2 carries the group caps of the sizes ≤ N alone — the note's "skip a group size greater than N" ("Group limits", the redistribution procedure), and under "Constraints on implementation" item 2 the caps range over S ⊆ {1,…,N}, so a size above N binds nothing — every bound and every group cap held to rational_bits_max (34).
What F_T^util does NOT contain. The objective note's C_t also carries "all precommitted solvency and risk rules hold" and, in constraint 5, "compliance, solvency, and risk limits as precommitted rows of Aw ≤ b or solvency predicates". Of those, v2 represents the group caps (the note's c_|S|) and nothing else — no further predicate has a number or an owner (§15 question 9).
F_T^util is never empty, and the witness is the all-cash point: w = e_1
has w_1 = 1 ≥ c_c (for every c_c ≤ 1; the document check's c_c < 1 is the domain check above, not what the witness needs) with
every bookmaker weight 0, below every individual, utilisation and group cap — the 2 October text: "cash retains w̄_1 = 1, so the
feasible set remains nonempty even when all bookmaker utilization caps are
zero". This is also why an all-cash settlement is a legitimate outcome, not
a failure — the 2 October text again: "(1, 0, …, 0) [is] a feasible optimizer choice when holding
only cash maximizes Q, even if the bookmakers have spare capacity". Under v2 the
witness stands on the current note: "If every e^util ≥ 1, then F_T^util = F_T",
the utilisation caps only lower the bookmakers' uppers (cash is exempt), and with
c_c < 1 (the document check) the all-cash point meets cash's lower row, so it
lies in F_T and in every F_T^util.
The note's utilization example, re-derived. A bookmaker allocated 20 %,
utilizing 10 %, with ρ = 0.90: cap^util = 0.10 / 0.90 = 1/9 = 0.1111…;
"strong performance on the utilized 10 % can therefore justify at most an
11.11 % credit limit. The additional 1.11 % is the headroom implied by the
target utilization ratio."
A shrinkage instance. T_i = 3, shrink_stiffness = 1, R̄_i = 4/100,
μ₀ = 0: δ_i = 3/4, μ̂_i = 3/4 · 4/100 = 3/100.
11. The optimizer, its certificate and its fallback #
ŵ*_T = argmax_{w ∈ F_T^util} Q̂_T(w)(both notes).
Shape, stated exactly. In w alone the objective is strictly concave
but PIECEWISE quadratic: the sample CVaR is piecewise linear in w (the
objective note's own words — "sample CVaR is piecewise linear, so ties are
possible"), and the ridge supplies the strict curvature ("−ε‖w‖² is
strictly curved, so the sum is strictly concave and has exactly one
maximizer"). Lifting the CVaR with ζ and z_k ≥ 0, z_k ≥ L^(k)(w) − ζ
turns it into one quadratic program — maximize μ̂ᵀw − λζ − (λ/((1 − α)K)) Σ_k z_k − ε‖w‖² over the polytope of (w, ζ, z), a quadratic objective
under linear constraints, linear in (ζ, z) and strictly concave in w.
So: a QP in the lifted variables, strictly concave and piecewise quadratic
in w. (Our own decision-tree note calls it "a linear program in exact
rationals"; that line is wrong and §15 question 15 carries the correction — a
linear program has no strictly curved term, and the ridge is exactly what
makes the maximizer unique.)
On the v3 chain (B12 v3) the objective is rᵀw − λ_d CVaR_α(L_d(w)) − λ_w CVaR_α(L_w(w)) − ε‖w‖² (§10): still strictly concave and piecewise quadratic in w, now with TWO piecewise-linear terms. Each term lifts with its own ζ_t and z_t,k ≥ 0, z_t,k ≥ L^(k)_t(w) − ζ_t, so the lifted problem stays one QP — maximize rᵀw − Σ_t (λ_t ζ_t + c_t Σ_k z_t,k) − ε‖w‖², linear in (ζ_d, z_d, ζ_w, z_w) and strictly concave in w — with one maximizer in w (the ridge) and each ζ_t recorded as the path reached it.
The maximizer in w is unique and rational. ζ need NOT be: the optimal
ζ is generically a whole interval when the tail breakpoints are degenerate.
It is RECORDED all the same — the certificate's stationarity conditions are
over (w, ζ, z) and cannot be re-checked without it — but as the value the
pivot path reached, not as a unique optimum, which is why the certificate
below is identified by that path rather than claimed unique. z_k is not
recorded: it is max(0, L^(k)(ŵ*) − ζ) from what is.
Method (optimizer_rule v1, with arithmetic_rule = exact rationals,
§15 D6): an active-set method on the KKT system of the lifted problem in
exact rational arithmetic — every intermediate a fraction of integers, no
float anywhere (core law 2) — started at a DECLARED basis, since a start the
implementer picked would make the recorded certificate's bytes depend on that
choice rather than on the inputs:
v1's initial basis is the ALL-CASH vertex —
w = e_1(feasible on every document, §10),ζ = min_k L^(k)(e_1),z = 0.
From there, with
pivot_rule = the lowest-index entering and leaving variable, which makes
the pivot PATH a pure function of the inputs. Finiteness is not assumed:
lowest-index selection is Bland's anti-cycling rule for the simplex method on
a linear program, and this is an active-set method on a quadratic one, where
it is not a cycling guarantee — so step_budget bounds the path and the
fallback covers its exhaustion. Every rational the solver forms (the HELD SET, futarchy-system.md §9 C47 (i)) is bounded by rational_bits_max bits on its numerator and denominator. "Given the same inputs, independent
observers should obtain the same ŵ*_T" (both notes) — here a MUST: the same
inputs give the same bytes.
The group caps in the active set (optimizer_rule v2, BUILT with B12 v2 — fold_settlement_v2, task 143 step 3h; futarchy-system.md §9 C60). A cap c_k on every subset of size k is the constraint "the k largest weights sum to at most c_k" — one convex, piecewise-linear constraint on w, exact (for every S of size k, Σ_{i∈S} w_i ≤ the top-k sum). The solver treats it over w alone, with no auxiliary variable: at the current point the binding candidate of size k is the row Σ_{i∈S*} w_i ≤ c_k over the current top-k set S*; the ratio test along a direction tracks the sum of the k largest as a piecewise-linear function of the step, its breakpoints where two coordinates tie, exact in rationals. THE WALK, stated exactly: after the base candidates, the breakpoints t_ij = (w_i − w_j)/(p_j − p_i) > 0 for the bookmaker pairs i < j with p_i ≠ p_j, sorted ascending, equal ones merged; the segments [t_a, t_b) walked ascending while t_a < 1; on each the top-k set S_seg is the order by the value w_i + t_a p_i at the segment's start, then the LARGER rate p_i, then the lowest position — the order on the open segment, so a pair tied at the start with different rates is ordered by its rates and only identical lines tie through to the index (counterexample to "ties by index", size 2 over the full vector, cash first: w = (1/2; 1/4, 1/8, 1/8), p = (0; 0, −1/2, 1/2), c_2 = 3/8 — at t = 0 f_2 = 3/8 = c_2, desks 2 and 3 tie at 1/8, the larger rate puts desk 3 in, S = {1, 3}, rate 1/2, gap 0, t* = 0: the row {1, 3} enters; by index the set would be {1, 2} with rate −1/2 and never block); the first segment whose set's rate is > 0 and whose t* = t_a + (c_k − f_k(t_a)) / rate lies before t_b (f_k reaches c_k inside the segment) blocks at t* with (k, S_seg), provided t* < 1, t* = 0 a legal degenerate pivot; a size's walk ends at the first segment whose t* falls before its end t_b (whether or not t* < 1), or at its last segment — no later segment of that size is formed; every listed size is walked regardless of an earlier size's t*; a rate ≤ 0 never blocks, so a row in the working set (its own rate 0) never re-enters while another set of its size may; a ray never meets a group row (w is fixed); every rational the walk forms is held in futarchy-system.md §9 C47 (i)'s pinned order; a group row in the working set is recorded in the certificate by its size and its members, so the verifier re-checks it without enumerating subsets, and the stationarity gains one multiplier κ_g ≥ 0 per active group row. The working set may hold SEVERAL rows of one size (at a tie on the k-th weight the optimum needs them); the entering order at the least t is every C46 index before every group row, then the lowest size, the size's blocking row the top-k set of the OPEN segment that starts at t* (a cap met exactly at a breakpoint enters the next segment's set at gap 0); the (size, members) order remains the order of E's rows and of leaving; the active group rows are E's LAST rows, ascending by (size, members), each the indicator of its set with right-hand side c_k and multiplier y = +κ_g; leaving, the lowest base index with a negative multiplier first, else the lowest (size, members) group row; the anti-cycling backstop is C47's budget (C60). The group rows are kept beside the C46 enumeration as the index class (size, members) — recorded in settlement/v2's key 7, never an integer of the enumeration; the entering and leaving rules, E's order and the held set of C47 are re-pinned for the new rows ((b), (c), (f), (i)); with no group listed the method is v1's to the byte. The VERIFIER (verify_settlement_v2) re-checks without enumerating subsets: the group rows' identities, every listed cap by sorting (the sum of the k largest bookmaker weights ≤ c_k), per group row its size listed, its members a top-k set at ŵ* (defence in depth — a set summing to c_k under a cap on the k largest is one), Σ_S ŵ* = c_k exactly, κ_g ≥ 0, the stationarity μ̂_i − 2εŵ*_i = ν − κ_lower,i + κ_upper,i + Σ_{g∋i} κ_g − Σ_k κ_d,k R^w[k][i], and the probes within every listed cap (C45) — sufficient, since the cap of size k is the convex hull of the top-set indicators. The alternative — a lift with one threshold variable and N slacks per size, linear in N — is exact too but puts variables with no curvature and no unique optimum into the EQP, which the pinned conventions do not cover; it is not taken. settlement/v2 carries the group rows of the active set; feasible_set/v2 carries the listed sizes and caps, and B12 v2 holds the record's caps to the epoch's pinned list (the document's cap_groups restricted to the bookmaker count, in document order — FeasibleSetDisagrees("groups"), the verifier's Shape("feasible_set groups")).
The method, stated exactly (the conventions beyond am's text are
futarchy-system.md §9 C47). The lifted variables x = (w, ζ, z); the WORKING
SET W ⊂ the C46 indices, the simplex equality always imposed; Z = {k : z_k ≥ 0 ∈ W}, T = {k : tail_k ∈ W}. Two invariants hold from the start
and through every add and drop: Z ∪ T = [K] — every z_k is pinned (0 on
Z, L^(k)(w) − ζ on T \ Z, L^(k)(w) = ζ on T ∩ Z) — and W's rows
are linearly independent (a blocking constraint has a strictly positive rate
along the step, so it is independent of W). The START is the declared
point w = e_cash (this document's e_1), ζ = L^(0)(e_cash) (= min_k L^(k)(e_cash): cash's column is cash_return in every row, futarchy-system.md §9 C40), z = 0,
with the basis every bookmaker lower bound, every z_k ≥ 0 and tail_0
(C47 (a)) — a vertex. Each ITERATION is one of three cases (a STEP is a PIVOT — an iteration
that moves, adds or drops; the terminating optimality check is none;
Exhausted::Steps at the step_budget + 1-th pivot — C47 (g)): T ∩ Z = ∅ with s = c|T| − λ ≠ 0 — a RAY in
ζ with w fixed, rising to min_{k∈T} L^(k)(w) (that z_k ≥ 0 enters)
or falling to max_{k∉T} L^(k)(w) (that tail enters), the lowest k
attaining (C47 (d)); T ∩ Z = ∅ with s = 0 — ζ held, the EQP in w
with a = μ̂ + c Σ_{k∈T} r_k; T ∩ Z ≠ ∅ — k₀ = min(T ∩ Z) (C47 (e)),
ζ = L^(k₀)(w) and the EQP in w: maximize aᵀw − ε‖w‖² on E w = e
with a = μ̂ + λ r_{k₀} + c Σ_{k∈T\Z} (r_k − r_{k₀}) (the lift with ζ
and z substituted — exact, since the eliminations are equalities of W)
and E's rows the simplex, the active bounds, the loss equalities (r_k − r_{k₀})ᵀw = 0 for the other k ∈ T ∩ Z, in C47 (f)'s order; the solution
w_new = (a − Eᵀy)/(2ε), (E Eᵀ) y = E a − 2ε e, by exact elimination
(C47 (h)). With p = w_new − w = 0 the MULTIPLIERS follow by row kind —
the simplex row's y is ν, a lower row's −κ_lower,i, an upper row's
+κ_upper,i, a loss row's −κ_d,k; κ_d,k = c on T \ Z, 0 off T,
κ_d,k₀ = λ − c|T \ Z| − Σ_{others} κ_d,k (from ∂ζ), κ_z,k = c − κ_d,k
on Z (from ∂z_k) — every inequality multiplier ≥ 0 is OPTIMAL (the
certificate (w, ζ, W ascending, the multipliers, steps_used, bits_max_used)), else the LOWEST C46 index with a negative multiplier
leaves (C47 (c)). With p ≠ 0 the RATIO TEST over the inactive inequalities
whose rate is strictly positive (t_j = −g_j/g_j') gives t = min(1, min_j t_j); the move is taken and, when t < 1, the LOWEST C46 index attaining
t enters — t = 0 a legal degenerate pivot, a constraint reached exactly
at t = 1 not added (C47 (b)). EVERY rational the solver forms — the result
of every add, sub, mul, div and negation on its path, formed only through
the budget's own arithmetic (the HELD SET of C47 (i), the code's by
construction, with the ORDER of formation pinned there — every sum a left
fold in ascending index, a zero factor forming no product, a's terms in
the stated order, the full Gram, the rates for every run, the losses
advanced by t·dL — because lowest-terms widths depend on it) — is held
to rational_bits_max the moment it is formed;
bits_max_used is the widest; the derived constants 1 − α, (1 − α)K,
c and 2ε are the path's first rationals, formed through the same budget
after the exhausted-estimate arm (an exhaustion there the bits fallback) —
a value compared but not formed (the ray's blocker, the inputs) is not held,
nor is the halts' arithmetic before the budget exists (the raw share's sum
behind RawShareDisagrees("sum"), a shape check on an input);
one past the budget, or the step_budget + 1-th pivot, is the fallback —
"the certificate holds" meaning the pinned path's own terminating check, and
a pivot taken only after its rationals are held, so a bits exhaustion
within a pivot pre-empts the steps one. The fold does not
verify its own record (the verifier below is the independent tap); the
chain-level tap settlement_reproduces re-folds and compares canonical
bytes (§14).
The terms lift (optimizer_rule v3, pivot_rule v3, B12 v3; futarchy-system.md §9 C46 and C47 as superseded on v3). The lift generalises to a list of CVaR terms t, in order daily d then weekly w, each with its loss-row matrix L_t (§2; rows its eligible windows K_T^(h_t), columns the document's pools, cash first — cash's column its pinned horizon return, a pool's its horizon return on B̃, 0 where it has no row), its weight λ_t, its row count K_t (K_d = K, K_w = K − h_w + 1) and its tail weight c_t = λ_t / ((1 − α) K_t); the linear term r = (cash_return_monthly, monthly_return_i …), r_i = 0 for a pool with no series (opening balance 0), takes μ̂'s place. The variables are (w, ζ_d, z_d, ζ_w, z_w). The ENUMERATION v3 is [0, N) lower, [N, 2N) upper, then per term in order [o_t, o_t + K_t) its z ≥ 0 rows and [o_t + K_t, o_t + 2K_t) its tail rows, o_d = 2N, o_w = 2N + 2K_d — with one term exactly the enumeration above. Per term the sets Z_t, T_t, the invariant Z_t ∪ T_t = [K_t] and the three cases hold as above with c_t, λ_t and s_t = c_t|T_t| − λ_t. Each ITERATION: the lowest-index term in the Ray case (T_t ∩ Z_t = ∅, s_t ≠ 0) moves its ζ_t alone along its ray to its blocker, w and the other term fixed; when no term is in the Ray case, the EQP in w with each ζ_t pinned (k₀_t = min(T_t ∩ Z_t), ζ_t = L^(k₀_t)_t(w)) or held, a = r + Σ_t a_t with each term's a_t as the one-term case writes it (c_t Σ_{k∈T_t} r_{t,k} held, λ_t r_{t,k₀_t} + c_t Σ_{k∈T_t \ Z_t} (r_{t,k} − r_{t,k₀_t}) pinned) and every pinned term's loss equalities among E's rows. The PIVOT RULE v3: among the candidates the lowest term first, then the lowest index. The start is the one-term start per term — w = e_cash, each ζ_t = L^(0)_t(e_cash) (cash's column constant in each matrix), z = 0, the basis every bookmaker lower bound, every z_t,k ≥ 0 and each term's tail_0. With one term the path, the pivots, the certificate and the bytes are v1/v2's.
Certificate. The settlement record carries the active set (as indices
of the constraint enumeration, futarchy-system.md §9 C46) and the KKT
multipliers κ_j (§2 — never the estimate's μ̂); anyone re-checks, in exact
arithmetic and in the order the futarchy-system.md §4 B12 row fixes (the
order decides which refusal a record with several defects is named by): the
matrix REBUILT from the window's rows through B9's builder and its hash held
to winsorized's and estimate's (C41 — never read from a record); the
shapes (K = 0 refused); the fallback's rules through exhaustion_of (w^M
verbatim, Σ w = 1 re-checked); the estimate's rows; the certificate's
shapes (one multiplier per index, the indices ascending and distinct); the
budgets — steps_used ≤ step_budget,
bits_max_used ≤ rational_bits_max, every RECORDED rational within the
budget; the verifier's own intermediates are not bounded, since a tap writes
no record; primal feasibility (the simplex, the bounds, z_k := max(0, L^(k)(w) − ζ) reconstructed); dual feasibility (κ_j ≥ 0) and
complementary slackness (every active g_j = 0 exactly); stationarity (the
gradient of the Lagrangian f − Σ_j κ_j g_j − ν h — f the lifted objective
μ̂ᵀw − λζ − λ/((1 − α)K) Σ_k z_k − ε Σ_i w_i², h(w) = Σ_i w_i − 1 the simplex
equality (never h*, the close height) — zero in w, ζ, z —
∂w_i: μ̂_i − 2εw_i = ν − κ_lower,i + κ_upper,i − Σ_k κ_d,k R^w[k][i], ν
DERIVED at the cash coordinate and every other coordinate held to it, never
recorded; ∂ζ: λ = Σ_k κ_d,k; ∂z_k: λ/((1 − α)K) = κ_z,k + κ_d,k); then
the strict uniqueness identity over the probe set of futarchy-system.md §9
C45 (defence in depth: the KKT conditions are sufficient for the concave
lift over a polyhedron, so a verified record IS the maximizer and a probe
fails only against a non-maximizer). The verifier proves the VALIDITY of an
optimized record; a fallback against a healthy estimate it can only hold to
ŵ* = w^M — a forged one is refused only by re-running B12 and comparing bytes,
the solver's gate. The verifier
(futarchy::verify_settlement) precedes the solver, so the tap exists
independently of the optimizer. The certificate
is not claimed to be the UNIQUE one — at a degenerate optimum several active
sets certify the same ŵ* — only to be A valid certificate, and to be the
one the pinned pivot path produces: the path is a function of the inputs, so
the recorded bytes are too, and that is what byte identity needs. A record
whose certificate fails to verify is corrupted history (§14), and the check
is a tap that never calls the optimizer ("a genuinely independent check
means not calling the function under test", CLAUDE.md §2–4 item 3).
On v3 (settlement/v3; the v3 verifier fold::certificate_v3, the tap settlement_reproduces_v3) the record carries zetas — one ζ_t per term, daily then weekly — in place of the one zeta, and the KKT rows are per term: f = rᵀw − Σ_t (λ_t ζ_t + c_t Σ_k z_t,k) − ε Σ_i w_i²; ∂w_i: r_i − 2εw_i = ν − κ_lower,i + κ_upper,i + Σ_{g∋i} κ_g − Σ_t Σ_k κ_tail,t,k L_t[k][i]; per term ∂ζ_t: λ_t = Σ_k κ_tail,t,k, and ∂z_t,k: c_t = κ_z,t,k + κ_tail,t,k with c_t = λ_t / ((1 − α) K_t). The verifier's order is v2's with the two matrices and r re-derived from balance_series/v2 through the one builder the fold shares (no hash, futarchy-system.md §9 C97), and the sparse rule first among the fallback's rules (below).
Tie-break. The ridge makes the maximizer unique; tie_break_rule is the
note's "backstop for exact numerical ties" and selects the lowest-index
vertex among exactly equal objective values — reachable only if ε were 0,
which the document refuses.
Fallback (fallback_rule v2 — the default, v1 a declared version; §15 D6 — the economist: "we need a
fallback"): if either budget is exhausted before the certificate holds — and an estimate carrying exhausted (B10's budget overrun, futarchy-system.md §9 C44) is such an exhaustion: the optimizer does not run and the record says fallback: true with bits —
ŵ* := w^M. Under v2 an exhausted capped_share/v2 (Γ_C's budget, futarchy-system.md §9 C72) is the third: B12 v2 reads it FIRST, after the raw share's shape and before feasible_set/v2 — nothing of the feasible set is read — and writes the same fallback with caps, never optimising over B11 v2's all-cash set; CAPS PRECEDENCE: with the estimate exhausted too the code is caps; the verifier refuses an optimised, bits or steps record under an exhausted capped_share/v2 and a caps record against a healthy one (BUILT, task 143 step 3h; futarchy-system.md §9 C44, C72). On the LIVE path that caps fallback is never reached — CONFIG (futarchy-system.md §9 C72, task 143 step 3j-2): an exhausted capped_share/v2 makes the allocation all-cash (the note's "use the all-cash allocation"), every bookmaker's ceiling 0, which a manifest refuses, and a manifest naming no sleeve refuses to start (§8), so no run is included, min_distinct_matches cannot be 0 (futarchy-system.md §9 C6) and B7 aborts too_few_matches, refunding every stake whole and untaxed (C22: an abort is no settlement) — B7 v2 and v3's ending; on the v3 chain that window closes with no match and SETTLES on the sparse fallback, taxed (futarchy-system.md §9 C93 before C72's arm); B12 v2's caps arm holds the block contract on a constructed input no live epoch reaches; moot while pool_tax = 0 (C16). Then every v_i = ŵ*_i / w^M_i = 1, w^I stands as
implemented, and the record says fallback: true with the budget that ran
out. The TAX on that path is B13's arithmetic, so B13 declares fallback_rule
too (a spanning rule, B12's text) and builds v2 alone — a
document pinning v1 is refused typed (FallbackRuleUnbuilt), never priced
untaxed by a block that did not build it. Σ ŵ*_i = 1 and ŵ* = w^M ∈ W, so conservation holds; the one thing
ŵ* = w^M need not satisfy is a CAP — w^M ∉ F is exactly the case Γ_C
exists for — which is why §14's cap check is scoped to the optimizer's
output and not the fallback's.
The fallback on the v3 chain (fallback_rule v3: "on budget exhaustion, on Γ_C v2's exhausted budget, or on a sparse window (fewer distinct matches than the floor, B7 v4) ŵ* := w^M exactly, the pool tax still applied"; futarchy-system.md §9 C93, R54). After the input shape checks B12 v2 runs before its caps fallback, B12 v3 reads the SPARSE condition first — window_closed's distinct-match count below min_distinct_matches — and writes ŵ* := w^M with exhausted = sparse (code 3, settlement/v3 only), no arithmetic formed and nothing further read; then caps (C72), then the derived constants' bits, then the solver's steps and bits. B13 v3 prices the sparse fallback like every fallback, v_i = 1, the tax levied: every v_i = 1, so below the floor no prediction gains or loses beyond the tax; scoring sparse evidence is the economist's rule. This is the user's edge default standing in for the economist's sparse-evidence rule (R52 (ii)): below the floor the window settles on the stake split less the tax, at or above it the objective scores; his rule replaces it from the first epoch whose rule chain declares the block carrying it.
Two things about the fallback are departures from the futarchy note, and both
are recorded rather than smoothed over. First, the note boxes ŵ*_T ∈ F, and
w^M is precisely the object the same note says may violate the caps — so
on the fallback path settlement is priced by a vector outside the
feasible set. Nothing a bookmaker RECEIVES leaves F: the implemented
allocation is still w^I = Γ_C(w^M) and capacity was granted at the close.
What leaves F is the pricing vector, and with every v_i = 1 that pricing
returns each net position — less the declared pool tax under v2 — rather than redistributing it. The economist asked for a
fallback ("we need a fallback"); this is the cheapest one in evidence terms,
and it is his to replace.
Second, the tax on the fallback path (§15 question 6). The posted
default worded it "stakes are returned" — fallback_rule v1: every staker
receives r_ij back whole, no tax, no residue, no charge. The DEFAULT is v2: the tax is levied on the fallback path exactly as on the
optimizer's — Π_ij = ⌊r_ij (1 − τ_pool)⌋, T_tax = τ_pool R, the rounding
charge as §12 — because the 2 October text ("Taxation and fees?") STATES the rule, and the 19 October note keeps it ("The fee rate is τ, fixed before the futarchy market opens", "Participants and stakes") ("Fees must be
declared before the market opens … the rule must apply independently of the
final allocation"), and a stated rule is 7(a)'s, not an open value; v1 stays
a declared version the economist may pick, and the two are indistinguishable
while pool_tax = 0 (futarchy-system.md §9 C16, C22).
12. Payouts, the tax, the cap and conservation #
On the RAW share (the futarchy note, "Settlement" and "Outcome payouts"): "settlement odds use the raw pool share w^M_i = R_i / R, not the
constraint-adjusted implementation weight w^I_i" —
v_i = ŵ*_i / w^M_i; pool liabilityP_i = ŵ*_i R;Π_ij = r_ij · ŵ*_i / w^M_ibefore fees;Σ_i P_i = R("Pool accounting").
The tax (the 2 October text, "Taxation and fees?"; the 19 October note, "Participants and stakes": "The fee rate is τ, fixed before the futarchy market opens", and "Pool accounting": τ = 0): T_tax = τ_pool R,
R_net = (1 − τ_pool) R, P_i = (1 − τ_pool) ŵ*_i R, Π_ij = r_ij (1 − τ_pool) ŵ*_i / w^M_i; "aggregate payouts equal (1 − τ)R, while τR is
transferred to the protocol treasury or another predeclared recipient" —
tax_recipient, the account the CEO names there (§1; §15 question 4 — D4
rules out a burn and does not pick the account). "Bettors' aggregate P&L
before any other fees is −τR." B13 writes v_i, v'_i, P_i,
T_tax and the residue as EXACT rationals — nothing is rounded there (§13:
one rounding per quantity): B14 floors each payout, and B15 floors the tax
and the residue ONCE, their dropped fractions joining the one rounding
charge (futarchy-system.md §9 C48 (b): tax_amount = ⌊τ_pool R⌋).
The payout cap, and the one place it strains the note (§15 question 5 —
D8 records only the 1-cent minimum stake and the seed, and names no options).
The
cap v'_i = min(v_i, v_max) bounds the dust-leverage hole: a one-unit
stake on a near-empty pool whose ŵ*_i is large would otherwise pay
ŵ*_i R / R_i without bound, and the utilization cap bounds every
bookmaker pool but not cash, which the futarchy note exempts while making an
all-cash allocation feasible. The amount the cap diverts is NOT dust when
it binds: on a pool holding a small share of R against a large ŵ*_i, a
cap of 3 can send tens of percent of the whole pool to the recipient in one
epoch.
So the cap is specified here and has no producer. No note contains a
payout-multiple cap; its residue moves participants' money to a protocol
account in an amount that depends on ŵ*, which is exactly what the futarchy note's fee
rule forbids — "the rule must apply independently of the final
allocation". The engine therefore does not build the diversion ahead of its
owner's answer, and it does not fake the absence with a big number either:
payout_cap_rule v1 is NO CAP — v'_i = v_i everywhere, no v_max field in
the document, cap_residue = 0 in every epoch, pinned as a tap (§14). v2 is
the cap, with v_max present and the residue to tax_recipient; §15
question 5 asked whether it should exist at all — CLOSED (no cap, futarchy-system.md §9 R12). The alternative that needs no
cap is the one the dust-leverage finding itself suggests: the minimum stake
plus a seed per pool large enough that no pool can be dusted — stated in full
here rather than by an option letter, since D8 lists none. Under v2 the
pool's liability is
(1 − τ_pool) R_i v'_i and the RESIDUE (1 − τ_pool) Σ_i R_i (v_i − v'_i)
goes to tax_recipient.
That residue's MAGNITUDE depends on ŵ* — and the 2 October text's fee rule ("Taxation and fees?")
says "Fees must be declared before the market opens. They may be deducted
from the common pool or from settlement payouts, but the rule must apply
independently of the final allocation." The cap's RULE is declared before
the market opens and is independent of the allocation; the AMOUNT it
diverts is not. So either the cap is not a fee in the note's sense (a
bound on a pool's payout multiple, outside the note's fee machinery), or it
is a fee the note's sentence forbids. The engine took no side: v_max is
a field, payout_cap_vmax, and §15 carried the question to the economist
in his own terms, with the alternative that needs no cap — the minimum
stake and a seed per pool large enough that no pool can be dusted (the
alternative stated in full above, since D8 lists no options); he CLOSED it
with no cap (§15 question 5), so v2 stays a declared version
nobody builds and B13 refuses a document pinning it (PayoutCapUnbuilt). The cap is a
RULE VERSION, never a number: payout_cap_vmax is present only under v2,
and v1 — the default — has no field to set.
Integer rounding — the economist's rule (rounding_rule v1). He
proposed it himself, on the sub-unit-payout thread (the recorded comment): "What if we effectively pay (suggested payout // minimum unit of
accounting)? The remainder is therefore an additional protocol charge." So
each participant is paid the FLOOR of their exact share in money_unit,
Π_ij = ⌊ r_ij (1 − τ_pool) v'_i ⌋,
and the dropped fractions are summed into one declared ROUNDING CHARGE to
tax_recipient. Conservation is then exact by construction, with no
tie-break anywhere:
Σ_ij Π_ij + ⌊T_tax⌋ + ⌊cap_residue⌋ + rounding_charge = R— exactly, inmoney_unit;Σ_j PnL_j = −⌊T_tax⌋ − ⌊cap_residue⌋ − rounding_charge(the floors B15's, C48 (b)).
The charge is bounded by one unit per payout row — the tax's and the
residue's own dropped fractions included (futarchy-system.md §9 C48 (b); under
payout_cap_rule v1 the residue is 0, so the bound is m, the payout rows; a fractional
residue, which no existing version produces, would allow one unit more), so
equality with the row count is reachable and "fewer than the stake records"
is not promised — and it is dust at any serious stake size — and
min_stake_units is what keeps it dust RELATIVE to the stakes: at the 1
cent minimum (§15 D8) a participant can lose at most one cent of a payout
to it. The rule has two properties the alternative lacks: it needs no tie
order at all, so two observers cannot disagree about who got the spare
unit, and it never pays anyone MORE than their exact share.
B14 (futarchy::fold_stake_payouts) pays B1's positions — the
list close_book returns at the close, every net position above zero in
the order of each position's first row of any kind (§6; a position born by
a move at the move's offset, one grown by a later move or drained to 0 and
re-credited in its slot) — one stake_payout each, the amount formed as
⌊r_ij P_i / R_i⌋ from B13's EXACT liability (= ⌊r_ij (1 − τ_pool) v'_i⌋
term by term, since P_i = (1 − τ_pool) R_i v'_i; v'_i is not read,
τ_pool only to re-hold the stored record's net identity Σ_i P_i = (1 − τ_pool) R beside its conservation, so a record whose tax was folded into
the pools never pays; the split of Σ_i P_i across the pools is the
settlement's — an observer that reads a STORED pool_liability re-derives it
through B13 first — re-running B13 and comparing bytes, futarchy-system.md
§10's byte-identity tap —), the ℓ-th record stamped (h*, window_seq + 7 + ℓ) after
pool_liability's + 6 (futarchy-system.md §9 C49). The seeder's seeds
(C11) and a moved position at its destination (C12) are paid like every row;
B14 writes no charge — the dropped fractions, below one unit per position in
all, are B15's.
B15 (futarchy::fold_epoch_settled) writes the epoch's settlement
record — tax_amount = ⌊T_tax⌋ and cap_residue = ⌊cap_residue⌋, the first
and only rounding of each (futarchy-system.md §9 C48 (b)), payouts_total
the sum of B14's floors, and rounding_charge = R − payouts_total − tax_amount − cap_residue, so the identity above holds exactly in
money_unit by construction (the four amounts re-add to R). What B15
HOLDS, before it floors: the stored liabilities' signs, conservation and net
identity (the home shared with B14) and T_tax = τ_pool R against the
document's rate — which, with conservation and the net identity, holds iff
cap_residue = 0 —, the payouts per pool against P_i (the whole within Σ_i P_i follows),
rounding_rule v1 (the bound below is v1's), and the charge's
RANGE: at most one unit per payout row (rounding_charge ≤ m) — a charge
above m means a payout below its floor, corrupted history (§14). The
bound's detection power is a recorded limitation: a shortfall of at most m
units in all, or a payout list padded with zero payouts, passes, since B15
receives no positions by its declaration — the composition runs B14 for
real, and a STORED payout list is accepted only when B14's re-fold over B1's
positions and the stored pool_liability reproduces its bytes
(payouts_reproduce, the chain-level tap of futarchy-system.md §10, named
here and in §14 as the condition that makes the limitation safe; with
the composition). The three amounts go
to tax_recipient; the record carries no account — the document's field is
read by whoever publishes them (futarchy-system.md §9 C50), stamped
(h*, window_seq + 7 + m) after the m payouts.
The alternative, pinnable under the same field as v2, is the engine's
largest-remainder rule (normalize_exact's — model-plugin-layer §6: floor,
then the spare units to the largest fractional remainders, ties by LOWER
index; here the lower index is the earlier position in B1's first-row order). It keeps every
unit with the participants instead of
the protocol, at the cost of a tie order that decides who receives a spare
unit. Example of the difference — three 1-unit stakes against a pool
liability of 2 units: v1 pays 0, 0, 0 and charges 2 to the protocol; v2
pays 1, 1, 0 by position order. The economist's v1 is the version with a producer.
A consistency check against the business paper's instance. The GRID
discussion paper works the market through once in round numbers,
with pool_tax at zero — its "With prediction fees omitted" — and it is
consistent with §7 and §12 term by term. A $100 000 underwriting vault with a
SEPARATE $10 000 prediction pot; closing stakes of 20 % on cash, 40 % on desk
A and 40 % on desk B; no limit binding, so w^I = w^M and the ceilings are
$20 000 held as cash, $40 000 and $40 000 (§7). The assessment returns
ŵ* = (0.20, 0.50, 0.30) in that same cash-first order, so the pools take
ŵ*_i R = $2 000, $5 000 and $3 000, summing to R (§12), and
v_i = ŵ*_i / w^M_i is 1.00, 1.25 and 0.75 — a $100 stake returns $125 on A
and $75 on B, which is what the paper states. It is a check, not a
confirmation: the paper is downstream of the same notes and defers its
mechanics to the economist's and our own inserts. Both of its cautions travel
with it — "These transfers neither create vault trading profit nor establish
an underwriting APR", and "The assumed assessment illustrates settlement
accounting, not a simulation result."
Worked instance (money_unit = cent, total pool R = 100 000,
τ_pool = 1/50, payout_cap_rule v1; the instance was
first worked under v2 with v_max = 3, never reached, and every number
below is the same — pools cash / A / B): pool totals (R_1, R_2, R_3) = (60 000, 25 000, 15 000) — every pool SEEDED first (the
futarchy note's r_i1 > 0; a non-seed first row is corrupted history, §6):
cash holds the seeder's 1 000 and one 59 000 stake, A the seeder's 1 000
then 19 000 and 5 000, B the seeder's 1 000 then 14 000 (re-split
from an earlier 20 000 / 15 000 split, which broke the seed-first rule; the totals and everything derived from them are
unchanged — futarchy-system.md §7's E2 log carries exactly these rows) →
w^M = (0.60, 0.25, 0.15) (the note's vector; w̄ = (1, 0.50, 0.50) — for this example bookmaker_cap_max = 1/2 and a non-genesis epoch with n · w^I_{prev} ≥ 1/2 for A and B, so the caps pass §3's checks — keeps
w^M ∈ F, so w^I = w^M and V = 1 000 000 mills gives V_i = (600 000, 250 000, 150 000) — A's and B's sleeves quote under 250 000 and 150 000
mills, 600 000 stays in reserve). Settlement returns ŵ* = (0.30, 0.40, 0.30): v = (0.5, 1.6, 2.0), none above v_max; T_tax = 2 000; pool
liabilities (1 − 1/50)·(30 000, 40 000, 30 000) = (29 400, 39 200, 29 400);
29 400 + 39 200 + 29 400 + 2 000 = 100 000 ✓. Pool A holds three
positions, 1 000 / 19 000 / 5 000: their exact shares of 39 200 (1.568
per staked cent) are 1 568, 29 792 and 7 840, all whole, so the floor
costs nothing — P&L +568, +10 792 and +2 840. Cash's two rows take
29 400 · 1/60 = 490 and 29 400 · 59/60 = 28 910, and B's two rows
(1.96 per cent) 1 960 and 27 440 — every share whole, so the rounding
charge is 0 on this instance and the parts sum to R with nothing left
over.
Split that cash stake instead into 29 999 and 29 001 (the pool still totals
60 000 with the 1 000 seed, so nothing above changes). The pool's unit payout
is 29 400 / 60 000 = 0.49 per staked cent, so the three exact shares are
490, 14 699.51 and 14 210.49; the floors pay 490, 14 699 and
14 210 — 29 399 in all — and the one remaining cent is the rounding
charge to tax_recipient. 29 399 + 39 200 + 29 400 + 2 000 + 1 = 100 000
✓. In the
fallback on the UNSPLIT book (ŵ* := w^M): v = (1, 1, 1); under fallback_rule v2 (the
default) each position — every stake row here is a position of its own, there being no withdrawal — is paid ⌊r_ij · 49/50⌋ — 980 and 57 820 on cash,
980, 18 620 and 4 900 on A, 980 and 13 720 on B — and T_tax = 2 000, so
98 000 + 2 000 = 100 000 ✓ with no cap residue and no rounding charge (every share whole);
under v1 every stake would be returned whole and the tax not levied (§11).
The participation yield (the futarchy note, "Participation yield"; B14b, participation_yield_rule v1 — BUILT as futarchy::fold_participation_yield with its record and declaration, task 143 step 3i, in the v2 chain (chain::declared_chain_v2, task 143 step 3j-1) and folded by the composition's v2 branch (fold_to_settlement, task 143 step 3j-2)) — paid beside the payouts from a budget outside the pool: a substake is a portion of a participant's stake in a pool with the height it was last placed. The ledger is built per (participant, pool) from the epoch log's stake rows in offset order up to the first block_final at or above M (the slice B1 reads): stake_recorded at height d opens a substake; stake_moved closes substakes of the SOURCE pool NEWEST first — newest is the LARGEST HEIGHT (the note's timestamp), ties by the largest log offset, since admission holds a row's height only at or below the latest final and a later offset may carry a lower height; the tie by the largest offset is a determinism rule with no effect on H or any halt, since equal heights carry equal weights (futarchy-system.md §9 C54 — the note: "If only part of a stake is moved, reset the timestamp only for that part", which part unnamed; newest first keeps the most duration for the mover, where the alternatives are oldest first, FIFO, under which the mover keeps less duration — the move gate's p1 holds 38 500 against 38 800 — and pro-rata, neutral between portions) — a partial close shrinking that substake, and opens one in the destination at the move's height; a move whose source pool is its destination is refused (YieldDisagrees("pool"), a defensive re-hold — B1 refuses it first as MoveSamePool); C54 is read as the ONE closing rule, so stake_withdrawn closes newest first the same way — a dead arm under v2, which refuses withdrawals (C12), kept as a total rule; amounts and heights freeze at M, and the open substakes per (participant, pool) equal B1's position exactly (corrupted history otherwise). H_j = Σ_i Σ_d s^(d)_{ij} (M − d) / (M − open_height) (field 48 — no stake row precedes it, the chain reader records from it, so no weight exceeds 1); Y_j = ⌊y H_j / Σ_m H_m⌋ in money_unit, y = participation_reward_units (64, default 0 — the yield is off until a value is set, C64); the floor is participation_yield_rule (66)'s own, separate from rounding_rule (37): the remainder y − Σ_j Y_j is UNPAID — never a charge to tax_recipient — derivable, as B15's charge is, and an integer below the number of participants with H_j > 0 (each floor loses less than one unit; NOT bounded by the row count — with y = 1 and two equal weights every Y_j = 0, no row, remainder 1); with y = 0 or Σ_m H_m = 0 no row is written — after every halt, so corrupted history is named under the default too (the rounding, C64). THE SEEDER is a participant AS THE NOTE STATES (C64): "Index the M futarchists by j = 1, …, M" ("Participants and stakes"), "The first futarchist, indexed by j = 1, supplies a positive initial stake to every outcome" and "Initial stakes follow the same rules as later stakes" ("Opening and initial stakes"), and Σ_{m=1}^{M} H_m includes j = 1 (the note's M there the futarchist count, §2) — so its seeds are ordinary stake rows held from their height and C11 pays it like every row, its substakes count in H and its row is written when positive — allocation-side accounting, not the vote of C8 / R20; once y > 0 its duration dilutes every other row. The inclusion is a property of rule 66's identity (a rule version, not a config field): excluding the seeder would depart from the note and could come only from a dated ruling record (law 7(c)), never by swapping a value. "Participation yield is independent of betting gains and losses, so a losing position remains eligible. It accrues only during [t_1, t_2)". The yield is not part of the closing pool (the note's S, this document's R); its funding is outside the engine — the payout publisher (futarchy-system.md §7 E5) reads the rows as it reads the payouts. One participation_yield {participant, amount} per participant with Y_j > 0, in the order of each participant's first appearance in B1's position list (a participant whose earliest pool was drained appears where its first surviving position does), before epoch_settled.
13. The determinism bridge #
The notes say independent observers "should" obtain the same ŵ*_T; here
that should is a MUST (core law 2; CLAUDE.md law 7(d)):
- Arithmetic. Stake sums, capacities and payouts are integers;
w^M, B13'sv_i,P_i,T_taxand residue,w^I,R_it,μ̂, the CVaR auxiliaries,ŵ*and the certificate are exact rationals (§15 D6) — fractions of arbitrary-precision integers bounded byrational_bits_max, reduced to lowest terms at every step so the representation is canonical. No float, no RNG, no wall clock, no unordered iteration anywhere in the fold (clippy.toml enforces the bans mechanically); the only time in the layer is the chain's block height and the runs'replay_ts. - One rounding per quantity, at the declared place: the capacities
V_iin mills (§7, every pool floored, the whole leftover to cash), the payouts inmoney_unit(§12, floored with the dropped fractions charged) and the tax and the cap's residue inmoney_unitat B15 (floored, the fractions in the same charge — futarchy-system.md §9 C48 (b)); B13's liabilities are exact and rounded nowhere. Never a rounded intermediate, and never one rule read for the other. - A fixed iteration budget (
step_budget,rational_bits_max) and a declared fallback — no tolerance-terminated loop, no "close enough". - A certificate anyone re-checks (§11) in the same arithmetic — the independent recompute the determinism harness runs on every other stream.
- Byte identity. Two folds over the same epoch log and the same sealed run streams produce the same allocation stream, byte for byte; the determinism harness (architecture.md) re-runs the allocation fold from the epoch log and the included runs' root logs as it re-runs every run from its roots.
14. Refusals and verification taps #
Refused at the edge / halting if recorded (event-catalog §4's posture — a fold never guesses on corrupted history):
| Condition | Where |
|---|---|
an unknown or missing document field; a rational not in lowest terms; ε = 0; w̄_1 ≠ 1; a bookmaker cap ≠ min(bookmaker_cap_max, n · w^I_prev) with a previous allocation, or ≠ ε₀ without one (CapTransition / CapBootstrap) |
the document (§3) |
a second epoch_opened; an epoch_opened whose epoch_id, system_hash, document_len or replay_ts disagrees with the stored document; a stake, withdrawal or move below open_height, at or past the close, ahead of the latest recorded final block, from an unlisted participant, on an unlisted pool; a stake_moved row, checked in THIS order with the first failing check naming the halt : the envelope's height against the body's (EnvelopeHeightDisagrees), under stake_mobility none (MoveForbidden), the shared admission rules above, a repeated tx_id (DuplicateTx), one pool named twice (MoveSamePool), an unlisted pool (UnlistedPool), below the minimum (StakeBelowMinimum), onto a pool before its first row (MoveOntoUnseededPool), beyond the source position (MoveExceedsPosition), zeroing the source pool (MoveZeroesPool), leaving the source position below the minimum (MoveLeavesDust), or — like a withdrawal — taking the seeder's position below seed_units[i] (SeedStripped); the withdrawal arm checks its mobility gate first, then the admission rules, a repeated tx_id, an unlisted pool, then its bounds (beyond the position, zeroing the pool, leaving dust, the seed floor) |
the epoch log |
a run_included whose manifest cites another epoch, lists a sleeve not in pools, or carries a ceiling_mills ≠ V_i (the one-live-run chain) or, under the shared-line chain, a recorded row of the other version (RowVersion, defensive: the derivation's walker halts InclusionRowVersion first), a row whose sublimits are not the manifest's sleeves and ceilings (SublimitsDisagree), then the route's refusals, a ceiling_mills > V_i or a row breaking the line being LineExceeded (live_sum 0 for the former), refused in that order; a manifest whose allocation_ref names no record; a run citing an allocation that reaches Running with no run_included row; a run_included at or after the deadline or after window_closed, or whose height is not EQUAL to the latest final height recorded before it (a row stamped back or ahead); a run_included for a run naming a sleeve that already has an included run without a run_verdict row (CONFIG C31 — refused at the edge, halted by B7; the one-live-run chain); under B5 v4 (the v3 chain), a run_included naming a sleeve whose pool has an included run whose latest verdict row BEFORE this row is failed (SleevePending at the START, after LineExceeded; recorded, B7 v5 halts SleevePendingInclusion — futarchy-system.md §9 C100) |
the gateway and the runtime (§8; futarchy-system.md §4 B5) — at the start the typed refusals ManifestError::{InclusionMissing, InclusionUncited, Inclusion(Run ¦ AllocationRef ¦ CeilingRoute(…))} after the manifest's own validation, the derivation's InclusionBuildError::{Document, Fold(Halt), NotClosed, RowMissing, Layout}, the ceiling route's ForeignEpoch, ForeignOffset, SleeveNotAPool, CeilingMismatch (the one-live-run chain); under the shared-line chain, after Run and AllocationRef, RowVersion (defensive: the derivation's walker halts InclusionRowVersion first), SublimitsDisagree, then the route (ForeignEpoch, ForeignOffset, SleeveNotAPool, LineExceeded {sleeve, live_sum, requested, line}; a ceiling_mills > V_i is LineExceeded with live_sum 0), under B5 v4, then SleevePending (futarchy-system.md §4 B5 v4, §9 C100), in that order (futarchy-system.md §4 B5 v3, §10); AllocationForeign, AllocationShape |
recorded: a run_included row citing another epoch or another offset than the stream layout's allocation (InclusionForeign — the layout's offset, stream_offset, never a caller's number); a row whose height is not the latest final height recorded before it (InclusionHeight); a row whose run_id and manifest_hash disagree (InclusionIdsDisagree); a second row for one run (InclusionDuplicate); a stake, withdrawal or move row after the close (StakeAtOrAfterClose); a block_final after the close that is not its predecessor + 1 (HeightGap; past u64::MAX, HeightOverflow); a second epoch_opened (SecondEpochOpened); a record of another schema after the close (UnexpectedRecord); a malformed block_final before the close, or a malformed block_final, run_included or run_verdict after it (Record); a run_verdict row RE-CHECKED by the same pass : an included run, once (under window_rule v4 a second row only after failed rows), at the latest final height — VerdictUnknownRun, VerdictDuplicate (under v2 and v3 any second row; under v4 a row after a verified one), VerdictHeight; the layout without allocation (Layout, defensive); a record whose envelope replay_ts is not its body's height (EnvelopeHeightDisagrees — in the close's fold too); a run_included before the close — the allocation is derived AT the closing block_final, so "before the allocation" is before that block (the close's fold: UnexpectedRecord) |
the fold's B5 half, fold_through_inclusions (futarchy-system.md §4 B5) |
a run_included naming a sleeve whose pool has a liquidated row earlier in the fold's order (InclusionLiquidated), or a run_verdict{failed} row for one of its runs earlier in the fold's order, until a ruling (InclusionFailedVerdict, the same check — risk-engine.md §12 C87; replaced from the first epoch whose rule chain declares B5 v4, every epoch before it carrying C87 unchanged, by B5 v4's PENDING REFUSAL until the run's verified row — SleevePending at the START, SleevePendingInclusion in B7 v5, futarchy-system.md §9 C100); a manifest whose ceiling_mills exceeds leverage_max × own_capital_i under a document carrying fields 58 and 62 (CeilingRouteError::LeverageExceeded); a manifest whose exposure_caps entry is not the cited document's rows for that pool (ExposureMismatch); a manifest whose loss_band_mills is not R9's value for that pool, re-derived at the run_included row under a document naming R9 (LossBandMismatch) — risk-engine.md §3, §4, §7 |
the gateway and the runtime (§8) at the edge, which refuses first and computes the band from its replica of the desk fold; recorded, the liquidated, failed-verdict and loss-band refusals R6's own check — not B5's — (InclusionLiquidated, InclusionFailedVerdict, LossBandMismatch: the band reads the loss series, B6's output), and LeverageExceeded and ExposureMismatch the fold's B5 half (document and manifest reads, no desk record) — InclusionLiquidated R6 v1's own check — gate G4, landing with G3 (the futarchy fold); under B5 v4 the failed-verdict arm is B5's pending refusal, so R6 v1 names no InclusionFailedVerdict; LossBandMismatch declared with R9, no producer (risk-engine.md §3, §4, §7); the desk records R6's check reads shift the allocation stream's later offsets (§5's v3 offsets; risk-engine.md §11) |
a block_final whose height is not its predecessor's + 1 (a gap), or a chain reporting a different hash for an already-recorded height (a finality violation) |
the chain reader (§5) |
a document whose field 51 does not equal the recomputed system hash; a chain that is not a DAG over the root streams or names a rule identity with no implemented version; a previous_epoch_id that is neither the genesis anchor on a registry holding no epoch that counts for admission (C51: an epoch aborted before allocation is recorded but does not count; the replacement genesis opens at or after its abort height) nor the latest epoch holding an allocation record with no successor registered yet (read: an OPEN successor leaves the predecessor the answer with its slot Taken; an ALLOCATED successor becomes the answer; a successor that aborted before allocation frees the slot — FreedByAbort, the max abort height); a replacement successor that does not open at or after the aborted one's abort height |
the document (§3) and the fold (§9; futarchy-system.md §3–§4) |
a STORED EPOCH the registry's replay of admission refuses (futarchy::registry::rebuild — every refusal a corrupted store, a document the loader would have refused): a stored key the document does not hash to (IdDisagrees); a document that does not encode (Document); an epoch stored twice (DuplicateEpoch, decided over the keys before any read); a stream off event-catalog §6.17's layout, held as a prefix automaton — seq not the record's index, a replay_ts that decreases, a first record other than document_checked at seq 0 stamped at the document's open_height, after it anything but B1's epoch_aborted or book_closed · raw_share · capped_share · allocation (under v2 capped_share/v2 · allocation/v2 in the last two places — the layout of the document's version, read from the one table chain::layout, task 143 step 3j-1), either branch on one stamp, the document's close_height, after the allocation anything but return_observed, B7's epoch_aborted or the window records in order (seven under v1; eight under v2, balance_series second) then stake_payout, under v2 participation_yield*, and epoch_settled all on window_closed's stamp (a yield row in a v1 stream or a payout after a yield row out of shape), a record after an end record, a stream ending anywhere but after document_checked, after allocation and its return_observed rows, or at an end record (a torn segment), a weight count not the pool count, an allocation/v2 whose capacities are not one per pool or do not sum to vault_capacity_mills, or a fallback one naming a bookmaker capacity (StreamShape); the share a v2 epoch answers with is allocation/v2's V_i / V_prev reduced to lowest terms (0 for every bookmaker under outcome = fallback), its used capital utilization/v2's peak_used; a document_checked or allocation naming another epoch (StreamDisagrees); a status-bearing record that does not decode (Record); a recorded share that is negative or over 64 bits (ShareOutOfRange); and the registry's own admit in the total order (open_height, epoch_id) against the answer as of each opening — a successor claim (field 39 the id of an epoch the registry holds at that opening; an orphan, whose predecessor is absent or later in the order, replays as a genesis claim, the anchor B0's Link) that is not the latest allocated epoch's (WrongPredecessor), whose slot is taken (SlotTaken) or live (PredecessorLive) or whose heights it does not meet (OpenBeforeTerminal — only against an answer read later than the opening), a genesis claim beside an epoch that counts (GenesisBesideLineage) or below C51's floor (GenesisBeforeAbort, likewise) — the first inadmissible epoch in the order (Inadmissible { epoch_id, reason }), so two rebuilds over any permutation agree |
the registry (futarchy-system.md §3), the loader at open |
the LOADER's own refusals at a run's start, before the fold (futarchy::inclusion_from_store; futarchy-system.md §10): the log's first block_final absent or not at open_height (OpeningBlockMissing — §3 field 48's row, read for every claim; a malformed one is the fold's Record at that offset); and the epoch store's (futarchy-system.md §11 W10, runtime::epoch_store::StoreError): an entry that is not a directory named by the id's 64 lowercase hex digits (Foreign), a stored document that does not hash to its entry's name (Key) or fails the document check (Check), a file missing or unreadable (Io, Segment), a document over the cap or undecodable (Document) — each named with its path, the whole read refused |
the loader at open (the two binaries' edge) |
the window's log-side halts (B7; window_closed is the fold's OWN record, so its instant, its membership and its offset hold by construction — two folds of one log agree to the byte), checked in THIS order with the first failing check naming the halt: a deadline or grace end that leaves u64 (WindowOverflow); a run_included at or past the deadline (InclusionAfterDeadline); per inclusion in record order, an included run with no manifest sleeve set, or an empty one (RunManifestMissing) and a second run_included naming a sleeve whose earlier included run has no run_verdict row before it (SleeveRunLive, C31 — a document of the one-live-run chain); under the shared-line chain (B7 v3), per inclusion in record order, the same RunManifestMissing first, then in SleeveRunLive's place a row that is not run_included/v2 (InclusionRowVersion, defensive: B5's pass halts it first), then a row whose sublimits are not its run's decoded manifest's sleeves and ceilings (SublimitsDisagree), then a row whose sublimits break the line (SleeveLineExceeded {offset, sleeve, live_sum, requested, line}, the smallest violating sleeve, C89; a sleeve no pool lists HALTS SleeveLineExceeded with line 0 (a line of 0 admits nothing, a 0 sublimit included — the START refuses it SleeveNotAPool)); a sealed run of the inventory with no run_included row (SealedRunNotIncluded — the sealed-run row below); a Verified verdict with no return_observed row (ReturnMissing); under B7 v5 a row naming a sleeve whose pool has an included run whose latest verdict row BEFORE this row is failed, after SleeveLineExceeded (SleevePendingInclusion {offset, sleeve, run_id}, C100); these run before the outcome, so a log short of the deadline still halts; once the terminal exists, a run_verdict after the window's terminal record (VerdictAfterWindow — reachable only after an abort; refused at the edge) |
the fold, on the window (§9; futarchy-system.md §4 B7, §9 C37) |
the balance series' log-side halts (B6b; balance_series is the fold's OWN record, derived from the window's rows and their stamps), checked in THIS order with the first failing check naming the halt: a caps_rule v1 document (CapsRuleNotV2 — no own capital; the v2 chain's B0 admits only v2); a capacity or own-capital vector not one per document pool, or a pool list without cash at 0 and bookmakers after it (Shape, defensive — B0's CashPool and the document check refuse both); the SAME four row checks as B8's row, in the same order and from the same home (rows_of_window_by, over the stamped rows): ReturnForeign, ReturnDuplicate, ReturnPoolsDisagree, then ReturnMissing; a grid that does not divide the window (Shape, defensive — B0's SnapshotGrid) and a deadline below window_blocks (Shape, defensive — B7 writes M + window_blocks); per row in D_T order a verdict height below M or above h* (SeriesHeight — corrupted history, C59); then per bookmaker pool and interval an amount past rational_bits_max (BitsExceeded — a HALT, never a fallback: a series has no budget; unreachable on honest data, every value an integer of at most 64 bits, a sum of at most K · |D_T| of them or a ratio of two such, under the document's floor of 128 bits on the budget — B11's argument); OffsetOverflow (the record's offset past u64) the last defensive arm |
futarchy::fold_balance_series (§9; futarchy-system.md §4 B6b, §9 C56, C59) |
the utilization's log-side halts under v3 (B8 v3; balance_series is the fold's OWN record — its decoder holds the row shape, the block holds the document side), checked in THIS order with the first failing check naming the halt: UtilizationRhoZero (ρ = 0, defensive — the document check refuses it); a series whose stamp is not the window's h* (SeriesDisagrees("stamp") — B6b stamps it so); per series row in record order a pool that is not one of the document's non-cash pools (SeriesDisagrees("pool") — a cash row or a stranger's); then per non-cash pool in document order the quotient max_k η / ρ past rational_bits_max (BitsExceeded — a HALT, never a fallback; with η = p/q, p ≤ U^peak < 2^64, q ≤ B_{i,k*} the balance at the peak snapshot, and ρ = a/b with a ≤ b < 2^64, the quotient p·b / q·a has at most max(128, bits(B_{i,k*}) + 64) bits before reduction — so honest data reaches the halt only when a desk's balance at its peak snapshot exceeds 2^64 mills — a document whose own capital plus capacity plus realized results stays below 2^64 mills never reaches it, and at the default of 4 096 bits (C23) no u64 capital and i64 result record can; where it fires it freezes the epoch, the one deliberate exception to C44's rule that honest data must not freeze the epoch, admitted because such a balance is beyond what the per-run record can carry; stated, not assumed); OffsetOverflow (the record's offset past u64) the last defensive arm; a pool absent from the series is C56's no-series pool, (0, 0), never a halt |
futarchy::fold_utilization_v2 (§10; futarchy-system.md §4 B8 v3, §9 C55, C56) |
the utilization's log-side halts (B8; utilization is the fold's OWN record), checked in THIS order with the first failing check naming the halt: per return_observed row in record order, a row for a run outside D_T — a Failed run's or a stranger's (ReturnForeign), a run's row twice (ReturnDuplicate), a row set that is not the document's non-cash pools ascending (ReturnPoolsDisagree); then, in D_T order, a run of D_T with no row (ReturnMissing); VaultCapacityZero (§3 refuses V = 0) and OffsetOverflow (the record's offset past u64) are the defensive arms no checked document or real log reaches |
the fold, on the window (§9; futarchy-system.md §4 B8) |
the winsorized matrix's log-side halts under v2 (B9 v2; balance_series is the fold's OWN record — its decoder holds the row shape, the block holds the document side), checked in THIS order with the first failing check naming the halt: a caps_rule v1 document (CapsRuleNotV2 — no grid); a grid that does not divide the window or gives no interval (Shape, defensive — K ≥ 1, B0's SnapshotGrid); the series' document-side checks from the one home shared with B8 v3 and B10 v2 — a series whose stamp is not the window's h* (SeriesDisagrees("stamp")), per series row in record order a pool that is not one of the document's non-cash pools (SeriesDisagrees("pool")) or a snapshot above K (SeriesDisagrees("snapshot") — B6b writes at most K; a doctored stored series), then a surviving pool not ending at K ("incomplete" — B6b writes it through K; a series cut short is corrupted history, so the joint zeros are the series' own); then the two usize conversions of K and of each recorded snapshot (Shape, defensive — unreachable on a 64-bit target); then per non-cash pool a threshold past rational_bits_max (BitsExceeded — a HALT, never a fallback; a threshold is one of the series' own recorded returns, each already held by B6b, so unreachable on an honest series); OffsetOverflow (the record's offset past u64) the last defensive arm; a pool absent from the series is C56's zero column, never a halt; a caps_rule v3 document handed to it halts ScoringFieldsNotLegacy at its read of the legacy scoring values (defensive — the four are retired on v3 and B0 refuses the pairing) |
futarchy::fold_winsorized_v2 (§10; futarchy-system.md §4 B9 v2, §9 C41, C53, C56) |
the winsorized matrix's log-side halts (B9; winsorized is the fold's OWN record): the SAME four row checks as B8's row, in the same order and from the same home (rows_of_window) — per return_observed row in record order a row for a run outside D_T (ReturnForeign), a run's row twice (ReturnDuplicate), a row set that is not the document's non-cash pools ascending (ReturnPoolsDisagree); then, in D_T order, a run of D_T with no row (ReturnMissing); OffsetOverflow (the record's offset past u64) and ObservedCapitalZero (a hand-built observed row at capital 0, which the decoder refuses) the defensive arms no real log reaches; a caps_rule v3 document handed to it halts ScoringFieldsNotLegacy at its read of the legacy scoring values (defensive — the four are retired on v3 and B0 refuses the pairing) |
the fold, on the window (§10; futarchy-system.md §4 B9) |
the estimate's log-side halts under v2 (B10 v2; balance_series and winsorized/v2 are the fold's OWN records — the series' decoder holds its row shape, B10 v2 rebuilds B9 v2's record from the series), checked in THIS order with the first failing check naming the halt: a caps_rule v1 document (CapsRuleNotV2); a grid that does not divide the window or gives no interval (Shape, defensive — K ≥ 1, B0's SnapshotGrid); the series' document-side checks from the one home shared with B8 v3 and B9 v2 — the stamp (SeriesDisagrees("stamp")), per row the pool ("pool") and the snapshot above K ("snapshot"), then a surviving pool not ending at K ("incomplete" — B6b writes it through K; a series cut short, an opening row alone among them, is corrupted history, so T_i ≥ 1 stands); then B9 v2's record re-derived from the series — the winsorized hash the rebuilt matrix does not reproduce (MatrixHashDisagrees), then the raw hash (RawHashDisagrees), then a k ≠ K (WinsorizedDisagrees("k")), then thresholds not the recomputed ones ("thresholds") — the recount BEFORE any arithmetic; ShrinkStiffnessNotPositive (defensive); OffsetOverflow (the record's offset past u64); then the arithmetic — a sum, mean, δ or μ̂ past rational_bits_max is NOT a halt but the record's EXHAUSTED outcome (C44); the two usize conversions inside the builder (Shape, defensive) sit where B9 v2's row puts them; no ObservedCapitalZero arm (no per-run capital is read); a caps_rule v3 document handed to it halts ScoringFieldsNotLegacy at its read of the legacy scoring values (defensive — the four are retired on v3 and B0 refuses the pairing) |
futarchy::fold_estimate_v2 (§10; futarchy-system.md §4 B10 v2, §9 C42, C44, C56) |
the estimate's log-side halts (B10; estimate is the fold's OWN record, winsorized its input): the SAME four row checks first (one home); then B9's record re-derived from the window's rows IN THIS ORDER — a matrix_hash the rebuilt matrix does not reproduce (MatrixHashDisagrees), then a row count that is not the document's pools (WinsorizedDisagrees naming rows), then a row naming another pool than the document's at its place (pool), then a k ≠ K (k), then per document pool a T_i the recount does not reproduce (observed_runs) — the recount BEFORE any arithmetic, so the order holds whatever the budget does; a record folded from these very rows that disagrees with them is corrupted history (§6); a sum, mean, δ or μ̂ past rational_bits_max is NOT a halt: the record's EXHAUSTED outcome (futarchy-system.md §9 C44); OffsetOverflow, ObservedCapitalZero and ShrinkStiffnessNotPositive (a shrink_stiffness ≤ 0, which the document check refuses) the defensive arms; a caps_rule v3 document handed to it halts ScoringFieldsNotLegacy at its read of the legacy scoring values (defensive — the four are retired on v3 and B0 refuses the pairing) |
the fold, on the window (§10; futarchy-system.md §4 B10) |
the feasible set's log-side halts (B11, v1; utilization is the fold's OWN record, read for u and checked for SHAPE, never re-derived), IN THIS ORDER: a utilization record whose row count is not the document's non-cash pools (UtilizationDisagrees naming rows), then a row naming another pool than the document's at its place (pool); a Successor predecessor whose id is not field 39's (PredecessorDisagrees — the document check refuses it first); OffsetOverflow (the record's offset past u64); then per pool in document order — on cash the defensive FeasibleSetEmpty (b̲ > w̄_1 — no feasible vector) then AllCashPointOutside (w̄_1 ≠ 1 — below 1 the witness outside, above 1 a bound the record's decoder refuses) then its two document bounds past rational_bits_max (BitsExceeded); on a bookmaker the defensive UtilizationRhoZero (ρ = 0) then a quotient or minimum past rational_bits_max (BitsExceeded, B3's pattern — never reached by an honest u, which is capital / V, under the document's floor of 128 bits on the budget); a caps_rule v2 document halts CapsRuleUnbuilt (defensive — its chain carries B11 v2 in this place), then a caps list not one per pool CapsNotPerPool, before the shape — the defensive arms all unreachable past the document check |
the fold, on the window (§10; futarchy-system.md §4 B11) |
the feasible set's log-side halts under v2 (B11 v2; capped_share/v2, allocation/v2 and utilization/v2 are the fold's OWN records — their counts and pools held against the document, no stamp checked, nothing re-derived: b_i and e^util_i are read), checked in THIS order with the first failing check naming the halt: a caps_rule v1 document (CapsRuleNotV2); capped_share/v2's bounds not one per document pool, or a bound outside [0, 1] (CappedShareDisagrees("bounds")); the capacities not one per document pool, then their sum not vault_capacity_mills (Shape — B4 v2's Σ V_i = V held as the record's shape, an overflowing sum included); vault_capacity_mills = 0 (VaultCapacityZero, defensive — the document check refuses it); a utilization/v2 row count that is not the document's non-cash pools (UtilizationDisagrees("rows")), then a row naming another pool than the document's at its place ("pool"), then a negative efficiency ("efficiency", defensive — the utilization/v2 decoder refuses it); OffsetOverflow (window_seq + 5 past u64); then per pool in document order — on cash the defensive FeasibleSetEmpty (c_c > 1 — the witness outside) then c_c past rational_bits_max (BitsExceeded); on a bookmaker w^I_i = V_i / V, the product e^util_i · w^I_i and the bound each past rational_bits_max (BitsExceeded { block: "feasible_set" }, B3's pattern) — none on an EXHAUSTED capped_share/v2, whose every bookmaker upper is the literal 0 (the all-cash feasible set, futarchy-system.md §9 C72 — the settlement is the raw stake split by B12 v2's first read of exhausted, C22, never an optimisation over this set); then each kept group cap past rational_bits_max (the same halt — every bound and every group cap of the record held to the budget); no predecessor is read (C28 superseded), so no PredecessorDisagrees arm |
futarchy::fold_feasible_set_v2 (§10; futarchy-system.md §4 B11 v2, §9 C27, C28, C56, C70, C72) |
the settlement's log-side halts (B12; winsorized, estimate, feasible_set and raw_share are the fold's OWN records — each field the hashes do not bind is shape- or value-checked before it is read), IN THIS ORDER: the SAME row checks (one home), MatrixHashDisagrees against winsorized's then estimate's hash, WinsorizedDisagrees("k"), an ESTIMATED outcome not one row per pool in order (EstimateDisagrees rows then pool), a feasible_set not one row per pool in order (FeasibleSetDisagrees rows then pool) or whose values do not admit the declared start — a bookmaker lower other than 0 (every bookmaker lower is ACTIVE at e_cash, C47 (a)) or upper below 0, cash's lower above 1 or upper below 1 ("start"; B11 writes exactly the admitting values; the struct is pub, so the decoder's lower ≤ upper is re-held), a raw_share not one weight per pool (RawShareDisagrees("rows")) or off the simplex ("sum" — B2's identity, since a fallback copies it verbatim and the verifier refuses one off the simplex), the defensive WindowEmpty (K = 0), AlphaOne (α ≥ 1, on the converted field) and RidgeEpsilonNotPositive (ε ≤ 0), OffsetOverflow (+ 5); then the exhausted-estimate arm, then the solver; a state the solver's invariants exclude — a singular reduced system, a ray without a blocker — is SolverInconsistent, the implementation's own defect surfaced, never the fallback; a caps_rule v3 document handed to it halts ScoringFieldsNotLegacy at its read of the legacy scoring values (defensive — the four are retired on v3 and B0 refuses the pairing) |
the allocation stream (§11) |
the settlement's log-side halts under v2 (B12 v2; balance_series, winsorized/v2, estimate, feasible_set/v2, raw_share and capped_share/v2 are the fold's OWN records — the series' decoder holds its row shape, B12 v2 rebuilds B9 v2's matrices from the series), checked in THIS order with the first failing check naming the halt: a caps_rule v1 document (CapsRuleNotV2); a grid that does not divide the window or gives no interval (Shape, defensive); the series' document-side checks from the one home shared with B8 v3, B9 v2 and B10 v2 (SeriesDisagrees — the stamp, a row's pool, a snapshot above K, a surviving pool not ending at K); then B9 v2's record re-derived — the winsorized hash (MatrixHashDisagrees), the raw hash (RawHashDisagrees), k ≠ K (WinsorizedDisagrees("k")), the thresholds ("thresholds") — then the estimate's hash (MatrixHashDisagrees); an ESTIMATED outcome not one row per pool in order (EstimateDisagrees rows then pool); a raw_share not one weight per pool or off the simplex (RawShareDisagrees rows then sum); THEN capped_share/v2's exhausted — set, the record is the caps fallback (w^M, no halt; OffsetOverflow on its stamp) and NOTHING of the feasible set is read, whatever the estimate (C72, caps precedence); else the feasible set — not one row per pool in order or not admitting the declared start (FeasibleSetDisagrees rows, pool, start), then its groups ("groups" — not the document's listed caps restricted to the bookmaker count: a size above the bookmaker count or below 2, a cap or a size not the document's, a listed size missing; B11 v2 writes them through the one home rows::listed_groups, the struct is pub); the defensive WindowEmpty (K = 0, unreachable past the grid), AlphaOne, RidgeEpsilonNotPositive; OffsetOverflow (+ 6); then the exhausted-estimate arm (bits, C44), then the solver with the group rows — a state its invariants exclude (a singular reduced system, a ray without a blocker, a group cap exceeded at a segment's start) is SolverInconsistent, never the fallback; a stored settlement/v2 is accepted only when the re-fold reproduces its bytes (settlement_reproduces_v2); a caps_rule v3 document handed to it halts ScoringFieldsNotLegacy at its read of the legacy scoring values (defensive — the four are retired on v3 and B0 refuses the pairing) |
futarchy::fold_settlement_v2 (§11; futarchy-system.md §4 B12 v2, §9 C44, C60, C72) |
the v3 document's refusals (B0 v3; caps_rule v3): any of 10, 13, 15 or 16 present (UnknownField — the retired scoring fields); λ_d < 0, λ_w < 0 or r_c < 0; h_w = 0 or h_w > K (WeeklyHorizon); p = 0 or p > 18 (CashReturnPrecision); a cash pin whose lowest-terms denominator does not divide 10^p, a pin outside the bracket at its d ∈ {1, h_w, K}, or a bracket integer past CASH_BRACKET_BITS_MAX (65 536 bits) (CashReturnBracket(h) — h the pin's FIELD id (74, 75, 76), not the horizon); any of 70–77 on a v1 or v2 document (UnknownField); a document built in code whose scoring set does not match its caps version (ScoringFieldsVersion, defensive — the decoder cannot build one) |
the document check (§3 "The v3 document"; futarchy-system.md §4 B0, §9 C94, C96) |
field 78 absent on a document whose risk chain names R7, or present on one that does not; feed_rules empty, its tags not distinct ascending, a tag empty, not ending in /v followed by digits, not one the ingest crate's tag registry declares, or longer than 64 bytes (a serialization-class hardening cap, futarchy-system.md §11 W12), stall_ms = 0, continuity outside {0, 1} |
the document check (§3; risk-engine.md §7) — the error arms the code pins at G8 |
field 79 present on a document whose risk chain does not name R2 v2; retail_fee_rule not the closed map {0 version, 1 hash: 32 bytes}, or naming no declared fee rule (model-plugin-layer §12 MF-16's table) |
the document check (§3; risk-engine.md §7) — RetailFeeRuleUnexpected for the field on a chain not naming R2 v2, DocumentError::RetailFeeRule for a pair naming no declared fee rule, a malformed map refused as any malformed field; the route at risk-engine.md G10, B0 v3's key set naming it since G11 |
the balance series' log-side halts under v2 (B6b v2; balance_series/v2 is the fold's OWN record): a v1 or v2 document first (ScoringFieldsNotV3, defensive — it carries no scoring key 70–77), then B6b v1's halts in the same order — the daily return formed on B̃ in the one walk, v1's raw ratio never formed; the record's decoder holds, beside v1's row identities, each daily return the scoring ratio of its balances, weekly_return on a suffix of each pool's rows (present exactly when k ≥ h_w, held by the series' document-side check) and the monthly list one entry per pool with a series, pools ascending, each the scoring ratio of the pool's last balance over its opening one |
B6b v2 (§9 "The three return series"; futarchy-system.md §4 B6b, §9 C95) |
the settlement's log-side halts under v3 (B12 v3; balance_series/v2, feasible_set/v2, raw_share, capped_share/v2 and window_closed are the fold's OWN records — no hash binds the matrices, the one builder rebuilds them and r from the series, futarchy-system.md §9 C97), checked in THIS order with the first failing check naming the halt: the order starts with a v1 or v2 document (ScoringFieldsNotV3, defensive — it carries no scoring key 70–77); the input shape checks B12 v2 runs before its caps fallback (the grid, the series' document-side checks on balance_series/v2, the raw share's rows then sum); THEN the sparse arm (distinct_matches < min_distinct_matches — the sparse fallback, w^M, no halt; OffsetOverflow on its stamp); THEN capped_share/v2's exhausted (the caps fallback, C72); else the feasible set's rows, start and groups as under v2; the defensive WindowEmpty, AlphaOne, RidgeEpsilonNotPositive; OffsetOverflow (+ 4); the derived constants' bits; then the solver over the two terms — a state its invariants exclude is SolverInconsistent, never the fallback; exhausted = sparse (code 3) is admitted by settlement/v3's decoder alone, settlement/v1 and settlement/v2 refusing it (UnknownCode); a stored settlement/v3 is accepted only when the re-fold reproduces its bytes (settlement_reproduces_v3); the v3 verifier (verify_settlement_v3) refuses a sparse record on a window at or above the floor and any other record on a window below it (SparseDisagrees), then holds the caps rule as v2 (Fallback("caps")); the objective's own refusals surface there as CertificateError::Objective — ObjectiveError::LinearWidth (the v3 objective's linear term not one entry per pool) and ObjectiveError::ScoringFieldsNotLegacy (the v1 objective handed a v3 document) |
B12 v3 (§11 "The terms lift", "The fallback on the v3 chain"; futarchy-system.md §4 B12, §9 C93, C97) |
the liabilities' log-side halts (B13; book_closed, raw_share and settlement are the fold's OWN records — each field no hash binds is shape- or value-checked before it is read), IN THIS ORDER: BookDisagrees("rows"|"total"|"seed") — not one total per document pool, totals that do not sum to R (B1's identity; an overflow the same), a pool total of 0 (every pool is seeded); RawShareDisagrees("rows"|"book") — not one weight per pool, or not R_i / R of the book (B2's record re-derived through its one home); SettlementDisagrees("rows"|"range"|"sum"|"fallback") — not one weight per pool, a weight outside [0, 1], Σ ŵ* ≠ 1, a fallback whose weights are not w^M (C22); PayoutCapUnbuilt — payout_cap_rule not v1 or v_max present (v2 declared, no producer — §12); FallbackRuleUnbuilt — fallback_rule not v2 (v1 declared, no producer — §11); PoolTaxOutOfRange (τ_pool ∉ [0, 1), defensive); OffsetOverflow (+ 6); then the fold's own LiabilityIdentity("conservation"|"net") after the arithmetic — unreachable on an admitted input, the implementation's defect surfaced; every halt corrupted history or that defect, never a guess; B13 runs neither the certificate's verifier nor the reproduction tap — an observer that reads a STORED settlement runs settlement_reproduces before B13 (the fresh composition runs B12 itself) |
futarchy::fold_pool_liability (futarchy-system.md §4 B13, §9 C48) |
the payouts' log-side halts (B14; book_closed and pool_liability are the fold's OWN records, the positions B1's list — each field no hash binds is shape- or value-checked before it is read), IN THIS ORDER: BookDisagrees("rows"|"total"|"seed") (B1's identity re-held as in B13); PoolLiabilityDisagrees("rows"|"range"|"total"|"net") — not one row per document pool; a negative liability, tax or residue (the decoder's identities re-held on a struct-built record); a record whose Σ P + T_tax + cap_residue ≠ R of THIS book; or one whose Σ P ≠ (1 − τ_pool) R for the document's pool_tax (B13's two identities re-held, so a record whose total is not this book's, or whose tax was folded into the pools, is refused before it is priced — no unit of the tax reaches a position; every payout fits u64 thereafter; the split across the pools is the settlement's, re-derived through B13 by an observer that reads a STORED record — §10's byte-identity tap; the fresh composition runs B13 itself); PositionsDisagree("empty"|"pool"|"zero"|"total") — no position, one on a pool the document does not list, one at zero (B1 lists only positions above zero), or a pool's positions not summing to its total (Σ_j r_ij = R_i exactly as B1 counted it; an overflow the same); RoundingRuleUnbuilt (a document pinning v2 — the largest-remainder rule — declared, no producer; a struct-built document, the chain check refuses a decoded one); OffsetOverflow on the LAST stamp (+ 6 + m), before any record is written; then the fold's own PayoutIdentity("rate"|"unit"|"share") after the arithmetic — a pool's rate undefined or negative, a payout not fitting u64, or one above its exact share — unreachable once the earlier halts have passed, the implementation's defect surfaced; every halt corrupted history or that defect, never a guess; B14 runs neither B1 nor B13's arithmetic nor the reproduction tap — a block reads its inputs |
futarchy::fold_stake_payouts (futarchy-system.md §4 B14, §9 C49) |
the participation yield's log-side halts (B14b; book_closed is the fold's OWN record, the positions B1's list, the stake rows the epoch log's — each re-held before the ledger is read), IN THIS ORDER: CapsRuleNotV2 (a caps_rule v1 document carries no y); BookDisagrees("rows"|"total"|"seed") (B1's identity re-held, the one home with B13–B15); PositionsDisagree("empty"|"pool"|"zero"|"total") (the one home with B14); Shape (open_height ≥ close_height — the document check refuses it, defensive); then per row in offset order, up to the first block_final at or above M, Record { .. } (a block_final or stake row that does not decode), YieldDisagrees("height") (a row at or after M or below open_height — B1's admission re-held), YieldDisagrees("pool") (a row naming a pool the document does not list, or a move whose source pool is its destination — a defensive re-hold, B1 refuses it first as MoveSamePool), YieldDisagrees("source") (a move or withdrawal closing more than the source's open substakes hold); then YieldDisagrees("substakes") on the complete ledger (the open substakes per (participant, pool) not B1's position — a position with no substakes, substakes with no position, a position listed twice); the term's division Shape (defensive — unreachable past the open_height < M check); BitsExceeded { block: "participation_yield" } on every term, H_j and Σ H; then — after every halt above — y = 0 or Σ_m H_m = 0 is the EMPTY outcome, no row and the first stamp returned, never a halt; else per quotient the defensive Shape on its division (unreachable past Σ H ≠ 0) and BitsExceeded, then OffsetOverflow on the LAST stamp first_seq + rows − 1, none on an empty set; every halt corrupted history, never a guess; B14b runs neither B1 nor B14 — a block reads its inputs |
futarchy::fold_participation_yield (futarchy-system.md §4 B14b, §9 C54, C64) |
any pool with no stake row at all, or whose seeder's first row is below seed_units[i] — epoch_aborted{pool_unseeded}, the lowest-index failing pool named; a seeded pool at R_i = 0 — epoch_aborted{pool_unfunded}, a defensive arm no legal log reaches (the seed is at least min_stake_units ≥ 1 and a withdrawal or move that would zero a pool halts); every pool seeded and positive but no position above zero held by anyone other than the seeder — epoch_aborted{no_votes} (R20; C8's state reading) — the epoch ABORTS instead of settling (§4, §6); a non-seeder first row is instead corrupted history (refused at the edge, a halt in the fold); a book_closed carrying a zero total, or totals that do not sum to it, is corrupted history |
the fold, at the close |
a sealed run whose manifest cites this allocation record with no run_included row for it — the harness's inventory of sealed runs citing the allocation is a B7 input (SealedRunNotIncluded) |
the fold, on the window (§9) |
a run_verdict for a run with no run_included row before it (VerdictUnknownRun); a second run_verdict for one run under window_rule v2 and v3, or under v4 a run_verdict after the run's verified row (VerdictDuplicate); a run_verdict whose height is not the latest final height recorded before it (VerdictHeight) |
the fold (B6's precondition, B7's input) |
a run's sealed segment whose id is not derive(name, lineage) (StreamIdentity); a lineage record that is not the catalog's CLOSED map — a key §4 does not define, keys 0–3 missing or mistyped, fewer than two or more than three parents (Lineage) — or whose manifest_hash is not the run's id (LineageRun), whose included_at is not this run's run_included offset (LineageInclusionOffset), or whose root parents are not its sibling streams' (LineageMatchLogDisagrees); a stream whose offset labels are not its records' positions (StreamOffsets) or whose record does not encode (RecordEncoding); a manifest whose allocation_ref is not the row's (AllocationRefDisagrees); a stream whose recomputed record count or chain end hash is not the digest table's (StreamDigestDisagrees), or a table whose report hash is not the run_verdict row's (ReportHashDisagrees); a market event the exchange's own fold cannot replay — RunStream carrying the fold's arm EventFoldError::{UndeclaredSchema (a schema none of the three streams declares), DuplicateMarket (a second market_created for one id), UnknownMarket (a quote, marker, fill, payout or refund for a market no market_created named), FillWithoutRestingLevel (no maker's — or, on an uncross, taker's — resting head), FillExceedsFront, RemovalRemovedNothing, Collateral (a barrier that does not drain the pot exactly, a void of a market not flat, a reservation or freed sum leaving the signed mills range), Event / Platform (a record failing its own vocabulary's decode)}; a run NOT SEALED at its last record — a market still created, a barrier's rows staged, a pot not drained, an observed sleeve holding a position (NotRunSealed) — or whose cash does not conserve (Conservation); a negative drawn or reserved capital (NegativeExposure), a capital sum leaving u64, or a sleeve's drawn capital leaving the signed mills range (ExposureOverflow), the ticks leaving u128 (TicksOverflow); a Verified run whose sealed streams the edge did not supply (RunStreamsMissing); a sleeve observed but never registered (SleeveUnregistered, unreachable by construction) |
the fold, B6 (§9; futarchy-system.md §4 B6) |
a successor document of a caps_rule 1, 2 or 3 chain whose predecessor has no epoch_settled / epoch_aborted row yet ("still live"), or whose open_height is below the predecessor's terminal height — the CEO's no-overlap ruling (futarchy-system.md §3, §9 R19, C7), (CheckError::PredecessorLive / OpenHeight; the registry's Slot::Live; the abutting equality retired); the same refusal for such a successor of a caps_rule v4 epoch whose capital is not yet released (the held slot, futarchy-system.md §4 B0 v4) |
the document (§3), the registry at open |
a caps_rule v4 successor document whose open_height is below the predecessor's allocation record's height (OpenBeforeAllocation) or whose close_height is below the predecessor's deadline (CloseBeforeDeadline); a v4 document without field 80 or 81 (CarryRulesMissing), or whose pair names no declared version of its rule (CarryScoringRule, CarryBudgetRule); a v1, v2 or v3 document carrying 80 or 81 (an unknown key); on the v4 chain a stake_recorded whose tx_id is a stake row's of an earlier epoch of the lineage not yet capital-released (StakeNotFresh, futarchy-system.md §4 B1 v3, §9 C122); a run_included whose sleeve's live sublimits, its desk's locked carried lines and its own consumed amounts would exceed min(usable_i(h), ⌊L·E_i⌋) (LineExceeded, B5 v5, C120, C121) |
the document (§3), the registry at open (futarchy-system.md §4 B0 v4), the epoch gateway at the edge and the fold (B1 v3, B5 v5) |
a caps_rule v5 document lacking one of the credit fields 82–89 (CreditFieldsMissing), whose profit shares 82–84 do not sum to exactly 1 (ProfitSharesNotOne), whose grid_fee_share (86) or liquidation_fee (87) lies outside [0, 1], or whose profit_attribution_rule (89) names no declared version (ProfitAttributionRule); a v1–v4 document carrying any of 82–89 (an unknown key); a v5 document whose risk chain omits an RC block, or a v1–v4 document naming one (ChainLength, 54 — the length check fires first, §14's v2-under-v1 precedent), one naming them in another order (ChainMismatch, 54); a stored v5 allocation stream whose credit rows sit before the yield rows, after epoch_settled or out of block-major order (StreamShape, the registry's walker), or whose six rows of one pool disagree with each other — the walker recomputes every derived row from the recorded upstream rows and the document through the same functions the fold runs: RC2's recovery with RC1's, RC3's two shares summing to max(P̃, 0) (every RC3 term 0 when P̃ ≤ 0) and share_lpv, share_pov the floors of profit_credit at fields 83 and 84, RC4's loss with the net result, its own_absorbed = min(L, own_base) and its reserve draw rebuilt over the epoch (pov_i = shortfall_i when Σ shortfall ≤ pov_reserve, else ⌊pov_reserve · shortfall_i / Σ shortfall⌋, shortfall_i = pov_absorbed + lpv_absorbed), RC5's fee with grid_fee on fields 85 and 86, RC6 equal to desk_account of the five rows above with V_i from allocation/v2 (the desk conservation inside it), Σ pov_absorbed against field 88 (checked first, reported on pool 0), and own_base ≥ E_i when cushion_source is 0 (own_base ≥ 0 when it is 1 — the top-ups are the fold's input); under carry_budget_rule INSIDE pov_absorbed + lpv_absorbed = min(L − own_absorbed, V_i) (X_i = V_i, so the partition forces beyond_line); only under OUTSIDE does beyond_line against X_i stay the fold's, it needs the lineage (CreditDisagrees {pool}, the walker's cross-row check at epoch_settled) |
the document (§3 "The v5 document"), the registry at open (futarchy-system.md §4 B0 v5), the walker (§5's v5 layout) |
| a second ALLOCATED store entry for one epoch, or a SETTLED entry whose allocation stream does not carry the allocated entry's as a byte prefix (futarchy-system.md §11 W10) | the epoch store's writer |
a carry_settled/v1 row below the run's accepting epoch's deadline (the run not yet carried), for a run that is not a carried run of the log's epoch, for a run with a Verified row, a second one for a run, or one whose released + consumed is not the run's line; a run_verdict row for a run after its carry_settled row; any run_verdict after the window's terminal record that is not a carried run's before its release (event-catalog §6.16) |
the epoch gateway at the edge; a recorded one halts B5 v5 and B7 v6 (futarchy-system.md §4 "The v4 chain") |
a settlement record whose certificate fails, or whose ŵ* lies outside F_T^util — unless it is the fallback, whose ŵ* = w^M lies in the simplex and may exceed a cap by design (§11); a fallback written against a HEALTHY estimate passes the certificate's tap (it is held to ŵ* = w^M alone) and is refused only by the chain-level tap: a stored settlement is accepted only when re-running B12 on the same inputs reproduces its bytes (futarchy-system.md §10), so B13's payouts never consume a settlement that passed the certificate alone |
the allocation stream (§11) |
the settlement's log-side halts (B15; book_closed and pool_liability are the fold's OWN records, the payouts B14's — each field no hash binds is shape- or value-checked before anything is floored), IN THIS ORDER: BookDisagrees("rows"|"total"|"seed") (B1's identity re-held as in B13 and B14); PoolLiabilityDisagrees("rows"|"range"|"total"|"net") (the four arms B14 and B15 share — one home); PoolLiabilityDisagrees("tax") — a stored record whose T_tax ≠ τ_pool R for the document's pool_tax (C48 (b)'s re-hold; with total and net held this is also cap_residue ≠ 0, so no residue arm exists); PayoutsDisagree("empty"|"pool"|"total"|"liability") — no payout, one on a pool the document does not list, a sum not fitting u64 (one pass per row, in the given order), a pool paid above its P_i (B14's identity re-held; the whole within Σ P follows; a zero payout legal); RoundingRuleUnbuilt (a document pinning v2 — the charge bound is v1's; a struct-built document, the chain check refuses a decoded one); OffsetOverflow at + 7 + m; then after the arithmetic PayoutsDisagree("charge") — Σ payouts + ⌊T_tax⌋ + ⌊cap_residue⌋ + rounding_charge = R holds by construction, and a rounding charge above one unit per payout row (rounding_charge > m; one unit more is reachable only under a fractional residue, which no existing version produces) means a payout below its floor (the bound's detection power is limited — §12: a shortfall of at most m units or a padded list passes; the chain-level tap payouts_reproduce, below, is the condition) — and the fold's own ConservationIdentity (the four not re-adding to R in u64 — unreachable, the implementation's defect surfaced); every halt corrupted history or that defect, never a guess; B15 runs neither B13 nor B14 — a block reads its inputs |
futarchy::fold_epoch_settled (futarchy-system.md §4 B15, §9 C50) |
a STORED stake_payout list (an observer's verification of a log, never the fold's own run) whose bytes B14's re-fold over B1's positions and the stored pool_liability does not reproduce — the chain-level tap payouts_reproduce (futarchy-system.md §10), the condition under which B15's charge bound is safe; beside settlement_reproduces (futarchy::payouts_reproduce): no decode of the stored list; B14's own halt or a record that does not encode (PayoutsEncoding("stored" | "re-fold")) is Err — in ONE total order: the re-fold, the count, every record encoded, then the bytes compared, so a list of the right count both wrong and unencodable halts, never false, while a count difference is Ok(false) before any encoding — a byte difference Ok(false); the stored pool_liability it trusts is the one B13's re-derivation reproduces on a settlement settlement_reproduces accepted (§12) |
corrupted history; the tap is the observer's, not B15's |
the COMPOSITION fold_to_settlement (futarchy-system.md §10): B0–B15 in the chain's declared order (declared_chain's under a v1 document, declared_chain_v2's under a v2 one, declared_chain_v3()'s under a v3 one) over one epoch log, the stored document, the declared chains, the registry's answer and the post-close edge inputs (PostClose — the Verified runs' sealed streams, the manifest decode of each included run that is not Verified, the sealed inventory); it adds no check of its own and two defensive halts unreachable on an admitted input (a v2 segment without B3 v2's record, CapsRuleNotV2; B14b's first stamp past u64, OffsetOverflow) — every other refusal of this table is a block's, raised where the block runs; its one derivation is B7's sleeve map (one source per included run, keyed on the verdict: the streams' set for a Verified run — the one decode B6 read — the manifest decode for every other included run; an entry of either input is read only where its block read it); B13, B14 and B15 run only on a Closed window — an abort at B1 or B7 ends the stream at epoch_aborted, a log before the close at document_checked, a pending window after the first segment and any return_observed rows (at allocation when no run is Verified yet) |
two defensive, unreachable on an admitted input (CapsRuleNotV2, OffsetOverflow); futarchy::fold_to_settlement (futarchy-system.md §10's fixture gate) |
Taps — the notes' identities as tests that can fail, each computing its expected value independently of the code it checks:
Σ_i w^I_i = 1, andw^Iinside the simplex and the box caps — Γ_C's own target set, notF_T^util, whose buffer and utilization caps bind only at settlement;Γ_C(w) = wwheneverwalready satisfies the box caps; at mostNpasses (§7; the futarchy note's example reproduced).Σ_i V_i = V;V_i ≤ ⌊w̄_i V⌋(§7).Σ_i w̄_i ≥ 1CHECKED on every document (never assumed).Σ_i ŵ*_i = 1and, outside the fallback,ŵ* ∈ F_T^utilwith the KKT certificate holding (§11); in the fallbackŵ* = w^Mexactly.- Under
payout_cap_rulev1,cap_residue = 0in every epoch — the no-cap version is pinned, not assumed. Σ_i P_i = (1 − τ_pool) Rbefore any cap;Σ_ij Π_ij + ⌊T_tax⌋ + ⌊cap_residue⌋ + rounding_charge = Ras integers (§12);Σ_j PnL_j = −⌊T_tax⌋ − ⌊cap_residue⌋ − rounding_charge(the floors B15's, futarchy-system.md §9 C48 (b)); the rounding charge is at most one unit per payout row.- The note's own PRE-FEE identity, as its own case: with
τ_pool = 0, a non-bindingv_maxand every share whole,Σ_j PnL_j = 0exactly ("Zero-sum accounting") — the taxed form above must not be the only pin. - The ridge's uniqueness, as a check and not an assumption:
Q̂_T(ŵ*) > Q̂_T(w)STRICTLY, for everywof a declared finite probe set of feasible points (the vertices ofF_T^utilthe certificate's active set touches, and the all-cash point), evaluated in exact arithmetic without calling the optimizer;ε = 0stays refused at the document, where the objective note rests the single maximizer onε > 0. - The utilization caps bind at SETTLEMENT ONLY:
Γ_C's target set is the simplex and the box caps, and contains nocap^util— "At settlement, the original feasible set is intersected with the realized utilization constraints" (futarchy note). Operationally: two differentu_{i,T}profiles over the same stakes must yield byte-identicalw^I, and every bookmaker pool must satisfyŵ*_i ≤ u_{i,T}/ρ. - A withdrawal obeys
0 ≤ x_i ≤ r_ij,R_i − x_i > 0, andr_ij − x_iis 0 or at leastmin_stake_units(§4). - Cash keeps
w̄_1 = 1; the growth and utilization caps bindi ≥ 2only;u_{i,T} = 0givescap^util_i = 0unless the bootstrap applies (§10). F_T^util ≠ ∅on every document.- The utilization example
0.10 / 0.90 = 1/9and the shrinkage instance (v1/v2) (§10) re-derived by hand in the test, never by calling Θ.
The v2 taps and refusals (B3 v2's and B4 v2's pinned by tests/futarchy_gamma_c_v2.rs, B6b's series identity by tests/futarchy_balance_series.rs; the chain-level taps — settlement_reproduces_v2, payouts_reproduce — on the composed v2 stream by tests/futarchy_compose_v2.rs, task 143 step 3j-2): w^I ∈ F_T — cash ≥ c_c, every bookmaker ≤ b_i, every top-two, top-three and top-five sum within its cap (B4's verification); Γ_C(w) = w for w ∈ F_T ON THE D-GRID (off the grid the floor moves it); Σ_i w_i = 1 on a capped_share/v2 without exhausted (an exhausted record is off the simplex by its unassigned release, C72); the all-cash fallback whenever the verification fails or the budget is exhausted (B4's CapacityExceeds arms — a floor past u64 — are unreachable on a checked document, whose V fits); at settlement ŵ*_i ≤ e^util_i w^I_i for every non-cash pool with e^util_i < 1, no bound at or above 1, cash exempt, a pool with e^util_i = 0 capped at 0 with no bootstrap at settlement (the note, "Utilisation-supported caps"); on every stake_moved 0 ≤ x ≤ s_ij and S_i − x > 0 (the note, "Reallocation"); F^own + F^credit + U^peak = B at every snapshot with U^peak ≤ B, and η = 1 above it; Σ_j Y_j ≤ y with the remainder below the number of participants with H_j > 0; the document refusals SnapshotGrid, PrecisionGrid, the cap_groups shape, the cash_min range, the own_capital length, a stake_mobility other than moves, and the keys 5, 9, 14 and 55 on a v2 document (BUILT, task 143). The composition's boundary for a v2 document is B0: under the v1 chain it is refused at the chain equality (ChainLength) before any block runs; under the assembled v2 chain (declared_chain_v2(), task 143 step 3j-1) it passes B0 and the first segment dispatches on the version — B3 v2 and B4 v2 write capped_share/v2 and allocation/v2; the composition's v2 branch after the window (B6b, B8 v3 … B15 v2, task 143 step 3j-2) folds it through epoch_settled in §5's v2 layout, B13 over settlement/v2 through records::SettledWeights; B3 v1, B9 v1 and B11 v1 — and B10 v1 and B12 v1 through the matrix B9 recomputes for them — carry the defensive halt CapsRuleUnbuilt (the PayoutCapUnbuilt shape).
The v3 taps (B0 v3, B6b v2, B12 v3, B13 v3; futarchy-system.md §7, §10): the three fixture cash pins accepted by the bracket and each pin one unit of 10^{−12} above or below refused; weekly_return present exactly at k ≥ h_w and every return on B̃; the note's 30-observation tail (L_(1) + ½ L_(2)) / 1.5 re-derived by hand against the objective's CVaR, never by calling it; Σ_i ŵ*_i = 1 and the KKT rows per term on every optimized record; a window below the floor settling with exhausted = sparse, every v_i = 1, the tax levied and B15's identity holding; settlement_reproduces_v3 true on the stored stream and false on one mutation; with one term the v1 and v2 records byte for byte; the bit bound — the fixture document passing it at p = 12, K = 30 and a document at p = 18, K = 31 passing it too (at the fixture's rate its largest bracket integer is 22 064 bits); the ridge resolved on the v3 fixture — one maximizer, ε halved or doubled moving no coordinate of ŵ* by more than 1/100, and ε‖ŵ*‖² below one thousandth of |ŵ*ᵀr| + λ_d |CVaR^(1)| + λ_w |CVaR^(7)| at the optimum (futarchy-system.md §9 C98; ε the CONFIG value, both fractions test acceptance thresholds, ours (engine), not epoch inputs — the note's "test that the optimiser can resolve the ridge term while its contribution remains small").
15. Rulings, defaults and open values #
Law 7's record for this layer. A RULING is a dated line quoting its author —
law 7's ruling record, (c): the user's words, or the
economist's or the CEO's own words from an authority note or its HackMD
comments, admitted by the user's answer 7 of that day ("Correct"), effective
from the next epoch; a DEFAULT is the CONFIG value or rule the first epoch
document carries unless its owner changes it — posted in the HackMD
decision-tree note — the user, 6 Oct 2026: "add proposed solutions to
remaining decisions super DRY and concise and 100 % aligned with our core
engine principles" — and in the team's Defaults Register
(HackMD KQvluWaOQruNsbSuvEOTug), with every VALUE listed in
futarchy-system.md §9; an OPEN VALUE is a field no default can supply (an
account, a chain). The rulings and defaults are recorded in
futarchy-system.md §9 (its R and C tables) and summarised below.
A sixth source, and what it is not. The GRID discussion paper — "Full House: a verifiable underwriting exchange for esports", a working draft by the user, the economist and the CEO prepared for an external partner, kept beside the authority notes and gitignored like them — is cited in §1, §12 and below. §1 carries the same standing note at its first citation, so a reader meets it before any use. It is NOT an authority note and NOT a ruling record. Its own text says the features it describes "are proposed capabilities", marks blocks as "material to complete before external circulation", and closes "Detailed mechanics still await the named owners' specifications". So it is cited here only as CORROBORATION of something a note or a recorded ruling already carries, never as the authority for a rule, and no question below is narrowed or closed by it. It does usefully name the three accounts this market touches (§1) and work the market through once in round numbers (§12).
It also records who owes what. Its engine package is assigned to us — "the relationship between prediction close, evaluation start/end and credit activation, plus deterministic calculation, rounding and failure handling", and separately the state-transition diagram, the credit and collateral invariants, sequencing, feed-failure suspension, finality and recovery. This document is the first of those two; the second lives across the sibling specs. Its economics package is the economist's — "the definitive objective, net-return definition, evidence estimator, sample window, caps and redistribution policy" and the "treatment of non-participating desks" — which is where questions 1, 12 and 14 and D7's redistribution rule are owed. It also names the manipulation question 5 exists for: "a small prediction stake can redirect a much larger credit allocation".
Rulings (the decision-tree note's comment threads):
- D1 — the economist, 5 Oct 2026, choosing between the two candidate
objectives: "Option (a) … is the most currently correct. The one in [the
other source] was an early example / filler." (the bracket replaces a
private document's name) →
Q_objis the objective of record (§10). - D3 — the CEO, 5 Oct 2026: "this is where we have an onchain vault in our blockchain to hold funds of our predictors." → facts-only custody (§1, §4).
- D4 — the CEO, 5 Oct 2026: "We don't do burns - this is the previous doc iterations. As
we need to funnel productive assets to other means. E.g. protocol owned
liquidity in a protocol owned vault" → RULED: no burn anywhere in this
layer. NOT ruled by it, and asked in questions 3 and 4 below: the market
SHAPE (the comment does not mention proposal markets or the 70 / 30
split), and which protocol account
tax_recipientnames. The vault's tax is routed into "available protocol surplus after its obligations", which is a different account from the protocol-owned vault that buys credit inventory, and the engine infers neither. - D5 — the economist, 5 Oct 2026: "HOUSE will be introduce later. Current vision is that Futarchy 1.0. operates with USD-equivalent only." → USD-equivalent stakes and payouts (§1, §3).
- D8 — the CEO, 5 Oct 2026: "From a product pov, having normal fiat denominators for
minimum staking makes most product sense. I.e. 1 cent." →
min_stake_units= 1 cent USD-equivalent, pending the economist on the economic minimum. - The payout rounding — the economist, 4 Oct 2026, on the sub-unit-payout
thread: "What if we effectively pay (suggested payout // minimum unit of
accounting)? The remainder is therefore an additional protocol charge."
→
rounding_rulev1: each payout floored to the money unit, the dropped fractions one declared charge totax_recipient(§12). - D12 — the CEO, 5 Oct 2026: "this is FIFO in terms of accepted stake in our sequencer. And if the cut off window for a prediction market is N time, then we cut off at block M that correlates to N time. Celestia DA is only the finality layer for our chain to settle its rollup blocks" → the order and the close of §4–§5.
- The economist, 2 Oct 2026 (the panel note's threads), asked to confirm that
Δ is one match: "At the beginning when the number of book-makers is low and
markets are thin, it is better to use /delta as one match. However, when
there are several competitive book-makers or the market is very liquid,
it is better to use /delta as a fixed interval of time." → Δ = one run
first, a time interval later; asked whether
D_Tis derived from the engine's own settlement records: "Correct.";q95at portfolio level and the allocation weight as the next run's frozen-manifest ceiling are his unquoted answers in the same threads. - D6 — the economist, 2 Oct 2026, on the arithmetic thread: "Yes. Agree, that we need a fallback when computation goes over meaningful limits." → the optimizer carries a declared fallback rather than failing (§11; the posted D6 default fixes its content).
- The economist, 2 Oct 2026 (the same threads), asked to confirm that all arithmetic is exact: "It sounds right to me. The leftover could go to the cash." → the capacity rounding of §7: an exact argmax rounded once, the leftover to cash and not by remainder.
- D9 — the posted default records one thing and this document claims no more of it: utilization is DRAWN credit, never reservations — REPLACED by the economist's own words (§9; futarchy-system.md §9 R1, R3: drawn plus reserved, the peak over the period).
- The user, 5 Oct 2026: "whatever is their vision, our job is to make it hold our principles, and make it bullet proof"; the user's defaults ruling (quoted at the head of §15).
- The economist, 2026-10-12, on the live note's comment threads —
futarchy-system.md §9 R1–R7 carry his words — →
window_rulev2 andutilization_rulev2 (§9),missing_row_rulev1's zero andprevious_allocation_rulev1'sw^Iconfirmed, the credit-economics rates CONFIG fields; questions 1, 7, 12 and 14 below are CLOSED by these. - 2026-10-12, the CEO, on the live note's question 21 (retail leverage): "We will deal with it later once we have the risk engine" → out of scope.
- 2026-10-13, the user, asked whether a market may straddle an epoch boundary keeping the values it opened under: "No preference on the sentences" → the default stands (CLAUDE.md law 8(b); the register's row 1).
- 2026-10-21/23 — the Note on Futarchy rewritten (futarchy-system.md §9 R53, the economist, 2026-10-21: the objective
Q̂_Twith λ_d = λ_w = 0.1, r_c = 0.035, "No return expectation is estimated", winsorisation a future step); the user's sparse-evidence edge default (R54, 2026-10-23: "can we use some sort of edge settings until we wait for Oleh do decide?" — below the floor the window settles on the stake-split fallback less the tax); the defaults C93–C98 (register rows 96–101) → the v3 document and chain (§3, §5, §9–§11, §14). - 2026-10-23 — the CEO's PV-04 and PV-06 (futarchy-system.md §9 R42, R44, R47) carried into the v3 chain as the defaults C99–C101 (register rows 102–104): B1 v2, B5 v4 and B7 v5 in the v3 chain,
epoch_aborted/v2, the capital views (§5, §6, §8, §8b, §9, §14).
Every comment quoted above was read from the decision-tree note's own comment threads on the dates given; the narrative records carry each body verbatim with its author and timestamp, so this document is not the only copy of the authority for the choices it records.
Defaults. The status column uses four words. RULED: a ruling record
fixes it (the row names the futarchy-system.md §9 R row). CONFIRMED: a
default this document took that its owner's quoted answer later matched.
CONFIG: a default under law 7(c), its owner free to change it from the next
epoch — the D rows are the decision-tree note's posted "Defaults" table,
the — rows this document's own defaults, each with a register row in the
Defaults Register. OPEN: a value no default supplies.
| Node | Default | Where | Section |
|---|---|---|---|
| D2 | Δ = one run; one epoch across titles; a time Δ = a new document. The WINDOW half (runs_n settled runs) is REPLACED by the fixed span window_blocks with min_distinct_matches as the abort floor — the team's decision and the economist's answers (§9; futarchy-system.md §9 C4, C6, R4, R5) |
CONFIG (length) + RULED (membership, R4, R5) | §3, §9 |
| D6 | exact rationals; step_budget + rational_bits_max; a KKT certificate anyone re-checks; on exhaustion ŵ* := w^M — WITH the tax levied (fallback_rule v2: the note's fee rule is a stated rule; the posted untaxed v1 stays a declared version — question 6) |
CONFIG; fallback tax RULED (R13) | §11, §13 |
| D7 | Γ_C as the futarchy note writes it; group rows refused — for want of a number only (futarchy-system.md §9 R11) | CONFIG; rule RULED (R11) | §3, §7 |
| D8 | the 1-cent minimum stake; a seed per pool by a named seeder | CONFIG | §4 |
| D9 | utilization = drawn credit, never reservations — REPLACED by the economist's own words (futarchy-system.md §9 R1, R3): drawn PLUS reserved, the peak over the whole period (§9; futarchy-system.md §9 R1, R3, C5) | RULED (R1, R3) | §9 |
| D10 | bootstrap_cap ε₀, also the floor of a new bookmaker's utilization cap |
CONFIG | §3, §10 |
| D11 | q95, μ₀, shrink_stiffness pinned values; ε > 0; the missing-row rule; winsorization as the note writes it (v1/v2 chains; on v3 q95, μ₀ and the stiffness are retired and nothing is winsorized — futarchy-system.md §9 R53) |
CONFIG | §3, §9, §10 |
| D12 | close_height M pinned before the first stake; final blocks only |
CONFIG | §3, §5 |
| — | window_rule v2: the window is [M, M + window_blocks); D_T = every run whose own manifest cites this allocation record and whose run_included height is below the deadline, in the log's order; the close at h* (the height reading — the C37 row below), bounded by the grace; abort below min_distinct_matches (futarchy-system.md §9 R5); the length window_blocks a CONFIG default (futarchy-system.md §9 C4) |
RULED (membership) + CONFIG (length) | §3, §9 |
| — | missing_row_rule v1's ZERO convention: an absent bookmaker contributes 0 to that run's joint loss vector — CONFIRMED by the economist, 2026-10-12 ("Count return as zero.") |
RULED | §9 |
| — | capacity_rounding_rule v1: every pool floored, the whole leftover to cash — the economist's line read literally |
CONFIG | §7 |
| — | a document with liquidity_buffer_min > 0 is REFUSED — for want of a NUMBER (question 13; the rule under a lower bound is R11's pro rata): the economist declared the rule (futarchy-system.md §9 R11), gamma_c_rule v2 carries it when a buffer is given |
RULED (the rule, R11); CONFIG (the refusal) | §3, §7 |
| — | the per-run capital definition (the run's peak of posted + reservation, max(posted, 0) per market) — kept; the window aggregation is the economist's PEAK over the period (futarchy-system.md §9 R3), read as the maximum over runs of each run's peak (futarchy-system.md §9 C5; the per-run reading C35) |
RULED (aggregation) + CONFIG (the reading) | §9 |
| — | payout_cap_rule v1 = NO CAP: no v_max, no residue, nothing diverted — question 5 asked whether a cap should exist at all; CLOSED (no cap, futarchy-system.md §9 R12) |
RULED (R12) | §12 |
| — | stake_mobility = moves (56; the bool 30 retired); liquidity_buffer_min = 0; cash_return = 0 |
CONFIG | §3 |
| — | an epoch with any pool at R_i = 0 at the close ABORTS and returns every net position in full — question 8; and one with fewer than min_distinct_matches distinct matches at the window's close (h*, futarchy-system.md §9 C37) ABORTS the same way (futarchy-system.md §9 C8); the too-few-matches abort retired by futarchy-system.md §9 R52 from the first epoch whose rule chain declares the replacing B7 version, declared with the economist's sparse-evidence rule, every epoch before it aborting as written (the window clause is B7 v2/v3's; under B7 v4 and v5 (B7 v5 the v3 chain's), a window below the floor settles on the fallback, taxed — futarchy-system.md §9 R54, C93) |
CONFIG | §4, §6, §9 |
| — | w^prev in the transition rule reads the predecessor's implemented w^I — CONFIRMED by the economist, 2026-10-12 ("What it had.") |
RULED | §3 |
| — | cycles do NOT overlap on a v1, v2 or v3 chain: the next epoch's document opens only after this epoch's epoch_settled / epoch_aborted; no new credit from a window's deadline and none from the last included run's end to the next allocation — the CEO, 2026-10-13 ("No. I don't think so"); replaces the earlier overlap default, and retired the abutting-height equality of §3 (futarchy-system.md §9 C7, R19); reopened as a design with the economist (futarchy-system.md §9 R47), the replacing block declared as B0 v4 of the v4 chain, binding only a document naming caps_rule v4 (futarchy-system.md §4 "The v4 chain", §9 C110) |
RULED (v1–v3); CONFIG (v4) | §3, §5, §8 |
| — | stakes MOVE between pools before the close, never leave ("generally prohibited" read with no exception — CONFIG) — the CEO, 2026-10-13 ("A person can rebalance their votes, but pulling out is generally prohibited"); the three-way stake_mobility (56; 30 retired) and the stake_moved row (futarchy-system.md §5, §9 C12, R16) |
RULED | §3, §4, §5 |
| — | a close at which, on EVERY pool, the seeder's row is the only one is a CANCELLED cycle — epoch_aborted{no_votes}, the seeds refunded — the CEO, 2026-10-13 ("a state like "cancelled" as there is no one who came to vote"); a third B1 abort reason as the STATE reading — CONFIG (futarchy-system.md §9 C8, R20) |
RULED | §4, §6 |
| — | who may stake: the LPV depositors at the open — the CEO, 2026-10-13 ("Only those people, who have put down liquidity into the liquidity provider vault (LPV)"); a disagreement-list item, so the SOURCE of CONFIG C9 (not a ruling — the user's to rule); participants stays a pinned list, its source the declared participants_rule v1 (futarchy-system.md §9 C9, R17); sharpened by the CEO's pilot review (futarchy-system.md §9 R48): the LPs committed to the cycle, the POV excluded — participants_rule v2 from the first epoch whose rule chain declares it, every epoch before it carrying v1 unchanged |
CONFIG (sourced) | §4 |
| — | the pool tax goes to POV — the CEO, 2026-10-13 ("POV makes most sense"); the RATE is a separate talk between the CEO and the economist, pool_tax = 0 meanwhile (futarchy-system.md §9 C16, R18) — question 4 CLOSED as to the account |
RULED (the account) | §3, §12 |
| — | no payout cap — the economist, 2026-10-13 ("I dont think we should cap pool's payout mutliple"); payout_cap_rule v1 confirmed — question 5 CLOSED (futarchy-system.md §9 R12) |
RULED | §12 |
| — | the fallback settles on the raw stake split with the fee charged — the economist, 2026-10-13 ("we can settle on the raw stake split instead. I think for the simplicity the fee is charged anyways."); fallback_rule v2 confirmed — question 6 CLOSED (futarchy-system.md §9 R13) |
RULED | §11 |
| — | Γ_C under a binding group cap or cash minimum scales the other pools down pro rata and w^I must satisfy the constraints — the economist, 2026-10-13 ("Scale down pro rata. The implemented allocation must satisfy contraints."); the buffer and group rows stay off for want of a NUMBER, no longer for want of a rule — question 13 CLOSED; question 9's group-row part answered, its solvency and compliance predicates still open (he asked back which caps are meant — futarchy-system.md §9 R11, R15, C21, C27) |
RULED (the rule) | §7, §10 |
| — | desk leverage 5, margin call at 80 %, liquidation at 90 %, the top-up window the band between — the economist's answer (futarchy-system.md §9 R14; the numbers RULED; the leverage unit — LPV credit as a multiple of own capital (futarchy-system.md §9 C13) — and the triggers' base — own capital at the period's start — are our CONFIG readings until he confirms); reserved values, no block (risk-engine.md §3–§4; futarchy-system.md §9 C13, R14) | RULED (numbers) + CONFIG (readings) | — |
| — | B6: the match identity reading of returns_rule v1 = the root match log's stream id read from the run's segments' lineage (one id per run; a frame log and a deaths log of one match count as two until a v2 reads the title's recorded match id from a catalog-defined slot); the harness's report hash = verify::report_hash (the domain-tagged, length-prefixed digest table) until the verified-run record is specified, and B6 binds a run's streams to its verdict through it; return_observed rows in the order of the Verified verdict rows, stamped with each verdict's height; the return's denominator, sign rule, per-run peak and boundary sampling the economist's readings, CONFIG (C35); the realized loss off the line the default of the funds-risk class (C36, the user's sentence) (futarchy-system.md §9 C33–C36) |
CONFIG | §5, §9 |
| — | B7: a Failed run listed and contributing nothing — not in D_T, its matches outside the count (CONFIG, futarchy-system.md §9 C38, register row 41); RULED 2026-10-22 (futarchy-system.md §9 R42, the CEO): canonical accounting; a failed check is a recovery incident, never an exclusion — from the first epoch whose rule chain declares the replacing B7 version; C38 binds every epoch before it; the replacing version is B7 v5 (futarchy-system.md §9 C99, register row 102) |
CONFIG | §9 |
| — | B7: the window's close instant read by HEIGHT (h* = the smallest final height at or above the deadline at which every included run has a verdict row of height ≤ h*), the unjudged abort naming the first unjudged run in inclusion order, decided only once a final above g is in the log, the run-id orderings and the record's offset after B6's rows (under window_rule v4 a Verified row, C99) — CONFIG, futarchy-system.md §9 C37 (register row 40); the harness's inventory of sealed runs citing the allocation as a B7 input (the §14 sealed-run row) |
CONFIG | §9 |
| — | B7 v5 (window_rule v4, the v3 chain's): a Failed verdict PENDING, never an exclusion; a second run_verdict only after Failed rows (the rebuilt record's Verified verdict); the close on a Verified row per included run; at the grace end run_unjudged with no row, run_unrecovered with a latest row Failed, every stake refunded whole and untaxed; the halted run never recovers — CONFIG, futarchy-system.md §9 C99 (register row 102), the funds-risk question to Viet owed (futarchy-system.md §9 C99) |
CONFIG | §9 |
| — | B5 v4 (ceiling_route v4, the v3 chain's): the line held until the run's Verified row and the pool's new inclusions refused while a run's latest verdict row BEFORE the new row is Failed (SleevePending, SleevePendingInclusion) — CONFIG, futarchy-system.md §9 C100 (register row 103); replaces risk-engine.md C87's refusal "until a ruling" |
CONFIG | §8, §14 |
| — | the capital views: committed, allocated_i, reserved_i, unreserved_i, released ⇔ epoch_settled on a v1, v2 or v3 chain and the capital release on the v4 chain (futarchy-system.md §9 C119), derived from the epoch log; withdrawable the vault's (deposits less committed less other encumbrances) — CONFIG, futarchy-system.md §9 C101 (register row 104) |
CONFIG | §8b |
| — | B8: the peak run on a tie the first in D_T order, a pool no run observed NONE (u = 0 for B11), u above 1 recorded as measured — CONFIG, futarchy-system.md §9 C39 (register row 42); vault_capacity_mills ≥ 1 a document check (§3) |
CONFIG | §9 |
| — | B9: cash's column cash_return verbatim and T_1 = K — CONFIG, futarchy-system.md §9 C40 (register row 43); the matrix hash's preimage — CONFIG C41 (register row 44), a serialization default under 7(c); a MISSING row excluded from the pool's own series — CONFIG C42 (register row 45) (v1/v2 chains; B9 is absent from the v3 chain — R53) |
CONFIG | §10 |
| — | B10: a pool observed in no run of D_T has μ̂_i = μ₀ — CONFIG, futarchy-system.md §9 C43 (register row 46); a shrunken mean past rational_bits_max is the estimate record's EXHAUSTED outcome, which B12 settles on w^M — CONFIG C44 (register row 47), 7(d)'s representation item with its one-sentence question to the user (the alternative: each return rounded to a fixed precision before averaging); the estimate record's re-derivation of B9's record (§14's B10 row) is a law-1 reading, not a default (v1/v2 chains; B10 is absent from the v3 chain — R53) |
CONFIG | §10 |
| — | B11: no new default — the ε₀ floor and the exactly-0 share are C28 and C20's arm, the NONE reading and u > 1 as measured C39, the box-caps-only set C27, the budget arm C23 (B3's pattern); the + 4 offset, the halt order, the witness arms, the decoder's identities and reading u from the fold's own record are design readings (§14's B11 row); §15 question 11 stays open (C28's last clause stands) |
— | §10 |
| — | B12 part a: the probe set of the uniqueness check — e_1 and, per bookmaker whose upper bound is active, upper_i e_i + (1 − upper_i) e_1 when within every bound, deduplicated, ŵ* skipped — CONFIG, futarchy-system.md §9 C45 (register row 48); the settlement record's serialization — the constraint enumeration, the exhaustion codes, the key layout, fallback: true as the presence of the key — CONFIG C46 (register row 49), C41's class; ν derived rather than recorded, the matrix rebuilt inside the verifier, the two-task split and the stamp after feasible_set are design readings of §11, not defaults; no question owed |
CONFIG | §11 |
| — | B12 part b: the pinned pivot path's CONVENTIONS — the start basis, entering (ratio then lowest C46 index; t = 1 not added), leaving (lowest negative), the ray and the held ζ, k₀, E's row order, the step as a pivot, the elimination's form, the held set (every formed rational) — CONFIG, futarchy-system.md §9 C47 (register row 50), status default — question open: the one question is C44's over both budgets (7(d): larger budgets, or returns rounded to a fixed precision before the optimizer), since through the held set and the path's length the conventions decide whether an honest wide epoch exhausts a budget into the w^M fallback; the reduction's exactness, the fold not verifying its own output, the reproduction tap and the halts' order are design readings of §11 |
CONFIG | §11 |
| — | B13: the pool_liability record's layout, exact representation and stamp, and the tax's and the residue's integer form at B15 — CONFIG, futarchy-system.md §9 C48 (register row 51); fallback_rule declared on B13 as a spanning rule, v2 (taxed) the version with a producer and v1 refused typed, payout_cap_rule v2 refused typed — design readings of §11 and §12 (neither has a producer ahead of its owner's answer); the raw-share pricing, P_i, T_tax and the identities are the note's |
CONFIG | §12 |
| — | B14: the stake_payout record's layout (the refund's shape, one codec home), its stamp rule + 7 + ℓ and its mint with §7's reserved region extended — CONFIG, futarchy-system.md §9 C49 (register row 52); the positions B1's list (never re-folded), book_closed added to the declaration's inputs and the config narrowed to the pools (4) and pool_tax (28), rounding_rule v2 refused typed, the stored liability record's signs, conservation and net identity re-held before it is priced — design readings of §4, §6, §12 and futarchy-system.md §10; the amount ⌊r_ij P_i / R_i⌋ = the note's ⌊r_ij (1 − τ_pool) v'_i⌋, the floor the economist's own rule |
CONFIG | §12 |
| — | B15: the epoch_settled record's layout (four u64, no account), its stamp + 7 + m and its mint (the region's last id) — CONFIG, futarchy-system.md §9 C50 (register row 53); book_closed added to the declaration's inputs, the config narrowed to the pools (4) and pool_tax (28) with tax_recipient (29) the rule's context, arithmetic_rule and rounding_rule declared on B15 as spanning rules, B15 binding no recipient, the stored liabilities' four arms shared with B14 in one home, C48 (b)'s re-hold as the one tax arm (cap_residue = 0 following), the payouts re-held per pool, the charge's range as corrupted history with its detection power recorded — design readings of §12, §14 and futarchy-system.md §10; the floors, the charge and the identity the economist's own rule |
CONFIG | §12 |
| — | no solvency or compliance predicate beyond the box caps enters F_T^util v1 — question 9 |
CONFIG | §10 |
Questions this document puts to them, each in their own terms (those since answered are marked CLOSED with the quote, or DEFAULTED with the CONFIG row):
- (CLOSED as to the aggregation — the economist, 2026-10-12: "The peak over the whole
period initially."; the per-run reading stands as CONFIG C35.) To the
economist — how a run's capital is measured, and how it averages
over the window. As asked: per run the engine took the PEAK of posted
plus reserved collateral as capital and the peak of drawn credit as
utilization, and the MEAN of per-run peaks over the window; the rivals
named were the window peak, the dollar-second share and the median. As
answered (futarchy-system.md §9 R1, R3): utilization is drawn PLUS reserved and the window
PEAK —
utilization_rulev2 (§9); the per-run capital definition stands as the engine's reading (futarchy-system.md §9 C35 — the denominator, the sign rule, the per-run peak and the sampling instant; C5 is the window's aggregation). - To both — the protocol's own seed is a position in the market. A seed
has to be an ordinary stake for the pool to be funded, so the seeder —
the protocol — collects that pool's pari-mutuel payout and bears its
loss. That is value moving between the protocol and the market in both
directions, beside the tax, and the notes do not discuss it. The engine
pays the seeder's row like any other — it has to, or
Σ_i P_i = (1 − τ) Rfails — so the question is what happens to that payout AFTER it is paid: back to the protocol, or rolled into the next epoch's seed? (Giving it to the pool's other stakers instead would change the note's settlement identity, not a parameter, so it is not on this list.) - To both — the market shape, to confirm in writing. For the vault-capacity layer, is it one pari-mutuel allocation market per epoch, and are the product thesis's per-strategy YES / NO proposal markets (the 70 / 30 split to correct predictors, the locked HOUSE burned) superseded for this layer — or do they remain a separate mechanism we must still model? The CEO's comment ruled out burns (§15 D4); it did not speak to the shape, and the two notes disagree, so nothing here takes a side (§1).
- (CLOSED as to the account — the CEO, 2026-10-13: "POV makes most sense"; the rate is theirs to set,
pool_tax= 0 meanwhile.) To the CEO — which account the pool tax goes to. Doesτ_pool · Rland in the protocol-owned vault directly, or in available protocol surplus after the vault's obligations and required reserves, as the tokenomics draft words it — and are those the same account or different ones? The engine records one address and models neither gate (§12). - (CLOSED — the economist, 2026-10-13: "I dont think we should cap pool's payout mutliple".) To the economist — the payout cap against your own fee rule. The
2 October text ("Taxation and fees?") says a fee's rule must apply independently of the final
allocation. A cap on a pool's payout multiple diverts an amount that
depends on
ŵ*, and when it binds that amount is large, not dust. Is the cap outside the fee rule (a bound, not a fee), or should there be no cap — the minimum stake and a seed per pool large enough that no pool can be dusted? Until you answer, the default is v1: no cap (§12). - (CLOSED — the economist, 2026-10-13: "the fee is charged anyways"; v2 confirmed.) To the economist — the tax when the optimizer falls back. If the step
budget runs out and settlement pays
ŵ* := w^M, the posted default returned the stakes untaxed (v1); the engine produces v2, the tax levied, because your own fee rule — "the rule must apply independently of the final allocation" — is a stated rule. Say so if you want v1; the difference isτ_pool R(§11). - (CLOSED — the economist, 2026-10-12: "What it had.") To the economist — which previous allocation the transition rule means.
In
w̄_i ≤ n · w^prev_i, isw^prevthe predecessor epoch's IMPLEMENTED allocationw^I(what the bookmaker actually had) or its SETTLEMENT allocationŵ*(what the optimizer judged optimal)? They differ materially; the engine readsw^Iunless you say otherwise (§3). - (CLOSED as to a cycle nobody votes in — the CEO, 2026-10-13: "a state like "cancelled"",
epoch_aborted{no_votes}; the per-poolR_i = 0case stays the CONFIG abort.) To both — the treatment of empty pools. At the close, does an epoch with any pool atR_i = 0abort and refund every net position in full, or proceed on the funded pools with the unseeded pool out of the simplex and out of the window's returns? The arithmetic needsR_i > 0, so the engine refuses rather than invent; the rule is yours (§4, §6). - (The economist asked back (futarchy-system.md §9 R15) which caps are meant — the credit split; Γ_C under a group row is declared pro rata, so only the number is open.) To the economist — solvency and compliance predicates. Are there rules
beyond the box caps that must enter
F_Tfor the first epochs, and what rule identity declares them? v1 represents none:F_T^utilis the simplex, the box caps, the liquidity buffer and the utilization caps, and group rows are refused pending D7 (§10). - (DEFAULTED by
window_rulev2 — the deadline always arrives; below the match floor the epoch aborts and refunds, CONFIG C8 — the owners' to replace.) To both — what ends an epoch whose window never fills. If the runs never reachruns_nwithmin_distinct_matches, nothing in v1 closes the epoch: no settlement, no abort, stakes locked. A deadline height that aborts and refunds in full (a new field), settlement on the runs observed so far, or locked until the runs exist? (§9.) - To both — a bookmaker whose capacity rounds to zero. A bookmaker with
a previous allocation whose integer capacity rounds to 0 mills, or which
quotes in no run of the window, records NONE (
u = 0for B11, C39) and therefore a settlement cap of 0 — permanently, since the ε₀ floor is written for a bookmaker with NO previous allocation. Does ε₀ apply to it too, or does a zero-capacity pool keep its previous cap? (§7, §10.) - (CLOSED — the economist, 2026-10-12: "Every match."; the fixed span of v2 replaces the count.) To the economist — confirm the window rule, since it is your field and
the note's first precommitment. v1 takes every run whose own manifest
cites the epoch's allocation record, in the log's order, to the first
prefix meeting
runs_nandmin_distinct_matches. It is the one new default with no alternative proposed, because any other reading we could see lets someone choose the evidence after stakes are in. Confirm it or name the rule you want (§9). - (CLOSED — the economist, 2026-10-13: "Scale down pro rata"; the bookmakers scale down to make room for the cash minimum;
b̲ = 0stays until a number is given.) To the economist — Γ_C under a liquidity buffer.Γ_Ccaps weights downward; the bufferw_1 ≥ b̲is a LOWER bound, which capping cannot reach. A document withb̲ > 0is therefore refused until you declare what Γ_C does under it — do bookmaker weights scale down pro rata to make room, or does the buffer bind at settlement only, as the utilization caps do? (§7, §10.) - (CLOSED — the economist, 2026-10-12: "Count return as zero."; the own-series exclusion stays CONFIG, futarchy-system.md §9 C42, register row 45) To the economist — what a missing row contributes to the tail. A
bookmaker absent from a run, or with zero capital there, has no return.
v1 puts 0 in that run's joint loss vector and drops the row from the
bookmaker's own series. Zero is not neutral: it moves the CVaR tail and
therefore
ŵ*. Zero, the row dropped from the vector, orμ₀in its place? (§9.) - To both — a correction to our own decision-tree note. Its D1 engine
line calls the objective "a linear program in exact rationals". With the
ridge
−ε‖w‖²it is a quadratic program, strictly concave inw; the ridge is what makes the maximizer unique, so the classification matters and the line is ours to fix, not yours.
Owner values and their CONFIG defaults — written into the first epoch document. The owner column of §3's field table is the record; this list is read off it, so a field appears here under exactly the owner it has there. Every field below EXCEPT the accounts and the chain carries a CONFIG default with a value (futarchy-system.md §9's C-table and the Defaults Register) — the owner replaces it from the next epoch, and the engine no longer waits for a value to be written before the first document can exist.
- The economist:
capsandcaps_rule,growth_multipliern,bootstrap_capε₀,liquidity_buffer_minb̲,lambdaλ,alphaα,ridge_epsilonε,cash_returnμ₁,winsor_q95,shrink_prior_mu0μ₀,shrink_stiffness,missing_row_rule,utilization_rhoρ,utilization_rule,payout_cap_ruleand itsv_maxunder v2,pool_taxτ_pool,window_rule,previous_allocation_rule,fallback_rule,rounding_rule— each with a default (futarchy-system.md §9 C2–C3, C15–C22). - The CEO:
chain_feed_rule,money_unit,pools,participants,min_stake_units,seed_units,seeder,tax_recipient,stake_mobility,open_height,close_height— the accounts, the chain and the heights OPEN (no default can supply them); the rest defaulted (C9–C12, C24). - Jointly:
vault_capacity_millsV (OPEN),window_blocks(C4),min_distinct_matches(C6),delta_rule. - The engine's, confirmed by the economist:
step_budget,rational_bits_max,verification_grace_blocks, and the rule identities the engine implements —arithmetic_rule,pivot_rule,capacity_rounding_rule,tie_break_rule,objective_rule,estimator_rule,returns_rule,gamma_c_rule,optimizer_rule— and thechainthat names them (C23, C25). - Derived, so nobody writes it:
previous_epoch_id— the predecessor's hash, which the engine fills from the epoch it follows (the genesis anchor for the first);system_hash, which the loader re-derives.
The 19 October note's values and the v2 defaults (futarchy-system.md §9 R24–R37, C52–C69): the note states λ, α, ρ, g, e, c_c, c_1, c_2, c_3, c_5, L, τ and Δ, each now a ruling record replacing or confirming its row above (D2's "Δ = one run" is the per-run observation, R34's Δ the snapshot interval; D7's "group rows refused" and D10's ε₀ floor at settlement are superseded by R31 and R28; questions 11 and 13 are closed by them). The engine's v2 defaults, each CONFIG with its source: allocation_precision = V (C63), participation_reward_units = 0 (C64), the per-interval peak (C52), the nearest-rank percentile (C53), newest-first moves (C54), u^prev in mills (C55), the zero and wiped-out balances (C56), the scored return (C57), η clamped (C58), the last interval (C59), the group rows in the solver (C60), the id region (C61), own capital pinned at open and locked (C62 — the one funds-risk question), observed zeros (C65), the evidence floor (C66), realized at the verdict (C67), no intra-window flow while no risk block exists (C68), credit drawn first (C69).
A field with a DEFAULT above still needs its value written into the document; the default says what the first document carries, not that the field may be omitted — the decoder is total (§3). Code of this layer waits on the user's word, not on a value: under law 7(c) as amended the defaults are the first document's values until a ruling record replaces them (futarchy-system.md §10 names the gates the first code must pass).