Equilibrium Labs Docs
v0.1
Changelog GitHub
Menu

Validation

Assumption graph

Assumptions surfaced by claimcheck.validate are rarely independent of each other. One assumption often depends on another holding first — the taxonomy mapping only matters if the underlying classification study’s methodology is sound, for instance. claimcheck models this explicitly as a directed acyclic graph rather than a flat list, so a reviewer can see not just what was assumed, but what each assumption is standing on.

Inspecting the graph

PYTHON
from equilibrium import claimcheck

r = claimcheck.validate("AI raised task exposure 14% in 2025")
graph = r.assumptions.graph()

graph.nodes
# ['onet-taxonomy-mapping', 'onet-code-stability-2023-2025',
#  'task-mix-stability-2025', 'exposure-score-transfer']

graph.edges
# [('onet-code-stability-2023-2025', 'onet-taxonomy-mapping'),
#  ('onet-taxonomy-mapping', 'exposure-score-transfer'),
#  ('task-mix-stability-2025', 'exposure-score-transfer')]

Each node is a single assumption with a stable ID and a one-line statement; each edge means the target assumption is only meaningful if the source assumption holds. exposure-score-transfer — the assumption that exposure scores can be applied to 2025 employment data at all — sits downstream of both the taxonomy mapping and the task-mix stability assumption, and depends on both.

Challenging an assumption

PYTHON
graph.challenge("onet-code-stability-2023-2025")
# marks 'onet-taxonomy-mapping' and 'exposure-score-transfer' as unresolved

Challenging a node marks every assumption downstream of it as unresolved, without requiring you to manually track which other assumptions were relying on it. This is the main value of modeling assumptions as a graph rather than a list: in a flat list, an assumption three steps removed from the one you doubt looks just as solid as any other. In the graph, unresolved status propagates automatically, so the parts of the result that are still standing on solid ground are visibly distinct from the parts that are not.

Challenging a node does not silently recompute .confidence_band — a result with unresolved assumptions is a different claim, and claimcheck won’t blend the two. Call claimcheck.validate again if you want a band computed under the alternative assumption.

View source on GitHub