Changeset 44dfbd2 in Klonkt


Ignore:
Timestamp:
08/13/2026 08:32:21 PM (4 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
4766720
Parents:
54b027a
Message:

Eerst de guardianship verhuizen, dan pas de follow

Robins regel na zijn eigen verhuizing, en het log van beta bewijst hem:

[AP] outgoing Follow beta → https://soundfabrics.nl/ap/users/robo

(gated, awaiting guardians)

Beta is zelf een ward. Zijn UITGAANDE follow naar de verhuisde guardian werd
gepoort door §5.3, want op dat moment stond het nieuwe adres nog niet in zijn
guardian-lijst: handleMoveInbox werkte de relatie pas NA de follows bij. De
inkomende kant heeft precies hetzelfde: de ward gate't een Follow van een
onbekende, en de verhuisde guardian is op dat moment een onbekende.

Dus beide richtingen bleven hangen op een goedkeuring die niemand hoefde te geven,
omdat het om een guardian ging die er al was. Met de relatie eerst is de verhuisde
actor al erkend als de follows langskomen en gaat de auto-acceptatie door.

De volgorde is hier dus geen netheid maar de werking.

Changed files:
src/services/ActivityPubService.js

  • het guardianship-blok staat nu VOOR de follow-lus, met het waarom erbij

test/move-guardianship.test.js

  • test 5 meet de VOLGORDE, niet de uitkomst: hij leest de relatie uit binnen de injecteerbare followFn en eist dat die daar al op het nieuwe adres staat

remarks: de tegenproef is hier het punt. De vijf bestaande tests slagen ook met de
oude volgorde, want die kijken naar de eindtoestand. Met de guardianship-update er
wel in maar NA de follows valt alleen test 5 om. Suite 938 groen in UTC en
Europe/Amsterdam.

Dit is handmatig al rechtgezet voor beta en robo (relatie overgezet, follow opnieuw
gestuurd, beta's log gaat van "gated, awaiting guardians" naar "sig ok"). Deze commit
zorgt dat de volgende verhuizing die handmatige stap niet meer nodig heeft.

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

Files:
2 edited

Legend:

Unmodified
Added
Removed
  • src/services/ActivityPubService.js

    r54b027a r44dfbd2  
    57835783    return 202; // decline to act; no 4xx, the sender may be a well-meaning retrying server
    57845784  }
     5785  // EERST de guardianship, DAARNA pas de follows. Die volgorde is geen netheid
     5786  // maar de hele werking, en hij is met bloed geschreven: bij Robins verhuizing
     5787  // op 13-8 stond het andersom en het log liet precies zien wat er dan gebeurt.
     5788  //
     5789  //   [AP] outgoing Follow beta → .../robo (gated, awaiting guardians)
     5790  //
     5791  // Beta is zelf een ward. Zijn UITGAANDE follow naar de verhuisde guardian werd
     5792  // gepoort (§5.3), want op dat moment stond het nieuwe adres nog niet in zijn
     5793  // guardian-lijst: de code hieronder had de relatie nog niet bijgewerkt. En de
     5794  // INKOMENDE kant heeft hetzelfde probleem, want de ward gate't een Follow van
     5795  // een onbekende. Dus beide richtingen bleven hangen op goedkeuring die niemand
     5796  // hoefde te geven, omdat het om een guardian ging die er al was.
     5797  //
     5798  // Met de relatie eerst is de verhuisde actor al een erkende guardian als de
     5799  // follows langskomen, en gaat de auto-acceptatie gewoon door.
     5800  //
     5801  // Een Move is een Move: de guardian is dezelfde guardian, het kind is hetzelfde
     5802  // kind, alleen het adres is nieuw. Zelfde bescherming als de re-follow: alleen
     5803  // na een geverifieerde Move, en niet naar een geblokkeerde bestemming (daar
     5804  // zijn we hierboven al uitgestapt). De twee harde randen van shaer-tge staan
     5805  // hier LOS van: weigeren te verhuizen naar een instance die shaer:guardians
     5806  // niet kan dragen is een controle aan de UITGAANDE kant, en het
     5807  // terugkeren-zonder-set is een alsoKnownAs-kwestie.
     5808  try {
     5809    const g = db.prepare('SELECT slug, role FROM ap_guardianships WHERE other_uri = ? AND status = ?').all(oldUri, 'accepted');
     5810    if (g.length) {
     5811      const r = db.prepare('UPDATE ap_guardianships SET other_uri = ? WHERE other_uri = ? AND status = ?').run(newUri, oldUri, 'accepted');
     5812      console.log('[AP] guardianship moved:', oldUri, '→', newUri, `(${r.changes}x)`, g.map((x) => `${x.role}:${x.slug}`).join(', '));
     5813    }
     5814  } catch (e) { console.warn('[AP] guardianship move failed:', e && e.message); }
     5815
    57855816  for (const row of rows) {
    57865817    const site = db.prepare('SELECT * FROM sites WHERE slug = ?').get(row.slug);
     
    57955826    }
    57965827  }
    5797   // Een Move is een Move: de guardian is dezelfde guardian, het kind is hetzelfde
    5798   // kind, alleen het adres is nieuw. Toezicht IS een gewone Follow (FEP-633c §5),
    5799   // en die is hierboven al meeverhuisd -- maar de relatie zelf hing nog aan de
    5800   // oude URI. Dat leverde de vervelendste toestand op: de guardian ziet de posts
    5801   // nog binnenkomen, terwijl alles dat op other_uri matcht omvalt (de gate op een
    5802   // nieuwe volger, het escalatiepad, listGuardians bij het kind). Half een
    5803   // vangnet ziet eruit als een heel vangnet.
    5804   //
    5805   // Zelfde bescherming als de re-follow hierboven: alleen na een geverifieerde
    5806   // Move, en niet als de bestemming geblokkeerd is (daar zijn we al uitgestapt).
    5807   // De twee harde randen van shaer-tge staan hier LOS van: weigeren te verhuizen
    5808   // naar een instance die shaer:guardians niet kan dragen is een controle aan de
    5809   // UITGAANDE kant, en het terugkeren-zonder-set is een alsoKnownAs-kwestie.
    5810   try {
    5811     const g = db.prepare('SELECT slug, role FROM ap_guardianships WHERE other_uri = ? AND status = ?').all(oldUri, 'accepted');
    5812     if (g.length) {
    5813       const r = db.prepare('UPDATE ap_guardianships SET other_uri = ? WHERE other_uri = ? AND status = ?').run(newUri, oldUri, 'accepted');
    5814       console.log('[AP] guardianship moved:', oldUri, '→', newUri, `(${r.changes}x)`, g.map((x) => `${x.role}:${x.slug}`).join(', '));
    5815     }
    5816   } catch (e) { console.warn('[AP] guardianship move failed:', e && e.message); }
    58175828  return 202;
    58185829}
  • test/move-guardianship.test.js

    r54b027a r44dfbd2  
    9292});
    9393
     94// De VOLGORDE, niet de uitkomst. De tests hierboven slagen ook als de relatie pas
     95// na de follows wordt bijgewerkt, en juist dat ging mis bij Robins verhuizing:
     96//
     97//   [AP] outgoing Follow beta → .../robo (gated, awaiting guardians)
     98//
     99// Beta is zelf een ward, dus zijn uitgaande follow naar de verhuisde guardian werd
     100// gepoort omdat het nieuwe adres nog niet in zijn guardian-lijst stond. Beide
     101// richtingen bleven hangen op een goedkeuring die niemand hoefde te geven.
     102test('de guardianship is al bijgewerkt VOORDAT de follow uitgaat', async () => {
     103  let standTijdensFollow = null;
     104  const stil = console.log; console.log = () => {};
     105  try {
     106    await AP.handleMoveInbox(move, {
     107      ...stubs,
     108      followFn: async () => {
     109        // Op dit moment moet de gate aan de andere kant ons al kennen.
     110        standTijdensFollow = db.prepare('SELECT other_uri FROM ap_guardianships').get().other_uri;
     111        return true;
     112      },
     113    });
     114  } finally { console.log = stil; }
     115
     116  assert.equal(standTijdensFollow, NIEUW,
     117    'staat de relatie hier nog op het oude adres, dan gate\'t de ward de follow van zijn eigen guardian');
     118});
     119
    94120test('een Move naar een geblokkeerde bestemming verandert niets', async () => {
    95121  db.prepare('INSERT INTO ap_blocks (slug, target, kind) VALUES (?,?,?)').run('voogd', NIEUW, 'actor');
Note: See TracChangeset for help on using the changeset viewer.