Blog
Saved0

Versioning AI workflows: what to freeze so long-running cases don't drift

The workflow version didn't change, but the payment did: $48,500 approved, $62,000 sent. What a real AI application version includes, and how to keep paused cases from waking up in a different application.

LinkedIn
On this page
  1. The version number didn't change. The payment did.
  2. Is a workflow version the same as an application version?
  3. What "frozen" should mean
  4. Which parts of an AI workflow need a pinned version?
  5. Models, prompts and policies
  6. Data and features
  7. Three moments that govern one run
  8. Should a paused case resume on the latest version?
  9. Migration is a business change
  10. Rollback doesn't rewrite history
  11. Common anti-patterns
  12. Ten rules for versioning AI workflows
  13. The result: fixed meaning in a changing world
  14. Frequently asked questions
  15. How Frozion keeps every case on the version it started
  16. Sources
The short answer

An AI workflow version must cover everything that changes behavior, not just the diagram: prompts, model selection rules, policies, mappings, schemas, retrieval rules, tools and review screens. Freeze the definition, pin dependencies, record what each run actually used, and recheck current facts before a paused case acts. Running cases stay on their version unless migrated deliberately.

The version number didn't change. The payment did.

A commercial-claims workflow calculates a settlement, checks policy, gathers evidence and pauses while a senior adjuster reviews the recommendation. It runs as workflow version 12. A claim produces a $48,500 proposal. The adjuster sees the amount, claimant, coverage basis and evidence, and approves it. The case then waits for a separate release event before payment.

During the wait, nobody touches the workflow's steps. But several things it points to move on:

  • the model alias settlement-model/approved now points to a newer deployment;
  • claims-policy/current advances from revision 31 to 32;
  • the settlement-release/latest mapping changes how a missing deductible defaults;
  • the claims-manual retrieval index is rebuilt from an updated corpus;
  • a feature that summarizes prior litigation cost changes its lookback window;
  • the regional router moves the tenant to another inference environment.

When the release event arrives, the runtime resolves the same aliases again, recomputes the payload with the new mapping and feature, confirms it under the new policy, and pays. It sends $62,000. The approval record still says "approved", but it approved $48,500.

Every component can defend itself. Version 12 didn't change. The aliases resolved correctly. The new policy was valid. The mapping passed its tests. The payment service did what it was asked. What nobody can say is which version of the application actually ran.

Timeline of a claim paused for approval while the model, policy, mapping, index and region change underneath it, ending in a larger payment than approved
Nothing in the workflow's steps changed during the wait. Six things it depended on did.

Is a workflow version the same as an application version?

No. A workflow version identifies the diagram. An application version must identify everything that shapes behavior: contracts, mappings, policies, prompts, model rules, retrieval, tools, review screens and evidence.

Configuration management has long separated an agreed baseline from later changes and required a controlled process to change it. That idea still holds. What's different with AI applications is the size of the thing being baselined. It isn't a binary or a diagram. It's every artifact that changes what happens at a governed step.

That matters most when cases live a long time. A short request resolves its dependencies once. A paused case can cross several releases, policy changes, data revisions, model updates, approval expiries and environment moves before it does anything consequential.

So the question isn't "which workflow file did we deploy?" It's three questions: which application meaning was approved, which dependencies carried it out, and which current facts still had to be true when it acted?

What "frozen" should mean

"Frozen" is a useful word that gets overloaded. Taken literally, it suggests copying every input, record, credential, model response and policy into one permanent snapshot. That's neither practical nor wanted. Some facts have to stay current, because their validity changes over time.

A sound approach uses five binding modes instead of one universal freeze:

Binding modeWhat's fixedGood for
Immutable definitionThe workflow's meaning can't change after publicationSteps, branches, contracts, mappings, approval and retry rules
Pinned dependencyA referenced artifact is bound by exact version or digestPolicies, schemas, prompts, code, sub-workflows, test profiles
Governed selectionThe selection rule is fixed; the target it picks may varyApproved model provider or region, environment endpoints
Recorded observationThe runtime records what actually resolvedModel deployment used, documents retrieved, feature values, policy result
Current-state recheckThe runtime checks again what must be true nowAuthority, record revision, approval validity, data freshness

Each mode solves a different problem. An immutable definition stops silent edits. A pin stops an alias drifting. A governed selection rule keeps portability while limiting what can be picked. A recorded observation lets you reconstruct the past. A current-state recheck stops an old approval or policy decision being treated as valid forever.

Which parts of an AI workflow need a pinned version?

Anything whose change would alter the outcome: schemas, mappings, queries, policy references, prompt revisions, retrieval rules, sub-workflows, tools and the review screen the approver saw. Models get a pinned selection rule plus a record of what ran.

ArtifactHow to bind itWhat each run records
Steps and control flowImmutable in the published versionVersion identity and content digest
Step input and output contractsPinned schema identity and dialectContract versions produced and consumed; validation results
Mappings, expressions, queriesPinned artifact versionActual mapping or query version and defaults applied
Policy checksPinned policy for historical meaning; current-policy recheck declared separatelyPolicy revision, facts, decision, obligations
Prompt and modelPinned prompt revision and model selection ruleRendered prompt, actual deployment, provider, region, parameters
Retrieval and contextPinned eligibility, ranking, freshness and permission rulesDocuments and records used, index revision, provenance
Sub-workflows and toolsPinned version, contracts, authority and side-effect rulesVersion invoked, call, receipt, reconciliation
Human review screenPinned proposal schema, layout and evidence setProposal digest, evidence shown, approver, decision, expiry
EnvironmentPinned constraints plus a selection ruleEndpoint, region, provider, flags and config revision

The version should have a stable, canonical form and a digest. A digest proves the definition hasn't changed since it was approved. It doesn't prove the application is correct or authorized. Schema identities should be explicit too: declaring the schema dialect and version stops two consumers validating the same payload under different rules.

A software bill of materials is a useful input, but it lists packages. It doesn't describe prompts, policies, mappings or review screens.

Models, prompts and policies

A model's marketing name or a mutable alias isn't a version. Bind the prompt and tool definitions, the output contract, the approved deployment class, the evaluation profile and the rule for choosing a target. Then record the actual endpoint or release each run used. If a provider can't expose an immutable identity, record the best release metadata available and treat silent provider drift as a named risk.

For policy, keep the revision that produced each decision. Separately, declare whether current policy is rechecked at resume or before the change. "Why was this allowed then?" and "May this happen now?" are different questions, and a consequential action often needs both answered.

Secrets never go in the published definition. The version binds the credential type and scope; the runtime resolves the secret and records only that it validated.

Data and features

Versioning data doesn't mean copying the database for every run. Depending on the stakes, keep the record version, effective time, document revision, query and feature definitions, point-in-time feature values, index revision, or a snapshot of the exact context given to the model. Revision identifiers on mutable records let you prove whether a record changed after the proposal was made. The point is to tell "the same customer" apart from "the same version of that customer's record".

Three moments that govern one run

Versioning gets clearer once you separate three moments:

  1. Publication: what behavior is allowed? The definition is validated and frozen, with its dependency list, compatibility rules, required evidence and migration policy.
  2. Start: what did this run resolve? The runtime resolves whatever is allowed to vary and writes down exactly what it picked.
  3. Resume or commit: what must still be true? Before a paused case continues, or before a change reaches the outside world, the runtime rechecks authority, scope, policy, record revision, approval and any earlier uncertain action.

These three moments stop two opposite mistakes. One is resolving everything late, which makes the past impossible to reconstruct. The other is freezing a past authorization and treating it as valid forever. Zero-trust guidance points the same way: access depends on current identity, resource and environment, so yesterday's sign-in isn't today's authority.

Three columns labeled publication, start and resume or commit, showing what is frozen, what is recorded and what is rechecked at each
Freeze meaning at publication, record what resolved at start, recheck what must still be true before acting.

Should a paused case resume on the latest version?

No. A running case stays on the version that started it. New publications govern new cases. Moving a live case forward is a deliberate migration, not a pointer update.

That doesn't mean every external dependency must stay online forever. It means the runtime keeps the case's application identity, what it resolved, and rules for what to do when a dependency is retired.

When an event or decision arrives after a long wait, a resume check decides whether continuing is still legitimate. It compares the waiting step, proposal and version identities; the proposal digest and the current record revision; the authority and policy conditions that must still hold; the approval's scope and expiry; whether bound dependencies are still available; whether something else has already changed the business state; and whether an earlier action is uncertain and needs reconciling first (see retries and idempotency).

The outcome is one of four: continue on the original version, continue after rechecking current facts, migrate under control, or stop and return for re-approval.

Migration is a business change

There are good reasons to move a running case to a newer version: a security fix, a retired dependency, a regulatory change, a corrected rule. It has to be explicit, because it can change what a pending approval, proposal or state value means.

A migration policy should say which source and target versions qualify; which paused states can move; how state, IDs and schemas transform; which dependencies stay historical; whether old policy decisions remain binding or become evidence only; which approvals survive and which need renewed review; how timers, events and uncertain actions are reconciled; and what the fallback is. "Resume on latest" skips every one of these questions. It isn't a migration policy. It's an admission that the version never meant anything.

Rollback doesn't rewrite history

Rollback republishes an earlier version for new work. It doesn't change which version past runs used. Their records keep pointing at what actually governed them.

Rollback and replay also depend on retention. You can't reconstruct or resume an older version if its prompt, policy bundle, schema, mapping, model deployment or sub-workflow was never archived. Retention and dependency inventory are operational requirements, not just audit tidiness.

Replay works the same way. Rerunning a case against today's models, policies and data doesn't reproduce what happened; it tests a new application against old inputs. A pinned version and a run manifest let you separate inspecting the past, simulating it without side effects, comparing a proposed version against history, and re-executing under current checks. Behavior replay covers those modes. Bit-for-bit reproduction may be impossible when a hosted model or external source can't be recreated. Say so plainly. Knowing exactly what ran still has value.

Common anti-patterns

Anti-patternWhy it failsWhat to do instead
Version only the workflow filePrompts, policies, models, mappings and indexes drift on their ownVersion every behavior-shaping dependency and record each run
Point at "latest" or "current" with no ruleOne version number means different behavior over timePin it, or fix the selection rule and record what resolved
Treat a past authorization as permanentAuthority, scope and policy changeKeep the historical decision; recheck current authority before acting
Snapshot everythingCostly, copies secrets and live data, still misses meaningChoose a binding mode per artifact
Resume paused work on the newest versionContracts, approvals and policy meaning change silentlyStay on the original version or migrate deliberately
Store approval as a yes/no flagLoses the proposal, evidence and version reviewedBind approval to a proposal digest and version
Call a fresh rerun "replay"Can't show what historical dependencies didSeparate inspection, simulation, comparison and re-execution
Keep environment config outside the versionEndpoints, providers and flags become unreviewed behaviorMake environment rules part of the published version

Ten rules for versioning AI workflows

  1. Define the application version as the workflow plus every dependency that shapes its behavior.
  2. Inventory contracts, mappings, policies, prompts, models, context rules, features, tools, sub-workflows, review screens and environment rules.
  3. Give each dependency one binding mode: immutable, pinned, governed selection, recorded, or rechecked.
  4. Allow "latest" only when the selection rule and the actual result are both governed and recorded.
  5. Write a run manifest of what each case actually used.
  6. Keep historical evidence separate from current permission.
  7. Bind every approval to the exact proposal, evidence and version reviewed.
  8. Keep running cases on their version; migrate only deliberately and with evidence.
  9. Retain what rollback and replay need.
  10. Version the change process too: migration, rollback, deprecation and resume rules.

The result: fixed meaning in a changing world

Versioning an AI workflow isn't about making the enterprise static. Data changes, policies evolve, people lose authority, models improve and systems retire. Long-running cases have to work in that world.

The job is to make change visible. Freeze what the application means, pin or govern what can alter that meaning, record what each run actually used, and recheck what depends on the present. The workflow version tells you which diagram was published. The application version tells you what was approved. The run manifest tells you what actually ran. The resume check tells you whether it may still act now.


Frequently asked questions

What should be versioned in an AI workflow?

Everything that changes what the workflow does: the steps and branches, schemas and mappings, policies, prompts, model selection rules, retrieval and feature definitions, sub-workflows and tools, review screens, environment rules and the evidence the workflow must keep. Versioning the diagram alone leaves most behavior free to drift.

Should a paused AI workflow resume on the latest version?

Running cases should stay on the version that started them. New publications govern new cases. Moving a live case to a newer version is a deliberate migration that transforms state, rechecks policy and authority, and decides which approvals still hold.

Is pinning a model alias enough to version an AI model?

An alias such as "approved" or "latest" can point to a different deployment tomorrow. Pin the prompt revision and the rule for selecting a model, then record the actual deployment, provider and region each run used. Treat silent provider changes as a named risk.

How does this work for agents we already run?

Route the agent's tool calls through a governed runtime over MCP or HTTPS, so each call runs inside a published workflow version. The runtime records which version and dependencies handled each case, and changes ship through compare, simulation and approval instead of silent edits.

With Frozion

How Frozion keeps every case on the version it started

In Frozion, every workflow is published as a version, and changes go through version compare, a dependency view of every workflow that uses an artifact, batch simulation on recorded cases, and approval to publish. Deploys don't interrupt running cases, and rollback restores a prior version for new work. Approvals bind to the exact revision reviewed, and authority is rechecked when paused work resumes. Provenance & Evidence keeps one tamper-evident record per decision, and Behavior Intelligence & Replay inspects past cases without live side effects.


Sources

  1. NIST SP 800-53 Rev. 5, Security and Privacy ControlsConfiguration baselines, change control and component inventory.
  2. NIST SP 800-218A, Secure Software Development Practices for Generative AIVersioning, release retention and provenance for AI components.
  3. NIST AI Risk Management FrameworkLifecycle documentation, inventory and monitoring for AI systems.
  4. CISA, Software Bill of MaterialsComponent inventory as one input to an application version, not a substitute.
  5. RFC 8785, JSON Canonicalization SchemeStable content identity for digests of published definitions.
  6. JSON SchemaDeclaring the schema dialect so every consumer validates the same way.
  7. NIST SP 800-207, Zero Trust ArchitectureAccess decisions based on current attributes, not past sign-in.
  8. RFC 9110, HTTP SemanticsValidators and conditional requests to detect a changed resource.
  9. W3C PROV-ONeutral provenance relationships between entities, activities and agents.
More in Evidence & inspectability

Evidence & inspectability

Audit & explanation 2
Lineage & provenance 3
Versioning & replay 2

Other topics

Pick up where you left off: