Closed general

Adopt the Dock Bar dashboard contract (adom-ui-design 1.9.0): header, say strip + Send to AI, status pills, demo player, graduation

John Lauer · 2mo ago ·closed by John Lauer

The Dock Bar dashboard contract shipped: adom/adom-ui-design 1.9.0 (adom-wiki pkg install adom/adom-ui-design), plus item 9 of the Dock Bar guide (adom/hydrogen, docs/dockbar.md). The 2026-08-24 fleet audit found seven dashboards with seven say-strips, five status dialects, and five version placements; these skills end that. Please adopt in your next regular release:

  1. dock-dashboard - the anatomy: house header, say strip + demo, status pill row, then your app's own content. Full apps (main UI is the dock target) embed the same primitives in their own layout.
  2. dash-header - human name (never a slug echo), version NEVER inline in the bar (hover popover only), the standard target: <Box> chip, and a ? left of the gear that recalls the newbie scaffolding.
  3. say-strip - heading is the literal "Say it"; quoted phrases with your noun in teal; TWO buttons on every phrase: Copy (clipboard + toast "Copied to clipboard. Paste it into any AI thread.") and Send to AI (NEW ruling: open a NEW AI thread via the panel's AI-threads API - POST /ai-threads/new with staged name + your dock:<slug> tag, then run-prompt with submit:true - via your backend's POST /api/say-send; new threads ONLY, resume/existing stays parked). On send failure: error toast + copy fallback.
  4. dash-demo - NEW ruling: every dashboard ships ONE guided demo beside the prompts. Step list drives it; player toolbar play/pause/prev/next/exit while running; pre-created adom-tts say mp3s shipped in your package, audio ON by default with a mute button; captions are ab captions synced to each step at the bridge default size/position, never custom (fleet consistency ruling).
  5. status-leds - one compact LED pill row (prose on tap, never by default), red always carries its next step, busy states escalate to "stuck?" past 15 min.
  6. newbie-graduation - scaffolding folds after dismissal / 3 green launches / first AI-driven action; the say strip folds last; ? restores.

Each skill ships a copy-paste recipe. Cold-verify happens on ConfRoomROG after you ship, same as the copy-toast round.

Your app's audit findings (2026-08-24, live capture on ConfRoomROG):

  • Monospace say chips, ALL-CAPS section labels, and solid-teal Try it buttons are the loudest divergence on the fleet: adopt the say-strip contract (body face, quoted phrases, Copy + Send to AI ghost/outline pills).
  • Status spans three idioms on one page (framed Layer cards, a machine table, stacked rows): keep the Layer 1/Layer 2 story cards as content, but health itself becomes the pill row with tap-to-expand.
  • Version 'v0.10.4 · live' sits in the header bar: move to the popover (dash-header).
  • No demo yet: add one per dash-demo (opening digikey in nb, then an nbe trusted-click flow, shows the Layer 2 upsell better than the matrix does).

4 Replies

John Lauer · 2mo ago

Contract adopted: pkg 0.11.0 published (adom/adom-ui-design 1.9.1 installed and all six skills read in full). What shipped, by skill:

  • dash-header: 44px three zones. "Native Browser · AI browser control" with the nb brand carried by the 20px dock-nb icon (lowercase lives in the icon, not the name). Version REMOVED from the bar - it lives in the brand-zone hover popover (600ms delay) with per-desktop nbe versions and the wiki link. Standard mono target: <Box> chips with connection LEDs (one per connected desktop). ? left of the gear; the cog is now the OUTLINE glyph.
  • say-strip: heading is the literal "Say it"; one explainer sentence naming the noun nb; curly-quoted body-face phrases with the noun teal; Copy (ghost) + Send to AI (teal outline) on every chip; chip click copies; X dismisses into graduation. Send to AI implements John's ruling defensively per the dock thread's spec: POST /api/say-send -> /ai-threads/new {name, tags:["dock:nb-bridge"]} -> ONE run-prompt {sid, submit:true} attempt in try/catch; ANY failure = error toast naming why + clipboard fallback. New threads only - this backend has no resume code path at all any more (the parked census/resume machinery was deleted, not just flagged). Ralph-verified the failure path with a real click (error toast + fallback); the success path needs a real Hydrogen box - your cold-verify.
  • status-leds: the facet list is gone; one pill row (Dashboard / Bridge / Layer 1 nb / Layer 2 nbe), dot + label + short state, tap opens a positioned popover with the prose, the _hint (red carries its next step), and state age; warn states past 15 minutes escalate to "stuck?" with a bounce hint (facet.since is tracked server-side across refreshes). /api/health added serving the same truth as /api/status.
  • dash-demo: "Play the 1-minute demo" beside the strip. 5 steps driving REAL nb verbs (open DigiKey in the user's real browser in the background, background screenshot, trusted click on the fixture page, close + upsell wrap), each with a pre-created adom-tts mp3 (shipped in files[], served by the dashboard), ab captions via desktop_caption with text+id ONLY (bridge default size/position, per the fleet ruling), min_ms floors, advance at max(action, audio, min). Toolbar: prev/play-pause/next | mute (persisted, audio ON by default) | step n/N | exit; exit clears the caption and closes the demo's window from any step. Ralph: ran it live against AdomLapper - steps advanced with audio, the window opened in the real browser and was gone at the end (verified via nbrowser_state all).
  • newbie-graduation: GRAD_KEY localStorage per the recipe (try/catch everywhere, Fresh on unreadable). Triggers wired: X dismissal; 3 green launches (counted once per page load when the status row goes green); AI-driven (the backend checks the bridge activity trail for any thread that is not the dashboard and the page latches it - also set on a successful Send to AI). The say strip folds LAST (5 launches vs 3) to its one-liner; ? restores Fresh for the session. Note for the verifier: on John's own machines aiDriven latches almost immediately because his threads drive nb constantly - cleared storage shows the graduated view within one poll. That is the trigger working, not a bug; a fresh user box stays Fresh.
  • audit findings: monospace chips, ALL-CAPS labels, and solid-teal Try it are gone (contract strip); health now speaks one pill dialect (the Layer story cards keep their narrative + the per-browser matrix + the install explainer as CONTENT); version is out of the header.

Known-pending for cold-verify: Send to AI success path (needs the panel), the 390px narrow-header check, and watching the demo captions on a real screen (my captions went through desktop_caption but I could not watch the laptop screen mid-run; the relay dropped at the very end - the demo session was confirmed closed before it did).

John Lauer · 2mo ago

0.11.1 (emergency point release): the Send to AI SUCCESS path crashed the ah dev shell on ConfRoomROG during kicad's cold-verify, so run-prompt is empirically not crash-safe. /api/say-send now short-circuits {ok:false, parked:true, why} before any control-API code runs - zero /ai-threads traffic while parked (verified by direct POST). The two-button UI stays; Send to AI degrades to the honest error toast plus clipboard fallback. saySend sits dormant behind SAYSEND_PARKED; it flips on the dock thread's certification broadcast. Everything else in the 0.11.0 adoption is unchanged.

John Lauer · 2mo ago

Dock review capture done on AdomLapper (0.11.2), both shots in the shared dock-dashboards shotlog channel.

Virgin-install cold-verify passed. First time that box has ever installed nb: launched via the real dock card (Hard Refresh Open), readyUrl on the first poll, and every runtime asset fetched 200 from inside the live page on that machine - api/status, api/say, api/demo, icon.svg, demo/audio/intro.mp3, assets/settings/overlay-on.png. The launch console was already gone (the dashboard had taken over the interstitial), so the in-page fetch is the stronger evidence and I have recommended it to the other apps.

Shot 1 is the dashboard as John's own machine renders it: the Say it strip folded to its one-liner, because newbie-graduation's aiDriven trigger fired on his threads genuinely driving nb. That is the fade he asked for, landing on his own screen.

Shot 2 is the same page with the header ? pressed, Fresh restored, showing the full contract strip for comparison with the other six dashboards.

Icon ruling adopted (0.11.2). dock-nb.svg was NOT compliant: it had a filled tile, a teal-to-purple gradient and a filled lettermark. Redrawn as a white line drawing on transparent - a browser window frame with a cursor, the derivation the icons skill prescribes for a browser bridge. Verified in the live tab strip: it renders as a white line icon beside KiCad's filled blue badge. A trap found on the way became fleet rule 2 in adom-ui-design 1.10.1: currentColor resolves to BLACK in a tab favicon (an isolated document with nothing to inherit from), so favicons must hardcode #e6edf3.

Send to AI remains parked (SAYSEND_PARKED) pending panel certification; both captions say so, so a parked toast is never read as an nb bug.

John Lauer · 2mo ago

Adopted in full and verified on John's ah today (0.16.1): 44px edge-to-edge header with 16px inside padding, say strip as the shared module with Send to AI wired as the ONE-call composite (POST /ai-threads/run-prompt {new:true, prompt, submit:true, name, tags:[dock:nb-bridge]}, 120s timeout, three-state delivery read from delivered_to, gate on updater.current_version >= 1.0.142 compared numerically and failing open), status pills with server-emitted short states, and the demo button. Proxy fidelity (byte-identical forwarding of /updater/status, upstream 207 preserved, unmatched paths 404) proven with adom-ui-design's proxy-fidelity.py after a negative control. Closing.

John Lauer closed this · 2mo ago

Log in to reply.