Skip to content

LSP crash when working on scipy-stubs #2588

@jorenham

Description

@jorenham

While working on scipy/scipy-stubs#1300, I got an notification saying that pyrefly crashed 5 times in the last 3 minutes. The stacktraces all look like this:

starting generic LSP server
 INFO Reading messages
 INFO Language server processed event `DidOpenTextDocument` in 0.02s (0.00s waiting)
 INFO Language server processed event `DidOpenTextDocument` in 0.00s (0.02s waiting)
 INFO Language server processed event `DidOpenTextDocument` in 0.00s (0.02s waiting)
 INFO Ran task on sourcedb_queue heavy task queue. Queue time: 0.00, task time: 0.00
 INFO Ran task on sourcedb_queue heavy task queue. Queue time: 0.00, task time: 0.00
 INFO Ran task on sourcedb_queue heavy task queue. Queue time: 0.00, task time: 0.00
 WARN /tmp/pyrefly_bundled_typeshed_8bc46ed55b1b/pyrefly.toml: Cannot use both `permissive-ignores` and `enabled-ignores`: `permissive-ignores` will be ignored.
 INFO Language server processed event `DidOpenTextDocument` in 0.02s (0.02s waiting)
 INFO Language server processed event `LspResponse` in 0.00s (0.04s waiting)
 INFO Ran task on sourcedb_queue heavy task queue. Queue time: 0.00, task time: 0.00
 INFO Client configuration applied to workspace: Some(Url { scheme: "file", cannot_be_a_base: false, username: "", password: None, host: None, port: None, path: "/home/joren/Workspace/scipy-stubs", query: None, fragment: None })
 INFO Client configuration applied to workspace: None
 INFO Language server processed event `LspResponse` in 0.02s (0.04s waiting)
 INFO Request textDocument/documentSymbol (1) is canceled due to subsequent mutation
 INFO Language server processed event `LspRequest(textDocument/documentSymbol)` in 0.00s (0.06s waiting)
 INFO Request textDocument/inlayHint (2) is canceled due to subsequent mutation
 INFO Language server processed event `LspRequest(textDocument/inlayHint)` in 0.00s (0.06s waiting)
 INFO Language server processed event `LspResponse` in 0.00s (0.05s waiting)
 INFO Language server processed event `LspResponse` in 0.00s (0.05s waiting)
 INFO Language server processed event `LspResponse` in 0.00s (0.05s waiting)
 INFO Language server processed event `LspResponse` in 0.00s (0.02s waiting)
 WARN /tmp/pyrefly_bundled_typeshed_8bc46ed55b1b/pyrefly.toml: Cannot use both `permissive-ignores` and `enabled-ignores`: `permissive-ignores` will be ignored.
ERROR Thread panicked, shutting down: panicked at pyrefly/lib/alt/answers_solver.rs:233:66:
called `Option::unwrap()` on a `None` value
Backtrace:
   0: pyrefly_util::panic::print_panic::{closure#0}
             at /home/runner/work/pyrefly/pyrefly/crates/pyrefly_util/src/panic.rs:38:13
   1: <std::sync::once::Once>::call_once::<pyrefly_util::panic::print_panic::{closure#0}>::{closure#0}
             at /rustc/b33119ffdd483969934b10a886dc06dd29a473f9/library/std/src/sync/once.rs:159:41
   2: <std::sys::sync::once::futex::Once>::call
             at /rustc/b33119ffdd483969934b10a886dc06dd29a473f9/library/std/src/sys/sync/once/futex.rs:178:21
   3: <std::sync::once::Once>::call_once::<pyrefly_util::panic::print_panic::{closure#0}>
             at /rustc/b33119ffdd483969934b10a886dc06dd29a473f9/library/std/src/sync/once.rs:159:20
   4: pyrefly_util::panic::print_panic
             at /home/runner/work/pyrefly/pyrefly/crates/pyrefly_util/src/panic.rs:35:16
   5: pyrefly_util::panic::exit_on_panic::{closure#0}
             at /home/runner/work/pyrefly/pyrefly/crates/pyrefly_util/src/panic.rs:64:9
   6: <alloc::boxed::Box<dyn for<'a, 'b> core::ops::function::Fn<(&'a std::panic::PanicHookInfo<'b>,), Output = ()> + core::marker::Send + core::marker::Sync> as core::ops::function::Fn<(&std::panic::PanicHookInfo,)>>::call
             at /rustc/b33119ffdd483969934b10a886dc06dd29a473f9/library/alloc/src/boxed.rs:2220:9
   7: std::panicking::panic_with_hook
             at /rustc/b33119ffdd483969934b10a886dc06dd29a473f9/library/std/src/panicking.rs:833:13
   8: std::panicking::panic_handler::{closure#0}
             at /rustc/b33119ffdd483969934b10a886dc06dd29a473f9/library/std/src/panicking.rs:691:13
   9: std::sys::backtrace::__rust_end_short_backtrace::<std::panicking::panic_handler::{closure#0}, !>
             at /rustc/b33119ffdd483969934b10a886dc06dd29a473f9/library/std/src/sys/backtrace.rs:176:18
  10: __rustc::rust_begin_unwind
             at /rustc/b33119ffdd483969934b10a886dc06dd29a473f9/library/std/src/panicking.rs:689:5
  11: core::panicking::panic_fmt
             at /rustc/b33119ffdd483969934b10a886dc06dd29a473f9/library/core/src/panicking.rs:80:14
  12: core::panicking::panic
             at /rustc/b33119ffdd483969934b10a886dc06dd29a473f9/library/core/src/panicking.rs:150:5
  13: core::option::unwrap_failed
             at /rustc/b33119ffdd483969934b10a886dc06dd29a473f9/library/core/src/option.rs:2175:5
  14: <core::option::Option<vec1::Vec1<pyrefly::alt::answers_solver::CalcId>>>::unwrap
             at /rustc/b33119ffdd483969934b10a886dc06dd29a473f9/library/core/src/option.rs:1016:21
  15: <pyrefly::alt::answers_solver::CalcStack>::push::<alloc::sync::Arc<pyrefly::alt::class::class_field::ClassField>>
             at /home/runner/work/pyrefly/pyrefly/pyrefly/lib/alt/answers_solver.rs:233:66
  16: <pyrefly::alt::answers_solver::AnswersSolver<pyrefly::state::state::TransactionHandle>>::get_idx::<pyrefly::binding::binding::KeyClassField>
             at /home/runner/work/pyrefly/pyrefly/pyrefly/lib/alt/answers_solver.rs:1223:41
  17: <pyrefly::alt::answers_solver::AnswersSolver<pyrefly::state::state::TransactionHandle>>::get_hashed_opt::<pyrefly::binding::binding::KeyClassField>
             at /home/runner/work/pyrefly/pyrefly/pyrefly/lib/alt/answers_solver.rs:1662:19
  18: <pyrefly::alt::answers::Answers>::solve_exported_key::<pyrefly::state::state::TransactionHandle, pyrefly::binding::binding::KeyClassField>
             at /home/runner/work/pyrefly/pyrefly/pyrefly/lib/alt/answers.rs:657:16
  19: <pyrefly::state::state::Transaction>::lookup_answer::<pyrefly::binding::binding::KeyClassField>
             at /home/runner/work/pyrefly/pyrefly/pyrefly/lib/state/state.rs:1495:44
  20: <pyrefly::state::state::TransactionHandle as pyrefly::alt::answers::LookupAnswer>::get::<pyrefly::binding::binding::KeyClassField>
             at /home/runner/work/pyrefly/pyrefly/pyrefly/lib/state/state.rs:2448:36
  21: <pyrefly::alt::answers_solver::AnswersSolver<pyrefly::state::state::TransactionHandle>>::get_from_module::<pyrefly::binding::binding::KeyClassField>
             at /home/runner/work/pyrefly/pyrefly/pyrefly/lib/alt/answers_solver.rs:1589:26
  22: <pyrefly::alt::answers_solver::AnswersSolver<pyrefly::state::state::TransactionHandle>>::get_from_class::<pyrefly::binding::binding::KeyClassField>
             at /home/runner/work/pyrefly/pyrefly/pyrefly/lib/alt/answers_solver.rs:1615:14
  23: <pyrefly::alt::answers_solver::AnswersSolver<pyrefly::state::state::TransactionHandle>>::get_non_synthesized_field_from_current_class_only
             at /home/runner/work/pyrefly/pyrefly/pyrefly/lib/alt/class/class_field.rs:3378:39
  24: <pyrefly::alt::answers_solver::AnswersSolver<pyrefly::state::state::TransactionHandle>>::get_field_from_current_class_only
             at /home/runner/work/pyrefly/pyrefly/pyrefly/lib/alt/class/class_field.rs:3484:14
  25: <pyrefly::alt::answers_solver::AnswersSolver<pyrefly::state::state::TransactionHandle>>::get_class_member_impl::{closure#0}
             at /home/runner/work/pyrefly/pyrefly/pyrefly/lib/alt/class/class_field.rs:3494:18
  26: <pyrefly::alt::answers_solver::AnswersSolver<pyrefly::state::state::TransactionHandle>>::get_field_from_mro::<<pyrefly::alt::answers_solver::AnswersSolver<pyrefly::state::state::TransactionHandle>>::get_class_member_impl::{closure#0}>
             at /home/runner/work/pyrefly/pyrefly/pyrefly/lib/alt/class/class_field.rs:3428:9
  27: <pyrefly::alt::answers_solver::AnswersSolver<pyrefly::state::state::TransactionHandle>>::get_class_member_impl
             at /home/runner/work/pyrefly/pyrefly/pyrefly/lib/alt/class/class_field.rs:3493:14
  28: <pyrefly::alt::answers_solver::AnswersSolver<pyrefly::state::state::TransactionHandle>>::get_class_member_with_defining_class
             at /home/runner/work/pyrefly/pyrefly/pyrefly/lib/alt/class/class_field.rs:3519:36
  29: <pyrefly::alt::answers_solver::AnswersSolver<pyrefly::state::state::TransactionHandle>>::get_class_member
             at /home/runner/work/pyrefly/pyrefly/pyrefly/lib/alt/class/class_field.rs:3529:14
  30: <pyrefly::alt::answers_solver::AnswersSolver<pyrefly::state::state::TransactionHandle>>::check_consistent_override_for_field
             at /home/runner/work/pyrefly/pyrefly/pyrefly/lib/alt/class/class_field.rs:2981:41
  31: <pyrefly::alt::answers_solver::AnswersSolver<pyrefly::state::state::TransactionHandle>>::solve_consistent_override_check
             at /home/runner/work/pyrefly/pyrefly/pyrefly/lib/alt/solve.rs:2180:22
  32: <pyrefly::binding::binding::KeyConsistentOverrideCheck as pyrefly::alt::traits::Solve<pyrefly::state::state::TransactionHandle>>::solve
             at /home/runner/work/pyrefly/pyrefly/pyrefly/lib/alt/traits.rs:190:17
  33: <pyrefly::alt::answers_solver::AnswersSolver<pyrefly::state::state::TransactionHandle>>::calculate_and_record_answer::<pyrefly::binding::binding::KeyConsistentOverrideCheck>
             at /home/runner/work/pyrefly/pyrefly/pyrefly/lib/alt/answers_solver.rs:1275:26
  34: <pyrefly::alt::answers_solver::AnswersSolver<pyrefly::state::state::TransactionHandle>>::get_idx::<pyrefly::binding::binding::KeyConsistentOverrideCheck>
             at /home/runner/work/pyrefly/pyrefly/pyrefly/lib/alt/answers_solver.rs:1224:46
  35: <pyrefly::alt::answers::Answers>::solve::pre_solve::<pyrefly::state::state::TransactionHandle, pyrefly::binding::binding::KeyConsistentOverrideCheck>
             at /home/runner/work/pyrefly/pyrefly/pyrefly/lib/alt/answers.rs:545:33
  36: <pyrefly::alt::answers::Answers>::solve::<pyrefly::state::state::TransactionHandle>::{closure#3}
             at /home/runner/work/pyrefly/pyrefly/pyrefly/lib/alt/answers.rs:566:47
  37: <pyrefly::alt::answers::Answers>::solve::<pyrefly::state::state::TransactionHandle>
             at /home/runner/work/pyrefly/pyrefly/pyrefly/lib/binding/table.rs:237:9
  38: <pyrefly::state::steps::Step>::step_solutions::<pyrefly::state::state::TransactionHandle>
             at /home/runner/work/pyrefly/pyrefly/pyrefly/lib/state/steps.rs:198:35
  39: <pyrefly::state::steps::Step>::compute::<pyrefly::state::state::TransactionHandle>
             at /home/runner/work/pyrefly/pyrefly/pyrefly/lib/state/steps.rs:97:19
  40: <pyrefly::state::state::Transaction>::demand
             at /home/runner/work/pyrefly/pyrefly/pyrefly/lib/state/state.rs:1115:28
  41: <pyrefly::state::state::Transaction>::work::{closure#0}
             at /home/runner/work/pyrefly/pyrefly/pyrefly/lib/state/state.rs:1567:18
  42: <pyrefly_util::task_heap::TaskHeap<pyrefly::state::steps::Step, pyrefly_util::arc_id::ArcId<pyrefly::state::state::ModuleDataMut>>>::work::<<pyrefly::state::state::Transaction>::work::{closure#0}>
             at /home/runner/work/pyrefly/pyrefly/crates/pyrefly_util/src/task_heap.rs:180:25
  43: <pyrefly::state::state::Transaction>::work
             at /home/runner/work/pyrefly/pyrefly/pyrefly/lib/state/state.rs:1566:24
  44: <pyrefly::state::state::Transaction>::run_step::{closure#1}
             at /home/runner/work/pyrefly/pyrefly/pyrefly/lib/state/state.rs:1600:37
  45: <pyrefly_util::thread_pool::ThreadPool>::spawn_many::<<pyrefly::state::state::Transaction>::run_step::{closure#1}>::{closure#0}::{closure#0}
             at /home/runner/work/pyrefly/pyrefly/crates/pyrefly_util/src/thread_pool.rs:120:37
  46: <rayon_core::scope::Scope>::spawn::<<pyrefly_util::thread_pool::ThreadPool>::spawn_many<<pyrefly::state::state::Transaction>::run_step::{closure#1}>::{closure#0}::{closure#0}>::{closure#0}::{closure#0}
             at /root/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rayon-core-1.13.0/src/scope/mod.rs:531:57
  47: <core::panic::unwind_safe::AssertUnwindSafe<<rayon_core::scope::Scope>::spawn<<pyrefly_util::thread_pool::ThreadPool>::spawn_many<<pyrefly::state::state::Transaction>::run_step::{closure#1}>::{closure#0}::{closure#0}>::{closure#0}::{closure#0}> as core::ops::function::FnOnce<()>>::call_once
             at /rustc/b33119ffdd483969934b10a886dc06dd29a473f9/library/core/src/panic/unwind_safe.rs:274:9
  48: std::panicking::catch_unwind::do_call::<core::panic::unwind_safe::AssertUnwindSafe<<rayon_core::scope::Scope>::spawn<<pyrefly_util::thread_pool::ThreadPool>::spawn_many<<pyrefly::state::state::Transaction>::run_step::{closure#1}>::{closure#0}::{closure#0}>::{closure#0}::{closure#0}>, ()>
             at /rustc/b33119ffdd483969934b10a886dc06dd29a473f9/library/std/src/panicking.rs:581:40
  49: std::panicking::catch_unwind::<(), core::panic::unwind_safe::AssertUnwindSafe<<rayon_core::scope::Scope>::spawn<<pyrefly_util::thread_pool::ThreadPool>::spawn_many<<pyrefly::state::state::Transaction>::run_step::{closure#1}>::{closure#0}::{closure#0}>::{closure#0}::{closure#0}>>
             at /rustc/b33119ffdd483969934b10a886dc06dd29a473f9/library/std/src/panicking.rs:544:19
  50: std::panic::catch_unwind::<core::panic::unwind_safe::AssertUnwindSafe<<rayon_core::scope::Scope>::spawn<<pyrefly_util::thread_pool::ThreadPool>::spawn_many<<pyrefly::state::state::Transaction>::run_step::{closure#1}>::{closure#0}::{closure#0}>::{closure#0}::{closure#0}>, ()>
             at /rustc/b33119ffdd483969934b10a886dc06dd29a473f9/library/std/src/panic.rs:359:14
  51: rayon_core::unwind::halt_unwinding::<<rayon_core::scope::Scope>::spawn<<pyrefly_util::thread_pool::ThreadPool>::spawn_many<<pyrefly::state::state::Transaction>::run_step::{closure#1}>::{closure#0}::{closure#0}>::{closure#0}::{closure#0}, ()>
             at /root/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rayon-core-1.13.0/src/unwind.rs:17:5
  52: <rayon_core::scope::ScopeBase>::execute_job_closure::<<rayon_core::scope::Scope>::spawn<<pyrefly_util::thread_pool::ThreadPool>::spawn_many<<pyrefly::state::state::Transaction>::run_step::{closure#1}>::{closure#0}::{closure#0}>::{closure#0}::{closure#0}, ()>
             at /root/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rayon-core-1.13.0/src/scope/mod.rs:693:28
  53: <rayon_core::scope::ScopeBase>::execute_job::<<rayon_core::scope::Scope>::spawn<<pyrefly_util::thread_pool::ThreadPool>::spawn_many<<pyrefly::state::state::Transaction>::run_step::{closure#1}>::{closure#0}::{closure#0}>::{closure#0}::{closure#0}>
             at /root/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rayon-core-1.13.0/src/scope/mod.rs:683:29
  54: <rayon_core::scope::Scope>::spawn::<<pyrefly_util::thread_pool::ThreadPool>::spawn_many<<pyrefly::state::state::Transaction>::run_step::{closure#1}>::{closure#0}::{closure#0}>::{closure#0}
             at /root/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rayon-core-1.13.0/src/scope/mod.rs:531:13
  55: <rayon_core::job::HeapJob<<rayon_core::scope::Scope>::spawn<<pyrefly_util::thread_pool::ThreadPool>::spawn_many<<pyrefly::state::state::Transaction>::run_step::{closure#1}>::{closure#0}::{closure#0}>::{closure#0}> as rayon_core::job::Job>::execute
             at /root/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rayon-core-1.13.0/src/job.rs:169:9
  56: <rayon_core::job::JobRef>::execute
             at /root/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rayon-core-1.13.0/src/job.rs:64:9
  57: <rayon_core::registry::WorkerThread>::execute
             at /root/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rayon-core-1.13.0/src/registry.rs:866:13
  58: <rayon_core::registry::WorkerThread>::wait_until_cold
             at /root/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rayon-core-1.13.0/src/registry.rs:800:26
  59: <rayon_core::registry::WorkerThread>::wait_until::<rayon_core::latch::OnceLatch>
             at /root/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rayon-core-1.13.0/src/registry.rs:775:18
  60: <rayon_core::registry::WorkerThread>::wait_until_out_of_work
             at /root/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rayon-core-1.13.0/src/registry.rs:824:14
  61: rayon_core::registry::main_loop
             at /root/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rayon-core-1.13.0/src/registry.rs:929:19
  62: <rayon_core::registry::ThreadBuilder>::run
             at /root/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rayon-core-1.13.0/src/registry.rs:50:18
  63: <rayon_core::registry::DefaultSpawn as rayon_core::registry::ThreadSpawn>::spawn::{closure#0}
             at /root/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rayon-core-1.13.0/src/registry.rs:95:27
  64: std::sys::backtrace::__rust_begin_short_backtrace::<<rayon_core::registry::DefaultSpawn as rayon_core::registry::ThreadSpawn>::spawn::{closure#0}, ()>
             at /rustc/b33119ffdd483969934b10a886dc06dd29a473f9/library/std/src/sys/backtrace.rs:160:18
  65: std::thread::lifecycle::spawn_unchecked::<<rayon_core::registry::DefaultSpawn as rayon_core::registry::ThreadSpawn>::spawn::{closure#0}, ()>::{closure#1}::{closure#0}
             at /rustc/b33119ffdd483969934b10a886dc06dd29a473f9/library/std/src/thread/lifecycle.rs:92:13
  66: <core::panic::unwind_safe::AssertUnwindSafe<std::thread::lifecycle::spawn_unchecked<<rayon_core::registry::DefaultSpawn as rayon_core::registry::ThreadSpawn>::spawn::{closure#0}, ()>::{closure#1}::{closure#0}> as core::ops::function::FnOnce<()>>::call_once
             at /rustc/b33119ffdd483969934b10a886dc06dd29a473f9/library/core/src/panic/unwind_safe.rs:274:9
  67: std::panicking::catch_unwind::do_call::<core::panic::unwind_safe::AssertUnwindSafe<std::thread::lifecycle::spawn_unchecked<<rayon_core::registry::DefaultSpawn as rayon_core::registry::ThreadSpawn>::spawn::{closure#0}, ()>::{closure#1}::{closure#0}>, ()>
             at /rustc/b33119ffdd483969934b10a886dc06dd29a473f9/library/std/src/panicking.rs:581:40
  68: std::panicking::catch_unwind::<(), core::panic::unwind_safe::AssertUnwindSafe<std::thread::lifecycle::spawn_unchecked<<rayon_core::registry::DefaultSpawn as rayon_core::registry::ThreadSpawn>::spawn::{closure#0}, ()>::{closure#1}::{closure#0}>>
             at /rustc/b33119ffdd483969934b10a886dc06dd29a473f9/library/std/src/panicking.rs:544:19
  69: std::panic::catch_unwind::<core::panic::unwind_safe::AssertUnwindSafe<std::thread::lifecycle::spawn_unchecked<<rayon_core::registry::DefaultSpawn as rayon_core::registry::ThreadSpawn>::spawn::{closure#0}, ()>::{closure#1}::{closure#0}>, ()>
             at /rustc/b33119ffdd483969934b10a886dc06dd29a473f9/library/std/src/panic.rs:359:14
  70: std::thread::lifecycle::spawn_unchecked::<<rayon_core::registry::DefaultSpawn as rayon_core::registry::ThreadSpawn>::spawn::{closure#0}, ()>::{closure#1}
             at /rustc/b33119ffdd483969934b10a886dc06dd29a473f9/library/std/src/thread/lifecycle.rs:90:26
  71: <std::thread::lifecycle::spawn_unchecked<<rayon_core::registry::DefaultSpawn as rayon_core::registry::ThreadSpawn>::spawn::{closure#0}, ()>::{closure#1} as core::ops::function::FnOnce<()>>::call_once::{shim:vtable#0}
             at /rustc/b33119ffdd483969934b10a886dc06dd29a473f9/library/core/src/ops/function.rs:250:5
  72: <alloc::boxed::Box<dyn core::ops::function::FnOnce<(), Output = ()> + core::marker::Send> as core::ops::function::FnOnce<()>>::call_once
             at /rustc/b33119ffdd483969934b10a886dc06dd29a473f9/library/alloc/src/boxed.rs:2206:9
  73: <std::sys::thread::unix::Thread>::new::thread_start
             at /rustc/b33119ffdd483969934b10a886dc06dd29a473f9/library/std/src/sys/thread/unix.rs:118:17
  74: start_thread
             at ./nptl/pthread_create.c:442:8
  75: __GI___clone3
             at ./misc/../sysdeps/unix/sysv/linux/x86_64/clone3.S:81:0

PANIC Sorry, Pyrefly crashed, this is always a bug in Pyrefly itself.
PANIC Please report the bug at https://github.com/facebook/pyrefly/issues/new
[Error - 12:10:59 PM] Server process exited with code 101.
[Error - 12:10:59 PM] The Pyrefly language server server crashed 5 times in the last 3 minutes. The server will not be restarted. See the output for more information.

Metadata

Metadata

Assignees

No one assigned

    Labels

    crashlanguage-serverIssues specific to our IDE integration rather than type checking

    Type

    No fields configured for Bug.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions