Three review findings on task 4:
- read_plist_fields now parses the plist properly via the plist crate
(already a transitive dep of service-manager, promoted to direct) instead
of slicing raw XML, so a PATH or program path containing & or < no longer
round-trips as literal &/< through cli::service::render_status.
- launchctl's error path now includes both stdout and stderr, trimmed and
joined only on non-empty parts, so a failure never surfaces as
"launchctl load failed: " with nothing after the colon.
- status() now returns identical None fields (program, path_env,
snapshotted, pid) whether the plist is absent or the plist exists but the
crate reports NotInstalled (e.g. written but never loaded, or booted out
of band) - extracted via a shared not_installed_status/build_status split
so both paths run the same code.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EGntTHCW3sEPy1VBRopNNp