From 32c6bc272ba6f8019934d98a74725d0037a6c66d Mon Sep 17 00:00:00 2001 From: ducoterra Date: Sun, 1 Nov 2026 19:41:24 -0500 Subject: [PATCH] chore(agent): phase roadmap from TODO.md, 3 phases MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Convert the three open TODO items into .agents/phases/todo/ directories (Protocol B append — PLAN.md, AGENTS.md and existing phases untouched, so PLAN.md's roadmap table does not list these phases): - 01_keyboard_kiosk_control (TODO.md:3) — mouse-free /watch and /mirror: key router, j/k/Enter/f/g/n/p/1-9/m/?, focus-visible controls, help overlay. - 02_sharp_capture (TODO.md:4) — capture screen pixels instead of window pixels, maintain-resolution per leg, 12 -> 25 Mbit/s default cap, real-desktop size assertion on the viewer. - 03_audio_share (TODO.md:5) — one accumulating MediaStream per tile (the ontrack overwrite dropped the first track), staged-only unmute policy, honest audio states on /mirror, viewer-side inbound-audio assertion. Every task cites its TODO source line. Locked with the user: 25 Mbit/s default, only the staged mirror can be audible, full key map. Note for the user: PLAN.md section 6 still says the per-leg cap defaults to 12 Mbit/s; phase 02 task 03 changes that and this commit does not edit PLAN.md. LLM-Generated: true --- .../01_keyboard_kiosk_control/00_phase.md | 89 ++++++++++++++++++ .../01_keyboard_command_router.md | 88 ++++++++++++++++++ .../02_wall_navigation_commands.md | 80 +++++++++++++++++ .../03_keyboard_reachable_tile_controls.md | 76 ++++++++++++++++ .../04_help_overlay_and_keyboard_e2e.md | 82 +++++++++++++++++ .../phases/todo/02_sharp_capture/00_phase.md | 70 +++++++++++++++ .../01_capture_resolution_constraints.md | 84 +++++++++++++++++ .../02_sharp_capture/02_sender_fidelity.md | 87 ++++++++++++++++++ .../03_bitrate_default_and_surface.md | 72 +++++++++++++++ .../04_sharpness_assertion_e2e.md | 78 ++++++++++++++++ .../phases/todo/03_audio_share/00_phase.md | 90 +++++++++++++++++++ .../03_audio_share/01_audio_leg_plumbing.md | 87 ++++++++++++++++++ .../02_staged_audio_playback.md | 77 ++++++++++++++++ .../03_audio_source_reporting.md | 88 ++++++++++++++++++ .../03_audio_share/04_audio_e2e_and_docs.md | 88 ++++++++++++++++++ TODO.md | 1 + 16 files changed, 1237 insertions(+) create mode 100644 .agents/phases/todo/01_keyboard_kiosk_control/00_phase.md create mode 100644 .agents/phases/todo/01_keyboard_kiosk_control/01_keyboard_command_router.md create mode 100644 .agents/phases/todo/01_keyboard_kiosk_control/02_wall_navigation_commands.md create mode 100644 .agents/phases/todo/01_keyboard_kiosk_control/03_keyboard_reachable_tile_controls.md create mode 100644 .agents/phases/todo/01_keyboard_kiosk_control/04_help_overlay_and_keyboard_e2e.md create mode 100644 .agents/phases/todo/02_sharp_capture/00_phase.md create mode 100644 .agents/phases/todo/02_sharp_capture/01_capture_resolution_constraints.md create mode 100644 .agents/phases/todo/02_sharp_capture/02_sender_fidelity.md create mode 100644 .agents/phases/todo/02_sharp_capture/03_bitrate_default_and_surface.md create mode 100644 .agents/phases/todo/02_sharp_capture/04_sharpness_assertion_e2e.md create mode 100644 .agents/phases/todo/03_audio_share/00_phase.md create mode 100644 .agents/phases/todo/03_audio_share/01_audio_leg_plumbing.md create mode 100644 .agents/phases/todo/03_audio_share/02_staged_audio_playback.md create mode 100644 .agents/phases/todo/03_audio_share/03_audio_source_reporting.md create mode 100644 .agents/phases/todo/03_audio_share/04_audio_e2e_and_docs.md create mode 100644 TODO.md diff --git a/.agents/phases/todo/01_keyboard_kiosk_control/00_phase.md b/.agents/phases/todo/01_keyboard_kiosk_control/00_phase.md new file mode 100644 index 0000000..318306e --- /dev/null +++ b/.agents/phases/todo/01_keyboard_kiosk_control/00_phase.md @@ -0,0 +1,89 @@ +# Phase 01 — Keyboard-only control of the wall + +**Source:** `TODO.md` L3 — "Need keyboard shortcuts. This will be deployed on a kiosk mode linux client that won't have a mouse. Need to be able to fullscreen a mirror, switch between them easily, etc." +**Story:** n/a +**Context:** `.agents/PLAN.md` §2 A9 (hand-written ES modules, no framework), A10 (nothing from outside the origin), A13 (Playwright, `channel="chromium"`); `docs/kiosk-silverblue.md` (the target box: GNOME Kiosk + Firefox `--kiosk` pointed at `/watch`, set up over SSH with **no keyboard, no monitor, no console**); `src/mirror/static/watch.js`, `watch.html`, `share.js`, `mirror.html`, `app.css` + +## Objective + +Operate the whole product from a keyboard. On `/watch`: select a mirror, take it +fullscreen over the wall, step to the next/previous, jump by number, mute, and get +an on-screen list of the keys. On `/mirror`: start and stop a share without a +pointer. + +Just as important: **remove the pointer-only affordances**. `.tile .actions` is +`opacity: 0` until `:hover` (`app.css` L351–352) and the staged caption fades to +`0.28` (L396–409) — on a kiosk with no mouse those controls do not exist, so a +mirror can currently be neither un-muted nor exited once it is on stage. + +## Dependencies + +— (none). This is the first phase of the roadmap. + +## Tasks + +1. `01_keyboard_command_router.md` — one focus-aware keydown router on `/watch` + plus a keyboard "cursor" over the tiles (`j`/`k`/`↑`/`↓`). +2. `02_wall_navigation_commands.md` — `Enter`/`f`, `g`, `n`/`p`, `1`–`9`, `m` + wired to the existing `stage()`/`unstage()` plumbing. +3. `03_keyboard_reachable_tile_controls.md` — focus-visible affordances: every + hover-only control becomes reachable and legible without a mouse. +4. `04_help_overlay_and_keyboard_e2e.md` — `?` help overlay, `/mirror` `s`/`x`, + a mouse-free Playwright suite, and the kiosk/README keyboard docs. + +## Key map (locked by the user for this phase) + +| Key | Scope | Action | +|---|---|---| +| `j` `k` `↓` `↑` | `/watch` | move the selection to next / previous tile (wraps) | +| `Enter` `f` | `/watch` | stage the selected mirror fullscreen (`f` re-enters fullscreen when already staged) | +| `g` | `/watch` | back to the wall (unstage) | +| `n` `p` | `/watch` | stage next / previous mirror | +| `1`–`9` | `/watch` | stage the Nth mirror in grid order | +| `m` | `/watch` | mute / unmute the staged mirror | +| `?` | `/watch` | toggle the help overlay | +| `Esc` | both | `/watch` unstages (already exists); `/mirror` stops sharing (already exists) | +| `s` `x` | `/mirror` | start / stop sharing | + +Never intercepted: any chord containing `Ctrl`/`Cmd`/`Alt`, and every key while an +``, `