Milliseconds one QoS window is worth, at the Duration → C-ABI boundary.
The C ABI is uint32_t milliseconds (nros_cpp_qos_t.deadline_ms and siblings) and 0 there means INFINITE, so truncation is not a rounding question — a 500 µs deadline truncated to 0 would silently mean "no
deadline at all". So:
<= 0 → 0. A non-positive window is the "unset" spelling (Duration() / Duration::zero()), and 0 is the ABI's infinity.
- otherwise ROUND UP to the next whole millisecond. A sub-millisecond window becomes 1 ms rather than infinity, and rounding up is the lenient direction for all three policies (a longer deadline, lifespan or lease never turns a working profile into a violated one).
- above
UINT32_MAX ms (~49.7 days) → UINT32_MAX, saturating rather than wrapping into a short window.