Skip to content

fix(ui): loud clipboard denial, mid-width kill verb, phone legibility (dogfood 2026-08-24) - #9

Merged
minglong51 merged 1 commit into
mainfrom
fix/dogfood-2026-08-24-agent-usage-manager
Aug 25, 2026
Merged

fix(ui): loud clipboard denial, mid-width kill verb, phone legibility (dogfood 2026-08-24)#9
minglong51 merged 1 commit into
mainfrom
fix/dogfood-2026-08-24-agent-usage-manager

Conversation

@minglong51

Copy link
Copy Markdown
Owner

What

Frontend fixes from the 2026-08-24 dogfood walk of the live fleet dashboard (founder-agent-os/prototypes/dogfood-reports-2026-08-24/agent-usage-manager.md). All changes are in agent_usage_manager/static/index.html (+ regression test + LLD §6 line-cite refresh per the design-doc contract).

Bug #1 — click-to-copy failed silently when the clipboard write was denied

copyHint was navigator.clipboard?.writeText(...).then(...) with no .catch. A denied write (permission, unfocused document — reproduced live in the walk) produced no "copied ✓", no error, nothing on the clipboard: the operator walks away believing they hold a bootout command they don't have.

Now a rejection (or missing clipboard API) flashes "copy failed — press ⌘C" on the chip, then restores the command and selects it so a manual copy is one keystroke away (an active selection also pauses auto-refresh via the existing refresh() guard, so the re-render can't yank it). An el.isConnected guard covers the race where a poll re-renders the row mid-flash, keeping the console clean.

Bug #2 — 701px–~1494px dead zone hid the only kill verb

The all-nowrap table measures ~1.5kpx; .wrap scrolls horizontally and the actions column — the last one — sat off-screen until scrolled to, while the stacked phone layout only engages ≤700px. A half-screen desk window landed in a dead zone: full chrome, no reachable verb.

The actions column (.c-act) is now position: sticky; right: 0 above the phone breakpoint, with text-align: right so the verbs hug the pinned edge (the nowrap launchctl hint chips inflate the column to ~454px). Phone rows are stacked blocks with no horizontal overflow, so the rule is scoped min-width: 701px.

F1/F2/F3 — phone legibility

  • F1: stacked rows rendered 1.0 155 with no units (headers hidden, title tooltips unreachable on touch). .unit spans — hidden on desk where the headers carry the units, shown in the phone stack → 1.0% 155 MB (main + child rows).
  • F2: child rows lost .c-cmd at ≤700px — their only identity ("↳ 2.1.241 0.0 34"). Child cmdline now stays in the phone layout, wrapped (overflow-wrap: anywhere).
  • F3: the 110px end-ellipsis clamp rendered every supervised row's chip as the identical "launchctl boot…", ellipsing the job label — the one part that differs. Now truncates from the left (direction: rtl, 240px) → "…501/ai.hermes.gateway-frontdoor". Click-to-copy still copies the full text.

Validation

  • Tests: pytest tests/75 passed (includes new test_index_frontend_regressions pinning the served page's behavior-bearing markup; no JS runner in this repo).
  • Behavioral (gstack browse harness against an isolated instance on :8766 with an alerts-stripped config; the live :8765 service was never restarted and no kill verb was clicked):
    • Bug docs: design-doc upkeep contract + drift checker #2: at 800px unscrolled — 0/40 kill buttons visible before, 40/40 after + 5/5 launchctl chips; at 1440px 40/40 + 5/5 (table is 1496px wide, so even "full" desk width overflowed by 56px before). Before/after screenshots: /tmp/aum-before-midwidth-800.png / /tmp/aum-fix-midwidth-800.png; desk: /tmp/aum-fix-desk-1440.png.
    • Bug Match GUI + launchd-supervised agents on macOS, hardened from triad review #1: denial simulated by overriding writeText to reject with NotAllowedError — MutationObserver recorded "copy failed — press ⌘C" at t=1ms, command restored + fully selected at t=1503ms; success path still flashes "copied ✓" (stubbed resolve). Screenshot: /tmp/aum-fix-copy-failed.png. Console clean.
    • Phone (390×760): rows render 4.8% 259 MB; expanded children show full wrapped cmdlines; supervised chips read "…/ai.hermes.gateway-engineer_5" etc. — each distinguishable. Screenshots: /tmp/aum-fix-phone-tree.png, /tmp/aum-fix-phone-hint.png.

Deferred (follow-up PR, per assignment scope)

  • F4: the chronic idle 10m+ daemon row pinned top forever — idle_ok: matches on row label (app.py:1201-1209) and the daemon shares claude-code with every interactive session; needs cmdline-granular suppression (e.g. idle_ok_match:). A config-semantics change, deliberately not in this frontend PR.
  • Pre-existing doc drift (unrelated): test_design_docs.py flags agents.default.yaml as added-but-unnamed in the LLD.

F5 (native confirm/prompt chrome) and F6 (keyboard a11y on the +N/hint spans) also remain open from the report.

From the 2026-08-24 dogfood walk (founder-agent-os/prototypes/
dogfood-reports-2026-08-24/agent-usage-manager.md):

- bug #1: copyHint had no .catch on navigator.clipboard.writeText — a
  denied write (permission, unfocused document) failed silently and the
  operator walked away believing they held a bootout command they
  didn't. Now flashes "copy failed — press ⌘C" on the chip, then
  selects the command for a manual copy (an active selection also
  pauses auto-refresh, so it can't be yanked). Guards the mid-flash
  re-render race (el.isConnected) so the console stays clean.
- bug #2: the 701–~1494px dead zone — the ~1.5kpx nowrap table scrolled
  the last column (the only kill verb) off-screen while the phone stack
  only engages ≤700px. The actions column (.c-act) is now
  position:sticky on the right above the phone breakpoint, right-aligned
  so the verbs hug the pinned edge (the nowrap launchctl hint inflates
  the column). Measured at 800px, unscrolled: 0/40 kill buttons visible
  before, 40/40 + 5/5 launchctl chips after.
- F1: phone rows rendered unitless cpu/mem ("1.0  155") — .unit spans,
  hidden on desk (headers carry the units), shown in the phone stack.
- F2: phone child rows lost the cmdline, their only identity — child
  .c-cmd stays visible in the phone stack, wrapped.
- F3: the phone launchd hint ellipsed the job label (the one part that
  differs) — now truncates from the left (direction: rtl) at 240px, so
  "…501/ai.hermes.gateway-frontdoor" instead of "launchctl boot…".

Out of scope (follow-up): F4, the chronic idle daemon pinned top-row —
needs cmdline-granular idle_ok matching in app.py, a config-semantics
change.

Verified: 75 pytest pass (incl. new test_index_frontend_regressions);
browse-verified against an isolated :8766 instance (live :8765 never
touched, zero kill clicks): clipboard denial simulated by overriding
writeText to reject (flash at t=1ms, restore+select at t=1503ms;
success path still flashes "copied ✓"); sticky verbs reachable at
800px and 1440px; phone rows carry units + child cmdlines; hint chips
show the job-label tail; console clean. LLD §6 line cites refreshed
per the design-doc contract.
@minglong51
minglong51 merged commit 4ae6470 into main Aug 25, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant