- Add pytestmark = [pytest.mark.<category>] to all 23 root test files and 14 e2e test files
- Marker distribution: 22 unit, 7 integration, 1 blackbox, 1 sitl, 5 e2e + 2 e2e integration
- Add import pytest to test_models.py, test_download.py, test_synthetic_adapter.py (were missing)
- Convert test_sitl_integration.py's bare pytestmark to list form preserving skipif guard
- Union of all 5 markers = 298/298 = 100% coverage; 216 tests pass with --strict-markers
conftest.py: add euroc_mh02..05_root fixtures (session-scoped, skip when absent)
test_euroc_mh_all.py: 10 parametrised tests — pipeline_completes + eskf_drift
for MH_01..05 with per-difficulty ESKF ATE ceilings (easy: 0.5 m, med/hard: 1.5 m)
Results on first 100 frames (vo_scale=5 mm/frame):
MH_01 easy ESKF ATE 0.205 m (< 0.5 m ceiling)
MH_02 easy ESKF ATE 0.131 m (< 0.5 m ceiling)
MH_03 medium ESKF ATE 0.008 m (< 1.5 m ceiling)
MH_04 difficult ESKF ATE 0.009 m (< 1.5 m ceiling)
MH_05 difficult ESKF ATE 0.007 m (< 1.5 m ceiling)
All 10 tests PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>