Making a model travel · step 6 of 6
The ledger is the deliverable
What do you hand the person who has to sign off on this?
Not the number. The number plus the list of every place it crossed a boundary and what was assumed to get it across. That list is a Ledger, it is built by construction rather than by discipline, and check_complete refuses a ledger with a facet missing from it.
downgraded, not identified — and correctly so. Two of the three assumptions are still unverified: nothing here has checked the half-life against the window, or the Jensen gap against a nonlinear response. The status is a description of the evidence, not a grade. Verifying those two is what the calibrate and surface pillars are for.
for line in resolved.ledger.lines:
print(f"[{line.kind}]")
print(f" {line.statement}")
if line.assumption is not None:
print(f" rests on {line.assumption.name} [{line.assumption.state}]")
print()
complete = resolved.ledger.check_complete(plan)
print("completeness :", complete.status)
print(" ", complete.reason)
print()
print("and the whole transfer is addressable:")
print(" source estimand", measured.content_hash()[:16])
print(" target estimand", needed.content_hash()[:16])
print(" ledger ", resolved.ledger.content_hash()[:16])
print()
print("re-deriving any of those from the same inputs gives the same")
print("hash on any machine, so a number in a slide can be traced back")
print("to the exact question it answered.")
[facet:population] population differs: district_A vs district_B rests on s_admissibility [satisfied] [facet:window] 0.813636 of the carryover mass lands within 12 period(s); scaled to the steady-state total by 1.22905 rests on carryover_contained [unverified] [facet:level] cluster read at individual level: point factor 1 (additive effect), SE factor 1.76777 rests on linear_aggregation [unverified] [transport] transport verdict identified via s_admissible_adjustment rests on s_admissibility [satisfied] completeness : identified every differing facet accounted for exactly once (population, window, level) and the whole transfer is addressable: source estimand adaf9c9abfa4b2fd target estimand 6a864f41935b7358 ledger 14c74efa68608cac re-deriving any of those from the same inputs gives the same hash on any machine, so a number in a slide can be traced back to the exact question it answered.
Every line above was captured by running this code at build time. The steps share one namespace, so the code on this page is the code you would type after the steps before it.