{"record":{"id":"2d7b385c48cd60d6","repo":"zellij-org/zellij","slug":"editscrollbackbypaneid-missing-pane-id","errorCode":null,"errorMessage":"EditScrollbackByPaneId missing pane_id","messagePattern":"EditScrollbackByPaneId missing pane_id","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"zellij-utils/src/ipc/protobuf_conversion.rs","lineNumber":3022,"sourceCode":"                    pane_id: a\n                        .pane_id\n                        .ok_or_else(|| anyhow!(\"MovePaneBackwardsByPaneId missing pane_id\"))?\n                        .try_into()?,\n                })\n            },\n            ActionType::ClearScreenByPaneId(a) => {\n                Ok(crate::input::actions::Action::ClearScreenByPaneId {\n                    pane_id: a\n                        .pane_id\n                        .ok_or_else(|| anyhow!(\"ClearScreenByPaneId missing pane_id\"))?\n                        .try_into()?,\n                })\n            },\n            ActionType::EditScrollbackByPaneId(a) => {\n                Ok(crate::input::actions::Action::EditScrollbackByPaneId {\n                    pane_id: a\n                        .pane_id\n                        .ok_or_else(|| anyhow!(\"EditScrollbackByPaneId missing pane_id\"))?\n                        .try_into()?,\n                    ansi: a.ansi,\n                })\n            },\n            ActionType::ToggleFullscreenByPaneId(a) => Ok(\n                crate::input::actions::Action::ToggleFocusFullscreenByPaneId {\n                    pane_id: a\n                        .pane_id\n                        .ok_or_else(|| anyhow!(\"ToggleFullscreenByPaneId missing pane_id\"))?\n                        .try_into()?,\n                },\n            ),\n            ActionType::ToggleNoUiFullscreenByPaneId(a) => Ok(\n                crate::input::actions::Action::ToggleFocusNoUiFullscreenByPaneId {\n                    pane_id: a\n                        .pane_id\n                        .ok_or_else(|| anyhow!(\"ToggleNoUiFullscreenByPaneId missing pane_id\"))?\n                        .try_into()?,","sourceCodeStart":3004,"sourceCodeEnd":3040,"githubUrl":"https://github.com/zellij-org/zellij/blob/98a0837077492d53dd252ab30bc3e43e41e504f4/zellij-utils/src/ipc/protobuf_conversion.rs#L3004-L3040","documentation":"EditScrollbackByPaneId opens the scrollback of one specific pane in an editor; the internal Action also carries an ansi: bool flag taken straight from the proto field. The protobuf message EditScrollbackByPaneIdAction requires pane_id; ansi alone is not enough. With pane_id = None the conversion fails with 'EditScrollbackByPaneId missing pane_id'.","triggerScenarios":"Sending ActionType::EditScrollbackByPaneId where EditScrollbackByPaneIdAction.pane_id is None, regardless of the ansi flag value.","commonSituations":"Plugins wiring an 'edit scrollback' command to a pane id they failed to resolve; default-constructed prost messages; version skew between sender and receiver; intending the focused-pane EditScrollback variant.","solutions":["Resolve a real pane id first and set pane_id: Some(PaneId { pane_type: Some(PaneType::Terminal(id)) }); keep ansi as needed.","Use the plain EditScrollback action when targeting the focused pane.","Check that the pane id you resolved actually exists (e.g. via a pane-list query) before sending.","Rebuild custom clients against the current contract."],"exampleFix":"// before\nlet action = ActionType::EditScrollbackByPaneId(EditScrollbackByPaneIdAction {\n    pane_id: None, // -> \"EditScrollbackByPaneId missing pane_id\"\n    ansi: true,\n});\n\n// after\nlet action = ActionType::EditScrollbackByPaneId(EditScrollbackByPaneIdAction {\n    pane_id: Some(PaneId { pane_type: Some(PaneType::Terminal(1)) }),\n    ansi: true,\n});","handlingStrategy":"validation","validationCode":"fn is_sendable(a: &EditScrollbackByPaneIdAction) -> bool {\n    a.pane_id\n        .as_ref()\n        .and_then(|p| p.pane_type.as_ref())\n        .is_some()\n}","typeGuard":"fn has_valid_pane_id(a: &EditScrollbackByPaneIdAction) -> bool {\n    matches!(\n        a.pane_id.as_ref().and_then(|p| p.pane_type.as_ref()),\n        Some(pane_id::PaneType::Terminal(_)) | Some(pane_id::PaneType::Plugin(_))\n    )\n}","tryCatchPattern":"match Action::try_from(proto_action) {\n    Ok(action) => dispatch(action),\n    Err(e) if e.to_string().contains(\"EditScrollbackByPaneId missing pane_id\") => {\n        log::warn!(\"edit-scrollback action without pane target: {e}\");\n    },\n    Err(e) => return Err(e),\n}","preventionTips":["ansi is not a substitute for pane_id - both parts of the tuple matter.","When a pane-id lookup returns None, surface the lookup failure instead of sending the action.","Pin the zellij-tile/contract crate version to the running server."],"tags":["zellij","ipc","protobuf","rust","pane-id","scrollback"],"backgroundTag":null,"analyzedSha":"98a0837077492d53dd252ab30bc3e43e41e504f4","analyzedAt":"2026-08-16T13:02:01.396Z","schemaVersion":2},"datasetVersion":"2026-08-16T13:17:31.715Z"}