Drie gaten uit de 1.7.0-review: index, wekkers, en de exporter-tijdzone
Drie losstaande reparaties uit de review van de 66 commits. Elk mechanisch, elk met
een tegenproef dat de test zonder de fix ook echt faalt.
- De permalink-lookup van reacties had geen index. canonicalReactionUri zoekt op
(slug, url) en viel terug op idx_ap_timeline_slug, dus een scan van elke rij van die
slug. Dat gebeurt PER REACTIE in getInteractions, en de reactie-migratie erft het in
haar re-key-join die synchroon voor listen draait: de opstartkosten waren reacties
maal tijdlijnrijen. Nagemeten met EXPLAIN QUERY PLAN, nu een indexzoek.
- De feed-wekkers gingen af op likes en boosts. ap_interactions draagt naast replies
ook likes en announces, en die schrijven een LEGE object_uri (regel 2310, tegenover
o.id bij replies). Zonder WHEN bumpte elke inkomende like de rev, werd elke
long-poll-wachter gewekt, en kreeg die de hele collectie opnieuw terwijl er niets aan
veranderd was: precies de kosten die de 304 moest wegnemen. Bovendien belandde er een
rij op de lege string in ap_feed_state, die feedChangesSince als sleutel uitdeelt. Bij
ap_timeline was hier wel op gelet (de UPDATE OF sluit liked en boosted uit) en een
tabel verder vergeten.
- De exporter schreef lokale tijd als UTC. Kale Date.parse op SQLite's
'YYYY-MM-DD HH:MM:SS' leest dat als lokale tijd, dus op UTC+2 ging er twee uur van
elke stempel af voordat hij het archief in ging. Die verschuiving wordt bij het
exporteren INGEBAKKEN en valt niet weg bij het importeren. Het raakte de stempels die
de database zelf zet (concepten, ingeplande posts, gearchiveerde antwoorden), niet die
uit de editor, dus de schade was stil en gedeeltelijk. Dezelfde correctie stond al
twee keer in deze codebase, in isoStamp() en stampMs(); de exporter had de les gemist.
EXPORT-FORMAT.md schreef altijd al "ISO 8601, UTC" voor.
Changed files:
src/config/database.js
- index idx_ap_timeline_url op (slug, url)
- zet() kreeg een optionele wanneer-parameter voor een WHEN op de trigger
- de drie ap_interactions-triggers filteren nu op kind='reply' (OLD bij delete)
src/services/ArchiveExportService.js
- toISO leest SQL-notatie expliciet als UTC
New file:
test/feed-state-triggers.test.js
- like en boost wekken niets, reply wel, verwijderde reply ook
- er staat nooit een rij op de lege sleutel
- en de permalink-lookup gebruikt de index, via EXPLAIN QUERY PLAN
remarks: tegenproef gedaan op alle drie. Zonder de database-fixes 4 van 6 rood; zonder
de exporter-fix valt de archief-test om in Europe/Amsterdam en niet in UTC. Volledige
suite 587 groen in beide tijdzones. De vierde vondst, de guardian-controle op
hulpmarkeringen, zit hier NIET in: die vraagt de guardian-set van de ward federatief
op te halen via shaer:guardians en dat is ontwerpwerk, geen mechanische fix.
-robo
Co-Authored-By: Claude Opus 4.8 <noreply@…>