Skip to content

E1.3 — A clip that is self-describing #19

Description

@liversedge

Epic: E1 — Clip capture
Release: v1 · Layer: Platform · Blocked on: phone (the conformance run only — see below)

The sidecar carries everything REQ-CLIP-1 lists.

Status — filled 24 Aug (8a371c3), conformance run outstanding

Component State
Per-frame timestamps ✅ was already carried
Intrinsics CapturedFragment.intrinsicsClipExtractionAchievedFrames
Attitude and gravity MotionMetadataSource started and its segments pumped
Exposure and ISO per frame ✅ ISO was carried; exposure was a hardcoded 0 and is now measured
Thermal timeline ThermalTimeline started, clipped to each Capture's interval
Achieved frames, stream coverage, gaps ✅ already built; now reached
On-device make conform ⛔ needs the phone

⚠ Where "attitude and gravity" actually live

This issue lists them beside intrinsics, which reads as though they belong in the sidecar. They do not — PpcpAchievedFrames has no such field, and §5.11's table puts them on the continuous metadata Stream. So this level was two jobs: filling AchievedFrames, and starting a Stream that had been opened and left empty.

What was actually wrong

Intrinsics were collected and discarded. FrameTimeline observed a matrix per frame and drain() returned them; CapturedFragment had no field to hold one, so RingBufferRecorder.capture() rebuilt the batch with intrinsics: [] one line before the builder that wanted them. Nothing failed — the field was simply always absent.

MotionMetadataSource and ThermalTimeline had no caller anywhere in the tree. Written since D4, complete, tested, never started. Three of REQ-CLIP-1's items were unwired rather than unfilled.

Exposure was .lockedConstant(0), hardcoded in HostlessRecordingSession. 5.8d makes it mandatory on a camera Capture with frames precisely because I17's canonical-instant conversion needs it, and converting by zero converts by the wrong amount. E1.1 had already put the measured value on lockedExposureNs, where nothing read it.

A defect found while building this

CaptureBuilder length-checked iso and not intrinsics. Latent while intrinsics were always nil; a 5.8f violation the moment they were filled, because a per-frame series shorter than frames.ns is a claim about frames it does not describe. Refused outright now rather than sent short — with the constant form exempt, since one matrix is not a series and has no length to match. ⚠ Found because a comment I had written in a test asserted the check existed and it did not.

The rest of REQ-CLIP-1, and where it already lives

Detected event times and confidences travel on Candidates; the acoustic ToF constant is tof_correction; the capability triple, calibration state and lens identity are the declaration's. All present. Clock-sync residuals are the exception — that is E3.2, and there is no live link to measure against yet.

Exit criterion

On-device make conform unblocks CT-S7 (4), CT-S1 (1–5), CT-I30's third assertion and IOP-2's second half.

Not met. The data is carried and tested on synthetic frames; the conformance run is not done. CT-S7 (4) is recorded in the claim as blocked on a phone because enumerateCapability throws without a physical camera, so the declaration cannot be built and ppcp-conform cannot drive it.

Requirements

REQ-CLIP-1, REQ-CAP-3, REQ-FPS-3, REQ-META-1


Scope: delivery-scope.md · Requirements: traceability.md · PRD: capture-companion-requirements.md · Conformance: ppcp-conformance.md

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    blocked-on: phoneNeeds a physical device to provelayer: platformSources/Platform — the only place platform types liverelease: v1PRD §10.1

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions