Ignore:
Timestamp:
08/08/2026 08:42:09 PM (4 weeks ago)
Author:
roboburr <roboburr@…>
Branches:
main
Children:
29eb745
Parents:
3a0ca0f
git-author:
Robin <roboburr@…> (08/08/2026 08:41:47 PM)
git-committer:
roboburr <roboburr@…> (08/08/2026 08:42:09 PM)
Message:

Je hoort te weten dat je de doorslag geeft (shaer-8vt)

De telling is een race naar de drempel: zodra het aantal gehaald is, is het
besluit gevallen. Bij 2 van 3 is de tweede ja meteen de beslissing -- en sinds
Barts meerderheidsbesluit van vandaag is bij een volgverzoek met twee guardians
de EERSTE ja dat al. Wie antwoordde wist dat niet, en het scherm zei het nergens.

Dat kon niet, en waarom niet was de vondst bij shaer-nf9: gatedProgress werkt op
een LOKALE slug en er zijn geen lokale wards. De telling loopt op de server van
het kind, en die stuurde hem niet mee. Nu wel: shaer:decisive reist mee met de
doorgestuurde Offer, voor gate-voorstellen en voor volgverzoeken in beide
richtingen.

EEN JA/NEE, GEEN TELLING, en dat is een besluit. Een getal ("1 van 2") reist mee,
veroudert onderweg en leest daarna als een feit; de beschikbare set schuift met
3.6 bovendien mee. En hoeveel guardians een kind heeft, en wie er al gestemd
heeft, is niet vanzelf iets dat elke mede-guardian hoort te zien. Een
waarschuwing veroudert ook, maar hij CLAIMT niets -- en dat scheelt.

BIJ TWIJFEL WAARSCHUWEN. Ontbreekt het veld (een oudere server), dan zeggen we
dat je beslist. De twee fouten zijn niet gelijk: zeggen dat je beslist terwijl
dat niet zo is maakt iemand voorzichtiger dan nodig; niets zeggen terwijl hij wel
beslist laat hem het onwetend doen. Daar staat een toets op, en de mutatie die
ertoe doet -- onbekend als "je beslist niets" lezen -- maakt hem rood.

Eerlijk over de mutatietest: mijn eerste poging (de Number.isFinite-guards
weghalen) gaf nul fouten, want die geven voor undefined dezelfde uitkomst. De
regel bijt wel tegen de realistische verkeerde versie.

Zes toetsen, drie talen. Suite 747/747.

File:
1 edited

Legend:

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

    r3a0ca0f rea211b9  
    260260}
    261261
     262/**
     263 * Zou het antwoord van deze guardian het besluit AFMAKEN (shaer-8vt)?
     264 *
     265 * De telling is een race naar de drempel: zodra het aantal gehaald is, is het
     266 * gevallen. Bij 2 van 3 is de tweede ja dus meteen de beslissing, en bij een
     267 * volgverzoek met twee guardians is de EERSTE ja dat al. Wie antwoordt weet dat
     268 * niet, en het scherm zei het nergens.
     269 *
     270 * EEN JA/NEE, GEEN TELLING, en dat is een besluit. Een getal ("1 van 2") reist
     271 * mee, veroudert onderweg en leest daarna als een feit; de beschikbare set
     272 * schuift bovendien met 3.6 mee. En hoeveel guardians een kind heeft, en wie er
     273 * al gestemd heeft, is niet vanzelf iets dat elke mede-guardian hoort te zien.
     274 * Een waarschuwing veroudert ook, maar hij CLAIMT niets -- en dat scheelt.
     275 *
     276 * BIJ TWIJFEL WAARSCHUWEN. De twee fouten zijn niet gelijk: zeggen dat je
     277 * beslist terwijl dat niet zo is maakt iemand voorzichtiger dan nodig; niets
     278 * zeggen terwijl hij wel beslist laat hem het onwetend doen.
     279 */
     280export function isDecisive(votes, need) {
     281  const v = Number.isFinite(votes) ? votes : 0;
     282  const n = Number.isFinite(need) ? need : 1;
     283  return (n - v) <= 1;
     284}
     285
    262286/** The open decision for a feature, for showing progress ("1 of 2"). */
    263287export function gatedProgress(slug, feature) {
     
    313337  if (!_rs) {
    314338    _rs = {
    315       ins: db.prepare(`INSERT INTO ap_gated_reviews (id, guardian_slug, ward_uri, ward_inbox, proposer, feature, value)
    316                        VALUES (?,?,?,?,?,?,?)
    317                        ON CONFLICT(guardian_slug, id) DO UPDATE SET value = excluded.value, ward_inbox = excluded.ward_inbox`),
     339      ins: db.prepare(`INSERT INTO ap_gated_reviews (id, guardian_slug, ward_uri, ward_inbox, proposer, feature, value, decisive)
     340                       VALUES (?,?,?,?,?,?,?,?)
     341                       ON CONFLICT(guardian_slug, id) DO UPDATE SET value = excluded.value, ward_inbox = excluded.ward_inbox, decisive = excluded.decisive`),
    318342      get: db.prepare('SELECT * FROM ap_gated_reviews WHERE guardian_slug = ? AND id = ?'),
    319343      bySlug: db.prepare('SELECT * FROM ap_gated_reviews WHERE guardian_slug = ? ORDER BY created_at DESC'),
     
    326350
    327351export function recordGatedReview(guardianSlug, r) {
    328   rstmts().ins.run(r.id, guardianSlug, r.wardUri, r.wardInbox || null, r.proposer || null, r.feature, r.value ? 1 : 0);
     352  // decisive ontbreekt bij een oudere server -> 1, want bij twijfel waarschuwen.
     353  rstmts().ins.run(r.id, guardianSlug, r.wardUri, r.wardInbox || null, r.proposer || null, r.feature, r.value ? 1 : 0, r.decisive === false ? 0 : 1);
    329354  return rstmts().get.get(guardianSlug, r.id);
    330355}
     
    424449export default {
    425450  GATE_CATALOGUE, gateRows, knownSetting,
    426   tallyGatedSetting, thresholdFor, featureColumn, recordGatedVote, gatedProgress, gateConsequence, GATED_WINDOW_MS,
     451  tallyGatedSetting, thresholdFor, featureColumn, recordGatedVote, gatedProgress, gateConsequence, isDecisive, GATED_WINDOW_MS,
    427452  parseGatedSetting, buildGatedOffer, rememberGatedOffer, recallGatedOffer,
    428453  recordGatedReview, getGatedReview, listGatedReviews, removeGatedReview, clearGatedReviews,
Note: See TracChangeset for help on using the changeset viewer.