# Jobs en societies

Roleplay Core 0.9.0 levert een server-authoritative jobsysteem met grades,
whitelisting, duty status, salarissen, societyrekeningen, societyinventory en een
in-game bossmenu. De control-plane gebruikt bridge 0.13.0 en de capability
`jobs-societies-v1`.

## Datamodel en migratie

Migratie `008_jobs_societies.sql` maakt `gc_rp_jobs`, `gc_rp_job_grades` en
`gc_rp_job_audit`. Assignments blijven in `gc_rp_job_assignments`. Toewijzingen
en dutywijzigingen gebeuren in een InnoDB-transactie en schrijven in dezelfde
grens een auditregel en transactionele cloud-outboxevent.

De cloud bewaart de organisatiecatalogus, grades en een realtime projectie van
iedere serverassignment. Daardoor toont het paneel medewerkers, duty status,
payroll en jobstatistieken zonder dat gameplay afhankelijk wordt van de cloud.

## Society en salaris

Bij publicatie van een job maakt de runtime idempotent:

- `acct:society:<job>:society:EUR`;
- een `SOCIETY`-inventorycontainer;
- salary schedules per medewerker.

Salarissen van werkenden worden uit de societyrekening geboekt. Alleen de
fallbackjob `unemployed` gebruikt de system treasury. De economy-ledger blijft
double-entry en idempotent.

## Rechten en bossmenu

Grades hebben een expliciete permission-map en maximaal één bossgrade. De
runtime valideert bossrechten opnieuw voor iedere actie; de NUI is nooit
authoritatief. `/bossmenu` ondersteunt aannemen, ontslaan, promoveren/degraderen
en factureren aan een character. `/duty` wisselt de eigen duty status.

Het paneel gebruikt uitsluitend `JOB_MANAGE`-commands. Er bestaat geen remote
shell of generieke code-executie. Cataloguswijzigingen, assignments, ontslag en
duty-acties vereisen organisatiepermissie, serverbinding en de onderhandelde
capability.

## Realtime synchronisatie

De lokale outbox verstuurt `job.assignment.changed` en `job.duty.changed`.
De API projecteert deze idempotent op `(serverId, characterLocalId)` en publiceert
`jobs.updated` alleen naar de geautoriseerde organisatieroom.
