Skip to content

fix(store): widen defringe threshold to remove 1px white edge halo - #4

Merged
lukisch merged 2 commits into
masterfrom
fix/T-20260820-icon-halo-v2
Sep 26, 2026
Merged

lukisch merged 2 commits into
masterfrom
fix/T-20260820-icon-halo-v2

Conversation

@lukisch

@lukisch lukisch commented Sep 26, 2026

Copy link
Copy Markdown
Collaborator

Ersetzt PR #3 (nicht rebased/force-pushed, sondern frischer Branch von aktuellem master nach Merge von #2, um Historie sauber zu halten). Ticket T-20260820-729932431, T-20260926-902661741.

Kontext

merge-reviewer (claude-opus) hat PR #3 (edcb8fa) geprüft: Motiv korrekt (Vollfläche, unversehrt), Ecken transparent, Wide310x150Logo ohne opake Ecken — aber auf dunklem Grund blieb ein heller 1px-Saum an der Rundung. Gemessen: Square310x310Logo 204 Randpixel mit Alpha ≥ 192 und Luminanz auf Schwarz bis 216, Wide310x150Logo 183 Pixel.

Ursache

Der Antialiasing-Übergang zwischen Canvas-Hintergrund und solider Motivfarbe ist am Rand der abgerundeten Ecke nur 1 Pixel breit, hat aber eine Farbdistanz von ~97 zum Hintergrund (gemessen auf einer Diagonale nahe der Ecke: Hintergrund-Distanz ~1–2 bis Pixel 14, Sprung auf 97 bei Pixel 16, dann >300 ab Pixel 18 = solide Motivfarbe). Der bisherige bg_thresh von 60 im Freistellungs-Tool ließ genau dieses Übergangspixel unverarbeitet — voll opak, mit seiner ursprünglichen hellen Mischfarbe.

Fix

  • bg_thresh in scripts/defringe_store_tile.py auf 150 angehoben (über der gemessenen Übergangsdistanz ~97, deutlich unter der Distanz zur soliden Motivfarbe >300).
  • Damit erfasst das Un-Premultiply die komplette Übergangszone. Schlimmster verbleibender Wert über alle 5 Kacheln: Luminanz 160 auf Schwarz (vorher bis 216) — und das sind legitime dunkelblaue Zwischentöne der Icon-Kontur, kein weißer Rest.
  • Regressionstest test_store_tiles_have_transparent_corners erweitert: komponiert jedes teiltransparente Randpixel auf Schwarz und prüft eine Luminanzgrenze (200), damit dieser Fehler künftig automatisch auffällt statt nur im visuellen Review.
  • Versionsbump 1.0.6 → 1.0.7 (unverändert aus PR fix(store): restore original tile motif, defringe white halo correctly #3 übernommen: 1.0.6 bleibt mit dem bekannten Icon-Mangel im Changelog, wird nicht zurückgenommen).

Kontaktbogen (nicht im Repo, per Orphan-Branch review-assets gehostet — kein Merge-Ziel)

Gesamtübersicht (5 Größen × Weiß/Schwarz/Grau/Akzentgrün):
Kontaktbogen

Vergrößerung der abgerundeten Ecke auf Schwarz (Square310, 6×):
Zoom Ecke

review-assets ist ein orphan Branch ohne Bezug zu master — wird nach Abschluss des Reviews gelöscht, taucht in keiner Merge-Historie auf.

Verifikation

  • Gezielt: test_assets_and_icons.py, test_store_materials.py, test_metadata_contract.py — 35/35 passed.
  • Vollsuite: exit code 0, sichtbarer Fortschritt bis 80% sauber (Log durch Backgrounding abgeschnitten, kein Fehler aufgetreten).

Nicht selbst mergen (Zwei-Modell-Regel + vorheriger Direkt-Push-Vorfall). Keine Einreichung ohne ausdrückliche Freigabe des Team-Leads, und erst nachdem 1.0.6 die Zertifizierung durchlaufen hat.

Zweite Nachreview-Runde (merge-reviewer, claude-opus) zu PR #3
(edcb8fa): Motiv war korrekt (Vollflaeche, unversehrt), Ecken transparent,
Wide ohne opake Ecken -- aber auf dunklem Grund blieb ein heller 1px-Saum
an der Rundung (gemessen: Square310 204 Randpixel Alpha>=192 mit Luminanz
auf Schwarz bis 216, Wide 183 Pixel).

Ursache: Der Antialiasing-Uebergang zwischen Canvas-Hintergrund und
solider Motivfarbe ist am Rand der abgerundeten Ecke nur 1 Pixel breit,
hat aber eine Farbdistanz von ~97 zum Hintergrund (gemessen auf einer
Diagonale nahe der Ecke) -- der bisherige bg_thresh von 60 liess dieses
Pixel unverarbeitet (voll opak, urspruengliche helle Mischfarbe) zurueck.

Fix: bg_thresh auf 150 angehoben (deutlich ueber der gemessenen
Uebergangsdistanz ~97, deutlich unter der Distanz zur soliden Motivfarbe
>300) -- damit erfasst Un-Premultiply den kompletten Uebergang. Verifiziert:
schlimmster verbleibender Wert ueber alle 5 Kacheln liegt bei Luminanz 160
auf Schwarz (vorher bis 216), visuell an der Ecke sauber (siehe Kontaktbogen
im PR-Kommentar).

Regressionstest erweitert: test_store_tiles_have_transparent_corners
komponiert jedes teiltransparente Randpixel auf Schwarz und prueft eine
Luminanzgrenze, damit dieser Fehler kuenftig auffaellt statt nur visuell
im Review.

Dieser Branch wurde frisch von aktuellem master (13dd6cd, nach Merge von
PR #2) erstellt statt PR #3 fortzufuehren, um einen Force-Push zu
vermeiden. `_review/` (Kontaktbogen im Repo) wurde NICHT wieder
eingefuegt -- der Kontaktbogen kommt als eingebettetes Bild im
PR-Kommentar, nicht als Repo-Datei.

Verifiziert: 35/35 gezielte Tests (assets/icons, store_materials,
metadata_contract) gruen; Vollsuite lief bis 80% sichtbar sauber durch
(Log-Abschneidung durch Backgrounding, exit code 0).

Ersetzt PR #3. Ticket T-20260820-729932431, T-20260926-902661741.
@github-actions

Copy link
Copy Markdown

Welcome! Thanks for your first pull request in this repository.

A maintainer will review it soon. Please make sure:

  • Your changes are tested
  • Documentation is updated if needed
  • The PR description explains what changed and why

Thanks for contributing.

@lukisch lukisch left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review (merge-reviewer, claude-opus) auf Head 7cdf9ec: inhaltlich bestanden, ein kleiner Blocker (Lint).

Nachgemessen mit derselben Methode wie bei #3 (Randpixel mit transparentem Nachbarn, auf Schwarz komponiert, 6-fach-Vergrößerung der Ecke):

  • Saum weg: Die Randluminanz auf Schwarz liegt bei max. 136–157 je nach Kachel (vorher 194–216). Helle, fast opake Randpixel gibt es nur noch 1–4 je Kachel (vorher bis 204). In der Vergrößerung zeigt sich eine dunkelblaue Kontur ohne weiße Linie.
  • Motiv unversehrt: Gegenüber dem Original (aee6401~1) ist kein einziges Motivpixel verändert (0 von 77 300 bei 310, entsprechend bei allen Größen). Alle hellen Pixel im Innenbereich (Ordnerlasche, Weg; 8 579 bei 310) sind bitgleich zum Original. Der höhere Schwellwert frisst also nichts vom Motiv.
  • Ecken Alpha 0–2, Wide auch im Mittelfeld transparent.
  • Version 1.0.7 ist durchgängig (pyproject, store_package 1.0.7.0, CLAUDE.md, llms.txt, beide READMEs, Contract-Tests). Der CHANGELOG-Eintrag beschreibt den Verlauf korrekt, der 1.0.6-Eintrag benennt den bekannten Mangel.
  • Kein _review/ im PR. Lokal 365 passed / 2 skipped, neuer Luminanztest inklusive.

Blocker: Die CI ist rot durch Ruff E401 in der neuen Datei scripts/defringe_store_tile.py:14 (import sys, math), eingeführt durch diesen PR. Bitte aufteilen (import math / import sys), dann ist es merge-bereit.
Hinweis: Den Branch review-assets (3dc8205) nach dem Merge wie angekündigt löschen.

@lukisch
lukisch merged commit 67a1804 into master Sep 26, 2026
3 of 12 checks passed
@lukisch
lukisch deleted the fix/T-20260820-icon-halo-v2 branch September 26, 2026 14:32
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