Skip to content

icon: the agentic styles re-render brand marks in the material - #98

Merged
ralyodio merged 1 commit into
masterfrom
icon-brand-styles
Sep 24, 2026
Merged

ralyodio merged 1 commit into
masterfrom
icon-brand-styles

Conversation

@ralyodio

Copy link
Copy Markdown
Contributor

Anthony, on https://logicsrc.com/openicon?style=agentic-emissive&kind=brand : "why doesn't brands change?" … "stylinze brands too please".

They did not change because they could not. A colour style stopped at the drawn icons: a brand's coloured form was the same line mark recoloured to the owner's hex, written into each style directory. All 111 brand files were byte-identical across hq, agentic-matte, agentic-machined and agentic-emissive — github.webp was the same 606-byte file in all four.

What changes

The three agentic styles now draw the marks too, pinned to the owner's own mark as the only reference: same geometry, same colour, new surface.

hq deliberately does not. A style restyles marks only if it defines promptForBrand; hq leaves it undefined and its brands stay the flat owner-coloured logo a first-release reader already has. That one optional method is the whole switch.

What the pilots taught

Six marks (github, gitlab, npm, docker, figma, slack), redrawn after each change:

  1. The drawn-icon frame ends "never resemble a logo" — backwards when the mark IS the subject. BRAND_FRAME replaces it with a tighter guard: reproduce this geometry, invert nothing, add nothing, no container it does not already have.
  2. Name the hex inside the material paragraph. "Its own colour" is not enough. Six of six pilot marks came back graphite until the hex moved into the material sentence — and the first time, the hex was not reaching the prompt at all, because brandColors was never wired through the CLI. The prompt said "the mark is monochrome" and the model obeyed.
  3. Say the mark is SOLID. Emissive drew neon outlines of shapes that should be filled, and npm came back with its counter inverted.
  4. Emissive cannot carry a dark mark. 26 of the 111 are too dark to emit; told to "glow in its own colour", GitHub came back glowing blue. emissionFor() splits them three ways: the colour itself (85), a lightened tint of the same hue for the 4 that are dark but still hued (Slack, PayPal, Tumblr, XMPP), and neutral white for the 22 that are black with no hue to raise (GitHub, Apple, OpenAI…).

Manifest

A drawn mark derives like any other master and carries made_by: "both" — the geometry is the owner's, the surface is ours — keeping hex and hex_source. It writes no svg: a reader that found one there would show the flat mark and never the material. StyleFiles.made_by gains "both", which rule 8's vocabulary already allowed.

Trademark note

This applies a material treatment to marks we do not own. Geometry, proportion and colour are held fixed and the owner's hex/hex_source stay recorded, which is the most defensible form of it, but it is a change of posture from "a set does not redraw them" and some owners' brand guidelines forbid altering the mark. Flagged before building; Anthony asked for it twice.

Verified

  • npm run typecheck: clean
  • npx vitest run test/icon.test.ts test/icon-hq.test.ts: 33 passed
  • Pilot draws: 36 calls over four rounds, 0 refusals, 0 failures
  • Dry run against the real set: exactly 111 per style, the 259 UI masters correctly skipped

🤖 Generated with Claude Code

A colour style used to stop at the drawn icons: a brand's coloured form
was the same line mark recoloured to the owner's hex, byte-identical in
every style directory. In the gallery that reads as a bug — pick Agentic
Emissive with the Brands filter on and nothing changes, because nothing
can.

The three agentic styles now draw the marks too, pinned to the owner's
own mark as the only reference. `hq` deliberately does not: a style
restyles marks only if it defines `promptForBrand`, and hq leaves it
undefined, so its brands stay the flat owner-coloured logo a
first-release reader already has.

What the prompt has to say, all of it learned from pilots:

- The drawn-icon frame ends "never resemble a logo", which is backwards
  when the mark IS the subject. BRAND_FRAME replaces it with a tighter
  guard: reproduce this geometry, invert nothing, add nothing.
- Name the hex INSIDE the material paragraph. "Its own colour" is not
  enough; the agentic register is strong enough that six of six pilot
  marks came back graphite until the hex moved into the material.
- Say the mark is SOLID. Emissive drew neon outlines of hollow shapes
  otherwise, and npm came back with its counter inverted.
- Emissive cannot carry a dark mark: 26 of the 111 are too dark to emit.
  Told to "glow in its own colour", GitHub came back glowing blue.
  emissionFor() now splits them — the colour itself, a lightened tint of
  it for the 4 that are dark but still hued (Slack, PayPal, Tumblr,
  XMPP), and neutral white for the 22 that are black with no hue to
  raise.

A drawn mark derives like any other master and carries `made_by: both`
(the geometry is the owner's, the surface is ours) with the owner's hex
and hex_source kept. It writes no `svg`: a reader that found one there
would show the flat mark and never the material.

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

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