Skip to content

Stream Deck SD+: two-zone builder workflow (selectors + action palette, dial-driven feedback queue) #1410

Description

@amrmelsayed

Problem

We now have one key per builder (#1404: merged Builder Action, phase-aware press that also selects the builder). But covering a builder end-to-end needs several actions (approve a gate, run dev, send review feedback), and the recently added queued code-review feedback has no hardware trigger. We want an efficient SD+ layout where the deck is a remote control and VSCode is the screen, bound by a single shared selection.

Ground truth

  • A shared zoom cursor already exists (store.cursor, selectedBuilder()); DevServerAction, the diff dials, ScrollNav, and ZoomNav act on it. After Stream Deck: merge Fleet Slot into Builder Action (phase-aware press) #1404, pressing a Builder Action key sets that cursor (syncToBuilder).
  • Diff dials already use all three gestures each (rotate = navigate, press = forward-*, tap = jump-to-first). They are at gesture budget.
  • We support SD+ only for now: 8 LCD keys (2 rows of 4) + 4 dials + touchstrip.
  • Feedback delivery mode (forward immediately vs queue) is a VSCode workspace setting the engineer sets; the deck must follow it, not guess.

Requirements

  1. Two stable zones (no modal re-organization).
    • Row 1 (4 keys): fleet selectors = the Stream Deck: merge Fleet Slot into Builder Action (phase-aware press) #1404 Builder Action keys. Render status; press selects (+ opens the phase artifact). A 4-wide window onto the fleet; the Select dial reaches builders past the first four.
    • Row 2 (4 keys): action palette, fixed in place, always acting on the selected builder: [Approve gate] [Run Dev] [Send Fb (N)] [ Next / free ]. Rejected: activating a builder to re-flow all keys (modal, kills muscle memory, ambiguous state).
  2. Dials collect, key commits. Repoint each diff dial press from immediate send to submitting the chunk as feedback via a mode-neutral verb (feedback-file / feedback-hunk / feedback-selection). VSCode routes it forward-now or enqueue per the workspace setting. Dial rotate = navigate (unchanged), tap = jump-to-first (unchanged).
  3. Send Fb (N) key = flush. Fires a send-queue verb; badge N mirrors the per-builder queued count from the overview. In immediate mode N stays 0 and the key is inert; in queued mode N climbs and the key sends. No deck-side mode inference.
  4. Legibility, not just correctness. Because the same dial press sends in one workspace and queues in another, surface the current mode on the dial touchscreen (e.g. Files · queue vs Files · send) so a press is never a surprise.
  5. Overview wire. Add a per-builder queued-feedback count so the deck can render N (alongside the queue capability already added on the VSCode side).
  6. No approval semantics leak. Row 2 Approve acts on the selected builder and routes through the existing confirmation. Decide deliberately whether it supersedes the standalone ApproveGate singleton, or the singleton's "jump to next pending" folds into a Row 2 Next / attention key (jump selection to the highest-priority builder). Don't ship two muddy approve affordances.

Out of scope / relation

Suggested protocol

PIR: the dial feedback loop, the mode-follows-setting behavior, and the Row 2 palette all need hardware verification before a PR.

Metadata

Metadata

Assignees

No one assigned

    Labels

    area/cross-cuttingTouches multiple areas — needs coordinated handling

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions