# RX-P6-012 – Direct Discovery Runtime Evidence v2

## Ziel

Profilelose/direct Candidate Discovery (aktuell insbesondere Lobid/GND) erzeugt bei vorhandenem `ReconciliationRunItem` dieselbe grundlegende Runtime Evidence wie profile-basierte Discovery:

- `discovery_step_execution`
- gepufferte Candidate Step Evidence
- nach Candidate-Persistenz `candidate_discovery_evidence`

Es wird **kein GND-spezifisches DiscoveryProfile** eingeführt und keine GND-spezifische Scoring-Semantik ergänzt.

## Änderung

Geändert:

`src/Infrastructure/Discovery/Profile/ProfileSelectingCandidateDiscoveryGateway.php`

Wenn kein `DiscoveryProfile` aufgelöst wird:

1. Ohne `reconciliationRunItemId`: bisheriges direct Verhalten unverändert.
2. Mit `reconciliationRunItemId`:
   - `DiscoveryStepExecution` mit `step_key = direct-discovery`, `sequence = 0` starten.
   - neue `discoveryStepExecutionId` in einen kopierten `ReconciliationCommand` einsetzen.
   - normalen `stepDiscovery`/Router ausführen.
   - Candidates über `recordStepCandidates()` puffern.
   - Step über `finish()` abschließen.
   - bei Exception `fail()` setzen.

Wichtig gegenüber v1: Es gibt **keinen Guard auf eine bereits vorhandene `discoveryStepExecutionId`**. Der profilelose Gateway-Pfad ist Owner der direct Discovery Execution und erzeugt bei vorhandenem RunItem genau einen eigenen Step.

## CandidateDiscoveryEvidence

`PdoDiscoveryExecutionRecorder` bleibt unverändert. `ReconciliationApplicationService` ruft nach Persistence der `CandidateItem`s bereits `materializeCandidateEvidence()` auf. Dadurch werden die für den Direct Step gepufferten Candidates anhand ihrer URI materialisiert.

Für Lobid bleiben `matched_value`, `matched_value_role`, `matched_value_language` weiterhin `NULL`, solange der Provider/Adapter dafür keine belastbare Evidence liefert.

## Test

Neu:

`tests/Infrastructure/Discovery/Profile/DirectDiscoveryEvidenceTest.php`

Der Test verifiziert für einen profilelosen GND-artigen Request:

- `start(99, 'direct-discovery', 0)`
- Weitergabe von `reconciliationRunItemId = 99`
- Injection von `discoveryStepExecutionId = 4711` in den Router-Command
- `recordStepCandidates()`
- `finish()`

Ausgeführt und erfolgreich:

```text
RX-P6-012 Direct Discovery Runtime Evidence: OK
RX-DP-003 Phase 3.4 Discovery Profile Selection: OK
```

Ein Lauf aller vorhandenen PHP-Tests ergibt weiterhin bereits im Ausgangsstand vorhandene/unabhängige Fehler, u.a. fehlende lokale `config/database.php`, fehlende mbstring-Funktion, veraltete RuntimeFactory-Testsignaturen und auf alte Profile-Namen bezogene WNK02-Tests. Diese Fehler wurden durch RX-P6-012 nicht bearbeitet.

## Erwartung beim OR-Test mit Lobid/GND

Nach einem einzelnen persistenten GND-RunItem sollte mindestens entstehen:

```text
reconciliation_run_item
  -> discovery_step_execution
       step_key = direct-discovery
       sequence = 0
       status = EXECUTED
  -> candidate_discovery_evidence (für persistierte Candidates)
```
