Files
hermes-agent/apps
Teknium 10d866b0d3 fix(desktop): marker liveness never waits forever, never sees half a claim
Round-2 review findings on the Electron side of contract C1/C2:

- A1/MAJOR-1: read a foreign pid's creation time on Windows through CIM
  (Win32_Process.CreationDate, limited query rights) instead of
  Get-Process .StartTime, which is access-denied for SYSTEM/elevated/
  other-user processes. The update gate memoises one probe per pid per
  wait (no powershell spawn per 1 s poll). A live pid whose creation time
  cannot be read is live only inside the 20-minute ceiling, so a reused
  pid can no longer park Desktop boot forever. macOS ps lstart is printed
  and parsed as UTC.
- r1 M1: the staged Tauri updater pre-write names the spawned updater's
  pid AND creation time (v2), so the updater adopts a v2 claim, no age
  ceiling applies, and its hermes update child can add the delegate line.
- A3/m1: claims are published by writing a tmp sibling and hard-linking it
  into place (EEXIST never replaces); O_EXCL+write remains only as the
  no-hardlink fallback, and readers treat a 0-byte marker younger than 5 s
  as live. Dead writers' tmp siblings are reclaimed.
- A2/MINOR-4: positional parse identical to the contract (BOM, CRLF,
  integer started_at else malformed, bad ct => v1, bad delegate ignored).
- MINOR-3: on hand-off timeout, a missed compare-and-delete that finds the
  script already took the marker counts as a started hand-off; otherwise
  the Desktop kills the launcher tree it spawned (POSIX process group;
  Windows: the wrapper's children carrying our -DesktopPid).

(cherry picked from commit 0615bd7c0565166afec2dff1f7b1ef5e835af56c)
2026-10-06 05:17:45 -07:00
..