Skip to content

feat(recordings): consolidate offline CDR converter and fidelity audit - #4735

Draft
TomCC7 wants to merge 7 commits into
cc/feat/cdr-unit-robotsfrom
cc/feat/cdr-unit-converter
Draft

TomCC7 wants to merge 7 commits into
cc/feat/cdr-unit-robotsfrom
cc/feat/cdr-unit-converter

Conversation

@TomCC7

@TomCC7 TomCC7 commented Oct 20, 2026 •

Copy link
Copy Markdown
Member

What this adds

Add offline dimos mem convert commands for local MCAP and SQLite recordings. Conversion preserves timestamps and supported fields, writes a fidelity report and never overwrites the source or an existing destination.

Base: #4738. The converter uses the standard MCAP writer and an explicit historical decode boundary.

How to test

Start with dimos mem convert OLD NEW --dry-run. Follow the conversion guide for formats and expected output.

All 35 local conversion tests passed again after restacking. Repository hooks passed on the cleaned stack tip. Installed-wheel tests were not rerun. Unsupported formats and pickle inputs remain blocked.

Review report: file map, scope and verification

CDR dependencies and TF conventions

The stack consumes published dimos-cdrgen 0.1.2 and the immutable CDR library fix. SDK #4774 now uses standard ROS TFMessage, TransformStamped and integer Time, with no per-driver TF codec callbacks or parallel public transform type. The external transforms library, validated by its complete std/no_std/serde and ARM verification gate, owns the frame tree, common-time lookup, interpolation and static history. Its atomic batch patch is pinned to 5ae9563de0c02638c04e393aadfad28444a4398e.

Combined-stack local validation: SDK 121, macros 22, mapper 101, MLS 135, local planner 91, follower 63, V4L2 6 and depth2depth 12 Rust tests; all 24 native/DimSim/port-contract acceptance tests pass without skips. The mapper exchange includes Python CDR tf_static input; the follower exchange covers drive, arrival, a new goal and empty-path stop. Missing native binaries fail the dedicated job. RealSense passes cargo check --all-targets --features docs-only; device linking and hardware execution were not tested. Seven real source-staging layouts pass locked Cargo resolution. Native acceptance for tip cc463c163aed465f7c1d6808165bf640820b0182: workflow run. These are combined-tip results, with the SDK additionally tested standalone at its own layer.

Native Nix inputs use verified source archive f7723ad4d5b9aa5dfe63614b6b537d1ccc2d212e, SHA256 f90af8fa794a34d53ee9481c6d0bdb63138853b30f851d92960fd34224ff62b2. Full Nix builds remain unverified. SDK static edges persist after receipt; LCM/Zenoh do not acquire DDS transient-local durability from CDR. Existing Python mount publishers retain dynamic tf compatibility. Legacy modules remain explicitly pinned to SDK 0.1.0.

Stack #4776 preserves existing history and PR bases. Current main still has conflicts with the original stack; this change does not rebase onto main. No DimOS PR has been merged.

@TomCC7

TomCC7 commented Oct 21, 2026 •

Copy link
Copy Markdown
Member Author

Review report

Updated: 2026-10-21. Direct predecessor: #4738.

  • Head: 25dc75047dc420a8ba34602044aaf3dfa95520eb
  • Named base branch: cc/feat/cdr-unit-robots at bb22c6cfee7aaebc09c6227a1c966673486a9fef
  • PR-recorded base: bb22c6cfee7aaebc09c6227a1c966673486a9fef; diff merge base: bb22c6cfee7aaebc09c6227a1c966673486a9fef

What changes and why the diff is large

Add an explicit offline recording converter for local SQLite and MCAP, plus migration/fidelity reporting. Historical decoding is confined to this command; this is separate from live transport compatibility.
3 implementation files, 2 test files and 1 guide. This unit is already small in file count; most lines are conversion rules and regression cases.

Review map

Suggested entry points: dimos/memory/convert_recording.py, dimos/memory/recording_migration.py, dimos/memory/cli/app.py, docs/development/convert-recordings.md.
All 6 changed files are accounted for below. Grouping is by file role, not a claim that the implementation is minimal.

Complete file map

Implementation (3)

File Change Purpose
dimos/memory/cli/app.py modified Expose offline conversion and migration through the existing memory CLI.
dimos/memory/convert_recording.py added Offline MCAP/SQLite conversion, explicit legacy type allowlist, schema/field checks and safe output handling.
dimos/memory/recording_migration.py added Batch/recording migration bookkeeping and fidelity reporting around the converter.

Tests (2)

File Change Purpose
dimos/memory/test_convert_recording.py added Checks pose preserves payload header and both envelope times.
dimos/memory/test_recording_migration.py added Checks cli single and batch dry run then conversion.

Documentation and replay inputs (1)

File Change Purpose
docs/development/convert-recordings.md added Update the convert-recordings guide or replay input for the migrated boundaries.

Review focus and scope reductions

  • Keep the historical type allowlist and unsupported-input behavior explicit. Do not infer arbitrary Python imports from recording type names or accept pickle as a convenience.
  • Review timestamp, schema, metadata and field fidelity with failure/rollback behavior. Source files and existing destinations must stay protected.
  • MCAP output cannot preserve SQLite vector embeddings; rejection must remain visible rather than silently dropping them.
  • The converter and migration-report responsibilities can be read separately. Do not shrink the diff by removing safety/fidelity tests just to reduce line count.

Validation

Fresh checks on 25dc75047dc420a8ba34602044aaf3dfa95520eb: all 35 offline conversion/fidelity tests passed using local temporary recordings. This layer's code did not need helper edits; it was restacked onto the cleaned predecessor. Final stack repository hooks passed with cargo/native lint excluded.

Reproduction commands, not executed here unless stated above

Run from this PR's own checkout root after installing its documented test dependencies. These are selected review entry points, not a claim of full-stack coverage.

uv run pytest dimos/memory/test_convert_recording.py dimos/memory/test_recording_migration.py
dimos mem convert OLD NEW --dry-run

Remaining work

Installed-wheel converter execution and unsupported historical formats were not retested. Source/output protection and blocked pickle inputs remain intact.

@TomCC7
TomCC7 force-pushed the cc/feat/cdr-unit-converter branch from 8f563d0 to 25dc750 Compare October 22, 2026 02:34
@TomCC7
TomCC7 removed this pull request from stack #4743 October 22, 2026 18:51
@TomCC7
TomCC7 added this pull request to stack #4776 October 22, 2026 18:52

This branch has not been deployed

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant