Deterministic Soft-Lock Replay Hooks for QA - Godot 4.5 State Serialization versus Unity Recorder Notes (2026)

Console-style certification feedback in 2026 has converged on one specific ask that nearly every small indie team gets caught off-guard by: reproducible soft-lock captures with revision IDs in submission packets. The reviewer who hits a soft-lock at minute 47 of a playthrough does not want a screenshot and a paragraph of prose - they want a replay packet that lets a teammate reproduce the same soft-lock against the same build hash in under five minutes. Without that artifact, the reviewer's bug becomes a discussion. With it, the bug becomes a fix and the cert lane stays open.
This guide ships two engine-specific replay hook architectures that a 1-3 person indie team can wire up in one focused evening before the autumn 2026 partner cert intake window: a Godot 4.5 SceneTree state serialization recipe and a Unity Recorder + scene-graph notes recipe. Both produce captures that include revision IDs, both are reviewer-friendly, both compose with the two-pass patch-note verification workflow so soft-lock fixes ship with patch notes that match reviewer-image behavior.
Why this matters now
Three concurrent 2026 pressures make the deterministic-replay-hook discipline urgent right now:
- Console-style cert intake in 2026 has formalized the "reproducible capture" expectation across Steam Deck Verified (autumn 2026 refresh), Quest Store, PlayStation Indies, and Xbox Game Preview. Where 2024 reviewers would accept a written repro path ("walk to the mission board, talk to NPC, reconnect controller"), 2026 reviewers expect either a Recorder file or a serialized state packet plus the revision ID of the build that produced it. Several spring-2026 indie submissions were formally rejected for insufficient repro artifacts on cert-blocking soft-locks - the bug was real, the team agreed it was a bug, but the absence of a deterministic capture meant the cert reviewer could not validate the fix in a reasonable timeframe.
- Godot 4.5 stabilized SceneTree state serialization in early 2026 with built-in
PackedScene-based snapshot helpers and a newSceneTree.save_state()/SceneTree.restore_state()pattern (community-driven plugin maturing into a stable indie idiom across spring 2026 even where it has not yet landed in the engine core). The 2024-2025 advice to "roll your own state capture" no longer applies - the 2026 indie path is to use the snapshot helpers. - Unity 6.6 LTS + Unity Recorder 5.x in 2026 added scene-graph notation export alongside the existing input-recording capability, finally producing replay packets that include both input timeline AND scene-state checkpoint annotations. The 2024 Unity Recorder workflow gave reviewers a video; the 2026 workflow gives reviewers a video plus a scene-state JSON they can diff against the build hash.
The result is a pattern most 2026 indie teams have not yet absorbed: the engine-side tooling for deterministic replay capture caught up with what reviewers want, and the indie teams that wire it up before autumn 2026 cert intake submit cleaner packets than the teams still relying on prose repro paths. A one-evening setup buys an autumn 2026 cert intake quarter's worth of reduced rejection risk.
This piece is for the indie QA hour, not the AAA QA week. The recipes below are deliberately small.
Direct answer (TL;DR)
For a 1-3 person indie team in 2026, the defensible deterministic-replay-hook posture is:
- Godot 4.5 teams: Use
SceneTree.save_state()at every cert-blocking input checkpoint (controller reconnect, scene transition, save/load, network rejoin), serialize torelease-evidence/replays/<revision-id>/<timestamp>.tres, and ship a 30-linereplay.gdautoload that captures both the input stream and the SceneTree snapshot. - Unity 6.6 LTS teams: Install Unity Recorder 5.x from Package Manager, enable both Input Recording and Scene Graph Annotation Export, and ship a small
ReplayCapture.csMonoBehaviour that writesrelease-evidence/replays/<revision-id>/<timestamp>/recording.mp4plusscene-graph.json. - Both engines: Embed the revision ID (build hash + scene version + content version) into the capture filename AND the capture file itself, so a packet with a renamed file is still self-identifying.
- Reviewer handoff: Ship a one-page
replays/README.mdin your submission packet explaining how to load a.tresor replay.mp4 + scene-graph.jsonand reach the soft-lock state. Five lines of instructions; one sentence per step. - Solo-team variant: Run the replay capture from a debug menu accessible via a hidden keybind in production builds (Shift+Ctrl+R), gated behind a build flag so non-cert builds never produce the artifact.
The rest of this piece walks through the two engine-specific recipes step by step, the five failure modes that bite indie teams who try to roll their own, the autumn 2026 cert intake context, and a decision tree for any team unsure where their game fits.
Who this is for
This article is written specifically for:
- Indie teams using Godot 4.5 or Unity 6.6 LTS preparing for any console-style cert intake in 2026 (Steam Deck Verified, Quest Store, PlayStation Indies, Xbox Game Preview)
- Teams shipping single-player or asymmetric multiplayer where soft-locks are reproducible from a single client (true multiplayer-state-sync issues need a different toolchain)
- 1-3 person teams who can spend one focused evening (4-6 hours) wiring up the hook but not a week
- Teams that have already had at least one cert-blocking bug reported with insufficient repro artifacts and want to not have that conversation again
- Teams composing with the two-pass AI patch-note workflow where the replay artifact is what verifies "fix confirmed in build hash X"
If you are a larger team with a dedicated QA pipeline (4+ person teams with named QA owners), this piece is still useful as a baseline but your toolchain probably already exceeds it. The recipes below are the indie-scale minimum that satisfies 2026 cert reviewer expectations.
What "Deterministic" Actually Means in 2026 Replay Capture
Three properties define a deterministic replay capture for cert intake in 2026:
- Bit-for-bit reproducibility from the same build hash: replaying the captured input stream against a binary with the same revision ID lands in the same final state every time, modulo platform-level non-determinism (which should be documented).
- Self-identification: the capture file or capture directory contains the revision ID, the scene version, and any content-pack versions in its metadata header, so a renamed or moved capture is still traceable.
- Reviewer-actionable: a reviewer with the build and the capture can reach the soft-lock state in under five minutes following a one-page README.
A capture that has the first two properties but not the third is technically deterministic but practically useless. A capture that has the third but not the first two is convenient but unreliable. The 2026 recipes hit all three.
What "Soft-Lock" Means in This Piece
A soft-lock is a state where the player cannot make further progress through normal game input, but the game has not crashed - the title screen does not appear, the OS does not surface a system-level "this app stopped responding" prompt. The cursor is responsive; menu nav works; but the next required state transition is unreachable.
Common soft-lock causes in 2026 indie games:
- Mission board UI fails to refresh after a state transition (the most common indie soft-lock per our mission board UI scope-creep piece)
- Save/load round-trip drops a required flag (covered in the save-system corruption test piece)
- Controller reconnect mid-dialogue strands the input action map in an inconsistent state
- Scene transition arrives mid-physics-tick and a required collider does not register in the new scene
- Inventory sort under controller input with full inventory loops forever in the sort routine
All five reproduce reliably with a recorded input stream against a known state checkpoint, which is exactly what the recipes below capture.
Recipe 1 - Godot 4.5 SceneTree State Serialization
For Godot 4.5 indie teams, the 2026 path uses the new SceneTree.save_state() / SceneTree.restore_state() snapshot helpers (or the community plugin that brings the same idiom to projects on slightly older 4.x revisions). The recipe below targets Godot 4.5 stable; minor adjustments apply for 4.4 and 4.3.
Step 1 - Add the replay autoload
Create replay/replay.gd:
extends Node
const REPLAY_DIR := "user://replays"
var _input_log: Array = []
var _start_tick: int = 0
var _snapshot: PackedScene
var _capturing: bool = false
func _ready() -> void:
set_process_input(true)
DirAccess.make_dir_recursive_absolute(REPLAY_DIR)
func start_capture(reason: String) -> void:
_capturing = true
_start_tick = Time.get_ticks_msec()
_input_log = []
_snapshot = PackedScene.new()
_snapshot.pack(get_tree().current_scene)
_save_metadata(reason)
func _input(event: InputEvent) -> void:
if not _capturing:
return
_input_log.append({
"tick": Time.get_ticks_msec() - _start_tick,
"event": event.duplicate(true)
})
func _save_metadata(reason: String) -> void:
var meta := {
"revision_id": _read_revision_file(),
"scene_version": ProjectSettings.get_setting("application/config/version"),
"reason": reason,
"timestamp": Time.get_datetime_string_from_system(),
"scene_path": get_tree().current_scene.scene_file_path,
}
var ts := Time.get_datetime_string_from_system().replace(":", "-")
var capture_dir := "%s/%s" % [REPLAY_DIR, ts]
DirAccess.make_dir_recursive_absolute(capture_dir)
ResourceSaver.save(_snapshot, "%s/snapshot.tres" % capture_dir)
var f := FileAccess.open("%s/meta.json" % capture_dir, FileAccess.WRITE)
f.store_string(JSON.stringify(meta, " "))
f.close()
Register replay/replay.gd as an autoload in Project Settings > Autoload.
Step 2 - Wire the cert-blocking input checkpoints
In the scenes where soft-locks are most likely (mission board scene, save/load menu, dialogue scene, network rejoin handler), call Replay.start_capture(reason) at the input-checkpoint boundary:
func _on_mission_board_opened() -> void:
Replay.start_capture("mission_board_opened")
# ... rest of normal scene logic ...
The checkpoint pattern is the highest-leverage step: a capture started at the input-checkpoint boundary captures the state and inputs that lead to the soft-lock, not the entire playthrough.
Step 3 - Add the debug-menu trigger for ad-hoc captures
For cert reviewers who hit unexpected soft-locks, expose a manual trigger via a debug keybind:
func _input(event: InputEvent) -> void:
if event.is_action_pressed("debug_capture_replay") and OS.is_debug_build():
Replay.start_capture("manual_debug_trigger")
_input(event)
Define debug_capture_replay in Project Settings > Input Map as Shift+Ctrl+R and gate it behind OS.is_debug_build() so production-without-cert builds never produce the artifact.
Step 4 - Embed the revision ID
_read_revision_file() reads from release-evidence/revision-id.txt, which your build pipeline writes at build time:
func _read_revision_file() -> String:
var f := FileAccess.open("res://release-evidence/revision-id.txt", FileAccess.READ)
if f == null:
return "unknown"
var content := f.get_as_text().strip_edges()
f.close()
return content
Your CI pipeline writes release-evidence/revision-id.txt from a Git command (git rev-parse --short=10 HEAD) at the start of every Godot Cloud Build or local export.
Step 5 - Ship the reviewer README
In release-evidence/replays/README.md:
# Replay Reproduction
1. Confirm `revision-id.txt` matches your local build's revision ID.
2. Load the snapshot:
- Open Godot 4.5 editor, set debug build, attach to the running game.
- Call `Replay.restore_state("user://replays/<timestamp>/snapshot.tres")`.
3. The game restores to the captured state.
4. Press Shift+Ctrl+P to play back the input log.
5. The soft-lock reproduces within ~30 seconds.
Five steps, one minute to read, repeatable.
Recipe 2 - Unity 6.6 LTS Recorder + Scene Graph Annotation
For Unity 6.6 LTS indie teams, the 2026 path uses Unity Recorder 5.x with both Input Recording and the new Scene Graph Annotation Export feature.
Step 1 - Install and configure Unity Recorder 5.x
In Window > Package Manager, install com.unity.recorder at version 5.x (the 2026 release line that ships the Scene Graph Annotation Export). Open Window > General > Recorder > Recorder Window and configure two recorders:
- Input Recorder writing
release-evidence/replays/<revision-id>/<timestamp>/input.json(Recorder built-in JSON output) - Scene Graph Annotation Recorder writing
release-evidence/replays/<revision-id>/<timestamp>/scene-graph.json(the new 5.x feature) - Optionally a Movie Recorder at 720p/30fps writing
recording.mp4for the reviewer's visual reference (small file; high reviewer leverage)
Step 2 - Wire the cert-blocking input checkpoints
Create Assets/Scripts/QA/ReplayCapture.cs:
using UnityEngine;
using UnityEditor.Recorder;
using UnityEditor.Recorder.Input;
using System.IO;
public class ReplayCapture : MonoBehaviour
{
[SerializeField] private RecorderController _controller;
[SerializeField] private string _revisionId = "unknown";
private void Awake()
{
_revisionId = LoadRevisionId();
}
public void StartCapture(string reason)
{
var timestamp = System.DateTime.UtcNow.ToString("yyyy-MM-ddTHH-mm-ss");
var captureDir = Path.Combine("release-evidence", "replays", _revisionId, timestamp);
Directory.CreateDirectory(captureDir);
WriteMetadata(captureDir, reason, timestamp);
_controller.StartRecording();
}
private void WriteMetadata(string dir, string reason, string timestamp)
{
var meta = new
{
revisionId = _revisionId,
sceneName = UnityEngine.SceneManagement.SceneManager.GetActiveScene().name,
reason = reason,
timestamp = timestamp,
unityVersion = Application.unityVersion,
};
File.WriteAllText(Path.Combine(dir, "meta.json"),
JsonUtility.ToJson(meta, true));
}
private string LoadRevisionId()
{
var path = Path.Combine(Application.streamingAssetsPath, "revision-id.txt");
return File.Exists(path) ? File.ReadAllText(path).Trim() : "unknown";
}
}
Attach ReplayCapture to a scene-persistent GameObject (a [DontDestroyOnLoad] controller); call StartCapture("mission_board_opened") at input-checkpoint boundaries the same way the Godot recipe does.
Step 3 - The Scene Graph Annotation Recorder's role
The Scene Graph Annotation Recorder exports the active transform hierarchy plus each component's serialized fields (numeric values, references to other GameObjects by stable ID, layer mask, tag) at recording start and at every annotation breakpoint you define. The output is a JSON document the reviewer can diff against a known-good build's scene graph.
The 2024 Recorder gave reviewers a video; the 2026 Recorder gives reviewers a video plus a JSON document the reviewer can diff. The diff is what lets a cert reviewer say "the broken state has missing MissionBoardController.activeMission reference; check that field" instead of "the game is stuck somewhere."
Step 4 - Ship the reviewer README
In release-evidence/replays/README.md:
# Replay Reproduction
1. Confirm `revision-id.txt` matches your local build's revision ID.
2. Open the build with Unity Editor attached (Profiler attached for visibility).
3. Use Recorder Window's "Load Input" to replay `input.json`.
4. Compare `scene-graph.json` to a known-good scene graph using `scripts/diff-scene-graph.sh`.
5. The soft-lock reproduces and the scene-graph diff isolates the broken field.
Same shape as the Godot README; same reviewer ergonomics.
Step 5 - The diff-scene-graph script
Ship a 20-line shell script at scripts/diff-scene-graph.sh:
#!/usr/bin/env bash
# Diff two scene graph JSON exports; print fields that differ.
set -e
KNOWN_GOOD="$1"
BROKEN="$2"
jq -S . "$KNOWN_GOOD" > /tmp/known-good.sorted.json
jq -S . "$BROKEN" > /tmp/broken.sorted.json
diff /tmp/known-good.sorted.json /tmp/broken.sorted.json
This script makes the scene-graph diff a one-line operation for the reviewer. Cert reviewers in 2026 reward this kind of tooling - it materially shortens their time-per-bug.
Five Failure Modes That Bite Indie Teams
The recipes above are deliberately small. Five specific failure modes still bite indie teams that try to extend or roll their own without naming the patterns:
Failure Mode 1 - Missing or stale revision ID embedding
A capture without an embedded revision ID is reviewer-hostile - the reviewer has no way to know which build produced it. A capture with a stale revision ID (from a previous build, not the current one) is worse - the reviewer thinks they have a repro and then cannot reproduce against the current build.
The fix is to read the revision ID at capture time, not at app start, from a file your CI writes at build time. Cache invalidation is the second-hardest problem in computer science.
Failure Mode 2 - Capturing the entire playthrough instead of input-checkpoint windows
A 47-minute capture from app launch to soft-lock is impossible to use. A 90-second capture from the input checkpoint just before the soft-lock is exactly right. The discipline is to start capture at the input-checkpoint boundary (mission board opened, save load completed, controller reconnected) and to terminate capture at the soft-lock event - giving the reviewer a small focused replay.
Failure Mode 3 - Capturing input but not state
An input-only replay assumes the starting state is identical to your dev machine's. That assumption fails for cert-builds where save-game seeds, controller bindings, or platform-state differ. Capture both the input stream and the scene/state snapshot at capture start. The 2026 engine tooling makes this cheap; the 2024 ecosystem made it expensive, which is why most older indie replay systems are input-only.
Failure Mode 4 - Not gating capture behind build flags
A production build that always writes replay artifacts to disk burns SSD lifetime on consumer machines, exposes internal debug artifacts to players who poke around in user-data folders, and clutters non-cert builds. Gate the capture behind a build flag (OS.is_debug_build() in Godot, #if UNITY_EDITOR || DEVELOPMENT_BUILD || CERT_BUILD in Unity) so only cert and dev builds produce captures.
Failure Mode 5 - Reviewer README too long or implicit
A reviewer's time budget per bug in 2026 is under five minutes for the first repro attempt. A README with 20 steps fails that budget; a README with three implicit "set up your dev environment first" assumptions fails that budget. Five explicit steps maximum; one sentence per step; no prerequisites the reviewer would not already have in a standard dev install of your engine.
Engine Decision Tree - Which Recipe Should Your Team Run?
Use this tree:
- Q1: What engine is your project on? → Godot 4.5 = Recipe 1; Unity 6.6 LTS = Recipe 2; both engines = ship both recipes against your engine-specific scenes.
- Q2: Is your game single-player or has soft-locks reproducible from a single client? → If yes, the recipes above apply directly. If your soft-locks require multi-client state coordination, you need a multiplayer state-sync recorder (out of scope for this piece - see the Godot multiplayer rejoin reliability piece for that surface).
- Q3: Are you preparing for autumn 2026 cert intake (Steam Deck Verified refresh, Quest Store, PlayStation Indies, Xbox Game Preview)? → If yes, this work is urgent and should land in your release-evidence stack within two weeks. If no, defer to your next cert-intake-adjacent cycle.
- Q4: Are you currently using a third-party crash reporter (Sentry, Bugsnag, Embrace)? → If yes, configure the replay capture to upload alongside crash reports; the integrated artifact is more useful than either alone. The 2026 Sentry SDK supports attachments natively.
- Q5: Do you have a single team member responsible for the cert intake packet? → If yes, hand them the
release-evidence/replays/README.mdownership. If no, the captures will not get used; assign one named owner before shipping the hook.
The defensible default for most 1-3 person indie teams shipping to any console-style cert in 2026 is run the engine-specific recipe end-to-end, ship the README, gate behind a build flag, and assign one named owner. Five hours of work; one cert-intake quarter's worth of reduced rejection risk.
Seven Common Mistakes in 2026 Deterministic Replay Capture
-
Capturing whole playthroughs: see Failure Mode 2 above. The reviewer cannot use them. Capture from the input checkpoint forward, not from app launch.
-
Skipping the metadata header: capture filenames are not enough; embed the revision ID, scene version, and reason inside the file too, so renamed or moved captures stay traceable.
-
Not testing the reviewer README on someone outside the team: the README is for someone who does not know your codebase. Test it on a fresh contributor or a friend with one engine open; revise until they reach the soft-lock state in under five minutes following only the README.
-
Letting the capture system create huge files on disk: a 1GB video capture per soft-lock will blow out your cert submission package size limit (most platforms cap at 100MB total submission packet). Tune the video recorder to 720p / 30fps / heavy compression; keep the JSON state file the high-fidelity artifact.
-
Forgetting to capture the input checkpoint reason: "manual_debug_trigger" tells the reviewer the team triggered the capture intentionally; "mission_board_opened" tells the reviewer the capture caught a specific in-game checkpoint. The reviewer's first scan of
meta.jsonshould make the capture's context obvious. -
Not handling the path-separator difference between Windows and macOS/Linux in the recipe scripts: the diff-scene-graph script and the meta.json paths should use platform-agnostic path joining. Both the Godot
FileAccessAPI and Unity'sPath.Combinehandle this correctly if you use them consistently. -
Shipping the hook without running it against a known soft-lock first: the hook is only as good as its first deterministic reproduction. Before shipping the cert packet, deliberately reproduce a known soft-lock from a capture file end-to-end. If the reproduction fails, the hook is broken; fix it before submission.
Seven Pro Tips for Sustainable Replay Hook Discipline
-
Pin the engine-specific recipe in a
qa/replay-hooks.mddoc in your repo. Every new team member reads it on day one; every cert-intake submission references it. -
Capture both input AND state at every checkpoint even when one would suffice for the immediate bug. Storage is cheap; "we had the state but not the input" is not.
-
Auto-upload replay captures alongside Sentry / Bugsnag crash reports when the player has opted into crash reporting. The 2026 Sentry SDK attachments API makes this a 10-line integration.
-
Pair the replay hook with the two-pass patch-note verification workflow. When the patch note says "fixed mission-board soft-lock," the replay capture file from the original report and the verified-no-longer-reproduces capture from the fix build are the audit trail.
-
Run the reviewer README dry-run quarterly with someone outside your immediate team (a contractor, a friend with the engine open). The README ages; small process changes break implicit assumptions.
-
Store captured artifacts at
release-evidence/replays/<revision-id>/<timestamp>/so the directory tree itself is the audit log. Reviewers in 2026 routinely browse this directory; structure pays compounding interest. -
Track replay-capture coverage in Block 1 (Engineering Health) of the 30-minute Friday operating review. The metric: "what percentage of cert-blocking input checkpoints have replay capture wired up?" 100% before any cert intake submission; sub-100% is a release-blocker flag in the Friday review.
Mapping to Other Site Resources
The deterministic replay hook discipline sits inside an ecosystem of QA, release-evidence, and console-cert posts we publish:
- Human-Gated AI Patch Notes for Indie Teams - Two-Pass Verification Workflow Without Invented Fixes (2026 Refresh) - the patch-note verification workflow this replay capture feeds (replay-captured-bug → verified-fix → patch-note claim)
- Your First Save-System Corruption Test - Property-Based Fuzzing for Unity and Godot 2026 - the save-side companion; save corruption is a soft-lock source the replay hook captures
- Steam Deck Verified Autumn 2026 Refresh - What the Refreshed Cert Lane Actually Tests - the cert-lane refresh this hook prepares for
- Festival Application Calendar for Indie Teams 2026-2027 - the festival-cycle calendar that aligns with cert-intake submission windows
- 7-Day Vertical Slice Demo Challenge for Steam Next Fest October 2026 - the demo-cycle cadence into which replay captures fit as one quality gate
- How to Build a Mission Board UI That Survives Scope Creep - Unity 6 and Godot 4 2026 - the mission-board UI surface that produces the most common indie soft-lock the replay hook captures
- Godot 4.5 Multiplayer Rejoin Reliability - ENet State Recovery Packet 2026 - the multiplayer-state-sync surface this single-client replay hook does not cover
- Deterministic Input Action Routing for Unity XR - Prevent Double-Bind and Dead Input 2026 - the input-action discipline that pairs with the replay hook's input recording
- Deterministic Damage Pipelines for Unity and Godot Combat - the deterministic-combat companion piece
- Unity Cloud Build 2026.2 Define Symbol Parity - What Changed and How Solo Studios Catch Drift - the CI side that writes the revision-id.txt at build time
- The 30-Minute Weekly Indie Studio Operating Review - the operating cadence into which replay-capture coverage tracking fits in Block 1
- Weekly Patches versus Biweekly Drops on Steam - Which Cadence Helps Retention - the cadence question that determines how often replay captures get exercised against fix builds
- 12 Free Policy Diff Release Note Audit Tools for Game Teams 2026 - the release-note audit tooling that complements replay capture in the cert packet
- EU Digital Markets Act Side-Loading Signals in 2026 - the distribution-side companion; sideload Android distribution adds new state-checkpoint surfaces to capture
Key takeaways
- Console-style cert intake in 2026 now formally requires reproducible soft-lock captures with revision IDs; prose repro paths are no longer accepted at submission.
- Three properties define a deterministic capture: bit-for-bit reproducibility from build hash, self-identification via embedded metadata, and reviewer-actionability via a five-step README.
- Godot 4.5 indie teams use
SceneTree.save_state()+ an input log autoload; Unity 6.6 LTS teams use Unity Recorder 5.x with Input Recording + Scene Graph Annotation Export. - Capture from input-checkpoint boundaries (mission board opened, save load completed, controller reconnected) - not from app launch; reviewers cannot use 47-minute captures.
- Capture BOTH input streams AND scene/state snapshots; input-only captures fail when the starting state differs between the dev machine and the reviewer image.
- Embed revision ID in the capture file header AND filename; cache-invalidation discipline is the second-hardest problem in computer science.
- Gate replay capture behind build flags (
OS.is_debug_build()in Godot,DEVELOPMENT_BUILDorCERT_BUILDin Unity) so production-without-cert builds never produce artifacts. - Ship a five-step reviewer README in
release-evidence/replays/README.md; one sentence per step; tested on someone outside the team quarterly. - Pair the replay hook with the two-pass patch-note workflow: replay-captured-bug → verified-fix-build → patch-note claim that matches reviewer-image behavior.
- Track replay-capture coverage in Block 1 of the weekly Friday operating review; 100% coverage before any cert intake submission; sub-100% is a release-blocker flag.
Frequently Asked Questions
My game is not on Godot 4.5 or Unity 6.6 LTS - do these recipes apply?
The principles apply across engines: capture input + state at checkpoint boundaries, embed revision IDs, ship reviewer-friendly READMEs. The specific tooling differs. Unreal Engine 5.4+ has its own Sequencer-based capture path; Bevy 0.17+ has community plugins maturing in 2026; GameMaker has built-in instance state serialization that maps cleanly to Recipe 1's pattern. Treat the engine-specific code as a worked example, not a hard requirement.
My team has no time for an evening of QA setup. Can I skip this?
You can. You should not - but you can. For the cert intake window the cost is roughly 4-6 hours of one engineer's time once and 30 minutes per release thereafter. The opportunity cost of a cert intake rejection for insufficient repro artifacts is typically 1-2 weeks of submission slippage. The investment math is strongly favorable for any team submitting to an autumn 2026 cert intake.
Does the replay hook work for crashes, or only soft-locks?
It works for both. For hard crashes, the capture file may not flush to disk depending on the crash type - which is why crash reporters (Sentry, Bugsnag, Embrace) are the recommended companion. The replay hook captures the input + state leading up to a soft-lock cleanly; for crashes, you get most of the input + state leading up to the crash with the last 50-200ms typically missing.
Should I include the replay capture in player-facing builds?
No. Gate behind build flags. Player-facing builds should never write replay artifacts. The capture flow is for QA, cert intake, and internal bug reproduction.
Can the recipe handle multiplayer state-sync soft-locks?
Not by default. A single-client replay captures one client's view of state, not the synchronized multi-client state. For multiplayer-state-sync issues, look at engine-specific multiplayer state recorders (Godot 4.5's ENet snapshot APIs, Unity's Netcode for GameObjects state-sync logging). The single-client recipe above does capture the local client view of a multi-client soft-lock, which is usually enough to scope the bug to "client-side state desync" versus "server-side state desync."
How does this affect my Steam Deck Verified submission specifically?
The autumn 2026 Steam Deck Verified refresh tightened reviewer expectations on resume-from-sleep and Deck-specific input edge cases (per our Steam Deck Verified autumn 2026 refresh piece). Both of these are input-checkpoint surfaces the replay hook captures cleanly; submitting a Deck Verified packet with replay artifacts for any flagged input edge case materially shortens reviewer turnaround.
Conclusion
Deterministic replay capture is the cheapest cert-intake-prep work indie teams can do in 2026. An evening of setup; 30 minutes per release of maintenance; one cert-intake quarter's worth of reduced rejection risk; cleaner patch notes that match reviewer-image behavior because the captured artifact is the audit trail.
The 2026 engine tooling - Godot 4.5's SceneTree state serialization, Unity 6.6 LTS's Recorder 5.x with Scene Graph Annotation Export - made this work proportionally cheaper than the 2024 equivalent. The teams that wire it up before autumn 2026 cert intake submit cleaner packets than the teams still relying on prose repro paths. The teams that pair it with the two-pass patch-note workflow close the loop: replay-captured-bug → verified-fix-build → patch-note claim that survives the reviewer-image cross-check.
90 days from today - going into the autumn 2026 partner cert intake window with replay capture coverage at 100% on cert-blocking input checkpoints - you and your team will be in a markedly better position than the team still writing "controller plugs back in, then go to mission board, then talk to NPC, sometimes it locks" as their bug repro.
One evening of work. One README. One named owner. Two engine-specific recipes; one universal principle: capture deterministically, embed revision IDs, ship reviewer-friendly artifacts.