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.json is 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, duration
  • commands.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

  • Unresolved
  • Ambiguous
  • Unrealized
  • Offscreen
  • Clipped
  • Disabled
  • NotInteractive
  • SemanticProviderMissing
  • UiThreadViolation
  • Timeout

Practical debugging flow

  1. Record the human repro if the issue is hard to reproduce deterministically.
  2. Replay the recording and confirm that the run completed.
  3. Open the final frame capture to confirm the visible end state.
  4. Open the telemetry dump to inspect the structural end state.
  5. If the run failed, inspect result.json first for the failure category and failed command metadata.
  6. 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();