Ignore:
Timestamp:
08/08/2026 08:27:03 PM (4 weeks ago)
Author:
roboburr <roboburr@…>
Branches:
main
Children:
ea211b9
Parents:
d1075a1
git-author:
Robin <roboburr@…> (08/08/2026 08:27:01 PM)
git-committer:
roboburr <roboburr@…> (08/08/2026 08:27:03 PM)
Message:

De volgpoort zat alleen in de app, en volgverzoeken beslissen bij meerderheid

Barts twee meldingen (8-8), en de eerste is een echte vondst.

  1. WAAROM ESMEE'S VOLGVERZOEKEN NOOIT AANKWAMEN

Niet wat Bart vreesde -- het was niet zo dat alleen een intern account ze kon
beantwoorden. Die weg werkt: gateOutgoingFollow levert een Offer af bij een
guardian elders, en dat is precies wat dev als guardian van @mee had moeten
krijgen.

Er kwam alleen nooit iets om af te leveren. De poort stond in case 'Follow' van
de C2S-outbox, dus alleen als je via Shaer volgt. Volgde het kind vanuit Klonkts
eigen webinterface, dan werd er geen verzoek aangemaakt, ging er niets naar de
guardians, en was er dus ook niets te beantwoorden. Op dev staat geen enkele rij
in ap_follow_reviews en nergens een follow-approval-regel in de log.

Exact dezelfde deur-naast-de-poort als bij de antwoordpoort vanmiddag: de gate in
C2S, het webpad eromheen. De controle staat nu in followActor zelf, NA het
oplossen van de handle -- zou hij alleen naar de ruwe invoer kijken, dan is elke
@naam@server een sluiproute. approved is de enige doorlaat, voor
performApprovedFollow; zonder dat stuit een goedgekeurd verzoek opnieuw op de
poort en wacht het voor eeuwig.

Drie webroutes zeiden "Je volgt nu X" terwijl het verzoek bij de guardians lag.
Dat is de leugen die de poort waardeloos maakt: het kind denkt dat het gebeurd
is. Er is nu een derde uitkomst.

DE MUTATIE GAF EERST NUL FOUTEN -- er stond niets op deze poort. Nu vier toetsen,
inclusief het handle-geval en het goedgekeurde pad.

  1. VOLGVERZOEKEN BIJ EENVOUDIGE MEERDERHEID

Barts besluit: 1 van 2 is voldoende. followThreshold = ceil(n/2), voor beide
richtingen, want "mag dit kind met deze persoon te maken hebben" is dezelfde
vraag en twee drempels zou een guardian nooit kunnen uitleggen.

BEWUST SOEPELER DAN DE POORTDREMPEL (2 van 2): een gate opent een deur voor alles
wat daarna komt, een volgverzoek gaat over een persoon en is met ontvolgen terug
te draaien. En het is geen versoepeling maar een AANSCHERPING -- dit stond op
'any', een enkele ja hoeveel guardians er ook waren.

De 'all'-stand is weg: hij werd nergens gezet, dus was het een keuze die niemand
kon maken. De toets die hem bewaakte is herschreven, niet verwijderd.

Race naar de drempel zoals de poorttelling, met dezelfde TODO erbij (shaer-8vt):
wie antwoordt weet niet dat hij de doorslag geeft.

Suite 742/742; beide mutaties rood.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/services/guardianship/follows.js

    rd1075a1 r3a0ca0f  
    5050 * send the Accept/Reject. A single reject denies; approvals meet the quorum.
    5151 */
     52/**
     53 * Hoeveel guardians moeten ja zeggen voor een volgverzoek (Barts besluit, 8-8).
     54 *
     55 * EENVOUDIGE MEERDERHEID: 1 van 1, 1 van 2, 2 van 3, 2 van 4. Bart: "1/2 is
     56 * voldoende."
     57 *
     58 * BEWUST SOEPELER DAN DE POORTDREMPEL, en dat verschil hoort uitgelegd. Een gate
     59 * opent een deur voor alles wat daarna komt; die vraagt om een STRIKTE
     60 * meerderheid (thresholdFor in gated.js: 2 van 2, 3 van 4). Een volgverzoek gaat
     61 * over een persoon, is met ontvolgen terug te draaien, en stond hier tot vandaag
     62 * op 'any' -- een enkele ja, hoeveel guardians er ook waren. Dit is dus geen
     63 * versoepeling maar een AANSCHERPING voor iedereen met drie of meer guardians.
     64 *
     65 * De 'all'-stand die hier stond is weg. Hij werd nergens gezet -- elke schrijver
     66 * gaf 'any' mee -- dus het was een keuze die niemand kon maken en die alleen in
     67 * de weg stond bij het lezen van deze regel.
     68 */
     69export function followThreshold(setSize) {
     70  return Math.max(1, Math.ceil(setSize / 2));
     71}
     72
     73/**
     74 * Een race naar de drempel, net als de poorttelling: zodra het aantal gehaald
     75 * is, is het besluit gevallen.
     76 *
     77 * TODO (shaer-8vt): wie antwoordt weet niet dat hij de doorslag geeft. Bij 1 van
     78 * 2 is de eerste ja meteen de beslissing, en het scherm zegt dat nergens. Dat is
     79 * hetzelfde gat als bij de gate-voorstellen en het hoort daar samen opgelost.
     80 */
    5281export function decide(id, guardianUri, decision, guardiansOfWard) {
    5382  const follow = stmts().get.get(id);
     
    6190  const approvers = new Set(rows.filter((r) => r.decision === 'approve').map((r) => r.guardian_uri));
    6291  const guardians = (guardiansOfWard || []).filter(Boolean);
    63   const enough = follow.quorum === 'all'
    64     ? guardians.length > 0 && guardians.every((g) => approvers.has(g))
    65     : approvers.size >= 1;                                   // 'any' (default)
     92  const enough = approvers.size >= followThreshold(guardians.length);
    6693  if (enough) {
    6794    stmts().setStatus.run('accepted', id);
Note: See TracChangeset for help on using the changeset viewer.