fix(control): keep command-line sessions alive on macOS #516

Closed
mooki wants to merge 2 commits from mooki/Longshot:mac/longshot-ctl-darwin into main
Member

Type: fix · Risk: low · Tested on: macOS 26.7.1, Apple M4 Max (game-free checks; no game run) · Needs: Linux, any GPU

Why

On a Mac, longshot_ctl cannot attach to, stop or finish a game session: scripts/longshot_ctl.py thinks every
durable session (#47) is dead. process_start() reads /proc/<pid>/stat, which macOS does not have. The game, its owner
and its launcher all look gone. tests/test_longshot_ctl.py fails on a Mac with 2 failures and 26 errors. This is part
of the macOS port (#420).

How to reproduce

Seen on: macOS 26.7.1, Apple M4 Max, in the game-free test on main (the Darwin branch is new; Linux and Windows
keep their paths).
Settings and switches: defaults.
Steps: on a Mac, in a checkout of main: python -I -B tests/test_longshot_ctl.py.
Expected: OK: sessions are found alive while their processes run.
Actual: at 9c9d69ed (before the rebase): Ran 38 tests, FAILED (failures=2, errors=26); process_start()
returns no identity on Darwin. At 6c9edffe test_longshot_ctl is among main's failures on this Mac.

What changed

process_start() gets a Darwin branch: the process's identity is its kernel start time (microseconds) and the boot's
session UUID, read through sysctl, with a zombie or a gone pid counted as dead, as on Linux. One test checks it on
macOS, and test_copy_save now expects the resolved run folder that launch already uses.

  • Read first: the Darwin block in process_start(). Sessions store the identity as JSON, so it is plain ints and a
    string.
  • control: process_start() in scripts/longshot_ctl.py gets a Darwin branch that reads sysctl kern.proc.pid
    through ctypes, standard library only.
    • The identity is the process's start time: kp_proc.p_starttime, a struct timeval that the kernel sets at fork and
      never changes. It has microsecond resolution and is kept as {"clock": "darwin-start-us", "ticks": …}.
    • The boot's identity is added, kern.bootsessionuuid, as Linux adds boot_id.
    • A zombie (p_stat == SZOMB) or a pid that is gone (the call answers with no bytes) counts as dead, as Linux's Z/X
      does. The answer's own p_pid must match the pid asked for.
    • The struct kinfo_proc layout was checked with the SDK (offsetof). On arm64 and x86_64 alike it is 648 bytes, with
      the start time at 0, p_stat at 36 and p_pid at 40.
  • tests:
    • test_darwin_process_identity (Darwin only) checks four things:
      • The identity is stable, and its boot is sysctl -n kern.bootsessionuuid.
      • A child's start time lies between wall-clock readings taken before and after it is started, which checks the
        offsets.
      • An exited child that has not been reaped (a zombie that still holds its pid, os.kill(pid, 0)) reads as dead.
      • It still reads as dead after it is reaped.
    • test_copy_save compares launch's data folder with os.path.realpath(run). launch resolves --run
      (Path.resolve()), and on macOS /tmp is a link to /private/tmp. There is no platform case: on Linux the
      resolved path is the same.
  • Design, why sysctl and not ps -o lstart=: lstart has one-second resolution, so a pid reused within the same
    second would pass as the same process, which is weaker than Linux's start ticks. It is also locale-formatted text
    from a subprocess, about 7 ms per call on this Mac, and the session code polls same_process() every 20 ms. sysctl
    is one system call, about 14 µs, with microsecond resolution and the zombie state in the same answer. libproc's
    PROC_PIDTBSDINFO would give the same start time. sysctl needs no second library, and ps reads the same
    kinfo_proc [inference: from how ps works on BSD; its source was not read here].
  • Design, pid reuse: a reused pid belongs to a process forked later, so its p_starttime differs. The comparison is
    the whole identity, as on Linux and Windows. The existing pid was reused check in Sessions still passes. It is
    strictly finer than Linux's 10 ms ticks, and the boot UUID covers a reboot, as boot_id does.
  • ctypes.CDLL(None) finds sysctl and sysctlbyname in libSystem through the interpreter's own image.
  • Rebased on 6c9edffe: a clean rebase, no conflict. 0b605a55 is now ef712604 and 52695384 is now 04d947b3.
    The measurements name the commits they ran at.

Measurements

Verdict: fixed on macOS, and nothing else moves: at this head tests/test_longshot_ctl.py passes (45 tests OK)
where it fails on main, and the full suite changes by that one check only. Before the rebase it failed on main and
passed here in two interleaved rounds. Pass or fail: no timing median.

Commits: main 6c9edffe5d (2026-11-14); this PR mac/longshot-ctl-darwin @
04d947b356. Before the rebase: main 9c9d69ed09
(2026-11-14); this PR @ 526953848f.
Hardware: Apple M4 Max (16 CPUs), 64 GB, macOS 26.7.1
Scene: none (game-free checks; no GPU, no game)
Method: after the rebase, tests/test_longshot_ctl.py on this head through tools/slot.py in the suite's clean
environment, and the full suite on main @ 6c9edffe and on this head, compared by test name. Before the rebase:
tests/run_all.py test_longshot_ctl, run main, this PR, main, this PR. The results are pass or fail and the same in
both rounds, so there is no timing median. Also the full game-free suite, compared by test name with main's run on
this Mac.
How to reproduce: python -I -B tests/test_longshot_ctl.py in each checkout. Add
--source-root <checkout> Sessions.test_darwin_process_identity to point one test at another checkout's
longshot_ctl.py.

Before: main @ 6c9edffe After: this PR @ 04d947b3
tests/test_longshot_ctl.py on macOS FAIL (in main's full suite on this Mac) 45 tests OK
full game-free suite on macOS (tests/run_all.py --jobs 6) 531 passed, 32 failed, 17 skipped in 181 s 532 passed, 31 failed, 17 skipped in 182 s: only test_longshot_ctl changed status

Before the rebase (history at the commits the columns name):

main @ 9c9d69ed this PR @ 52695384
tests/test_longshot_ctl.py, rounds 1 and 2 FAIL: 38 tests, 2 failures, 26 errors PASS: 39 tests, OK
test_darwin_process_identity pointed at main's longshot_ctl.py ERROR: 'NoneType' object is not subscriptable (no identity on Darwin) PASS
full game-free suite on macOS (tests/run_all.py --jobs 6) 533 passed, 20 failed, 17 skipped 534 passed, 19 failed, 17 skipped
main @ 9c9d69ed:
FAIL: test_copy_save (__main__.LongshotCtl.test_copy_save)
FAIL: test_profile_manifest_and_second_client (__main__.Sessions.test_profile_manifest_and_second_client)
Ran 38 tests in 14.693s
FAILED (failures=2, errors=26)

this PR @ 52695384:
Ran 39 tests in 12.853s
OK

The new check catches real faults. In a scratch copy of this PR's longshot_ctl.py with the zombie check
(p_stat == 5) removed, it fails at the zombie ({'clock': 'darwin-start-us', …} is not None). This PR's copy passes.

Screenshots: none; nothing on screen.

Flags and settings

None.

Testing

Tested:

  • Re-tested after the rebase (head 04d947b3 on 6c9edffe): python -I -B tests/test_longshot_ctl.py, through
    tools/slot.py in the suite's clean environment: 45 tests OK (39 at 9c9d69ed).

  • On an Apple M4 Max with macOS 26.7.1, game-free only.

  • test_longshot_ctl fails on main and passes here, in two interleaved rounds.

  • The struct offsets on arm64 and on x86_64 (Rosetta) with the SDK's offsetof.

  • Probe of the live process, a child, the child as a zombie, after reaping, pid 1 and a pid that does not exist, with a
    separate probe script that is not part of this PR.

  • The full suite after the rebase, tests/run_all.py --jobs 6, compared by test name with a full main run at
    6c9edffe on the same Mac:

    main @ 6c9edffe:     531 passed, 32 failed, 17 skipped in 181 s (linux, 6 at once)
    this PR @ 04d947b3:  532 passed, 31 failed, 17 skipped in 182 s (linux, 6 at once)
    

    Only one status changed: tests/test_longshot_ctl.py, FAIL on main, passes here. The other 31 failures also fail
    on main.

  • Before the rebase (main @ 9c9d69ed: 533 passed, 20 failed, 17 skipped; this PR @ 52695384: 534 passed, 19
    failed, 17 skipped), only one status changed: tests/test_longshot_ctl.py, FAIL on main, passed here. The other 19
    failures were main's on this Mac, by name. Trees were clean before and after, and the run took 179 s.

  • After the rebase onto main aa95d35f, at 3b9d3cfa (04d947b3 before the rebases onto e090cc48 and aa95d35f):
    Sweep3's checks of this head (the C/C++ it changes compiled, and its own tests run, on arm64 and x86_64 where they
    apply) gave the same results as before; python -I -B tests/run_all.py on wave S1's merge 11a5b4e7, which carries
    this head: 568/22/17 (passed/failed/skipped) against main aa95d35f's 543/33/17 on this Mac, no new failure
    (reports/2026-11-15-rebase-sweep-3.md).

Not tested:

  • Linux and Windows. Their paths in process_start() are unchanged. test_copy_save's expectation resolves to the same
    path where /tmp is not a link [inference: not run there].
  • Rosetta (an x86_64 Python): the layout is the same (checked), but the test was run with arm64 Python only.
  • A real game session on macOS.
  • test_copy_save on Linux: its launch block (skipped on Windows) now expects os.path.realpath(run); nobody has run
    it there.

Must be tested:

  • Linux, any GPU, any driver: run python -I -B tests/test_longshot_ctl.py in a checkout of this PR (head 3b9d3cfa) and
    of main aa95d35f, expecting OK on both (this PR's Darwin test skipped), so test_copy_save's new expectation, the
    resolved run folder, holds there as main's did (by hand: test request T-PFDX).

Risks

What could break: macOS only, in the tool. If sysctl fails or answers with the wrong size, the process reads as
dead. That is the same outcome as before this PR, so it fails safe. On Linux test_copy_save compares with the resolved
run folder, which is the same path unless the test's temporary folder sits behind a link.

Turning it off: revert the two commits; that restores main.

Compatibility: nothing changes for a player or on Windows and Linux. On macOS, longshot_ctl's session files store
the new identity ({"clock": "darwin-start-us", …}); before this PR every macOS session read as dead. Saves,
longshot_options.ini, the caches and the vk ABI are unchanged.

Issues

See #47 (durable sessions).
See #420 (macOS tracking).

Checklist

Everyone

  • One topic.
  • The title is a Conventional Commit (type(scope): description) of the status line's type.
  • Why gives the reason plainly and links the issues that fit (the tracker searched).
  • Measurements has a verdict, or one line saying why there is nothing to measure.
  • Testing names what was tested, what wasn't, and what must still be tested, where and how.
  • Rebased on current main: on aa95d35f (#761, 2026-11-15), head 3b9d3cfa, without a conflict; this PR's own
    commits, old → new: ef712604 → 56f4ca87, 04d947b3 → 3b9d3cfa; the commit names elsewhere in this description
    are from before the rebase.
  • python -I -B tests/run_all.py passes (any failure that also fails on main is named). On macOS, after the
    rebase: 532 passed, 17 skipped, and 31 failures that also fail on main (531 passed, 32 failed, 17 skipped at
    6c9edffe); by test name under Testing. After the rebase onto main aa95d35f (head 3b9d3cfa): wave S1's merge
    11a5b4e7, 568/22/17 against main aa95d35f's 543/33/17, no new failure.
  • No game files, dumps, build output or generated files.
  • third_party/ untouched (a new folder with a PROVENANCE.md instead).
  • The license is OK: GPL-3.0-or-later, nothing incompatible and nothing decompiled.

When it applies

  • AI assistance recorded with Assisted-by: / Co-Authored-By: trailers.
  • A game-free test added for the fix, failing on main and passing here.
  • A check under tests/ that reads changed source updated in this PR, not weakened. tests/test_longshot_ctl.py:
    one Darwin test added; test_copy_save expects the resolved run folder, the same path as before where /tmp is not
    a link.
**Type:** fix · **Risk:** low · **Tested on:** macOS 26.7.1, Apple M4 Max (game-free checks; no game run) · **Needs:** Linux, any GPU ## Why On a Mac, `longshot_ctl` cannot attach to, stop or finish a game session: `scripts/longshot_ctl.py` thinks every durable session (#47) is dead. `process_start()` reads `/proc/<pid>/stat`, which macOS does not have. The game, its owner and its launcher all look gone. `tests/test_longshot_ctl.py` fails on a Mac with 2 failures and 26 errors. This is part of the macOS port (#420). ## How to reproduce **Seen on:** macOS 26.7.1, Apple M4 Max, in the game-free test on `main` (the Darwin branch is new; Linux and Windows keep their paths). **Settings and switches:** defaults. **Steps:** on a Mac, in a checkout of `main`: `python -I -B tests/test_longshot_ctl.py`. **Expected:** `OK`: sessions are found alive while their processes run. **Actual:** at `9c9d69ed` (before the rebase): `Ran 38 tests`, `FAILED (failures=2, errors=26)`; `process_start()` returns no identity on Darwin. At `6c9edffe` `test_longshot_ctl` is among `main`'s failures on this Mac. ## What changed `process_start()` gets a Darwin branch: the process's identity is its kernel start time (microseconds) and the boot's session UUID, read through `sysctl`, with a zombie or a gone pid counted as dead, as on Linux. One test checks it on macOS, and `test_copy_save` now expects the resolved run folder that `launch` already uses. - Read first: the Darwin block in `process_start()`. Sessions store the identity as JSON, so it is plain ints and a string. - control: `process_start()` in `scripts/longshot_ctl.py` gets a Darwin branch that reads `sysctl` `kern.proc.pid` through `ctypes`, standard library only. - The identity is the process's start time: `kp_proc.p_starttime`, a `struct timeval` that the kernel sets at fork and never changes. It has microsecond resolution and is kept as `{"clock": "darwin-start-us", "ticks": …}`. - The boot's identity is added, `kern.bootsessionuuid`, as Linux adds `boot_id`. - A zombie (`p_stat == SZOMB`) or a pid that is gone (the call answers with no bytes) counts as dead, as Linux's `Z`/`X` does. The answer's own `p_pid` must match the pid asked for. - The `struct kinfo_proc` layout was checked with the SDK (`offsetof`). On arm64 and x86_64 alike it is 648 bytes, with the start time at 0, `p_stat` at 36 and `p_pid` at 40. - tests: - `test_darwin_process_identity` (Darwin only) checks four things: - The identity is stable, and its boot is `sysctl -n kern.bootsessionuuid`. - A child's start time lies between wall-clock readings taken before and after it is started, which checks the offsets. - An exited child that has not been reaped (a zombie that still holds its pid, `os.kill(pid, 0)`) reads as dead. - It still reads as dead after it is reaped. - `test_copy_save` compares launch's data folder with `os.path.realpath(run)`. `launch` resolves `--run` (`Path.resolve()`), and on macOS `/tmp` is a link to `/private/tmp`. There is no platform case: on Linux the resolved path is the same. - Design, why sysctl and not `ps -o lstart=`: `lstart` has one-second resolution, so a pid reused within the same second would pass as the same process, which is weaker than Linux's start ticks. It is also locale-formatted text from a subprocess, about 7 ms per call on this Mac, and the session code polls `same_process()` every 20 ms. sysctl is one system call, about 14 µs, with microsecond resolution and the zombie state in the same answer. libproc's `PROC_PIDTBSDINFO` would give the same start time. sysctl needs no second library, and `ps` reads the same `kinfo_proc` [inference: from how `ps` works on BSD; its source was not read here]. - Design, pid reuse: a reused pid belongs to a process forked later, so its `p_starttime` differs. The comparison is the whole identity, as on Linux and Windows. The existing `pid was reused` check in `Sessions` still passes. It is strictly finer than Linux's 10 ms ticks, and the boot UUID covers a reboot, as `boot_id` does. - `ctypes.CDLL(None)` finds `sysctl` and `sysctlbyname` in libSystem through the interpreter's own image. - Rebased on `6c9edffe`: a clean rebase, no conflict. `0b605a55` is now `ef712604` and `52695384` is now `04d947b3`. The measurements name the commits they ran at. ## Measurements **Verdict:** fixed on macOS, and nothing else moves: at this head `tests/test_longshot_ctl.py` passes (45 tests OK) where it fails on `main`, and the full suite changes by that one check only. Before the rebase it failed on `main` and passed here in two interleaved rounds. Pass or fail: no timing median. Commits: main 6c9edffe5da1f5b5383977aeab3f544c0de25d4c (2026-11-14); this PR `mac/longshot-ctl-darwin` @ 04d947b356a1db2d097ec198a538b9f9c4e42a8b. Before the rebase: main 9c9d69ed09e2c24965d35f1696aa5c8dd8fe6e40 (2026-11-14); this PR @ 526953848f9481a24d32b99a131319dc843fd043. Hardware: Apple M4 Max (16 CPUs), 64 GB, macOS 26.7.1 Scene: none (game-free checks; no GPU, no game) Method: after the rebase, `tests/test_longshot_ctl.py` on this head through `tools/slot.py` in the suite's clean environment, and the full suite on `main` @ 6c9edffe and on this head, compared by test name. Before the rebase: `tests/run_all.py test_longshot_ctl`, run main, this PR, main, this PR. The results are pass or fail and the same in both rounds, so there is no timing median. Also the full game-free suite, compared by test name with main's run on this Mac. How to reproduce: `python -I -B tests/test_longshot_ctl.py` in each checkout. Add `--source-root <checkout> Sessions.test_darwin_process_identity` to point one test at another checkout's `longshot_ctl.py`. | | Before: main @ 6c9edffe | After: this PR @ 04d947b3 | |---|---|---| | `tests/test_longshot_ctl.py` on macOS | FAIL (in `main`'s full suite on this Mac) | 45 tests OK | | full game-free suite on macOS (`tests/run_all.py --jobs 6`) | 531 passed, 32 failed, 17 skipped in 181 s | 532 passed, 31 failed, 17 skipped in 182 s: only `test_longshot_ctl` changed status | Before the rebase (history at the commits the columns name): | | main @ 9c9d69ed | this PR @ 52695384 | |---|---|---| | `tests/test_longshot_ctl.py`, rounds 1 and 2 | FAIL: 38 tests, 2 failures, 26 errors | PASS: 39 tests, OK | | `test_darwin_process_identity` pointed at main's `longshot_ctl.py` | ERROR: `'NoneType' object is not subscriptable` (no identity on Darwin) | PASS | | full game-free suite on macOS (`tests/run_all.py --jobs 6`) | 533 passed, 20 failed, 17 skipped | 534 passed, 19 failed, 17 skipped | ``` main @ 9c9d69ed: FAIL: test_copy_save (__main__.LongshotCtl.test_copy_save) FAIL: test_profile_manifest_and_second_client (__main__.Sessions.test_profile_manifest_and_second_client) Ran 38 tests in 14.693s FAILED (failures=2, errors=26) this PR @ 52695384: Ran 39 tests in 12.853s OK ``` The new check catches real faults. In a scratch copy of this PR's `longshot_ctl.py` with the zombie check (`p_stat == 5`) removed, it fails at the zombie (`{'clock': 'darwin-start-us', …} is not None`). This PR's copy passes. Screenshots: none; nothing on screen. ### Flags and settings None. ## Testing **Tested:** - Re-tested after the rebase (head `04d947b3` on `6c9edffe`): `python -I -B tests/test_longshot_ctl.py`, through `tools/slot.py` in the suite's clean environment: 45 tests OK (39 at `9c9d69ed`). - On an Apple M4 Max with macOS 26.7.1, game-free only. - `test_longshot_ctl` fails on main and passes here, in two interleaved rounds. - The struct offsets on arm64 and on x86_64 (Rosetta) with the SDK's `offsetof`. - Probe of the live process, a child, the child as a zombie, after reaping, pid 1 and a pid that does not exist, with a separate probe script that is not part of this PR. - The full suite after the rebase, `tests/run_all.py --jobs 6`, compared by test name with a full `main` run at `6c9edffe` on the same Mac: ``` main @ 6c9edffe: 531 passed, 32 failed, 17 skipped in 181 s (linux, 6 at once) this PR @ 04d947b3: 532 passed, 31 failed, 17 skipped in 182 s (linux, 6 at once) ``` Only one status changed: `tests/test_longshot_ctl.py`, FAIL on `main`, passes here. The other 31 failures also fail on `main`. - Before the rebase (`main` @ `9c9d69ed`: 533 passed, 20 failed, 17 skipped; this PR @ `52695384`: 534 passed, 19 failed, 17 skipped), only one status changed: `tests/test_longshot_ctl.py`, FAIL on main, passed here. The other 19 failures were main's on this Mac, by name. Trees were clean before and after, and the run took 179 s. - **After the rebase onto main aa95d35f**, at `3b9d3cfa` (`04d947b3` before the rebases onto e090cc48 and aa95d35f): Sweep3's checks of this head (the C/C++ it changes compiled, and its own tests run, on arm64 and x86_64 where they apply) gave the same results as before; `python -I -B tests/run_all.py` on wave S1's merge `11a5b4e7`, which carries this head: 568/22/17 (passed/failed/skipped) against main aa95d35f's 543/33/17 on this Mac, no new failure (`reports/2026-11-15-rebase-sweep-3.md`). **Not tested:** - Linux and Windows. Their paths in `process_start()` are unchanged. `test_copy_save`'s expectation resolves to the same path where `/tmp` is not a link [inference: not run there]. - Rosetta (an x86_64 Python): the layout is the same (checked), but the test was run with arm64 Python only. - A real game session on macOS. - `test_copy_save` on Linux: its launch block (skipped on Windows) now expects `os.path.realpath(run)`; nobody has run it there. **Must be tested:** - Linux, any GPU, any driver: run `python -I -B tests/test_longshot_ctl.py` in a checkout of this PR (head 3b9d3cfa) and of main aa95d35f, expecting `OK` on both (this PR's Darwin test skipped), so `test_copy_save`'s new expectation, the resolved run folder, holds there as main's did (by hand: test request T-PFDX). ## Risks **What could break:** macOS only, in the tool. If sysctl fails or answers with the wrong size, the process reads as dead. That is the same outcome as before this PR, so it fails safe. On Linux `test_copy_save` compares with the resolved run folder, which is the same path unless the test's temporary folder sits behind a link. **Turning it off:** revert the two commits; that restores main. **Compatibility:** nothing changes for a player or on Windows and Linux. On macOS, `longshot_ctl`'s session files store the new identity (`{"clock": "darwin-start-us", …}`); before this PR every macOS session read as dead. Saves, `longshot_options.ini`, the caches and the vk ABI are unchanged. ## Issues See #47 (durable sessions). See #420 (macOS tracking). ## Checklist ### Everyone - [x] One topic. - [x] The title is a Conventional Commit (`type(scope): description`) of the status line's type. - [x] Why gives the reason plainly and links the issues that fit (the tracker searched). - [x] Measurements has a verdict, or one line saying why there is nothing to measure. - [x] Testing names what was tested, what wasn't, and what must still be tested, where and how. - [x] Rebased on current `main`: on aa95d35f (#761, 2026-11-15), head `3b9d3cfa`, without a conflict; this PR's own commits, old → new: `ef712604` → `56f4ca87`, `04d947b3` → `3b9d3cfa`; the commit names elsewhere in this description are from before the rebase. - [x] `python -I -B tests/run_all.py` passes (any failure that also fails on `main` is named). On macOS, after the rebase: 532 passed, 17 skipped, and 31 failures that also fail on `main` (531 passed, 32 failed, 17 skipped at `6c9edffe`); by test name under Testing. After the rebase onto main aa95d35f (head `3b9d3cfa`): wave S1's merge `11a5b4e7`, 568/22/17 against main aa95d35f's 543/33/17, no new failure. - [x] No game files, dumps, build output or generated files. - [x] `third_party/` untouched (a new folder with a `PROVENANCE.md` instead). - [x] The license is OK: GPL-3.0-or-later, nothing incompatible and nothing decompiled. ### When it applies - [x] AI assistance recorded with `Assisted-by:` / `Co-Authored-By:` trailers. - [x] A game-free test added for the fix, failing on `main` and passing here. - [x] A check under `tests/` that reads changed source updated in this PR, not weakened. `tests/test_longshot_ctl.py`: one Darwin test added; `test_copy_save` expects the resolved run folder, the same path as before where `/tmp` is not a link.
process_start() read /proc, so on macOS every session's game, owner and launcher looked dead. On Darwin it now reads sysctl kern.proc.pid through ctypes: the start time (a microsecond struct timeval set at fork, never adjusted) with kern.bootsessionuuid as the boot identity, and a zombie (p_stat SZOMB) or a gone pid is dead, as on Linux. A reused pid has a different start time. Standard library only, no subprocess. Linux and Windows paths unchanged.

Assisted-by: Claude Opus 5.5
Co-Authored-By: Claude Opus 5.5 <[email protected]>
test(control): compare launch's data folder with the resolved run folder
All checks were successful
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Has been skipped
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Has been skipped
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Has been skipped
Third-party parts / The same as upstream (pull_request) Has been skipped
PR description / Description follows the template (pull_request_target) Successful in 4s
CI / Conventional Commit title (pull_request) Successful in 3s
CI / Workflow lint (actionlint) (pull_request) Successful in 5s
Third-party parts / As their notes say (pull_request) Successful in 8s
Website / Website on Cloudflare (pull_request_target) Has been skipped
526953848f
launch resolves --run (Path.resolve), and macOS's /tmp is a link to /private/tmp, so test_copy_save now resolves its expected run folder too. No platform case: on Linux the resolved path is the same.

Assisted-by: Claude Opus 5.5
Co-Authored-By: Claude Opus 5.5 <[email protected]>
mooki force-pushed mac/longshot-ctl-darwin from 526953848f
All checks were successful
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Has been skipped
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Has been skipped
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Has been skipped
Third-party parts / The same as upstream (pull_request) Has been skipped
PR description / Description follows the template (pull_request_target) Successful in 4s
CI / Conventional Commit title (pull_request) Successful in 3s
CI / Workflow lint (actionlint) (pull_request) Successful in 5s
Third-party parts / As their notes say (pull_request) Successful in 8s
Website / Website on Cloudflare (pull_request_target) Has been skipped
to 04d947b356
All checks were successful
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Has been skipped
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Has been skipped
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Has been skipped
Third-party parts / The same as upstream (pull_request) Has been skipped
Website / Website on Cloudflare (pull_request) Has been skipped
CI / Conventional Commit title (pull_request) Successful in 4s
CI / Workflow lint (actionlint) (pull_request) Successful in 6s
Third-party parts / As their notes say (pull_request) Successful in 9s
PR description / Description follows the template (pull_request_target) Successful in 4s
2026-11-15 00:34:45 +00:00
Compare
mooki force-pushed mac/longshot-ctl-darwin from 04d947b356
All checks were successful
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Has been skipped
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Has been skipped
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Has been skipped
Third-party parts / The same as upstream (pull_request) Has been skipped
Website / Website on Cloudflare (pull_request) Has been skipped
CI / Conventional Commit title (pull_request) Successful in 4s
CI / Workflow lint (actionlint) (pull_request) Successful in 6s
Third-party parts / As their notes say (pull_request) Successful in 9s
PR description / Description follows the template (pull_request_target) Successful in 4s
to bcde1195e1
Some checks failed
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Has been skipped
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Has been skipped
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Has been skipped
Third-party parts / The same as upstream (pull_request) Has been skipped
Website / Website on Cloudflare (pull_request) Has been skipped
CI / Conventional Commit title (pull_request) Successful in 4s
CI / Workflow lint (actionlint) (pull_request) Successful in 6s
Guide screenshots / Guide images and local UI source review (pull_request) Failing after 6s
PR description / Description follows the template (pull_request_target) Successful in 4s
Third-party parts / As their notes say (pull_request) Successful in 10s
2026-11-15 07:14:24 +00:00
Compare
mooki force-pushed mac/longshot-ctl-darwin from bcde1195e1
Some checks failed
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Has been skipped
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Has been skipped
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Has been skipped
Third-party parts / The same as upstream (pull_request) Has been skipped
Website / Website on Cloudflare (pull_request) Has been skipped
CI / Conventional Commit title (pull_request) Successful in 4s
CI / Workflow lint (actionlint) (pull_request) Successful in 6s
Guide screenshots / Guide images and local UI source review (pull_request) Failing after 6s
PR description / Description follows the template (pull_request_target) Successful in 4s
Third-party parts / As their notes say (pull_request) Successful in 10s
to 3b9d3cfa2a
Some checks failed
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Has been skipped
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Has been skipped
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Has been skipped
Third-party parts / The same as upstream (pull_request) Has been skipped
Website / Website on Cloudflare (pull_request) Has been skipped
CI / Conventional Commit title (pull_request) Successful in 4s
CI / Workflow lint (actionlint) (pull_request) Successful in 7s
Guide screenshots / Guide images and local UI source review (pull_request) Failing after 7s
Third-party parts / As their notes say (pull_request) Successful in 8s
PR description / Description follows the template (pull_request_target) Successful in 4s
2026-11-15 13:09:43 +00:00
Compare
mooki changed title from WIP: fix(control): keep command-line sessions alive on macOS to fix(control): keep command-line sessions alive on macOS 2026-11-15 14:13:49 +00:00
Author
Member

Folded into #845 (feat(macos): run the host on macOS: build, runtime, control, crash records and the Vulkan loader)

Folded into #845 (feat(macos): run the host on macOS: build, runtime, control, crash records and the Vulkan loader)
mooki closed this pull request 2026-11-15 18:07:37 +00:00
Some checks failed
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Has been skipped
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Has been skipped
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Has been skipped
Third-party parts / The same as upstream (pull_request) Has been skipped
Website / Website on Cloudflare (pull_request) Has been skipped
CI / Conventional Commit title (pull_request) Successful in 4s
CI / Workflow lint (actionlint) (pull_request) Successful in 7s
Guide screenshots / Guide images and local UI source review (pull_request) Failing after 7s
Third-party parts / As their notes say (pull_request) Successful in 8s
PR description / Description follows the template (pull_request_target) Successful in 4s

Pull request closed

Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
MagicBeanDev/Longshot!516
No description provided.