# Roleplay Core: lokale runtime en cloudsynchronisatie

## Beschikbaarheidsgrens

MariaDB/InnoDB via oxmysql is de bron van waarheid voor gameplay. Een
gameplaymutatie wacht nooit op de SaaS-API of bridge. `platform-core` commit de
nieuwe aggregateversie en het bijbehorende cloudevent atomisch. Clouduitval
vergroot alleen de lokale outbox.

Vereisten:

- oxmysql 2.12.0 of hoger;
- een lokale of LAN-bereikbare MariaDB/MySQL-database met InnoDB;
- `ensure oxmysql` vóór `ensure platform-core`;
- bridge 0.9.0 voor signed resourceconfig en idempotente eventhandoff.

## Lokale tabellen

| Tabel | Doel |
| --- | --- |
| `gc_rp_aggregate_state` | Lokale state met monotone versie en payloadhash |
| `gc_rp_config_cache` | Geverifieerde configrevisies; één actieve revisie |
| `gc_rp_cloud_outbox` | Levering met lease, retries en deliverystatus |
| `gc_rp_cloud_inbox` | Inbound deduplicatie op event-ID en payloadhash |
| `gc_rp_sync_conflicts` | Versie-, payload- en signingconflicten |
| `gc_rp_schema_migrations` | Migratie-ID en vaste SHA-256-checksum |

Er bestaat bewust geen algemene SQL-export.

## Signed configuratie

De API ondertekent een Ed25519-envelope met server-ID, resourcenaam, revisie,
versie, uitgiftetijd en configuratie. De bridge verifieert en bewaart de
envelope atomisch op disk. `platform-core` verifieert opnieuw, pint de publieke
signing key en cachet de canonical payload lokaal.

De actieve cache blijft ongewijzigd bij een ongeldige handtekening, onverwachte
signing key, oudere revisie of dezelfde revisie met een andere payload.

## Outbox en reconnect

Outboxstatussen zijn `PENDING`, `SENDING`, `DELIVERED`, `FAILED` en `CONFLICT`.
Een worker claimt maximaal 100 events met een lease van 60 seconden. Verlopen
leases worden hersteld. Mislukte levering gebruikt begrensde exponential
backoff. De oorspronkelijke `evt_roleplay_*`-ID gaat mee naar de bridge en API,
zodat een retry geen tweede cloudgebeurtenis oplevert.

## Conflicten

- Gameplay gebruikt optimistic concurrency met een exacte `expectedVersion`.
- Dezelfde event-ID met een andere payloadhash wordt geweigerd en geaudit.
- Inbound events worden op ID en payloadhash gededupliceerd.
- Configrevisie- en signing-keyconflicten behouden de laatst geldige cache.

Open conflicten zijn via `listSyncConflicts` beschikbaar. Automatisch
last-write-wins is niet toegestaan.

## Testdekking

Tests simuleren clouduitval, lokale commits tijdens uitval, signed-configcache,
reconnect, eenmalige levering, versionconflicten, ongeldige handtekeningen en
inbound deduplicatie. De bridge-test controleert dat dezelfde idempotente
event-ID maar één keer in de persistente bridge-outbox komt.
