WIP: feat(runtime): keep local crash and unclean-end records #75

Draft
mooki wants to merge 6 commits from mooki/Longshot:feat/crash-record into main
First-time contributor

Why

Keep a small local record when the game crashes, and distinguish that from a run ended by power loss or forced termination. Nothing is sent, no browser opens, and an optional private Windows dump stays outside ordinary attachments.

Draft: the new Longshot lifecycle proof works, but overhead and two interleaved comparisons are not measured. The ordinary branch control also took longer than main under different shared load: 40.6 versus 37.6 seconds, including startup. This is not a controlled performance result. Early captures on both builds show incomplete world geometry while shaders compile; they are not rendering-quality proof.

What changed

  • host/hos_crash_record.c: prepare the file, marker, privacy snapshot and bounded storage at startup; finish the independent text before the existing best-effort crash logging. Keep the existing CRASH lines and flush sites unchanged.
  • host/mkw_glue.c, host/posix/win32_posix.c and host/hos_thread.c: collect fatal exceptions/signals and host/renderer fatal exits. Real hardware faults re-fault with their original information; externally delivered signals are re-raised. No product core-dump setting changes.
  • Explicit normal exits remove only their own running marker. The next start turns an unlocked unfinished marker into an unclean-end, not crash, record. Startup retains the newest 15 crash/unclean texts; a subsequent crash adds one. Other files, stall records and private dumps are untouched.
  • Shared privacy, run-id and nonblocking DbgHelp support will be reused by the separately stacked freeze recorder. No second copy and no renderer interface change.
  • Preserve current main's Forgejo Bug report link, Auto preset and live Debug settings. This does not connect pending records to a launcher inbox or replace the menu's existing report writer.
  • Carry the original game-free fixtures and document three new Longshot runs. Earlier runs remain explicitly labelled historical Hookshot.
  • Main removed the in-game updater, so its two clean-exit hooks were removed with it; the test now inventories only the remaining exits and rejects accidentally restoring the updater.

Flags and settings

Flag What it does Default now Recommendation Helps on Doesn't help on Untested on
HOS_CRASH_MINIDUMP New: Ask a startup-created Windows worker for a filtered local-only dump after durable text; a request can fail or time out Off Off by default: stacks can contain private or game data; never attach the dump Developer-owned Windows exception investigation Linux; non-exception fatal exits Longshot Windows gameplay and typical dump size (should help on: Windows, subject to maintainer review)

The text record and running marker are always enabled when their local folder is writable; no text-recorder off switch is added. No menu row or saved option changes. Test crashes are external signals, not a new shareable-setting switch.

Measurements

Branch state: on main 77f605a25f175fbda9ad131ac6be96bbde85d9c2; head 6987a643e8a8ce70ae4226790105320016b7737a; whole game-free suite on this head: 513 passed, 0 failed, 19 skipped (main 77f605a25f175fbda9ad131ac6be96bbde85d9c2: 509 passed, 0 failed, 19 skipped); rebasing also removes the obsolete updater hooks and updates the exit inventory as described above; the remaining commits are unchanged apart from the results table.

main: d4a69456c9 (2026-11-12)
this PR: feat/crash-record @ d3374133aa2f38c457feb6f72cabb8add1c1e95e
Hardware: RTX 4090 24 GB, NVIDIA 615.78.08, Core i9-13900K, 93 GB visible RAM, Arch Linux 7.2.15-1-omarchy
Scene: copied child save in Kokiri Forest; 1920x1080 output, 1280x720 capture, cap 60, DLSS off, shader precompile off; windowless
Method: one ordinary main run, one ordinary branch run and exactly one deliberate branch SIGSEGV, 2026-11-13 UTC. Wait for known non-loading, non-event gameplay and 30 further presents; capture, then quit or signal the verified original game thread. The crash was authorized, launched when no other test game was running or waiting, and sent at 01:11:51 UTC. These are local-record correctness checks under shared CPU load, not timing measurements.
How to reproduce: on a disposable copy, load a copied save with precompile off; quit normally and check that no pending record or running marker remains. For a deliberate-crash test only, obtain local operator approval before sending SIGSEGV to that copy's verified game thread; inspect the newly completed text and match its run id to the log. Never do this to a player's live game.

main @ d4a69456 this PR @ d3374133
Ordinary control exit 0 0
New pending records after ordinary control 0 0
Deliberate fatal-signal test Not run Exit 139; exactly 1 complete text
Crash text size Not applicable 1811 bytes
Guest registers / guest frames / partial host frames Not applicable 32 / 13 / 2
Kernel faults / NVRM lines, each run 0 / 0 0 / 0
Ordinary control duration, startup included 37.6 s 40.6 s

Since the measured run, main gained script/document/test changes and then the DLSS preset-settling fix. The retained game proof used RX_VK_DLSS=0, so it does not enter the changed DLSS path. The crash writer and signal paths are unchanged; the later release-tooling merge removed the in-game updater and therefore its now-unused clean-exit hooks. Both independent results rows were kept. The measured binaries/commits remain labelled above, not relabelled as newly run builds. No second deliberate crash or main build was run.

Inspected record excerpt, with run id, process id and guest diagnostics omitted from this public excerpt:

Longshot crash record 1
version: v2.2.0-rc.1-24-gd3374133a (source 6b448573)
when: 20261113T011151Z
reason: fatal signal
thread: sead::MainThread
last_present_age_ms: unknown
signal: 11
signal_code: -6
host_backtrace_method: frame pointer; may be partial
host_backtrace: libc.so.6+0xa08f2
host_backtrace: longshot+0x1b3c1814
dump: off
record_complete: yes

Both host offsets match the existing CRASH log. The complete local text passed checks for the username, home, hostname, Windows paths and IPv4 addresses; no save, environment value, memory-near-register row or raw stack-byte file is included. A text record still needs human inspection before sharing. The operating system may keep its own core; no core was extracted or uploaded.

The whole strict suite passes on the exact head in Branch state, after the rebase and exit-inventory adaptation. The old updater digest test was removed by main together with the old updater; its earlier missing-.NET failure is not a failure of the current suite. No surviving test was weakened and no package was installed.

For the Windows target, 8 translation units compile, 0 fail, 0 drivers are unjudged. Windows execution remains not tested.

Historical Hookshot evidence: the local source branch had 509 passing tests, the same one .NET prerequisite failure and 20 declared skips. Combined GitHub fork checkpoint 68f1769d9 included crash checkpoint d15927fd and passed both systems; it did not cover the later ELF-offset/thread-label corrections or this Longshot head. Those later corrections passed the retained native and Windows-target fixtures, not a new native Windows game run.

Testing

Tested: the whole game-free suite passes on the exact head. Eight translation units compile for the Windows target, with no failures or unjudged drivers; not run on Windows. On Linux/NVIDIA, ordinary startup/gameplay/control quit produced no record, and one deliberate fatal signal produced a complete record with privacy/legacy-log agreement. These functional checks were not performance measurements.

Not tested: Longshot Windows execution/full host build, real Windows exception/minidump behavior, typical game-dump size, corrupted loader/heap outcomes, AMD/Intel game runs, a real window, complete optimized unwinding, new SIGKILL/restart proof, or overhead. This machine's available runtime proof is Linux/NVIDIA. Earlier SIGKILL/restart evidence is historical Hookshot, not relabelled as a Longshot run. One run per condition is not the required two interleaved pairs. The normal text path has no off toggle; a future cost comparison needs main versus this branch, with the private dump disabled.

Needs other testers:

  • Windows: run the changed fixtures and an operator-approved disposable exception case, expecting one complete text record, no false record after normal quit, and private dumps disabled by default (request to open).
  • AMD/Intel Linux and Steam Deck: exercise ordinary startup/quit and a locally approved crash test, expecting correct record attribution and no private paths in the text (request to open).

Screenshots

Nothing on screen: the record is a text file; an excerpt is under Measurements. The capture taken just before the deliberate fault is kept with the run, not shown: it was taken while shaders were still compiling and shows incomplete scenery on both builds, which says nothing about this change.

Risk and rollback

A damaged process can still fail to write a record; checked frame-pointer traces may stop early. Disk errors or a read-only directory disable the record without stopping play. A renamed renderer fatal-prefix line could stop its classification. SIGTERM, logout and timeouts deliberately count only as an unclean end, not a crash. Windows dump filters do not guarantee privacy. Leave HOS_CRASH_MINIDUMP unset; reverting this topic removes text recording and lifecycle hooks.

Reviewer notes

Read the bounded writer and its startup-owned storage first, then the explicit exit inventory and Linux signal adapter. Existing log flushing is intentionally not replaced by a try-lock drain. The later freeze branch is stacked on this shared support; launcher import, pending-record menu integration and any sending/consent UI are separate work.

Issues

See #44

Checklist

For everyone

  • One topic.
  • The title is a Conventional Commit (type(scope): description).
  • Rebased on current main. — The tested base is named in Branch state; a later refresh is deferred to opening time.
  • python -I -B tests/run_all.py run and passing (any failure that also fails on main is named above).
  • Tested in the game, or what wasn't is named under Testing.
  • Testing filled in: what was tested, what wasn't, and what needs other testers (with test requests).
  • Measured: main and this PR at named commits, on the same PC, scene and settings, at least 2 interleaved runs each, the median reported.
  • 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.

If applicable

  • AI assistance recorded with Assisted-by: / Co-Authored-By: trailers.
  • Flags noted, and the switch reference updated (docs/development.md, the README).
  • A row in docs/tested-configurations.md for each measured run.
  • A check under tests/ that reads changed source updated in this PR, not weakened.
  • Host code builds on both Windows (llvm-mingw) and Linux, with UTF-8 paths.
  • Docs updated.

New on this forge; not opened on GitHub.

Assisted-by: GPT-6 Astra
Co-Authored-By: GPT-6 Astra [email protected]

## Why Keep a small local record when the game crashes, and distinguish that from a run ended by power loss or forced termination. Nothing is sent, no browser opens, and an optional private Windows dump stays outside ordinary attachments. **Draft: the new Longshot lifecycle proof works, but overhead and two interleaved comparisons are not measured.** The ordinary branch control also took longer than main under different shared load: 40.6 versus 37.6 seconds, including startup. This is not a controlled performance result. Early captures on both builds show incomplete world geometry while shaders compile; they are not rendering-quality proof. ## What changed - `host/hos_crash_record.c`: prepare the file, marker, privacy snapshot and bounded storage at startup; finish the independent text before the existing best-effort crash logging. Keep the existing CRASH lines and flush sites unchanged. - `host/mkw_glue.c`, `host/posix/win32_posix.c` and `host/hos_thread.c`: collect fatal exceptions/signals and host/renderer fatal exits. Real hardware faults re-fault with their original information; externally delivered signals are re-raised. No product core-dump setting changes. - Explicit normal exits remove only their own running marker. The next start turns an unlocked unfinished marker into an **unclean-end**, not crash, record. Startup retains the newest 15 crash/unclean texts; a subsequent crash adds one. Other files, stall records and private dumps are untouched. - Shared privacy, run-id and nonblocking DbgHelp support will be reused by the separately stacked freeze recorder. No second copy and no renderer interface change. - Preserve current main's Forgejo Bug report link, Auto preset and live Debug settings. This does not connect pending records to a launcher inbox or replace the menu's existing report writer. - Carry the original game-free fixtures and document three new Longshot runs. Earlier runs remain explicitly labelled historical Hookshot. - Main removed the in-game updater, so its two clean-exit hooks were removed with it; the test now inventories only the remaining exits and rejects accidentally restoring the updater. ## Flags and settings | Flag | What it does | Default now | Recommendation | Helps on | Doesn't help on | Untested on | |---|---|---|---|---|---|---| | `HOS_CRASH_MINIDUMP` | New: Ask a startup-created Windows worker for a filtered local-only dump after durable text; a request can fail or time out | Off | Off by default: stacks can contain private or game data; never attach the dump | Developer-owned Windows exception investigation | Linux; non-exception fatal exits | Longshot Windows gameplay and typical dump size (should help on: Windows, subject to maintainer review) | The text record and running marker are always enabled when their local folder is writable; no text-recorder off switch is added. No menu row or saved option changes. Test crashes are external signals, not a new shareable-setting switch. ## Measurements <!-- branch-state --> Branch state: on main `77f605a25f175fbda9ad131ac6be96bbde85d9c2`; head `6987a643e8a8ce70ae4226790105320016b7737a`; whole game-free suite on this head: `513 passed, 0 failed, 19 skipped` (main `77f605a25f175fbda9ad131ac6be96bbde85d9c2`: `509 passed, 0 failed, 19 skipped`); rebasing also removes the obsolete updater hooks and updates the exit inventory as described above; the remaining commits are unchanged apart from the results table. <!-- /branch-state --> main: d4a69456c9de5131589af1fcf9a09adba4c403d1 (2026-11-12) this PR: feat/crash-record @ d3374133aa2f38c457feb6f72cabb8add1c1e95e Hardware: RTX 4090 24 GB, NVIDIA 615.78.08, Core i9-13900K, 93 GB visible RAM, Arch Linux 7.2.15-1-omarchy Scene: copied child save in Kokiri Forest; 1920x1080 output, 1280x720 capture, cap 60, DLSS off, shader precompile off; windowless Method: one ordinary main run, one ordinary branch run and exactly one deliberate branch SIGSEGV, 2026-11-13 UTC. Wait for known non-loading, non-event gameplay and 30 further presents; capture, then quit or signal the verified original game thread. The crash was authorized, launched when no other test game was running or waiting, and sent at 01:11:51 UTC. These are local-record correctness checks under shared CPU load, not timing measurements. How to reproduce: on a disposable copy, load a copied save with precompile off; quit normally and check that no pending record or running marker remains. For a deliberate-crash test only, obtain local operator approval before sending SIGSEGV to that copy's verified game thread; inspect the newly completed text and match its run id to the log. Never do this to a player's live game. | | main @ d4a69456 | this PR @ d3374133 | |---|---|---| | Ordinary control exit | 0 | 0 | | New pending records after ordinary control | 0 | 0 | | Deliberate fatal-signal test | Not run | Exit 139; exactly 1 complete text | | Crash text size | Not applicable | 1811 bytes | | Guest registers / guest frames / partial host frames | Not applicable | 32 / 13 / 2 | | Kernel faults / NVRM lines, each run | 0 / 0 | 0 / 0 | | Ordinary control duration, startup included | 37.6 s | 40.6 s | Since the measured run, main gained script/document/test changes and then the DLSS preset-settling fix. The retained game proof used `RX_VK_DLSS=0`, so it does not enter the changed DLSS path. The crash writer and signal paths are unchanged; the later release-tooling merge removed the in-game updater and therefore its now-unused clean-exit hooks. Both independent results rows were kept. The measured binaries/commits remain labelled above, not relabelled as newly run builds. No second deliberate crash or main build was run. Inspected record excerpt, with run id, process id and guest diagnostics omitted from this public excerpt: ```text Longshot crash record 1 version: v2.2.0-rc.1-24-gd3374133a (source 6b448573) when: 20261113T011151Z reason: fatal signal thread: sead::MainThread last_present_age_ms: unknown signal: 11 signal_code: -6 host_backtrace_method: frame pointer; may be partial host_backtrace: libc.so.6+0xa08f2 host_backtrace: longshot+0x1b3c1814 dump: off record_complete: yes ``` Both host offsets match the existing CRASH log. The complete local text passed checks for the username, home, hostname, Windows paths and IPv4 addresses; no save, environment value, memory-near-register row or raw stack-byte file is included. A text record still needs human inspection before sharing. The operating system may keep its own core; no core was extracted or uploaded. The whole strict suite passes on the exact head in Branch state, after the rebase and exit-inventory adaptation. The old updater digest test was removed by main together with the old updater; its earlier missing-.NET failure is not a failure of the current suite. No surviving test was weakened and no package was installed. For the Windows target, **8 translation units compile, 0 fail, 0 drivers are unjudged**. Windows execution remains not tested. Historical Hookshot evidence: the local source branch had 509 passing tests, the same one .NET prerequisite failure and 20 declared skips. Combined GitHub fork checkpoint `68f1769d9` included crash checkpoint `d15927fd` and passed both systems; it did not cover the later ELF-offset/thread-label corrections or this Longshot head. Those later corrections passed the retained native and Windows-target fixtures, not a new native Windows game run. ## Testing **Tested:** the whole game-free suite passes on the exact head. Eight translation units compile for the Windows target, with no failures or unjudged drivers; not run on Windows. On Linux/NVIDIA, ordinary startup/gameplay/control quit produced no record, and one deliberate fatal signal produced a complete record with privacy/legacy-log agreement. These functional checks were not performance measurements. **Not tested:** Longshot Windows execution/full host build, real Windows exception/minidump behavior, typical game-dump size, corrupted loader/heap outcomes, AMD/Intel game runs, a real window, complete optimized unwinding, new SIGKILL/restart proof, or overhead. This machine's available runtime proof is Linux/NVIDIA. Earlier SIGKILL/restart evidence is historical Hookshot, not relabelled as a Longshot run. One run per condition is not the required two interleaved pairs. The normal text path has no off toggle; a future cost comparison needs main versus this branch, with the private dump disabled. **Needs other testers:** - Windows: run the changed fixtures and an operator-approved disposable exception case, expecting one complete text record, no false record after normal quit, and private dumps disabled by default (request to open). - AMD/Intel Linux and Steam Deck: exercise ordinary startup/quit and a locally approved crash test, expecting correct record attribution and no private paths in the text (request to open). ## Screenshots Nothing on screen: the record is a text file; an excerpt is under Measurements. The capture taken just before the deliberate fault is kept with the run, not shown: it was taken while shaders were still compiling and shows incomplete scenery on both builds, which says nothing about this change. ## Risk and rollback A damaged process can still fail to write a record; checked frame-pointer traces may stop early. Disk errors or a read-only directory disable the record without stopping play. A renamed renderer fatal-prefix line could stop its classification. SIGTERM, logout and timeouts deliberately count only as an unclean end, not a crash. Windows dump filters do not guarantee privacy. Leave `HOS_CRASH_MINIDUMP` unset; reverting this topic removes text recording and lifecycle hooks. ## Reviewer notes Read the bounded writer and its startup-owned storage first, then the explicit exit inventory and Linux signal adapter. Existing log flushing is intentionally not replaced by a try-lock drain. The later freeze branch is stacked on this shared support; launcher import, pending-record menu integration and any sending/consent UI are separate work. ## Issues See #44 ## Checklist ### For everyone - [x] One topic. - [x] The title is a Conventional Commit (`type(scope): description`). - [ ] Rebased on current `main`. — The tested base is named in Branch state; a later refresh is deferred to opening time. - [x] `python -I -B tests/run_all.py` run and passing (any failure that also fails on `main` is named above). - [x] Tested in the game, or what wasn't is named under Testing. - [x] Testing filled in: what was tested, what wasn't, and what needs other testers (with test requests). - [ ] Measured: main and this PR at named commits, on the same PC, scene and settings, at least 2 interleaved runs each, the median reported. - [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. ### If applicable - [x] AI assistance recorded with `Assisted-by:` / `Co-Authored-By:` trailers. - [x] Flags noted, and the switch reference updated (docs/development.md, the README). - [x] A row in `docs/tested-configurations.md` for each measured run. - [x] A check under `tests/` that reads changed source updated in this PR, not weakened. - [ ] Host code builds on both Windows (llvm-mingw) and Linux, with UTF-8 paths. - [x] Docs updated. --- New on this forge; not opened on GitHub. Assisted-by: GPT-6 Astra Co-Authored-By: GPT-6 Astra <[email protected]>
Write bounded diagnostic records before legacy crash logging. Keep each run distinct across log rotation, recover only unlocked stale markers, and make filtered Windows dumps opt-in and local-only.

Assisted-by: GPT-6 Astra
Co-Authored-By: GPT-6 Astra <[email protected]>
Keep legacy flush behavior and real-fault core siginfo. Retain the newest fifteen pending crash/unclean records at startup, describe external termination honestly, and capture the shared device-lost prefix before later diagnostic queries.

Assisted-by: GPT-6 Astra
Co-Authored-By: GPT-6 Astra <[email protected]>
Keep namespace-qualified thread names without admitting IPv6 or identities. Resolve Linux frames relative to the offset-zero module mapping, matching the existing CRASH log even when ELF load segments contain gaps.

Assisted-by: GPT-6 Astra
Co-Authored-By: GPT-6 Astra <[email protected]>
Record the final signal proof and the unchanged carried kill/restart lifecycle evidence, including partial unwinding and privacy limits.

Assisted-by: GPT-6 Astra
Co-Authored-By: GPT-6 Astra <[email protected]>
Keep historical Hookshot evidence labelled; record the ordinary controls and one deliberate signal without a performance or visual-quality claim.

Assisted-by: GPT-6 Astra
Co-Authored-By: GPT-6 Astra <[email protected]>
Author
First-time contributor

Wording only: removed sentences about how my local test tooling ran the suite; they were of no use to a reviewer. The results are unchanged.

Wording only: removed sentences about how my local test tooling ran the suite; they were of no use to a reviewer. The results are unchanged.
Author
First-time contributor

Rebased onto the release-tooling change that removed the in-game updater, so its two clean-exit hooks were removed with it. The test still inventories every remaining host exit and now rejects accidentally restoring the removed updater. The Linux crash proof remains labelled with the build actually run; this is still work in progress pending overhead measurements and other-platform testing.

Rebased onto the release-tooling change that removed the in-game updater, so its two clean-exit hooks were removed with it. The test still inventories every remaining host exit and now rejects accidentally restoring the removed updater. The Linux crash proof remains labelled with the build actually run; this is still work in progress pending overhead measurements and other-platform testing.
mooki force-pushed feat/crash-record from a4bd549f21 to 6987a643e8
Some checks are pending
Linux AppImage / appimage (pull_request) Blocked by required conditions
Windows builder / Longshot Builder zip (pull_request) Blocked by required conditions
Windows builder / Windows Vulkan back end (llvm-mingw) (pull_request) Blocked by required conditions
Windows builder / dav1d for Windows (llvm-mingw) (pull_request) Blocked by required conditions
CI / Conventional Commit title (pull_request) Blocked by required conditions
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Blocked by required conditions
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Blocked by required conditions
CI / Python source checks (windows-2022, part 1/2) (pull_request) Blocked by required conditions
CI / Python source checks (windows-2022, part 2/2) (pull_request) Blocked by required conditions
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Blocked by required conditions
CI / Workflow lint (actionlint) (pull_request) Blocked by required conditions
Third-party parts / As their notes say (pull_request) Blocked by required conditions
Third-party parts / The same as upstream (pull_request) Blocked by required conditions
Vulkan back end with NVIDIA DLSS / Windows Vulkan back end with NVIDIA DLSS and AMD FSR 4 (llvm-mingw, link check) (pull_request) Blocked by required conditions
PR description / Description follows the template (pull_request_target) Waiting to run
2026-11-13 02:28:25 +00:00
Compare
Some checks are pending
Linux AppImage / appimage (pull_request) Blocked by required conditions
Windows builder / Longshot Builder zip (pull_request) Blocked by required conditions
Windows builder / Windows Vulkan back end (llvm-mingw) (pull_request) Blocked by required conditions
Windows builder / dav1d for Windows (llvm-mingw) (pull_request) Blocked by required conditions
CI / Conventional Commit title (pull_request) Blocked by required conditions
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Blocked by required conditions
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Blocked by required conditions
CI / Python source checks (windows-2022, part 1/2) (pull_request) Blocked by required conditions
CI / Python source checks (windows-2022, part 2/2) (pull_request) Blocked by required conditions
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Blocked by required conditions
CI / Workflow lint (actionlint) (pull_request) Blocked by required conditions
Third-party parts / As their notes say (pull_request) Blocked by required conditions
Third-party parts / The same as upstream (pull_request) Blocked by required conditions
Vulkan back end with NVIDIA DLSS / Windows Vulkan back end with NVIDIA DLSS and AMD FSR 4 (llvm-mingw, link check) (pull_request) Blocked by required conditions
PR description / Description follows the template (pull_request_target) Waiting to run
This pull request is marked as a work in progress.
Some workflows are waiting to be reviewed.
This branch is out-of-date with the base branch
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u 'feat/crash-record:mooki-feat/crash-record'
git switch 'mooki-feat/crash-record'
Sign in to join this conversation.
No description provided.