YachtMemory - StayProcessingService v1
========================================

Purpose
-------
First manual orchestration layer above the frozen processing components.

Flow in APPLY mode:
StayProcessingWriter::planForVessel()
 -> StayProcessingWriter::apply()
 -> StayProcessingSelector::selectDueEnrichment()
 -> StayProcessingEnrichmentWorker::runDue()

DRY RUN mode:
- builds the real reconciliation plan
- reads due enrichment work
- DOES NOT call StayProcessingWriter::apply()
- DOES NOT invoke the worker
- therefore performs no DB writes

No SQL migration.
No systemd.
No stay_processing_runs table.
No geography/classification worker.
No portal start/stop.

Install
-------
unzip -o YachtMemory_StayProcessingService_v1.zip

Syntax:
php -l src/services/StayProcessingService.php
php -l shared_dashboard/scripts/run_stay_processing.php
php -l shared_dashboard/scripts/verify_stay_processing_service.php

First validation - READ ONLY:
php shared_dashboard/scripts/verify_stay_processing_service.php

Expected on the currently reconciled Silent Sea baseline:
plan_insert: 0
plan_update: 0
all plan rows UNCHANGED
due_enrichment_before_worker: 0
worker_invoked: NO
RESULT: OK
DB writes: NONE

Manual runner - DRY RUN:
php shared_dashboard/scripts/run_stay_processing.php --vessel-id=1 --dry-run

Do NOT run APPLY mode until the DRY RUN result has been reviewed:
php shared_dashboard/scripts/run_stay_processing.php --vessel-id=1
