You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
streamdeck: Review dials silently dead for BUGFIX (investigate/fix) and AIR (pr phase) — phase vocabulary hardcoded to SPIR/PIR #1606
The Review: Files / Headings and Review: Changes / Blocks dials silently no-op for BUGFIX builders during their entire working life (investigate, fix phases) and for AIR builders during the pr phase (until the pr gate is requested). The owner hit this in live use as "the file diff dials sometimes work and sometimes not" — the intermittency is protocol identity, not flakiness.
Diagnosis
phaseArtifactVerb (apps/streamdeck/src/actions.ts:527) resolves dial mode from a hardcoded vocabulary — gates spec-approval | plan-approval | dev-approval | pr | verify-approval, phases specify | plan | implement | review | verify. That list was written against SPIR/PIR's lifecycle. Checked against each bundled protocol's protocol.json phase ids:
SPIR (specify/plan/implement/review/verify) and PIR (plan/implement/review): fully covered.
AIR (implement/pr): the prphase id is unrecognized, so the dials die between entering the phase and the pr gate being requested (blockedGate === 'pr' revives them).
BUGFIX (investigate/fix/pr): investigate and fix are unrecognized — review mode resolves to none for the builder's whole working life; dials only come alive blocked at the pr gate.
Porch init phase and no-status (soft/shell/task) builders: also none.
Two compounding effects make it read as intermittent rather than broken:
The Zoom dial's tap falls back to view-diff for unknown phases (zoomInVerb), so a BUGFIX builder's diff opens normally — then the Review dials won't step it.
The none-mode strip label lies: ReviewNav.renderTo has only a canvas/diff branch for line 1, so none renders the diff label (Files · send) while every gesture is a no-op — violating the dial's own "a gesture is never a surprise" contract and the instrument principle (an instrument answering a narrower question than its face implies must say so).
Owner ruling (2026-09-04)
The pr phase should be diffable as well — by that point (BUGFIX and AIR both) the work exists as a diff.
Fix
Map investigate, fix, and phase pr to diff mode. Prefer deriving the mode from the protocol's own protocol.json phase metadata over extending the hardcoded name list, so new/custom protocols never silently fall out of the vocabulary; if metadata can't express it, extend the list and leave a registration note (the same pattern Tower's GATE_LABELS documents).
Make the none-mode strip label honest (e.g. No review target) instead of rendering the diff label.
Keep init/no-status as none (there is genuinely nothing to review), but with the honest label from (2).
Shipping note
apps/streamdeck change → requires a plugin version bump and an Elgato Marketplace resubmission (review lag ~4–10 working days). Consider batching with other queued plugin work rather than shipping alone.
Scope ruling superseded (owner, 2026-09-04): the review dials revive for the pr phase ONLY. investigate/fix are work-in-progress — a partial or unwritten diff is not a review target — so they stay review-mode none, now with the honest No review target label instead of the old lying Files · send. This narrows the "map investigate/fix/pr to diff mode" direction in this issue's Fix section; DIFF_REVIEW_PHASES = {pr} in PR #1607 (commit dbc1fcc87) documents the exclusion so the ids are not re-added without an owner ruling. Ruling confirmed by the owner's pr-gate approval on that head. Follow-up phase registrations (MAINTAIN/EXPERIMENT/SPIKE) tracked in #1609 — the same WIP-not-a-review-target test presumably applies there.
Activity
amrmelsayed commentedon Sep 4, 2026
On it! Working on a fix now.
[Bugfix #1606] Fix: revive Review dials for BUGFIX/AIR phases + hones…
[Bugfix #1606] docs: sync plugin README + registration note with the …
[Bugfix #1606] chore: update builder thread with CMAP verdicts and ga…
[Bugfix #1606] chore: record architect APPROVE + gate-hold status in …
[Bugfix #1606] Narrow diff-review revival to the pr phase only (owner…
amrmelsayed commentedon Sep 4, 2026
Scope ruling superseded (owner, 2026-09-04): the review dials revive for the
prphase ONLY.investigate/fixare work-in-progress — a partial or unwritten diff is not a review target — so they stay review-modenone, now with the honestNo review targetlabel instead of the old lyingFiles · send. This narrows the "map investigate/fix/pr to diff mode" direction in this issue's Fix section;DIFF_REVIEW_PHASES = {pr}in PR #1607 (commitdbc1fcc87) documents the exclusion so the ids are not re-added without an owner ruling. Ruling confirmed by the owner's pr-gate approval on that head. Follow-up phase registrations (MAINTAIN/EXPERIMENT/SPIKE) tracked in #1609 — the same WIP-not-a-review-target test presumably applies there.[Bugfix #1606] chore: record pr gate approval + protocol-complete hol…
Merge pull request #1607 from cluesmith/builder/bugfix-1606