# YachtMemory – Derived Writers / Phase 2B

Phase 2B verlegt ausschließlich die Persistenz der Ankerplatz-Ableitungen
aus der Telemetrie-Datenbank nach `yachtmemory_derived.anchorages`.

Die Erkennungs-, Merge-, Bewertungs- und Geocoding-Logik der gelieferten
Rebuild-Skripte bleibt unverändert.

## Routing

```text
vessel_key
   |
TelemetryDbRouter
   |-- vessel_id ---------------------> yachtmemory_derived.anchorages
   |
   `-- telemetry_db_name ------------> ENVdata
```

## Full-Rebuild

Statt `TRUNCATE TABLE Anchorages` wird ausschließlich der Bestand des
betroffenen Schiffs gelöscht:

```sql
DELETE FROM anchorages
WHERE vessel_id = :vessel_id
```

`ENVdata` wird über `$telemetryPdo` gelesen. Inserts gehen über
`$derivedPdo` und enthalten `vessel_id`.

## Incremental

Auch Rückblick, Delete, Nummernermittlung und Insert sind auf `vessel_id`
begrenzt. `ENVdata` bleibt in der schiffsspezifischen Telemetrie-DB.

## Aufruf

Die Web-API übergibt `vessel_key` explizit an den CLI-Prozess. Der
CLI-Prozess löst das Schiff anschließend selbst über `TelemetryDbRouter`
auf. Damit hängt die Verarbeitung nicht von einer PHP-Websession im
Kindprozess ab.

Die bestehenden Silent-Sea-Wrapper setzen explizit:

```php
$anchorageVesselKey = 'silent_sea';
```

## Installation

```bash
cd /var/www/app.yachtmemory.net
unzip yachtmemory_derived_writers_phase2B.zip
cd yachtmemory_derived_writers_phase2B
sudo ./install.sh /var/www/app.yachtmemory.net
```

Der Installer führt absichtlich **keinen** Full- oder Incremental-Rebuild
aus. Er erstellt Backups und prüft Syntax sowie Routing statisch.

## Danach

Als erster produktiver Funktionstest sollte der Full-Rebuild für
`silent_sea` bewusst ausgelöst werden. Anschließend vergleichen wir den
neu erzeugten Derived-Bestand mit dem bisherigen Legacy-Bestand in
`SilentMessDB.Anchorages`.

Die Legacy-Tabelle wird in Phase 2B nicht gelöscht.

## Bewusst nicht Teil von Phase 2B

- keine Änderung der Anchorage-Erkennungslogik
- keine Angleichung Incremental an Full-Rebuild
- keine Reader-/Widget-Umschaltung
- keine Löschung von `SilentMessDB.Anchorages`

Die Vereinheitlichung von Full und Incremental bleibt ein eigener späterer
Schritt.
