Addresses review feedback: the scheduler error path blamed available[0]
even when picking failed while inspecting a later ready node, misreporting
the node to the frontend.
Instead of threading the node id through the exception, make is_output and
is_async fully defensive. They are pure ordering heuristics, so a malformed
node (a FUNCTION typo, or schema-derived attributes that raise) just means
"not prioritized"; the node then runs through normal execution, where the
error is reported against the correct node. The stage_node_execution
try/except remains as a backstop only.
Add a test for a node whose attribute access raises during the heuristics.
A node whose FUNCTION points at a method that does not exist (e.g. a typo
in a custom node) raised an AttributeError inside the scheduling heuristic
(ux_friendly_pick_node -> is_async). That exception escaped
stage_node_execution() and the prompt worker's error handling, silently
killing the worker thread with nothing reported to the client.
- is_async() now treats a node whose FUNCTION does not resolve to a method
as non-async, so scheduling proceeds and the missing-method error is
raised and reported through the normal execution path.
- stage_node_execution() wraps node picking so any unexpected scheduling
error is returned as an execution error (attributed to an available
node) rather than propagating and killing the worker thread.
Add regression tests covering both paths.