feat(mobile): mobile palette adopts canvas design SSOT (purple, warm-paper) + drift gate #2740

Merged
devops-engineer merged 1 commits from feat/mobile-palette-canvas-ssot into main 2026-06-13 09:47:12 +00:00
Member

Goal

Make the mobile version (canvas src/components/mobile/) adopt the same design as the desktop canvas, following SSOT.

Divergence

The mobile screens used a separate hardcoded palette.ts (MOL_LIGHT/MOL_DARK) from a Claude Design handoff — green accent #2f9e6a + lighter warm-paper surfaces — while the desktop canvas (same app!) uses its @theme tokens with the purple brand #7c3aed/#a78bfa.

Change

Align the core palette (bg/surface/surface2/border/divider/text/text2/text3 + accent) byte-for-byte to the canvas @theme SSOT in src/app/globals.css. green/online map to the canvas good; status + tier badges remain mobile-specific (not part of the cross-surface brand).

SSOT gate

palette.ssot.test.ts parses globals.css and asserts the mobile core tokens equal the canvas tokens — globals.css is the single source; the palette can't silently re-diverge (it once carried a green accent). Full mobile suite green (247 tests).

Sibling: molecule-app PR #85 aligns the standalone mobile app to the same canvas tokens.

🤖 Generated with Claude Code

## Goal Make the **mobile version** (canvas `src/components/mobile/`) adopt the **same design** as the desktop canvas, following SSOT. ## Divergence The mobile screens used a separate hardcoded `palette.ts` (`MOL_LIGHT`/`MOL_DARK`) from a Claude Design handoff — **green accent `#2f9e6a`** + lighter warm-paper surfaces — while the desktop canvas (same app!) uses its `@theme` tokens with the **purple brand `#7c3aed`/`#a78bfa`**. ## Change Align the **core** palette (bg/surface/surface2/border/divider/text/text2/text3 + accent) byte-for-byte to the canvas `@theme` SSOT in `src/app/globals.css`. `green`/`online` map to the canvas `good`; status + tier badges remain mobile-specific (not part of the cross-surface brand). ## SSOT gate `palette.ssot.test.ts` **parses globals.css** and asserts the mobile core tokens equal the canvas tokens — globals.css is the single source; the palette can't silently re-diverge (it once carried a green accent). Full mobile suite green (247 tests). Sibling: molecule-app PR #85 aligns the standalone mobile app to the same canvas tokens. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
core-devops added 1 commit 2026-06-13 09:41:22 +00:00
feat(mobile): mobile palette adopts canvas design SSOT (purple, warm-paper) + drift gate (core#mobile-design-parity)
Block internal-flavored paths / Block forbidden paths (pull_request) Successful in 6s
CI / Python Lint & Test (pull_request) Successful in 7s
sop-checklist / review-refire (pull_request_target) Has been skipped
Lint forbidden tenant-env keys / Scan workspace_secrets writers for forbidden env keys (pull_request) Successful in 5s
Harness Replays / detect-changes (pull_request) Successful in 6s
Lint forbidden tenant-env keys / Scan for repo-host token write into tenant workspace surface (pull_request) Successful in 5s
Secret scan / Scan diff for credential-shaped strings (pull_request) Successful in 8s
Harness Replays / Harness Replays (pull_request) Successful in 2s
E2E Peer Visibility (literal MCP list_peers) / detect-changes (pull_request) Successful in 12s
reserved-path-review / reserved-path-review (pull_request_target) Successful in 7s
Handlers Postgres Integration / detect-changes (pull_request) Successful in 12s
E2E Peer Visibility (literal MCP list_peers) / E2E Peer Visibility (local) (pull_request) Has been skipped
CI / Detect changes (pull_request) Successful in 15s
sop-checklist / all-items-acked (pull_request_target) Successful in 9s
Handlers Postgres Integration / Handlers Postgres Integration (pull_request) Successful in 2s
E2E API Smoke Test / detect-changes (pull_request) Successful in 17s
CI / Platform (Go) (pull_request) Successful in 1s
CI / Shellcheck (E2E scripts) (pull_request) Successful in 1s
E2E Chat / detect-changes (pull_request) Successful in 18s
E2E Peer Visibility (literal MCP list_peers) / E2E Peer Visibility (pull_request) Successful in 6s
E2E Staging Canvas (Playwright) / detect-changes (pull_request) Successful in 18s
E2E API Smoke Test / E2E API Smoke Test (pull_request) Successful in 2s
lint-required-no-paths / lint-required-no-paths (pull_request) Successful in 17s
E2E Chat / E2E Chat (pull_request) Successful in 2s
E2E Staging Canvas (Playwright) / Canvas tabs E2E (pull_request) Successful in 3s
gate-check-v3 / gate-check (pull_request_target) Failing after 21s
Local Provision Lifecycle E2E / Local Provision Lifecycle E2E (stub) (pull_request) Successful in 27s
CI / Canvas (Next.js) (pull_request) Successful in 3m46s
CI / Canvas Deploy Status (pull_request) Successful in 0s
CI / all-required (pull_request) Successful in 3s
Local Provision Lifecycle E2E / Local Provision Lifecycle E2E (real image + MiniMax LLM, advisory) (pull_request) Failing after 4m33s
reserved-path-review / reserved-path-review (pull_request_review) Successful in 7s
qa-review / approved (pull_request_target) Approved via pull_request_review trigger
sop-checklist / all-items-acked (pull_request) acked: 0/7 — missing: comprehensive-testing, local-postgres-e2e, staging-smoke, +4 — body-unfilled: comprehensive-testing, local-postgres-e2
qa-review / approved (pull_request_review) Successful in 9s
security-review / approved (pull_request_target) Approved via pull_request_review trigger
sop-checklist / na-declarations (pull_request) N/A: (none)
security-review / approved (pull_request_review) Successful in 9s
audit-force-merge / audit (pull_request_target) Successful in 6s
d1ae9e8123
The mobile-web screens used a separate hardcoded palette (MOL_LIGHT/MOL_DARK
from a Claude Design handoff) with a GREEN accent (#2f9e6a) + lighter
warm-paper surfaces — diverging from the desktop canvas design. Align the
CORE tokens (bg/surface/surface2/border/divider/text/text2/text3 + the
brand accent) byte-for-byte to the canvas @theme SSOT in
src/app/globals.css: canvas warm-paper light + near-black dark surfaces and
the PURPLE accent (#7c3aed / #a78bfa). green/online map to the canvas
`good`; status + tier badges stay mobile-specific.

Adds palette.ssot.test.ts — a drift gate that PARSES globals.css and asserts
the mobile core tokens equal the canvas tokens, so the two can't silently
re-diverge. Full mobile suite green (247).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
agent-reviewer-cr2 approved these changes 2026-06-13 09:46:52 +00:00
agent-reviewer-cr2 left a comment
Member

APPROVED: reviewed #2740 at head d1ae9e81.

The mobile palette core tokens now match the canvas @theme SSOT: warm-paper light surfaces/text/borders, near-black dark surfaces/text/borders, purple brand accent (#7c3aed/#a78bfa), and good/online mapping to the canvas good token. Status/tier badge colors remain intentionally mobile-specific and outside the cross-surface SSOT.

The drift gate is the right shape: palette.ssot.test.ts parses canvas/src/app/globals.css directly instead of hardcoding a second token table, then asserts MOL_LIGHT/MOL_DARK core parity and guards against the old green accent. That should catch future silent divergence.

Required CI is green (CI / Canvas (Next.js) and CI / all-required). The advisory real-image lifecycle is red, but this change is palette/test-only and required CI is green. /sop-ack

APPROVED: reviewed #2740 at head d1ae9e81. The mobile palette core tokens now match the canvas @theme SSOT: warm-paper light surfaces/text/borders, near-black dark surfaces/text/borders, purple brand accent (#7c3aed/#a78bfa), and good/online mapping to the canvas good token. Status/tier badge colors remain intentionally mobile-specific and outside the cross-surface SSOT. The drift gate is the right shape: `palette.ssot.test.ts` parses `canvas/src/app/globals.css` directly instead of hardcoding a second token table, then asserts MOL_LIGHT/MOL_DARK core parity and guards against the old green accent. That should catch future silent divergence. Required CI is green (`CI / Canvas (Next.js)` and `CI / all-required`). The advisory real-image lifecycle is red, but this change is palette/test-only and required CI is green. /sop-ack
Member

/sop-ack

/sop-ack
devops-engineer merged commit 65cdda1219 into main 2026-06-13 09:47:12 +00:00
Member

/sop-ack

/sop-ack
Member

APPROVED (post-merge verification; PR merged while I was reviewing). Head d1ae9e8123edaaebe1e71e2819b7baaad677e807.

5-axis review: scope is narrow and directionally correct. Mobile core palette now adopts the canvas design SSOT for warm-paper / near-black surfaces, text, borders, purple brand accent, and good/online green, while intentionally leaving status/tier badge colors mobile-specific.

Gate logic is sound: palette.ssot.test.ts parses canvas/src/app/globals.css rather than maintaining a second hardcoded token copy, selects the actual palette blocks that define --color-surface, and asserts mobile light/dark core tokens match @theme and [data-theme="dark"]. It also explicitly guards against the legacy green brand accent. This catches future drift without over-constraining mobile-only badge styling.

CI check at review time: CI / Canvas (Next.js) and CI / all-required were green on this head. Remaining aggregate reds were expected gate/SOP state plus the known advisory Local Provision real-image red tracked separately as #2739, not a regression from this palette PR.

/sop-ack

APPROVED (post-merge verification; PR merged while I was reviewing). Head `d1ae9e8123edaaebe1e71e2819b7baaad677e807`. 5-axis review: scope is narrow and directionally correct. Mobile core palette now adopts the canvas design SSOT for warm-paper / near-black surfaces, text, borders, purple brand accent, and good/online green, while intentionally leaving status/tier badge colors mobile-specific. Gate logic is sound: `palette.ssot.test.ts` parses `canvas/src/app/globals.css` rather than maintaining a second hardcoded token copy, selects the actual palette blocks that define `--color-surface`, and asserts mobile light/dark core tokens match `@theme` and `[data-theme="dark"]`. It also explicitly guards against the legacy green brand accent. This catches future drift without over-constraining mobile-only badge styling. CI check at review time: `CI / Canvas (Next.js)` and `CI / all-required` were green on this head. Remaining aggregate reds were expected gate/SOP state plus the known advisory Local Provision real-image red tracked separately as #2739, not a regression from this palette PR. /sop-ack
Sign in to join this conversation.
No Reviewers
3 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: molecule-ai/molecule-core#2740