# UI work — remaining, measured What is left after the first pass on the two operator surfaces. Each item was observed on a real render, not inferred. Kept as a list so a gap is recorded rather than remembered. ## Device console (`bfos/ui_gui.py`) Reviewed against a screenshot of the running window (`spectacle`, 1440x900), with the token values read back out of `bfos/ui_theme.py`. **Landed** — grouping into headed regions; the privilege state moved out of a monospace paragraph into the header and a banner; the duplicate `Çık` removed; the output well styled as read-only; status colours from the shared tokens. The theme file carries the same values as `web/static/tokens.css` (`#1d4ed8`, `#15803d`, `#b45309`) — verified by comparison, not by assertion. **Still true at the time of writing:** 1. **The widgets still read as default ttk.** Inputs, comboboxes, checkbuttons and the scrollbar keep the renderer's native chrome. `ui_theme.py` selects `clam` because it honours `background`/`bordercolor` on the elements it restyles, but a themed *element* is not a redesigned control. Closing this needs `Style.element_create` work per control, or hand-drawn widgets, and it is the single largest remaining gap between this console and the web panel. 2. **The product name appears twice.** `root.title("Blueforce Field OS — Yönetim")` and the in-window header band carry the same words. One of them should go; the window title is what the taskbar and window switcher show, so the header band is the better candidate. 3. **`Cihaz durumu: YOK` is ambiguous** when no target is selected: it reads as a state a device is in rather than "nothing selected yet". 4. **`HAZIR` in the action bar looks like a disabled button** — it is a status label, but it is styled in the same register as the controls beside it. 5. **The operation list has no unambiguous selected/disabled distinction.** The first row carries a focus ring while being unavailable; the ring reads as "actionable" and the reason is only in the row's trailing text. ## Central panel (`web/`) Reviewed against served HTML and captured pages at 1440x900. **Fixed in this pass** — the accent and the `KURULDU` state were the same blue (`--state-provisioned: var(--info)`, and `--info` equals `--accent`), so a selected row and a state badge were indistinguishable; both now resolve to different colours, asserted by a test that resolves aliases before comparing. The wave cell printed the bare code and then a label that already contains it ("P2 P2 — PILOT-2"); it now names each wave once. **Still true:** 1. **No scroll affordance on the device table.** The page reports 13/13 while only part of the list is in view, and nothing signals that more rows exist. 2. **The read-only privilege is repeated** in the header note and a second line at the far right; one is enough. 3. **The `HAZIR` count appears in the loud figure and again in the breakdown.** Defensible (summary then detail), but worth a decision rather than an accident. 4. **Timestamps are ISO-8601** (`2026-09-16T06:20:00+03:00`). Precise and sortable, but slow to scan for a human at a glance. 5. **A `HATA` device offers no next action** — the panel says a person is needed and stops. For a fleet panel this is the workflow gap to close next.