Panels for a ten-inch screen, and a motor button that says where it is
Docs / docs (push) Canceled after 0s
Playwright Tests / test-playwright (1, 2) (push) Canceled after 0s
Playwright Tests / test-playwright (2, 2) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Test Backend / test-backend (push) Canceled after 0s
Compose Smoke Test / test-compose (push) Canceled after 0s
Playwright Tests / merge-reports (push) Canceled after 0s

Both screens the house is looked at on are 1280x800, so that is what the three
dashboards are laid out for: twelve columns of 96px, twelve rows of 51px, and
nothing past the bottom, because a panel does not scroll.

The motors are one control each instead of three buttons. A button could only
publish; a segmented control reads back as well — so the motor writes what it
is doing to the same message the control sets, and the segment that is held is
the direction it actually went. Up, Stop, Down for the shutters; Close/Open for
the window and In/Out for the awning, which is what those two are for.

A run stopped part way now leaves the position unknown rather than claiming the
target it never reached, so the next command in either direction moves it.

The preflight gained the two checks this needed. One runs each sample shape
past the port that would receive it. The other is arithmetic: every tile inside
the panel and none on top of another — both silent failures on a screen with no
scrollbar, and both caught before anything is written.

Sizes were settled by looking. A slider needs three rows or its tick labels
fall off; a status icon needs three or it loses the word under the glyph; a
gauge in two rows has no arc worth reading, so the battery is a bar on Home and
a gauge on Energy where there is height for one. A chart spends eighty pixels
on its chrome whatever it is given, so two of them read on this panel and three
did not — the temperature history is the one that went, and `history` still
answers for it.

`capture-panels.mjs` is how that was checked: the three panels at the screen's
own pixels, in both themes, reporting whether anything spilled.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-22 18:50:03 +02:00
co-authored by Claude Opus 5
parent 13cdfa79b9
commit 4bdc0ea04a
7 changed files with 341 additions and 100 deletions
+16
View File
@@ -12,6 +12,22 @@ Deferring because out of scope is fine, but don't mention deferring than.
### To be sorted
- CHORE/UI: the house panels are laid out for 1280x800 — twelve columns, twelve
rows — and that is as much as fits: a chart spends about eighty pixels on its
title, range picker and legend whatever height it is given, so two of them
read on that panel and three do not. The temperature history was the one
dropped; `history.climate_*` still answers, so it is a tile away.
- FEAT/UI: a bar's nested reading is captioned by its port name, which is
chosen for the graph rather than for somebody reading it across a room.
`Segment` now takes an optional `label`; the house dashboard sets one
(`Solar`), and it shows on the next frontend build.
- BUG/INFRA: the running `fluksio-frontend` image calls `https://api.localhost`
while `app/.env` says `VITE_API_URL=http://api.localhost` — the image predates
the environment being switched to `local`. Anything served from that bundle
reaches the API only where something terminates TLS for `api.localhost`. The
next frontend build changes the origin, so check how the app is actually
reached before making one.
- BUG/FLOW: **a cancelled request can leave `FlowController._lock` held forever.**
Seeding nineteen flows over a client that timed out mid-request left the next
`POST /flows/{name}/start` waiting on the lock indefinitely — ten minutes, until