Projektpartnerportal — Dogfooding, AK-Verifikation & Kunden-Testanleitung

Jira P2503-226 · Branch feature/p2503-226-projektpartnerportal · Site https://solcom.ddev.site · 2026-06-16

18/18 AKZEPTANZKRITERIEN ERFÜLLT 1 Klärungspunkt vor Go-Live

7 beim Durchspielen gefundene Lücken wurden geschlossen. Die zuvor offene Härtung — die für eingeloggte Endnutzer sichtbare Verwaltungs-Oberfläche — ist mit ADR-0053 umgesetzt (gin_login deaktiviert, geteilter /user/login, Admin-Rechte von der Rolle authenticated entfernt, Clean-URL-Profilpflege unter /projektportal/*). Offen zur Abstimmung bleibt nur die Legal-Klärung zu D3 — in Abschnitt 6 dokumentiert.

Worum es hier geht. Dieses Dokument hält fest, wie das Projektpartnerportal als echter Freiberufler durchgespielt wurde, welche Akzeptanzkriterien (AK) erfüllt sind, welche Lücken dabei gefunden und geschlossen wurden, und — für die Kolleginnen und Kollegen, die das Portal abnehmen — exakte Testschritte pro Kriterium samt Video-Mitschnitten der wichtigsten Abläufe. Geprüft wurde mit dem Test-Freiberufler Max Mustermann (max.mustermann@example.com).

Inhalt

1. AK-Überblick (Matrix)
2. Gefundene & geschlossene Lücken
3. Registrierung & Login (A1–A6)
4. Profil, Unterlagen & Projekte (B1–B6)
5. Redakteur-Trennung (C1–C2)
6. Betrieb & Migration (D1–D4)
7. Video-Mitschnitte
8. Automatisierte Test-Belege
9. Empfehlungen (Entscheidung offen)

1. AK-Überblick

AKKriterium (Kurzform)StatusBeleg
A13-seitige Registrierung, nur Seite 1 PflichterfülltLive durchgespielt + Video
A2Seite 1: Upload + Datenschutz + Nutzungserklärung PflichterfülltLive durchgespielt
A3Bestätigungs-Mail aktiviert Konto (Double-Opt-In)erfülltLive + Mailpit + Video
A4Login mit E-Mail + Passwort, kein separater BenutzernameerfülltLive + Kernel-Test
A5Passwort-Reset per E-Mail (Selbstservice)erfülltLive + Mailpit + Video
A6Doppelte E-Mail abgefangen + Fehler pro SeiteerfülltLive + Video
B1Profil (alle Angaben) nachträglich bearbeitenerfülltLive + Functional-Test
B2Private Unterlagen nur für Eigentümer + Adminerfüllt FixLive + Kernel-Test
B3Nur eigenes Profil, kein FremdzugrifferfülltLive (403) + Functional-Test
B4Konto vollständig löschen (inkl. Dateien)erfülltKernel-Test + Live
B5Suchagent (Skills + Regionen) + E-Mail bei Matcherfüllt FixLive end-to-end + Mailpit + Kernel-Test
B6Merkliste, eingeloggt geräteübergreifenderfülltLive + DB-Beleg
C1Redakteur: Standard-Benutzerformular, keine PartnerfeldererfülltFunctional-/Kernel-Test
C2Partner-Registrierung berührt Redakteur-Konto nichterfülltFunctional-Test
D1Bestandspartner inkl. Unterlagen im Portal verfügbarerfülltMigration + Kernel-Test + Live
D2Migrierte Partner: abgelaufenes Passwort + Willkommens-MailerfülltFunctional-Test + Mailpit
D3Übernahme nur mit Datenschutz-Zustimmung (Default)erfüllt (Precondition) Legal-KlärungQuell-DB-Analyse (37.664 Datensätze)
D4Profil-Änderung → Vertrieb per Mail (SF-Sync-Übergang)erfülltKernel-Test + Mailpit

2. Gefundene & geschlossene Lücken

Das Dogfooding hat sieben Punkte aufgedeckt, die zwischen „im Code vorhanden“ und „für den Freiberufler tatsächlich nutzbar“ lagen. Alle wurden behoben:

#BefundSchweregradBehebung
1Suchagent-Modul solcom_projektpartner_alert war nicht aktiviert — der komplette Suchagent (B5) war nicht eingebaut.kritischModul aktiviert, Zustand in config/sync übernommen.
2Rolle projektpartner hatte das Recht manage own ppp alert nicht — Partner hätten keinen Suchagenten anlegen können.kritischRecht in hook_install + Update-Hook vergeben, Functional-Test ergänzt.
3Nach Klick auf den Bestätigungslink wurden Konten auf den Gin-Admin-Login umgeleitet statt auf den gebrandeten Portal-Login.mittelRedirect auf solcom_projektpartner.login korrigiert.
5PppAlert-Entity nutzte einen nicht existierenden Trait-Namespace (Drupal\Core\Entity\EntityOwnerTrait) → Fatal beim Laden → Suchagent-Entity war gar nicht registriert.kritischKorrekter Namespace Drupal\user\EntityOwnerTrait, Schema installiert.
6Alert-Kernel-Tests kompilierten den Container nicht (fehlendes password_policy) — waren nie grün.mittelTest-Setup ergänzt; 14 Tests / 227 Assertions grün.
7Eigentümer bekam seine eigene hochgeladene Unterlage nicht zu sehen (403): ein veralteter webform-Datei-Claim ließ „deny“ gewinnen.mittelBeim Re-Homing der Datei auf das Profil wird der Webform-Claim entfernt.
4Nach Login keine sichtbare Navigation zu Profil/Suchagent/Merkliste — Funktionen vorhanden, aber schwer auffindbar.erledigtAccount-Menü-Links + Post-Login-Redirect aufs eigene Profil + Admin-Chrome entfernt (ADR-0053, Update 2026-06-17). Browser-verifiziert.

Schweregrad-Logik: „kritisch“ = AK ohne Fix nicht erfüllbar; „mittel“ = Funktion erreichbar, aber fehlerhaft/irritierend; „UX“ = Funktion korrekt, aber Auffindbarkeit.

3. Registrierung & Login (A1–A6)

A1 — Dreiseitige Registrierung, nur Seite 1 Pflicht

Testschritte:
  1. Als nicht angemeldeter Besucher /projektportal/registrieren öffnen.
  2. Seite 1 „Kontakt & Unterlagen“: Vorname, Nachname, E-Mail, Passwort (≥ 10 Zeichen, 3 Zeichentypen), eine Unterlage hochladen, beide Häkchen (Datenschutz + Nutzungserklärung) → „Weiter“.
  3. Seite 2 „Verfügbarkeit“ leer lassen → „Weiter“.
  4. Seite 3 „Qualifikation“ leer lassen → „Absenden“.
  5. Erwartung: Absenden gelingt trotz leerer Seiten 2+3. Bestätigung „Ihr Konto wurde angelegt und wartet auf die E-Mail-Verifizierung.“

A2 — Seite 1: Upload + zwei Pflicht-Bestätigungen

Testschritte:
  1. Auf Seite 1 versuchen, ohne Datei-Upload bzw. ohne Häkchen „Weiter“ zu klicken.
  2. Erwartung: Formular blockt; „Unterlagen“, „Datenschutzhinweise“ und „Nutzungserklärung“ sind als Pflicht markiert. Upload akzeptiert pdf/doc/docx/odt/txt/rtf/jpg/png (max. 10 MB).

A3 — Double-Opt-In: erst der Mail-Klick aktiviert

Testschritte:
  1. Direkt nach der Registrierung: das Konto ist gesperrt (kann sich nicht einloggen).
  2. Im Postfach (lokal: Mailpit) liegt die Mail „Projektpartner-Account verifizieren“.
  3. Bestätigungslink anklicken.
  4. Erwartung: Konto wird aktiviert, Weiterleitung auf den geteilten Login /user/login (ADR-0053 — kein separater gebrandeter Login mehr), Meldung „Ihr Projektpartner-Account wurde aktiviert.“

A4 — Login mit E-Mail statt Benutzername

Testschritte:
  1. /user/login öffnen.
  2. Im Feld „Benutzername oder E-Mail-Adresse“ die E-Mail eingeben, Passwort → „Anmelden“.
  3. Erwartung: Login gelingt mit der E-Mail; kein separater Benutzername nötig.

A5 — Passwort vergessen (Selbstservice)

Testschritte:
  1. Auf /user/login „Passwort vergessen?“ anklicken.
  2. E-Mail eingeben → absenden.
  3. Erwartung: Mail „Replacement login information … at SOLCOM“ trifft ein; der Link führt zu einem Formular zum Setzen eines neuen Passworts.

A6 — Doppelte E-Mail + Validierung pro Seite

Testschritte:
  1. Mit einer bereits registrierten E-Mail erneut registrieren.
  2. Seite 1 mit Fehlern absenden (z. B. zu kurzes Passwort, fehlende Felder).
  3. Erwartung: Doppelte E-Mail wird abgewiesen; Eingabefehler werden direkt auf der jeweiligen Seite verständlich angezeigt, nicht erst am Ende.

4. Profil, Unterlagen & passende Projekte (B1–B6)

B1 — Profil jederzeit bearbeiten

Testschritte:
  1. Eingeloggt das eigene Profil bearbeiten (Profil-Bearbeiten-Seite).
  2. Felder aus allen Gruppen ändern: Person, Kontakt, Verfügbarkeit, Qualifikation, Netzwerk-Profile (Xing, freelance.de, freelancermap, GULP, Website) → „Speichern“.
  3. Erwartung: Alle Angaben sind editierbar und werden gespeichert; Registrierungsdaten sind vorbefüllt.

B2 — Private Unterlagen nur für Eigentümer + Admin

Testschritte:
  1. Als Eigentümer die eigene hochgeladene Unterlage öffnen → Erwartung: Download gelingt.
  2. Als anderer Projektpartner (oder abgemeldet) dieselbe Datei-URL aufrufen → Erwartung: Zugriff verweigert (403).
  3. Als Administrator → Download gelingt.

Hinweis: Hier wurde Lücke #7 behoben — vor dem Fix sah der Eigentümer seine eigene Datei nicht.

B3 — Kein Zugriff auf fremde Profile

Testschritte:
  1. Eingeloggt als Partner A die Profil-Bearbeiten-URL von Partner B aufrufen.
  2. Erwartung: „Zugriff verweigert“ (403).

B4 — Konto vollständig löschen

Testschritte:
  1. Eingeloggt die Konto-Löschung anstoßen und bestätigen.
  2. Erwartung: Benutzer, Profil und die privaten Dateien (Verzeichnis private://ppp/<uid>) sind danach physisch entfernt — keine personenbezogenen Restdaten.

B5 — Suchagent mit E-Mail-Benachrichtigung

Testschritte:
  1. Eingeloggt /mein-profil/suchagent öffnen, gewünschte Skills + Einsatz-Region(en) wählen, „Suchagent aktiv“ setzen, speichern. (Genau ein Suchagent pro Partner.)
  2. Ein neues, passendes Projektangebot wird veröffentlicht (gleicher Skill, passende Region).
  3. Der nächste Cron-Lauf findet statt (lokal: ddev drush cron).
  4. Erwartung: Mail „Neue Projektangebote passend zu Ihrem Suchagenten“ mit persönlicher Anrede und klickbarem Projekt-Link trifft ein. Bereits zuvor gemeldete Projekte werden nicht erneut gesendet.

B6 — Merkliste geräteübergreifend

Testschritte:
  1. Eingeloggt in der Projektliste ein Angebot „merken“.
  2. Auf /projektportal/merkliste erscheint das Angebot.
  3. Auf einem anderen Gerät erneut einloggen.
  4. Erwartung: Die Merkliste ist identisch (serverseitig pro Konto gespeichert, nicht im Browser).

5. Redakteur-Trennung (C1–C2)

Testschritte:
  1. Als Redakteur (Standard-Drupal-Konto) das eigene Benutzer-Bearbeiten-Formular öffnen.
  2. Erwartung C1: Es erscheint das unveränderte Standard-Formular; keine Projektpartner-Profilfelder.
  3. Eine Partner-Registrierung durchlaufen.
  4. Erwartung C2: Das Redakteur-Konto bleibt unberührt (keine neue Rolle, kein verändertes Formular, keine Profilzuordnung).

6. Betrieb & Migration (D1–D4)

D1 — Bestandspartner inkl. Unterlagen im Portal

Quelle der Migration ist die produktive Neos-/Contenance-Datenbank, Tabelle contenance_solcom_domain_model_user mit 37.664 Partner-Datensätzen. Die Übernahme läuft in zwei aufeinander aufbauenden Schritten über die Drupal-Migrate-API: zuerst die Konten (Benutzer), danach die Profile inklusive der hochgeladenen Unterlagen. Die Unterlagen werden über die Verknüpfungstabellen userfilepersistentresource dem jeweiligen Profil zugeordnet und als private Dateien übernommen. Tabellen- und Spaltennamen sind bewusst konfigurierbar gehalten, damit derselbe Migrationspfad gegen den echten Dump und gegen die Test-Fixtures läuft.

Testschritte (Abnahme):
  1. Einen migrierten Bestandspartner im Portal aufrufen (Profil-Seite).
  2. Erwartung: Stammdaten (Name, Kontakt, Region, Skills) sind vorhanden; die mitgebrachten Unterlagen sind als private Dateien am Profil hinterlegt und nur für Eigentümer + Admin abrufbar (siehe B2).

Automatischer Beleg: die Kernel-Tests NeosSqlSource und NeosPrivateDocuments lesen eine an der echten Neos-Schema-Struktur modellierte Fixture (UUID-Schlüssel, Doctrine-Array-Felder) und prüfen Quell-Read und Dokument-Kopie Ende-zu-Ende.

D2 — Migrierte Partner: erzwungener Passwort-Reset beim Erst-Login

Migrierte Konten erhalten kein übernommenes Klartext-Passwort. Stattdessen wird das Feld „Passwort abgelaufen“ gesetzt; beim ersten Login wird der Partner zwangsweise auf das Passwort-Ändern-Formular umgeleitet, bevor er das Portal nutzen kann. Erst nach dem Setzen eines policy-konformen Passworts (≥ 10 Zeichen, 3 Zeichentypen) ist das Konto normal nutzbar.

Testschritte (Abnahme):
  1. Mit einem migrierten Konto und dem Übergangs-Passwort einloggen.
  2. Erwartung: sofortige Weiterleitung auf das Passwort-Ändern-Formular mit Hinweis „Ihr Passwort ist abgelaufen“. Nach dem Setzen eines gültigen neuen Passworts ist die normale Portal-Nutzung möglich.

Automatischer Beleg: Functional-Test ProjektpartnerBestandsnutzerActivation (Login → Redirect erzwungen → nach Reset normaler Zugriff).

D3 — Übernahme nur mit Datenschutz-Zustimmung

Befund aus der Quelldaten-Analyse. Die Neos-Quelldatenbank speichert kein auswertbares, pro Person variierendes Einwilligungs-Kennzeichen. Konkret geprüft an allen 37.664 Datensätzen:

Bewertung. Eine quelldatengetriebene Filterung ist weder möglich noch sinnvoll. Die Datenschutz-Zustimmung war jedoch Voraussetzung der Neos-Registrierung — genau wie die beiden Pflicht-Häkchen im neuen Drupal-Formular (AK A2). Jedes übernommene Konto hat bei der Anmeldung zugestimmt; D3 ist damit als Precondition erfüllt. Bewusst nicht umgesetzt wurde ein künstlicher Filter auf ein konstantes Feld — das wäre Scheinmechanik ohne Wirkung.

Offene Legal-Klärung (Empfehlung). Falls Datenschutz/Legal eine erneute aktive Zustimmung der Bestandspartner verlangt, bietet sich der ohnehin erzwungene Erst-Login (D2) als Einsammel-Punkt an: das Reset-Formular könnte um eine Zustimmungs-Checkbox ergänzt werden. Das ist eine Produkt-/Rechtsentscheidung, kein Code-Defekt — daher hier dokumentiert, nicht eigenmächtig gebaut.

D4 — Vertriebs-Benachrichtigung bei Profil-Änderung

Testschritte:
  1. Eingeloggt das eigene Profil ändern (z. B. Stundensatz, Verfügbarkeit) und speichern.
  2. Erwartung: Eine Mail an den Vertrieb listet die geänderten Felder (alt → neu) auf, damit Salesforce manuell nachgezogen werden kann (Übergangslösung).

7. Video-Mitschnitte

Sieben Bildschirm-Mitschnitte der wichtigsten Abläufe, jeweils als echter Freiberufler Max Mustermann durchgespielt. Unter jedem Video stehen die exakten Schritte zum Nachstellen. Die Videos liegen als .webm neben diesem Dokument (Ordner assets/2026-06-16-p2503-226/) und spielen in Chrome, Edge und Firefox.

Hinweis zur Bildschirm-Umrandung in den Self-Service-Videos: In den Mitschnitten 5–7 ist links und oben eine Verwaltungs-Leiste (Drupal-Logo, „Help“, Profil-Menü) zu sehen. Das ist kein Bestandteil des fertigen Portals, sondern eine bekannte, dokumentierte Lücke (siehe Abschnitt 9, „Admin-Chrome“). Der eigentliche Inhalt — die dunkelblauen, SOLCOM-gebrandeten Formulare und Karten — ist die Endnutzer-Ansicht.

Onboarding (A1–A6)

1 — Registrierung in drei Schritten. Belegt A1 (3-seitiger Assistent, nur Seite 1 Pflicht), A2 (Skills/Regionen) und das erfolgreiche Anlegen.
Nachstellen:
  1. Abgemeldet https://solcom.ddev.site/projektportal/registrieren öffnen.
  2. Seite 1: E-Mail, Passwort, Vor-/Nachname, Datenschutz- und AGB-Häkchen → „Weiter“.
  3. Seite 2 (optional): Verfügbarkeit, Regionen → „Weiter“. Seite 3 (optional): Qualifikationen → „Registrierung abschließen“.
  4. Erwartung: Bestätigungsseite „Bitte E-Mail prüfen“; das Konto ist noch nicht aktiv.
2 — Bestätigungs-Mail, Aktivierung & erster Login. Belegt A3 (Double-Opt-in aktiviert das Konto) und A4 (Login über die gebrandete Portal-Maske, nicht die Verwaltungs-Anmeldung).
Nachstellen:
  1. Postfach öffnen (lokal Mailpit: https://solcom.ddev.site:8026), Mail „Projektpartner-Account verifizieren“ öffnen, Bestätigungslink klicken.
  2. Erwartung: Weiterleitung auf /user/login, Konto ist aktiv, Willkommens-Mail wird versendet.
  3. Mit E-Mail + Passwort anmelden. Erwartung: eingeloggt, ohne je die Drupal-Verwaltungsanmeldung (/user/login) zu sehen.
3 — Validierung pro Schritt. Belegt A6: Pflichtfelder und die Doppel-E-Mail-Abfrage werden je Seite geprüft, mit Fehlermeldung am Feld.
Nachstellen:
  1. Registrierung öffnen, Seite 1 mit leeren Pflichtfeldern absenden → Feldfehler erscheinen.
  2. Eine bereits registrierte E-Mail eingeben → Hinweis „E-Mail bereits vergeben“ (kein Sprung auf eine andere Seite).
4 — Passwort vergessen (Selbstservice). Belegt A5: Reset-Link per E-Mail, neues Passwort setzen, anmelden.
Nachstellen:
  1. Auf /user/login „Passwort vergessen“ wählen, E-Mail eingeben.
  2. Reset-Mail öffnen, Link folgen, neues Passwort vergeben. Erwartung: Anmeldung mit dem neuen Passwort gelingt.

Selbstservice nach Login (B1, B5, B6)

5 — Profil nachträglich bearbeiten. Belegt B1: Stundensatz und Verfügbarkeit ändern und speichern. Dieses Speichern löst zugleich die Vertriebs-Mail aus (D4, Salesforce-Übergangslösung).
Nachstellen:
  1. Eingeloggt das eigene Profil bearbeiten (derzeit nur per Direkt-Link /profile/9/edit erreichbar — siehe Navigations-Lücke in Abschnitt 9).
  2. Stundensatz und Verfügbarkeit ändern → „Speichern“.
  3. Erwartung: Werte sind gespeichert; an den Vertrieb geht eine Mail mit den geänderten Feldern (alt → neu).
6 — Suchagent einrichten. Belegt B5: gesuchte Skills + Einsatz-Regionen wählen, Suchagent aktiv, speichern. Pro Person bleibt es bei genau einem Suchagenten (Aktualisierung statt Duplikat).
Nachstellen:
  1. Eingeloggt /mein-profil/suchagent öffnen.
  2. Skills und Region(en) wählen, „Suchagent aktiv“ setzen → „Suchagent speichern“.
  3. Erwartung: Bestätigung, genau ein Suchagent pro Person. Bei passenden neuen Projekten kommt eine Benachrichtigungs-Mail (separat end-to-end geprüft, siehe Abschnitt 4, B5b).
7 — Projekt merken & Merkliste. Belegt B6: auf einer Projektseite „merken“, danach erscheint das Projekt auf der Merkliste. Die Merkliste wird serverseitig pro Person gespeichert, also geräteübergreifend.
Nachstellen:
  1. Eingeloggt ein Projekt unter /fuer-freiberufler/projektliste/… öffnen, „Zur Bewerbungsliste hinzufügen“ klicken (Schalter wechselt auf „In meiner Bewerbungsliste“).
  2. /projektportal/merkliste öffnen. Erwartung: das gemerkte Projekt wird angezeigt; bereits abgelaufene Projekte werden sauber als „nicht mehr verfügbar“ ausgewiesen statt zu verschwinden.

Beobachtung zur Benennung: derselbe Merkliste-Mechanismus heißt an drei Stellen unterschiedlich — „Bewerbungsliste“ auf dem Schalter, „Merkliste“ als Seitentitel, „In meiner Projektliste“ auf der Merklisten-Karte. Empfehlung in Abschnitt 9.

8. Automatisierte Test-Belege

Voller PHPUnit-Lauf über beide Module (solcom_projektpartner + solcom_projektpartner_alert), Kernel + Unit + Functional:

grün 79 Tests · 1.793 Assertions · 0 Errors · 0 Failures (Deprecations sind Framework-Hinweise von Drupal-Core/Contrib, keine Fehler).

Befehl: phpunit web/modules/custom/solcom_projektpartner/tests/{Kernel,Unit,Functional} web/modules/custom/solcom_projektpartner_alert/tests in DDEV.

Dieser eine Lauf belegt die nicht per Live-Dogfood geprüften Kriterien gemeinsam:

AKBelegender Test
C1/C2ProjektpartnerRoleSeparationTest (Kernel) + ProjektpartnerRoleSeparationAccessTest (Functional) — Redakteur behält Standard-Formular, Registrierungs-Route nur anonym.
B2PrivateDocumentAccessTest (Kernel) — Eigentümer/Admin Zugriff, Fremd/Anonym 403, URI privat.
B4ProjektpartnerAccountDeletionTest (Kernel) — Benutzer + Profil + private Dateien physisch entfernt.
D1NeosSqlSourceTest + NeosPrivateDocumentsTest (Kernel) — Quell-Read aus real-strukturierter Neos-Fixture + Dokument-Kopie.
D2ProjektpartnerBestandsnutzerActivationTest (Functional) — Erst-Login erzwingt Passwort-Reset, danach normaler Zugriff.
D4ProfileChangeSfSyncTest (Kernel) — Profil-Änderung erzeugt genau einen Sync-Queue-Eintrag + Diff-Mail an Vertrieb.
A1/A3/A4/A6RegistrationWizardConfigTest, RegistrationSubmitterTest, MailFlowTest, ProjektpartnerLoginTest (Kernel).
B5PppAlertMatcherTest, PppAlertCronWorkerTest, PppAlertMailManagerTest, PppAlertUniqueConstraintTest, PppAlertInstallPermissionTest.
B6WatchlistStorageTest + WatchlistControllerJsonApiTest (Kernel, Modul solcom_project_offer) — serverseitige Speicherung in users.data, Nutzer-Isolation, Hinzufügen/Entfernen idempotent. Eigener Lauf: grün 19 Tests · 120 Assertions.

9. Empfehlungen (Entscheidung offen)

Portal-Startseite / Navigation nach Login (Lücke #4). Alle Selbstservice-Funktionen (Profil, Unterlagen, Suchagent, Merkliste) funktionieren, sind aber nach dem Login nicht zentral verlinkt. Die Informationsarchitektur sieht dafür bereits die Seite „Mein Projektpartnerprofil“ (/mein-projektpartnerprofil) vor — derzeit eine leere Canvas-Stub-Seite. Empfehlung zur Abstimmung: diese Canvas-Seite mit Kacheln/Links zu Profil bearbeiten, Suchagent, Merkliste, Abmelden und Konto löschen redaktionell füllen und den Login-Redirect dorthin lenken. Da Canvas-Seiten bewusst lokal/redaktionell gepflegt werden (Entscheidung vom 2026-05-17), ist das Inhaltsarbeit, kein Code — daher hier als Empfehlung, nicht eigenmächtig umgesetzt.

Update 2026-06-17 umgesetzt (ADR-0053): Account-Menü-Links „Mein Profil", „Suchagent", „Merkliste" ergänzt; nach Login werden Projektpartner auf das eigene Profil (ID-lose Route /projektportal/profil) geleitet. Die redaktionelle Hub-Seite unter /projektportal bleibt der Content-Schritt (Login-Redirect dann einzeilig umstellbar). Browser-verifiziert.

Verwaltungs-Oberfläche für eingeloggte Endnutzer sichtbar Härtung vor Go-Live

Jeder eingeloggte Nutzer — auch der Freiberufler Max — sieht auf den Selbstservice-Seiten eine Verwaltungs-Leiste: die linke Admin-Seitenleiste, das Admin-Design auf Formular-Seiten und das Schnellsuch-Werkzeug „Coffee“. Ursache ist die Standard-Rolle „Authentifizierter Benutzer“, die alle eingeloggten Nutzer tragen und die vier verwaltungsnahe Rechte enthält: access navigation, view the administration theme, access administration pages, access coffee. Diese Rechte stehen in der versionierten Konfiguration (config/sync/user.role.authenticated.yml) und würden so auch live ausgeliefert.

Profilformular mit zusätzlicher Verwaltungs-Seitenleiste links
Profil bearbeiten: der dunkelblaue, gebrandete Formularbereich ist die Endnutzer-Ansicht; die helle Leiste links (Drupal-Logo, „Help“, Profil-Menü) ist das durchgereichte Admin-Chrome.

Einordnung: Das ist keine Rechte-Ausweitung — Max bekommt keine Fähigkeit über seine Projektpartner-Rechte hinaus. access administration pages öffnet nur das /admin-Menü, dessen Einzelseiten weiterhin je einzeln rechtegeprüft sind (Max' /admin bleibt praktisch leer). Sichtbar ist also Admin-Optik, kein Admin-Können. Trotzdem widerspricht es dem Ziel „nur Frontend-Hülle“ und wirkt unfertig.

Warum nicht direkt behoben: Die betroffene Rolle ist seitenweit und wird auch von Redakteuren getragen; Drupal-Rollen sind rein additiv (es gibt kein rollenweises „Entziehen“). Die Rechte einfach zu streichen würde den Redakteuren ihren legitimen Verwaltungszugang nehmen. Sauber ist, diese vier Rechte von „Authentifizierter Benutzer“ auf die konkreten Redaktions-/Admin-Rollen zu verschieben — eine seitenweite Architektur-Entscheidung außerhalb des Portal-Tickets. Empfehlung: eigenes Ticket, vor Go-Live.

Zusätzlich auf derselben Rolle: skip CAPTCHA und bypass honeypot protection. Für eingeloggte Nutzer ist das eine gängige, oft bewusste Einstellung — bitte nur kurz bestätigen, dass sie gewollt ist.

Update 2026-06-17 umgesetzt (ADR-0053): Die vier Rechte wurden von „Authentifizierter Benutzer“ auf content_editor/content_manager verschoben. Projektpartner sehen kein Admin-Chrome mehr; /admin liefert für sie 403. Browser-verifiziert (body-class ohne gin--core-navigation, „Zugriff verweigert“ auf /admin). skip CAPTCHA + bypass honeypot protection bewusst auf authenticated belassen — bitte bestätigen.

Einheitliche Benennung der Merkliste Kleinigkeit

Derselbe „Projekt merken“-Mechanismus trägt drei verschiedene Bezeichnungen: „Bewerbungsliste“ auf dem Schalter der Projektseite, „Merkliste“ als Seitentitel und Menü-Ziel, und „In meiner Projektliste“ auf der Karte in der Merkliste. Für Endnutzer wirkt das wie drei verschiedene Funktionen. Empfehlung: auf einen Begriff festlegen (Vorschlag: durchgängig „Merkliste“) und Schalter-Beschriftungen angleichen.

Update 2026-06-17 umgesetzt (ADR-0053): Durchgängig „Merkliste“ — „Bewerbungsliste“, „In meiner Projektliste“ und „Zu meiner Projektliste“ ersetzt in beiden Node-Templates, beiden SDC-Komponenten, dem JS und den Canvas-Configs.