Steer dialog round H: unread-driven response tail, exit codes behind "?" #32

Merged
ClaudiuSchuster merged 1 commit from oss-oo/observatory-steerux-erux20260925 into main 2026-09-24 21:23:33 +00:00
Owner

Owner findings after live steering, round H of the steer-dialog UX refinement.

Finding 1 — response-tail block below the prompt

Root cause: the terminal status render always embedded the full responseTail as a permanently expanded block (.steertail, max-height 30vh) — large, always present after any steer, and visually cut off at both ends (mid-content start inherent to a 500-char tail; bottom cut behind scroll).

Fix — unread-driven pattern:

  • The full block shows only while UNREAD, with its own scroll area (max-height: 40vh) and an explicit ⋯ beginning cut — last 500 chars hint (new tailTruncated payload flag from /steer/latest).
  • Once initially read — expanded block dwelled ~1.5 s in view (≥60% overlap, live-DOM check so poll re-renders cannot reset it) or the collapse control clicked — it auto-collapses to a slim one-line summary chip: ✅ completed · <last line…>.
  • The chip is a manual expand toggle (class-flip only, scroll/selection preserved); new content (new steer id or changed tail — e.g. a queued steer delivered by the sweeper) re-expands the block with a ● new unread badge.
  • Read state is shared between the drawer and modal surfaces (steerRead map, keyed by steer id + tail).

Finding 2 — exit-codes legend read like live status

Root cause: every status render appended the static STEER_LEGEND line ("exit codes: 0 ok · 3 busy… · 4 failed · 5 timeout…"), so a reference table sat under live states and read like current status ("4 failed?? why?").

Fix:

  • The status line explains ONLY the current contextual state, friendly meaning first (✅ steer ended — turn completed (exit 0), running/queued/delivered/timeout/failed each with their own line).
  • The full exit-code table moved behind a small ? affordance next to the status: a popover explicitly headed static reference — not the live status of this steer, built from the same STEER_EXIT map the status line uses so the two can never drift. Click-outside and re-click both close it.

Also

  • README steer-dialog sections updated to match; intro paragraph reflowed to repair a pre-existing MD013 violation (line 8 was 608 chars since round G).

Evidence

  • Local gates: py_compile, --help boot check, node --check on the extracted script, Super-Linter slim v8.7.0 lane (BASH, BASH_EXEC, JSON, PYTHON_PYLINT 10/10, PYTHON_RUFF, MARKDOWN, YAML) — all green.
  • Live UI validation (32/32 DOM assertions + 10 screenshots in /tmp/pinky-steerux-evidence/): running/queued/terminal/delivered status lines legend-free; unread expanded + badge + cut hint + own scroll; dwell auto-collapse; manual toggle; new-content re-expand; popover contents and close paths; sendNow refusal path; read-state tracking.
Owner findings after live steering, round H of the steer-dialog UX refinement. ## Finding 1 — response-tail block below the prompt **Root cause:** the terminal status render always embedded the full `responseTail` as a permanently expanded block (`.steertail`, max-height 30vh) — large, always present after any steer, and visually cut off at both ends (mid-content start inherent to a 500-char tail; bottom cut behind scroll). **Fix — unread-driven pattern:** - The full block shows only while UNREAD, with its own scroll area (`max-height: 40vh`) and an explicit `⋯ beginning cut — last 500 chars` hint (new `tailTruncated` payload flag from `/steer/latest`). - Once initially read — expanded block dwelled ~1.5 s in view (≥60% overlap, live-DOM check so poll re-renders cannot reset it) or the collapse control clicked — it auto-collapses to a slim one-line summary chip: `✅ completed · <last line…>`. - The chip is a manual expand toggle (class-flip only, scroll/selection preserved); new content (new steer id or changed tail — e.g. a queued steer delivered by the sweeper) re-expands the block with a `● new` unread badge. - Read state is shared between the drawer and modal surfaces (`steerRead` map, keyed by steer id + tail). ## Finding 2 — exit-codes legend read like live status **Root cause:** every status render appended the static `STEER_LEGEND` line ("exit codes: 0 ok · 3 busy… · 4 failed · 5 timeout…"), so a reference table sat under live states and read like current status ("4 failed?? why?"). **Fix:** - The status line explains ONLY the current contextual state, friendly meaning first (`✅ steer ended — turn completed (exit 0)`, running/queued/delivered/timeout/failed each with their own line). - The full exit-code table moved behind a small **?** affordance next to the status: a popover explicitly headed **static reference — not the live status of this steer**, built from the same `STEER_EXIT` map the status line uses so the two can never drift. Click-outside and re-click both close it. ## Also - README steer-dialog sections updated to match; intro paragraph reflowed to repair a pre-existing MD013 violation (line 8 was 608 chars since round G). ## Evidence - Local gates: `py_compile`, `--help` boot check, `node --check` on the extracted script, Super-Linter slim v8.7.0 lane (BASH, BASH_EXEC, JSON, PYTHON_PYLINT 10/10, PYTHON_RUFF, MARKDOWN, YAML) — all green. - Live UI validation (32/32 DOM assertions + 10 screenshots in `/tmp/pinky-steerux-evidence/`): running/queued/terminal/delivered status lines legend-free; unread expanded + badge + cut hint + own scroll; dwell auto-collapse; manual toggle; new-content re-expand; popover contents and close paths; sendNow refusal path; read-state tracking.
Steer dialog round H: unread-driven response tail, exit codes behind '?
All checks were successful
Checks / Functional checks (pull_request) Successful in 14s
8ba12df3ea
Finding 1 — the response-tail block below the prompt was large,
permanently present, and visually cut off. It is now unread-driven:
full scrollable block (own scroll area, truncation made explicit via
the new tailTruncated payload flag) only while its content is unread;
once in view (~1.5 s dwell) or clicked it auto-collapses to a slim
one-line summary chip ('✅ completed · <last line>'); the chip is a
manual expand toggle and new content re-expands the block with a
'● new' badge. Read state is shared across the drawer and modal
surfaces (steerRead map keyed by steer id + tail).

Finding 2 — the static exit-code legend read like live status. The
status line now explains only the steer's current state (friendly
meaning first, 'exit N' in parens); the full exit-code table moved
behind a small '?' affordance whose popover is explicitly labeled
'static reference — not the live status of this steer' and is built
from the same STEER_EXIT map so the two cannot drift.

README updated to match; intro paragraph reflowed to fix a pre-existing
MD013 line-length violation (line 8, 608 chars since round G).
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
OSS-Singularity/zcode-dispatch-observatory!32
No description provided.