fix(vk): a driver update warms the noted pipelines again before the game, not in play #789

Open
dyst wants to merge 1 commit from dyst/Longshot:fix/warm-after-driver-update into main
Member

Type: fix · Risk: low · Tested on: Windows 11 (game-free checks) · Needs: Windows or Linux, a GPU with mesh shaders (NVIDIA RTX, AMD RDNA 2 or later), a driver update

Why

After a GPU driver update, the first start of the game is laggy and stutters while it compiles pipelines in play; only the start after that is smooth. A player reported this in MagicBeanDev/LongshotLauncher#90.

The cause: a driver update changes the driver's pipelineCacheUUID, so our pipeline cache file is refused and the cache starts empty. But the marker that says "every noted pipeline is built into the cache" stays. With RX_VK_LOAD=create, the default on GPUs with mesh shaders, that start skips the warm-up and compiles the noted pipelines in play. Project ReLink, a fork of Longshot, found the same gap (db54a4bc, aabc7ad8).

How to reproduce

Seen on: Windows, an NVIDIA RTX card, after a driver update
Settings and switches: defaults (RX_VK_LOAD=create on a GPU with mesh shaders)
Steps: play once so the noted pipelines are warmed, update the GPU driver, start the game again, walk into the Market
Expected: a warm-up before the title (the start-up screen counts the pipelines), then smooth play
Actual: no warm-up, and stutter in play while the pipelines compile; the log has vk: pipeline cache ... (0 KB) with the old file still in cache\

What changed

A pipeline cache file that the driver refuses now removes the pipelines' marker too, as a file dropped for another translator already did. So the start after a driver update warms again before the game.

  • gpu/vk/vk_draw.cpp pcache_init: notes a file that was there but couldn't be taken (pcache_file_rejected), and logs it (vk: pipeline cache: ... was made for another driver or GPU).
  • gpu/vk/vk_draw.cpp precompile_run: reads the cache (pcache_init()) before it looks at the marker, and removes the marker when the file was dropped or refused.
  • tests: tests/test_pcache_stamp.py checks the order and the removal. tests/test_warm_bounded.py and tests/pipeline_play_cache_test.cpp follow the changed source.

Measurements

Not measured: what changes is which start warms the pipelines, not the frame. The game-free checks under Testing show the order. A tester's first start after a driver update is the measurement: whether there's a warm-up, and whether the Market stutters.

Flags and settings

None.

Testing

Tested:

  • Rebased onto main @ 7bacf846 (this PR @ a157ea71): the 113 checks that read this diff (listed below), not the whole suite, through tests/run_all.py --jobs 6 on Windows 11 with the Builder's llvm-mingw (v2.0.14 tools): 99 passed, 3 failed, 11 skipped for want of the Vulkan headers; those 11 again with RX_CPM set to the Builder's CPM cache: all 11 pass. The 3 failures also fail on main @ 7bacf846, with the same message: test_linux_driver_fault_guard (POSIX signals), test_pipeline_tour and test_vk_occlusion_queries. (The full suite on main @ 1310ecc6: 500 passed, 17 failed, 79 skipped.)

    The 113 checks
    • nx2/test_cbuf_table_extent.py
    • nx2/test_dump_ssbo_read.py
    • nx2/test_mesh_dynamic_state.py
    • tests/test_bake_ds.py
    • tests/test_bank_gen.py
    • tests/test_bc_raw_targets.py
    • tests/test_check_pr_description.py
    • tests/test_desc_clock.py
    • tests/test_desc_counts.py
    • tests/test_dev_packs.py
    • tests/test_device_lost_exit.py
    • tests/test_dispatch_clock.py
    • tests/test_dlss_checks.py
    • tests/test_draw_binds.py
    • tests/test_draw_side_effects.py
    • tests/test_draw_stream_visibility.py
    • tests/test_drawn_page_map.py
    • tests/test_driver_cache_room.py
    • tests/test_driver_faults.py
    • tests/test_dummy_views.py
    • tests/test_equal_depth_margin.py
    • tests/test_fallback_buffer_cleanup.py
    • tests/test_fallback_depth_hold.py
    • tests/test_fallback_loaded.py
    • tests/test_fallback_pipeline_state.py
    • tests/test_fallback_size_policy.py
    • tests/test_flat_map.py
    • tests/test_framegen_preset.py
    • tests/test_fsr_uniform_ownership.py
    • tests/test_gpl_cold_library.py
    • tests/test_gpl_library_cache.py
    • tests/test_handle_lookup.py
    • tests/test_handle_table_arrays.py
    • tests/test_intel_compiler_gate.py
    • tests/test_intel_quick_compute.py
    • tests/test_jobs_failure.py
    • tests/test_jobs_wait_runs_queued.py
    • tests/test_linux_driver_fault_guard.py
    • tests/test_linux_pressure.py
    • tests/test_load_default.py
    • tests/test_masked_clear_failure.py
    • tests/test_mem_trim.py
    • tests/test_menu_env_on.py
    • tests/test_mesh_args_cleanup.py
    • tests/test_mesh_fallback.py
    • tests/test_mesh_fallback_failed_once.py
    • tests/test_mesh_query_feature.py
    • tests/test_module_ids.py
    • tests/test_parallel_dry_marks.py
    • tests/test_parallel_rb_refresh.py
    • tests/test_pass_hazard.py
    • tests/test_pcache_fetch_lock.py
    • tests/test_pcache_header_read.py
    • tests/test_pcache_stamp.py
    • tests/test_pipeline_cache_save.py
    • tests/test_pipeline_notes_open.py
    • tests/test_pipeline_play_cache.py
    • tests/test_pipeline_share.py
    • tests/test_pipeline_state_computes.py
    • tests/test_pipeline_state_counts.py
    • tests/test_pipeline_state_portable.py
    • tests/test_pipeline_states.py
    • tests/test_pipeline_tour.py
    • tests/test_precompile_compute_guard.py
    • tests/test_precompile_pipeline_cleanup.py
    • tests/test_predict_resume.py
    • tests/test_predict_types.py
    • tests/test_predicted_check.py
    • tests/test_prepare_cache_save.py
    • tests/test_prepare_cpus.py
    • tests/test_prepare_seed_stamp.py
    • tests/test_prepare_stall.py
    • tests/test_prepare_workers.py
    • tests/test_prepared_stamps.py
    • tests/test_prof_sampling.py
    • tests/test_program_cache_format.py
    • tests/test_program_cache_one_variant.py
    • tests/test_program_cache_reader.py
    • tests/test_psychov35_dlss.py
    • tests/test_psychov35_taau.py
    • tests/test_push_state.py
    • tests/test_quick_pipelines.py
    • tests/test_radv_mesh_optimizer.py
    • tests/test_reactive_mask.py
    • tests/test_recomplauncher_json.py
    • tests/test_recorder_own_idle.py
    • tests/test_recording_admission.py
    • tests/test_replay_copies.py
    • tests/test_rumble_menu.py
    • tests/test_same_draw.py
    • tests/test_same_dyn.py
    • tests/test_sampler_admission.py
    • tests/test_shader_module_guard.py
    • tests/test_shader_stamp_cache.py
    • tests/test_shader_stamp_inputs.py
    • tests/test_shadow_mask_guard.py
    • tests/test_startup_progress.py
    • tests/test_state_list_plain.py
    • tests/test_taau_env_lookup.py
    • tests/test_taau_fxaa.py
    • tests/test_taau_typed_dispatch.py
    • tests/test_table_track.py
    • tests/test_texture_handle_banks.py
    • tests/test_texture_squeeze.py
    • tests/test_third_party_objects.py
    • tests/test_tls_objects.py
    • tests/test_tree_shadow_mask.py
    • tests/test_ub_threads.py
    • tests/test_upscale_fallback.py
    • tests/test_upscaler_rows.py
    • tests/test_vertex_bind.py
    • tests/test_vk_occlusion_queries.py
    • tests/test_warm_bounded.py
  • tests/run_all.py pcache fallback_loaded pipeline_notes_open gpl_library pipeline_play_cache mesh_fallback warm precompile prepare on Windows: 19 passed. test_make_game_prepare fails, as it does on a clean main on this PC.

  • vk_draw.cpp compiles with the build's flags: the same three __try errors as main, from a flag my check lacks, nothing else.

Not tested:

  • A start after a real driver update.

Must be tested:

  • Windows, NVIDIA RTX (or any GPU with mesh shaders):

    1. Play once.
    2. Update the driver, or with the game closed, change a byte inside cache\longshot_vk_pipelines.bin's header to stand in for one.
    3. Start the game again.

    Expect vk: pipeline cache: ... was made for another driver or GPU in the log and a warm-up before the title, then no compiles in play (by hand).

Risks

What could break: a start whose cache file is refused now warms the noted pipelines before the game. That can take minutes on a slow PC, once, where play would have stuttered instead. A damaged file counts as refused too, and the same holds.

Turning it off: revert the commit.

Compatibility: nothing changes for a player until their driver changes; the caches and saves are untouched.

Issues

See MagicBeanDev/LongshotLauncher#90 (laggy first start after an NVIDIA driver update).

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.
  • python -I -B tests/run_all.py passes (any failure that also fails on main is named).
  • 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 check under tests/ that reads changed source updated in this PR, not weakened.

🤖 Generated with Claude Code

**Type:** fix · **Risk:** low · **Tested on:** Windows 11 (game-free checks) · **Needs:** Windows or Linux, a GPU with mesh shaders (NVIDIA RTX, AMD RDNA 2 or later), a driver update ## Why After a GPU driver update, the first start of the game is laggy and stutters while it compiles pipelines in play; only the start after that is smooth. A player reported this in https://git.magicbean.dev/MagicBeanDev/LongshotLauncher/issues/90. The cause: a driver update changes the driver's `pipelineCacheUUID`, so our pipeline cache file is refused and the cache starts empty. But the marker that says "every noted pipeline is built into the cache" stays. With `RX_VK_LOAD=create`, the default on GPUs with mesh shaders, that start skips the warm-up and compiles the noted pipelines in play. Project ReLink, a fork of Longshot, found the same gap ([db54a4bc](https://github.com/pixl27/ProjectReLink/commit/db54a4bc), [aabc7ad8](https://github.com/pixl27/ProjectReLink/commit/aabc7ad8)). ## How to reproduce **Seen on:** Windows, an NVIDIA RTX card, after a driver update **Settings and switches:** defaults (RX_VK_LOAD=create on a GPU with mesh shaders) **Steps:** play once so the noted pipelines are warmed, update the GPU driver, start the game again, walk into the Market **Expected:** a warm-up before the title (the start-up screen counts the pipelines), then smooth play **Actual:** no warm-up, and stutter in play while the pipelines compile; the log has `vk: pipeline cache ... (0 KB)` with the old file still in `cache\` ## What changed A pipeline cache file that the driver refuses now removes the pipelines' marker too, as a file dropped for another translator already did. So the start after a driver update warms again before the game. - `gpu/vk/vk_draw.cpp` `pcache_init`: notes a file that was there but couldn't be taken (`pcache_file_rejected`), and logs it (`vk: pipeline cache: ... was made for another driver or GPU`). - `gpu/vk/vk_draw.cpp` `precompile_run`: reads the cache (`pcache_init()`) before it looks at the marker, and removes the marker when the file was dropped or refused. - tests: `tests/test_pcache_stamp.py` checks the order and the removal. `tests/test_warm_bounded.py` and `tests/pipeline_play_cache_test.cpp` follow the changed source. ## Measurements Not measured: what changes is which start warms the pipelines, not the frame. The game-free checks under Testing show the order. A tester's first start after a driver update is the measurement: whether there's a warm-up, and whether the Market stutters. ### Flags and settings None. ## Testing **Tested:** - Rebased onto `main` @ 7bacf846 (this PR @ a157ea71): the 113 checks that read this diff (listed below), not the whole suite, through `tests/run_all.py --jobs 6` on Windows 11 with the Builder's llvm-mingw (v2.0.14 tools): 99 passed, 3 failed, 11 skipped for want of the Vulkan headers; those 11 again with `RX_CPM` set to the Builder's CPM cache: all 11 pass. The 3 failures also fail on main @ 7bacf846, with the same message: `test_linux_driver_fault_guard` (POSIX signals), `test_pipeline_tour` and `test_vk_occlusion_queries`. (The full suite on main @ 1310ecc6: 500 passed, 17 failed, 79 skipped.) <details><summary>The 113 checks</summary> - `nx2/test_cbuf_table_extent.py` - `nx2/test_dump_ssbo_read.py` - `nx2/test_mesh_dynamic_state.py` - `tests/test_bake_ds.py` - `tests/test_bank_gen.py` - `tests/test_bc_raw_targets.py` - `tests/test_check_pr_description.py` - `tests/test_desc_clock.py` - `tests/test_desc_counts.py` - `tests/test_dev_packs.py` - `tests/test_device_lost_exit.py` - `tests/test_dispatch_clock.py` - `tests/test_dlss_checks.py` - `tests/test_draw_binds.py` - `tests/test_draw_side_effects.py` - `tests/test_draw_stream_visibility.py` - `tests/test_drawn_page_map.py` - `tests/test_driver_cache_room.py` - `tests/test_driver_faults.py` - `tests/test_dummy_views.py` - `tests/test_equal_depth_margin.py` - `tests/test_fallback_buffer_cleanup.py` - `tests/test_fallback_depth_hold.py` - `tests/test_fallback_loaded.py` - `tests/test_fallback_pipeline_state.py` - `tests/test_fallback_size_policy.py` - `tests/test_flat_map.py` - `tests/test_framegen_preset.py` - `tests/test_fsr_uniform_ownership.py` - `tests/test_gpl_cold_library.py` - `tests/test_gpl_library_cache.py` - `tests/test_handle_lookup.py` - `tests/test_handle_table_arrays.py` - `tests/test_intel_compiler_gate.py` - `tests/test_intel_quick_compute.py` - `tests/test_jobs_failure.py` - `tests/test_jobs_wait_runs_queued.py` - `tests/test_linux_driver_fault_guard.py` - `tests/test_linux_pressure.py` - `tests/test_load_default.py` - `tests/test_masked_clear_failure.py` - `tests/test_mem_trim.py` - `tests/test_menu_env_on.py` - `tests/test_mesh_args_cleanup.py` - `tests/test_mesh_fallback.py` - `tests/test_mesh_fallback_failed_once.py` - `tests/test_mesh_query_feature.py` - `tests/test_module_ids.py` - `tests/test_parallel_dry_marks.py` - `tests/test_parallel_rb_refresh.py` - `tests/test_pass_hazard.py` - `tests/test_pcache_fetch_lock.py` - `tests/test_pcache_header_read.py` - `tests/test_pcache_stamp.py` - `tests/test_pipeline_cache_save.py` - `tests/test_pipeline_notes_open.py` - `tests/test_pipeline_play_cache.py` - `tests/test_pipeline_share.py` - `tests/test_pipeline_state_computes.py` - `tests/test_pipeline_state_counts.py` - `tests/test_pipeline_state_portable.py` - `tests/test_pipeline_states.py` - `tests/test_pipeline_tour.py` - `tests/test_precompile_compute_guard.py` - `tests/test_precompile_pipeline_cleanup.py` - `tests/test_predict_resume.py` - `tests/test_predict_types.py` - `tests/test_predicted_check.py` - `tests/test_prepare_cache_save.py` - `tests/test_prepare_cpus.py` - `tests/test_prepare_seed_stamp.py` - `tests/test_prepare_stall.py` - `tests/test_prepare_workers.py` - `tests/test_prepared_stamps.py` - `tests/test_prof_sampling.py` - `tests/test_program_cache_format.py` - `tests/test_program_cache_one_variant.py` - `tests/test_program_cache_reader.py` - `tests/test_psychov35_dlss.py` - `tests/test_psychov35_taau.py` - `tests/test_push_state.py` - `tests/test_quick_pipelines.py` - `tests/test_radv_mesh_optimizer.py` - `tests/test_reactive_mask.py` - `tests/test_recomplauncher_json.py` - `tests/test_recorder_own_idle.py` - `tests/test_recording_admission.py` - `tests/test_replay_copies.py` - `tests/test_rumble_menu.py` - `tests/test_same_draw.py` - `tests/test_same_dyn.py` - `tests/test_sampler_admission.py` - `tests/test_shader_module_guard.py` - `tests/test_shader_stamp_cache.py` - `tests/test_shader_stamp_inputs.py` - `tests/test_shadow_mask_guard.py` - `tests/test_startup_progress.py` - `tests/test_state_list_plain.py` - `tests/test_taau_env_lookup.py` - `tests/test_taau_fxaa.py` - `tests/test_taau_typed_dispatch.py` - `tests/test_table_track.py` - `tests/test_texture_handle_banks.py` - `tests/test_texture_squeeze.py` - `tests/test_third_party_objects.py` - `tests/test_tls_objects.py` - `tests/test_tree_shadow_mask.py` - `tests/test_ub_threads.py` - `tests/test_upscale_fallback.py` - `tests/test_upscaler_rows.py` - `tests/test_vertex_bind.py` - `tests/test_vk_occlusion_queries.py` - `tests/test_warm_bounded.py` </details> - `tests/run_all.py pcache fallback_loaded pipeline_notes_open gpl_library pipeline_play_cache mesh_fallback warm precompile prepare` on Windows: 19 passed. `test_make_game_prepare` fails, as it does on a clean `main` on this PC. - `vk_draw.cpp` compiles with the build's flags: the same three `__try` errors as `main`, from a flag my check lacks, nothing else. **Not tested:** - **A start after a real driver update.** **Must be tested:** - **Windows, NVIDIA RTX (or any GPU with mesh shaders):** 1. Play once. 2. Update the driver, or with the game closed, change a byte inside `cache\longshot_vk_pipelines.bin`'s header to stand in for one. 3. Start the game again. Expect `vk: pipeline cache: ... was made for another driver or GPU` in the log and a warm-up before the title, then no compiles in play (by hand). ## Risks **What could break:** a start whose cache file is refused now warms the noted pipelines before the game. That can take minutes on a slow PC, once, where play would have stuttered instead. A damaged file counts as refused too, and the same holds. **Turning it off:** revert the commit. **Compatibility:** nothing changes for a player until their driver changes; the caches and saves are untouched. ## Issues See https://git.magicbean.dev/MagicBeanDev/LongshotLauncher/issues/90 (laggy first start after an NVIDIA driver update). ## 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`. - [x] `python -I -B tests/run_all.py` passes (any failure that also fails on `main` is named). - [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 check under `tests/` that reads changed source updated in this PR, not weakened. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
fix(vk): a driver update warms the noted pipelines again before the game, not in play
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
PR description / Description follows the template (pull_request_target) Successful in 5s
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 9s
Website / Website on Cloudflare (pull_request_target) Has been skipped
ead75bb77a
After a driver update the pipeline cache's file is refused (another pipelineCacheUUID) and the cache starts
empty, but the marker that says every noted pipeline is in it stayed: with RX_VK_LOAD=create (the default on
GPUs with mesh shaders) the first start after the update compiled them in play, and only the next start
noticed. pcache_init now notes a file it refused, precompile_run reads the cache before it judges the
marker, and a refused file takes the marker with it, as a file dropped for another translator already did.
Project ReLink found the same gap (db54a4bc, aabc7ad8).

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
dyst force-pushed fix/warm-after-driver-update from ead75bb77a
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
PR description / Description follows the template (pull_request_target) Successful in 5s
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 9s
Website / Website on Cloudflare (pull_request_target) Has been skipped
to a157ea7137
Some checks are pending
PR description / Description follows the template (pull_request_target) Waiting to run
CI / Conventional Commit title (pull_request) Waiting to run
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
CI / Workflow lint (actionlint) (pull_request) Waiting to run
Guide screenshots / Guide images and local UI source review (pull_request) Waiting to run
Third-party parts / As their notes say (pull_request) Waiting to run
Third-party parts / The same as upstream (pull_request) Has been skipped
Website / Website on Cloudflare (pull_request) Has been skipped
2026-11-15 19:04:16 +00:00
Compare
Author
Member

Rebased onto main @ 7bacf846 (this PR @ a157ea71). The 113 checks that read this diff: 3 fail, all three also on main @ 7bacf846 with the same message; nothing else fails. No change to the code.

Rebased onto main @ 7bacf846 (this PR @ a157ea71). The 113 checks that read this diff: 3 fail, all three also on main @ 7bacf846 with the same message; nothing else fails. No change to the code.
dyst changed title from WIP: fix(vk): a driver update warms the noted pipelines again before the game, not in play to fix(vk): a driver update warms the noted pipelines again before the game, not in play 2026-11-15 19:16:01 +00:00
Some checks are pending
PR description / Description follows the template (pull_request_target) Waiting to run
CI / Conventional Commit title (pull_request) Waiting to run
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
CI / Workflow lint (actionlint) (pull_request) Waiting to run
Guide screenshots / Guide images and local UI source review (pull_request) Waiting to run
Third-party parts / As their notes say (pull_request) Waiting to run
Third-party parts / The same as upstream (pull_request) Has been skipped
Website / Website on Cloudflare (pull_request) Has been skipped
This pull request doesn't have enough approvals yet. 0 of 1 approvals granted.
This branch is out-of-date with the base branch
You are not authorized to merge this pull request.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u 'fix/warm-after-driver-update:dyst-fix/warm-after-driver-update'
git switch 'dyst-fix/warm-after-driver-update'
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!789
No description provided.