Plan · 2026-05-16 · solcom-review

solcom-review — dritte Achse „Figma-Parity"

Skill solcom-review erhält neben den bestehenden Achsen Standards und Spec eine dritte parallele Sub-Agent-Achse Figma-Parity. Trigger: Diff matched web/themes/custom/byte_theme/components/** oder web/themes/custom/byte_theme/src/**. Anker: docs/design/MAPPING.html liefert Figma-Frame-Key pro betroffenem SDC. Auslöser für den Plan: PR-Review P2503-84 (Header / Main-Nav / Footer) deckte auf, dass es heute keine automatische Figma-Compliance-Prüfung im PR-Review-Loop gibt — ein FE-PR durchläuft Standards + Spec, aber visuelle Drift gegenüber dem Design-System wird nur manuell entdeckt.

Slices
3 (alle AFK)
Skill-Touch
solcom-review + Report-Template
Reuse
solcom-figma-reviewer
Aufwand
~½ Tag
00

Kontext

Lücke im heutigen Review-Loop und vorhandene Bausteine.

Status quo (ADR-0028): solcom-review spawnt zwei parallele Sub-Agents (Standards, Spec) und liest die Prompts der vier file-glob-Diff-Time-Reviewer (solcom-brand-reviewer, drupal-twig-sdc-reviewer, drupal-php-reviewer, drupal-config-architecture-reviewer) nur als Rule-Korpora. solcom-figma-reviewer existiert ebenfalls, wird aber weder auto-getriggert noch von solcom-review gespawnt.

Beobachtbare Lücke (PR P2503-84): Header-/Navbar-/Footer-Diff (~2000 LoC, 38 Files) durchlief Review ohne jeden visuellen Soll-Ist-Abgleich gegen die Figma-Frames byte_theme/navbar → 61148:47024 (Darkmode-Nav, P2503-122) und byte_theme/footer → componentKey:9167b5c4 aus MAPPING.html. Findings „Arrow als Inline-SVG statt ::before" und „Navbar-Container-Refactor weg von 1280 px" entstanden im Spec-Sub-Agent zufällig — eine Figma-Achse hätte sie als pixel-/spacing-Drift deterministisch aufgegriffen.

Bestehende Bausteine:

Out of Scope: Visual-Auto-Regression (Pixel-Diff-CI-Stage à la BackstopJS, Percy) — separate Tooling-Frage. Hier nur: in den manuellen /solcom-review-Run die Figma-Sicht zusätzlich einklinken.

01

Vertical Slices

Drei tracer-bullet Slices. Jede für sich grabbar, Tests/Smoke nach jeder Slice.

S1

Frame-Lookup-Mechanik (MAPPING-Parser inline im Skill)

Touch: SKILL.md-Schritt 3.5 (neu) · AFK

Der Skill bekommt einen neuen Pre-Step zwischen 3 (Standards-Korpora) und 4 (Sub-Agent-Spawn): liest docs/design/MAPPING.html, extrahiert pro <article class="card"> das Tupel { sdc-name, frame-key, status, verified-date } aus den <code class="node">- und <div class="sdc">-Knoten. Filtert auf SDCs, die im Diff geändert wurden (git diff --name-only origin/develop...HEAD | grep components/). Skip-Pfad: keine Treffer → keine Figma-Achse (kein Spawn, Hinweis im Output).

Beispiel-Output für P2503-84-Diff:
[
  { "sdc": "byte_theme/navbar",  "frame": "61148:47024", "status": "ready-for-dev", "verified": "2026-05-13" },
  { "sdc": "byte_theme/footer",  "frame": "9167b5c4",    "status": "wip",           "verified": "2026-05-04" }
]
Akzeptanzkriterien
  • Parser handhabt node-id sowohl im Figma-URL-Format (61148:47024) als auch componentKey-Format.
  • Filter respektiert nur SDC-Files (*.twig, *.tailwind.css, *.component.yml) — nicht .theme-Hook-Edits.
  • Bei Status gap oder obsolete: SDC im Diff, aber kein lebendes Mapping — explizit als „no-anchor-skip" markieren (nicht als Fehler).
  • Bei mehreren Frames pro SDC (matched + ready-for-dev): den jeweils ready-for-dev/matched-Eintrag bevorzugen, der verified-Date höher rankt.
  • Falls MAPPING.html fehlt oder leer ist: gracefully skippen, keine Exception.
S2

Skill-Erweiterung: dritter parallel-spawned Sub-Agent

Touch: SKILL.md-Schritte 4 und 5 · AFK

Wenn S1 ≥1 Tupel liefert, spawnt der Skill in der selben Nachricht (parallel zu Standards + Spec) einen dritten Agent-Tool-Call mit subagent_type: "solcom-figma-reviewer" (kein general-purpose — der Reviewer hat dedizierte Figma-MCP-Tools). Input: das Tupel-Array aus S1, dazu der git-diff-Befehl, dazu Glob-Pfade zu den Twig-/CSS-Files für direkten Read durch den Reviewer. Aggregations-Schritt 5 bekommt eine dritte Heading ## Figma neben ## Standards und ## Spec.

Prompt-Skelett für den Figma-Sub-Agent:
Du bist solcom-figma-reviewer. Vergleiche pro SDC den Diff gegen den Figma-Frame.
Inputs:
  - working-dir: 
  - sdc-frame-pairs:
      byte_theme/navbar → 61148:47024
      byte_theme/footer → 9167b5c4
  - diff-cmd: git diff origin/develop...HEAD 

Pro SDC:
  1. Figma-Frame via mcp__claude_ai_Figma__get_design_context laden.
  2. Twig + CSS + component.yml des SDC lesen.
  3. Auf Spacing/Farben/Typo/Variants/Inhalt vergleichen.
  4. Status setzen: matched | partial | drift.
  5. Detail-Findings (Soll vs. Ist, Quelle: Figma-Variable-Name oder
     Twig-File:Line).

Auth-Fail-Verhalten: ≤2 Retries; danach NEEDS_REAUTH-Note (ADR-0020),
kein Hard-Stop für den Gesamt-Run.
Akzeptanzkriterien
  • Drei Agent-Spawns in einer einzigen Nachricht (parallel-Pattern).
  • Wenn S1 leer → kein dritter Spawn, Aggregations-Heading ## Figma erscheint mit no SDC diff — Figma-Achse übersprungen.
  • Sub-Agent-Prompt nennt den Pfad zum byte_theme/AGENTS.md als Brand-Token-Referenz (damit Findings auf Tokens mappen statt Hex-Vergleich).
  • Sub-Agent-Modell explizit opus oder sonnet — Visual-Pattern-Matching ist nicht Haiku-tauglich (Memory feedback_visual_verify_side_by_side).
S3

Report-Template + Persistierung um Figma-Sektion erweitern

Touch: 03-code-review-pr.html + SKILL.md-Schritt 6 · AFK

Im persistierten Report (docs/reports/<YYYY-MM-DD>-<branch>-review.html) kommt eine dritte Top-Level-Section <!-- FIGMA --> nach <!-- SPEC --> mit dem gleichen axis-card-Layout (eine Card pro SDC, Status-Tag matched/partial/drift, Findings-Liste). Risk-Map-Chips bekommen Status-Klasse chip.attention bei drift, chip.medium bei partial, chip.safe bei matched. Story-Hub-Write-Back-Format (Schritt 6.5) wird um eine zweite Datenzeile ergänzt: standards: N hard / M judgement, spec: K, figma: matched=A, partial=B, drift=C.

Akzeptanzkriterien
  • Template 03-code-review-pr.html behält Style-Pattern (axis-card, risk-tag, finding-label) bei.
  • Frontmatter-Meta um solcom:figma-frames erweitert (Liste der genutzten Frame-Keys, für späteren Lint).
  • Bei MCP-Auth-Fail rendert die Figma-Section eine warning-card mit dem NEEDS_REAUTH-Hinweis statt der Findings — Report bleibt vollständig.
  • LOG.html-Eintrag „decide" sagt zusätzlich figma: matched=A, partial=B, drift=C im Title.
  • Smoke: /solcom-review auf einer Branch ohne SDC-Diff (z. B. reiner Config-Change) rendert die Section trotzdem mit einer placeholder-card „no SDC diff" — keine harten Crashes.
02

Risiken

Risk
Sev
Mitigation
MAPPING.html-HTML-Struktur ändert sich (z. B. neue Wrapper-Divs) → Parser bricht still.
med
Defensive parsing: bei 0 Tupeln aus ≥1 SDC-File-Diff explizit warnen statt skippen. Optional späterer Helper-Skript mit Snapshot-Test.
Figma-MCP-Auth ist volatil — Token expired, MCP nicht in Whitelist, Browser-Tab geschlossen.
high
ADR-0020-Pattern: ≤2 Retries, dann NEEDS_REAUTH-Section im Report, Standards + Spec ungehindert. Kein Hard-Stop für den Gesamt-Run.
SDC im Diff hat keinen Eintrag in MAPPING.html → Reviewer hat keinen Anker.
low
Skip-with-Hint: „no-anchor — SDC nicht in MAPPING.html, Eintrag via solcom-design-scanner nachpflegen". Output ist Aufruf, nicht Fehler.
Figma-Frame ist veraltet (Status gap/obsolete) — Drift wäre erwartbar, Reviewer-Output verwirrt Author.
med
Status-Filter in S1: gap/obsolete werden mit Banner gerendert (Frame-Status: obsolete — Drift erwartbar), Reviewer wird trotzdem gespawnt für Sichtbarkeit.
Visual-Diff ist subjektiv — Reviewer-Output streut zwischen Runs.
med
Memory feedback_visual_verify_side_by_side als Pflicht-Lese im Sub-Agent-Prompt; Findings müssen Twig-Pfad + Figma-Variable zitieren, kein „looks different".
Token-Verbrauch: drei parallele Sub-Agents statt zwei → ~+50 % Kontext-Last pro Run.
low
Sonnet als Default, klar definierte Output-Caps (<400 Wörter wie bisher). Kein Loop, einmaliger Spawn.
03

Offene Items / Pre-Implementation-Gates

OQ1 · Frame-Selection bei mehreren Mappings

Manche SDCs (z. B. byte_theme/navbar) haben in MAPPING.html mehrere Frame-Einträge mit unterschiedlichem Status (partial/wip und ready-for-dev). Heuristik in S1 nimmt den jüngsten ready-for-dev/matched. Frage: brauchen wir einen Mechanismus, den Frame an die Story zu binden (Story-Hub trägt explizite Frame-IDs)? Vorschlag: ja, aber out-of-scope dieses Plans — eigener Plan / ADR, sobald die Heuristik die ersten Fehlauslesen produziert.

OQ2 · solcom-figma-reviewer Input-Schema

Heutige .claude/agents/solcom-figma-reviewer.md erwartet einen einzelnen Frame als Input. Mit dem Plan kommt ein Tupel-Array. Prüfen: ist die Agent-Spec heute schon Multi-Frame-fähig (interner Loop), oder müssen wir den Prompt anpassen? Falls Anpassung nötig: minimaler Diff in .claude/agents/solcom-figma-reviewer.md mit Multi-SDC-Pattern.

OQ3 · Cross-Skill-Wiederverwendung

Der gleiche MAPPING-Lookup wird perspektivisch auch in figma-autonomous-implementer und solcom-design-scanner gebraucht. Frage: jetzt schon als Helper-Skill oder Helper-Skript ausziehen, oder erst beim zweiten Use-Case extrahieren (YAGNI)? Vorschlag: zweiter Use-Case abwarten — Inline-Logik im SKILL.md ist heute lesbar und stabil.

OQ4 · Backfill bestehender Reports

Bereits persistierte Reports (P2503-103, P2503-105) haben keine Figma-Section. Frage: nachträglich anlegen oder nur ab heute? Vorschlag: nur ab heute — historische Reports bleiben unverändert (Audit-Trail-Hygiene).

OQ5 · Customer-Lens-Reviewer-Konsultation

Skill-Architektur-Erweiterung ohne ≥2 Topologie-Optionen — Tool-Erweiterung, keine Komponenten-Topologie. Customer-Lens-Reviewer-Pflicht: N/A (siehe ADR-0028, „Skill-Internals"-Klausel).