Ignore:
Timestamp:
08/07/2026 12:47:33 PM (5 weeks ago)
Author:
roboburr <roboburr@…>
Branches:
main
Children:
0475b13, a29c8c8
Parents:
0db68bd
git-author:
Robin <roboburr@…> (08/07/2026 12:47:31 PM)
git-committer:
roboburr <roboburr@…> (08/07/2026 12:47:33 PM)
Message:

Het gate-paneel: een rij per gate, met het soort en de drempel (shaer-ahy.1)

Een guardian zag twee knoppen en moest zelf uitzoeken wat er verder voor dit kind
gold. Wat niet verstelbaar is stond nergens -- terwijl dat de helft is van het
antwoord op "wat mag dit kind".

EEN BRON VAN WAARHEID. GATE_CATALOGUE in gated.js is nu de lijst van gates die
deze Klonkt kent. Wat gated wordt is een ontwerpkeuze van de implementatie: de
FEP levert het mechanisme (voorstel, tally, settle) en een paar voorbeelden, niet
de lijst. Een gate erbij is daarmee een regel data en geen nieuw stuk scherm.

HET SOORT STAAT ERBIJ, want ze werken niet hetzelfde:

setting een stand, aan of uit, terug te draaien
perRequest geen stand maar een stroom beslissingen (5.3 volgverzoeken)
handover draagt gezag OVER, onomkeerbaar zodra de ward hem gebruikt

Die derde bestaat nog niet (shaer-90v), maar de rij kan hem al dragen -- inclusief
"niet terug te draaien", zodat dat er niet later ingebouwd hoeft te worden.

Volgverzoeken staan er nu ook in, met het aantal dat wacht. Ze zijn niet te
verzetten (altijd aan voor een ward, 5.3) en juist daarom horen ze zichtbaar te
zijn.

TWEE DINGEN DIE HET PANEEL NIET VERZINT. Een onbekende stand is ONBEKEND en niet
uit: bij een ward op een andere server staat die kolom daar. En zonder bekend
aantal guardians komt er geen drempel op het scherm -- nul of een gok leest als
een feit, en dit is precies waar een guardian op afgaat voordat hij iets
voorstelt.

De trap uit shaer-ahy blijft: afspelen is pas te bewegen als linkvoorbeelden
aanstaan. Met dezelfde uitzondering als voorheen -- onbekend telt niet als dicht,
want dat kostte ooit een hele voorstelronde.

Terugval ingebouwd: serveert een oudere Klonkt de catalogus nog niet, dan
verschijnen de twee knoppen zoals ze waren in plaats van een leeg vak.

9 tests op gateRows, dat pure stuk waar de regels in zitten. nl/en/de. Suite
565/565. Niet gedekt: de weergave zelf, dat is client-JS.

File:
1 edited

Legend:

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

    r0db68bd r792af53  
    6060  'shaer:externalPlayback': 'external_playback',
    6161};
     62/**
     63 * De gates die deze Klonkt kent, met hun SOORT.
     64 *
     65 * Wat gated wordt is een ontwerpkeuze van de implementatie: de FEP levert het
     66 * mechanisme (voorstel, tally, settle) en een paar voorbeelden, niet de lijst.
     67 * Deze catalogus is die lijst, op een plek. Een gate erbij hoort een regel data
     68 * te zijn en geen nieuw stuk scherm.
     69 *
     70 * `kind` is niet decoratief. De gates verschillen in hoe ze werken en dat mag
     71 * een guardian niet hoeven raden:
     72 *
     73 *   setting     een stand, aan of uit, terug te draaien
     74 *   perRequest  geen stand maar een stroom beslissingen (5.3 volgverzoeken)
     75 *   handover    draagt gezag OVER; onomkeerbaar zodra de ward hem gebruikt
     76 *
     77 * `needs` is de trap uit shaer-ahy: zien < afspelen. Je kunt niet afspelen wat
     78 * je niet mag zien, dus dat tweede is pas te bewegen als het eerste openstaat.
     79 */
     80export const GATE_CATALOGUE = [
     81  { feature: 'shaer:externalEmbeds', kind: 'setting', reversible: true },
     82  { feature: 'shaer:externalPlayback', kind: 'setting', reversible: true, needs: 'shaer:externalEmbeds' },
     83  // Altijd aan voor een ward (5.3): niet te verzetten, wel te tonen. Een paneel
     84  // dat alleen verstelbare dingen laat zien verzwijgt de helft van wat er geldt.
     85  { feature: 'shaer:follows', kind: 'perRequest', reversible: true, fixed: true },
     86];
     87
     88/**
     89 * De gates van een ward als rijen voor het paneel. Puur, zodat de regels
     90 * getoetst kunnen worden zonder database of scherm.
     91 *
     92 * @param settings       {feature: true|false|null} -- null is ONBEKEND, niet uit
     93 * @param guardianCount  aantal guardians, of null als we het niet weten
     94 * @param proposals      [{feature, value, status}] lopende voorstellen
     95 * @param waiting        {feature: aantal} wat er per gate op een besluit wacht
     96 */
     97export function gateRows({ settings = {}, guardianCount = null, proposals = [], waiting = {} } = {}) {
     98  return GATE_CATALOGUE.map((g) => {
     99    const value = Object.prototype.hasOwnProperty.call(settings, g.feature) ? settings[g.feature] : null;
     100    // De trap: het bovenliggende moet OPEN staan. Onbekend telt niet als dicht --
     101    // bij een ward elders kennen we de stand niet, en verbergen betekende daar
     102    // ooit dat een voorstel nooit geopend kon worden.
     103    const blockedBy = g.needs && settings[g.needs] === false ? g.needs : null;
     104    return {
     105      feature: g.feature,
     106      kind: g.kind,
     107      reversible: !!g.reversible,
     108      value,
     109      // Vast staat vast: tonen mag, verzetten niet.
     110      adjustable: !g.fixed && !blockedBy,
     111      blockedBy: blockedBy || undefined,
     112      // Zonder bekend aantal guardians GEEN drempel verzinnen. Nul of een gok
     113      // leest als een feit, en dit is precies waar een guardian op afgaat.
     114      threshold: (guardianCount && guardianCount > 0)
     115        ? { need: thresholdFor(guardianCount), of: guardianCount } : null,
     116      proposal: proposals.find((p) => p.feature === g.feature) || undefined,
     117      waiting: waiting[g.feature] || undefined,
     118    };
     119  });
     120}
     121
    62122export function featureColumn(feature) {
    63123  return Object.prototype.hasOwnProperty.call(FEATURES, feature) ? FEATURES[feature] : null;
     
    239299
    240300export default {
     301  GATE_CATALOGUE, gateRows,
    241302  tallyGatedSetting, thresholdFor, featureColumn, recordGatedVote, gatedProgress, GATED_WINDOW_MS,
    242303  parseGatedSetting, buildGatedOffer, rememberGatedOffer, recallGatedOffer,
Note: See TracChangeset for help on using the changeset viewer.