docs: add NIP-ER event reminders#875
Merged
Merged
Conversation
e13de6f to
0bdf275
Compare
Signed-off-by: npub1mprnacetjua2xx3p5eddmhxyk6wv929ymm5py8kd2xfxurxahspqqlgyta <d8473ee32b973aa31a21a65adddcc4b69cc2a8a4dee8121ecd51926e0cddbc02@sprout-oss.stage.blox.sqprod.co>
0bdf275 to
434516e
Compare
added 4 commits
June 9, 2026 09:40
…rt-dedupe caveat - intro/Non-Goals: delivery is relay-dependent; push-mode relays MUST emit due signals - Client behavior: add stateless notification profile (non-deduping receive path, discard if not_before > W in future without recording, hold and fire within W, RECOMMENDED W=60s, one-shot queries for management) - scope the dedupe MUST to persisted reminder state (transport vs state layer) Wording agreed in reminder-messages thread (Eva/Max/Tyler). Signed-off-by: npub1qyvc0c5kl4gqv2fd97fsk46tu378sqgy35vc83rvgfwne90sel7s0ed67d <011987e296fd5006292d2f930b574be47c7801048d1983c46c425d3c95f0cffd@sprout-oss.stage.blox.sqprod.co>
Exhaustive state-machine exploration (83k configs: push/lazy relay x raw/pool-deduped path x clock skew x W x action schedules) found three gaps in the profile as worded; each sentence added here closes one: - 'every delivery supersedes any held event for the same address': without it, a held reminder fires even after a delivered snooze replacement (stale notify, 157 counterexamples) - 'SHOULD NOT notify the same event id again': without it, reconnect replay or repeated due signals after firing re-notify (double-notify) - 'W SHOULD exceed worst-case client clock skew': a client behind by more than W discards the due-time redelivery itself as too far in the future and the reminder is lost until reconnect With these, the modeled client satisfies: due pending heads always notify (push relay, conforming path), never early, never terminal, at most once per id; residual staleness only in offline multi-device races the spec already documents. Signed-off-by: npub1qyvc0c5kl4gqv2fd97fsk46tu378sqgy35vc83rvgfwne90sel7s0ed67d <011987e296fd5006292d2f930b574be47c7801048d1983c46c425d3c95f0cffd@sprout-oss.stage.blox.sqprod.co>
'will not fire on relays that do not implement this NIP' was too strong: on a lazy or non-supporting relay the profile still fires for reminders already within W of due when the stored head is replayed at query time (model-checked both directions). State the actual behavior and tie the full guarantee to push-mode advertisement. Signed-off-by: npub1qyvc0c5kl4gqv2fd97fsk46tu378sqgy35vc83rvgfwne90sel7s0ed67d <011987e296fd5006292d2f930b574be47c7801048d1983c46c425d3c95f0cffd@sprout-oss.stage.blox.sqprod.co>
…veat Three model-verified gaps from review: - push-mode relays SHOULD replay the latest due reminder on subscriptions opened after not_before (pins reconnect liveness to NIP-01 stored replay) - the notification path must parse the reminder address before discarding, or address-supersede cannot work (discard-without-recording tension) - NIP-09 kind:5 deletions do not reach kind:30300 notification paths; publish a cancelled replacement first to suppress a held notification Signed-off-by: npub1qyvc0c5kl4gqv2fd97fsk46tu378sqgy35vc83rvgfwne90sel7s0ed67d <011987e296fd5006292d2f930b574be47c7801048d1983c46c425d3c95f0cffd@sprout-oss.stage.blox.sqprod.co>
00deee3 to
4fac77b
Compare
…upported Signed-off-by: npub1qyvc0c5kl4gqv2fd97fsk46tu378sqgy35vc83rvgfwne90sel7s0ed67d <011987e296fd5006292d2f930b574be47c7801048d1983c46c425d3c95f0cffd@sprout-oss.stage.blox.sqprod.co>
tlongwell-block
pushed a commit
that referenced
this pull request
Jun 9, 2026
* origin/main: (32 commits) docs: add NIP-ER event reminders (#875) feat(acp): pass slash commands through to ACP connectors (#919) fix(sdk): resolve multi-word display names and add NIP-27 nostr:npub mention extraction (#905) fix(desktop): re-enable mcp_command reconciliation and harden spawn site (#909) Fix desktop DM and sidebar UI polish (#908) Animate reaction counts (#904) Mobile custom emoji + settings redesign (#906) Renew TTL when unarchiving ephemeral channels (#902) chore(release): release version 0.3.13 (#903) Collapse channel header actions (#901) sprout-agent: make Databricks defaults env-only (#868) Restyle settings sections (#894) Add emoji reaction particles (#890) Move settings into the app shell (#893) Tune chat text sizing (#891) Style channel header navigation (#889) fix: rename missed known_acp_provider_exact → known_acp_runtime_exact (#900) chore(deps): update radix-ui-primitives monorepo (#898) chore(deps): update actions/checkout digest to df4cb1c (#897) refactor: rename ACP "provider" to "runtime" across the codebase (#783) ... # Conflicts: # desktop/src/features/agents/ui/CreateAgentDialog.tsx
tlongwell-block
pushed a commit
that referenced
this pull request
Jun 9, 2026
* origin/main: (32 commits) docs: add NIP-ER event reminders (#875) feat(acp): pass slash commands through to ACP connectors (#919) fix(sdk): resolve multi-word display names and add NIP-27 nostr:npub mention extraction (#905) fix(desktop): re-enable mcp_command reconciliation and harden spawn site (#909) Fix desktop DM and sidebar UI polish (#908) Animate reaction counts (#904) Mobile custom emoji + settings redesign (#906) Renew TTL when unarchiving ephemeral channels (#902) chore(release): release version 0.3.13 (#903) Collapse channel header actions (#901) sprout-agent: make Databricks defaults env-only (#868) Restyle settings sections (#894) Add emoji reaction particles (#890) Move settings into the app shell (#893) Tune chat text sizing (#891) Style channel header navigation (#889) fix: rename missed known_acp_provider_exact → known_acp_runtime_exact (#900) chore(deps): update radix-ui-primitives monorepo (#898) chore(deps): update actions/checkout digest to df4cb1c (#897) refactor: rename ACP "provider" to "runtime" across the codebase (#783) ... Signed-off-by: npub1qyvc0c5kl4gqv2fd97fsk46tu378sqgy35vc83rvgfwne90sel7s0ed67d <011987e296fd5006292d2f930b574be47c7801048d1983c46c425d3c95f0cffd@sprout-oss.stage.blox.sqprod.co> # Conflicts: # desktop/src/features/agents/ui/CreateAgentDialog.tsx
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
docs/nips/NIP-ER.mdfor encrypted event reminderskind:30300reminder state with publicnot_beforedue-time signalsSprout note
Sprout has a historical unused
kind:40007/KIND_STREAM_REMINDERreservation. That is not part of NIP-ER. NIP-ER is intended to be implementable by any Nostr project and useskind:30300withnot_before.Verification
git diff --checkNIP-XXplaceholders remain, generic draft discovery is present, and thesince/privacy/range clarifications are presentNotes
Local pre-push hook was bypassed with
--no-verifybecause an unrelated existing Rust/Tauri check fails onsprout-desktopusing unstablestr::floor_char_boundaryinsrc/commands/agent_discovery.rs. This PR is docs-only.