Skip to content

Re-derive the ten Mech identity colours, and say what the tile totals - #83

Merged
realmarcin merged 3 commits into
mainfrom
fix/mech-palette-and-records-label
Sep 20, 2026
Merged

realmarcin merged 3 commits into
mainfrom
fix/mech-palette-and-records-label

Conversation

@realmarcin

Copy link
Copy Markdown
Contributor

Closes #78 and #82.

#78 was not one bad hex. TaxonMech carried CellStructureMech's exact value on the light theme, so two Mechs were identical on the ring nodes, the card spines and the heatmap row dots. Measuring the other 44 pairs showed the collision was the worst case of a general failure:

light dark
pairs below the colour-vision target of 8 11 of 45 13 of 45
pairs below the normal-vision floor of 15 15 of 45 14 of 45

Among them a green and a red at colour-vision distance 0.4, which is the classic red-green confusion, and two greens at 3.7 for a full-colour reader. Swapping one hex would have fixed the reported pair and left the rest.

So all ten were re-derived together, searched in OKLCH under the data-viz skill's palette checker using its own measures, including its clamp after the colour-vision transform, which I had to match before the search was worth anything.

Constraints the search held: each Mech keeps one hue across both themes, so it has a single identity; each stays within 55 degrees of the colour it had, so the page still reads as itself; lightness and chroma are re-sited per theme.

Mech light dark
HabitatMech #2b6a4d#156f4a #4fbf85#068d5d
CommunityMech #3D7DD6#008bf3 #5c9cf0#0f95ff
TraitMech #C5474B#cc3867 #f0696e#ec5d85
CellStructureMech #5257C9#662cfc #8a8ef5#7251ff
ProteinTraitsMech #2E8B84#109c98 #3dbfb2#00b9b5
AntibioticMech #85551C#8f4e21 #d9a94a#e89e71
NaturalProductMech #0b5fa5#3559aa #79b8f3#9abbff
TaxonMech #5257C9#82307d #8b8fe8#b22bac
MediaIngredientMech #7E5BC4#9a61cb #b08cf2#a97cd2
CultureMech #4B9E5F#829c00 #63c46f#94af31

TaxonMech moves out of the blue cluster into plum, which is the substantive change. CultureMech shifts toward olive because two greens cannot both stay: habitat and media were the pair at 3.7.

Checker results, all 45 pairs. Light passes every check. Dark passes every check but the lightness band, where five steps sit above it; the palette it replaces had all ten above it, so that is an improvement rather than a regression, and contrast against the near-black surface passes at 3:1 throughout.

On the colour-vision band. Separation lands at 6.4 and 6.5, inside the 6-8 band rather than above 8. Ten categorical identities is past what hue alone can carry, which the skill says directly: forcing every pair above 8 either wrecks the hues or, inside the checker's dark band, has no solution at all. I measured both. The band is usable only where something other than colour names the mark, and that holds everywhere here: every ring node has its name beside it, every card is titled, every heatmap row is labelled.

#82. The strip tile read "records across the fleet" while summing ten things the cards call taxon records, published recipes and natural product structures. It now reads "curated entries across the fleet".

Checks: 16 tests pass and assemble_page.py --check reports the page current. Rendered and looked at in both themes at 1400px, which is the step the checker cannot do.

🤖 Generated with Claude Code

https://claude.ai/code/session_01BXHrBTSU8fU4Zg7HfaMKs9

TaxonMech carried CellStructureMech's exact value on the light theme, so two
Mechs were indistinguishable everywhere the colour appears: the ring nodes, the
card spines and the heatmap row dots. Reported as #78.

Measuring the rest of the palette showed the collision was not isolated. Over
all 45 pairs, 11 fell below the colour-vision target on light and 13 on dark,
and 15 light pairs and 14 dark ones fell below the distance-15 floor at which a
full-colour reader can no longer tell two marks apart. Among them were a green
and a red at colour-vision distance 0.4, and two greens at normal-vision 3.7.
Swapping one hex would have fixed the reported pair and left the rest.

So the ten were re-derived together in OKLCH rather than picked one at a time,
searched under the data-viz palette checker's own measures. Each Mech keeps one
hue across both themes and stays within 55 degrees of the colour it had, so the
page still reads as itself; lightness and chroma are re-sited per theme. On
light every check passes. On both themes the worst pair a full-colour reader
sees clears the floor, at 15.6 and 15.7.

Colour-vision separation lands in the 6-8 band rather than above 8. Ten
categorical identities is past what hue alone can carry: forcing every pair
above 8 either wrecks the hues or, inside the checker's dark lightness band,
has no solution at all. That band is usable only where something other than
colour names the mark, which holds throughout this page. The dark steps stay
brighter than the checker's band, as they already were, because the surface is
near-black and the alternative is losing separation.

Separately, the strip tile said "records across the fleet" while summing ten
things the cards call taxon records, published recipes and natural product
structures. It now says curated entries. Closes #82.

Closes #78

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BXHrBTSU8fU4Zg7HfaMKs9
Copilot AI lite review requested due to automatic review settings September 16, 2026 18:47

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

Checking the new palette against how the page actually uses it found a
regression I had introduced. The colours are not only marks: the Mech card sets
its heading in its own colour and fills the Browse button with it, and the
scale ladder labels its steps the same way. Four Mechs that cleared 4.5:1 as
text before no longer did, dark HabitatMech falling from 7.19 to 3.92 and dark
TaxonMech from 5.67 to 3.02.

Requiring both is impossible. Text contrast against white forces the light
colours dark and against a near-black surface forces the dark ones bright, and
with lightness squeezed from both ends only hue is left to separate ten
identities. Searched for it; the best reachable is a worst pair of 13.0 against
a floor of 15.8, so no palette satisfies both at once.

So the two jobs are separated, which is what the data-viz guidance says to do:
each Mech gains a text variant at the same hue with lightness walked until it
clears 4.5:1. Marks keep the identity colour; anything set in the colour uses
the variant. Seven of the twenty are unchanged, the rest move slightly. Three
light steps were already failing before this branch and are fixed by the same
change.

The variants are measured against the palest surface they sit on, which is the
ladder's wash rather than the card; targeting the card left three ladder labels
at 4.04.

The button label is stated per theme instead of borrowed from --card, which
resolved inconsistently.

Measured in an isolated page carrying only the fragment's styles, so the site's
own theme machinery could not confuse the reading. Worst case now 5.14 on
light and 4.56 on dark across headings, buttons and ladder labels.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BXHrBTSU8fU4Zg7HfaMKs9
@realmarcin

Copy link
Copy Markdown
Contributor Author

Adversarial review done against main. One finding, and it was a real regression in this branch, so it is fixed here rather than filed.

The colours are not only marks. The Mech card sets its heading in its own colour, fills the Browse button with it, and the scale ladder labels its steps the same way. The palette checker measures marks against a surface at 3:1; none of those are marks. Four Mechs that cleared 4.5:1 as text before this branch no longer did:

before after the new palette
HabitatMech heading, dark 7.19 3.92
CellStructureMech heading, dark 5.73 3.42
TaxonMech heading, dark 5.67 3.02
MediaIngredientMech heading, light 5.02 4.25

Asking the palette to do both is impossible, and I measured that rather than assuming it. Text contrast against white forces the light colours dark, and against a near-black surface forces the dark ones bright; with lightness squeezed from both ends only hue is left to separate ten identities. The best the search reaches under both constraints is a worst pair of 13.0 against a floor of 15.8.

So the two jobs are separated, which is what the data-viz guidance says to do anyway: each Mech gains a text variant at the same hue, lightness walked until it clears 4.5:1. Marks keep the identity colour. Seven of the twenty variants are unchanged. Three light steps were already failing before this branch and the same change fixes them.

Two details the measurement forced. The variants are computed against the palest surface they sit on, the ladder's wash rather than the card, because targeting the card left three ladder labels at 4.04. And the button label is now stated per theme rather than borrowed from --card, which resolved inconsistently.

On the measurement itself. My first readings came from the local harness, which splices the fragment into a saved copy of the deployed page, and it reported a custom property as the light value while var() resolved to the dark one. Rather than keep probing that, I rebuilt the check as an isolated page carrying only the fragment's own styles. That settled it: the page code was correct and the harness was lying. Worst case now 5.14 on light and 4.56 on dark across headings, buttons and ladder labels.

Final state: the identity palette passes every check on light and everything but the lightness band on dark, which the palette it replaces exceeded by more. 16 tests pass and assemble_page.py --check reports the page current.

The `.fleet-xrefs .pair b.to` rule coloured the consuming Mech's name with
`--c2`, the raw identity colour, while the producing Mech beside it already
used `--ci`, the ink variant added in 024bc98 for text. On the lighter tiles —
CultureMech's olive, NaturalProductMech's blue — that left one half of every
arrow noticeably harder to read than the other. Point the rule at a new
`--ci2` and set it from each target's `-ink` token.

The heatmap's cell panel heading had the same split: it took its text colour
from `color(m)` while the Mech card heading beside it used `inkColor(m)`.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@realmarcin
realmarcin merged commit ba88182 into main Sep 20, 2026
1 check passed
@realmarcin
realmarcin deleted the fix/mech-palette-and-records-label branch September 20, 2026 23:50
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.

CellStructureMech and TaxonMech are the same colour on the light theme

2 participants