Board: centre the indicators, and a counting region header in place of the divider - #45
Board: centre the indicators, and a counting region header in place of the divider#45emooreatx wants to merge 5 commits into
Conversation
The dots sat on the band's first row, so every row read as a line of lights with four empty rows hanging beneath it — the indicators looked detached from the letter they belong to, and the band looked mostly empty. Run dots now sit on rows 2 and 4 of the letter's five (still a blank row apart, so they cannot fuse), and a service row's single dot sits on row 3, the middle. Both are optically tied to the glyph beside them. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015iuQqpxEg9gqZ3gQ5nUjyR
The divider spent a row on a dotted line that restated the overall status, and the service dots sat beside their letters — so they zigzagged with the alternating letters and could not be read down a column. US was at x=5 on one row and x=1 on the next. Letters occupy either the first three columns or the last three, so columns 3-7 are the only ones never covered by a glyph. Service dots now live there at a fixed x per block, which makes them line up, and the three rows freed by dropping the divider carry a header for those columns: one column per block, its height counting the column (1, 2, 3) so there is no legend to memorise, lit in that block's worst-of rollup colour. That is strictly more than the divider said — per-region health instead of one aggregate — in the same space. Services shift down two rows, and the board is now exactly full: 25 rows of repos, 3 of header, 25 of services, 53 total with nothing spare. Known limit, deliberately not papered over: the counting header can express three columns in three rows. `region_cols` packs a fourth or fifth block into adjacent columns, but their heights would both cap at three and the count would start lying. Three blocks (us, eu, global) is what we have; scaling past that needs either position-only identity or a second dot row. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015iuQqpxEg9gqZ3gQ5nUjyR
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: b818c49f28
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| 36 | GG ## | D database | ||
| 41 |# GG Y | L providers US EU | GLOBAL | ||
| 46 | GG G ###| I infra | ||
| 28 | GG ## | B billing US EU |
There was a problem hiding this comment.
Align the documented board layout with the renderer
The updated diagram still depicts service indicators on each band's first row and near the edge (for example, billing dots on row 28), but draw_health() now renders them on the middle row in fixed center columns, so billing's dots appear on row 30 at x=3/5. The surrounding text also still describes an overall-status divider on row 25 and services on rows 26–50, whereas the renderer now uses rows 25–27 for the counting header and 28–52 for services. This makes the flashing guide misleading when users validate or interpret the new display.
Useful? React with 👍 / 👎.
The header commit changed main.py and left the README describing the layout it replaced: a dotted divider on row 25, services on 26-50, dots on each band's first row beside the letter. The renderer uses 25-27 for the counting header, 28-52 for services, and puts the dots on the middle row in the fixed centre columns. Someone validating a freshly flashed board against this diagram would have concluded it was broken. Caught in review of b818c49. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015iuQqpxEg9gqZ3gQ5nUjyR
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 06f249df00
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| HEADER_Y0 = CI_BANDS * BAND_H # 25 | ||
| HEADER_H = 3 | ||
| HEALTH_Y0 = HEADER_Y0 + HEADER_H # 28 — the board is now exactly full |
There was a problem hiding this comment.
Update the embedded layout documentation
The new three-row header and shifted service origin make the module docstring obsolete: it still describes CI dots on the first/third band rows, an overall-status divider at row 25, and services at rows 26–50. Because this is the file users copy directly to the board, anyone maintaining or diagnosing the renderer from its embedded layout guide will work from coordinates that no longer match the implementation; update that guide to describe rows 25–27 and 28–52 as well as the centered indicators.
Useful? React with 👍 / 👎.
Letters take either the first three columns or the last three, so 3-7 are the only five never covered by a glyph. Both halves now use exactly those: the run dots stop mirroring with their letter and sit at a fixed x, and the service blocks pack from the left of the same grid. A repo's five run columns line up with the five service columns beneath them, and the board reads as one channel of data with letters on the outside rather than two zigzagging sections. It also answers scaling: five columns hold five blocks, so a fourth region needs no layout change — and a block beyond the fifth is LOGGED rather than dropped, because a board that omits a region silently looks healthy by omission. (The counting header still only reaches three; that limit stands.) Packed blocks can share a colour with a neighbour and merge into a bar. That is fine horizontally — a run of green reads as "all green" and anything else breaks the run exactly where it is — unlike the vertical fusion that made the old health rows unreadable. Two review items fold in here: - The module docstring still described the divider and the old row ranges, in the file people copy to the device. It now matches the renderer. - The board treated any HTTP 200 as freshness, so a stalled node's last healthy snapshot would have rendered as current forever. It now honours the `stale` / `age_seconds` the service reports (CIRISStatus#46) and goes blue on the service's own word, not just on its ability to reach it. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015iuQqpxEg9gqZ3gQ5nUjyR
…the renderer Packing the blocks into consecutive columns lined them up cell-for-cell with the run columns, but it looked worse on the wall: three dots in a row read as a bar, and the spacing is what made them legible as separate regions. Spaced (3, 5, 7) while they fit, packed only when a fourth or fifth block leaves no choice. They still share the grid — a service dot sits under run column 1, 3 or 5 — so the alignment that motivated this stands; only the density changed. The README diagram is now GENERATED from the renderer's framebuffer rather than hand-drawn beside it. Twice now the picture has documented a layout the code no longer draws, once caught in review and once by me: my last attempt to fix it anchored on a substring that no longer existed, threw, and committed the code change with the stale diagram still in place. A diagram transcribed by hand from a thing that changes every hour will drift every hour. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015iuQqpxEg9gqZ3gQ5nUjyR
The dots sat on each band's first row, so every row read as a line of lights with four empty rows hanging beneath — the indicators looked detached from the letter they belong to, and the band looked mostly empty.
Rendered in the framebuffer harness and flashed to the board. Firmware only; no deploy.
🤖 Generated with Claude Code
https://claude.ai/code/session_015iuQqpxEg9gqZ3gQ5nUjyR