{ "name": "sidebar_survives_linefeed_scroll", "cols": 120, "rows": 40, "scripts": [ { "name": "linefeed-scroll", "body": "#!/bin/sh\n# Plain LF at the bottom of the child viewport scrolls the host's\n# DECSTBM region. Because that region spans every column, enough LFs\n# drag the sidebar border and section labels out of the visible region\n# unless patterm invalidates and repaints the sidebar cache.\ni=0\nwhile [ $i -lt 12 ]; do\n printf 'warmup %02d\\n' \"$i\"\n i=$((i + 1))\n sleep 0.05\ndone\nprintf 'LINEFEED READY\\n'\nIFS= read -r _\nprintf '\\033[1;37r'\nprintf '\\033[37;1H'\ni=0\nwhile [ $i -lt 45 ]; do\n printf 'scroll line %02d\\n' \"$i\"\n i=$((i + 1))\ndone\nprintf 'LINEFEED DONE\\n'\nsleep 5\n" } ], "steps": [ { "type": "mcp_call", "method": "spawn_process", "params": { "kind": "command", "argv": ["linefeed-scroll"], "name": "linefeed-scroll" } }, { "type": "wait_text", "contains": "LINEFEED READY", "timeout_ms": 5000 }, { "type": "wait_stable", "timeout_ms": 2000 }, { "type": "mark_raw", "save_as": "before_scroll" }, { "type": "send_chord", "chord": "enter" }, { "type": "wait_text", "contains": "LINEFEED DONE", "timeout_ms": 5000 }, { "type": "assert_raw_since_regex", "from": "before_scroll", "regex": "Agent Tree", "timeout_ms": 2000 }, { "type": "wait_stable", "timeout_ms": 2000 }, { "type": "assert_contains", "contains": "Processes" }, { "type": "assert_contains", "contains": "Agent Tree" }, { "type": "assert_contains", "contains": "Scratchpads" }, { "type": "assert_contains", "contains": "● linefeed-scroll" } ] }