Skip to content

The boards wear their organ's logo - #260

Merged
Jammy2211 merged 3 commits into
mainfrom
claude/pyautoscientist-dashboard-styling-f9dan1
Aug 23, 2026
Merged

The boards wear their organ's logo#260
Jammy2211 merged 3 commits into
mainfrom
claude/pyautoscientist-dashboard-styling-f9dan1

Conversation

@Jammy2211

Copy link
Copy Markdown
Contributor

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.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 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.png in 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:

  • 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 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/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.

Two fixes the restyle surfaced

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 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.

Testing

442 tests pass. tests/test_board_theme.py is new and pins the contract: the palette's completeness against config/policy.yaml board: 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_TYPES has a glyph. tests/test_intake_dashboard.py gains the truncation cases and the work-type row.

Note on PyAutoMind

dashboard.html and dashboard.md are generated by this renderer, so they are deliberately not touched here — dashboard_refresh.yml checks out PyAutoBrain main, 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

claude added 3 commits August 23, 2026 21:56
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
@Jammy2211
Jammy2211 merged commit 80aaad2 into main Aug 23, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants