InkkOops
Recording and diagnostics
This page explains what the recorder captures, how replay is generated from a recording, what the runtime writes into an artifact bundle, and how to interpret those artifacts when diagnosing a real issue.
What recording captures
A recording is a structured action log, not a video. The recorder observes runtime interaction and captures:
- Window resize events
- Pointer movement
- Primary pointer press and release
- Wheel movement
- Frame waits inserted between observed changes
Start a recording
dotnet run --project InkkSlinger.csproj -- --inkkoops-record
dotnet run --project InkkOops.Cli/InkkOops.Cli.csproj -- record --launch
Use the app normally and close it normally when finished. The recording bundle is written under the configured recording root, which defaults to artifacts/inkkoops-recordings in this repository.
Recording bundle layout
recording.jsonis the structured replay source.
The JSON file is what the runtime replays.
Replay conversion
Replay loads recording.json directly and replays the recorded actions. In this repository's default host profile, the replay postamble appends:
WaitForIdle(InkkOopsIdlePolicy.DiagnosticsStable)CaptureFrame("<recording-name>-final")DumpTelemetry("<recording-name>-final")
Replay examples
Replay with default artifact location:
dotnet run --project InkkSlinger.csproj -- --inkkoops-recording ".\artifacts\inkkoops-recordings\20260328-120250760-recorded-session\recording.json"
Replay with custom artifact location:
dotnet run --project InkkSlinger.csproj -- `
--inkkoops-recording ".\artifacts\inkkoops-recordings\20260328-120250760-recorded-session\recording.json" `
--inkkoops-artifacts "artifacts/inkkoops-replay-manual"
Run artifact bundle
result.json: overall run result, command count, failure metadata, durationcommands.log: execution timeline*.png: frame captures*.txt: telemetry dumps
How to read diagnostics
result.json
Read this first. It tells you whether the run completed, how long it took, and which command failed if the run aborted.
commands.log
Use this for the linear timeline of what actually ran.
Frame capture
The final frame answers what the user actually saw.
Telemetry dump
The final telemetry dump answers what the framework believed was on screen, including the visual tree snapshot and rendering-related diagnostics.
Failure categories
UnresolvedAmbiguousUnrealizedOffscreenClippedDisabledNotInteractiveSemanticProviderMissingUiThreadViolationTimeout
Practical debugging flow
- Record the human repro if the issue is hard to reproduce deterministically.
- Replay the recording and confirm that the run completed.
- Open the final frame capture to confirm the visible end state.
- Open the telemetry dump to inspect the structural end state.
- If the run failed, inspect
result.jsonfirst for the failure category and failed command metadata. - Reduce the recording to a focused built-in script if the replay is useful but too long for rapid iteration.
Replay from code
using System.Diagnostics;
var startInfo = new ProcessStartInfo
{
FileName = "dotnet",
WorkingDirectory = Environment.CurrentDirectory,
UseShellExecute = false
};
startInfo.ArgumentList.Add("run");
startInfo.ArgumentList.Add("--project");
startInfo.ArgumentList.Add("InkkSlinger.csproj");
startInfo.ArgumentList.Add("--");
startInfo.ArgumentList.Add("--inkkoops-recording");
startInfo.ArgumentList.Add(@".\artifacts\inkkoops-recordings\20260328-120250760-recorded-session\recording.json");
startInfo.ArgumentList.Add("--inkkoops-artifacts");
startInfo.ArgumentList.Add("artifacts/inkkoops-replay-manual");
using var process = Process.Start(startInfo)!;
process.WaitForExit();