docs/internal/ORCHESTRATOR_DOCK_NNG_USABILITY_GUIDE.md
Feature: Orchestrator Dock — the persistent, non-modal left session
column. Opened/focused with Alt+O (or Ctrl+P → "Orchestrator: Toggle Dock").
Build: cargo build --bin fresh (debug, no --release) →
./target/debug/fresh.
Method: Moderated, task-based usability test with think-aloud,
following the Nielsen Norman Group protocol (goal-based scenarios, not
instructions; observe, don't lead; rate findings on the NN/g 0–4
severity scale).
Harness: tmux + send-keys + capture-pane (a single evaluator
drives the keyboard and reads the rendered screen, standing in for a
representative user).
This is the protocol. The companion run + findings live in
ORCHESTRATOR_DOCK_NNG_FINDINGS.md. The lower-level engineering checklist isdock-ux-test-plan.md; this guide is the user-centred layer above it — it asks "can a developer accomplish their goal?", not "does control X fire?".
The dock's job-to-be-done: let a developer running several parallel agent/editor sessions see them all, switch between them instantly, and act on them — without losing their place in the file they're editing.
We want to answer:
"Devon" — staff engineer, parallel-agent workflow. Runs three coding agents at once, each in its own git worktree:
alphaproj(refactor in progress),betaproj(waiting on tests),gammaproj(just spun up). Lives in the terminal; fluent with VS Code / Sublime keybindings; has never used Fresh's orchestrator before. Mental model: "a sidebar of my sessions, like editor tabs but for whole projects." Impatient with modal dialogs that trap focus.
Devon represents the target user: competent, keyboard-first, but with no prior knowledge of the dock's specific keys. Where Devon has to guess, that's the discoverability signal we care about.
# Build (debug — NOT --release, per the task)
cargo build --bin fresh
# Three throwaway git projects = three sessions
mkdir -p /tmp/uxtest/{alphaproj,betaproj,gammaproj}
for p in alphaproj betaproj gammaproj; do
git -C /tmp/uxtest/$p init -q
printf 'hello from %s\n' "$p" > /tmp/uxtest/$p/readme.txt
git -C /tmp/uxtest/$p add -A && git -C /tmp/uxtest/$p commit -qm init
done
# tmux harness — generous size so nothing is clipped
tmux new-session -d -s ux -x 160 -y 42
tmux send-keys -t ux \
'./target/debug/fresh --log-file /tmp/ux.log /tmp/uxtest/alphaproj /tmp/uxtest/betaproj /tmp/uxtest/gammaproj' Enter
Capture after every interaction with
tmux capture-pane -t ux -p and save numbered snapshots to
/tmp/uxrun/NN_label.txt for the findings doc.
Reading the dock: the focused region's right-edge divider wears
the accent (cursor) colour; blurred, it's muted. Session rows show a
status glyph (* working / ✓ idle), a [ ]/[x] checkbox, the name
(bold = active), and a project/on-disk tag.
| Rating | Meaning |
|---|---|
| 0 | Not a usability problem. |
| 1 | Cosmetic — fix only if spare time. |
| 2 | Minor — low priority. |
| 3 | Major — high priority; users are blocked or badly slowed. |
| 4 | Catastrophe — must fix before ship (data loss, dead end, crash). |
Each finding also gets the heuristic it violates (Nielsen's 10) and a fix suggestion.
Each task is a goal, with success criteria the moderator checks against the captured screen, plus the data to record. Do not read the "expected path" aloud — it's for the moderator only.
Scenario: "You've launched the editor with three projects on the go. You want to see all your sessions in one place. Bring up that view."
Ctrl+P → Orchestrator: Toggle Dock).ORCHESTRATOR appears with the
three sessions; the editor chrome (menu/File) sits to its right.Scenario: "Without doing anything yet — what is this list telling you? Which session is active? Is any of them busy?"
*/✓).Scenario: "Switch over to your betaproj work."
beta → editor live-re-roots.Scenario: "Open readme.txt in that session and add a line of
text."
Scenario: "Imagine you had 20 sessions. Jump to the one called
gamma by searching."
/ focuses filter → type gamma → list narrows →
Enter returns to list → ↓/Enter dive.Scenario: "Start a brand-new session for a fourth project."
Alt+N / + New Session button → form → fill →
submit; dock stays visible beside the form.Scenario: "Pick two sessions you're done with — you want to act on both at once."
[x] on rows; bulk actions
(Stop/Archive/Delete) become reachable; disabled states correct.Scenario: "You think there are some sessions hidden. Show all worktrees and any empty sessions; then limit the list to just the current project."
Alt+T worktrees, Alt+I empty/1-file, Alt+P
scope.Scenario: "With the sidebar open, open the command palette, then Settings, then the file explorer. Does everything still behave?"
Ctrl+P (blurs dock, palette opens, dock stays);
Settings renders beside the dock; Ctrl+E explorer focuses, dock
stays.Scenario: "You're done orchestrating. Hide the sidebar and just edit a file like a normal editor — then bring the sidebar back."
Scenario: "This is the thing you'll do all day. Work in one session, hop to your session list, switch to a different session, work there, and keep going back and forth."
For each task record Completion (✔ unaided / ◑ completed after a hint / ✘ failed), time/turns, errors, and a satisfaction 1–7. Roll observations into severity-ranked findings (§4) in the findings doc, each tagged with the violated heuristic and a concrete fix. Lead with P3/P4 (blockers), then P2/P1, then what already works (appendix) as a sanity check on scope.