Skip to content

Capture manifest

calibrex capture inspect creates a schema-versioned, ROS-independent inventory for a recording or a directory of files:

calibrex capture inspect recording --type rosbag2 \
  --capture-id drive-001 --session-id session-001 \
  --vehicle-id car-07 --sensor-kit-id kit-2026 \
  --sensor lidar-front:lidar:SN123:VLP-16:5.0:mount-front:lidar_front \
  --output capture-manifest.yaml

The artifact records source SHA-256 and size, storage/index/CRC evidence, message/topic or file streams, timestamps and rate, duplicate/out-of-order counts, frame and clock bindings, physical sensor identity, and the command, tool, configuration, source digests, and git revision used to produce it. artifact_sha256 is a canonical self-digest; calibrex validate verifies it. Provenance source_sha256 keys are stable source_id values and every digest is a full lowercase SHA-256 hex string.

Self-digest validation and input validation are intentionally separate:

# Portable check: validates schema and artifact_sha256 only.
calibrex validate capture-manifest.yaml --kind capture-manifest

# Production check: also re-hashes source/config paths relative to the
# manifest's directory and fails on missing, unknown, or changed inputs.
calibrex capture verify capture-manifest.yaml --json
calibrex validate capture-manifest.yaml --kind capture-manifest --verify-inputs

capture verify emits a typed slac.capture_manifest.verification/v0.1 report. A copied manifest can therefore still be loaded for portability, but it must not be adopted until the production verification report is valid.

Unknown is represented explicitly. For example, an MCAP fast-write file may omit the optional Summary/Index section or encode a zero (unavailable) CRC. capture inspect --type mcap --json now records bounded framing, Header, DataEnd, Footer, schema/channel/message-link, Summary/Index, and directly verifiable CRC evidence in sources[].mcap_integrity. Missing optional Summary/Index or unavailable CRC fields remain unknown and produce a warning; malformed framing, dangling links, and CRC mismatches block intake. Compressed chunks whose codec is recognised but not available for this scan remain unknown, while an unrecognised codec is explicitly unsupported and blocking. The wire-level rules are defined by the official MCAP format specification, including the optional Summary/Index sections and DataEnd/Footer CRC fields. For rosbag2, metadata alone does not prove storage index or container CRC verification, so those fields remain unknown; an adapter only marks QoS fields known when the storage metadata exposes named values. Vendor-specific or malformed message types without a decoder are retained as unsupported or unknown streams; required streams cannot make a capture ready until an adapter is available. The built-in ROS 1 (sensor_msgs/Image, sensor_msgs/CameraInfo) and ROS 2 CDR (sensor_msgs/msg/Image, sensor_msgs/msg/CameraInfo) adapters validate dimensions, encoding/stride/data lengths, CDR alignment, matrix finiteness, and ROI bounds. Inventory runs use include_data=false, so image pixels are validated without retaining a second full image buffer. A ROS-valid uncalibrated CameraInfo (for example K[0] == 0) is retained as decoded evidence but receives calibration_status: uncalibrated and blocks a required-camera readiness decision until usable intrinsics are supplied. The standard radar_msgs RadarScan adapter is documented in the RadarScan adapter reference; it records bounded return-count, range, angular, Doppler, duplicate, and frame evidence and blocks weak required radar diversity.

The default strict readiness profile treats every discovered stream as required and fails closed. For recordings containing debug topics, use the declared profile and record the policy explicitly:

calibrex capture inspect recording --type rosbag2 \
  --readiness-profile declared \
  --required-stream /points --optional-stream /debug/diagnostics \
  --required-kind camera_info

Non-required, non-critical topics are non-gating under this profile. Any discovered Image, CameraInfo, or Radar topic must nevertheless be declared required or explicitly optional; it cannot be silently ignored. Duplicate IDs, dangling sensor/stream references, inconsistent timestamps/rates, and ambiguous alias spellings are rejected before an artifact is emitted.

The identity fields are intentionally required for a ready intake decision. Use --json for machine-readable output or calibrex schema capture-manifest for the public JSON Schema. Use calibrex schema capture-manifest-verification for the verification report schema. Existing calibrex inspect commands and the legacy slac.dataset_manifest/v0.1 remain unchanged.