NOTE 02 — HCI suggestion: render open items as a checkbox form (Remote)

**Note** from Bead: Remote · [canonical source](https://redfish.acequia.io/guerin/.agents/792ebed9-c03a-4ed0-82fb-da4d19a1a5f5/2026-06-22/notes/02-open-items-as-checkbox-form.md) · session 2026-06-22 · discussion: Talk: Remote

**Bead:** `792ebed9` (`bead-remote`) · 2026-06-22 · for Stephen **Trigger (verbatim):** *"give me a form with checkboxes as options to respond. this should always be done with open items. add that as a bead HCI suggestion."*

## The pattern **Whenever an interaction ends with open items / pending decisions, present them to the human as a checkbox (multi-select) form — not as prose.** The human responds by checking the items to proceed with, in one gesture, instead of re-composing a reply that re-quotes the list. Make the open-item set **explicit, selectable, and trackable**, every time there are open items (standing rule, not occasional).

## Why it belongs in bead-remote This is the **human face** of the bead's interaction surface (the two UI faces in [00-bead-remote.md](00-bead-remote.md): HTML control panel for humans; A2A `agent.json`/`OPTIONS` for agents): - It is the **response affordance** for the open items a `step` surfaces — the read-side complement of the `request/`→`response/` dock. An open item is a question; a checkbox is its cheapest response control. - It composes with the **dashboard/timeline** ([01-bead-state-dashboard-and-timeline.md](01-bead-state-dashboard-and-timeline.md)): each bead's open items render as a checklist in its panel; checking an item is a **`request/` PUT** (the checked set → a response envelope the `step` consumes). - It is the same family as the existing **questions protocol** (the pareto-frontier pill UI, project_agent-coordination-pattern): pills express *trade-off* choices; checkboxes express *which-of-these-do-you-want* choices. Both turn an agent's uncertainty into a one-click human response. - Resolved items **apoptose** off the list (project_apoptosis-vs-necrosis); the open-item set is always the live frontier, never stale prose.

## Two renderings of one pattern | Surface | Rendering | Response transport | |---|---|---| | Claude Code (CLI) | `AskUserQuestion` multi-select | tool result → the agent acts on checked items | | bead-remote HTML control panel | a `<form>` of `<input type=checkbox>` over the bead's open items | `PUT` the checked set into the bead's `request/` dock → `step` reads it | | A2A (agent caller) | open items exposed in `agent.json` / `OPTIONS` as a selectable capability list | the caller PUTs its selection envelope | Same semantics, content-negotiated by who is responding — exactly the bead duck-typing rule applied to the **response** surface, not just the request surface.

## Spec sketch (for the HTML control-panel face) ```html <form data-bead="<guid>" data-dock="request/"> <fieldset> <legend>Open items — check to proceed</legend> <label><input type="checkbox" name="item" value="prune-acequiacomponent"> Prune the acequiaComponent block (de-reify)</label> <label><input type="checkbox" name="item" value="cameras-splat-pipeline"> Build cameras→splat pure-protocol pipeline</label> <!-- one <label> per open item, sourced from the bead's open-items list --> </fieldset> <button>Respond</button> <!-- PUT { selected:[...] } -> request/<id>.json --> </form> ``` A free-text "Other / add an item" input always accompanies the checkboxes (the human can answer outside the offered set), mirroring `AskUserQuestion`'s implicit "Other."

## Open questions 1. **Source of open items** — does a bead expose its open items at a well-known path (e.g. `open-items.json`) the control panel reads, or are they parsed from the latest note's "Open questions"? 2. **Response shape** — `{ selected: [ids], other: "free text" }` PUT to `request/`; confirm the envelope. 3. **Single vs multi** — default multi-select (checkboxes); use radio when items are mutually exclusive (the pareto pill UI already covers the trade-off case). 4. **Closure** — checking an item moves it to `response/`; the `step` marks it done and it drops off the live list (apoptosis). Confirm the lifecycle.