The boards wear their organ's logo - #260
Merged
Merged
Conversation
Every one-tap board carried its own copy of the same GitHub-grey stylesheet, so the family read as six unrelated pages that happened to share a layout — and none of them looked like the organ whose logo sits at the top of its README. board/_theme.py is now the single answer to "what does a board look like": the stylesheet, the hero, the facet pills, the family footer. Presentation only — no state, no collection, no policy — and shared rather than copied, so the look moves for the whole family at once. The Brain board and the Mind dashboard (rendered by the intake conductor) both draw from it; Heart, Hands, Memory and the umbrella adopt it when their renderers next change. Each organ has an accent sampled from its own logo, and every board now opens with a dark hero reproducing that logo's wordmark — white PyAuto, the organ name in its accent, the logo's tagline underneath, inside the logo's ring. Below the hero the page goes back to being a plain readable document: these are lists people scan on a phone before breakfast. Colour is information, never decoration: - the accent is organ identity — links, section rules, stats, hero; - pills are the task facets, toned so only the *exception* is coloured. `supervised` is 136 of 154 prompts in the Mind, so it stays neutral; tinting it would paint the whole backlog and say nothing. Green go, amber caution, red handle-with-care; - ok/warn/bad stay reserved for the verdict semantics they already carried, and the Brain board's verdict is now a banner rather than a coloured word in a paragraph; - the family footer is one chip per sibling board in that organ's own colour, so the six pages read as one system. Every accent is checked for >= 4.5:1 contrast against its own background in both colour schemes — these pages are read outdoors on phones. tests/test_board_theme.py pins that, the palette's completeness against config/policy.yaml `board: boards:`, and the exception-not-default toning rule. Mind palette from PyAutoMind/logo.png, Brain from PyAutoBrain/logo.png; the other four are placeholders in the right hue family, to be confirmed against each logo on adoption. PyAutoMind/dashboard.html is generated by this renderer, so it is left to dashboard_refresh.yml's self-heal — the nightly rebuild exists for exactly this case (a generator change in the Brain fires no Mind path). Co-Authored-By: Claude Opus 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01Fjjkrhp7xbEqf6Nh1EhodV
Three follow-ups to the board theme. **The palette is now read off the logos, not guessed.** Heart, Hands and Memory each ship a logo.png, and all three carried a tagline the theme had invented: the wordmarks actually say CHECK. VALIDATE. PROTECT. / BUILD. EXECUTE. DELIVER. / REMEMBER. LEARN. EVOLVE. Accents are sampled from the glyphs (#ff1c28, #ff9201, #b37eff) and the hero base is the pure black those logos sit on, the Mind's included. The placeholder hues were in the right families, but nothing else about them was right. PyAutoScientist has no logo, so the umbrella keeps a designed accent and tagline — now marked as such in the table rather than sitting in a "confirm this later" block with five entries that no longer need it. **Titles are cut where a reader can stop.** `_title` took the first ten words and stopped dead, so 72 of the Mind's 154 prompts rendered as a sentence walking off a cliff — "kernel-CDF numba fast path (the". The budget is 12 words now, and a cut drops trailing function words, drops an orphaned opening bracket along with the fragment it opened, drops an unpaired backtick (which would otherwise let a code span bleed into the rest of the page), and ends in an ellipsis. A silent cut is indistinguishable from a title that simply ends badly; a marked one is not. 72 hard cuts become 10 honest ones — the rest were never too long, only cut too early. **The work type is on the row.** It is what `draft/` is organised around and the one facet the boards never showed. It leads each pill row as a glyph plus a quiet uppercase tag — no colour, because colour is reserved for judgement and a category is not one. `triage` is the exception: it means nobody has classified this yet, which is a real call to action, so it alone goes amber. Co-Authored-By: Claude Opus 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01Fjjkrhp7xbEqf6Nh1EhodV
The board palette named PyAutoScientist and a test fixture named PyAutoFit. Both are instance facts — repos.yaml classes them `project` and `library`, not `organ` — so both leaked into organ code, and CI's tenant-firewall check was right to reject them. `ORGANS` carried a `repo` field no renderer ever read; it is gone rather than allowlisted. The board KEY is the identity the theme needs, and `config/policy.yaml` `board: boards:` is the declared surface that maps a key to a repo — the one place an adopting fork rewrites. Nothing in the look layer needs to know a repo name. The test fixture only needed a long sentence containing a backtick, so it no longer borrows a real repo's name to get one. Co-Authored-By: Claude Opus 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01Fjjkrhp7xbEqf6Nh1EhodV
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Every one-tap board carried its own copy of the same GitHub-grey stylesheet, so the family read as six unrelated pages that happened to share a layout — and none of them looked like the organ whose logo sits at the top of its README.
The shared theme
board/_theme.pyis now the single answer to what does a board look like: the stylesheet, the hero, the facet pills, the family footer. Presentation only — no state, no collection, no policy — and shared rather than copied, so the look moves for the whole family at once instead of drifting page by page.The Brain board and the Mind dashboard (rendered by the intake conductor, which is why both renderers live here) both draw from it. Heart, Hands, Memory and the umbrella adopt it when their renderers next change — their palette entries are already in the table.
The design
The page wears its organ's logo. Each board opens with a dark hero reproducing that logo's wordmark — white
PyAuto, the organ name in its accent, the logo's tagline underneath, inside the logo's ring. Below the hero the page goes back to being a plain readable document, because these are lists people scan on a phone before breakfast.Five of the six palettes are sampled from the actual
logo.pngin each organ's repo — the glyph colour and the wordmark's own tagline. PyAutoScientist has no logo, so the umbrella's accent and tagline are designed to sit in the family, and are marked as such in the table.Colour is information, never decoration:
supervisedis 136 of the Mind's 154 prompts; tinting it would paint the whole backlog and say nothing. Green go, amber caution, red handle-with-care;ok/warn/badstay reserved for the verdict semantics they already carried, and the Brain board's verdict is now a banner rather than a coloured word in a paragraph;Every accent is checked for ≥ 4.5:1 contrast against its own background in both colour schemes — these pages are read outdoors on phones.
Two fixes the restyle surfaced
Titles are cut where a reader can stop.
_titletook the first ten words and stopped dead, so 72 of the Mind's 154 prompts rendered as a sentence walking off a cliff — "kernel-CDF numba fast path (the". The budget is 12 now, and a cut drops trailing function words, drops an orphaned opening bracket along with the fragment it opened, drops an unpaired backtick (which would otherwise let a code span bleed into the rest of the page), and ends in an ellipsis. A silent cut is indistinguishable from a title that simply ends badly; a marked one is not. 72 hard cuts become 10 honest ones — the rest were never too long, only cut too early.The work type is on the row. It is what
draft/is organised around and the one facet the boards never showed. It leads each pill row as a glyph plus a quiet uppercase tag — no colour, because colour is reserved for judgement and a category is not one.triageis the exception: it means nobody has classified this yet, which is a real call to action, so it alone goes amber.Testing
442 tests pass.
tests/test_board_theme.pyis new and pins the contract: the palette's completeness againstconfig/policy.yamlboard: boards:, the contrast floor in both schemes, that each board wears its own accent, that an unknown organ still renders rather than raising mid-render, the exception-not-default toning rule, and that every work type in_sizing.WORK_TYPEShas a glyph.tests/test_intake_dashboard.pygains the truncation cases and the work-type row.Note on PyAutoMind
dashboard.htmlanddashboard.mdare generated by this renderer, so they are deliberately not touched here —dashboard_refresh.ymlchecks out PyAutoBrainmain, so a regenerated page committed on a Mind branch would fail its own drift check until this merges. The nightly self-heal exists for exactly this case (its own comment names it: "generator changes merged in PyAutoBrain — the renderer lives there, so no Mind path fires"). Both pages repaint after this lands.🤖 Generated with Claude Code
https://claude.ai/code/session_01Fjjkrhp7xbEqf6Nh1EhodV
Generated by Claude Code