Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

iTechGuides is reader-supported. When you buy through links on our site, we may earn an affiliate commission. As an Amazon Associate I earn from qualifying purchases. Learn more

Burr lets you inspect an agent’s tracked execution and start a new application branch from saved state at an earlier point. That is useful time-travel debugging—but it does not, by itself, prove that rerunning the branch will reproduce the same model calls, tool responses, or external effects. To make a defensible “nothing changed” claim, define what must match and capture evidence at that boundary.

What Burr time-travel debugging actually gives you

Burr models an application as actions operating on state. Its State API describes state as immutable: “It is entirely immutable, meaning that you can only create new states from old ones, not modify them in place.” In practice, state operations produce a new state rather than changing the existing state object in place. The official documentation also warns that private fields prefixed with __ are internal; modifying them outside the framework is undefined behavior, not a supported way to make a checkpoint.

Tracking adds an execution record. Burr’s tracking documentation describes information such as the step name, inputs, state at execution, timestamps, and results. Its UI is intended to help inspect the state machine and executed steps. That can help answer questions such as “Why did this LLM call fail?” and “Things went off the rails, but where?”—questions posed in the Apache Burr GPT-like multimodal chatbot example.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Persistence and initialization provide the other half of the workflow: restoring state and creating a new branch from a selected prior application, partition, and sequence ID. Burr’s examples show loading prior tracked state, then either forking or continuing an application. A fork is a way to try a different choice from an earlier point; it is not evidence that every subsequent computation is deterministic.

Restore an earlier point and create a branch

The general workflow is to identify the run and step you want, inspect the tracked record, and initialize a new application from that saved point. The exact configuration depends on the persistence or tracking backend you use; the steps below describe the workflow rather than a version-specific code recipe.

  1. Configure tracking or persistence. Retain the identifiers needed to find the run. Burr’s documentation describes an app_id, an optional partition_key, and a sequence_id. The tracking documentation describes LocalTrackingClient writing locally, by default under ~/.burr.
  2. Locate and inspect the step. In the tracker or UI, select the relevant execution record and review its step name, logged inputs, state, result, and timestamp. Confirm that the record represents the point you intend to branch from.
  3. Initialize from the chosen source. Use Burr’s initialize_from workflow with the source application and the identifiers for the selected point. The persistence documentation describes using these identifiers to restore state and fork from a prior application, partition, and sequence ID.
  4. Choose where execution resumes. Decide whether the new application should proceed at the next action or use another configured entry point. Also decide which inputs will come from recorded data and which will be recomputed or fetched again. The official RAG example distinguishes forking from continuing an existing application.
  5. Keep the branch identifiable. Use the new identifiers and persistence configuration to distinguish subsequent branch state from the source run. Check the configuration for the backend you are using rather than assuming that every tracker or persister stores branch data in the same way.

This is a restore-and-continue workflow. It does not imply that Burr automatically replays every recorded action output instead of executing the action again; decide and verify what each step in your own diagnostic run actually consumes.

Restored state is not the same as deterministic recomputation

Two different claims are easy to conflate:

  • Same state at the fork: the new branch begins from state restored from the selected saved point.
  • Same outcome when recomputed: running the branch again produces the same requests, responses, action outputs, transition path, and possibly external effects.

Burr’s persistence and tracking documentation supports the restore-and-fork workflow. It does not establish bit-for-bit deterministic re-execution of LLM calls or external effects. That is a boundary of what those documented features establish, not proof that deterministic replay is impossible. A model response can differ across calls; tools and network services can return changed data; and actions can depend on time, randomness, or mutable external state. A saved application state alone does not freeze those dependencies.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

For that reason, “replay” should be qualified. It might mean restoring a checkpoint and rerunning actions, replaying a transition path with recorded outputs, or reproducing the full observable behavior of a run. Those have different requirements. State restoration is useful in all three cases, but only the latter claims require evidence about the computations and effects beyond the saved state.

Define what “nothing changed” means

Before comparing an original run with a fork, choose the boundary of the claim. A matching final state does not necessarily mean that intermediate outputs matched; matching model responses does not establish that a payment, email, or other external action occurred exactly once. The comparison should name the artifact being checked and the equality rule applied to it.

Claim being tested What to compare What that comparison does not establish on its own
State was restored at the fork The serialized state at the selected checkpoint, using a defined serialization and equality rule That later actions or external dependencies will produce the same results
The action path matched The ordered action or transition sequence and any relevant branch decisions That each action received the same inputs or returned the same output
The model interaction matched The model request, relevant configuration, and response for each call That tools, network dependencies, or side effects matched
Tool computations matched Recorded tool inputs and outputs, with a defined comparison rule That the tool would return the same result if called against a changing service again
External behavior matched The specific external effects under test, using evidence from the system that owns each effect Anything outside the effects and observations included in the test

These are engineering comparison axes, not a Burr feature checklist. For each claim, retain the original and fork’s relevant artifacts, state whether inputs and outputs were recorded or called again, and specify how differences such as timestamps, identifiers, ordering, or floating-point values are treated. Without that definition, “same” is too vague to verify.

Design a replay test that can support its conclusion

A useful diagnostic separates restoration from recomputation. First establish that the selected checkpoint is the one the fork loaded. Then run a deliberately bounded test and record the evidence required for the particular equality claim. If the test calls a live model or service, describe it as a fresh recomputation, not as a replay of the original response.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
  • For checkpoint fidelity: capture the source checkpoint and the fork’s initial state in a comparable serialized form. State what is excluded or normalized before comparison.
  • For action-level reproducibility: record the action sequence and inputs, outputs, and relevant configuration at each step. Distinguish values loaded from the original run from values obtained during the new run.
  • For model-call reproducibility: preserve the request and response artifacts needed for the comparison. If the model is called again, compare the new response with the stored response under a stated criterion; do not assume a matching request guarantees a matching response.
  • For tool or network behavior: record the tool’s inputs and returned data, and note whether the diagnostic used a recorded result, a stub, a controlled test service, or a live dependency.
  • For side effects: avoid repeating non-idempotent operations during diagnostics. Use an isolated environment, a safe substitute, or an explicit idempotency strategy where appropriate, and verify effects with the system that owns them.
  • For the conclusion: report exactly which artifacts matched, what equality rule was used, and which dependencies or effects were not tested. Do not turn a successful state comparison into a broader claim about the whole agent run.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Choose a replay strategy that matches the question

There is no single meaning of replay. The right approach depends on whether you want to inspect a checkpoint, test code with fixed inputs, or reproduce interactions with live dependencies.

Strategy What happens after the checkpoint Best suited to Main limitation
Restore and recompute Restore saved state, then execute actions and call their dependencies again Finding whether current code or a fresh dependency response changes the outcome Fresh model, tool, or network results may differ from the original run
Restore and supply recorded inputs or outputs Restore state and feed selected recorded values to downstream steps rather than making the original calls again Isolating downstream logic from model or service variability The result says little about what a fresh live call would return; records must contain the values needed
Restore and run against controlled substitutes Restore state and route selected dependencies or effects to stubs, fakes, or isolated systems Testing action logic while limiting live calls and unsafe effects The substitute may not capture every behavior of the real dependency

These strategies are general engineering options, not documented modes or guarantees attributed to Burr. Burr supplies the tracking and state-restore/fork foundation described above; the developer still chooses what is rerun, substituted, or compared.

Persistence and tracking caveats

Burr’s tracking documentation describes local tracking and a server intended to visualize the state machine and executed steps. Its persistence documentation describes database and custom persister options and cautions that tracker-based reload is not recommended for production use. Treat tracking for inspection and production persistence as distinct choices, and check the documentation for the Burr version and backend you deploy because defaults and supported options can change.

Do not build a checkpoint by altering private state internals. Use the documented state and persistence interfaces, and verify that the chosen backend retains the records and identifiers your debugging workflow depends on.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

What a defensible result sounds like

A precise report might say: “The fork restored the selected checkpoint’s serialized state under the stated comparison rule. The action path and recorded tool outputs matched in this run; the model was called again, and its response differed. No live non-idempotent side effects were repeated.” That reports the scope and evidence without claiming more than the test establishes.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.