Audit all TUI keyboard bindings — universal, view-specific, modal-scoped — and flag conflicts, undocumented keys, and cleanup candidates.
Produce a complete keybinding reference for the conductor TUI, grouped by scope, with conflict detection and a diff against the in-app help text.
All keyboard logic lives in two files — read both in full before producing any output:
conductor-tui/src/input.rs — single source of truth for all key→action mappings (map_key())conductor-tui/src/ui/help.rs — the help modal shown to users (? key)Do not rely on grep or partial reads. Read each file completely.
input.rsWalk through map_key() in priority order and record every binding:
Ctrl+C)Modal::* variantstate.any_filter_active()gg chord, Ctrl+d, Ctrl+u (before view-specific block)View::* variant, noting any additional conditions (agent active, pane focused, etc.)match key.code fallthrough blockFor each binding record: key, condition (if any), action name, scope.
help.rsParse every help_line(key, description) call and collect the set of documented keys.
Keys from the global override, global vim-scroll, and global normal blocks.
## Universal Keys
| Key | Action | Notes |
|---|---|---|
| `Ctrl+C` | Quit | Always fires, highest priority |
...
One table per view. Include the condition column when bindings are conditional.
## View: WorktreeDetail
| Key | Condition | Action | Shadows Global? |
|---|---|---|---|
...
## View: Workflows
...
One table per modal type.
## Modal: Confirm
| Key | Action |
|---|---|
...
## Filter Mode
| Key | Action |
|---|---|
...
After the tables, print a Conflicts & Shadows section listing every case where:
q)Format:
## Conflicts & Shadows
- `a` — global: AddRepo | WorktreeDetail (agent active): AttachAgent
- `j` — global: MoveDown | WorktreeDetail: AgentActivityDown (panel navigation lost)
...
Print two lists:
Undocumented keys — bindings in input.rs not present in help.rs:
## Undocumented (in input.rs but missing from help.rs)
- `!` → ToggleStatusBar
- `3` → GoToWorkflows
...
Stale help entries — keys documented in help.rs that don't exist or differ in input.rs:
## Stale Help Entries (in help.rs but not in input.rs)
- (none) or list items
After the diffs, print an actionable Cleanup Candidates section. Categorize each item:
2 and t both GoToTickets); suggest removing onehelp.rsg in WorkflowRunDetail intercepting gg)Format:
## Cleanup Candidates
- **Redundant**: `t` and `2` both map to GoToTickets — remove `t` or `2`
- **Confusing shadow**: `o` means OrchestrateAgent (WorktreeDetail, agent inactive) vs OpenTicketUrl (global) — consider a less-common key for orchestrate
...
End with a one-line summary:
X universal keys, Y view-specific bindings across Z views, W modal scopes. N conflicts, M undocumented.