Versions and approval
A notebook never changes the model by itself. What it found, a model, a plan, a valuation or a network, is saved as a version: kept with its evidence and fingerprints, approved by a person before it is used, then kept or retired, and never altered.
Saving a version
A prediction saves a model with Models.Save; an operations research, quantitative or network notebook saves what it found with Results.Save. Each save is a new version, a draft:
EVALUATE SELECTCOLUMNS ( Demand, "Product", Demand[Product], "Liters", Demand[Liters] )
| Product | Liters |
|---|---|
| Pils | 150,000 |
| IPA | 60,000 |
| Cider | 50,000 |
| Lettøl | 40,000 |
Results.Save("Demand plan", demand.With("Planned", r => r.Number("Liters")), key: "Product", note: "the demand as it is")
Demand plan v1 (draft), saved 2026-11-06 19:08 by Kari Nordmann, fingerprint ad21eac4db39
Results.Save("Demand plan", demand.With("Planned", r => Math.Round(r.Number("Liters") * 1.05)), key: "Product", note: "5 % over the demand")
Demand plan v2 (draft), saved 2026-11-06 19:08 by Kari Nordmann, fingerprint c313e1196274
string.Join(Environment.NewLine, Results.Versions("Demand plan").Select(v => v.ToString()))
Demand plan v1 (draft), saved 2026-11-06 19:08 by Kari Nordmann, fingerprint ad21eac4db39
Demand plan v2 (draft), saved 2026-11-06 19:08 by Kari Nordmann, fingerprint c313e1196274
What a version keeps
Each version is a folder of its own in the notebook’s, versions\1\, versions\2\, and its files are read only:
- a manifest with who saved it, from which account, when, whether an agent did, the note, and each file’s SHA-256;
- its evidence: metrics, the verdict, charts and warnings;
- the notebook as it ran, with what each step showed, in Jupyter’s format;
- what it found (a plan’s rows, a network’s nodes, a valuation’s positions and market) or the model and its training rows, as Parquet that any tool reads.
A version’s life
In the notebook’s Versions tab, a version goes from draft to approved, to in use, to retired:
- A draft
- Approve and put in use, Approve only, or Not approved…, with why, kept with the version.
- Approved
- Put in use: the model scores with it, or its rows are the notebook’s table in the model, and the one in use before is retired.
- In use, retired
- Retire: nothing uses it after this. Put in use again brings a retired one back.
Drafts, versions that were turned down and retired versions never reach a report page or OpenBI Server: a notebook and the OAX view may score with one as a test, and say so.
Who approves
Someone other than the version’s author approves it, unless the project lets authors approve their own. The library holds to that even in a step:
// approving is a person's, and not the author's own: Kari saved version 2
Models.Store("Demand plan").Approve(2, "Kari Nordmann")
Line 2: Kari Nordmann saved v2: someone else approves it. (A project of one person can allow authors to approve: predictions/settings.json, "selfApproval": true.)
An agent never approves, puts in use or retires a version: no tool does it, and the library refuses a step the agent runs that tries (see What a person approves). A plan has a review page to approve it from, written from the version exactly as saved.
Checked and reproduced
A version is never changed, so it can be checked: every file against its fingerprint, each version against the one before, and the history’s chain:
// every version against its fingerprints, and the history's chain
Models.Store("Demand plan").Check()
2 versions, 10 files: unchanged
- Export for a review… in the Versions tab makes a zip of a version for whoever checks it.
- A model version can be trained again from what it kept, and the studio says whether the model is the same, bit for bit (
model_reproducefor an agent). model_versionsandmodel_version_comparegive an agent each version’s state, evidence and history, and two versions side by side.
These versions are the notebook’s own. The project’s Versions view shows the notebook’s files changing in git, as for any file (see Versions).