workbench_profile_and_workflow_composition_spec - mark-ik/graphshell GitHub Wiki
Date: 2026-03-06 Status: Canonical profile contract Priority: Implementation-ready
Related:
WORKBENCH.mdworkbench_frame_tile_interaction_spec.md../aspect_control/settings_and_control_surfaces_spec.md../aspect_input/input_interaction_spec.md../aspect_command/command_surface_interaction_spec.md../subsystem_focus/focus_and_region_navigation_spec.md../2026-03-01_ux_migration_feature_spec_coverage_matrix.md
This spec defines the canonical WorkbenchProfile object used to compose workspace behavior from one named profile.
It canonicalizes:
- Interaction preference composition (
InputProfile, focus/open policies). - Pane behavior defaults (open/duplicate/close/degrade policies).
- Command-surface preferences (palette/radial/omnibar behavior defaults).
- Navigator host preferences (scope, edge, form factor, and host layout).
- Workflow presets (named bundles for repeatable task flows).
- Persistence boundaries and settings-surface ownership.
This spec does not redefine Graph truth or reducer semantics.
WorkbenchProfile is a named, versioned object with stable ID and explicit ownership scope.
WorkbenchProfile {
id: WorkbenchProfileId,
version: u32,
label: String,
interaction: InteractionPreferences,
pane_defaults: PaneBehaviorDefaults,
command_surface: CommandSurfacePreferences,
navigator_hosts: Vec<NavigatorHostPreferences>,
workflow_presets: Vec<WorkflowPreset>
}WorkbenchProfileId must follow namespace:name format.
- Workbench subsystem owns
WorkbenchProfileselection and application. - Input aspect owns
InputProfileresolution and event routing. - Command aspect owns action meaning and command execution semantics.
- Settings/control surfaces own edit/apply/persist UX for profile objects.
InteractionPreferences {
input_profile_id: String,
per_context_input_overrides: Map<InputContext, String>,
focus_return_policy: FocusReturnPolicy,
open_routing_policy: OpenRoutingPolicy
}Rules:
-
input_profile_idreferences anInputProfileregistered inInputRegistry. - Missing profile references must degrade to the active default profile with diagnostic warning.
-
focus_return_policymust comply with deterministic return contracts in the Focus subsystem.
PaneBehaviorDefaults {
open_mode_default: OpenMode,
duplicate_policy: DuplicatePolicy,
close_handoff_policy: CloseHandoffPolicy,
inactive_pane_degrade_policy: InactivePaneDegradePolicy
}Rules:
- Defaults apply only when an action does not provide explicit overrides.
- Graph identity and reducer ownership are unchanged by pane-default selection.
-
close_handoff_policymust remain deterministic and focus-safe.
CommandSurfacePreferences {
palette_enabled: bool,
radial_enabled: bool,
omnibar_enabled: bool,
omnibar_focus_policy: OmnibarFocusPolicy,
category_order_policy: CategoryOrderPolicy,
pinned_action_ids: Vec<ActionId>
}Rules:
- Command execution authority remains
ActionRegistry. -
omnibar_focus_policymust preserve explicit-focus ownership requirements. - Pinned actions must be treated as hints, not permission bypasses.
NavigatorHostPreferences {
host_id: NavigatorHostId,
enabled: bool,
scope: NavigatorScope,
form_factor: NavigatorFormFactor,
anchor_edge: AnchorEdge,
size_fraction: f32,
cross_axis_margin_start_px: f32,
cross_axis_margin_end_px: f32
}Rules:
-
host_idis stable and unique within oneWorkbenchProfile. - At most one Navigator host may occupy a given edge at a time.
- Multiple Navigator hosts may be enabled simultaneously so long as their resolved bounds do not overlap.
-
Top/Bottomhosts default toToolbarform factor. -
Left/Righthosts default toSidebarform factor. - Dragging a host across axes may change its default form factor, but the chosen form factor is still persisted explicitly in the profile.
-
scopeis per host; different hosts may project different scopes at the same time. - Cross-axis margins are part of the remembered layout contract and must be restored with the host.
Suggested enums:
NavigatorHostId = Top | Bottom | Left | Right
NavigatorScope = Both | GraphOnly | WorkbenchOnly | Auto
NavigatorFormFactor = Sidebar | Toolbar
AnchorEdge = Top | Bottom | Left | RightWorkflowPreset {
id: WorkflowPresetId,
label: String,
target_workbench_layout: Option<WorkbenchLayoutTemplateId>,
startup_routes: Vec<String>,
startup_actions: Vec<ActionId>
}Rules:
- Presets are declarative bundles for repeatable workflows (for example review, research, triage).
- Preset application may open panes and trigger actions through existing authorities only.
- Presets must not directly mutate graph state outside reducer-approved intents.
- Profile catalog persistence is user-scoped.
- Active profile selection is workspace-scoped.
- Optional per-workbench override is workbench-scoped.
- Navigator host enablement, scope, edge, form factor, and host margins are
profile-owned settings that may be overridden per workbench only through the
active
WorkbenchProfileresolution chain.
At runtime, resolve profile by this deterministic chain:
- Explicit per-workbench
profile_idoverride. - Workspace active
profile_id. - User default
profile_id. - Built-in fallback
workbench_profile:default.
- Profile application is atomic at the profile object boundary.
- Invalid field references degrade by domain (input, pane, command) and emit diagnostics.
- Partial apply is allowed only with explicit diagnostics and domain-safe fallbacks.
- Persistence write failures must preserve runtime-applied state and surface explicit warning.
Settings ownership is defined in ../aspect_control/settings_and_control_surfaces_spec.md.
Required settings routes:
verso://settings/workspaces/profilesverso://settings/workspaces/workflows
Required operations:
- Create, clone, rename, delete profile.
- Set workspace active profile.
- Set or clear per-workbench profile override.
- Enable/disable Navigator hosts.
- Change Navigator host scope, anchor edge, form factor, and margins.
- Apply workflow preset and preview affected domains.
| Channel | Severity | Condition |
|---|---|---|
ux:contract_warning |
Warn |
Profile references missing/invalid component and fallback is applied |
ux:navigation_transition |
Info |
Profile or preset application triggers route/open transitions |
ux:navigation_violation |
Warn |
Profile application requests unsupported route/open/focus handoff |
- A canonical
WorkbenchProfileschema exists and is cross-linked from workbench and settings specs. - Profile resolution chain is deterministic and documented.
- Interaction, pane, command-surface, and workflow domains are represented in one profile object.
- Navigator host settings are represented in the profile with stable host IDs.
- Settings routes for profile and workflow editing are explicit.
- Persistence boundaries (user/workspace/workbench) are explicit and non-overlapping.
- Fallback and failure behavior is diagnostics-backed.