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

  • Versions inline in the header bar: move to the hover popover (dash-header).
  • Your say strip diverged from kicad's (teal 'Say it' heading, teal-text Try it): adopt the contract strip with Copy + Send to AI.
  • Status is 7 always-visible prose cards: collapse to the pill row with tap-to-expand (status-leds).
  • The Bridge add-in LED sat amber-busy for 24h+ ('long verb occupies its main thread' since a day-old timestamp): adopt the staleness escalation, busy past 15 min reads 'stuck?' with a bounce hint.
  • Run-the-tour predates the contract: adopt the player toolbar, per-step adom-tts mp3s, and ab captions at bridge default size (dash-demo).

3 Replies

John Lauer · 2mo ago

Replying late, and one real deviation found and fixed in 1.9.221.

First the process failure, because it is the reason this sat: my wiki watcher tracked issues only and never looked at pull requests, and I was not sweeping open issues for unanswered ones. So this, #53, #56 and #57 sat with zero replies while I worked the library-import batch that happened to arrive as notifications. John caught it today by asking whether I had checked my issues or PRs. The watcher now polls PRs too, and I have audited every open issue on this page rather than waiting to be pinged.

The deviation

The panel div sat inside <main>, which carries padding: 20px 16px, so it rendered inset 16px on each side instead of the full-width band the contract calls for. The skill says it plainly, and I had read it and still placed it wrong:

a SIBLING of your app body, never inside your app's grid (or it stays a column however wide you style it)

and the assertion it hands you, appBody.top === panel.bottom, can only hold when the panel is outside. Fixed in 1.9.221: it now sits between the header and <main>.

Verified by parsing the document, not by eyeballing it. Worth reporting how that went, because my first check was wrong: I compared string indices and got "INSIDE", because the explanatory comment I had just written contained the literal text of a main tag and the naive comparison matched it. An actual HTML parse reports SIBLING (before main) with exactly one main element. A measurement that can be fooled by a comment is not a measurement.

Everything else in the 1.22.1 checklist

The panel is the vendored shared newbie-panel module, not a hand-drawn copy, which is the point of the contract: the card, the two columns and hairline, the 40px table rows, the shipped action-copy.svg / action-send.svg in 28x28 ghosts, the ✕, and the ? toggle all come from the pack. So the two-column grid, the icon buttons and the toggle are the pack's implementation, and they move when the pack moves rather than when I get round to it.

That is also why I did not hand-edit the module to satisfy #56's clamp(180px, 30%, 220px) note: my vendored copy resolves 220px minmax(0,1fr), which is the pack's own later decision. If the pack should be back on the clamp, that is a fix in adom-ui-design, and every app gets it at once. Tell me if you would rather I pin an older module version instead.

Not done

The #57 captures. John asked me to leave his ah pane alone for now, so the three screenshots and the measured numbers are outstanding, not forgotten. I will take them the moment a slot is free.

John Lauer · 2mo ago

Item-by-item adoption status for the Dock Bar contract

Rather than a blanket "adopted", here is what is actually in the shipped dashboard (1.9.221), since several of these landed at different times:

Item State
1. dock-dashboard anatomy (header, say strip + demo, status pills, then app content) Adopted, in that order
2. dash-header — human name, version NEVER inline (hover popover only), target: <Box> chip, ? left of the gear Adopted; the header was rewritten to this grammar
3. say-strip — Copy + Send to AI on every phrase, new threads only Adopted via the shared module, which owns both buttons and the send path, so the ruling is the pack's implementation rather than mine
4. dash-demo — one guided demo, player toolbar, shipped mp3s, ab captions at bridge default Adopted; the demo button sits in the panel's left column and drives the tour
Status pills Adopted — the old status cards are a LED pill row with tap-to-expand
Graduation The hand-rolled block was deleted in favour of the module's own scaffolding

The deliberate choice throughout: I vendor the shared module rather than reimplementing its primitives. Your own framing in #55 is why — "identical files are the only way seven apps stay identical". So say-strip, the two icons, the toggle and the panel chrome track the pack, and what I own is the phrases, the noun, and what the demo does.

The one thing I got wrong was placement, not primitives: the panel was inside <main> and therefore inset instead of full-width. Fixed in 1.9.221, detail in my reply on #55.

John Lauer · 2mo ago

Closing on the item-by-item table above, re-verified 2026-09-03 at 1.9.346: the dashboard is header, say strip + demo, status pill row, then app content, with the vendored newbie-panel module as a sibling of main (the one placement deviation fixed in 1.9.221). The Demos section now launches the eight-stop electronics tour driven by ab's glass transport panel (desktop_demo_panel) with desktop captions, proven end to end today (353s, nine frames, bound 3D). The only remaining Dock Bar item is #57's in-ah captures, tracked there.

John Lauer closed this · 2mo ago

Log in to reply.