mirror of
https://github.com/azaion/gps-denied-onboard.git
synced 2026-06-23 01:41:14 +00:00
[AZ-959] replay_api: POST /replay (video,csv) + /static/example-csv
Extend the AZ-701 replay_api POST /replay endpoint so AZ-897 (now in ../ui repo) can drive the AZ-894 CSV-replay path. The endpoint keeps full back-compat for tlog clients and adds: - (video, tlog) OR (video, csv) multipart with strict XOR enforced at the API boundary (AC-2 / AC-3 → 400 multipart_missing_field) - validate_csv_kind: rejects malformed CSV schema at boundary by scanning the header line for AZ-896 required tokens; messages point at csv_replay_format.md (AC-4) - ReplayInputs DTO: tlog_path / csv_path are now Path | None with XOR re-enforced in __post_init__ for internal callers - JobStorage reserves both input.tlog and input.csv paths; handler writes exactly one - SubprocessReplayRunner.run dispatches --imu vs --tlog argv (AC-1) - _maybe_render_report dispatches load_csv_ground_truth vs load_tlog_ground_truth; CsvGpsFix and TlogGpsFix have field-compatible shapes for the GroundTruthRow adapter (AC-6) - GET /static/example-csv serves the AZ-896 reference CSV; honours REPLAY_API_EXAMPLE_CSV_PATH env, falls back to source-checkout layout, returns 503 with example_csv_unavailable when neither resolves to a readable file. No auth required (AC-5) Tests: 27/27 unit tests green: - 18 pre-existing tlog-path tests unchanged (AC-7) - 9 new tests covering ACs 1-6 + validate_csv_kind isolation Deferred (NOT silently fixed; reported to user as end-of-turn notes for scope discipline): - gps-denied-render-map only consumes binary tlog truth today, so CSV-path jobs return map_html_url=None. Extending render-map to dispatch on truth-file extension is AZ-700 follow-up territory. - ReportContext.tlog_path field is now overloaded as the "ground-truth source path"; the rendered report still labels the line "Tlog: <csv_path>" which is cosmetically misleading for CSV runs. Field rename + label fix is AZ-699 follow-up. Bookkeeping: AZ-959 spec moved todo/ → done/, dep-table preamble fifth bump documents what landed + what's deferred, state.md records batch 5 complete and what comes next. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -27,10 +27,17 @@ _LOGGER = logging.getLogger("gps_denied_onboard.replay_api.storage")
|
||||
|
||||
@dataclass(frozen=True, slots=True)
|
||||
class JobStorage:
|
||||
"""The per-job paths the handler hands to the runner."""
|
||||
"""The per-job paths the handler hands to the runner.
|
||||
|
||||
Both ``tlog_path`` and ``csv_path`` are reserved on disk; the
|
||||
handler writes to exactly one and leaves the other unused. The
|
||||
``ReplayInputs`` DTO carries ``None`` for the branch that wasn't
|
||||
written so downstream consumers know which clock source applies.
|
||||
"""
|
||||
|
||||
root: Path
|
||||
tlog_path: Path
|
||||
csv_path: Path
|
||||
video_path: Path
|
||||
calibration_path: Path
|
||||
output_dir: Path
|
||||
@@ -60,6 +67,7 @@ class StorageRoot:
|
||||
return JobStorage(
|
||||
root=job_root,
|
||||
tlog_path=job_root / "input.tlog",
|
||||
csv_path=job_root / "input.csv",
|
||||
video_path=job_root / "input.mp4",
|
||||
calibration_path=job_root / "calibration.json",
|
||||
output_dir=output_dir,
|
||||
|
||||
Reference in New Issue
Block a user