solcom-lfg Step-4 Review — mp/P2503-90 Pfad A
Vacancy Application · direkter Personio-Recruiting-API-POST · PR #165066 → develop · Fixed-Point origin/develop · 2026-05-30
VERDICT: CLEAN — keine BLOCKERS, review-ready
Layer-Evals
| Gate | Ergebnis |
|---|---|
| PHPUnit Kernel (gesamtes Modul) | OK 24 Tests / 183 Assertions, 0 Failures, 0 Errors |
| phpcs (Drupal,DrupalPractice) | clean 0/0 |
| phpstan level 6 | 0 Errors |
| drush cr | success |
Assessments
- Security — sound. Apply-Route via
VacancyApplicationController::access()gegated (bundle=vacancy +isPublished(), mitaddCacheableDependency($node)auf allen Branches nach Fix). DLQ-Routes tragen_permission: 'manage karriere dlq'(restrict access: true). State-ändernde DLQ-Aktionen viaConfirmFormBase(CSRF-Token, S-7). Credentials auskey-Modul, nie geloggt (nur Key-Entity-IDs in Error-Messages). - State-Machine — intakt. S-5-Invariante gehalten:
retry_count+statuswerden via$submission->save()vor demDelayedRequeueException-Throw persistiert; der Enqueue-Guard inApplicationQueueHandler::postSave()bricht früh ab, wennstatus !== ''→ kein Re-Enqueue-Loop bei Worker-Saves. - Idempotenz — HMAC-Idempotency-Key deterministisch pro Submission, distinkt über Submissions (Kernel-Test-verifiziert).
Advisory-Findings (non-blocking)
| # | Finding | Disposition |
|---|---|---|
| 3 | VacancyApplicationController::access() bundle-mismatch-Branch fehlte addCacheableDependency($node) (Cache-Korrektheit) | FIXED commit 4709bc7 |
| 1 | DlqAdminController loadByProperties lädt alle vacancy_application-Submissions, filtert in PHP (OOM-Risiko bei Skalierung) | WORKLOG entschärft durch GDPR-Purge (2xx löscht erfolgreiche → Tabelle bleibt klein); sauberer Fix braucht Data-Table-Join → Follow-up |
| 2 | ApplicationQueueHandler nutzt @WebformHandler-Annotation statt PHP-8-Attribut | SKIP Webform-Contrib liefert (noch) kein #[WebformHandler]-Attribut; Annotation ist der aktuelle korrekte Weg |
| 4 | PersonioSmokeTestCommands sleep(10) hardcoded vor Read-back (CI-Footgun) | WORKLOG Smoke läuft nicht in CI (Mock); konfigurierbar = YAGNI |
Residuals (durabel im PR-Body)
- Functional-Suite geblockt — pre-existing, projektweit: BrowserTestBase-Massen-Install des
solcom_vacancy-Dependency-Trees scheitert annode_make_sticky_actionConfig-Install-Ordering. Functional-Tests (Apply 200/403, DLQ-Access 403/200) sind geschrieben + korrekt; der honeypot-info.yml-Fix hat den ersten Blocker (UnmetDependenciesException) bereits behoben. Out-of-scope für P2503-90. - v2-GET-Existence-Check-Idempotenz-Fallback deferred (Credentials absent, v2-Recruiting gated/read-only; X-Idempotency-Key-Header ist der contractual Mechanismus).
- Personio-Credentials rotieren vor Go-Live (während Grilling exposed).
Fazit
Der PR ist review-ready: CLEAN-Verdikt, Security + State-Machine sound, alle Layer-Evals grün, das eine clean-fixbare Advisory (#3) ist behoben, der Rest durabel als Worklog/Residual notiert. Der Merge bleibt menschlich (Memory feedback_ki_merged_nicht_bis_mr). Jira-Transitions zu „Zu Review" liegen als Entwurf zur User-Approval vor (kein autonomes Posten).