Versioning
Recipes change. You nudge the salt, swap a vinegar, tighten a fermentation time. Versioning keeps every state of the recipe you’ve ever committed to, so “the sauce we shipped in March” is a thing you can open, compare and rerun rather than a guess.
What a version is
Section titled “What a version is”A version is a complete copy of the recipe at a point in time: ingredient lines, phases and steps, checkpoints, expected yield, notes. Versions are numbered (v1, v2, v3) and each remembers which version it branched from. You can branch from any version, including an old one: if v4 went wrong, start v5 from v3 and leave the dead end in the record.
Statuses and the current version
Section titled “Statuses and the current version”Each version carries a status that says where it stands: Draft (being written), Testing (being trialled), Accepted (good), or Rejected (kept for the record, retired from production).
One version is also marked current. That’s the canonical answer to “what is this recipe today”: it’s the version other recipes pull in when they use this formula as a sub-formula, and the default offered when you plan a run. Marking a new version current is deliberate, so a half-finished draft never leaks into someone else’s batch cost.
A worked example
Section titled “A worked example”- v1 of the habanero sauce, 3.2% salt, ships for a season. Tasting score: 6 out of 10. Flat.
- You branch v2 from v1 and raise the salt to 3.7%.
- A test run of v2 scores 8. You set v2 to Accepted and mark it current.
- Next month’s experiment branches v3, which fails. It’s set to Rejected; v2 stays current, and nothing downstream ever noticed v3 existed.
The compare view diffs two versions side by side (lines, steps, yield and notes), so “what did we actually change between v1 and v2?” has an exact answer.
Locking, and why runs freeze copies
Section titled “Locking, and why runs freeze copies”An Accepted version you’re producing from can be locked: edits are refused until someone deliberately lifts the lock, and the app records who placed it.
Runs go one step further. When you plan a run, it freezes its own copy of the recipe. Edit the formula afterwards and the completed run still shows exactly what was made; an open run shows a drift banner offering to pull the update, but never rewrites itself silently.
The loop closes in the other direction too: a good run can be promoted into a new version, carrying its observed amounts and yield back into the recipe. That workflow lives in iterating and promoting, and the full editing detail in versions.