var(--brand-*) referenziert werdenwatchlist-bar.twig:16: bg-[#011C53]/30 — Brand-Token-Wert ist #001F46 (--brand-dark-blue), nicht #011C53. Entweder Token-Verwendung oder Begründung warum ein anderer Hex.
bef-checkboxes.html.twig:50–51: bg-[#BEDC00] und border-[#BEDC00] — sollte bg-[var(--brand-lime)].
views-exposed-form--project-offers-listing--block-listing.html.twig:23: bg-[#001F46]/30 — bg-[var(--brand-dark-blue)]/30.
select--edit-branche.html.twig:16,29, input--textfield--edit-einsatzort.html.twig:16,23, pager--project-offers-listing--block-listing.html.twig:77, byte_theme.theme:174: mehrfach text-[#001F46]. input--textfield… + select--edit-branche… nutzen zusätzlich text-[#828282] / placeholder-[#828282] (--brand-gray).
card-bubble-profile.twig:13: border-[#0050A0] — keine bestehende Brand-Token-Entsprechung; entweder Token anlegen oder Verwendung begründen.
class-Attribut
Hard Violation
Diff zeigt <div class="{{ is_listing ? 'bubble-card__cta mt-6' : 'bubble-card__cta-pill' }}">. AGENTS.md Rule 1/6: „Never use inline conditionals within HTML tag attributes." Vorab via {% set cta_class = is_listing ? '…' : '…' %} oder per CVA berechnen.
with … only bzw. with_context: false
Hard Violation
{% include '@better_exposed_filters/bef-nested-elements.html.twig' %} ohne dritten Parameter. AGENTS.md Rule 11 fordert explizit with_context: false oder with { … } only, um Context-Pollution zu vermeiden.
listing-Variante (Bubble → Rechteck) ohne ADR
Judgement Call
Die neue Variante ändert die Geometrie der SDC strukturell (Bubble-Notch vs. Listing-Rectangle). drupal-config-architecture-reviewer.md verlangt bei Topologie-Decisions mit ≥2 Optionen Customer-Lens-Konsultation + ADR. Plan 0001 §Decisions argumentiert die Variante zwar fachlich, aber kein ADR-File reflektiert die Entscheidung — der Plan ist „proposed", keine entscheidungs-tragende ADR.
{% if resolved_variant == 'top' %}…{% else %}…{% endif %}
Judgement Call
Die Variante-Unterscheidung wickelt zwei nahezu vollständige <aside>-Bäume in ein if/else. AGENTS.md Rule 9 empfiehlt CVA-Klassen-Resolution; Komplett-Markup-Splits sind nicht explizit verboten, aber Borderline. Falls die beiden Varianten strukturell genug abweichen, ist der Split vertretbar — Entscheidung explizit dokumentieren.
byte_theme_preprocess_bef_links-Funktion prozedural
Judgement Call
.theme statt in ThemeHooks.php (Attribute-Style)Drupal 11.3+ unterstützt Attribute-basierte Hooks (siehe src/Hook/ThemeHooks.php). Die neue Funktion ist im klassischen .theme-Stil — funktional korrekt, aber inkonsistent mit dem bereits etablierten ThemeHooks-Pattern.
DurationBucket.php nutzt #[ViewsFilter(...)]-PHP-Attribut — Drupal-11-Attribute-Syntax korrekt.
solcom_vacancy_update_9003 ist ein neuer Update-Hook (kein Schema-Konflikt mit 9002).
build/main.min.css ist committed — konsistent mit AGENTS.md Rule 13 (Tailwind-Build artefact).
watchlist-bar.twig nutzt with_context: false für @byte_theme/components/{icon,button}/…-Includes korrekt.
field_matching_score neu in config/sync/ — Field-Storage + Field-Config beide vorhanden, kein hook_install nötig (config-only).
status: experimental auf Production-registrierter SDC
Hard Violation
result-counter.component.yml:4: status: experimental. Demgegenüber canvas.component.sdc.byte_theme.result-counter.yml:3: status: true — die SDC ist in Canvas aktiviert, das Theme-Schema flagged sie aber als experimental. drupal-canvas-Skill: Canvas-eligible SDCs müssen mindestens stable-Status haben, sonst kann der Page-Builder-Editor sie in einigen Canvas-Versionen nicht zur Auswahl anbieten.
active_version und älteren Snapshots
Hard Violation
result-counter + watchlist-barcanvas.component.sdc.byte_theme.result-counter.yml registriert zwei Snapshot-Keys (780335f527bb637c als active plus älteren 0d0e469fa1c1ee09) mit identischen Props — Drift-Hinweis nach einem Reset.
canvas.component.sdc.byte_theme.watchlist-bar.yml: alter Snapshot 308cfd5169ffe2ee kennt nur max_entries und apply_all_url; der active-Snapshot hat zusätzlich variant. Fällt Canvas auf den alten Snapshot zurück, fehlt variant im Editor — obwohl der Twig sie bereits erwartet.
Empfehlung: alte Snapshots prunen oder verifizieren, dass das Theme-Build-Hash zur active_version passt (vor Deploy: drush ev "print_r(\Drupal::service('canvas.component_versions')->getHashes());").
variant-Prop ohne examples
Hard Violation
Im selben File ist max_entries mit examples: [5] versorgt, variant bleibt ohne examples. drupal-canvas-SKILL.md verlangt für jede Prop einen examples-Eintrag (erstes Beispiel = Default für den Editor). Inkonsistent innerhalb derselben Datei.
matching_score: 0 als Static-Default
Judgement Call
Beide Card-Templates setzen matching_score: 0 als statischen Input — die Pill rendert dauerhaft im opacity-70-State. Wenn Plan S-11 nur ein Stub ist und der Score später aus einem Scoring-Dienst kommt, muss der Input auf sourceType: entity-field umgestellt werden. Heute kein Fehler, aber leicht zu übersehen beim Service-Bind.
Breadcrumb-Removal-Tree-Konsistenz: in allen vier .full-Templates (blog, page, project_offer, vacancy) sind die entfernten block.system_breadcrumb_block-Knoten Top-Level-Roots; keine verbleibenden Kinder mit dangling parent_uuid.
Views-Exposed-Filter-Block-Wrapper (canvas.component.block.views_exposed_filter_block.project_offers_listing-block_listing.yml): Provider views korrekt, Dependency auf views.view.project_offers_listing gesetzt, slot_definitions: null für Block-Components valide.
Canvas-Folder (5e3c80cd-…): referenziert ausschließlich Component-IDs, die im selben Diff registriert sind — kein dangling Reference.
project_offer.card.yml Field-Bindings: B (field_sf_industry), C (field_sf_job_title), D1 field_sf_duration, D2 field_sf_estimated_start, D4 field_sf_city, E (field_sf_long_description), plus Utilisation und Application-URL — alle als entity-field-Expression im kanonischen ℹ︎␜entity:…␞␟value-Pattern. D3 Remote-Anteil fehlt (Feld existiert nicht im Datenmodell, deferred via Plan §08).
card-bubble-profile Canvas-Registry: variant + matching_score im active-Snapshot vorhanden; SDC status: stable; Eligibility erfüllt. Alter Snapshot 283c56c0b873cb9b mit leeren Props bleibt aus Migrations-Gründen erhalten — strukturell korrekt.
Korrektur 2026-05-17: Die Listing-Card hat sehr wohl die Slot-Children mit entity-field-Bindings — Branche (B, field_sf_industry), Heading (C, field_sf_job_title), D1 Dauer (field_sf_duration), D2 Start (field_sf_estimated_start), D4 City (field_sf_city) sowie zusätzlich Utilisation und Application-URL, plus Teaser (E, field_sf_long_description).
Offen ist D3 Remote-Anteil — kein field_sf_remote-Binding. Das entspricht dem aktuellen Datenmodell (Feld existiert nicht), Plan §08 Follow-up-Tabelle listet „Remote-Anteil" als Figma-gap. Nicht weiter zu adressieren in diesem PR.
watchlist-bar-Default bottom ist gewolltCommit ba46209 fix(theme): watchlist-bar immer als Bottom-Variante rendern ist als bewusste Standard-Setzung bestätigt. Plan §04 S-10 „top-sticky als Default auf /projektpartnerportal" reflektiert die alte Designannahme und muss bei der nächsten Plan-Pflege auf bottom-Default umgeschrieben werden — Empfehlung in der Checkliste unten.
system_breadcrumb_block aus allen .full-Templates repo-weitCommit 22d83f4 chore(canvas): Breadcrumb-Block aus allen .full Content-Templates entfernen trifft blog.full.yml, page.full.yml, project_offer.full.yml, vacancy.full.yml. Plan erwähnt Breadcrumbs nicht; commit-message argumentiert „bewusster Sweep", aber kein ADR / Plan-Entry deckt die UX-Entscheidung ab.
Commits 8c0936c (ADR-0036 proposed), 1f90204 (Revert), db5d289 (Wiki recipe-apply-risk) gehören zur parallelen Canvas-Page-Portability-Debatte. Konsistent mit Memory project_canvas_page_local_curation (kein Recipe-Content). Inhaltlich legitim, aber gehört nicht in die Figma-Alignment-Branch.
Geänderte Meta-Files: .claude/settings.json, .claude/skills/{figma-autonomous-implementer,solcom-build-frontend}/SKILL.md, .claude/agents/solcom-figma-reviewer.md, AGENTS.md, docs/agents/{reviewers,sandcastle,skills}.html, docs/index.html, docs/LOG.html, docs/plans/2026-05-14-001-feat-project-offer-sync-bh4sf.html, docs/prds/2026-05-13-salesforce-publication-sync-prd.html, zwei ADRs (0012, 0014), docs/design/MAPPING.html.
Plan/PR-Beschreibung deckt diese Housekeeping-Commits nicht. Stört nicht funktional, aber bläht den PR auf 50 Files auf — Splitting in Feature-PR + Housekeeping-PR hätte den Review beschleunigt.
Commit-Labels: Slice 13 (bef_links-Laufzeit), 14 (Watchlist-CSS-Override), 15 (Branche-Checkboxes Custom-Style), 16 (Watchlist-Bar Top-Variant Fix), 17 (result-counter Umlaut), 18 (Branche-Select-Dropdown), 19/20 (Pill-Styling). Plan §04 Summary-Box: „12 Slices".
Diese acht Iterationen sind sinnvoll, aber im Plan nicht als eigene AKs nachgepflegt. Plan-Sektion „Follow-up / Open Gaps (post-Wave-D, 2026-05-17)" listet einige Punkte — eine Pflege-Iteration für die Slice-Nummerierung steht aus.
Plan-Sektion 04 S-12 + §06 Verifikation: Visual-Verify-Pass mit dokumentiertem Side-by-Side gegen Figma-Frame 985-50024 und Lighthouse-Scores. Diff enthält keinen Eintrag in docs/reports/ oder Screenshots — der Pass fehlt entweder oder lief nur lokal ohne Persistenz (verletzt Memory feedback_visual_verify_side_by_side + feedback_solcom_review_persist_default).
S-01 Canvas-Page-Chassis /projektpartnerportal — Route + Slots + Views-Block ✓ (Commit e1dcd58).
S-02–S-05 BEF-Form + Widget-Overrides (Search, Select, Checkboxes) — Twig-Templates neu unter templates/better_exposed_filters/ + templates/form/ ✓.
S-06 Custom-BEF-Plugin DurationBucket — neu unter solcom_project_offer/src/Plugin/views/filter/ ✓.
S-07 Result-Counter-SDC + Canvas-Component-Registrierung ✓ (Status-Tag-Fix steht aus, siehe Standards).
S-08 Pagination-Twig-Override pager--project-offers-listing--block-listing.html.twig ✓.
S-11 Matching-Score-Field-Stub — field.storage.node.field_matching_score.yml + field.field.node.project_offer.field_matching_score.yml ✓.