Skip to content

The brand migration missed three packages and a placeholder - #159

Merged
GuyNachshon merged 2 commits into
mainfrom
guy/gatekeeper-brand
Aug 24, 2026
Merged

GuyNachshon merged 2 commits into
mainfrom
guy/gatekeeper-brand

Conversation

@GuyNachshon

Copy link
Copy Markdown

Found by a user in a screenshot, not by my sweep. Fixes what #155 missed and records why it was missed.

The miss

My earlier sweep searched packages/workshop-frontend/src/styles.css — the file where the tokens are defined — and reported the migration complete. Four packages ship their own copy of the Kumo tokens, and a change to one reaches none of the others:

file state before surface
workshop-frontend/src/styles.css fixed in #155 the Workshop
gatekeeper-context/app/styles.css fully orange, both themes Context Library — the "+ New collection" button in the report
gatekeeper-scheduler/app/styles.css fully orange, both themes Scheduled Tasks
mcp-shared/src/html.ts fully orange MCP OAuth consent pages

Not half-migrated like the Workshop was — untouched.

Why it is more than cosmetic

#ff4801 with white text is 3.40:1, below the 4.5:1 AA floor. That is worse than the 4.30:1 hover #155 already fixed, and it is a button label rather than a hover state, so it is the resting appearance of a primary action.

In mcp-shared the orange is --contrast, the primary button background on OAuth consent screens. A Cloudflare-branded "allow access" button on a FieldOS deployment misrepresents who is asking.

All three now carry the same green ramp already shipped in the Workshop: 7.52 / 9.50 light, 5.29 / 6.74 dark, all above 4.5.

The blueprint cards

The first screenshot showed three blueprints rendering as three identical grey documents. That is BlueprintPreviewPlaceholder, which drew a fake document — header, divider, five rows of four columns — the same for every blueprint.

On this fork it is not a fallback, it is the permanent state. blueprintScreenshotUrl() returns undefined unless metadata.screenshot is set, which requires the BROWSER binding; standalone workerd has no Browser Rendering, so no FieldOS deployment will ever have blueprint screenshots. A skeleton that never resolves reads as perpetual loading, and drawing fake content makes unrelated blueprints look the same.

It now shows initials from the blueprint's own title over its id-derived gradient: real data, distinct per card, claiming nothing that was not captured.

Rendering it caught a bug before it shipped. First-letters gave "Workspace Slides" and "Workspace Sheets" both WS — I would have replaced three identical documents with two identical initials. Measured against the seven titles this deployment actually ships: first-letters collides once, the trailing word collides zero times. It uses the trailing word (Do / Sl / Sh).

Records

DESIGN.md lists all four token locations with the grep that finds them, and why the mcp-shared copy matters. AGENTS.md's scope rule gains the recurrence — it was written hours before this happened, which is the point: nothing about the command looked wrong, and the answer to "which files could hold a second copy" in a monorepo is usually "every package that builds its own bundle".

pnpm lint 0 · pnpm test 0 · all four affected packages build.

My earlier sweep searched one stylesheet. The gatekeeper UIs are
separate Vite bundles that ship their own copies of the Kumo tokens, and
they were never migrated at all -- not half-way, like workshop-frontend,
but untouched. The "+ New collection" button on the Context Library is
#ff4801, pure Cloudflare orange, in both themes.

It also fails contrast: #ff4801 with white text is 3.40:1, worse than
the 4.30:1 hover this branch already fixed elsewhere, and it is a button
label rather than a hover state. gatekeeper-context and
gatekeeper-scheduler now carry the same green ramp as the workshop:
7.52 / 9.50 light and 5.29 / 6.74 dark, all above 4.5.

mcp-shared/html.ts too, where the orange is --contrast, the primary
button background on the OAuth consent pages. A Cloudflare-branded
button on a FieldOS deployment is misleading about who is asking for
access, which makes it more than cosmetic.

Separately, the blueprint cards drew a fake document -- a header, a
divider and five rows of four columns, identical for every blueprint --
so three unrelated blueprints rendered as three identical grey documents
that read as a loading skeleton. On this fork it never resolves:
screenshots need the BROWSER binding, which standalone workerd does not
have, so metadata.screenshot is never set and the placeholder is the
only thing anyone sees. It now shows initials from the blueprint's own
title over its gradient -- true data, and distinct per card.

Rendering that caught a bug before it shipped: first-letters gave
"Workspace Slides" and "Workspace Sheets" both "WS". Measured against
the seven titles this deployment actually ships, first-letters collides
once and the trailing word collides zero times, so it uses the trailing
word.
Four packages ship their own copy of the Kumo tokens and a change to one
reaches none of the others. DESIGN.md now lists all four with the grep
that finds them, and notes that mcp-shared's copy is the primary button
on an OAuth consent screen, where inherited Cloudflare orange
misrepresents who is asking for access.

Also records that blueprint screenshots can never exist on this fork --
capture needs the BROWSER binding and standalone workerd has none -- so
the placeholder is permanent rather than transient, which is what rules
out anything skeleton-shaped.

The scope rule in AGENTS.md gains the recurrence: it was written hours
before a sweep of the single file where the tokens are defined reported
a migration complete while three other bundles were still fully orange.
In a monorepo, ask which packages build their own bundle before
concluding a value is gone.
@GuyNachshon
GuyNachshon merged commit 13036e2 into main Aug 24, 2026
5 checks passed
@GuyNachshon
GuyNachshon deleted the guy/gatekeeper-brand branch August 24, 2026 07:46
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