Skip to content

icon: three agentic-era colour styles beside HQ - #95

Merged
ralyodio merged 1 commit into
masterfrom
worktree-icon-agentic
Sep 24, 2026
Merged

ralyodio merged 1 commit into
masterfrom
worktree-icon-agentic

Conversation

@ralyodio

Copy link
Copy Markdown
Contributor

The HQ style was drawn against glossy 3D emoji masters, and it reads as the decade it borrows from: specular hotspots, bevels, inflated bodies. Anthony's words were "very early 2000s", and "an hq set for the agentic era too — not bubbly but still hq".

So this adds three flat-material styles rather than replacing HQ, which stays for the surfaces that want it.

Style Material Good for
agentic-matte Flat tonal planes with hard boundaries, one cool edge-light The general-purpose one: holds at 20px on light and dark
agentic-machined Milled anodized aluminium, hairline chamfers, one anodized accent Hardware and rack UIs, shown large
agentic-emissive Near-black body with the working part lit Dark terminals; it disappears on a light ground

agentic alone means agentic-matte. All three were judged on the same ten anchors before any of the 259 were drawn, which is what picked matte as the default: at 20px the machined body eats its own accent and the emissive one becomes a coloured outline with nothing inside it.

What changed

  • src/icon-styles.ts is new: what each style looks like, one shared frame, one material paragraph each. The agentic styles take no emoji reference — that reference is where the gloss comes from — so their only pin is the icon's own line glyph.
  • src/icon-palette.ts is new: hue per category and the meaning overrides, in one place, carrying each hue twice. The HQ glass wording is kept verbatim so nothing already drawn would come back different, and the plain accent form is what the agentic styles put in their own material sentence.
  • src/icon-hq.ts is now the engine rather than the style: drawHq/buildHq take a style, and withStyle writes one style into openicon.json without touching the others.
  • bin/icon.ts: icon agentic [matte|machined|emissive|all] and icon style <id>; icon hq still means what it meant.

Manifest shape

Additive. styles lists them, style_info describes each, each icon gets a styles map. The HQ style keeps writing the top-level hq block and the per-icon hq key as the same objects under their older name, so a reader written against the first HQ release keeps working.

Two things learned the hard way, now in code

  • A master is validated by decoding it, not by its existence. A run that fills the disk leaves a truncated file with a plausible mtime, and the mtime skip then carries it forward for good — which is how one HQ webp shipped broken. An unreadable master is now named and left out of the manifest instead of deriving eight broken sizes from it.
  • --draw-only pairs with --no-draw. Drawing one style is hours of image calls; this is how three are drawn at once and derived in a single pass, keeping one writer on openicon.json.

Spec side: logicsrc rules 12 and 13 (a separate PR).

Tests: 1209 pass, 4 new (agentic prompt has no gloss vocabulary and no emoji refs; each style draws under its own directory; a truncated master is skipped and named; one manifest holds every style with hq under both names).

The HQ style was drawn against glossy 3D emoji masters and reads as the
decade it borrows from: specular hotspots, bevels, inflated bodies. This
adds three flat-material styles that take no emoji reference at all, so
the look comes from the prompt and the hue from one palette:

  agentic-matte      flat tonal planes, no gloss  - the general-purpose one
  agentic-machined   milled anodized aluminium    - hardware and rack UIs
  agentic-emissive   dark body, lit working part  - dark terminals only

`agentic` alone means matte: it is the only one of the three that holds
its colour coding at 20px on a light ground as well as a dark one, which
is where the other two fall apart.

The draw and derive engine is now style-aware rather than HQ-shaped, and
a set carries every style at once: `styles` lists them, `style_info`
describes each, and each icon has a `styles` map. HQ keeps writing the
top-level `hq` block and per-icon `hq` key as the same objects under
their older name, so a reader from the first HQ release does not break.

Two things learned the hard way are now in code. A master is validated by
decoding it, not by its existence: a run that fills the disk leaves a
truncated file with a plausible mtime, and the mtime skip then carries it
forward for good, which is how one HQ webp shipped broken. And drawing a
style takes hours, so --draw-only pairs with --no-draw to draw several
styles at once and derive them in one pass, keeping a single writer on
openicon.json.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown

ThreatCrush Security Scan

23 finding(s)

HIGH/CRITICAL: 4 | MEDIUM: 10 | LOW: 9

Severity Rule Location
HIGH sh-remote-script-execution root-ubuntu.sh:3227
HIGH sh-remote-script-execution root-ubuntu.sh:3228
HIGH sh-remote-script-execution root-ubuntu.sh:4840
HIGH sh-remote-script-execution root-ubuntu.sh:4844
MEDIUM sh-remote-script-execution root-ubuntu.sh:4993
MEDIUM redos-nested-quantifier src/domain-free.ts:56
MEDIUM redos-nested-quantifier src/emoji.ts:167
MEDIUM redos-nested-quantifier src/icon.ts:153
MEDIUM redos-nested-quantifier src/mail.ts:1042
MEDIUM sql-template-interpolation src/users-dump.ts:487
MEDIUM sql-string-concatenation src/users-dump.ts:507
MEDIUM sql-template-interpolation src/users-dump.ts:540
MEDIUM sql-string-concatenation src/users-dump.ts:574
MEDIUM redos-nested-quantifier src/wcag.ts:556
LOW secret-generic-credential src/credentials.ts:36
LOW secret-generic-credential src/user-export.ts:632
LOW secret-generic-credential src/user-export.ts:638
LOW secret-generic-api-key test/credentials.test.ts:208
LOW secret-generic-credential test/mail.test.ts:141
LOW secret-generic-credential test/shorten.test.ts:36
LOW secret-database-url test/users-dump.test.ts:108
LOW secret-database-url test/users-dump.test.ts:119
LOW secret-database-url test/users-dump.test.ts:120

Snippets are redacted; ThreatCrush never prints matched credential material.

@ralyodio
ralyodio merged commit bbdd7ba into master Sep 24, 2026
5 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.

1 participant