Ignore:
Timestamp:
08/07/2026 05:15:52 PM (5 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
ba76bf5
Parents:
f85b2c3 (diff), 0d5bd2c (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge GitHub-main (1.7.0) met de VPS-lijn

De twee mains waren een dag gedivergeerd en bevatten elk echt werk. GitHub had 66
commits die nooit langs prutfolio.git zijn gekomen, omdat een parallelle sessie
rechtstreeks naar GitHub pushte vanaf een kloon in /tmp op de VPS. De VPS had twee
commits die GitHub niet had. Geen van beide bevatte de ander, en stable had geen van
de twee.

Bewust een merge en geen rebase: dan blijft beide historie intact en wordt er niets
herschreven waar iemand anders al op voortbouwt.

Drie bestanden raakten beide kanten. Alle drie zijn nagekeken, want dat een merge
automatisch slaagt zegt niets over of hij inhoudelijk klopt:

src/services/ActivityPubService.js

  • de sleutelbinding staat nu boven de nieuwe asSlug-aanroep van 1.7.0, dus de controle komt nog steeds voor de handtekeningcontrole

scripts/klonkt-refresh-updater.sh

  • alleen de opzij-aanpak overleefde; systemctl mask staat nergens meer als code

deploy/MULTI-INSTANCE.md

  • spreekt zichzelf niet tegen: beschrijft opzij zetten, met de reden waarom mask weigert

remarks: het gat dat in de review naar boven kwam staat hiermee ook op de 1.7.0-lijn.
De andere bevindingen uit die review staan nog open en zijn niet in deze merge
opgelost; die horen als beads. Ook nog te doen: dezelfde sleutelbinding op stable
als 1.6.1, want daar is het gat nog open bij self-hosters.

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

File:
1 edited

Legend:

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

    rf85b2c3 r952baf3  
    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.