Implementation Guide¶
Audience: analysts and researchers at institutions or foundations who have
real economy data and want to model their own civilization using the HOURS framework.
This is not a developer guide — see extending.md for that.
Goal: given your data, you should be able to run one function and get outputs that mean something about your jurisdiction.
# template
from hours_eoh.core.simulation import make_economy_state
from hours_eoh.scenarios.collective import collective_snapshot
state = make_economy_state(population=..., capital_stock_teh=..., trust_balance=...)
report = collective_snapshot(
state,
parcels=your_parcel_inventory, # or land_hectares=... if you have no inventory
available_labor_eoh=your_labour_hours, # omit it and you are measuring DEMAND
age_fractions=your_age_mix, # reaches the pipeline AND the fisc
guf_parcel_count=your_private_parcels, # the land fee; omit it and none is charged
)
report["frame"]["labour_supplied"] # True: the mint is what was served, not demanded
report["frame"]["labor_constrained"] # True: your hours BOUND, and the shortfall is deferred
collective_snapshot() runs the EOH→TEH pipeline, the Ground Use Fee and the
fiscal snapshot on one stated frame, passing the three values between them
that otherwise have to be hand-carried. Run eoh scenario run collective to see
it on the shipped urban archetype, or eoh scenario run collective --frame us
(or --frame-file with your own) to run it on a frame's land and labour supply,
every input labelled. A frame carries county parcel COUNTS, not parcels, so on a
frame the fee is its MEASURED per-parcel half, P(ε) × the frame's PRIVATE
parcel count — the collective does not pay itself on parcels it holds
(guf_parcel_count= with no sample, in the function; stationarity prices the
same). The AREA part is NOT SUPPLIED: it needs a land-class→use mapping and a
location value, neither of which ships, so the fee is a LOWER bound and the
verdict says so. On a named frame the land and its parcels stay fixed when
--population moves; state more land in a frame file. The fee ASSESSED is not
the fee COLLECTED: holders can pay at most what the mint leaves them after the
levy and D3 consumption, and the rest is reported as land_fee["unpaid"]
(guf_unpaid on the CLI), never booked to the Trust. Fewer people on the same
land show up as an unpaid fee, not as revenue.
Pass your age mix as age_fractions, not to fiscal_snapshot by keyword.
It reaches the pipeline's personal obligation and the fiscal guarantee together.
Until 2026-10-14 a keyword both halves take reached the fiscal half only, and a
state's own register maturity reached the fiscal half only; a quantity both take
is now forwarded to both or refused.
Pass available_labor_eoh. Until 2026-09-12 this entry point could not
accept it, so every snapshot minted from obligation demanded while this guide
called the field its most consequential input. It is now forwarded to the
pipeline, the shortfall is reported as deferral, and the fiscal layer raises its
levies on what was served. The verdict string says which of the two you got.
Use it in preference to calling the three by hand. The sections below
document the pieces, because you will want to understand them and because
collective_snapshot is a thin assembly over exactly those calls — but running
them yourself means keeping eleven parameters in agreement across three
functions, and that is where the frame comes apart. It came apart in this
guide's own worked example, by nearly two orders of magnitude.
Start here: a real frame, the US¶
The quickest way to see what your own frame will look like is to run the entry point on one the repo already measures. The US frame is the contiguous 48 states and DC, and it is built from the repo's own US data. The run below is made when this site is built, so its figures are those of the published version.
$ eoh scenario run collective --frame us
Inputs (kinds: supplied · measured · derived [partly / from defaults] · default) frame: us
ε: 0.368 ± 0.150 [0.218, 0.517] — measured: US instruments — labour 0.218–0.411, capital 0.383–0.517 (OVERLAP); midpoint ± half-span
at both ends of the range: ε 0.218: solvent ε 0.368: solvent ε 0.517: solvent
population 339.615M — measured: JURISDICTION_FRAMES['us_mainland']
age_fractions infant 0.065, child 0.145, working_age 0.600, elderly 0.189 — measured: Census, latest year, via care_demand.population_shares
adult_capacity_h_yr 2,320.4 — measured: MTUS US2024 (mtus_time_use.capacity_frames)
adult_share 0.6585 — derived: capacity_weighted_adult_share (from age_fractions)
labor_supply_per_capita 1,528.0 — derived: adult capacity × adult share (from adult_capacity_h_yr, adult_share)
capital_teh 2.742T — derived (partly from defaults): BEA 2024 US inventory ('government' scope, current cost) at 19.56 $/TEH — rate: conversion_band() midpoint (15.94–23.17), ends re-run; per head × population (from population, default:conversion_band midpoint)
at both ends of the conversion band: 15.94 $/TEH: solvent 23.17 $/TEH: solvent
land_m2 7.655T — measured: JURISDICTION_FRAMES['us_mainland']
parcel_count 154.063M — measured: county parcel census, contiguous 48 + DC, PRIVATE parcels (the fee's payers; 3,181,173 government parcels excluded; owner type known for 82.4%, so the band is 127,002,817–154,740,888) — reference.parcels.contiguous_48_private_parcels; unchanged by --population
retired_share 0 — default: charter choice — retirement register OFF; pass --retirement-age to model it
ecosystem_health 0.7 — default: ECOSYSTEM_HEALTH_DEFAULT
capital_age_ratio 0.5915 — measured: BEA 2024 average age over BEA service life, 'government' scope, current cost — band 0.571–0.630, 90% of the stock covered (stock_age_ratio)
trust_balance 2.975T — default: charter choice — the opening labour inheritance, TRUST_BASE_TEH_PER_CAPITA (8,760/head) × population shipped as a scenario; no measurement path. State it with --trust-balance
key value
------------------------ -----------------
epsilon 0.3676
population 339,614,767
land_hectares 765,495,267
hectares_per_capita 2.254
parcel_count 154,063,081
teh_created 155,296,520,783
ecological_eoh 0
guf_revenue 764,246,359
guf_assessed 764,246,359
guf_unpaid 0
guf_payable_ceiling 110,759,807,490
guf_relocated_obligation 901,752
guf_over_levy 0.107
levy_total 7,143,639,956
trust_end 2,980,780,261,005
solvent True
labour_supplied True
labor_constrained False
deferred_total 0
frame us
guf_basis
per-parcel term × parcel count — the AREA part NOT SUPPLIED (needs a class→use mapping and a
location value)
guf_verdict
GUF revenue 764,246,359 TEH/yr against a relocated ecological obligation of 901,752.09 TEH/yr. The
obligation is a LOWER BOUND — it excludes the servicing cost of the built environment — and it is
small for the reason the domain-balance work records, so a large coverage figure here is evidence
about the obligation, not about the fee. Run `eoh scenario run servicing_census` for the
comparison that constrains the fee's magnitude.
verdict
one frame: 339,614,767 people on 765,495,267.0 ha at ε=0.37. The pipeline's ecological obligation
is passed to the fiscal layer by value, so the two cannot resolve the frame differently — the
failure that read 92.8× in the implementation guide's own example until 2026-08-21
(record/contestability.md#frame-seam-closed-exchange-layer). Labour was SUPPLIED and sufficed:
every human-carried hour had hours to meet it, so the mint is what was served and nothing is
deferred. GUF is assessed at 764,246,359 TEH/yr over 154,063,081 parcels — the per-parcel half
only. The AREA part is NOT SUPPLIED: it needs a class→use mapping and a location value, so this is
a LOWER bound on the fee.
Read the Inputs block first. Each line says where the value came from:
| Kind | What it means for your frame |
|---|---|
measured |
Read from a dataset the repo ships for the US: Census population and ages, MTUS labour capacity, BEA capital ages, ERS land, county parcel counts, and the two ε instruments. These are the lines you replace with your own data. |
derived |
Computed from other inputs. A line marked partly from defaults leans on a framework value. For the US, capital is BEA's stock in dollars, converted at a $/TEH rate that is a judgement, so the run also prints the result at both ends of that rate's band. |
default |
The framework's reference value. It says nothing about the US. A default whose source starts charter choice (the Trust's opening balance, the retirement register) is a governance setting your charter decides, not missing data. |
Then read the band lines. ε is not one number for a real economy. The US reading is a range from two instruments that share no data, so the run is repeated at both ends of the range and prints each verdict. A verdict that holds at both ends does not depend on where ε sits inside the band.
Then the fee. On a frame the land fee is its measured per-parcel half,
charged on the frame's private parcels. The area half needs a land-class→use
mapping and a location value, and neither ships, so the fee is a lower
bound. Holders pay at most what the mint leaves them after the levy and D3
consumption (guf_payable_ceiling); any rest is guf_unpaid, never revenue.
The whole US as one collective is a hypothetical
This run treats the whole mainland population as one collective with one Trust and one register. That is a reference frame for reading the inputs, not a proposal. A federation of collectives is closer to how a real transition would be organised: §5 divides the same frame into its states.
Your own frame¶
Write the US frame to a file, replace the values you have measured, and run any
frame-aware scenario on it. Every value you change is then labelled supplied:
python3 utils/eoh_cli.py frame show --frame us --format json > my_frame.json
python3 utils/eoh_cli.py scenario run collective --frame-file my_frame.json
python3 utils/eoh_cli.py scenario run stationarity --frame-file my_frame.json
Population, land, parcels and capital are one frame and travel together. On a
named frame the land and its parcels stay fixed when --population moves: land
is fixed and people move. State more land in the frame file instead. See the
CLI reference for every field and the
scenarios that read each one.
The Python sections below document the pieces under the entry point, because you will want to understand them. Section 4 runs them by hand on a small illustrative collective that runs short of labour, which the US frame does not.
1. What inputs the model needs¶
The EOH → TEH pipeline takes eight physical-state fields. Here is what each represents and where to find it in real-world data:
| Field | Type | Units | Real-world data source |
|---|---|---|---|
population |
float | persons | Census — total resident population |
capital_stock_teh |
float | TEH (≈ labor-hours of value) | National accounts: gross fixed capital stock, converted at your TEH/dollar exchange rate. This is the stock you hold NOW, not an ε=0 baseline — it is used exactly as supplied and is never rescaled by ε (author decision, 2026-09-09). Omit it and the model fills it from the canonical arc at your ε, which is a reference trajectory rather than your economy. Capital travels with population and ecological_area_hectares as ONE FRAME: the shipped default is stated at a 1M reference population, so moving the population without moving capital models your jurisdiction with someone else's apparatus. |
capital_age_ratio |
float | [0, 1] | National accounts: average age of fixed assets / average design life (or use 0.5 as default if unavailable) |
ecosystem_health |
float | [0, 1] | Ecosystem Services Index (ESI), Biodiversity Intactness Index (BII), or local ecological monitoring; 0.7 = moderate degradation, 0.9 = near-pristine. Since Phases 4e/4f this no longer moves the ecological DOMAIN — see the note below. It still drives the Ground Use Fee, which is where the recurring cost now sits. |
monitoring_capability |
float | [0, 1] | Fraction of deferred ecological EOH your monitoring systems can detect; proxy with your ecological data coverage fraction |
age_distribution |
dict | fractions summing to 1.0 | Census age pyramid, grouped into the buckets in AGE_GROUP_RANGES; see AGE_GROUP_FRACTIONS |
knowledge_base_size |
float | relative (1.0 = ε=0 reference) | Harder to measure; use national R&D stock relative to a subsistence baseline, or leave at canonical default |
ecological_area_hectares |
float | hectares | The land your collective is responsible for stewarding. Your own cadastre, or the GUF parcel inventory (land/collective.py) if you have run a GUF assessment — it already carries area per parcel. Omit it and the model derives the area from your population at LAND_HECTARES_PER_CAPITA (a planetary average, and the wrong number for any actual collective). Pass ecological_hectares_per_capita= instead if you know your ratio but not your absolute area. |
available_labor_eoh |
float | EOH-hours per year | The labour your collective actually has. employment × annual hours per worker, from your labour force survey; include unpaid household and care labour if your register admits it. Do not use working-age population — an hours-per-worker figure multiplied by the working-age band assumes full employment and overstates supply by the non-participation and unemployment rates together. Omit the field entirely and the pipeline assumes every hour of human-carried obligation gets worked; see the note below, which is the single most consequential default in this table. |
The ecological domain is stocks-only, and is zero unless you supply one. Phases 4e and 4f (adopted 2026-08-28/29) moved BOTH recurring ecological terms — the standing obligation of land at reference condition, and the response to its being degraded — to the Ground Use Fee, where they scale with land held rather than with the ledger. What remains in the domain is three STOCKS:
deferred_ecological,thermal_obligationandrestoration_obligation. None ships with a default, soeoh_to_teh_pipeline()reportsecological = 0.0until you supply one, andfiscal_snapshot()allocates nothing to it.This does not mean the obligation is absent, and it must not be read that way.
fiscal_snapshot()["ecological"]["relocated_to_guf"]reports what the pre-partition policy would have charged, so you can see the size of what moved. To recover the pre-partition behaviour — which is what every figure published before 2026-08-28 was computed at — passecological_standing_response="domain"andecological_health_response="domain".Where the obligation goes, and how to close the loop. Pass your parcel inventory through
land/collective.compute_collective_guf()and hand the result tofiscal_snapshot(guf_revenue=...):from hours_eoh.land.collective import compute_collective_guf guf = compute_collective_guf(your_parcels, epsilon)["guf_net_inflow"] snap = fiscal_snapshot(..., guf_revenue=guf) snap["guf"]["coverage"] # fee ÷ the obligation relocated out of the domain snap["trust"]["guf_over_levy"] # has the fee overtaken the labour levy?GUF arrives as its own Trust revenue line, never folded into the levy — the two behave oppositely across the arc, since the levy contracts with labour income while the fee scales with land held. It is circulatory: it redistributes TEH, it does not mint any.
snap["guf"]["covered"] == Trueis necessary, not sufficient. The obligation it checks against is only the ecological requirement that left the domain; the fee also carries the servicing cost of the built environment, which the snapshot has no inventory for. On the shipped urban archetype the coverage figure is enormous, which says almost nothing — the denominator is tiny. Set the same revenue against the servicing census and it reads an order of magnitude over, in line with the urban overshootscenarios/servicing_censusmeasures independently. Runeoh scenario run servicing_censusfor the comparison that actually constrains the fee's magnitude.Supply
available_labor_eoh, or you are measuring demand and calling it fulfilment. The framework's claim is a chain — physical obligation → verified fulfilment → monetary claim — and the middle link is the one you have to supply. The register enforces that an obligation existed: nothing mints without one, and offering more hours than the obligation requires mints nothing further. What the pipeline cannot know on its own is whether the work was done.
available_labor_eohdefaults to unsupplied. On that path the pipeline mints from the human obligation that is demanded, not the part actually served. At its sharpest: run the pipeline withpopulation=0and it still mints, because infrastructure and knowledge obligations do not depend on anyone existing. Supplyavailable_labor_eoh=0.0on the same call and it mints exactly nothing, booking the whole obligation as deferred.Both paths are legitimate — a demand figure is what you want when sizing an obligation — but they are different quantities and only one of them is fulfilment. Whether you passed the field tells you which produced your figure (
collective_snapshot()reports it asframe["labour_supplied"]);result["labor_constrained"]says whether the hours you supplied BOUND — it is False both when they sufficed and when none were given. Andresult["deferred_personal"]/result["deferred_total"]report the shortfall rather than absorbing it. Two rationing doctrines are available:survival_first(the default — personal obligation is served first, so a non-zerodeferred_personalis a severe reading) andpro_rata.
State your frame. Population, land area and capital stock are one frame and
must travel together: they are all extensive, so pairing one jurisdiction's
population with another's land silently rescales the ecological domain.
CAPITAL_STOCK_DEFAULT and TRUST_BASE_TEH say "at the 1M reference
population" in their own tag blocks and are per-frame quantities — running the
US population against an unscaled default would model the US holding the
capital, and the Trust, of 1M people. Since 2026-09-16/17 both RESOLVE against the
population you pass: an unsupplied value travels with your frame, and a value
you supply is used exactly as given. scenarios/frame.py declares named frames and
eoh scenario run frame shows what an undeclared pairing costs.
Converting capital stock to TEH: if you have capital stock in dollars, divide by your jurisdiction's mean labor-hour cost (the TEH/dollar exchange rate you decide). The model is denominated in TEH, not dollars; the exchange rate is an input, not something the model determines.
2. Which parameters to calibrate vs. keep at defaults¶
Every constant in data.py carries an inline provenance tag saying what kind of
claim its value makes. That tag, not intuition, tells you what to do with it.
Run eoh provenance check for the current counts, or read
hours_eoh/reference/data/constant_provenance.csv for every constant with its
evidence. Both are generated from data.py, so neither can drift from it. This
guide deliberately quotes no counts: they move every time a constant lands.
| Tag | What it means | What you should do |
|---|---|---|
physics |
Structural — a constant of nature | Keep. There are only a handful, and the CSV names them |
measured / derived |
Sourced, or computed from sourced inputs | Keep unless you have better local data; check the source suits your jurisdiction |
convention |
A declared reference frame, not a claim | Keep. Changing it changes what the numbers mean |
normative |
A decision. No dataset settles it | Decide it yourself. This is a charter question, not a calibration |
bounded |
Picked inside a measured band | Re-pick inside the band if you have local evidence. Read errs: — it says which way the pick is wrong and whether that direction is safe |
placeholder |
Nothing constrains it | Replace where you can. Read resolves_by: for what would settle it |
instance |
Yours to supply — describes your jurisdiction | Supply it. The shipped number is a reference default, not evidence |
The single most important correction to make if you have read an older version of this guide. It sorted constants into two bins, physics versus calibration, and listed
PERSONAL_EOH_BASE,ECOLOGICAL_THRESHOLD,M_BAND_LOW/M_BAND_HIGH,DEP_RATEandDIV_RATEas physics to be left alone. None of them is physics. Two are constitutional commitments (M_BAND_*,DIV_RATE), two are desk estimates picked inside a band (PERSONAL_EOH_BASE,DEP_RATE), and one is an unconstrained placeholder (ECOLOGICAL_THRESHOLD). "Physics" was being used to mean "we are confident", which is precisely the wrong thing to tell an analyst deciding what not to touch.
Start here: the constants that are yours, not ours¶
These carry the instance tag. Nothing about your jurisdiction can be measured
by this framework, so the shipped values are placeholders for your data — and
every canonical result in this repo was produced at them. Filter the
provenance CSV on tag == instance for the complete list; the ones below are
grouped by what they describe, and the list grows as the framework learns to
ask rather than assume.
TRUST_BASE_TEH— the shipped INHERITANCE: what a collective converting from a previous system brings. It was sized backwards (chosen so the dividend covered the obligations it funded), and that rationale was withdrawn by the author on 2026-09-16 and the number deliberately not re-fitted — so it is a SCENARIO, not a derivation. A civilisation starting from subsistence brings 0.0, and 0.0 is honoured as zero. Supply your Trust's real balance. Every fiscal function takestrust_balanceas an argument, so you need not edit the constant — pass your own, and an unsupplied one resolves against your population.CAPITAL_STOCK_DEFAULT— your gross fixed capital stock in TEH, and it is the stock you hold NOW: since 2026-09-09 a supplied stock is used exactly as given and is never rescaled by ε. The shipped value is stated at the 1M reference population and describes a mid-arc collective — so passing it unchanged at low ε asserts capital the arc says is not there, and passing it unchanged at a different population asserts someone else's apparatus. Leave the field unset and the model fills it from the canonical arc at your ε instead.LAND_HECTARES_PER_CAPITA— a planetary average, and the wrong number for any actual collective. Supply your land, as in §1.REGISTER_CADENCE— how often your register records fulfilment:episodic(the default, which errs toward the costlier reading on purpose) orcontinuous. It decides whether the register's own verification cost fits inside the labour your population can supply. Runeoh scenario run verification_band --cadence continuousto see where a continuous register stops being affordable.BASKET_WATER_*— the distance to water, the carry volume and the share carried by hand. A village and a city beside one spring walk the same distance, so no survey of one population transfers to another. Declare yours andscenarios/personal_floor.water_feasibility()reports whether it fits and the furthest distance that still does.PERSONAL_ABATABILITY_*andPERSONAL_EOH_BASE_CLIMATE_FRAME— how far automation can reach each personal component in your setting, and the climate your personal base is stated for.CONTESTABILITY_G_PRIV = 0.03— your real capital return net of depreciation. Piketty's r gives 4–5%, above this default.GUF_LVI_W_*— land-value sub-index weights. Land value is local by construction; these come from a hedonic regression on your parcel data.AGE_GROUP_FRACTIONS— your census age pyramid, grouped toAGE_GROUP_RANGES. The shipped split is OECD-shaped and fits the US of a few years ago; the US itself has aged since, which is the point — a pyramid is a date as well as a place.reference/care_demand.population_shares()groups any band structure against the shipped census extract.
Then: what to decide rather than measure¶
The normative constants are commitments your charter makes. No amount of data
retires them, and treating them as calibration knobs is a category error:
M_BAND_LOW/M_BAND_HIGH— the constitutional multiplier bandDIV_RATE— the share of depreciation paid out as dividendSUFF_LEVY_RATE— a redistributive commitment.min_levy_for_solvency()returns three rates, and they answer different questions. The rate that covers this year's spending (cover_expenditures_rate) is zero at every ε on the canonical configuration: the dividend alone covers the guarantee. The rate that keeps the Trust's balance from falling (stable_trust_rate) is not zero, and it rises toward the top of the arc. Call the function at your ε for both; the levy is a charter commitment, not a solved value.
Then: the placeholders worth your attention¶
Ranked by how much of the model they move, not by how wrong they are:
AGE_WEIGHT_INFANT/AGE_WEIGHT_CHILD—bounded, and the band is ONE-SIDED. The measured values are floors below the shipped picks, because ATUS surveys nobody under 15, so the self-maintenance term is missing and those floors can only rise. Leave them unless you have a time-use survey that covers children. They err HIGH, which is the safe direction: too low understates what a dependent needs and the deficit is paid in unserved care. (AGE_WEIGHT_ELDERLYismeasured, from ATUS + Census, andAGE_WEIGHT_WORKING_AGEis the numeraire, 1.0 by definition.)ECOLOGICAL_BASE_RATE— do NOT replace it with your stewardship-hours census; read §7 first. Since the Phase 4f partition the recurring ecological cost is the Ground Use Fee's, and charging it here as well would bill the same hours twice.CAPITAL_MACHINE_PROFILES— the tiers behindcivilization_epsilon()(Step 3). Calibrated to bracket the mid-arc ε they are meant to produce.
Rule of thumb: ask what would change this number? If the answer is a
dataset, it is measured/bounded/placeholder and you calibrate it. If the
answer is "your jurisdiction", it is instance and you supply it. If the answer
is "a vote", it is normative and you decide it.
3. Calibration walkthrough — step by step¶
Every block in this section runs as written, in order, against the
illustrative inputs below — tests/test_doc_examples.py fails the build if one
stops. Replace the values with yours; the variable names are what the later
steps read.
# Illustrative inputs for a 5M-person collective. REPLACE EVERY VALUE.
your_population = 5_000_000
your_capital_stock_in_teh = 8_000_000_000 # national accounts ÷ your TEH/currency rate
your_trust_balance = 150_000_000_000
your_labour_hours = 5_000_000 * 0.63 * 0.70 * 2_080.0 # employed × hours/worker
Step 1: Establish a baseline¶
Start with canonical_physical_state(0.40) — the ideal mid-arc reference for
a civilization at 40% automation. Compare it to your actual data:
from hours_eoh.core.trajectory import canonical_physical_state
canonical = canonical_physical_state(0.40)
print(sorted(canonical)) # the fields a physical state carries — compare yours field by field
# Your actual data:
your_state = {
"capital_stock_teh": your_capital_stock_in_teh,
"capital_age_ratio": 0.45, # from national accounts
"ecosystem_health": 0.68, # from ESI/BII index
"monitoring_capability": 0.55, # from ecological data coverage
"knowledge_base_size": 3.2, # relative to subsistence baseline
"knowledge_complexity_per_unit": 1.8, # estimated
"age_distribution": {"infant": 0.06, "child": 0.18, "working_age": 0.62, "elderly": 0.14},
"ecological_area_hectares": 12_000_000, # YOUR cadastre
"available_labor_eoh": your_labour_hours,
}
The divergence from canonical is the point — it tells you how your trajectory differs from the ideal arc.
Step 2: Run total_eoh() with your state¶
from hours_eoh.core.eoh_generation import total_eoh
eoh = total_eoh(
population=your_population,
age_distribution=your_state["age_distribution"],
capital_stock=your_state["capital_stock_teh"],
capital_age_ratio=your_state["capital_age_ratio"],
ecosystem_health=your_state["ecosystem_health"],
monitoring_capability=your_state["monitoring_capability"],
knowledge_complexity_per_unit=your_state["knowledge_complexity_per_unit"],
)
# eoh["total"] = your jurisdiction's total entropy obligation (h/yr)
# eoh["personal"] = biological burden (≈ PERSONAL_EOH_BASE × population × w,
# where w is the age-weighted mean — see the check below)
# eoh["infrastructure"] = capital stock maintenance burden
Check plausibility: personal EOH should be roughly PERSONAL_EOH_BASE × population
× w, where w is the age-weighted mean at YOUR demographics. Get it from
scenarios.feasibility.age_weight_mean() rather than from a number written here
— that mean has moved twice as age weights were measured, and a copy of it
written here went stale for a month the first time. If your figure is wildly off, check
that your age_distribution fractions sum to 1.0 and match the
AGE_GROUP_RANGES keys.
Which standard are you asking for? PERSONAL_EOH_BASE is the operating value
between two others: PERSONAL_EOH_SURVIVAL (what it takes not to die) and
PERSONAL_EOH_SUFFICIENCY (what it takes to live well), both referenced to
autarky. Pass personal_standard= to total_eoh() or to
eoh_to_teh_pipeline() to choose — both accept it as of 2026-08-17; before
that it reached only total_eoh, so this guide's two instructions could not
both be followed. It is the largest single lever in the model: survival →
sufficiency roughly doubles total EOH, more than any domain base. This matters more
than it looks: a feasibility test run at the sufficiency standard and reported as
a survival result is the specific error this repo made and corrected — subsistence
can survive, it just cannot reach sufficiency without automation.
Step 3: Choose your ε¶
ε is the fraction of EOH fulfilled by machines. Do not pick it from a sentence in a guide — read it off your economy, and expect a band rather than a number. The framework carries two instruments that share no data:
- From capital —
scenarios/capital_retrodiction.pyreads ε off a fixed-asset inventory. It rests on three declared judgements (valuation doctrine, the currency-to-hours rate, and what counts as capital), so it returns a GRID.currency_per_tehis required and has no default, because converting money to hours is itself a valuation. - From time use —
scenarios/labour_epsilon.pyreads ε off time diaries, with no currency in the chain and one judgement instead of three. Runeoh scenario run labour_epsilon.
Run for the US at government scope and current-cost doctrine (the one cell
the comparison reads by default), the two bands OVERLAP. The capital reading
takes the stock at its measured ages and the condition those imply (BEA ages,
BLS age-efficiency). Across the whole declared grid most cells also fall inside
the labour band. Call instrument_comparison() for the verdict and the
figures; the --frame us runs above print the same range. The capital route returns a grid precisely
because its three judgements are undeclared, so which verdict you get is a
function of the scope and doctrine you pick, not a property of the instruments.
instrument_comparison() reports both, and takes scope= and doctrine=
explicitly so the choice is yours and visible. Both divide by the same
obligation, so they check the machine/human split, not the total.
For a quick structural estimate from a capital description, use
civilization_epsilon():
from hours_eoh.core.civilization import civilization_epsilon
estimate = civilization_epsilon({
"population": your_population,
# keys are CAPITAL_MACHINE_PROFILES types; values a tier name or a spec dict
"capital": {
"power_grid": "standard",
"water_treatment": "standard",
"transportation": "advanced",
"industrial_automation": "advanced",
"computing_ai": "basic",
},
})
eps_estimate = estimate["epsilon"]
Or pick ε as a scenario parameter and run several values to bracket the uncertainty.
Step 4: Run the full pipeline¶
from hours_eoh.core.eoh_fulfillment import eoh_to_teh_pipeline
result = eoh_to_teh_pipeline(
epsilon=eps_estimate,
population=your_population,
capital_stock=your_state["capital_stock_teh"],
capital_age_ratio=your_state["capital_age_ratio"],
ecosystem_health=your_state["ecosystem_health"],
monitoring_capability=your_state["monitoring_capability"],
knowledge_complexity_per_unit=your_state["knowledge_complexity_per_unit"],
# WITHOUT THIS the two lines below report demand, not fulfilment.
available_labor_eoh=your_state["available_labor_eoh"],
)
# result["teh_created"] → TEH entering circulation this period
# result["human_eoh"] → labor carried by humans (h/yr)
# result["registered_eoh"] → officially recognized labor (h/yr)
#
# result["labor_constrained"] → True means your hours BOUND; False means they
# sufficed — or that none were supplied
# result["deferred_total"] → obligation nobody had the hours to meet
#
# NOTE once the constraint binds, result["human_eoh"] is what was SERVED, not
# what was owed. The obligation is human_eoh + deferred_total. Reading
# human_eoh alone under a binding constraint reports your labour supply
# back to you.
#
# result["human_fraction"] → share of obligation people carry. NOT 1 - ε:
# since Phase 2 the personal domain has its own
# automation floor. The old quantity is reported
# as result["uniform_split_factor"].
# result["machine_capability"] → the index you supplied (alias: "epsilon")
# result["epsilon_observable"] → the machine share the split actually implies,
# which is BELOW the index you gave it
Step 5: Run fiscal_snapshot()¶
from hours_eoh.core.fiscal import fiscal_snapshot
snap = fiscal_snapshot(
trust_balance=your_trust_balance, # collective Trust fund balance in TEH
labor_income=result["teh_created"], # TEH from pipeline
capital_stock_teh=your_state["capital_stock_teh"],
capital_age_ratio=your_state["capital_age_ratio"],
population=your_population,
epsilon=eps_estimate,
ecosystem_health=your_state["ecosystem_health"],
# STATE THE SAME FRAME YOU GAVE THE PIPELINE. Omit it and the area resolves
# from your population at LAND_HECTARES_PER_CAPITA — a planetary average.
ecological_area_hectares=your_state["ecological_area_hectares"],
)
print("Solvent:", snap["solvent"])
print("Trust end-of-period:", snap["trust"]["trust_end"])
print("Guarantee cost:", snap["guarantee"]["total_cost_teh"])
Pass the frame to both calls, or to neither.
fiscal_snapshot()sizes the ecological obligation independently of the pipeline, so if you give the pipeline your real land area and leave it off here, the two halves of your run describe two different jurisdictions. Before 2026-08-20 this function ignored the question entirely and always used the whole-contiguous-US anchor; the example in §4 below disagreed with its own pipeline call by nearly two orders of magnitude while reportingsolvent: True. It now resolves from your population exactly astotal_eoh()does, so the default is at least a frame somebody chose — but a planetary average is still the wrong number for any actual collective.If you already have the pipeline's answer, pass it straight through with
eco_eoh_override=result["eoh_by_domain"]["ecological"]and the two cannot diverge at all.
Step 6: Sensitivity sweeps¶
Physical inputs are keyword arguments, so a sweep is a loop over the call. Sweep what bites: since the Phase 4f partition, ecosystem health moves the Ground Use Fee rather than the ecological domain, so the informative sweep for an institution is usually the labour supply:
for share in [0.6, 0.8, 1.0, 1.2]:
result = eoh_to_teh_pipeline(
eps_estimate, population=your_population,
capital_stock=your_state["capital_stock_teh"],
ecological_area_hectares=your_state["ecological_area_hectares"],
available_labor_eoh=share * your_state["available_labor_eoh"],
)
print(f"labour ×{share}: deferred={result['deferred_total']:.3e} h/yr "
f"TEH={result['teh_created']:.3e}")
For fiscal parameters use the CLI:
eoh sensitivity fiscal --parameter dep_rate --values 0.03,0.045,0.06.
4. A collective that runs short of labour — complete example¶
The US frame supplies enough labour for its obligation, so its run never shows a deferral. This example does: a small collective with an illustrative 5M people, run by hand through the three calls under the entry point. Replace every value. The deferral it shows is the most important thing a first run can tell you, so do not raise the labour figure until it disappears.
from hours_eoh.core.eoh_fulfillment import eoh_to_teh_pipeline
from hours_eoh.core.fiscal import fiscal_snapshot
from hours_eoh.land.collective import default_parcel_count, per_parcel_guf
from hours_eoh.research.recalibration import exit_financing
# --- Your data (illustrative) ---
population = 5_000_000
land_hectares = 12_000_000 # YOUR cadastre
capital_stock_teh = 8_000_000_000 # national accounts ÷ your $/TEH rate
capital_age_ratio = 0.42
ecosystem_health = 0.65
epsilon = 0.28 # machine CAPABILITY; the observed share is lower
age_dist = {"infant": 0.065, "child": 0.180, "working_age": 0.630, "elderly": 0.125}
workers = population * age_dist["working_age"] * 0.70 # employment rate
labour_hours = workers * 2_080.0 # H_REF
trust_balance = 150_000_000_000
parcels = default_parcel_count(population) # or YOUR private parcel count
# --- The pipeline: population, land and capital are ONE frame ---
pipe = eoh_to_teh_pipeline(
epsilon=epsilon, population=population,
capital_stock=capital_stock_teh, capital_age_ratio=capital_age_ratio,
ecosystem_health=ecosystem_health, age_distribution=age_dist,
ecological_area_hectares=land_hectares,
available_labor_eoh=labour_hours,
)
# --- The fisc, on the same frame, with the land fee charged ---
snap = fiscal_snapshot(
trust_balance=trust_balance, labor_income=pipe["teh_created"],
capital_stock_teh=capital_stock_teh, capital_age_ratio=capital_age_ratio,
population=population, epsilon=epsilon, ecosystem_health=ecosystem_health,
eco_eoh_override=pipe["eoh_by_domain"]["ecological"],
guf_revenue=per_parcel_guf(epsilon, parcels),
)
exit_fin = exit_financing(epsilon, population=population)
# Under a binding constraint human_eoh is what was SERVED. The obligation is
# human_eoh + deferred_total; reading human_eoh alone reports your supply back.
obligation = pipe["human_eoh"] + pipe["deferred_total"]
print(f"Human obligation: {obligation/1e9:.3f}B h/yr "
f"({obligation/workers:,.0f} h per worker · yr)")
print(f"Deferred: {pipe['deferred_total']/1e9:.3f}B h/yr "
f"(labour-constrained: {pipe['labor_constrained']})")
print(f"TEH created: {pipe['teh_created']/1e9:.2f}B TEH/yr")
print(f"Land fee: {snap['guf']['revenue']/1e6:.2f}M TEH/yr")
print(f"Fiscal solvent: {snap['solvent']} (Trust stable: {snap['trust']['trust_stable']})")
print(f"Exit financeable: {exit_fin['exit_financeable']} via {exit_fin['channel']}")
The obligation per worker comes out above every work-year the framework carries
(WORK_YEAR_REFERENCE_POINTS), so the shortfall is real at any of them. This
example states only that shape. Run it for the figures; a copy of them here
would go stale.
fiscal_snapshot books the fee you pass as collected. It does not apply the
cap on what holders can pay. collective_snapshot applies it, and so does the
CLI, which is one more reason to use the entry point for a reported result.
Do not use
contestability_margin()(the bare χ = P/K_entry) for a reported result. §8.9 superseded it with the three-channel time-to-finance-exit test above, and the difference is not academic: the repo's own recorded finding that "the corridor is CLOSED at defaults" was produced by the retired invariant, and the adopted test reopens it. The bare form is kept, callable, so the disagreement can be reproduced on demand — not because it is still the test.
5. A federation: the US by state (experimental)¶
The start ran the US as one collective. A federation divides the same frame into collectives that each run their own pipeline, fee and Trust. The repo ships one division: the 48 states and DC. The run below is made when this site is built.
$ eoh coasean federation --frame us --split us_states
EXPERIMENTAL — research/coasean.py, each collective through collective_snapshot
ε = 0.368 (measured: US instruments — labour 0.218–0.411, capital 0.383–0.517 (OVERLAP); midpoint ± half-span)
split: us_states — 49 collectives; population, land and parcels are each collective's share of the frame's, capital and Trust its population share; the age mix is each collective's own; the rest is the frame's. Settlement rates are all 1.0: every collective mints at one multiplier
id label population ha/head parcels teh_created fee assessed fee collected unpaid solvent surplus
----- -------------------- ---------- ------- -------- ----------- ------------ ------------- ------ ------- --------
01 Alabama 5.193M 2.53 3.232M 2.383B 16.032M 16.032M 0.000 Y 911.373M
04 Arizona 7.624M 3.86 3.427M 3.492B 17.001M 17.001M 0.000 Y 1.331B
05 Arkansas 3.115M 4.32 2.068M 1.433B 10.257M 10.257M 0.000 Y 547.349M
06 California 39.355M 1.03 12.962M 17.921B 64.301M 64.301M 0.000 Y 6.847B
08 Colorado 6.013M 4.46 2.850M 2.732B 14.140M 14.140M 0.000 Y 1.050B
09 Connecticut 3.688M 0.34 1.299M 1.679B 6.443M 6.443M 0.000 Y 642.088M
10 Delaware 1.060M 0.48 478.671K 485.404M 2.374M 2.374M 0.000 Y 185.099M
11 District of Columbia 693.645K 0.02 226.748K 311.375M 1.125M 1.125M 0.000 Y 120.570M
12 Florida 23.463M 0.59 11.048M 10.704B 54.806M 54.806M 0.000 Y 4.099B
13 Georgia 11.303M 1.32 4.730M 5.172B 23.462M 23.462M 0.000 Y 1.972B
16 Idaho 2.030M 10.55 1.080M 935.287M 5.359M 5.359M 0.000 Y 355.384M
17 Illinois 12.719M 1.13 5.868M 5.797B 29.109M 29.109M 0.000 Y 2.221B
18 Indiana 6.973M 1.33 3.662M 3.207B 18.164M 18.164M 0.000 Y 1.221B
19 Iowa 3.238M 4.47 2.454M 1.491B 12.174M 12.174M 0.000 Y 570.601M
20 Kansas 2.977M 7.11 1.666M 1.372B 8.266M 8.266M 0.000 Y 521.678M
21 Kentucky 4.607M 2.22 2.302M 2.116B 11.420M 11.420M 0.000 Y 805.732M
22 Louisiana 4.618M 2.42 2.786M 2.128B 13.820M 13.820M 0.000 Y 810.212M
23 Maine 1.415M 5.65 721.884K 642.315M 3.581M 3.581M 0.000 Y 247.372M
24 Maryland 6.265M 0.40 2.462M 2.866B 12.212M 12.212M 0.000 Y 1.092B
25 Massachusetts 7.154M 0.28 2.439M 3.243B 12.098M 12.098M 0.000 Y 1.245B
26 Michigan 10.128M 1.45 4.519M 4.627B 22.418M 22.418M 0.000 Y 1.768B
27 Minnesota 5.830M 3.54 3.074M 2.676B 15.250M 15.250M 0.000 Y 1.020B
28 Mississippi 2.954M 4.11 1.951M 1.360B 9.679M 9.679M 0.000 Y 519.084M
29 Missouri 6.271M 2.84 3.330M 2.878B 16.518M 16.518M 0.000 Y 1.098B
30 Montana 1.145M 32.93 835.758K 523.864M 4.146M 4.146M 0.000 Y 201.471M
31 Nebraska 2.018M 9.86 1.123M 932.426M 5.573M 5.573M 0.000 Y 353.629M
32 Nevada 3.282M 8.67 1.380M 1.495B 6.844M 6.844M 0.000 Y 572.495M
33 New Hampshire 1.415M 1.64 652.969K 641.182M 3.239M 3.239M 0.000 Y 247.083M
34 New Jersey 9.548M 0.20 3.362M 4.361B 16.675M 16.675M 0.000 Y 1.662B
35 New Mexico 2.125M 14.78 1.515M 972.364M 7.514M 7.514M 0.000 Y 373.906M
36 New York 20.002M 0.61 5.585M 9.101B 27.703M 27.703M 0.000 Y 3.475B
37 North Carolina 11.198M 1.12 5.781M 5.124B 28.675M 28.675M 0.000 Y 1.959B
38 North Dakota 799.358K 22.36 708.437K 368.037M 3.514M 3.514M 0.000 Y 141.356M
39 Ohio 11.901M 0.89 6.317M 5.458B 31.334M 31.334M 0.000 Y 2.083B
40 Oklahoma 4.123M 4.31 2.355M 1.900B 11.684M 11.684M 0.000 Y 722.732M
41 Oregon 4.274M 5.82 1.844M 1.942B 9.148M 9.148M 0.000 Y 745.548M
42 Pennsylvania 13.059M 0.89 5.906M 5.961B 29.295M 29.295M 0.000 Y 2.280B
44 Rhode Island 1.115M 0.24 407.521K 504.266M 2.022M 2.022M 0.000 Y 194.025M
45 South Carolina 5.570M 1.40 2.918M 2.552B 14.476M 14.476M 0.000 Y 974.759M
46 South Dakota 935.094K 21.00 728.009K 432.520M 3.611M 3.611M 0.000 Y 164.901M
47 Tennessee 7.315M 1.46 3.502M 3.353B 17.373M 17.373M 0.000 Y 1.278B
48 Texas 31.710M 2.13 14.082M 14.586B 69.855M 69.855M 0.000 Y 5.538B
49 Utah 3.539M 6.03 1.525M 1.634B 7.566M 7.566M 0.000 Y 617.926M
50 Vermont 644.663K 3.70 301.551K 291.861M 1.496M 1.496M 0.000 Y 112.558M
51 Virginia 8.880M 1.15 4.223M 4.055B 20.950M 20.950M 0.000 Y 1.552B
53 Washington 8.001M 2.15 3.186M 3.645B 15.807M 15.807M 0.000 Y 1.395B
54 West Virginia 1.766M 3.53 1.378M 806.699M 6.838M 6.838M 0.000 Y 311.258M
55 Wisconsin 5.973M 2.35 3.494M 2.731B 17.335M 17.335M 0.000 Y 1.047B
56 Wyoming 588.753K 42.71 315.675K 270.216M 1.566M 1.566M 0.000 Y 103.073M
total 49 collectives 339.615M 154.063M 155.294B 764.246M 764.246M 0.000 49/49 59.305B
frame the whole frame 339.615M 2.25 154.063M 155.297B 764.246M 764.246M 0.000 Y 59.305B
at the ε ends: 0.218: 49/49 solvent, 0 with an unpaid fee, collected 896.180M; 0.517: 49/49 solvent, 0 with an unpaid fee, collected 625.854M
at the capital rate ends: 15.94: 49/49 solvent, 0 with an unpaid fee, collected 764.246M; 23.17: 49/49 solvent, 0 with an unpaid fee, collected 764.246M
Research tier
This runs through research/coasean.py. Its API is not stable, and the CLI
prints EXPERIMENTAL for that reason. Read it as a structural check of how a
frame divides, not as a forecast for any state.
Which columns are each state's own, and which are allocated. This matters more than any figure in the table:
| Input | Per state | Source |
|---|---|---|
| Population | measured | Census 2025, by state |
Land (ha/head) |
measured | ERS Major Land Uses 2022, by state |
| Private parcels | measured | The county parcel census, summed by state |
| Age mix | measured | Census 2025 single-year ages, by state; it replaces the frame's mix |
| Capital | allocated | The frame's BEA stock, divided by population share. It is not BEA by state. |
| Trust | allocated | The frame's Trust, divided by population share |
| ε, labour capacity per adult, stock age | the frame's | One value for every state |
So differences between states in this run come from people, land, parcels and age mix. A state with an unusually large or small capital stock per person does not show as one, because no per-state capital ships. A split file of your own can state that capital instead.
How to read it.
teh_createdis each state's mint.surplusis its Trust's surplus for the year: its revenue (dividend, levy, fee collected, estate levy) less the guarantee. A negative figure is a Trust that draws down its balance.- The fee cap applies state by state. A state can leave part of its fee unpaid
while the whole frame, run as one, pays in full. So the
totalrow and theframerow need not agree on the fee collected. When they disagree, the difference is the cost of the division. - The last lines repeat the run at both ends of the ε range and of the capital conversion band, and count the states that stay solvent and pay their fee.
Settlement between the states is hour for hour (registered_rate, adopted
2026-09-30). Every state mints at one multiplier, so every rate in this run is
1.0. See Research (Experimental) for the exchange layer.
Your own division. A split file is JSON: a collectives list where each
entry gives an id, an optional label, and positive population,
land_hectares and parcel_count. Those three are weights on the frame's
totals. An entry may also state its own age_fractions, which replace the
frame's mix for that collective. Pass it with --split my_split.json beside your --frame-file. The
CLI reference has the full format.
6. Interpreting outputs¶
fiscal_snapshot()["solvent"] = False
The Trust cannot fund the guarantee from dividend + levy + GUF. Stewardship,
ecological and care labour are paid at the mint and are not Trust expenditure. Action: pass a larger trust_balance
(build reserves — not by editing the constant), raise
SUFF_LEVY_RATE, or reduce DEP_RATE / DIV_RATE. Run eoh sensitivity to
find the minimum trust balance for solvency at your ε.
trust["trust_stable"] = False (even when solvent)
Trust is eroding — the guarantee exceeds levy + GUF inflows, so the balance is
paying the difference out of principal. Long-run: the Trust depletes.
Action: raise levy or build reserves now while the economy is labor-intensive.
Since 2026-09-15 only what the Trust OWES leaves it (unspent dividend is
retained), so at the shipped defaults trust_stable is True across most of the
arc and the balance grows. It is not True at the top: on the canonical 1M
frame at ε 0.99 the Trust erodes, with or without the land fee, while it stays
solvent. Read the flag at your own ε. trust["guarantee_unfunded"] reports
what the balance and inflows together could not cover.
exit_financing()["exit_financeable"] = False
No channel finances a member out within one vesting period, so exit from the
collective is notional rather than substantive. Check channel to see which arm
was closest: labor carries the low arc, underwritten the mid-arc trough, and
self (dividend savings) the high end. Action: structural commonization — raise
the charter formation share φ, or seed the commons for entry underwriting. Levy
adjustments alone do not fix it; that is the §8.3 adversarial finding.
contestability_margin()["passes"] = False (bare χ < 1) — superseded.
Kept as a documented negative result. It reads RED across the whole arc at
current defaults because the sufficiency floor fell with the PERSONAL_EOH_BASE
reprice, and for a tenure-0 member that floor is the entire portable endowment.
Treat it as an advisory, not a verdict.
condition_ii["status"] = "FAIL" (multiplier band breach)
The mean multiplier has drifted outside [1.8, 2.1]. Run eoh dashboard to see
direction. If above band: assessors are systematically over-scoring; trigger
adversarial review. If below band: skill investment is insufficient.
7. Known limitations¶
What the model cannot tell you:
-
Domain balance — read this before you trust any ε: personal EOH is almost all of the obligation at subsistence and still the largest domain at the top of the arc, while the ecological domain carries only stocks and is zero for land at reference condition. Since ε = machine EOH / total EOH, your ε is overwhelmingly a personal-domain number, and your ecological and thermal obligations will round to nothing in its denominator. Run
eoh arc --domain-sharesfor the live shares. The ecological half of this is now closed (Phase 4f, adopted 2026-08-28), and not by a measurement.ECOLOGICAL_BASE_RATEproduces a recurring obligation, and the adopted partition assigns everything recurring to the Ground Use Fee — where it scales with land held rather than with the ledger.ecological_standing_responsedefaults to"guf", so the ecological domain now carries stocks only and is exactly zero for land at reference condition. Do not replace this anchor with your own measured stewardship cost: that cost is GUF's, and charging it here as well would bill the same hours twice. What remains open is the KNOWLEDGE base andCDR_LABOR_HOURS_PER_TONNE; nothing in current data settles those. -
Individual tenure-vesting: the contestability model uses population-average portable endowment P. A late entrant to the collective has less vested capital than a founding member. Federation-wide tenure is tracked in
research/membership.py, but per-capita figures elsewhere remain averages. -
Between-collective exchange rates: the shipped single-ledger model is the N=1 limit.
research/coasean.pyimplements the N-collective federation with pairwise exchange rates, trust dynamics and settlement rules (§§6–7), anchored by a regression test reproducing single-ledger results exactly at N=1. It is research-tier: the API is not stable. -
Desire economy: the model covers entropy obligations (biological, physical, ecological, knowledge). It does not model the desire economy — discretionary consumption choices above the sufficiency floor. The
basket_price()function captures the floor basket; above-floor pricing is left to collective discovery. -
Calibration confidence — the honest headline: well under a third of the constants are grounded, the largest single category is placeholders with no measurement behind them at all, and measurement debt runs at roughly two constants in five. The actionable part is the placeholders. The strongest verdict any result here can carry is "possible": a verdict may not outrank the weakest input it rests on, and every headline function rests on at least one placeholder (
utils/verdict_ladder.pycomputes this). The framework shows the direction and qualitative shape of the arc, not point forecasts — use it for structural analysis and feasibility checks, not projection. Runeoh provenance checkfor the live figures; do not quote them from memory. -
Verification cost is reported beside the accounts, not inside them. What running the register costs is measured for the apparatus and checked against the labour a population can supply (
eoh scenario run verification_band), but it is not added to the obligation, because a registrant's documentation hour may already be inside it. Read the band before sizing a register, and declareREGISTER_CADENCE. -
Distribution under a captured register is not modelled. Capture cannot raise the total mint — registering cannot create obligation, and the mint cannot exceed what was served — but a captured register can admit one household's obligation and refuse another's, and every figure here is a per-capita aggregate with no variable for who was excluded. Your governance of the register is the only protection against that, and this model cannot check it for you.
-
Four constants are calibrated to a target and say so:
GUF_USE_*(scaled so aggregate GUF matches levy revenue at mid-arc),DEFAULT_SEGMENTS(means set so the weighted mean lands on a chosen point in the band — and it is the live default incore/multipliers.py, so any call omittingsegmentsinherits it),TRUST_BASE_TEH(sized to cover the obligations it funded — that target was withdrawn 2026-09-16 and the value was not re-fitted), andCAPITAL_MACHINE_PROFILES(tiers set to bracket the ε they are meant to produce). A result that depends on one of these is not independent evidence for it. -
Objectivity vs. transparency: the price computed by the model is the floor price — the minimum guaranteed by the TEH ledger. Actual market prices discovered above this floor are not modeled. See Prior Art and Limitations for the price-as-floor reframing.