Skip to content

VEC-5 fix: match System Settings surface colors - #103

Merged
IchenDEV merged 5 commits into
mainfrom
agent/vec-5-settings-surface
Sep 22, 2026
Merged

IchenDEV merged 5 commits into
mainfrom
agent/vec-5-settings-surface

Conversation

@IchenDEV

@IchenDEV IchenDEV commented Sep 21, 2026 •

Copy link
Copy Markdown
Owner

Problem

The user reported that the app's gray background "does not look like the system's mainstream palette" and asked for the System Settings colors.

Evidence

Sampling the user's screenshots with an sRGB reader:

| | Content/page | Grouped boxes |\n|---|---|---|\n| System Settings (light) | #FFFFFF | #F7F7F7 |\n| Utter (light) | #F6F6F6 | #FFFFFF |

On this machine windowBackgroundColor is #FFFFFF light / #1E1E1E dark and underPageBackgroundColor is #F6F6F6 light / #282828 dark — so Utter had the two roles swapped: a gray page with white cards.

Fix

Add SettingsSurface as the single seam — page = windowBackgroundColor, card = underPageBackgroundColor, cardStroke = separatorColor — and route the settings shell, page surfaces, history cards, and the onboarding/permissions grouped boxes through it. Editing surfaces keep textBackgroundColor. No fixed RGB, so light/dark/increased-contrast adapt automatically.

Before (gray page, white cards) is left; after (white page, gray boxes) is right — matching the System Settings screenshot.

Verification

  • SettingsSurfaceTests rasterizes production SettingsSurface.page / card seams and semantic references in NSHostingView under explicit .aqua and .darkAqua appearances, asserting pixel equality in sRGB (within tolerance) and page/card distinctness.
  • Test suite: 639 executed, 10 skipped, 0 failures (6 in SettingsSurfaceTests).
  • Mutation regression counterexamples:
    • Swapping page/card roles triggers 4 test failures: testPageSurfaceRendersAsWindowBackgroundColor, testCardSurfaceRendersAsUnderPageBackgroundColor, testCardDoesNotRenderAsWindowBackgroundColor, and testSurfaceIdentitiesAreTheTwoSemanticRoles.
    • Recoloring card to systemRed triggers 2 failures: testCardSurfaceRendersAsUnderPageBackgroundColor and testSurfaceIdentitiesAreTheTwoSemanticRoles.
    • Restoring baseline passes 6/6 tests.
  • Real-window live captures: running dist/Utter.app Activity tab verified in light (page #FFFFFF / cards #F7F7F7, matching System Settings) and dark (page #252525 / cards #303030).
  • Check scripts: bash scripts/ci-basic-checks.sh and bash scripts/sdlc-checks.sh pass.
  • SDLC bundle: docs/sdlc/changes/2026-09-21-settings-surface-parity/.

Scope of Acceptance & Remaining Gates

  • Verified by automated tests & live captures: SettingsSurface implementation, deterministic unit & rasterization tests (Aqua / DarkAqua), mutation regression gates, and Activity tab live window screenshots in light and dark.
  • Remaining Human Acceptance (reserved for human reviewer / CTO):
    1. Real-device visual inspection across the remaining 5 Settings tabs (General, Models, Style, Integrations, About) and Onboarding window across standard light, standard dark, and increased contrast modes.
    2. Formal human sign-offs on SDLC documents (intent.md, spec.md, verification.md remain pending approval).

Fixes VEC-5

IchenDEV and others added 2 commits September 21, 2026 11:20
Measured against the user's screenshots, System Settings paints a white
content pane with slightly gray grouped boxes on macOS 26/27, while Utter
painted a gray page with white cards — the off-system gray the user
reported.

- add SettingsSurface: page = windowBackgroundColor, card =
  underPageBackgroundColor, cardStroke = separatorColor
- settings shell, page surfaces, history cards, and the onboarding and
  permissions grouped boxes use the shared seams
- SettingsSurfaceTests render each seam and assert the pixel matches the
  intended semantic color, plus a page/card distinctness check

Co-authored-by: multica-agent <github@multica.ai>
… evidence

Independent review found the exact-head CI failing on
testCardSurfaceRendersUnderPageBackgroundColor: the test compared an
ImageRenderer pixel against the process-ambient semantic color, and a
headless runner resolves that color through a different pipeline than a
user session.

- assert the seams in sRGB against the semantic colors instead of rendered
  pixels, and check each surface inside explicit light/dark appearances
- add SettingsSurface.pageSRGB / cardSRGB as the resolved-value seam
- record real-window light and dark captures from the running app and the
  CI failure analysis in the verification artifact

Co-authored-by: multica-agent <github@multica.ai>
@IchenDEV IchenDEV changed the title fix: match System Settings surface colors VEC-5 fix: match System Settings surface colors Sep 21, 2026
IchenDEV and others added 3 commits September 21, 2026 14:51
Review found the previous revision could not fail on a regression: it
asserted against duplicated NSColor getters that the render path never
uses, so swapping page and card still passed, and its light/dark case
compared ambient-resolved colors because a dynamic NSColor re-resolves
outside performAsCurrentDrawingAppearance.

- rasterize the production SettingsSurface.page/card and the semantic
  references in an NSHostingView with an explicit appearance, so both
  sides share one pipeline and light/dark are deterministic
- drop the test-only sRGB getters; expose pageSemanticColor /
  cardSemanticColor as the single source of truth for the roles
- document the mutation counterexamples: swapping the roles or recoloring
  card both fail the suite; restoring the correct roles passes

Co-authored-by: multica-agent <github@multica.ai>
…eal-window evidence

Co-authored-by: multica-agent <github@multica.ai>
…list

Co-authored-by: multica-agent <github@multica.ai>
@IchenDEV
IchenDEV merged commit b72b6e1 into main Sep 22, 2026
3 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