Revised Sprint 11e from training data export to workflow annotation foundation (routing types, skeleton AST, inference-to-routing bridge). Detailed plans for Sprints 12-19 covering workflow model, GUI overhaul, 6 new languages, orchestration engine, C++ self-hosting, Claude Code plugin, and workflow visualization. Created ARCHITECT.md with core thesis and design principles. Training data deferred to post-25 where real workflow decisions provide superior signal. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
24 KiB
Sprint 13 Plan: GUI Overhaul Phase 1
Context
The human-in-the-loop thesis is load-bearing. If humans are supposed to be architects and reviewers — not button-pushers — then the interface must make the system intuitive to understand. The current GUI has floating windows, no key combination symbols, and doesn't look like a professional product. This sprint fixes that.
Sprint 12 delivered the workflow model and routing engine. The GUI needs to surface that workflow state — but the heavy workflow visualization comes in Sprint 19. This sprint focuses on the structural foundation: docking, styling, navigation, and key symbols so the editor feels like a real tool.
Current GUI state:
- ImGui-based with SDL backend
- Text editor with syntax highlighting
- AST tree view panel
- Diagnostics panel
- Annotation panel
- Floating windows (not docked)
- No keyboard shortcut display or customization
- Default ImGui color scheme
Sprint 13 Deliverables:
- All windows docked in a professional layout
- Keyboard shortcut system with displayable key combination symbols
- Professional dark color scheme with consistent visual language
- Clean navigation: panel switching, breadcrumbs, command palette
- Status bar with project/workflow/language info
- Resizable, saveable layout that persists across sessions
Phase 13a: Docking Layout (Steps 342-346)
Convert every floating window to a docked panel in a professional layout.
Step 342: ImGui Docking Infrastructure (12 tests)
Goal: Set up the ImGui docking system and define the default layout.
Modifies: editor/src/EditorState.h (or new editor/src/DockingLayout.h)
- Enable ImGui docking via
io.ConfigFlags |= ImGuiConfigFlags_DockingEnable - Define DockSpace as the root of the editor window
- Default layout:
┌──────────────┬──────────────────────────────┬──────────────┐ │ File Tree │ Code Editor │ AST View │ │ │ │ │ │ │ │ │ │ ├──────────────────────────────┤ │ │ │ Diagnostics / Output │ │ └──────────────┴──────────────────────────────┴──────────────┘ - Left dock: file tree / project navigator (20% width)
- Center: code editor (60% width, split top/bottom)
- Right dock: AST view / annotations (20% width)
- Bottom: diagnostics, output, workflow status (25% height)
Tests: docking enabled, DockSpace renders, default layout has 4 regions, panels render in correct regions, no floating windows, window positions persist after frame, layout ID stable across frames, DockSpace fills viewport.
Step 343: Panel Registration System (12 tests)
Goal: Every panel registers itself with a panel manager that controls docking position, visibility, and ordering.
New file: editor/src/PanelManager.h (~300 lines)
PanelInfostruct: id, title, defaultDock (left/center/right/bottom), isVisible, order, iconPanelManagerclass:registerPanel(id, title, dock, renderFn)— register a panelsetVisible(id, bool)— show/hideisVisible(id) -> boolrenderAll()— render all visible panels in docked positionsgetPanelList() -> vector<PanelInfo>— for UI menustogglePanel(id)— flip visibilityfocusPanel(id)— bring panel to front in its dock
Registered panels:
file-tree— project file browser (left)code-editor— main text editor (center-top)ast-view— AST tree visualization (right)annotations— annotation list/editor (right, tabbed with AST)diagnostics— error/warning list (bottom)output— generated code output (bottom, tabbed with diagnostics)workflow— workflow status summary (bottom, tabbed)properties— selected node properties (right, tabbed)
Tests: register 8 panels, all render without error, visibility toggle, focus panel brings to front, default dock positions, panel ordering, hidden panel doesn't render, getPanelList returns all registered.
Step 344: File Tree Panel (12 tests)
Goal: Replace any floating file browser with a docked file tree that shows the workspace structure with icons and expand/collapse.
New file: editor/src/panels/FileTreePanel.h (~250 lines)
- Tree view of workspace files using FileTree.h data
- Expand/collapse directories
- File type icons (or text indicators): source files, headers, configs
- Click to open file in editor (calls openFile RPC internally)
- Highlight active file
- Respect .gitignore (already in FileTree.h)
- Right-click context menu: new file, rename, delete (future)
Tests: renders workspace tree, directories expandable, click opens file, active file highlighted, .gitignore respected, empty workspace shows message, nested directories render correctly, file count matches workspace index.
Step 345: Tabbed Bottom Panel (12 tests)
Goal: Diagnostics, output, and workflow share the bottom dock as tabs.
Modifies: existing diagnostic/output rendering
- Tab bar: Diagnostics | Output | Workflow | Console
- Diagnostics tab: structured diagnostic list with severity icons, click-to-navigate (jumps to error line in editor)
- Output tab: generated code with syntax highlighting
- Workflow tab: summary stats (placeholder for Sprint 19 deep visualization)
- Console tab: MCP tool log / agent interaction log
- Tab badge: unread count (e.g., "Diagnostics (3)" when 3 new errors)
Tests: 4 tabs render, tab switching works, diagnostics click navigates to line, output shows generated code, workflow shows stats placeholder, badge count updates on new diagnostic, default tab is diagnostics, tabs persist across frames.
Step 346: Phase 13a Integration — Layout Persistence (8 tests)
Goal: Save and restore dock layout across sessions.
Modifies: editor/src/DockingLayout.h (or PanelManager)
saveLayout(path)— serialize ImGui dock state + panel visibility to JSONloadLayout(path)— restore from JSON- Auto-save on exit, auto-load on startup
- Default layout if no saved state exists
- Path:
.whetstone/layout.jsonin workspace
Tests:
- Default layout applied on first run
- Resize panel → save → reload → same size
- Hide panel → save → reload → still hidden
- Move panel to different dock → save → reload → same dock
- Tab order preserved
- Multiple workspaces have independent layouts
- Corrupt layout file → falls back to default
- Layout file location correct (.whetstone/layout.json)
Phase 13b: Color Scheme + Visual Polish (Steps 347-350)
Professional dark theme with consistent visual hierarchy.
Step 347: Theme System (12 tests)
Goal: Centralized theme definition that every panel reads from.
New file: editor/src/Theme.h (~300 lines)
WhetstoneThemestruct with named semantic colors:bg,bgAlt,bgPanel,bgPopuptext,textDim,textAccent,textError,textWarning,textSuccessborder,borderFocusedaccent,accentHover,accentActive— primary brand colorselectionBg,selectionTextscrollbar,scrollbarHoverdiagnostic_error,diagnostic_warning,diagnostic_info,diagnostic_hintsyntax_keyword,syntax_string,syntax_number,syntax_comment,syntax_function,syntax_type,syntax_operator,syntax_annotation
applyTheme(theme)— sets all ImGui style colors from themegetDefaultDarkTheme() -> WhetstoneTheme— professional dark themegetDefaultLightTheme() -> WhetstoneTheme— clean light alternative- Font configuration: primary (monospace), UI (sans-serif), sizes
Color palette (dark theme):
- Background: deep blue-grey (#1a1d23, #22252b, #2a2d35)
- Text: warm white (#e0e0e0), dim (#808890), accent (#7aa2f7)
- Borders: subtle (#3a3d45), focused (#7aa2f7)
- Errors: soft red (#f7768e), warnings: amber (#e0af68), success: green (#9ece6a), info: blue (#7dcfff)
- Syntax: keywords blue (#7aa2f7), strings green (#9ece6a), numbers orange (#ff9e64), comments grey (#565f89)
Tests: dark theme applies without crash, all semantic colors defined, no color is pure black or pure white (contrast), light theme alternative, applyTheme sets ImGui colors, font sizes reasonable, theme roundtrip to JSON, syntax colors distinct from each other, diagnostic colors match severity, accent color used for focused elements.
Step 348: Syntax Highlighting Refresh (12 tests)
Goal: Update the text editor's syntax highlighting to use theme colors and cover all 10 supported languages.
Modifies: syntax highlighting in text editor component
- Use theme's syntax colors instead of hardcoded values
- Language-aware highlighting (keywords differ per language)
- Semanno comment highlighting:
@semanno:type(key=value)gets distinct annotation color - Line numbers in
textDimcolor - Current line highlight with subtle
bgAltbackground - Selection uses
selectionBg/selectionText - Matching bracket highlight
Tests: Python keywords highlighted, C++ keywords highlighted, Kotlin keywords highlighted, Semanno comments get annotation color, strings in string color, numbers in number color, comments in comment color, current line highlighted, line numbers dimmed, selection visible, theme change updates highlighting, bracket matching visible.
Step 349: Icon System + Visual Indicators (12 tests)
Goal: Consistent iconography across all panels using Unicode symbols (no external icon font dependency — keep it header-only).
New file: editor/src/Icons.h (~100 lines)
- Unicode symbol constants for common items:
- File types: source, header, config, folder, image
- Diagnostics: error circle, warning triangle, info, hint
- Workflow: pending clock, in-progress spinner, complete check, rejected cross, review eye
- AST: function, class, variable, annotation, module
- Navigation: arrow right, arrow down, search, settings
renderIcon(iconType, color)— render icon with theme color- Fallback: if Unicode doesn't render, use text abbreviations (ERR, WARN, etc.)
Tests: all icon constants defined, renderIcon doesn't crash, error icon is distinct from warning icon, file type icons cover 10 languages, workflow status icons cover all states, fallback text works, icon + text alignment correct, icon colors respect theme.
Step 350: Phase 13b Integration — Visual Consistency (8 tests)
Goal: Every panel uses the theme and icons consistently.
Tests:
- All panels use theme background colors (no default ImGui grey)
- Diagnostic panel uses severity icons + colors from theme
- AST panel uses node type icons
- File tree uses folder/file icons
- Status text uses textDim for secondary info
- Focused panel border uses accent color
- Theme switch (dark→light) updates all panels
- No visual artifacts: no overlapping text, no clipped content, no invisible text
Phase 13c: Keyboard System + Key Symbols (Steps 351-355)
The key combination symbol system the user has been asking for.
Step 351: Keybinding Registry (12 tests)
Goal: Centralized keybinding system where every action has a named binding that can be displayed, customized, and persisted.
New file: editor/src/KeybindingRegistry.h (~350 lines)
KeyCombo struct:
modifiers: uint8_t— bitmask: Ctrl, Alt, Shift, Super/Metakey: int— ImGui key codetoString() -> string— "Ctrl+Shift+P", "Alt+F4", etc.toSymbols() -> string— "⌃⇧P", "⌥F4" (platform-aware symbols)- macOS: ⌘ ⌥ ⌃ ⇧
- Linux/Windows: Ctrl Alt Shift Super
matches(ImGuiIO&) -> bool— check if currently pressed
KeyAction enum (or string-based for extensibility):
OpenFile,SaveBuffer,SaveAll,CloseBufferTogglePanel_FileTree,TogglePanel_AST,TogglePanel_DiagnosticsFocusEditor,FocusCommandPaletteNextDiagnostic,PrevDiagnosticRunPipeline,GenerateCodeUndo,RedoFindInFile,FindInProjectToggleAnnotations,InferAnnotationsCreateWorkflow,RouteAll
KeybindingRegistry class:
bind(action, combo)— set binding for actiongetBinding(action) -> KeyCombo— get current bindinggetSymbols(action) -> string— get display symbols for an actionprocessInput(ImGuiIO&) -> optional<KeyAction>— check all bindingsgetAll() -> map<KeyAction, KeyCombo>— for settings UIloadDefaults()— standard keybindingssaveToJson(path)/loadFromJson(path)— persistence
Default bindings:
- Ctrl+S: SaveBuffer, Ctrl+Shift+S: SaveAll
- Ctrl+P: CommandPalette
- Ctrl+B: TogglePanel_FileTree
- Ctrl+Shift+D: TogglePanel_Diagnostics
- F5: RunPipeline
- Ctrl+Z: Undo, Ctrl+Shift+Z: Redo
- Ctrl+F: FindInFile, Ctrl+Shift+F: FindInProject
- F8: NextDiagnostic, Shift+F8: PrevDiagnostic
Tests: bind and retrieve, default bindings loaded, key combo toString, key combo toSymbols (platform-aware), processInput detects active combo, save/load roundtrip, rebind action, conflict detection (same combo for two actions), getSymbols returns displayable string, modifier bitmask correct, matches detects key press.
Step 352: Key Symbol Rendering (12 tests)
Goal: Display key combination symbols inline in menus, tooltips, and the command palette — like every professional editor does.
New file: editor/src/KeySymbolRenderer.h (~150 lines)
renderKeySymbol(combo, theme)— renders a styled key badge inline- Background: slightly lighter than panel bg
- Border: subtle rounded rect
- Text: key symbol in small monospace font
- Example:
[⌃S]rendered as a neat badge
renderActionWithKey(label, action, registry, theme)— renders "Save Buffer ⌃S" with right-aligned key symbols (menu item style)renderKeyChord(combos, theme)— for multi-key sequences ("⌃K ⌃S" style chords)
Tests: single key renders, modifier+key renders, platform symbols correct, menu item layout (label left, key right), chord rendering, key badge has background, theme colors used, empty binding shows nothing, special keys (Enter, Escape, Tab, F-keys) render correctly, long label doesn't overlap key badge.
Step 353: Command Palette (12 tests)
Goal: Ctrl+P opens a fuzzy-search command palette (VS Code style) that lists all available actions with their key symbols.
New file: editor/src/CommandPalette.h (~300 lines)
- Modal popup centered in editor
- Text input at top with fuzzy search
- List of matching actions below, each showing:
- Icon (from Icons.h)
- Action name ("Save Buffer", "Toggle AST Panel", "Run Pipeline")
- Key binding symbol (right-aligned)
- Enter executes selected action
- Escape closes
- Arrow keys navigate list
- Search matches action name, panel name, and command aliases
- Recently used actions appear first
Action sources:
- All KeyAction entries from KeybindingRegistry
- Panel toggles from PanelManager
- RPC methods (RunPipeline, GenerateCode, InferAnnotations, etc.)
- File operations (Open, Save, Close)
Tests: palette opens on Ctrl+P, fuzzy search filters actions, Enter executes action, Escape closes, key symbols displayed, arrow navigation, recent actions first, empty search shows all, partial match works, palette closes after execution, multiple action sources merged, no duplicate entries.
Step 354: Menu Bar with Key Symbols (12 tests)
Goal: Top menu bar (File, Edit, View, Tools, Workflow) with key symbols on every menu item.
Modifies: main editor rendering
- File: New | Open | Save (⌃S) | Save All (⌃⇧S) | Close
- Edit: Undo (⌃Z) | Redo (⌃⇧Z) | Find (⌃F) | Find in Project (⌃⇧F)
- View: Toggle File Tree (⌃B) | Toggle AST | Toggle Diagnostics (⌃⇧D) | Toggle Annotations | Reset Layout
- Tools: Run Pipeline (F5) | Generate Code | Infer Annotations | Validate | Export Semanno
- Workflow: Create Workflow | Route All | View Ready Tasks | Save Workflow
- Help: About | Keyboard Shortcuts
Every menu item uses renderActionWithKey() for consistent key symbol display.
Tests: all 5 menus render, File menu has Save with ⌃S, Edit menu has Undo with ⌃Z, View menu toggles panels, Tools menu runs pipeline, menu items execute correct actions, key symbols visible, menu closes after selection, separator lines between groups, workflow menu items present, submenu rendering.
Step 355: Phase 13c Integration — Keyboard Shortcuts Help Panel (8 tests)
Goal: A dedicated keyboard shortcuts panel and verification that the entire keybinding system works end-to-end.
New panel: Keyboard Shortcuts (accessible from Help menu or Ctrl+?)
- Grouped by category: File, Edit, View, Tools, Workflow, Navigation
- Each row: action name | key symbol | description
- Search/filter bar
- "Customize" button (opens keybinding editor — basic version)
Tests:
- All default bindings displayed in shortcuts panel
- Ctrl+S triggers save action
- Ctrl+P opens command palette
- Command palette shows key symbols for all actions
- Menu items show correct key symbols
- Rebind action → shortcut panel updates
- Key symbols render correctly on current platform
- Full keyboard-driven workflow: Ctrl+P → type "pipeline" → Enter → pipeline runs
Phase 13d: Navigation + Status Bar (Steps 356-360)
Clean navigation: breadcrumbs, status bar, and go-to-definition.
Step 356: Breadcrumb Navigation (12 tests)
Goal: Breadcrumb bar above the code editor showing the current location
in the AST hierarchy: Module > Class > Method > Function.
New file: editor/src/panels/BreadcrumbBar.h (~150 lines)
- Displays path from module root to cursor position's AST node
- Each breadcrumb is clickable → navigates to that node
- Dropdown on each segment → shows siblings (other methods in class, etc.)
- Updates as cursor moves
- Uses compact AST names from CompactAST::getNodeName()
Tests: breadcrumb shows module name, nested path updates with cursor, click navigates to node, dropdown shows siblings, empty file shows module only, deep nesting (4+ levels) renders without overflow, breadcrumb uses theme colors, annotation nodes appear in path.
Step 357: Status Bar (12 tests)
Goal: Bottom status bar showing project state at a glance.
New file: editor/src/panels/StatusBar.h (~200 lines)
- Left section: language indicator + file path
- Center section: cursor position (Ln 42, Col 8) | encoding | line ending
- Right section: workflow status (if active), MCP connection indicator, diagnostic summary (3 errors, 2 warnings)
Status bar segments:
- Language badge: colored badge with language name ("Python", "C++", "Kotlin")
- Workflow badge: phase indicator if workflow active ("Executing 3/10" with progress ring)
- Diagnostic summary: clickable → jumps to diagnostics panel
- MCP indicator: green dot if MCP connected, grey if headless-only
Tests: language badge shows current buffer language, cursor position updates, diagnostic count accurate, workflow badge shows when active, click diagnostic count focuses diagnostics panel, status bar uses theme colors, language changes when switching buffers, encoding display, all sections fit without overflow.
Step 358: Go-to-Definition + Go-to-Symbol (12 tests)
Goal: Navigate by AST structure, not just text search.
Modifies: editor/src/panels/ or code editor component
- Go-to-Definition (F12): Click on a function call → jump to its definition (uses cross-file symbol resolution from Sprint 9d)
- Go-to-Symbol (Ctrl+Shift+O): Open a symbol picker showing all functions/classes/variables in current file with icons
- Go-to-Symbol in Project (Ctrl+T): Same but across all open buffers
- Uses existing
searchProjectandgetInScopeSymbolsRPC infrastructure
Tests: F12 on function call jumps to definition, Ctrl+Shift+O lists file symbols, Ctrl+T lists project symbols, symbol list shows icons by type, filter works on symbol list, cross-file jump opens target buffer, no match shows message, symbols sorted by line number.
Step 359: Find and Replace Improvements (12 tests)
Goal: In-file and project-wide find/replace with result highlighting.
Modifies: text editor component
- Ctrl+F: find bar appears at top of editor (not floating window)
- Result highlighting in editor (all matches highlighted, current match distinct color)
- Match count display ("3 of 17")
- Enter: next match, Shift+Enter: previous match
- Ctrl+H: replace mode (adds replace input field)
- Ctrl+Shift+F: project-wide find (results in bottom panel)
- Search uses
searchProjectfor AST-aware results when possible
Tests: Ctrl+F opens find bar, typing filters matches, match highlighting visible, match count accurate, Enter cycles through matches, Ctrl+H shows replace field, replace works, project-wide search shows results in bottom panel, Escape closes find bar, empty search clears highlights.
Step 360: Phase 13d Integration + Sprint 13 Summary (8 tests)
Goal: Full navigation workflow and sprint verification.
Tests:
- Full keyboard workflow: open file → navigate to function → go-to-definition → breadcrumb click back
- Command palette → "find" → project-wide search → navigate to result
- Status bar reflects buffer switches (language, cursor, diagnostics)
- All panels docked, no floating windows
- Theme consistent across all panels and navigation elements
- Key symbols visible in menus, palette, and shortcuts panel
- Layout save → restart → same layout restored
- Sprint 13 totals: all panels docked, theme applied, keybindings functional, navigation operational
Step & Test Summary
| Phase | Steps | Tests | Theme |
|---|---|---|---|
| 13a | 342-346 | 56 | Docking layout, panel system, file tree, tabbed bottom |
| 13b | 347-350 | 44 | Theme system, syntax highlighting, icons, visual consistency |
| 13c | 351-355 | 56 | Keybinding registry, key symbols, command palette, menus |
| 13d | 356-360 | 56 | Breadcrumbs, status bar, go-to-definition, find/replace |
| Total | 342-360 | ~212 | 19 steps |
Key Files
New files:
editor/src/DockingLayout.h— ImGui docking setup, default layout, persistenceeditor/src/PanelManager.h— panel registration, visibility, renderingeditor/src/Theme.h— semantic color themes, dark/light, font configurationeditor/src/Icons.h— Unicode icon constants, renderIconeditor/src/KeybindingRegistry.h— keybindings, key combos, persistenceeditor/src/KeySymbolRenderer.h— key badge rendering, menu item key displayeditor/src/CommandPalette.h— fuzzy-search command paletteeditor/src/panels/FileTreePanel.h— docked file tree browsereditor/src/panels/BreadcrumbBar.h— AST breadcrumb navigationeditor/src/panels/StatusBar.h— status bar with language/workflow/diagnostic info
Modified files:
editor/src/EditorState.h— docking enable, layout integrationeditor/src/main.cpp— theme application, panel manager initialization- All existing panel renderers — migrate to PanelManager registration
editor/CMakeLists.txt— test targets for steps 342-360
Design Principles
- No floating windows. Every panel docks. Period.
- Key symbols everywhere. If an action has a keybinding, its symbol is visible wherever that action appears — menus, palette, tooltips, shortcuts panel.
- Theme is semantic. Colors are named by purpose (textError, syntax_keyword) not by value. Changing the theme changes everything.
- Keyboard-first. Every action reachable by keyboard. Mouse is optional.
- Professional defaults. First-run experience should look polished, not like a developer's test harness.