Changeset 88d7c8f in Klonkt for src/assets/js/guardian.js


Ignore:
Timestamp:
07/29/2026 07:15:16 AM (6 weeks ago)
Author:
Robin Genis <roboburr@…>
Branches:
main
Children:
e27b8db
Parents:
439f095
Message:

Een gated voorstel bereikte de andere guardians nooit

Op de vloot nagekeken waarom YouTube-voorbeelden bij beta uit blijven: het
voorstel van sound-fabrics staat er, met een ja van een van de drie guardians,
en het is stil verlopen. Niet omdat iemand bezwaar had, maar omdat niemand
anders het ooit gezien heeft.

Het voorstel wordt geadresseerd aan de server van het kind, want die telt en
handhaaft (5.6). Maar daarmee bereikt het alleen de voorsteller en het kind. De
twee guardians op andere servers weten van niets, kunnen dus niet antwoorden, en
een drempel van twee is onhaalbaar. Elk voorstel verloopt na een dag.

De ontbrekende schakel is het doorsturen, precies wat 5.3 al doet voor een
gated follow: de server van het kind kent de gezaghebbende guardian-lijst, dus
die stuurt het voorstel door. Elke guardian bewaart een kopie die hij kan
beantwoorden, en het antwoord reist terug naar het kind, dat telt.

Changed files:
src/config/database.js

  • tabel ap_gated_reviews, de guardian-kopie (zelfde vorm als ap_follow_reviews)

src/services/guardianship/gated.js

  • de kopie-opslag: bewaren, lezen, beantwoorden, opruimen

src/services/guardianship/handshake.js

  • ward-kant: doorsturen naar de andere guardians zodra het voorstel openstaat
  • guardian-kant: de doorgestuurde kopie bewaren om te kunnen antwoorden

src/routes/guardian.js

  • gatedReviews in de dashboardstaat; POST /guardian/api/gated/:id stuurt het antwoord naar de inbox van het kind

src/assets/js/guardian.js, src/assets/css/guardian.css

src/services/i18n.js

  • de teksten in nl, en, de

test/gated-settings.test.js

  • de hele keten: voorstellen, doorsturen naar allebei de anderen, de kopie opslaan, antwoorden, en pas bij twee van drie gaat de gate open

remarks: dit forceert niets; het maakt alleen mogelijk wat de spec al bedoelde.
Twee van de drie guardians moeten nog steeds akkoord gaan, en het venster is
24 uur.

-robo
Co-Authored-By: Claude Opus 5 <noreply@…>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/assets/js/guardian.js

    r439f095 r88d7c8f  
    150150  }
    151151
     152  /** A gated-setting proposal (FEP-633c 5.6) a fellow guardian opened on a
     153   *  ward we share, forwarded here by the ward's server. Answering is the
     154   *  whole point: without a second voice the threshold is never met and the
     155   *  proposal quietly expires. */
     156  function gatedCard(g) {
     157    var card = el('div', 'g-card gated');
     158    var line = g.value ? (T.gated_line_on || '') : (T.gated_line_off || '');
     159    card.appendChild(el('div', 'who', line
     160      .replace('{who}', handleOf(g.proposer || ''))
     161      .replace('{ward}', handleOf(g.ward))));
     162    var row = el('div', 'row');
     163    var yes = el('button', 'small', T.gated_agree || 'Agree');
     164    var no = el('button', 'quiet small', T.gated_disagree || 'Disagree');
     165    function answerGated(decision, btn) {
     166      btn.disabled = true;
     167      fetch('/guardian/api/gated/' + encodeURIComponent(g.id), {
     168        method: 'POST', headers: { 'Content-Type': 'application/json' },
     169        body: JSON.stringify({ answer: decision, site: S.site }),
     170      }).then(refresh).catch(function () { btn.disabled = false; });
     171    }
     172    yes.addEventListener('click', function () { answerGated('accept', yes); });
     173    no.addEventListener('click', function () { answerGated('reject', no); });
     174    row.appendChild(yes); row.appendChild(no);
     175    card.appendChild(row);
     176    return card;
     177  }
     178
    152179  function renderPending() {
    153180    var list = document.getElementById('pending-list');
    154181    list.textContent = '';
    155182    var offers = S.offers || [];
     183    var gated = S.gatedReviews || [];
    156184    // The offers state carries the adoption offers; the lapse proposals ride
    157185    // separately so a lapse never renders as an adoption.
     
    162190    });
    163191    lapses.forEach(function (l) { list.appendChild(lapseCard(l)); });
    164     show('pending-section', offers.length > 0 || lapses.length > 0);
     192    gated.forEach(function (g) { list.appendChild(gatedCard(g)); });
     193    show('pending-section', offers.length > 0 || lapses.length > 0 || gated.length > 0);
    165194  }
    166195
Note: See TracChangeset for help on using the changeset viewer.