← Commit history

2.19.0: phrase headroom is now a selfCheck row - a console warning nobody reads is not a check, and 'does not truncate today' is not 'has room'

John Lauer ·df8af8b9b9 ·1mo ago ·parent b6fb348
3 files changed +58−2
assets/module/newbie-panel.js+29−1
@@ -519,6 +519,34 @@      * fleet mismatch comes back in a form the check is blind to. This asserts the panel's      * left edge against the PANE, which covers the whole ancestor chain in one number.      * (parts-search, 2026-08-25, reasoning about what the new yardstick still could not see.) */+    /* PHRASE HEADROOM AS A ROW, not a console warning nobody reads. The mount-time probe has+     * warned about over-budget phrases since 2.0.0 and it warned on at least one live app that+     * then reported "0 of 6 truncated" and a clean pass, because "does not truncate TODAY" and+     * "has room" are different claims. kicad measured its longest phrase at clientWidth ==+     * scrollWidth EXACTLY: not truncating, and one character from doing so. A row makes it+     * appear in the evidence everyone already pastes. */+    var spans = [].slice.call(panel.querySelectorAll('.anp-phrase span'));+    if (spans.length) {+      var probe = document.createElement('span');+      probe.style.cssText = 'position:absolute;visibility:hidden;white-space:nowrap;font:' ++                            getComputedStyle(spans[0]).font;+      document.body.appendChild(probe);+      var worst = 0, worstTxt = '', tight = 0;+      spans.forEach(function (sp) {+        probe.textContent = sp.textContent;+        var need = Math.ceil(probe.getBoundingClientRect().width);+        var have = Math.round(sp.getBoundingClientRect().width);+        var slack = have - need;+        if (worstTxt === '' || slack < worst) { worst = slack; worstTxt = sp.textContent.trim().slice(0, 40); }+        if (slack < 8) tight++;+      });+      probe.remove();+      var headOk = worst >= 8;+      if (!headOk) ok = false;+      rows.push({ what: 'phrase headroom', want: 'at least 8px of slack on every phrase',+                  got: worst + 'px on ' + JSON.stringify(worstTxt) + (tight > 1 ? ' (' + tight + ' tight)' : ''),+                  pass: headOk });+    }     var fam = getComputedStyle(panel.querySelector('.anp-phrase span') || panel).fontFamily;     var famOk = /Satoshi/.test(fam);     if (!famOk) ok = false;@@ -556,6 +584,6 @@   }    root.AdomNewbiePanel = { mount: mount, toast: toast, selfCheck: selfCheck, copyText: copyText,-                           checkSend: checkSend, version: '2.17.0',+                           checkSend: checkSend, version: '2.19.0',                            TWO_COL_MIN: TWO_COL_MIN, PHRASE_BUDGET: PHRASE_BUDGET }; })(typeof window !== 'undefined' ? window : this);
package.json+1−1
@@ -1,6 +1,6 @@ {   "slug": "adom-ui-design",-  "version": "2.18.0",+  "version": "2.19.0",   "type": "skill",   "description": "The Adom UI Design System plus a bundle of focused UI skills (tooltips, floating-windows, toasts, responsive-ui, app-shell, ai-driven-apps, clickable-paths, dark-default, input-feedback, settings-layout). One install drops the whole set of skill files onto your container, plus shared icon assets (the settings cog) so every Adom app draws the same glyph.",   "dependencies": {},
skills/newbie-panel/SKILL.md+28
@@ -1185,6 +1185,25 @@ first, `/api/status` proves the second, and **only `AdomNewbiePanel.version` rea live document proves the third.** Report all three or you are reporting one and implying the others. +## ⛔ "DOES NOT TRUNCATE TODAY" AND "HAS ROOM" ARE DIFFERENT CLAIMS++`selfCheck` now carries a **phrase headroom** row: every phrase must have **at least 8px of+slack**, and it reports the worst one by name.++The mount-time probe has warned about over-budget phrases since the first release, in a+`console.warn` **nobody reads**. So an app could report "0 of 6 truncated" and a clean eleven+rows while sitting exactly on the edge: kicad measured its longest phrase, "open the symbol in+kicad", at `clientWidth == scrollWidth` **exactly**. Not truncating, and one character from it.+A slightly wider font fallback, a 2px narrower pane, or one extra word, and it ellipsises the+trigger noun — which is the specific failure this whole panel exists to prevent.++**A warning in a channel nobody reads is not a check.** Put it in the evidence people already+paste. Negative-controlled before shipping: comfortable phrases pass with 136px of slack, a+phrase stretched to its box goes red at -116px, restoring returns it to green.++**This will turn some clean passes red, correctly.** If your row goes red, shorten the phrase;+that is the authoring rule this skill already carried, now enforced where it can be seen.+ ## Two margins at John's width, neither a defect today, both worth watching  parts-search measured these on his box and flagged them rather than reporting a clean pass:@@ -1196,6 +1215,15 @@ parts-search measured these on his box and flagged them rather than reporting a - **The longest phrase is 332px in a 343px box: 11px of headroom**, on "check ESP32-S3-WROOM-1   stock". The 0-of-6 is real and it is not comfortable. +kicad's are tighter still, and it reported them rather than banking a clean pass: **a 2px+collapse margin** (scroller box 734, panel 702, threshold 700, so a 12px scrollbar drops it to+one column) and **0px of phrase headroom**. It is the app that defines the fleet's safety+margin on both axes.++**And the version gate has zero headroom too:** John's shell is EXACTLY 1.0.142, the minimum+the module requires. The gate passes with nothing to spare, so a single patch downgrade starts+refusing sends — correctly, but worth knowing it is a boundary rather than a comfort.+ At his width the two-column layout is close to its limit on BOTH axes. Nothing to change today; something to check first if a dashboard ever renders one column unexpectedly.