One question, carried all the way · step 2 of 8
Can the data we already have answer it?
Is the effect identified from the panel already on hand?
The operator has a panel: depots, weeks, maintenance hours, an outcome index. The temptation is to fit it. The question axiom asks first is whether that panel can produce the number the decision needs at all.
It cannot. Depots that were already doing well got more maintenance hours, and the thing that drove both was never recorded. identify says so and names what it would need — which is the answer that saves the money, because the alternative is a fitted number nobody can defend.
from axiom.identify import CausalGraph, identify
observed = CausalGraph.from_edges(
"capability -> hours, capability -> outcome, hours -> outcome",
unmeasured=["capability"], name="the_panel_on_hand",
)
verdict = identify(observed, "hours", "outcome")
print("status :", verdict.status)
print("route :", verdict.route or "none available")
print("needs :", sorted(verdict.unmeasured_required), "which is not recorded")
print()
for a in verdict.verdict.assumptions:
print(f" [{a.state}] {a.name}")
print(f" {a.statement}")
status : downgraded
route : backdoor_unmeasured
needs : ['capability'] which is not recorded
[unverified] unmeasured_adjustment_set
the adjustment set ['capability'] is available, but ['capability'] is unmeasured
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.