{"record":{"id":"80e1906821ae18d1","repo":"zellij-org/zellij","slug":"scrollupbypaneid-missing-pane-id","errorCode":null,"errorMessage":"ScrollUpByPaneId missing pane_id","messagePattern":"ScrollUpByPaneId missing pane_id","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"zellij-utils/src/ipc/protobuf_conversion.rs","lineNumber":2914,"sourceCode":"            ActionType::ToggleGroupMarking(_) => {\n                Ok(crate::input::actions::Action::ToggleGroupMarking)\n            },\n            ActionType::SetPaneColor(set_pane_color_action) => {\n                Ok(crate::input::actions::Action::SetPaneColor {\n                    pane_id: set_pane_color_action\n                        .pane_id\n                        .ok_or_else(|| anyhow!(\"SetPaneColor missing pane_id\"))?\n                        .try_into()?,\n                    fg: set_pane_color_action.fg,\n                    bg: set_pane_color_action.bg,\n                })\n            },\n            // Pane-targeting CLI-only variants\n            ActionType::ScrollUpByPaneId(a) => {\n                Ok(crate::input::actions::Action::ScrollUpByPaneId {\n                    pane_id: a\n                        .pane_id\n                        .ok_or_else(|| anyhow!(\"ScrollUpByPaneId missing pane_id\"))?\n                        .try_into()?,\n                })\n            },\n            ActionType::ScrollDownByPaneId(a) => {\n                Ok(crate::input::actions::Action::ScrollDownByPaneId {\n                    pane_id: a\n                        .pane_id\n                        .ok_or_else(|| anyhow!(\"ScrollDownByPaneId missing pane_id\"))?\n                        .try_into()?,\n                })\n            },\n            ActionType::ScrollToTopByPaneId(a) => {\n                Ok(crate::input::actions::Action::ScrollToTopByPaneId {\n                    pane_id: a\n                        .pane_id\n                        .ok_or_else(|| anyhow!(\"ScrollToTopByPaneId missing pane_id\"))?\n                        .try_into()?,\n                })","sourceCodeStart":2896,"sourceCodeEnd":2932,"githubUrl":"https://github.com/zellij-org/zellij/blob/98a0837077492d53dd252ab30bc3e43e41e504f4/zellij-utils/src/ipc/protobuf_conversion.rs#L2896-L2932","documentation":"First of the pane-targeted scroll actions in the protobuf conversion: ScrollUpByPaneId scrolls one specific pane, so the `pane_id` field is mandatory. An incoming action with pane_id unset (Option::None in prost) fails conversion at this .ok_or_else() and no scrolling happens.","triggerScenarios":"IPC clients emitting ScrollUpByPaneId without pane_id — half-populated payloads, tooling that targets 'the focused pane' by omitting the id (not supported: these CLI-only variants exist precisely to target arbitrary panes), or stub drift.","commonSituations":"Automation scrolling output in background panes; clients built against an older proto; replayed action captures missing fields.","solutions":["Set pane_id to the pane that should scroll before sending","Regenerate the client's protobuf stubs from the running server's schema","Match client and server zellij versions","Validate pane_id presence before sending; use the plain Scroll action if you mean the focused pane"],"exampleFix":"// before\nScrollUpAction::default() emitted as ScrollUpByPaneId // pane_id: None\n\n// after\nScrollUpAction { pane_id: Some(target_pane_id as u64) }","handlingStrategy":"validation","validationCode":"if let ActionType::ScrollUpByPaneId(a) = action.action_type.as_ref().unwrap() {\n    if a.pane_id.is_none() {\n        anyhow::bail!(\"ScrollUpByPaneId requires pane_id\");\n    }\n}","typeGuard":"fn scroll_up_by_pane_id_is_valid(a: &ScrollUpAction) -> bool {\n    a.pane_id.is_some()\n}","tryCatchPattern":"match protobuf_action.try_into() {\n    Ok(action) => dispatch(action),\n    Err(e) if e.to_string().contains(\"ScrollUpByPaneId missing pane_id\") => {\n        log::warn!(\"dropping ScrollUpByPaneId without pane_id\");\n    },\n    Err(e) => return Err(e.context(\"action conversion failed\")),\n}","preventionTips":["These ByPaneId actions exist to target arbitrary panes: the id is never optional in practice","Fetch live pane ids at runtime rather than hardcoding them","Prefer `zellij action scroll-up --pane-id N` from the CLI, which always sets the field","Guard all pane-targeting actions with one shared pane_id-presence validator"],"tags":["protobuf","ipc","action","pane-id","scroll","validation"],"backgroundTag":null,"analyzedSha":"98a0837077492d53dd252ab30bc3e43e41e504f4","analyzedAt":"2026-08-16T13:02:01.396Z","schemaVersion":2},"datasetVersion":"2026-08-16T13:17:31.715Z"}