# WP2-002 – Composition Root

**Status:** Implementiert  
**Grundlage:** `ADR001-WP2-002-COMPOSITION-ROOT.md`  
**Architekturreview:** Accepted with minor clarifications
**Note PL** Abgeschlossen ca. 2026-07-19 22:00

## Ziel

Die konkrete Objektverdrahtung des OpenRefine-Reconciliation-Endpunkts wird aus
`public/reconcile.php` in einen spezifischen Composition Root ausgelagert.

## Umsetzung

Neu eingeführt wurde:

```text
App\Infrastructure\Composition\ReconciliationCompositionRoot
```

Der Composition Root erzeugt den application-scoped Objektgraphen:

- `ProviderRegistry` und bestehende Provider,
- `ReconciliationOrchestrator`,
- `RuntimeFactory`,
- `ApiKeyAuthenticator`,
- `ManifestBuilder`,
- OpenRefine Mapper,
- `PreviewRenderer`,
- `ReconciliationController`.

Die öffentliche API ist bewusst auf folgende Methode begrenzt:

```php
createController(): ReconciliationController
```

Es wurde weder ein DI-Container noch eine generische Service-Auflösung oder ein
Service Locator eingeführt.

## Abgrenzung der Lebensdauern

Der `ReconciliationCompositionRoot` erzeugt den stabilen HTTP-Objektgraphen.
Die `RuntimeFactory` bleibt unverändert für processing-unit-scoped Objekte
zuständig und erzeugt pro authentifizierter Verarbeitungseinheit:

- `RuntimeContext`,
- tenantbezogenen `LegacyCandidateDiscoveryAdapter`,
- `ReconciliationApplicationService`.

## Front Controller

`public/reconcile.php` übernimmt weiterhin:

- PHP-Fehler- und Logging-Konfiguration,
- Laden des Bootstrap,
- Laden und Validieren der `Configuration`,
- bestehendes Request-Debug-Logging,
- Erzeugen des Composition Root,
- Aufruf des Controllers.

Die direkte Assembly von Providern, Registry, Orchestrator, Factory, Mappern,
Renderer und Controller-Abhängigkeiten wurde entfernt.

## Test

Neu:

```text
tests/Composition/ReconciliationCompositionRootTest.php
```

Der Test prüft:

- Erzeugung mit gültiger `Configuration`,
- Rückgabe eines `ReconciliationController`,
- Aufbau des Objektgraphen ohne HTTP-Superglobals,
- keine fachliche Ausführung während der Assembly.

Die bestehenden WP1- und WP2-001-Tests bleiben unverändert.

## Nicht Bestandteil

- Änderung öffentlicher OpenRefine-Verträge,
- Provider-Redesign,
- Domain- oder Application-Änderungen,
- neue Konfigurationsformate,
- Überarbeitung des Request-Debug-Loggings.

Der Hinweis von LA zur möglichen Protokollierung sensibler Request-Daten wird
separat außerhalb von WP2-002 behandelt.
