79445a496c
* fix(desktop): treat a macOS ps: parent-marker mismatch as inconclusive, not death `ps -o lstart=` is a TZ/locale-rendered wall-clock string. Electron caches it once per app lifetime; the backend re-renders it per spawn. A timezone change (travel, or the DST boundary) while the app stays open makes the SAME instant differ byte-for-byte, and _is_serve_orphaned() treated that as proof the parent died -- os._exit(0) ~5ms after HERMES_BACKEND_READY, silently, on every respawn until a full quit. Route mismatches through _parent_start_marker_mismatch_is_conclusive(): linux:/ win:/winms: machine markers stay conclusive (PID-reuse defence intact); any ps: side degrades to the PID-liveness check the legacy Desktop path already uses. Log one warning before os._exit(0) so the exit is no longer traceless. Fixes #95693 Fixes #93958 Co-authored-by: Ahmett101 <Ahmett101@users.noreply.github.com> * fix(desktop): reject truncated ps: parent markers; blank marker env means absent A ps: marker that got whitespace-split in env plumbing (`ps:Sat`) passed _valid_parent_start_marker and armed a watchdog that could never match, so the backend exited 0 right after HERMES_BACKEND_READY. Require a full lstart value (>=4 tokens, a 4-digit year, a time). Treat empty HERMES_PARENT_START_MARKER / HERMES_PARENT_NONCE as absent so a blank inherited value degrades to PID-only tracking instead of disarming or misfiring. * chore: map contributor email for drewTuzson * fix(desktop): log when the parent-death watchdog disarms on an unusable marker Disarming is the fail-safe branch (the backend keeps serving) but it also means this backend will never reap itself when the Desktop dies. Leave one warning naming the rejected marker so that downgrade is not traceless. * test(desktop): live macOS proof that a TZ-drifted ps: marker no longer kills the backend Runs the real start_server in a subprocess against the host ps, with the marker rendered under Europe/Paris and the backend under America/New_York. Asserts READY + still alive after several watchdog polls, then that the backend still exits once the stand-in parent is killed. Fails on main with the reported symptom (exit 0, live parent); macos_only lane. --------- Co-authored-by: ygd58 <buraysandro9@gmail.com> Co-authored-by: Ahmett101 <Ahmett101@users.noreply.github.com> Co-authored-by: Drew Tuzson <drew.tuzson@uqual.com>
Contributor email → GitHub login mappings
This directory replaces appending entries to AUTHOR_MAP in
scripts/release.py. The old dict caused constant merge conflicts when
several salvage PRs landed at once — every PR edited the same lines of the
same file. Here, each mapping is its own file, and file additions never
conflict.
Adding a mapping
One file per commit-author email, under emails/:
python3 scripts/add_contributor.py <email> <github-login>
# or by hand:
echo "<github-login>" > contributors/emails/<email>
- File name = the exact commit-author email (as shown by
git log --format='%ae'). - File content = the GitHub login on the first non-comment line.
Lines starting with
#are comments (use them for the PR reference).
Example — contributors/emails/jane.doe@example.com:
janedoe
# PR #12345 salvage (gateway: fix session key routing)
Rules
- Do NOT add new entries to
AUTHOR_MAPinscripts/release.py. That dict is frozen legacy data; the release tooling merges it with this directory (directory entries win on duplicates). - GitHub noreply emails (
<id>+<login>@users.noreply.github.comand<login>@users.noreply.github.com) auto-resolve — no file needed. - The
Contributor Attribution CheckCI job fails a PR whose commits carry an unmapped email; the failure message prints the exact command to run.