|
Guardianship Fase 0+1: de echte multi-party handshake (FEP-633c §3)
De eerste versie committeerde na één accept. Nu de spec: geen enkele partij
maakt een voogdij alleen, en een nieuwe guardian erbij kan niet zonder
toestemming van de bestaande. Daemon als blauwdruk, zodat Klonkt en de
test-daemon exact hetzelfde gedragen en de Shaer-clients één contract lezen.
Fase 0 (datamodel): ap_guardian_offers (per lokale partij een kopie van de
handshake, PK slug+offer_id) + ap_guardian_offer_accepts (de accept-tally).
ap_guardianships houdt alleen nog de GECOMMITTE relaties.
Fase 1 (state-machine): offers.js is een getrouwe port van de daemon-Handshake
(accepts over ward+candidate+existing; ready = ward && candidate && (geen
existing OF >=1 existing); een Reject voidt). handshake.js orchestreert het
gedistribueerd: de kandidaat adresseert de Offer aan ward + alle bestaande
guardians (§3.1.1); elke Accept wordt aan alle andere partijen gebroadcast, dus
elke instance-kopie convergeert; zodra een kopie compleet is committeert die
lokaal (ward schrijft shaer:guardians, guardian schrijft z'n ward), met de
kandidaat-inbox als handle (§6). Volgorde-onafhankelijk.
Ook: §1 wederzijdse uitsluiting (een ward is nooit ook guardian in het
actor-doc), de queues vullen nu de echte accept-tally (needsMyAccept/
readyToCommit/acceptedBy/existingGuardians), en de PWA + Berichten beantwoorden
via de C2S Accept/Reject-pijplijn per offer-id. De co-guardian ziet een
mede-voogdij-aanvraag met accepteer/weiger in de PWA.
Changed files:
src/config/database.js
- tabellen ap_guardian_offers + ap_guardian_offer_accepts
src/services/guardianship/offers.js (NEW)
- de handshake-state-machine (daemon-port), per-instance in SQLite
src/services/guardianship/relations.js
- alleen commit-writers + actor-props (§1 uitsluiting)
src/services/guardianship/handshake.js
- gedistribueerde multi-party C2S/S2S orchestratie
src/services/guardianship/queues.js
- offers-queue uit de state-machine
src/services/guardianship/index.js
src/services/ActivityPubService.js
- wire localSlug + fetchActor; inbound-routing naar alle lokale partijen
src/routes/guardian.js
- dashboard toont offers met tally; POST /guardian/offer (accept/reject)
src/routes/posts.js
- Berichten toont ward-offers uit de state-machine; accept via offer-id
src/views/pages/messages.ejs, src/assets/js/guardian.js, src/assets/css/guardian.css
- offer-kaarten per state (mijn aanvraag / mede-voogdij / wachten)
src/services/i18n.js
- accept/reject/complete/coguard + co-guardian push (nl/en/de)
test/guardianship.test.js
- multi-party: eerste guardian, co-approval bestaande guardian, reject
voidt, ward-mag-niet-guarden, vaste initiator
remarks: Fase 2 (follow-gating), 3 (hasGuardians + Not-a-Teapot), 4 (Undo/
emancipatie) volgen. 164 tests groen.
-robo
Co-Authored-By: Claude Opus 4.8 <noreply@…>
|