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.intrinsics → ClipExtraction → AchievedFrames |
| Attitude and gravity | ✅ MotionMetadataSourcestarted and its segments pumped |
| Exposure and ISO per frame | ✅ ISO was carried; exposure was a hardcoded 0 and is now measured |
| Thermal timeline | ✅ ThermalTimelinestarted, 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 continuousmetadata 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
Epic:E1 — Clip capture
Release: v1 · Layer: Platform · Blocked on: phone (the conformance run only — see below)
Status — filled 24 Aug (
8a371c3), conformance run outstandingCapturedFragment.intrinsics→ClipExtraction→AchievedFramesMotionMetadataSourcestarted and its segments pumped0and is now measuredThermalTimelinestarted, clipped to each Capture's intervalmake conform⚠ Where "attitude and gravity" actually live
This issue lists them beside intrinsics, which reads as though they belong in the sidecar. They do not —
PpcpAchievedFrameshas no such field, and §5.11's table puts them on thecontinuousmetadataStream. So this level was two jobs: fillingAchievedFrames, and starting a Stream that had been opened and left empty.What was actually wrong
⛔ Intrinsics were collected and discarded.
FrameTimelineobserved a matrix per frame anddrain()returned them;CapturedFragmenthad no field to hold one, soRingBufferRecorder.capture()rebuilt the batch withintrinsics: []one line before the builder that wanted them. Nothing failed — the field was simply always absent.⛔
MotionMetadataSourceandThermalTimelinehad 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 inHostlessRecordingSession. 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 onlockedExposureNs, where nothing read it.A defect found while building this
⛔
CaptureBuilderlength-checkedisoand notintrinsics. Latent while intrinsics were alwaysnil; a 5.8f violation the moment they were filled, because a per-frame series shorter thanframes.nsis 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 conformunblocks 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
enumerateCapabilitythrows without a physical camera, so the declaration cannot be built andppcp-conformcannot 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