Demo automation pipelines (kraken open_node) could only open a node’s editor
(EDIT face). Diagram gradient renders, Graph color timelines, and Camera views
were unreachable — the KRILL_DEMO_CONTROL select:<id> command always called
viewEditor() which forces MenuCommand.Update → ViewMode.EDIT.
DemoControl had exactly one selection path: select:<id> → selectNode() +
viewEditor(). viewEditor() always sets _selectedCommand = MenuCommand.Update,
which KrillScreen maps to ViewMode.EDIT for every node type. There was no way
to reach the VIEW face (Diagram’s DiagramScreen, Camera’s CameraScreen, etc.)
from the demo pipeline.
Separately, the generic else branch in KrillScreen always passed ViewMode.EDIT
for MenuCommand.Expand even when a demo wanted VIEW — so even if you reached Expand,
non-special-cased node types (Graph, DataPoint, etc.) would still show the editor.
forceViewMode: StateFlow<Boolean> to the ScreenCore interface +
DefaultScreenCore. Starts false; cleared on every selectNode() and reset().viewExpanded() to ScreenCore / DefaultScreenCore: sets
_forceViewMode = true and _selectedCommand = MenuCommand.Expand without
calling nodeManager.editing().KrillScreen else branch: MenuCommand.Expand now uses
if (forceViewMode.value) ViewMode.VIEW else ViewMode.EDIT so menu-driven
Expand (createChildAndEdit, chip tap) is unchanged but viewExpanded() gets VIEW.main.kt DemoControl: added view:<nodeId> command → selectNode(id) +
viewExpanded(). Updated the in-file comment to list both commands.ScreenCoreTest cases: viewExpanded sets Expand + forceViewMode
without calling editing(); no-op when nothing selected; selectNode clears
forceViewMode; reset clears forceViewMode.ScreenCore navigation path that bypasses executeCommand (i.e. a
direct _selectedCommand.update { … } call) should document whether it sets
forceViewMode and whether it calls nodeManager.editing(). Those two booleans
fully determine the EDIT/VIEW routing in KrillScreen.ScreenCoreTest that
checks both the command value and any secondary state the command sets.