--- # claudbg-nqxz title: Duration shows 0ms — RawEntry.duration_ms field name mismatch (durationMs vs duration_ms) status: completed type: bug priority: high created_at: 2026-03-30T04:44:06Z updated_at: 2026-03-30T05:02:50Z parent: claudbg-8vpb --- ## Problem `sessions transcribe` shows `Duration: 0ms` even for long sessions. ## Root cause The JSONL file uses camelCase `durationMs` at the entry level: ```json {"type": "system", "durationMs": 3446227, ...} ``` But `RawEntry` declares the field as `duration_ms: Option` with no serde rename: ```rust // src/models/session.rs:33 pub duration_ms: Option, ``` Serde looks for `duration_ms` (snake_case), finds nothing, and the value falls into the `extra` catch-all map instead. `compute_stats` then sums zeros. ## Fix Add `#[serde(rename = "durationMs")]` to the field: ```rust #[serde(rename = "durationMs")] pub duration_ms: Option, ``` Alternatively use `#[serde(alias = "durationMs")]` to accept both forms. ## Confirmed by Running against session `21fae0a8`: `grep '"durationMs":[0-9]'` finds entries like `{"type":"system","durationMs":3446227,...}` confirming the field name is camelCase. ## Relevant files - `src/models/session.rs` — `RawEntry`, `duration_ms` field (line 33) - `src/models/stats.rs` — `compute_stats`, accumulates `entry.duration_ms` ## Summary of Changes Added `#[serde(rename = "durationMs")]` to the `duration_ms` field on `RawEntry` in `src/models/session.rs`. No other changes needed — `compute_stats` already reads `entry.duration_ms` correctly.