Part 2 of 4 · 10 min read
Definitions
Covers: Definitions; The manifest; Results; Design rules; Interview questions, with the follow-ups; Common mistakes; What the example does not do.
Definitions
Release manifest, release id
- Release manifest: the complete list of components that determine behaviour.
- Release id: a content hash of the manifest.
Model snapshot, alias
- Snapshot: a fixed dated version of a model.
- Alias: a moving name such as
latestthat points to different snapshots over time.
Immutable, pointer
- Immutable: never edited after creation.
- Pointer: a named reference (prod, staging) to a specific release.
Replay
- Replay: re-running logged inputs against a version to compare outputs.
Pinning
- Pinning: binding something (a run, a request) to a specific version for its lifetime.
Deprecation / retirement
- Deprecation: a provider announcing a model will be removed.
- Retirement: the date after which it stops working.
The manifest
Results
| Replay of 500 logged requests (stand-in model) | Identical outputs |
|---|---|
| Same snapshot, temperature 0 | 95.6% |
| Pinned snapshot, replayed later | 95.6% |
| Temperature 0.7, no seed | 36.6% |
| Temperature 0.7, fixed seed | 100% |
| Alias silently moved to a new snapshot | 84.4% |
| Check | Result |
|---|---|
| Any one of 8 manifest fields changed | release id changes |
| Extra space in a prompt | release id changes (878347f787 to 3b31f86a1a) |
| Diff of two manifests | lists only the changed fields |
| Promote, promote, rollback | prod back at the first release; 2 manifests stored |
| 200 runs in flight at a prompt change, unpinned / pinned | 200 mixed / 0 mixed |
- Reproducibility is a property you design for, with manifests, pinned snapshots and logged inputs.
- Agreement under replay is a monitoring signal; drops with no code change mean the model, index or tools moved.
- Rollback should be a pointer move.
- Runs need to know which release they belong to.
Design rules
- Version everything that affects behaviour in a manifest; hash it; log the id on every request, trace, journal and eval run.
- Keep releases immutable and environments as pointers; make rollback a pointer move.
- Pin model snapshots; ban
latestin production; track retirement dates; test migrations as releases. - Store prompts in version control (or a registry with history), with templates validated for variables; review diffs.
- Log what you need to replay: inputs, retrieved context ids, tool results (or recorded stubs), sampling settings, seed.
- Evaluate by tolerance, not exact match; use multiple runs and statistics (Level 9).
- Replay a sample of production traffic against new releases before and after promotion; alert on agreement drops.
- Pin runs and queued jobs to their starting release; keep old releases deployable until they drain (modules 2, 3, 8).
- Version retrieval indexes and tool schemas like code; a re-embedded index is a release.
- Attach a model card and eval results to every release (Level 10 module 10).
Interview questions, with the follow-ups
How do you reproduce yesterday's behaviour?
"I record a release manifest id on every request: code sha, exact prompts, pinned model snapshot, sampling settings, tool schemas and index version. I can then check out that release, replay the logged inputs and context, and compare. Temperature 0 is not a guarantee, so I judge by evals with tolerances; in my toy model even the same snapshot at temperature 0 matched only 95.6 percent." Follow-up: "What if the provider changed the model?" That is why I pin snapshots; aliases moved agreement down to 84 percent in my test with no code change.
How do you roll back a prompt?
"Prompts are part of an immutable release; production is a pointer, so rollback moves the pointer to the previous release id. In-flight runs stay pinned to the release they started with." Follow-up: "What about queued jobs?" They carry the release id or are compatible with both versions during the rollout (module 8).
Why not just use latest?
"It makes behaviour depend on someone else's deployment schedule: it can change without any commit, so a regression has no diff to find. I pin snapshots and migrate deliberately with evals, tracking retirement dates." Follow-up: "Isn't pinning stale?" Yes, so migration is a planned release, not an accident.
How do you find what changed when quality dropped?
"Diff the manifests of the good and bad releases, check agreement on replayed traffic by release, and look at quality metrics per release id. If nothing in my manifest changed but quality did, the cause is outside it: data, traffic mix, a tool or the provider." Follow-up: "What if the model is the same but a tool changed?" The tool schema hash is in the manifest, and tool behaviour changes show up in the recorded tool results.
Common mistakes
- Prompts edited in a dashboard with no history or review.
latestaliases in production.- Not logging the version with each trace.
- Assuming temperature 0 means identical outputs.
- Editing releases in place instead of publishing new ones.
- Unversioned retrieval indexes and tool schemas.
- In-flight runs switching versions mid-run.
- No retirement tracking, then a forced migration under pressure.
- Comparing outputs byte for byte instead of by evaluation.
What the example does not do
- The model is a stand-in: four canned variants, hash-chosen; real non-determinism has different causes and sizes.
- Assumed rates: 2 percent flip, 15 percent snapshot change, seeds always honoured (many APIs offer best-effort seeds or none).
- No real registry, prompt management product, tracing backend or deployment pointer system.
- No capture of external state: replay of tool results, retrieved documents and time is not modelled.
- Hashing JSON is simplified: no canonicalisation beyond sorted keys.
- No cost or latency versioning, and no retirement calendar integration.
- Optional real experiment (I did not run this): log 500 real requests with their full context, replay them against the same pinned snapshot at temperature 0 on different days, and measure exact and semantic agreement; then replay against a newer snapshot.
Check yourself
A model alias such as latest moves to a new snapshot overnight. What do you see? (Behaviour changes with no change in your repo; in the stand-in model, replay agreement dropped from 95.6 percent to 84.4 percent. Pin an exact snapshot.)
For the curious Temperature 0 is not a guarantee
With an assumed 2 percent chance per call of a different variant at temperature 0, replaying 500 logged requests matched 95.6 percent of the time; at temperature 0.7 with no seed, 36.6 percent; with a fixed seed, 100 percent, which holds only where the provider honours seeds. When a new prompt went live while 200 runs were mid-flight, all 200 unpinned runs mixed two versions; pinned runs, none. Compare with evals and tolerances, not byte equality.
What you will use daily at work
| Practice | What it looks like |
|---|---|
| Hash everything that decides behaviour | Code, prompt, model snapshot, settings, tools, index, guardrails. |
| Make releases immutable | Environments are pointers; rollback moves a pointer. |
| Pin runs to a release | Let old releases live until their runs finish. |
| Watch model retirement dates | Track them like any dependency deadline. |
Draft: confirm your provider snapshot names, retirement notices and seed support.
What you must be able to say (one page)
- An agent's behaviour is decided by more than code. Code, prompts, the model (and its snapshot), sampling settings, tool schemas, retrieval index, guardrail rules and configuration all change what it does. If you cannot say exactly which combination served a request, you cannot reproduce a bug, compare releases or roll back safely.
- Define a release manifest and hash it. My
Manifestholds code sha, exact prompt text, model snapshot, temperature, seed, tool schema hashes, index version and guardrail set; the release id is a hash of all of it, recorded in every trace, journal record and eval run (modules 3 and 8, Level 9). Manifests are immutable values; changing any one field (I tested all eight) changes the id, even an extra space in a prompt (id878347f787became3b31f86a1a), and a diff between two manifests lists exactly the field that changed. That diff answers "what changed since yesterday?" in seconds. - Pointers, not copies. A registry stores immutable manifests;
prodis a pointer to a release id. Promote moves the pointer, rollback moves it back (tested: after rolling back,prodpointed at the original id and both manifests were still stored). Never edit a release in place. - Pin model snapshots, avoid aliases. A provider alias such as
latestordefaultcan start pointing to a new snapshot with no change in your repo; behaviour shifts silently. In my stand-in model, an alias that moved to a new snapshot changing 15 percent of prompts dropped replay agreement from 95.6 percent to 84.4 percent. Providers also retire snapshots on published schedules, so track retirement dates (check your provider's current deprecation policy) and plan migrations as releases with evals (Level 9 module 7). - Temperature 0 is not a guarantee. You can fix the sampling settings (temperature, top-p, top-k) and the seed, but even then results may not be fully reproducible. In my stand-in model with an assumed 2 percent chance per call of a different variant at temperature 0 (batching or hardware non-determinism), replaying 500 logged requests against the same snapshot matched 95.6 percent of the time (two independent 2 percent flips); at temperature 0.7 with no seed 36.6 percent; with a fixed seed 100 percent, which holds only where the provider honours seeds. Compare behaviour through evals and tolerances, not byte equality: re-run a test 3 to 5 times and check that results stay within acceptable bounds.
- Prompts are code: keep them in the repo (or a registry), review changes, give them identifiers, render them with strict variables (my
renderraises on missing or unused variables), and test them with the regression suite (module 8); an evaluation set acts as a living specification that supports reproducibility and regression detection. Template details matter across model versions: chat templates can change between versions of the same model, and a stale template causes hard-to-find bugs. - Pin each run to its release. If a new prompt goes live while 200 runs are mid-flight at step 3 of 6, all 200 unpinned runs mixed two versions; pinned to their starting release, none did. Store the release id in the run's journal (module 3) and let old releases stay deployable until their runs finish; do the same for queued jobs (module 2).
- Record versions per metric. Track, for example, failed tasks per model version. With release ids in traces you can chart quality, cost and latency by release and compare shadow or canary versions (Level 9 module 9).
- Ship a compliance bundle with each version: model card, datasets and eval results, published to a model registry with an updated datasheet per version (Level 10 module 10).
- Honest limits: the model is a stand-in with assumed non-determinism; no real provider, registry, tracing system or prompt management tool.