mirror of
https://relay.ngit.dev/npub15qydau2hjma6ngxkl2cyar74wzyjshvl65za5k5rl69264ar2exs5cyejr/ngit-grasp.git
synced 2026-10-06 15:38:25 +00:00
Static threshold 200 silently truncated historic filters on Ditto-shaped relays whose omitted-limit pages contain 100 events. NIP-11 max_limit cannot correct that because it describes explicit limits, while GRASP deliberately omits limit to preserve unbounded relay responses. Learn the largest raw page per relay connection session and combine it with NIP-11 default_limit, then paginate at max(90, floor(90% of the estimate)). Refetch NIP-11 on each successful connection, reset learning on disconnect, and ignore max_limit. Treat default_limit only as a hint: one suspiciously short page receives an inclusive-cursor verification request; any unseen event discards the hint session-wide. Preserve verification state across rate-limit deferral and across every filter in grouped REQs. Correctness assumes the audited relays apply result caps per filter rather than across the merged REQ, and that a cap of at least 90 covers the observed interoperability floor. Relays capped below 90 remain a documented residual risk. Explicit limits, configurable thresholds, aggregate-cap support, and the pre-existing transient-REQ concurrency defect are deliberately excluded. Validation: nix develop -c cargo test --lib (623 passed); nix develop -c cargo test --test sync adaptive_pagination -- --nocapture (3 passed: Ditto-shaped, honest hint, lying-high hint); nix develop -c cargo check --workspace --all-targets passed. The required standalone req-concurrency scenario failed twice with its documented proxy-rejection failure. Under this diff the same too many concurrent REQs signature repeated during phase-one pagination, a noisier form which is reported rather than masked.