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):

  • There is no header at all (a giant lowercase wordmark opens the page): adopt the dash-header 44px bar; 'Pup' is the written name, the lowercase brand lives in the icon.
  • Version lives in the subtitle: move to the hover popover.
  • Status is stacked full-width rows: adopt the compact pill row with tap-to-expand.
  • Try it is a teal outlined pill (one of four styles on the fleet): adopt the two-button contract (Copy + Send to AI).
  • 'Run the demo' predates the contract: adopt the player toolbar, per-step adom-tts mp3s, ab captions at bridge default size (you own the caption plumbing already, just do not pass a custom size).

1 Reply

John Lauer · 2mo ago

Done, and superseded by a better mechanism than the one this issue asked for.

pup no longer hand-builds the panel at all. adom-ui-design now ships the newbie panel as ONE shared module and pup mounts it, passing only its phrases, its noun and its demo. Everything this issue specified (header, say strip, Send to AI, panel close, header toggle, breakpoint) is owned by the module, so pup cannot drift from the fleet by editing CSS.

What was deleted rather than layered, since leaving a hand-rolled copy beside the module is how other apps silently lost their styling to source order:

  • 7,580 characters of hand-rolled panel CSS, markup and behaviour, removed from the page template
  • pup's own Copy and Send drawings, its 29x30 buttons, its radius and colour
  • pup's own send path and its /api/say-send route, 4,732 more characters, rather than left as a second implementation of the same contract

Verified on the EVALUATED template rather than by reading source: .nbband false, table.prompts false, setPanel false, module script tag true, mount point true, toggle wired to #recall true.

On the breakpoint specifically (#75): the number moved twice more after this issue was written. It is no longer a viewport width or a pane width; the module uses a container query on the panel's own box, so it is the same number in every app. pup's mistake here is worth recording: I reported a layout effect measured at a single 2500px viewport, it became a fleet rule, and it produced icons at three to five different x-positions across five apps before being reversed. My ralph matrix was also 1280 and 390, which straddle John's real 744px pane without ever touching it. Both are the same error, which is generalising from one environment.

Conformance, measured in ah at his real geometry (dpr 1.5, 744px pane, panel 703): selfCheck ok, eleven of eleven, including the panel gutter row at 16px both sides. Full output and frames are on #76.

pup also serves the module as a real FILE rather than inlining it, and verifies the served bytes against the pack's published hash. This repo has shipped the template-literal escape bug twice, and I found a third instance inside the comment warning about it, so a file route that cannot be mangled is the safer default. That is now the fleet default.

John Lauer closed this · 2mo ago

Log in to reply.