# Adaptive workspace The pane beside a conversation follows what the bot is actually doing, not a guess about the task. No classifier or model decides the layout: `deriveWorkspaceFocus` in `@rakazo/core` reads the thread state every client already has, so web and mobile agree and the rules stay testable offline. ## Signals | Focus | Signal | Web | Mobile | |-------|--------|-----|--------| | Screen | A fresh `thread.computer` pointer event from a working run, or a takeover request | Live screen opens beside the chat (wide pane), steps back a few seconds after the work ends | Pill above the composer opens the computer | | Artifact | The latest run attached a file with `present: true` (`attach_file`) | File opens beside the chat until the user closes it or the bot presents another | Unchanged: file cards open the native preview | | Needs you | An unanswered ask on a waiting run | "Needs you" pill replaces the jump arrow when the question scrolled out of view | Existing push and attention notifications | Everything else stays a plain conversation. ## Rules - The pane moves only on focus edges (`applyWorkspaceFocus`). The first focus of a conversation is a baseline, so opening a thread never jumps. - A pane the user opened by hand is never replaced or closed automatically. Auto panes close only when their own focus ends; a presented file stays. - Windows narrower than 1024px keep the conversation full width; file cards fall back to the dialog. - Per bot, the client learns from the user: opening the screen by hand while the bot works three times makes it open on every run; closing an automatically opened screen twice stops it opening on its own. A takeover request always shows the screen. - Pane widths are remembered per device. ## Not in scope Generated layouts, per-domain dashboards and prompt classification stay out: they guess, move the UI under the user, and cannot be verified deterministically.