Concepts¶
model-ledger is small on purpose. Three ideas carry the whole system.
-
Everything is a
DataNodewith typed input/output ports. Declare what a node reads and writes; the dependency graph builds itself from port matching. -
A model is an identity (
ModelRef). Everything that happens to it is an immutable, content-addressedSnapshot. The inventory is an append-only log. -
Governed groups whose members are themselves models. A "credit decision system" that rolls up its scorecard, policy rules, and ETL — each governed in its own right.
How they fit together¶
graph TB
subgraph identity ["Identity"]
REF["ModelRef<br/><small>name · owner · type · tier · purpose</small>"]
end
subgraph history ["History (append-only)"]
S1["Snapshot<br/><small>registered</small>"] --> S2["Snapshot<br/><small>retrained</small>"] --> S3["Snapshot<br/><small>validated</small>"]
end
subgraph graph ["Graph"]
N1["DataNode"] -->|port match| N2["DataNode"]
end
REF --- S1
REF -.is a node in.- N1
classDef ink fill:#1c1a17,color:#f7f3ec,stroke:#000;
classDef ox fill:#7a1a1a,color:#fff,stroke:#5a1010;
class REF ink; class S1,S2,S3 ox;
- Identity is the minimum a regulator needs: who owns it, what kind of model, how risky, what it's for.
- History is every change, immutable and ordered. You can ask the inventory what it looked like on any past date.
- Graph is how models relate. Declare ports; dependencies follow.
A fourth idea — compliance profiles (SR 11-7, EU AI Act, NIST AI RMF) — reads this data to check completeness. It's a pluggable layer, not part of the core model; see the API reference.