- CrashDetail (components/shared): headline is abort_msg when present,
else the Xtensa exception name. For aborts, pc/exception/fault address are
shown muted with a note that they describe abort() and that the first
2-4 frames are abort internals. Shows task, uptime at crash, heap stats with
a "likely heap exhaustion / fragmentation" badge (largest_block < 12000 or
free_heap < 25000, F-055), PC + backtrace as 0x%08X in ESP serial format,
a copyable addr2line command (PC, backtrace, then the PC parsed from
"abort() was called at PC ..."), elf_sha256, and a backtrace-corrupted
flag. When the server has the build's ELF and addr2line, a Decode button
shows function + file:line per frame.
- Health tab boot history uses it, previews the headline in the row, and
gets a "Sync from device" button (telemetry.get_boot_history, merged
server-side).
- New /devices/crashes page (linked from the Fleet header): crashes grouped
across devices with per-device counts and the latest occurrence.
- Firmware release modal: optional firmware.elf attachment.
- API reference: boot_report payload documents the F-070 fields.
- lib/crashReport.js holds the parsing/formatting rules; lib/clipboard.js
a copy helper with a non-secure-context fallback.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>