Der post 'protocol-anthropology' erschien in der uebersicht, lieferte unter
/protocol-anthropology/ aber 404: das event liegt nur auf relay.primal.net,
waehrend nos.lol und relay.tchncs.de die uebrigen 27 posts halten und primal
diese nicht liefert. loadReadRelays nahm bisher die NIP-65-liste ODER den
fallback — je nach codepfad fehlte damit entweder der neue post oder fast
alle alten. Jetzt vereinigungsmenge beider listen, normalisiert (trailing
slash, case) und dedupliziert.
FALLBACK_READ_RELAYS um 'primal.net' und 'relay-rpi.edufeed.org' ergaenzt:
das sind andere hosts als 'relay.primal.net'/'relay.edufeed.org', keine
schreibweisen — sie stehen so in der echten NIP-65-liste.
Das 60%-antwort-quorum ersetzt durch eine untergrenze von 2 relays MIT
events. Zwei gruende: der fetcher resolved bei timeout mit leerem array und
zaehlt damit als "geantwortet" (die quote mass erreichbarkeit, nicht daten),
und mit der groesseren union-liste liefern regulaer mehrere relays 0 events
(gemessen: 6 von 11) — das haette ohne echten fehler hard-gefailt.
Verifiziert: snapshot schreibt 28 statt 27 posts, prerender erzeugt
build/protocol-anthropology/index.html mit korrektem titel und inhalt.
36 tests gruen.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Code-review-feedback aus etappe 2.9/2.10:
1. cli.ts: deletedCoords im cache wird ab jetzt akkumuliert statt
ersetzt. Vorher wurden bei einem run nur die aktuell von relays
gelieferten kind:5-coords geschrieben — wenn ein relay beim
naechsten run die alten deletions nicht mehr liefert (GC,
relay-tausch), waere die geschichte verloren und newDeletionsCount
im naechsten lauf wieder "neu" -> false-positive hard-fail im
drop-check.
2. relays.ts: kommentar zum belt-and-suspenders-setTimeout neben dem
RxJS-timeout-operator, damit der zweck (handle-cleanup falls beide
subscribe-callbacks verschluckt werden) klar ist.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Vorher konnten malformed tags wie ['t'] (ohne second element)
undefined ins string[]-array werfen, das im JSON als null landete.
Code-review-feedback aus etappe 2.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Per NIP-09 darf ein deletion nur events mit created_at <= deletion.created_at
loeschen. Vorher wurde ein re-publizierter post nach geloeschtem vorgaenger
stumm wegfiltern. Code-review-feedback aus etappe 2.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>