{"record":{"id":"5dfb57f73b6a1f53","repo":"zellij-org/zellij","slug":"scrolldownbypaneid-missing-pane-id","errorCode":null,"errorMessage":"ScrollDownByPaneId missing pane_id","messagePattern":"ScrollDownByPaneId missing pane_id","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"zellij-utils/src/ipc/protobuf_conversion.rs","lineNumber":2922,"sourceCode":"                        .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                })\n            },\n            ActionType::ScrollToBottomByPaneId(a) => {\n                Ok(crate::input::actions::Action::ScrollToBottomByPaneId {\n                    pane_id: a\n                        .pane_id\n                        .ok_or_else(|| anyhow!(\"ScrollToBottomByPaneId missing pane_id\"))?\n                        .try_into()?,\n                })","sourceCodeStart":2904,"sourceCodeEnd":2940,"githubUrl":"https://github.com/zellij-org/zellij/blob/98a0837077492d53dd252ab30bc3e43e41e504f4/zellij-utils/src/ipc/protobuf_conversion.rs#L2904-L2940","documentation":"Protobuf conversion for ScrollDownByPaneId: like its sibling scroll-by-pane-id actions it must name the target pane via the optional `pane_id` field; an unset value fails conversion here with 'missing pane_id' and the scroll-down is never applied to any pane.","triggerScenarios":"Sending ScrollDownByPaneId over IPC with pane_id omitted — default-constructed messages, partial payloads from automation, or protobuf stubs generated from a different zellij version.","commonSituations":"Scripts driving pane scrollback in specific panes; client/server version mismatch; debugging tools stripping optional fields.","solutions":["Populate pane_id before sending ScrollDownByPaneId","Regenerate client stubs against the server's proto files","Keep both ends on the same zellij release","Pre-validate required fields and drop invalid actions with a log entry"],"exampleFix":"// before\nScrollDownAction::default() // pane_id: None -> error\n\n// after\nScrollDownAction { pane_id: Some(target_pane_id as u64) }","handlingStrategy":"validation","validationCode":"if let ActionType::ScrollDownByPaneId(a) = action.action_type.as_ref().unwrap() {\n    if a.pane_id.is_none() {\n        anyhow::bail!(\"ScrollDownByPaneId requires pane_id\");\n    }\n}","typeGuard":"fn scroll_down_by_pane_id_is_valid(a: &ScrollDownAction) -> 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(\"ScrollDownByPaneId missing pane_id\") => {\n        log::warn!(\"dropping ScrollDownByPaneId without pane_id\");\n    },\n    Err(e) => return Err(e.context(\"action conversion failed\")),\n}","preventionTips":["Always bind scroll-by-pane-id actions to a freshly resolved pane id","Validate pane-targeting payloads in the client before IPC send","Regenerate protobuf code when upgrading either side of the connection","Catch and log these conversion errors server-side so one bad action cannot kill dispatch"],"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"}