Problem
RecordingCorrelationScanner.ScanStep documents itself as walking "every JSON-bearing surface of one step", but it misses one: the interpretations.
public static void ScanStep(BowireRecordingStep step, CorrelationLeafVisitor onLeaf)
{
if (step is null) return;
ScanLeaves(step.Body, onLeaf);
foreach (var message in step.Messages) ScanLeaves(message, onLeaf);
ScanLeaves(step.Response, onLeaf);
if (step.SentMessages is not null)
foreach (var frame in step.SentMessages) ScanFrame(frame, onLeaf);
if (step.ReceivedMessages is not null)
foreach (var frame in step.ReceivedMessages) ScanFrame(frame, onLeaf);
}
BowireRecordingStep.Interpretations and BowireRecordingFrame.Interpretations are both IList<RecordedInterpretation>?, and RecordedInterpretation.Payload is a JsonElement — a real JSON surface with real leaves, produced by the frame-semantics framework and carried verbatim through save/load. ScanFrame walks frame.Body and frame.Data but not frame.Interpretations.
Why it matters
An interpretation payload is where a semantic widget's data lives — a coordinate pair, a decoded identifier, a resolved entity reference. If a recording carries a correlation key only inside an interpretation payload, the correlated timeline cannot see it, and the step stays dark for no reason the user can observe.
Scope note
Found while shipping #545. It changes nothing for the harbor recording, which carries no interpretations, so it is not a regression in the timeline that ships today — it is a surface the scanner claims to cover and does not.
Acceptance
ScanStep walks step.Interpretations[].Payload, ScanFrame walks frame.Interpretations[].Payload, and a test builds a recording whose only shared identifier lives in an interpretation payload and asserts the two steps correlate.
Problem
RecordingCorrelationScanner.ScanStepdocuments itself as walking "every JSON-bearing surface of one step", but it misses one: the interpretations.BowireRecordingStep.InterpretationsandBowireRecordingFrame.Interpretationsare bothIList<RecordedInterpretation>?, andRecordedInterpretation.Payloadis aJsonElement— a real JSON surface with real leaves, produced by the frame-semantics framework and carried verbatim through save/load.ScanFramewalksframe.Bodyandframe.Databut notframe.Interpretations.Why it matters
An interpretation payload is where a semantic widget's data lives — a coordinate pair, a decoded identifier, a resolved entity reference. If a recording carries a correlation key only inside an interpretation payload, the correlated timeline cannot see it, and the step stays dark for no reason the user can observe.
Scope note
Found while shipping #545. It changes nothing for the harbor recording, which carries no interpretations, so it is not a regression in the timeline that ships today — it is a surface the scanner claims to cover and does not.
Acceptance
ScanStepwalksstep.Interpretations[].Payload,ScanFramewalksframe.Interpretations[].Payload, and a test builds a recording whose only shared identifier lives in an interpretation payload and asserts the two steps correlate.