Mockup: version pill and licensing area #216

Open
opened 2026-10-15 06:25:55 +00:00 by kayg · 15 comments
Owner

Mockup (D162, D171): a version pill at the bottom of the sidebar and the licensing area behind it.

Owner request (2026-10-15): "we also need to demo/mockup a version pill at the bottom of the sidebar btw. if possible a really small pill on the same line as the name and settings? updated to the latest version shows tick, update available shows !, cannot check for updates shows X. we also need to show CE/EE there? basically we need to mockup the licensing area."

Flag: ?mock=1&proto=clusters&version=1. Branch mockup-version-pill (base mockup-preview-combo b04d1bf51). On-demand module, palette "Mockup: version ..." entries open each state at once.

Scope: the pill (version, one status mark, CE/EE tag), the popover (version, update state, release notes, edition and licence, seats, renewal, licence key entry with local check), 9 scenarios plus palette reach. No prices anywhere. TASTE row 101 (version only in About) is superseded by this request and is updated in the same branch.

Mockup (D162, D171): a version pill at the bottom of the sidebar and the licensing area behind it. Owner request (2026-10-15): "we also need to demo/mockup a version pill at the bottom of the sidebar btw. if possible a really small pill on the same line as the name and settings? updated to the latest version shows tick, update available shows !, cannot check for updates shows X. we also need to show CE/EE there? basically we need to mockup the licensing area." Flag: `?mock=1&proto=clusters&version=1`. Branch `mockup-version-pill` (base mockup-preview-combo b04d1bf51). On-demand module, palette "Mockup: version ..." entries open each state at once. Scope: the pill (version, one status mark, CE/EE tag), the popover (version, update state, release notes, edition and licence, seats, renewal, licence key entry with local check), 9 scenarios plus palette reach. No prices anywhere. TASTE row 101 (version only in About) is superseded by this request and is updated in the same branch.
Author
Owner

Started. Branch mockup-version-pill, base b04d1bf51 (mockup-preview-combo). Flag ?mock=1&proto=clusters&version=1.

Started. Branch mockup-version-pill, base b04d1bf51 (mockup-preview-combo). Flag ?mock=1&proto=clusters&version=1.
Author
Owner

Evidence (Chromium, local production-flavoured build on port 47502, ink and paper; desktop 1440x900, phone 393x852, small 375x667; popover in all ten scenarios, pill in its three states):

pill-available-desktop-ink.png
pill-available-desktop-paper.png
pill-available-phone-ink.png
pill-available-phone-paper.png
pill-available-small-ink.png
pill-available-small-paper.png
pill-current-desktop-ink.png
pill-current-desktop-paper.png
pill-current-phone-ink.png
pill-current-phone-paper.png
pill-current-small-ink.png
pill-current-small-paper.png
pill-offline-desktop-ink.png
pill-offline-desktop-paper.png
pill-offline-phone-ink.png
pill-offline-phone-paper.png
pill-offline-small-ink.png
pill-offline-small-paper.png
pill-zoom3x-available-desktop-ink.png
pill-zoom3x-available-desktop-paper.png
pill-zoom3x-current-desktop-ink.png
pill-zoom3x-current-desktop-paper.png
pill-zoom3x-expiring-desktop-ink.png
pill-zoom3x-expiring-desktop-paper.png
pill-zoom3x-offline-desktop-ink.png
pill-zoom3x-offline-desktop-paper.png
popover-available-desktop-ink.png
popover-available-desktop-paper.png
popover-available-phone-ink.png
popover-available-phone-paper.png
popover-available-small-ink.png
popover-available-small-paper.png
popover-bad-key-desktop-ink.png
popover-bad-key-desktop-paper.png
popover-bad-key-phone-ink.png
popover-bad-key-phone-paper.png
popover-bad-key-small-ink.png
popover-bad-key-small-paper.png
popover-current-desktop-ink.png
popover-current-desktop-paper.png
popover-current-phone-ink.png
popover-current-phone-paper.png
popover-current-small-ink.png
popover-current-small-paper.png
popover-enterprise-desktop-ink.png
popover-enterprise-desktop-paper.png
popover-enterprise-phone-ink.png
popover-enterprise-phone-paper.png
popover-enterprise-small-ink.png
popover-enterprise-small-paper.png
popover-expired-desktop-ink.png
popover-expired-desktop-paper.png
popover-expired-phone-ink.png
popover-expired-phone-paper.png
popover-expired-small-ink.png
popover-expired-small-paper.png
popover-expiring-desktop-ink.png
popover-expiring-desktop-paper.png
popover-expiring-phone-ink.png
popover-expiring-phone-paper.png
popover-expiring-small-ink.png
popover-expiring-small-paper.png
popover-homelab-desktop-ink.png
popover-homelab-desktop-paper.png
popover-homelab-phone-ink.png
popover-homelab-phone-paper.png
popover-homelab-small-ink.png
popover-homelab-small-paper.png
popover-key-ok-desktop-ink.png
popover-key-ok-desktop-paper.png
popover-key-ok-phone-ink.png
popover-key-ok-phone-paper.png
popover-key-ok-small-ink.png
popover-key-ok-small-paper.png
popover-offline-desktop-ink.png
popover-offline-desktop-paper.png
popover-offline-phone-ink.png
popover-offline-phone-paper.png
popover-offline-small-ink.png
popover-offline-small-paper.png
popover-team-full-desktop-ink.png
popover-team-full-desktop-paper.png
popover-team-full-phone-ink.png
popover-team-full-phone-paper.png
popover-team-full-small-ink.png
popover-team-full-small-paper.png

Evidence (Chromium, local production-flavoured build on port 47502, ink and paper; desktop 1440x900, phone 393x852, small 375x667; popover in all ten scenarios, pill in its three states): ![pill-available-desktop-ink.png](https://git.kayg.org/attachments/4bbf89b5-581f-4dbf-9608-c9fc19589fa2) ![pill-available-desktop-paper.png](https://git.kayg.org/attachments/23e9d422-b11a-4c4f-97ee-7b5216bfe664) ![pill-available-phone-ink.png](https://git.kayg.org/attachments/18075511-3a7e-4714-b78b-67b6e5bf19f1) ![pill-available-phone-paper.png](https://git.kayg.org/attachments/5fff5f60-e778-4abf-a2a1-295bec9649d7) ![pill-available-small-ink.png](https://git.kayg.org/attachments/534e2cfe-881c-4911-86a8-5f7de856fd8c) ![pill-available-small-paper.png](https://git.kayg.org/attachments/b7faec3f-1f27-479e-8682-e76823f976f5) ![pill-current-desktop-ink.png](https://git.kayg.org/attachments/ada73078-5e39-4bad-8766-022684e405eb) ![pill-current-desktop-paper.png](https://git.kayg.org/attachments/ca21d191-1ed4-4442-90e4-7327972ee4f0) ![pill-current-phone-ink.png](https://git.kayg.org/attachments/911cec4e-3646-437e-b5e3-f4b9824989ce) ![pill-current-phone-paper.png](https://git.kayg.org/attachments/bd5157d2-e929-45c8-9101-903f07bc1f70) ![pill-current-small-ink.png](https://git.kayg.org/attachments/8f3412ac-467a-4f4c-a341-1df1a52aedaa) ![pill-current-small-paper.png](https://git.kayg.org/attachments/be0260f4-8c83-401a-943e-7d871233fa84) ![pill-offline-desktop-ink.png](https://git.kayg.org/attachments/7309787c-731e-4aab-a97d-d1b4b6b38b4a) ![pill-offline-desktop-paper.png](https://git.kayg.org/attachments/e7210bca-761e-46bd-acdd-3275f5de892e) ![pill-offline-phone-ink.png](https://git.kayg.org/attachments/fa755946-c598-4d0c-b02f-ba263ae07a77) ![pill-offline-phone-paper.png](https://git.kayg.org/attachments/6e697b19-005d-4cf6-8eb7-0dd45835a77b) ![pill-offline-small-ink.png](https://git.kayg.org/attachments/1cc20b7f-e6d7-4375-9a79-6a2df90dd993) ![pill-offline-small-paper.png](https://git.kayg.org/attachments/ed06df43-6268-4f65-9297-0f3cace6fb8f) ![pill-zoom3x-available-desktop-ink.png](https://git.kayg.org/attachments/7c0ab458-f97c-4c81-83b4-14a883459e24) ![pill-zoom3x-available-desktop-paper.png](https://git.kayg.org/attachments/6200fb27-a2c5-49eb-b27d-e46cbfd263f1) ![pill-zoom3x-current-desktop-ink.png](https://git.kayg.org/attachments/a01d9e00-6ef5-4332-ab9e-6b090d6f6392) ![pill-zoom3x-current-desktop-paper.png](https://git.kayg.org/attachments/836c080a-6d3d-46ee-af1b-eef04cbcf73c) ![pill-zoom3x-expiring-desktop-ink.png](https://git.kayg.org/attachments/876c9ea3-1153-46d2-a768-c421d051849a) ![pill-zoom3x-expiring-desktop-paper.png](https://git.kayg.org/attachments/ce5a1aa0-2f1d-4390-babb-4abd4640a53d) ![pill-zoom3x-offline-desktop-ink.png](https://git.kayg.org/attachments/31383079-20f7-4a25-89a1-0905bbcd5681) ![pill-zoom3x-offline-desktop-paper.png](https://git.kayg.org/attachments/73685682-486d-4e1c-940b-e1966397c142) ![popover-available-desktop-ink.png](https://git.kayg.org/attachments/3a9d2130-cc43-4aca-97e8-2be63ffbfaae) ![popover-available-desktop-paper.png](https://git.kayg.org/attachments/92b95d70-8569-49e6-8dbc-28e10b50b460) ![popover-available-phone-ink.png](https://git.kayg.org/attachments/1d13a35f-d148-4e91-9a5d-f4de174d8e62) ![popover-available-phone-paper.png](https://git.kayg.org/attachments/14e90b5f-150a-4249-91c9-5fad1d470b0a) ![popover-available-small-ink.png](https://git.kayg.org/attachments/9d5aed6e-d235-4003-a574-e9f25d0298e5) ![popover-available-small-paper.png](https://git.kayg.org/attachments/fdde94ea-16e7-40da-82dd-9d34d696a442) ![popover-bad-key-desktop-ink.png](https://git.kayg.org/attachments/0598842d-06e4-404c-a70b-09c3a79a7eaf) ![popover-bad-key-desktop-paper.png](https://git.kayg.org/attachments/f5fba6d8-def4-43a8-ad45-7ad1227963ab) ![popover-bad-key-phone-ink.png](https://git.kayg.org/attachments/5faa4a02-541b-48b0-95fd-6a2b7d98bcf6) ![popover-bad-key-phone-paper.png](https://git.kayg.org/attachments/76c92717-586f-4c49-bbf7-bc077acbc6d4) ![popover-bad-key-small-ink.png](https://git.kayg.org/attachments/727f0b42-d611-46f1-9772-633635aa85d1) ![popover-bad-key-small-paper.png](https://git.kayg.org/attachments/2a2f335c-2216-44ad-b8c0-00c18359ea6a) ![popover-current-desktop-ink.png](https://git.kayg.org/attachments/c475a390-0bef-4e28-a32e-45a0a1bf8be9) ![popover-current-desktop-paper.png](https://git.kayg.org/attachments/66c114ae-05df-4da2-acbc-c762917412bf) ![popover-current-phone-ink.png](https://git.kayg.org/attachments/63d03ab4-933d-410c-9537-f9dbce01feb1) ![popover-current-phone-paper.png](https://git.kayg.org/attachments/dd9b23a5-8189-496c-9ec2-572357d5bb60) ![popover-current-small-ink.png](https://git.kayg.org/attachments/532af0e2-471b-4664-b576-ff4c33580396) ![popover-current-small-paper.png](https://git.kayg.org/attachments/133aedfd-8250-4936-b78f-d0f55afbafb2) ![popover-enterprise-desktop-ink.png](https://git.kayg.org/attachments/e469d40b-6be8-41d4-9c53-d4da9bcd45d7) ![popover-enterprise-desktop-paper.png](https://git.kayg.org/attachments/be90fea9-3979-43f0-a90e-d46014bfccc0) ![popover-enterprise-phone-ink.png](https://git.kayg.org/attachments/92d17eef-ecda-46f1-8bbe-89924b00e88b) ![popover-enterprise-phone-paper.png](https://git.kayg.org/attachments/a849450e-6d67-4811-b817-e79f89c2d2dc) ![popover-enterprise-small-ink.png](https://git.kayg.org/attachments/f8f12cd4-b908-416a-930f-3c6ce25c7442) ![popover-enterprise-small-paper.png](https://git.kayg.org/attachments/82468f83-ae2b-4b32-b511-e237e845d305) ![popover-expired-desktop-ink.png](https://git.kayg.org/attachments/8936087d-64af-4aa0-b90b-d01ee9cb507f) ![popover-expired-desktop-paper.png](https://git.kayg.org/attachments/fb254a8d-8b16-44a3-b499-d202b4c06b11) ![popover-expired-phone-ink.png](https://git.kayg.org/attachments/17a39cb3-5882-4599-96eb-35282c637d6d) ![popover-expired-phone-paper.png](https://git.kayg.org/attachments/cd5ff3d3-4783-488b-bf19-fbafb57d41e4) ![popover-expired-small-ink.png](https://git.kayg.org/attachments/4d4eec1e-c750-44a7-b410-1d0de99f6e44) ![popover-expired-small-paper.png](https://git.kayg.org/attachments/4898f754-cc50-44ec-836e-d3166f06b95b) ![popover-expiring-desktop-ink.png](https://git.kayg.org/attachments/b148de98-e088-482e-a7de-5b5153f4f5d5) ![popover-expiring-desktop-paper.png](https://git.kayg.org/attachments/dc37717e-39f0-4a0e-bd4d-447acc21e64b) ![popover-expiring-phone-ink.png](https://git.kayg.org/attachments/16be10a2-365e-4af3-89f8-1226a2cd27b8) ![popover-expiring-phone-paper.png](https://git.kayg.org/attachments/86a4f8dc-1b39-400f-b9c4-7c681f82dae4) ![popover-expiring-small-ink.png](https://git.kayg.org/attachments/09a84b08-e497-4262-b4f9-a1516eb27c14) ![popover-expiring-small-paper.png](https://git.kayg.org/attachments/be591918-5318-471f-a876-c4a0dbaaafd8) ![popover-homelab-desktop-ink.png](https://git.kayg.org/attachments/593e4198-3f8b-4de4-ab05-4955769a4864) ![popover-homelab-desktop-paper.png](https://git.kayg.org/attachments/2ffaec59-4662-4551-9749-e44262b5d4df) ![popover-homelab-phone-ink.png](https://git.kayg.org/attachments/75037dff-b453-419b-8acc-62b94495312c) ![popover-homelab-phone-paper.png](https://git.kayg.org/attachments/edc56c86-a812-429e-b941-14c2294cfef4) ![popover-homelab-small-ink.png](https://git.kayg.org/attachments/7a2409d9-3c17-4fc9-bb52-a53f91caa46d) ![popover-homelab-small-paper.png](https://git.kayg.org/attachments/f3142401-f85f-4f32-9cab-4b2a80ef91b7) ![popover-key-ok-desktop-ink.png](https://git.kayg.org/attachments/511dac4d-6ab5-4339-ab6e-291e3ef52ed2) ![popover-key-ok-desktop-paper.png](https://git.kayg.org/attachments/969a5d17-5100-4fd3-bb96-d1000a55012c) ![popover-key-ok-phone-ink.png](https://git.kayg.org/attachments/9450d764-db76-4acf-a47a-6cf665e40b5f) ![popover-key-ok-phone-paper.png](https://git.kayg.org/attachments/0afdaf92-04e0-4c4b-9920-6a83b8a7fdf8) ![popover-key-ok-small-ink.png](https://git.kayg.org/attachments/0da79f88-dc7c-4822-b5d2-11eed9b61566) ![popover-key-ok-small-paper.png](https://git.kayg.org/attachments/5ad4da40-9750-4216-ac3d-03260ed6c867) ![popover-offline-desktop-ink.png](https://git.kayg.org/attachments/8b2bf045-76e8-47a6-96a6-0f4a1f9025c3) ![popover-offline-desktop-paper.png](https://git.kayg.org/attachments/d3d0b05b-53f2-427e-b1f7-9ba639300d80) ![popover-offline-phone-ink.png](https://git.kayg.org/attachments/00b349ca-884d-430a-8a04-0456f03a93c9) ![popover-offline-phone-paper.png](https://git.kayg.org/attachments/62e51571-82c2-4a2e-a188-fec4c313781a) ![popover-offline-small-ink.png](https://git.kayg.org/attachments/2e707f97-8b71-4319-a9ef-becba5c2c609) ![popover-offline-small-paper.png](https://git.kayg.org/attachments/d01eb600-19ec-42f4-bbc2-be7f02a59e2c) ![popover-team-full-desktop-ink.png](https://git.kayg.org/attachments/7d4aad37-e324-4cf4-a296-9a4b1f3785fc) ![popover-team-full-desktop-paper.png](https://git.kayg.org/attachments/aba1ea14-4bd4-45e5-9b13-b0dee3589e3f) ![popover-team-full-phone-ink.png](https://git.kayg.org/attachments/5039aacb-5d5e-4e48-b6b3-e6bb924268f7) ![popover-team-full-phone-paper.png](https://git.kayg.org/attachments/7ca6738f-0f97-476c-956f-a53030a616d4) ![popover-team-full-small-ink.png](https://git.kayg.org/attachments/6b8e3368-196e-4a06-b48b-64bc85988c83) ![popover-team-full-small-paper.png](https://git.kayg.org/attachments/deb4398a-8297-492d-a6eb-05a1ba4f5b3a)
Author
Owner

Finished. Branch mockup-version-pill, head c4379980e (base b04d1bf51).

Commits: ba6b14e04 (shared pill, popover alignTo, kv warn type), ad3b1fff4 (mockup, test double, popover, key pane, palette, css), 252ce111f (TASTE row 101 superseded), c-label fix, c4379980e (ring test).

Gates:

  • scripts/verify iterate stops at its first step, the repository artifact size gate, which already fails on the base commit: "FAIL (379 file(s)); limit is 200000 bytes" (committed apps/tracer/captures/*). Not touched by this branch.
  • The TypeScript half run on its own: tsc clean; bun test src/canvas: 217 pass, 1 fail (stops.test.ts "an empty graph rests on its centre", fails identically on b04d1bf51); the other listed unit tests 34 pass; my words.test.ts 12 pass.
  • Playwright version-pill.spec.ts + host-actions-mockup.spec.ts: 36 passed (anchored popover and key/value list still work for the older mockup).

Budgets (production build, transfer-budget.ts, base vs this branch): critical identity 959082 = 959082 bytes (gzip 297196 -> 297195, brotli 247493 -> 247483, of 307200/256000); deferred identity 141448 = 141448; onDemand identity 214554 -> 214599 (+45 bytes: the optional alignTo in the anchored popover). main.js 112730 = 112730. Nothing raised.

Open sync work of the popover (headless, 1440): 5-8 ms warm, 27 ms the very first open (cold style and layout); close 1.5 ms.

Finished. Branch mockup-version-pill, head c4379980e (base b04d1bf51). Commits: ba6b14e04 (shared pill, popover alignTo, kv warn type), ad3b1fff4 (mockup, test double, popover, key pane, palette, css), 252ce111f (TASTE row 101 superseded), c-label fix, c4379980e (ring test). Gates: - `scripts/verify iterate` stops at its first step, the repository artifact size gate, which already fails on the base commit: "FAIL (379 file(s)); limit is 200000 bytes" (committed apps/tracer/captures/*). Not touched by this branch. - The TypeScript half run on its own: tsc clean; `bun test src/canvas`: 217 pass, 1 fail (`stops.test.ts` "an empty graph rests on its centre", fails identically on b04d1bf51); the other listed unit tests 34 pass; my `words.test.ts` 12 pass. - Playwright `version-pill.spec.ts` + `host-actions-mockup.spec.ts`: 36 passed (anchored popover and key/value list still work for the older mockup). Budgets (production build, transfer-budget.ts, base vs this branch): critical identity 959082 = 959082 bytes (gzip 297196 -> 297195, brotli 247493 -> 247483, of 307200/256000); deferred identity 141448 = 141448; onDemand identity 214554 -> 214599 (+45 bytes: the optional `alignTo` in the anchored popover). main.js 112730 = 112730. Nothing raised. Open sync work of the popover (headless, 1440): 5-8 ms warm, 27 ms the very first open (cold style and layout); close 1.5 ms.
Author
Owner

Round 2 (owner's changes after reviewing the screenshots). Branch mockup-version-pill, head 173ab5c51 (pushed). Flag /?mock=1&proto=clusters&version=1.

Commits (each builds; tests land in the last):

  • 630715541 ui: extract the Inbox's sidebar card into a shared shell (packages/ui/src/sidebar-card.ts, the Inbox is rebuilt on it)
  • 243da4220 the version pill is as tall as the person's pill and the gear, and the footer reflows
  • 33d66ab91 the licensing panel opens inside the sidebar, the way the Inbox does
  • 7cab08dcc the hosts row tells in a few words whether every infraternal agent is current
  • 173ab5c51 tests (version-pill spec, wording tests) and the TASTE.md row

Measurements (Chromium, production build, +100 port):

  • Pill heights: desktop 40 / 40 / 40 px (person / version / gear, token --pill-h 40); touch 393x852 and 375x667: 44 / 44 / 44 px. The touch target is the pill itself.
  • Sidebar widths 292, 260, 250, 240, 230, 220, 200 (touch floor 212): name shrinks to 4 letters first, CE/EE goes at a footer width of 238 px and below (desktop 292 px sidebar = 274 px footer), the name goes at 219 px and below; no wrap, no overflow, gaps >= 8 px at every width. The edition rule fires in the test now.
  • Open time (panel in the sidebar): first open 8.6 to 17.2 ms across runs, warm median 5 to 9.4 ms (host load average ~17, other jobs running).
  • D188: critical JS identity 959201 bytes both at the previous head and now (+0 bytes; gzip differs by 1 byte of hash noise); deferred +362 bytes identity (+128 gzip, +53 brotli: the shared card shell, which the Inbox's deferred chunk carries) -> 49523/51200 gzip, 43987/45056 brotli; on-demand identity unchanged at 214599.

Gates: scripts/verify iterate stops at the unrelated repository artifact gate, so the TypeScript half was run on its own: tsc clean, 257 pass and 1 fail, the failure being src/canvas/layout/stops.test.ts "an empty graph rests on its centre" (Received 252.5), unrelated and failing on the base too. Playwright: version-pill.spec.ts (30 tests incl. widths, heights, hosts), inbox.spec.ts, ca-unlock.spec.ts (44 passed), host-actions-mockup.spec.ts (20 passed).

Not verified / notes:

  • The sidebar has no draggable edge in the product today (fixed 292 px); widths were forced in the test. I added the floor (200 px, 212 px on touch) in version.css and did not build resizing.
  • WebKit/real iPhone not tried; Chromium only.

Evidence (143 captures, ink and paper at 1440x900, 393x852, 375x667): key ones below, all attached to this issue.
heights-3x-desktop-ink.png
heights-3x-phone-ink.png
panel-current-desktop-ink.png
panel-current-desktop-paper.png
panel-available-phone-ink.png
panel-enterprise-small-paper.png
width-292-foot-desktop-ink.png
width-240-foot-desktop-ink.png
width-220-foot-desktop-ink.png
width-200-foot-desktop-ink.png
width-212-foot-phone-paper.png
hosts-current-desktop-ink.png
hosts-behind-desktop-ink.png
hosts-behind-expanded-phone-paper.png
hosts-offline-small-ink.png

Round 2 (owner's changes after reviewing the screenshots). Branch `mockup-version-pill`, head 173ab5c51 (pushed). Flag `/?mock=1&proto=clusters&version=1`. Commits (each builds; tests land in the last): - 630715541 ui: extract the Inbox's sidebar card into a shared shell (`packages/ui/src/sidebar-card.ts`, the Inbox is rebuilt on it) - 243da4220 the version pill is as tall as the person's pill and the gear, and the footer reflows - 33d66ab91 the licensing panel opens inside the sidebar, the way the Inbox does - 7cab08dcc the hosts row tells in a few words whether every infraternal agent is current - 173ab5c51 tests (version-pill spec, wording tests) and the TASTE.md row Measurements (Chromium, production build, +100 port): - Pill heights: desktop 40 / 40 / 40 px (person / version / gear, token `--pill-h` 40); touch 393x852 and 375x667: 44 / 44 / 44 px. The touch target is the pill itself. - Sidebar widths 292, 260, 250, 240, 230, 220, 200 (touch floor 212): name shrinks to 4 letters first, CE/EE goes at a footer width of 238 px and below (desktop 292 px sidebar = 274 px footer), the name goes at 219 px and below; no wrap, no overflow, gaps >= 8 px at every width. The edition rule fires in the test now. - Open time (panel in the sidebar): first open 8.6 to 17.2 ms across runs, warm median 5 to 9.4 ms (host load average ~17, other jobs running). - D188: critical JS identity 959201 bytes both at the previous head and now (+0 bytes; gzip differs by 1 byte of hash noise); deferred +362 bytes identity (+128 gzip, +53 brotli: the shared card shell, which the Inbox's deferred chunk carries) -> 49523/51200 gzip, 43987/45056 brotli; on-demand identity unchanged at 214599. Gates: `scripts/verify iterate` stops at the unrelated repository artifact gate, so the TypeScript half was run on its own: tsc clean, 257 pass and 1 fail, the failure being `src/canvas/layout/stops.test.ts` "an empty graph rests on its centre" (Received 252.5), unrelated and failing on the base too. Playwright: version-pill.spec.ts (30 tests incl. widths, heights, hosts), inbox.spec.ts, ca-unlock.spec.ts (44 passed), host-actions-mockup.spec.ts (20 passed). Not verified / notes: - The sidebar has no draggable edge in the product today (fixed 292 px); widths were forced in the test. I added the floor (200 px, 212 px on touch) in version.css and did not build resizing. - WebKit/real iPhone not tried; Chromium only. Evidence (143 captures, ink and paper at 1440x900, 393x852, 375x667): key ones below, all attached to this issue. ![heights-3x-desktop-ink.png](https://git.kayg.org/attachments/469cfaef-6d23-4bd6-ae02-64bbdfd537fc) ![heights-3x-phone-ink.png](https://git.kayg.org/attachments/61ecd56f-8b62-4560-b18f-48fbc5d4218d) ![panel-current-desktop-ink.png](https://git.kayg.org/attachments/61518985-cf5e-49b2-ab0e-57bc1fae37b4) ![panel-current-desktop-paper.png](https://git.kayg.org/attachments/6029d25a-9a32-479d-91d1-5175015a1b51) ![panel-available-phone-ink.png](https://git.kayg.org/attachments/8cc81023-4fe0-44e1-b3d0-4eddf740748b) ![panel-enterprise-small-paper.png](https://git.kayg.org/attachments/b15a77a9-25c6-40a4-b456-1474b028308a) ![width-292-foot-desktop-ink.png](https://git.kayg.org/attachments/4ed17854-fee8-4276-a50e-20afdcadb3ca) ![width-240-foot-desktop-ink.png](https://git.kayg.org/attachments/afffb6a2-15f9-4bb9-87e3-4885941599d7) ![width-220-foot-desktop-ink.png](https://git.kayg.org/attachments/262d39f3-db9c-4f65-ab03-86431a160e43) ![width-200-foot-desktop-ink.png](https://git.kayg.org/attachments/7b1117b5-47d3-4ea7-84b1-42d38785266d) ![width-212-foot-phone-paper.png](https://git.kayg.org/attachments/7617a21c-d0c0-416f-9a8d-dffe96e7d216) ![hosts-current-desktop-ink.png](https://git.kayg.org/attachments/4f47cb49-5b33-40c7-957a-2a916bf7d0d1) ![hosts-behind-desktop-ink.png](https://git.kayg.org/attachments/b930bdc0-0ce5-4fab-af0f-541bef2baee6) ![hosts-behind-expanded-phone-paper.png](https://git.kayg.org/attachments/9119bbe4-aa8c-4a5c-ab64-0437786a28d0) ![hosts-offline-small-ink.png](https://git.kayg.org/attachments/e5c3b639-babf-443a-85a3-2bab4a0cb104)
Author
Owner

Round 3 (owner feedback on the pill alignment and the panel's wording). Branch mockup-version-pill, head 824e79a92 (pushed).

Commits: aac6bb95b pill baseline alignment; 07c19c45c + 824e79a92 wide link rows (first in the shared list, then moved out of it because it grew the critical class by 321 bytes); e1665a9e5 the panel says nothing twice (specs and wording tests updated).

  1. CE alignment: the tick, number and letters are now one baseline-aligned line box. Measured on the 3x crops (ink rows): number and CE have identical top and bottom (19.33 to 29.00 px desktop, 20.00 to 31.00 touch); the tick's middle is within 0.17 css px (desktop) and 0.33 px (touch, one device pixel) of the digits' middle. Before: the tick was 1.2 px high on desktop. Crops with the baseline (red), cap line and middle (blue) drawn: pill-baseline-3x-*.
  2. Panel wording: heading "infraternal 0.4.2" + close; rows "Updates", "Hosts", "What's new" (link); the licence section is titled by the edition ("Community edition", "Team edition · Northwind Labs"), then the plain line, "Add more people", "Enter licence key" (or people, renews, "Replace licence key"). No Version row, no Edition row, no "Includes" key, no "Version and licence" title; no value repeats its key ("Up to date", "All up to date", "2 on an older version", "0.5.0 is available · Update", "Couldn't check · Try again").
  3. Kept: heights 40/44, in-sidebar card, widths, specs: version-pill + inbox + ca-unlock + host-actions-mockup, 64 passed. First open 9.7 ms, warm median 4.7 ms.

Budgets (D188): critical JS identity 959201 bytes (unchanged, +0); deferred 141810 identity, 49524/51200 gzip, 43948/45056 brotli; on-demand identity 214599 (unchanged).
Gate: scripts/verify iterate still stops at the unrelated repository artifact gate; TS half: tsc clean, 260 pass, 1 fail (the unrelated src/canvas/layout/stops.test.ts "an empty graph rests on its centre", Received 252.5, as in rounds 1 and 2).

Evidence (1440x900 and 393x852, ink and paper): panels for every scenario, hosts states, widths, heights, pill baseline crops.
pill-baseline-3x-desktop-ink.png
pill-baseline-3x-desktop-paper.png
pill-baseline-3x-phone-ink.png
pill-baseline-3x-phone-paper.png
panel-current-desktop-ink.png
panel-current-desktop-paper.png
panel-available-phone-ink.png
panel-team-full-desktop-paper.png
panel-expired-phone-ink.png
panel-hosts-behind-desktop-ink.png
panel-bad-key-phone-paper.png

Round 3 (owner feedback on the pill alignment and the panel's wording). Branch `mockup-version-pill`, head 824e79a92 (pushed). Commits: aac6bb95b pill baseline alignment; 07c19c45c + 824e79a92 wide link rows (first in the shared list, then moved out of it because it grew the critical class by 321 bytes); e1665a9e5 the panel says nothing twice (specs and wording tests updated). 1. CE alignment: the tick, number and letters are now one baseline-aligned line box. Measured on the 3x crops (ink rows): number and CE have identical top and bottom (19.33 to 29.00 px desktop, 20.00 to 31.00 touch); the tick's middle is within 0.17 css px (desktop) and 0.33 px (touch, one device pixel) of the digits' middle. Before: the tick was 1.2 px high on desktop. Crops with the baseline (red), cap line and middle (blue) drawn: pill-baseline-3x-*. 2. Panel wording: heading "infraternal 0.4.2" + close; rows "Updates", "Hosts", "What's new" (link); the licence section is titled by the edition ("Community edition", "Team edition · Northwind Labs"), then the plain line, "Add more people", "Enter licence key" (or people, renews, "Replace licence key"). No Version row, no Edition row, no "Includes" key, no "Version and licence" title; no value repeats its key ("Up to date", "All up to date", "2 on an older version", "0.5.0 is available · Update", "Couldn't check · Try again"). 3. Kept: heights 40/44, in-sidebar card, widths, specs: version-pill + inbox + ca-unlock + host-actions-mockup, 64 passed. First open 9.7 ms, warm median 4.7 ms. Budgets (D188): critical JS identity 959201 bytes (unchanged, +0); deferred 141810 identity, 49524/51200 gzip, 43948/45056 brotli; on-demand identity 214599 (unchanged). Gate: scripts/verify iterate still stops at the unrelated repository artifact gate; TS half: tsc clean, 260 pass, 1 fail (the unrelated src/canvas/layout/stops.test.ts "an empty graph rests on its centre", Received 252.5, as in rounds 1 and 2). Evidence (1440x900 and 393x852, ink and paper): panels for every scenario, hosts states, widths, heights, pill baseline crops. ![pill-baseline-3x-desktop-ink.png](https://git.kayg.org/attachments/5fe24227-e853-489e-8552-09dd09a2c6f8) ![pill-baseline-3x-desktop-paper.png](https://git.kayg.org/attachments/5a78cd56-e55e-41cf-bae4-22b323e9ebb7) ![pill-baseline-3x-phone-ink.png](https://git.kayg.org/attachments/596ecd5a-f534-410d-8dcb-dc879013a537) ![pill-baseline-3x-phone-paper.png](https://git.kayg.org/attachments/1f5bbea3-6af3-41bf-872b-d0fc850a0828) ![panel-current-desktop-ink.png](https://git.kayg.org/attachments/43eb724e-6734-4134-adfe-763c69001cef) ![panel-current-desktop-paper.png](https://git.kayg.org/attachments/461c0cab-3518-4521-afb7-8992b7ae4101) ![panel-available-phone-ink.png](https://git.kayg.org/attachments/20cdf20e-03a6-44cd-a6e8-8b63c8586985) ![panel-team-full-desktop-paper.png](https://git.kayg.org/attachments/b18df1db-0a82-40af-b9c3-8f6d99510bf7) ![panel-expired-phone-ink.png](https://git.kayg.org/attachments/84855b09-d723-4ee6-aafb-1292e57cfe20) ![panel-hosts-behind-desktop-ink.png](https://git.kayg.org/attachments/27cbcad5-5121-47c7-bf7b-f3a983634b2d) ![panel-bad-key-phone-paper.png](https://git.kayg.org/attachments/bdfc0a94-84a3-4319-805b-e5ea5bed9f6b)
Author
Owner

Round 4 (owner feedback on the version panel). Branch mockup-version-pill, head edb1d710f (pushed); the combo is merged and the shared wide rows are back (5c15a0746).

Commits: 5c15a0746 shared wide rows restored; 68c6e09f7 tooltip measured and clear of the pointer; edb1d710f the panel (check on press, "4 behind", copy audit, licence-end policy, type hierarchy, worst cases, TASTE rows).

  1. Tooltip: its height was a fixed one line, so a wrapped label grew over its trigger; it is now measured, and the mouse position is tracked so a tip takes the other side or moves clear of the pointer. The hosts tip is one short line ("4 hosts on 0.4.2", "2 of 4 hosts on an older version"). Cost in the critical class (the tooltip is first-screen code): +435 bytes identity, +174 gzip, +107 brotli (297545 of 307200 gzip).
  2. Pressing Updates runs a check, never copies: Checking…, then Up to date / 0.5.1 is available · Update / Couldn't check · Try again. Test-double scenarios for each.
  3. Hosts: amber text "4 behind", no mark; opens the list pane.
  4. Copy audit: only the version (heading) and the licence key id copy; keys, statuses, dates, counts and sentences are plain text. Asserted in every scenario.
  5. Licence end: only the first person keeps working. "5 people can't sign in" + "Only you can sign in now. Enter a new key to bring everyone back."; ending in 7 days: "5 people lose access on 22 Oct 2026" + "After 22 Oct 2026 only you can sign in. Renew the licence to keep everyone."
  6. Structure: heading 16 px/600 (18 px touch) against the pill's 13 px (15 touch) and rows at 13; version group, licence group titled by the edition with facts as rows (Licensed to, People, Renews/Ends, Key), the end consequence, actions last. Before/after crop: header-vs-pill-before-after-3x.png.
  7. break-ui worst cases (40 hosts with 70-character names, 70-character company, 1,248 of 1,250 people, one person, one other person). Found and fixed: names clipped to "build-farm-e…" (now wrap), the pane could scroll sideways, counts without a thousands separator, the plural of one.

Gates: scripts/verify iterate still stops at the unrelated repository artifact gate; TS half: tsc clean, 275 pass, 1 fail (the unrelated src/canvas/layout/stops.test.ts, as in earlier rounds). Playwright: version-pill + inbox + ca-unlock + host-actions-mockup + account-card, 117 passed. Panel open: first 12.4 ms, warm median 5.4 ms.
Budgets: critical 959957 identity (+435 from the tooltip, see above), deferred 141810 (unchanged; 49522/51200 gzip, 43973/45056 brotli), on-demand 214638 (unchanged from the merged head).
header-vs-pill-before-after-3x.png
panel-team-full-desktop-ink.png
panel-expiring-desktop-paper.png
panel-expired-phone-ink.png
panel-check-finds-phone-ink.png
check-found-desktop-ink.png
hosts-behind-desktop-ink.png
hosts-behind-expanded-phone-paper.png
worst-hosts-pane-phone-ink.png
panel-worst-licence-phone-paper.png
panel-one-person-desktop-ink.png
panel-expired-one-desktop-paper.png

Round 4 (owner feedback on the version panel). Branch `mockup-version-pill`, head edb1d710f (pushed); the combo is merged and the shared wide rows are back (5c15a0746). Commits: 5c15a0746 shared wide rows restored; 68c6e09f7 tooltip measured and clear of the pointer; edb1d710f the panel (check on press, "4 behind", copy audit, licence-end policy, type hierarchy, worst cases, TASTE rows). 1. Tooltip: its height was a fixed one line, so a wrapped label grew over its trigger; it is now measured, and the mouse position is tracked so a tip takes the other side or moves clear of the pointer. The hosts tip is one short line ("4 hosts on 0.4.2", "2 of 4 hosts on an older version"). Cost in the critical class (the tooltip is first-screen code): +435 bytes identity, +174 gzip, +107 brotli (297545 of 307200 gzip). 2. Pressing Updates runs a check, never copies: Checking…, then Up to date / 0.5.1 is available · Update / Couldn't check · Try again. Test-double scenarios for each. 3. Hosts: amber text "4 behind", no mark; opens the list pane. 4. Copy audit: only the version (heading) and the licence key id copy; keys, statuses, dates, counts and sentences are plain text. Asserted in every scenario. 5. Licence end: only the first person keeps working. "5 people can't sign in" + "Only you can sign in now. Enter a new key to bring everyone back."; ending in 7 days: "5 people lose access on 22 Oct 2026" + "After 22 Oct 2026 only you can sign in. Renew the licence to keep everyone." 6. Structure: heading 16 px/600 (18 px touch) against the pill's 13 px (15 touch) and rows at 13; version group, licence group titled by the edition with facts as rows (Licensed to, People, Renews/Ends, Key), the end consequence, actions last. Before/after crop: header-vs-pill-before-after-3x.png. 7. break-ui worst cases (40 hosts with 70-character names, 70-character company, 1,248 of 1,250 people, one person, one other person). Found and fixed: names clipped to "build-farm-e…" (now wrap), the pane could scroll sideways, counts without a thousands separator, the plural of one. Gates: scripts/verify iterate still stops at the unrelated repository artifact gate; TS half: tsc clean, 275 pass, 1 fail (the unrelated src/canvas/layout/stops.test.ts, as in earlier rounds). Playwright: version-pill + inbox + ca-unlock + host-actions-mockup + account-card, 117 passed. Panel open: first 12.4 ms, warm median 5.4 ms. Budgets: critical 959957 identity (+435 from the tooltip, see above), deferred 141810 (unchanged; 49522/51200 gzip, 43973/45056 brotli), on-demand 214638 (unchanged from the merged head). ![header-vs-pill-before-after-3x.png](https://git.kayg.org/attachments/2eec4ecd-8d62-4d81-a5f6-c9f8507f537d) ![panel-team-full-desktop-ink.png](https://git.kayg.org/attachments/95e8cc6f-ad31-4da2-97b5-e5e26dcff9c0) ![panel-expiring-desktop-paper.png](https://git.kayg.org/attachments/d9eccee8-508f-435f-815a-ad715da92710) ![panel-expired-phone-ink.png](https://git.kayg.org/attachments/be94812c-880e-446d-97b1-d928eacef030) ![panel-check-finds-phone-ink.png](https://git.kayg.org/attachments/526d2efe-17ea-4d2d-99a9-331a5495750e) ![check-found-desktop-ink.png](https://git.kayg.org/attachments/7db08743-b21c-47a6-9eea-40cc6abae51c) ![hosts-behind-desktop-ink.png](https://git.kayg.org/attachments/9219e5ac-d1d9-4ea6-ae28-782b4504ecc4) ![hosts-behind-expanded-phone-paper.png](https://git.kayg.org/attachments/b0594ca5-ac04-46ab-898e-c2ec73927d28) ![worst-hosts-pane-phone-ink.png](https://git.kayg.org/attachments/4be19236-1f9d-4fb0-87de-2f13a1de96bd) ![panel-worst-licence-phone-paper.png](https://git.kayg.org/attachments/062f68ce-2aac-46ca-be10-49d2f2c94527) ![panel-one-person-desktop-ink.png](https://git.kayg.org/attachments/2d958ddc-1cc9-4aa8-a83f-0d7625b6a2bd) ![panel-expired-one-desktop-paper.png](https://git.kayg.org/attachments/aa30442d-40a2-454b-853c-960802402ec9)
Author
Owner

Rebuilt on current dev for the owner's review. Branch mockups-2026-10-31, head 586cd2b13 (base dev 42ab33035, 2026-10-31). Test double only; nothing is real or saved. Not merged, not deployed. Old previews are gone; this replaces them.

Preview (NetBird, bound to infraternal-dev-02-std; index of every mockup: http://10.69.69.117:47650/mockups.html):

How: The small pill beside the name in the sidebar footer. Palette: "Mockup: version" rows for each state.

Note: Rebased only. Same scaffold note as #224 on phones.

Captures are Chromium on the production build of the mockup, taken by apps/tracer/test/capture-mockups.ts; I have read them for wrong states, not judged them as final.

Desktop 1440×900 @2x, ink

cannot-check
invalid-key
licence-ending
panel
pill-in-footer
team-seats
update-available

Desktop 1440×900 @2x, paper

cannot-check
invalid-key
licence-ending
panel
pill-in-footer
team-seats
update-available

Phone 393×852 @3x, ink

cannot-check
invalid-key
licence-ending
panel
pill-in-footer
team-seats
update-available

Phone 393×852 @3x, paper (first state only)

pill-in-footer

Rebuilt on current dev for the owner's review. Branch `mockups-2026-10-31`, head `586cd2b13` (base dev `42ab33035`, 2026-10-31). Test double only; nothing is real or saved. Not merged, not deployed. Old previews are gone; this replaces them. **Preview** (NetBird, bound to infraternal-dev-02-std; index of every mockup: http://10.69.69.117:47650/mockups.html): - http://10.69.69.117:47650/?mock=1&proto=clusters&scene=3&version=1 **How:** The small pill beside the name in the sidebar footer. Palette: "Mockup: version" rows for each state. **Note:** Rebased only. Same scaffold note as #224 on phones. Captures are Chromium on the production build of the mockup, taken by `apps/tracer/test/capture-mockups.ts`; I have read them for wrong states, not judged them as final. **Desktop 1440×900 @2x, ink** ![cannot-check](https://git.kayg.org/attachments/9c621e41-bc08-45ea-a303-e1c1ab1ee599) ![invalid-key](https://git.kayg.org/attachments/5e5961cf-b368-4a4b-ba82-4d773b221cc5) ![licence-ending](https://git.kayg.org/attachments/f3bba208-eac6-459b-a58e-5f1d19de8a5e) ![panel](https://git.kayg.org/attachments/58366c67-13c3-4ff8-af8f-37865349da73) ![pill-in-footer](https://git.kayg.org/attachments/54e3f965-6ee0-472a-8b5f-deef51283c50) ![team-seats](https://git.kayg.org/attachments/cb25de09-9eda-4691-b569-8212ccf6af63) ![update-available](https://git.kayg.org/attachments/6ef4417c-e358-40f3-ad88-8d8672631bd2) **Desktop 1440×900 @2x, paper** ![cannot-check](https://git.kayg.org/attachments/492c9b56-c75f-48bb-8ae5-28594fa0cddb) ![invalid-key](https://git.kayg.org/attachments/1cf3d504-0776-4fd0-a99d-7601966e5333) ![licence-ending](https://git.kayg.org/attachments/2081f06e-d64a-4401-af39-1f17aaf1f50b) ![panel](https://git.kayg.org/attachments/f9ba0b7a-267b-4d26-b36c-33e3bd66d4f6) ![pill-in-footer](https://git.kayg.org/attachments/46501b7e-41b4-4f32-bae5-3930c44213bf) ![team-seats](https://git.kayg.org/attachments/16cafecb-5a09-46d0-91fc-395349ef6f78) ![update-available](https://git.kayg.org/attachments/62a140d9-4c8d-4dc2-8be4-cf6adf54dcbe) **Phone 393×852 @3x, ink** ![cannot-check](https://git.kayg.org/attachments/ea844cfa-4571-46e3-a25e-cbfc1373c218) ![invalid-key](https://git.kayg.org/attachments/f701933f-38ce-4d6c-a322-1bebc4b29641) ![licence-ending](https://git.kayg.org/attachments/06bb9067-3931-474c-811d-30551b1d69c6) ![panel](https://git.kayg.org/attachments/57891f9d-e339-4417-aa19-0434411dc055) ![pill-in-footer](https://git.kayg.org/attachments/d8767186-76e1-4506-bd8e-62555f6d5bb4) ![team-seats](https://git.kayg.org/attachments/8a642f7d-cdd3-4f73-890c-0d9bf592f260) ![update-available](https://git.kayg.org/attachments/2f8931d2-b949-42f7-870b-851abf270761) **Phone 393×852 @3x, paper (first state only)** ![pill-in-footer](https://git.kayg.org/attachments/71afd2ec-0b00-4a58-b541-f0221fa46cb6)
Author
Owner

Update to the comment above: the branch head is now 57871651f (the preview at http://10.69.69.117:47650/mockups.html runs it). The captures above were taken one build earlier; the only difference is that the window terminals there hide their cursor until attached, a production change that was since removed from the branch. Gate output, what is left out, and the budget finding: #272.

Update to the comment above: the branch head is now `57871651f` (the preview at http://10.69.69.117:47650/mockups.html runs it). The captures above were taken one build earlier; the only difference is that the window terminals there hide their cursor until attached, a production change that was since removed from the branch. Gate output, what is left out, and the budget finding: #272.
Author
Owner

J56 started (Claude Sonnet 5.5). Branch ui-approved-189-212-216, base origin/dev f4b61cd6c. Building the owner-approved mockups (mockups-2026-10-31) into the product. Owner 2026-11-01: "add-host pill is approved. connection states is approved. version pill is mostly approved." plus the value-tap changes (in-place clipboard + Copied, contextual default action, one Updates key).

**J56 started** (Claude Sonnet 5.5). Branch `ui-approved-189-212-216`, base origin/dev `f4b61cd6c`. Building the owner-approved mockups (mockups-2026-10-31) into the product. Owner 2026-11-01: "add-host pill is approved. connection states is approved. version pill is mostly approved." plus the value-tap changes (in-place clipboard + Copied, contextual default action, one Updates key).
Author
Owner

Progress (J56). Branch ui-approved-189-212-216 pushed (head: copy/press commit). Done: shared sidebar card shell (Inbox rebuilt on it); in-place "clipboard + Copied" confirmation and the contextual press action in the shared key/value list (no tooltip, reduced-motion safe). Next: version pill + panel with the one merged Updates row, then the connection indicator in the window pill. Finding: no update-check or licence backend exists on dev (#211 is backend-only and unmerged), so the panel will be wired to an update source with the action stubbed behind a TODO linked to #211.

**Progress (J56).** Branch `ui-approved-189-212-216` pushed (head: copy/press commit). Done: shared sidebar card shell (Inbox rebuilt on it); in-place "clipboard + Copied" confirmation and the contextual `press` action in the shared key/value list (no tooltip, reduced-motion safe). Next: version pill + panel with the one merged Updates row, then the connection indicator in the window pill. Finding: no update-check or licence backend exists on dev (#211 is backend-only and unmerged), so the panel will be wired to an update source with the action stubbed behind a TODO linked to #211.
Author
Owner

Progress (J56), WIP pushed to ui-approved-189-212-216. Written: version pill + panel (canvas/version/*, packages/ui/src/version-pill.on-demand.ts), the merged Updates row and its update controller with unit tests (24 pass on compute01), the window-pill connection indicator wired to the real binding (windows/link.ts, kept-keys count, resumed/approximate moments) and the TASTE rows (separate docs commit). tsc clean. Waiting for a build slot on compute01 (queue ~11) for the first browser batch; log ~/j56-logs/b1.log there. Not built yet: nothing blocking. Decisions I made that need a look: (1) the kept-keys dim text line of the mockup is NOT shipped (a secret typed into a hidden prompt would appear on screen); only the count and the amber key are; (2) no licence-key entry and no release notes row in the product until there is a backend for them.

**Progress (J56), WIP pushed to `ui-approved-189-212-216`.** Written: version pill + panel (`canvas/version/*`, `packages/ui/src/version-pill.on-demand.ts`), the merged Updates row and its update controller with unit tests (24 pass on compute01), the window-pill connection indicator wired to the real binding (`windows/link.ts`, kept-keys count, resumed/approximate moments) and the TASTE rows (separate docs commit). `tsc` clean. Waiting for a build slot on compute01 (queue ~11) for the first browser batch; log `~/j56-logs/b1.log` there. Not built yet: nothing blocking. Decisions I made that need a look: (1) the kept-keys dim text line of the mockup is NOT shipped (a secret typed into a hidden prompt would appear on screen); only the count and the amber key are; (2) no licence-key entry and no release notes row in the product until there is a backend for them.
Author
Owner

Progress (J56). History is now atomic and pushed (ui-approved-189-212-216 head 0176caf22): sidebar-card refactor, in-place copy + contextual press, About list on demand (keeps the critical transfer budget green: critical gzip 305441/307200, brotli 254299/256000), connection icon in the window pill (#212), version pill + panel (#216), TASTE rows. Browser specs on dev-02 (arm64): connection-pill 12/12, version-pill 13/13 after fixes, add-host pill specs 4/4 + stream 9/9 (the unmodified-dev baseline has 4 failures in canvas.spec/sessions-canvas on this VM that I reproduced there: touch grip 43.99px, footer Settings, Linux key glyphs, session badge). Final batch + captures running; scripts/verify fast is queued on compute01.

**Progress (J56).** History is now atomic and pushed (`ui-approved-189-212-216` head `0176caf22`): sidebar-card refactor, in-place copy + contextual press, About list on demand (keeps the critical transfer budget green: critical gzip 305441/307200, brotli 254299/256000), connection icon in the window pill (#212), version pill + panel (#216), TASTE rows. Browser specs on dev-02 (arm64): connection-pill 12/12, version-pill 13/13 after fixes, add-host pill specs 4/4 + stream 9/9 (the unmodified-dev baseline has 4 failures in canvas.spec/sessions-canvas on this VM that I reproduced there: touch grip 43.99px, footer Settings, Linux key glyphs, session badge). Final batch + captures running; `scripts/verify fast` is queued on compute01.
Author
Owner

J56: version pill and panel, built into the product (branch ui-approved-189-212-216, head bd2671f8a; pill/panel commit 22032d9ba). Chromium on the production build of the test double (?mock=1&proto=clusters&scene=3&version=1, the same pill and panel the product mounts), 1440×900 @2x and 393×852 @3x, ink (and paper for three states). Read for wrong states, not judged as final.

Owner changes, as built:

  • Copy answers in place: the text fades out and a clipboard icon with "Copied" takes its place, then it fades back; no tooltip; reduced motion keeps only the crossfade (copied-in-place-*).
  • Contextual default action, copy only when none. Per value:
    • Version panel: Updates value = check every host together, then "proceed?", then update (never copies); heading infraternal <version> = copies the whole build id; licence lines (edition text, People, Ends/Renews) = copy their own text; every key = copies its own word.
    • Machine details popover (Host, Connection, Session rows: name, system, kernel, architecture, model, CPU, memory, disk, uptime, load, infraternal agent, engines, login, address, status, connection delay, encrypted, session name/times/size): no contextual action exists, so they copy.
    • Settings, About (name, version, commit, built): copy (the version copies the full commit id).
    • On touch a value with an action answers a single tap; copying a plain value still takes a double tap.
  • One Updates key, no Hosts row. Lag shows by itself (lag-shows-by-itself-*: "2 updates available — proceed?" without any press). Press: spinner "Checking for updates…" (checking-*) → "1 update available — proceed?" (proceed-*) → press → "Updating 1…" (updating-*) → "Up to date" (up-to-date-after-*), or "Couldn't check — try again" (cannot-check-*).

Measured (production build, 1440 wide, headless): first open 0.7 ms, warm open 0.1 ms, a press 0.5 ms of script, no long task. Critical transfer budget stays inside its limit: gzip 305441/307200, brotli 254299/256000 (base 306082 / 254991), because the About list now loads on demand.

Backend gap, stubbed on purpose: nothing on dev reports an update check, a host's agent version or a licence to the web app (#211 is backend only). The product's source (createProductVersionSource, TODO(#211) in canvas/version/source.ts) answers from what the build knows: Community edition, hosts by name, no check. So in the product the row says "Check for updates" and a press ends in "Couldn't check — try again"; the pill shows no status mark. When #211's state and events exist only that function changes. Not built (need a backend): licence-key entry, release notes.

**J56: version pill and panel, built into the product** (branch `ui-approved-189-212-216`, head `bd2671f8a`; pill/panel commit `22032d9ba`). Chromium on the production build of the test double (`?mock=1&proto=clusters&scene=3&version=1`, the same pill and panel the product mounts), 1440×900 @2x and 393×852 @3x, ink (and paper for three states). Read for wrong states, not judged as final. Owner changes, as built: - **Copy answers in place**: the text fades out and a clipboard icon with "Copied" takes its place, then it fades back; no tooltip; reduced motion keeps only the crossfade (`copied-in-place-*`). - **Contextual default action, copy only when none.** Per value: - *Version panel*: **Updates** value = check every host together, then "proceed?", then update (never copies); heading `infraternal <version>` = copies the whole build id; licence lines (edition text, People, Ends/Renews) = copy their own text; every key = copies its own word. - *Machine details popover* (Host, Connection, Session rows: name, system, kernel, architecture, model, CPU, memory, disk, uptime, load, infraternal agent, engines, login, address, status, connection delay, encrypted, session name/times/size): no contextual action exists, so they copy. - *Settings, About* (name, version, commit, built): copy (the version copies the full commit id). - On touch a value with an action answers a single tap; copying a plain value still takes a double tap. - **One Updates key**, no Hosts row. Lag shows by itself (`lag-shows-by-itself-*`: "2 updates available — proceed?" without any press). Press: spinner "Checking for updates…" (`checking-*`) → "1 update available — proceed?" (`proceed-*`) → press → "Updating 1…" (`updating-*`) → "Up to date" (`up-to-date-after-*`), or "Couldn't check — try again" (`cannot-check-*`). Measured (production build, 1440 wide, headless): first open 0.7 ms, warm open 0.1 ms, a press 0.5 ms of script, no long task. Critical transfer budget stays inside its limit: gzip 305441/307200, brotli 254299/256000 (base 306082 / 254991), because the About list now loads on demand. **Backend gap, stubbed on purpose:** nothing on dev reports an update check, a host's agent version or a licence to the web app (#211 is backend only). The product's source (`createProductVersionSource`, `TODO(#211)` in `canvas/version/source.ts`) answers from what the build knows: Community edition, hosts by name, no check. So in the product the row says "Check for updates" and a press ends in "Couldn't check — try again"; the pill shows no status mark. When #211's state and events exist only that function changes. Not built (need a backend): licence-key entry, release notes.
Author
Owner

J56 finished. Branch ui-approved-189-212-216, head bd2671f8abb5fa32ae5279e440cb309d8214bc96, base origin/dev f4b61cd6c. Pushed, not merged.

Commits: 9845b0ec7 sidebar-card refactor · 9652ae0ce in-place copy + contextual press · 5c15bd0c0 About list on demand (D188 budget) · 1e9369200 connection icon in the window pill (#212) · 22032d9ba version pill and panel (#216) · bd2671f8a TASTE rows.

Gate. scripts/verify fast on compute01 (x86), copy of this head: Rust half failed for lack of disk, not for code: No space left on device (os error 28) at target/debug/deps (the VM was 100% full, 2.5 GB free, from other jobs; my target was 8.6 GB, now deleted). Table, verbatim:

| fmt | PASS | VT native fmt | PASS | CLI plugin compile-out | PASS | clippy | PASS |
| SSH runtime test helper | PASS | real-binary fixture paths | PASS |
| test | FAIL (101) | SSH inode reuse fixture | FAIL (101) | shim process-per-user | FAIL (101) |
| cargo-deny | FAIL (1) | gate architecture | PASS | static builds | FAIL (1) |

No Rust file changed in this branch. A re-run needs ≥25 GB free there (build-slot waits for it). The TypeScript half of verify fast (its exact commands from scripts/verify.d/ts.sh) was run on dev-02 instead: bun run check clean; unit tests 394 + 105 + 17 pass, 0 fail; protocol tsc clean; transfer budget critical gzip 305448/307200 brotli 254318/256000, deferred 58585/61440, onDemand not limited (largest chunk 15456/20480); log TS_GATE_OK.

Browser specs (dev-02, arm64, production build). Final batch: 107 passed, 5 failed: 4 fail identically on unmodified f4b61cd6c on the same VM (canvas.spec touch grip 43.99999 px < 44; canvas.spec sidebar footer Settings; canvas.spec Linux key glyphs; sessions-canvas badge); 1 version-pill timing flake (6/6 on repeat, assertion timeout raised). Add-host pill specs 4/4 alone (a run next to other heavy jobs hit 2 s long tasks; same spec passes on dev when alone).

Not built / for kayg: (1) typed-text echo under a lost link (secret risk); (2) licence-key entry and release notes (no backend); (3) the product's update check is stubbed behind TODO(#211) in apps/tracer/src/canvas/version/source.ts, so the row ends in "Couldn't check — try again" until #211 exists; (4) the pill number is the build's short commit id (the web app has no version number).

**J56 finished.** Branch `ui-approved-189-212-216`, head `bd2671f8abb5fa32ae5279e440cb309d8214bc96`, base origin/dev `f4b61cd6c`. Pushed, not merged. Commits: `9845b0ec7` sidebar-card refactor · `9652ae0ce` in-place copy + contextual `press` · `5c15bd0c0` About list on demand (D188 budget) · `1e9369200` connection icon in the window pill (#212) · `22032d9ba` version pill and panel (#216) · `bd2671f8a` TASTE rows. **Gate.** `scripts/verify fast` on compute01 (x86), copy of this head: Rust half failed for lack of disk, not for code: `No space left on device (os error 28)` at `target/debug/deps` (the VM was 100% full, 2.5 GB free, from other jobs; my target was 8.6 GB, now deleted). Table, verbatim: ``` | fmt | PASS | VT native fmt | PASS | CLI plugin compile-out | PASS | clippy | PASS | | SSH runtime test helper | PASS | real-binary fixture paths | PASS | | test | FAIL (101) | SSH inode reuse fixture | FAIL (101) | shim process-per-user | FAIL (101) | | cargo-deny | FAIL (1) | gate architecture | PASS | static builds | FAIL (1) | ``` No Rust file changed in this branch. A re-run needs ≥25 GB free there (build-slot waits for it). The TypeScript half of `verify fast` (its exact commands from `scripts/verify.d/ts.sh`) was run on dev-02 instead: `bun run check` clean; unit tests 394 + 105 + 17 pass, 0 fail; protocol tsc clean; transfer budget `critical gzip 305448/307200 brotli 254318/256000, deferred 58585/61440, onDemand not limited (largest chunk 15456/20480)`; log `TS_GATE_OK`. **Browser specs (dev-02, arm64, production build).** Final batch: 107 passed, 5 failed: 4 fail identically on unmodified `f4b61cd6c` on the same VM (canvas.spec touch grip 43.99999 px < 44; canvas.spec sidebar footer Settings; canvas.spec Linux key glyphs; sessions-canvas badge); 1 version-pill timing flake (6/6 on repeat, assertion timeout raised). Add-host pill specs 4/4 alone (a run next to other heavy jobs hit 2 s long tasks; same spec passes on dev when alone). **Not built / for kayg:** (1) typed-text echo under a lost link (secret risk); (2) licence-key entry and release notes (no backend); (3) the product's update check is stubbed behind `TODO(#211)` in `apps/tracer/src/canvas/version/source.ts`, so the row ends in "Couldn't check — try again" until #211 exists; (4) the pill number is the build's short commit id (the web app has no version number).
Author
Owner

scripts/verify fast on compute01, via build-slot, branch ui-approved-189-212-216 head bd2671f8abb5fa32ae5279e440cb309d8214bc96: all green. (Rerun after the disk-full failure; compute01 had 123 GB free at start, the target was 31 GB and is deleted.)

Steps, in order: Repository artifact size gate; Release deployment functional checks; fmt; VT native fmt; CLI plugin compile-out; clippy; SSH runtime test helper; real-binary fixture paths; test; SSH inode reuse fixture; shim process-per-user; cargo-deny; gate architecture; static builds; Compiler metadata generator checks; Vendored Ghostty artifact checksums; TypeScript protocol compiler; Tracer compiler, precompression and bundle transfer budget; Rust stream oracle; TypeScript protocol tests.

| Rust gate                 | Result       |
| fmt                       | PASS         |
| VT native fmt             | PASS         |
| CLI plugin compile-out    | PASS         |
| clippy                    | PASS         |
| SSH runtime test helper   | PASS         |
| real-binary fixture paths | PASS         |
| test                      | PASS         |
| SSH inode reuse fixture   | PASS         |
| shim process-per-user     | PASS         |
| cargo-deny                | PASS         |
| gate architecture         | PASS         |
| static builds             | PASS         |

JavaScript transfer, critical: identity=986973 gzip=305443/307200 brotli=254472/256000 bytes
JavaScript transfer, deferred: identity=168998 gzip=58591/61440 brotli=52013/55296 bytes
JavaScript transfer, onDemand: identity=249607 gzip=99084/20480 brotli=88279/18432 bytes
JavaScript transfer, onDemand largest chunk chunk-1t9yavpg.js: gzip=15458/20480 brotli=13799/18432 bytes (class total gzip=99084 brotli=88279, not limited)
tracer bun tests: 394 pass, 0 fail (63 files) + 105 pass, 0 fail (13 files) + 17 pass, 0 fail (4 files)
protocol bun tests: 39 pass, 0 fail (10 files)

No failures, so nothing to compare against origin/dev f4b61cd6c. (Earlier, on dev-02, 4 browser specs outside this gate failed identically on unmodified f4b61cd6c; see the closing comment above.) Decisions noted: typed-text echo stays out (count only); licence entry and release notes wait for #211.

**`scripts/verify fast` on compute01, via build-slot, branch `ui-approved-189-212-216` head `bd2671f8abb5fa32ae5279e440cb309d8214bc96`: all green.** (Rerun after the disk-full failure; compute01 had 123 GB free at start, the target was 31 GB and is deleted.) Steps, in order: Repository artifact size gate; Release deployment functional checks; fmt; VT native fmt; CLI plugin compile-out; clippy; SSH runtime test helper; real-binary fixture paths; test; SSH inode reuse fixture; shim process-per-user; cargo-deny; gate architecture; static builds; Compiler metadata generator checks; Vendored Ghostty artifact checksums; TypeScript protocol compiler; Tracer compiler, precompression and bundle transfer budget; Rust stream oracle; TypeScript protocol tests. ``` | Rust gate | Result | | fmt | PASS | | VT native fmt | PASS | | CLI plugin compile-out | PASS | | clippy | PASS | | SSH runtime test helper | PASS | | real-binary fixture paths | PASS | | test | PASS | | SSH inode reuse fixture | PASS | | shim process-per-user | PASS | | cargo-deny | PASS | | gate architecture | PASS | | static builds | PASS | JavaScript transfer, critical: identity=986973 gzip=305443/307200 brotli=254472/256000 bytes JavaScript transfer, deferred: identity=168998 gzip=58591/61440 brotli=52013/55296 bytes JavaScript transfer, onDemand: identity=249607 gzip=99084/20480 brotli=88279/18432 bytes JavaScript transfer, onDemand largest chunk chunk-1t9yavpg.js: gzip=15458/20480 brotli=13799/18432 bytes (class total gzip=99084 brotli=88279, not limited) tracer bun tests: 394 pass, 0 fail (63 files) + 105 pass, 0 fail (13 files) + 17 pass, 0 fail (4 files) protocol bun tests: 39 pass, 0 fail (10 files) ``` No failures, so nothing to compare against origin/dev `f4b61cd6c`. (Earlier, on dev-02, 4 browser specs outside this gate failed identically on unmodified `f4b61cd6c`; see the closing comment above.) Decisions noted: typed-text echo stays out (count only); licence entry and release notes wait for #211.
Sign in to join this conversation.
No labels
launch-qa
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
kayg/infraternal#216
No description provided.