Task T7 preacher evidence Implemented App\Services\NameTagResolver::preacherFor(Service $service). Covered behavior: - Non-empty services.preacher_name_override wins and is trimmed. - Without override, services.preacher_name (CTS Predigt role) is returned. - Without both fields, first visible non-song sermon agenda item is resolved by agenda_sermon_matching patterns via AgendaMatcherService. - Multiple responsible entries are supported with comma-space joining; empty/missing names return null. - No override, no CTS preacher name, and no sermon responsible returns null. Responsible JSON findings: - ServiceAgendaItem.responsible is cast to array. - Existing sync test stores associative object shape: {"name":"Max Mustermann"}. - New tests cover the expected multiple-person list shape: [{"name":"Anna Müller"},{"name":"Tom Klein"}]. - Resolver also supports string entries and firstName/lastName or first_name/last_name fallbacks. Sermon detection used: - Prefer configured Setting key agenda_sermon_matching, split by comma, matched with AgendaMatcherService::matchesAny(). - Only visible non-song agenda items are considered (is_before_event=false, service_song_id IS NULL). - If no setting exists, title/type substring fallback accepts predigt or sermon. Verification: - RED before implementation: ddev exec php artisan test tests/Feature/NameTagResolverTest.php failed because App\Services\NameTagResolver did not exist. - GREEN targeted: ddev exec php artisan test tests/Feature/NameTagResolverTest.php -> 7 passed. - GREEN full suite: ddev exec php artisan test -> 532 passed (2659 assertions). - Pint: ddev exec ./vendor/bin/pint app/Services/NameTagResolver.php tests/Feature/NameTagResolverTest.php. - LSP diagnostics clean for app/Services/NameTagResolver.php and tests/Feature/NameTagResolverTest.php.