What to build
Stop hand-copying snapshot side-channel fields through the daemon capture chain. Threading the snapshot quality verdict (refactor/ios-snapshot-capture-plan) required edits at six copy sites — SnapshotData, four CaptureSnapshotResult return sites, the BackendSnapshotResult adapter, serializeSnapshotResult, and the client response mapper — and three of them were missed on the first pass, each a silent runtime drop invisible to the type checker. The same chain previously dropped warnings (found during #758 validation).
First slice, deliberately small: introduce one SnapshotCaptureAnnotations type (warnings, quality, analysis, androidSnapshot, freshness) that is created once where the interactor result enters the daemon and spread as a unit (...annotations) at every hop, so adding a future field is a one-type change. The full single-capture-object spine (one object created at the dispatch edge, layers annotate instead of re-shape) is a larger follow-up that touches public client API types — evaluate it separately after this slice proves the shape.
Acceptance criteria
Blocked by
Landing of refactor/ios-snapshot-capture-plan (stacked on #758).
What to build
Stop hand-copying snapshot side-channel fields through the daemon capture chain. Threading the snapshot quality verdict (refactor/ios-snapshot-capture-plan) required edits at six copy sites —
SnapshotData, fourCaptureSnapshotResultreturn sites, theBackendSnapshotResultadapter,serializeSnapshotResult, and the client response mapper — and three of them were missed on the first pass, each a silent runtime drop invisible to the type checker. The same chain previously droppedwarnings(found during #758 validation).First slice, deliberately small: introduce one
SnapshotCaptureAnnotationstype (warnings,quality,analysis,androidSnapshot,freshness) that is created once where the interactor result enters the daemon and spread as a unit (...annotations) at every hop, so adding a future field is a one-type change. The full single-capture-object spine (one object created at the dispatch edge, layers annotate instead of re-shape) is a larger follow-up that touches public client API types — evaluate it separately after this slice proves the shape.Acceptance criteria
serializeSnapshotResultand the client response mapper consume the bundle (or a serializer owned next to the type) instead of their own field lists.--json) is byte-identical for healthy and degraded captures.Blocked by
Landing of
refactor/ios-snapshot-capture-plan(stacked on #758).