- guard instant-to-epoch conversion against pre-boot instants
- serialize snapshot duration as milliseconds (u128) in DTO/commands
- derive Display/Error for CountdownError and return user-facing error strings
- remove unused command result alias and minor snapshot lock cleanup
- switch ClockAnchor to tokio::time::Instant for consistent async timing
- remove incorrect epoch-ms math in Countdown model and expose instant getters
- update CountdownService snapshot to use remaining_at(now) plus start/target instants
- add missing core extern declaration in lib.rs
- replace AppState.countdowns vector with countdown_service
- add CountdownService::new(id, label, duration) for configurable initialization
- add CountdownService::default() with default countdown values
- remove unused next_id field and note TODO for multi-countdown support
- add `app_state` module with `ClockAnchor` and `AppState`
- initialize `AppState` with a default `CountdownService`
- register app state in Tauri via `.manage(app_state)`
- extend `CountdownSnapshotDto` epoch fields to `Option<u128>`
- add countdown model helpers for start/target epoch-ms conversion
- return optional epoch fields from `CountdownService::snapshot`
- ignore generated `dist/` directory in `.gitignore`