Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
9e83919
chore(porch): 1465 init pir
amrmelsayed Aug 15, 2026
3d1407b
[PIR #1465] Plan draft
amrmelsayed Aug 15, 2026
94a6bea
chore(porch): 1465 plan-approval gate-requested
amrmelsayed Aug 15, 2026
de9fa08
[PIR #1465] Plan revised
amrmelsayed Aug 15, 2026
e5d2fe5
chore(porch): 1465 plan-approval gate-approved
amrmelsayed Aug 15, 2026
a77b50a
chore(porch): 1465 implement phase-transition
amrmelsayed Aug 15, 2026
a73523b
[PIR #1465] Size the Row-1 window from placed builder keys
amrmelsayed Aug 15, 2026
99491b5
[PIR #1465] Retire the manual Slot PI field; document placed-key wind…
amrmelsayed Aug 15, 2026
2feb849
[PIR #1465] Tests: dynamic window sizing, the selected-always-shown i…
amrmelsayed Aug 15, 2026
662bff0
[PIR #1465] Update builder thread (implement phase)
amrmelsayed Aug 15, 2026
f2aed1a
chore(porch): 1465 dev-approval gate-requested
amrmelsayed Aug 15, 2026
3bbf157
[PIR #1465] Docs: recommended SD+ layout leads with the architect anchor
amrmelsayed Aug 15, 2026
7267a06
[PIR #1465] Update builder thread (README scope addition)
amrmelsayed Aug 15, 2026
8c016a9
[PIR #1465] Docs: revise recommended Row 2 (free · Gate · Arch(bldr) …
amrmelsayed Aug 15, 2026
b5c0702
[PIR #1465] Update builder thread (Row 2 layout revision)
amrmelsayed Aug 15, 2026
a4387d1
chore(porch): 1465 dev-approval gate-approved
amrmelsayed Aug 15, 2026
bb48f5c
chore(porch): 1465 review phase-transition
amrmelsayed Aug 15, 2026
1a96352
[PIR #1465] Review + retrospective
amrmelsayed Aug 15, 2026
db280e3
chore(porch): 1465 record PR #1468
amrmelsayed Aug 15, 2026
d283ba5
chore(porch): 1465 review build-complete
amrmelsayed Aug 15, 2026
39da9ee
[PIR #1465] Address consultation: stale docs + positional-order test
amrmelsayed Aug 15, 2026
37a34a8
chore(porch): 1465 pr gate-requested
amrmelsayed Aug 15, 2026
f1c504e
[PIR #1465] Consultation rebuttal (iter 1): all findings accepted + f…
amrmelsayed Aug 15, 2026
e097eda
chore(porch): 1465 pr gate-approved
amrmelsayed Aug 15, 2026
393feab
chore(porch): 1465 protocol complete
amrmelsayed Aug 15, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 38 additions & 24 deletions apps/streamdeck/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -96,12 +96,12 @@ the selection, the dials review it.**
│ STREAM DECK + │
│ │
│ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │
│ │ Builder│ │ Builder│ │ Builder│ │ Builder│ Row 1: │
│ │ slot 1 │ │ slot 2 │ │ slot 3 │ │ slot 4 │ selectors │
│ │OpenArch│ │ Builder│ │ Builder│ │ Builder│ Row 1: │
│ │ (main) │ │ (1st) │ │ (2nd) │ │ (3rd) │ selectors │
│ └────────┘ └────────┘ └────────┘ └────────┘ │
│ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │
│ │Approve │ │ Dev │ │Send Fb │ │ Bldr │ Row 2: │
│ │ Gate │ Server │ │ (N) │ │ Term │ palette │
│ │ │ │Approve │ │OpenArch│ │ Bldr │ Row 2: │
│ │ (free) │Gate │ │ (bldr) │ │ Term │ palette │
│ └────────┘ └────────┘ └────────┘ └────────┘ │
│ ┌──────────────────────────────────────────────┐ │
│ │ touch strip: each dial's title + live detail │ │
Expand All @@ -112,15 +112,27 @@ the selection, the dials review it.**
└──────────────────────────────────────────────────────────┘
```

- **Row 1 — fleet selectors.** Four **Builder Action** keys, one per slot (1–4).
They are a **4-wide window** onto the fleet: with more than four builders the
**Select dial** (Zoom Navigator rotate) scrolls the window to builders 5–8, 9–N,
and the slot holding the current selection is accented. Press selects the builder
- **Row 1 — selectors, anchored by the architect.** Slot 1 is **Open Architect
Terminal** pinned to **Main** mode: a fixed anchor at the left of the board that
opens the workspace's `main` architect. It can sit in Row 1 without breaking the
"Row 1 selects" invariant precisely because Main mode is **selection-independent** —
it always targets `main`, so it neither reads nor moves the shared selection. Slots
2–4 are **Builder Action** selectors — here **three** of them.
The selectors are a **window** onto the fleet whose width is **exactly the number of
Builder Action keys you place** (three here), not a fixed count: the keys self-order
by physical position (left to right, top row first), so there are no slot numbers to
set, and a Mini or an XL sizes itself the same way. With more builders than keys the
**Select dial** (Zoom Navigator rotate) scrolls the window a page at a time, and the
slot holding the current selection is accented. Because the window follows the placed
keys, a builder is never selectable while shown on no key. Press selects the builder
(Row 2 + the dials follow) and opens its phase artifact.
- **Row 2 — action palette**, fixed in place, always acting on the **selected**
builder: **Approve Gate · Dev Server · Send Feedback (N) · Open Builder
Terminal**. Its sibling **Open Architect Terminal** opens the owning architect
instead — place it where a slot frees up (e.g. Send Feedback in forward mode).
builder: slot 1 is **free** (drop any key here — e.g. Dev Server or Send Feedback),
then **Approve Gate · Open Architect Terminal (builder mode) · Open Builder
Terminal**. The Row-2 architect key is pinned to **builder** mode, so it opens the
**selected builder's owning architect** — the per-builder complement to Row 1's
`main`-mode anchor. Between the two keys, both `main` and whoever spawned the current
builder are one press away.

Nothing is fixed — drag whatever you want onto each slot in the Stream Deck app.
The 5th encoder, **Spawn from Backlog**, can swap onto a dial in place of any of
Expand All @@ -130,13 +142,16 @@ the four above (e.g. replace PR Nav when you are triaging the backlog).

### Keys

- **Builder Action** (Row 1) — a live tile for a builder **slot**, but as a 4-wide
**window** onto the fleet, not a fixed index: slot N shows the Nth builder on the
current page, and the **Select dial** scrolls the page so a fleet larger than four
is fully reachable. It shows the builder's issue + phase, accents the slot holding
the selection, and on press selects the builder (Row 2 + the dials follow) and
opens its phase artifact. The default press verb is **Automatic** (the current
phase's spec / plan / diff); pick a fixed verb in the PI to always run that.
- **Builder Action** (Row 1) — a live tile for a builder **slot**, as a **window**
onto the fleet whose width is the number of these keys you placed (not a fixed
index): the key's slot is its position among them (reading order, row then column),
so the Nth key shows the Nth builder on the current page, and the **Select dial**
scrolls the page so a fleet larger than the window is fully reachable. Because the
window matches the placed keys, a builder is never selectable while shown on no key.
It shows the builder's issue + phase, accents the slot holding the selection, and on
press selects the builder (Row 2 + the dials follow) and opens its phase artifact.
The default press verb is **Automatic** (the current phase's spec / plan / diff);
pick a fixed verb in the PI to always run that.
- **Approve Gate** (Row 2) — the **single** approve affordance. Acts on the
**selected** builder: the face shows its pending gate (e.g. `Plan · Approve`), and
press surfaces that gate's **approval modal in the focused VSCode window** for you
Expand Down Expand Up @@ -164,12 +179,11 @@ the four above (e.g. replace PR Nav when you are triaging the backlog).
in Main mode when `main` isn't live, VSCode opens the first architect while the
face still reads `Main` (the mode reflects your configured intent); and a live
architect registration behind a dead terminal opens a session nobody reads (the
deck can't detect it). Placement caveat: the Main-mode key is selection-
independent, so it can live on a **Row 1** key without affecting selection — but
Row 1's window is a fixed page of four (independent of how many Builder Action
keys you place), so freeing a Row 1 key leaves three builder slots and hides
every fourth builder past a three-builder fleet. Recommended for small working
sets; self-sizing the Row 1 window is tracked separately (#1465).
deck can't detect it). Placement: the Main-mode key is selection-independent, so
it can live on a **Row 1** key without affecting selection — and because Row 1's
window sizes itself to the Builder Action keys you actually place (#1465), giving a
Row 1 key to this one simply leaves a correctly-sized three-wide builder window,
with no hidden builders. That is the recommended layout above (Row 1 slot 1).
- **Codev Action** — fires a workspace verb. Choose it in the Property Inspector
(Open Architect/Builder Terminal, View Diff, Send Message, Spawn Builder,
Refresh Overview). Defaults to Refresh Overview. (The Open Architect Terminal
Expand Down
2 changes: 1 addition & 1 deletion apps/streamdeck/com.cluesmith.codev.sdPlugin/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@
{
"Name": "Builder Action",
"UUID": "com.cluesmith.codev.builder-action",
"Tooltip": "Live tile for the Nth builder (set the slot in the property inspector). Shows its issue + phase; press selects the builder and opens the artifact for its current phase (spec / plan / diff), or a fixed verb you choose.",
"Tooltip": "Live tile for a builder — its slot is where you place the key (the selectors self-order left to right, top row first). Shows its issue + phase; press selects the builder and opens the artifact for its current phase (spec / plan / diff), or a fixed verb you choose.",
"Icon": "icons/list/builder-action",
"Controllers": [
"Keypad"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,11 @@
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<!-- sdpi-components binds <sdpi-select setting="slot"> to this key's persisted
<!-- sdpi-components binds <sdpi-select setting="verb"> to this key's persisted
settings over the property-inspector protocol. -->
<script src="lib/sdpi-components.js"></script>
</head>
<body>
<sdpi-item label="Slot">
<sdpi-select setting="slot" default="1">
<option value="1">Slot 1</option>
<option value="2">Slot 2</option>
<option value="3">Slot 3</option>
<option value="4">Slot 4</option>
<option value="5">Slot 5</option>
<option value="6">Slot 6</option>
<option value="7">Slot 7</option>
<option value="8">Slot 8</option>
</sdpi-select>
</sdpi-item>
<sdpi-item label="On press">
<sdpi-select setting="verb" default="automatic">
<option value="automatic">Automatic (open current phase's artifact)</option>
Expand All @@ -32,10 +20,13 @@
</sdpi-select>
</sdpi-item>
<sdpi-item label="">
<small>Pins this key to the Nth builder (slot 1 = first builder) and shows
its issue + phase. Press selects that builder. On Automatic, the press opens
the artifact for its current phase (spec / plan / diff), re-openable every
press; pick a fixed verb to always run that instead.</small>
<small>Each Builder Action key is one slot in a window onto the fleet, sized to
how many of these keys you place: the leftmost (top row first) shows the first
builder, the next shows the second, and so on, and the Select dial scrolls the
window when there are more builders than keys. Just place as many as you like —
no slot numbers to set. Press selects that builder; on Automatic it opens the
artifact for its current phase (spec / plan / diff), re-openable every press.
Pick a fixed verb to always run that instead.</small>
</sdpi-item>
</body>
</html>
Loading
Loading