{"record":{"id":"a79ff62938d07689","repo":"zellij-org/zellij","slug":"scrolltobottombypaneid-missing-pane-id","errorCode":null,"errorMessage":"ScrollToBottomByPaneId missing pane_id","messagePattern":"ScrollToBottomByPaneId missing pane_id","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"zellij-utils/src/ipc/protobuf_conversion.rs","lineNumber":2938,"sourceCode":"                    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                })\n            },\n            ActionType::PageScrollUpByPaneId(a) => {\n                Ok(crate::input::actions::Action::PageScrollUpByPaneId {\n                    pane_id: a\n                        .pane_id\n                        .ok_or_else(|| anyhow!(\"PageScrollUpByPaneId missing pane_id\"))?\n                        .try_into()?,\n                })\n            },\n            ActionType::PageScrollDownByPaneId(a) => {\n                Ok(crate::input::actions::Action::PageScrollDownByPaneId {\n                    pane_id: a\n                        .pane_id\n                        .ok_or_else(|| anyhow!(\"PageScrollDownByPaneId missing pane_id\"))?\n                        .try_into()?,\n                })","sourceCodeStart":2920,"sourceCodeEnd":2956,"githubUrl":"https://github.com/zellij-org/zellij/blob/98a0837077492d53dd252ab30bc3e43e41e504f4/zellij-utils/src/ipc/protobuf_conversion.rs#L2920-L2956","documentation":"Protobuf conversion for ScrollToBottomByPaneId, which jumps one named pane's scrollback to the bottom. As with the other pane-targeted scroll actions, the optional `pane_id` is checked with .ok_or_else(); an unset id means no target pane and conversion fails with this error.","triggerScenarios":"IPC clients emitting ScrollToBottomByPaneId without pane_id — half-populated messages, mismatched generated protobuf code, or test tooling sending default actions.","commonSituations":"Automation following output in specific panes; client built from a different zellij version than the server; captures replayed with optional fields stripped.","solutions":["Populate pane_id identifying the pane to scroll before sending","Regenerate the client's protobuf stubs from the running server's schema","Run matching zellij versions on client and server","Validate required fields before dispatch; skip and log malformed actions"],"exampleFix":"// before\nScrollToBottomAction::default() // pane_id: None\n\n// after\nScrollToBottomAction { pane_id: Some(target_pane_id as u64) }","handlingStrategy":"validation","validationCode":"if let ActionType::ScrollToBottomByPaneId(a) = action.action_type.as_ref().unwrap() {\n    if a.pane_id.is_none() {\n        anyhow::bail!(\"ScrollToBottomByPaneId requires pane_id\");\n    }\n}","typeGuard":"fn scroll_to_bottom_by_pane_id_is_valid(a: &ScrollToBottomAction) -> 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(\"ScrollToBottomByPaneId missing pane_id\") => {\n        log::warn!(\"dropping ScrollToBottomByPaneId without pane_id\");\n    },\n    Err(e) => return Err(e.context(\"action conversion failed\")),\n}","preventionTips":["Attach a concrete pane id when jumping scrollback in background panes","Treat missing pane_id as a client bug: fix the sender, don't retry the send","Run client and server from the same zellij release to avoid schema drift","Centralize pane-targeting action validation and log drops for observability"],"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"}