Nostr Radar Signal Review

Status

Signal review is implemented for all supported action families:

The implementation includes reviewed topic and author selection, per-action review settings, exact signal persistence, learned author affinity, and post-publication signal recording.

This release intentionally uses a clean signal-schema cutover. It does not migrate or reconstruct signal history from an older Nostr Radar database. That compatibility break requires a major plugin release.

Behavior

Before Nostr Radar creates a learned interest signal, the user can review the features included in that signal:

Creating a signal for this post

Author
[x] AuthorA

Topics
[x] ai
[x] nostr
[x] markets

[ ] Don't ask again for Like

[Like + create signal] [Like without signal] [Cancel]

The review contains:

Topic-only, author-only, and empty signals are valid deliberate outcomes. An empty signal remains inert in ranking rather than restoring unchecked defaults.

Review Modes

Archive, Like, Reply, and Repost/Quote each persist one mode:

type NrSignalReviewMode = 'ask' | 'always' | 'never';

Every mode defaults to ask. The settings UI exposes compact selectors for changing them.

When "Don't ask again" is selected:

Local Like and Local Dislike always open review when activated or switched. They do not have persisted modes, do not offer Without Signal, and clear immediately when the active choice is clicked again.

Action Timing

Archive

Review happens before archive mutation. Create Signal sequences archive first and signal persistence second. Without Signal archives without changing signal rows. Unarchive does not create or remove learning.

Public Like

Review happens before signing. The signal is recorded only after relay publication and interaction recording succeed. Publication failure or cancellation records nothing.

Reply

Review fields are embedded in the reply composer. Reply content and signal outcome submit together. Canceling the composer publishes and records nothing.

Repost And Quote

Review fields are embedded in the repost/quote panel. Empty content produces a Repost signal; non-empty content produces a Quote signal. Both share the Repost/Quote review-mode setting.

Local Like And Dislike

Activation opens standalone review. Create Signal stores the selected features and removes the opposite local signal in the same decision flow. Cancel leaves state unchanged.

Persistence

Reviewed signals are authoritative and use (target_event_id, type) as their logical key:

CREATE TABLE nr_interest_signals (
  target_event_id TEXT NOT NULL,
  type            TEXT NOT NULL,
  weight          INTEGER NOT NULL,
  topics_json     TEXT NOT NULL,
  moods_json      TEXT NOT NULL,
  author_pubkey   TEXT,
  source          TEXT NOT NULL,
  created_at      INTEGER NOT NULL,
  updated_at      INTEGER NOT NULL,
  PRIMARY KEY (target_event_id, type)
);

Create Signal upserts the exact selected topics and optional author. New signals store moods_json as an empty array. Without Signal does not create, update, or delete a signal row.

Startup no longer reconstructs signals from public interactions or archived events. Restart therefore cannot widen reviewed selections or recreate intentionally omitted signals.

The schema adds author_pubkey without preserving the previous signal table. Existing Nostr Radar databases must be recreated for this major release.

Ranking

Topic scoring continues to divide a signal's weight across its selected topics.

Reviewed authors contribute a separate bounded learned affinity:

learnedAuthorAffinity = 1.5 * Math.tanh(rawAuthorWeight / 5);

Explicit author preferences remain independent and stronger:

explicitAuthorBias = {
  like: 2,
  dislike: -6,
  neutral: 0,
};

The final score combines topic affinity, learned author affinity, and explicit author bias. Selecting an author during signal review never writes an explicit author preference.

Timeline Author Discovery

The Timeline tree includes an Authors section alongside Topics, Moods, and Languages. It groups eligible unread posts by authors present in reviewed signal history, including posts without topic or mood tags. Both positive and negative author signals qualify; a topic-only signal with no selected author does not. Explicit author preferences alone do not create a signal-matched group.

Selected hourly slots constrain post creation times, not signal timestamps. Existing kind, read-state, resolved-context, and hidden-reference filtering also apply. Author groups and their posts follow existing score ordering. Cached display names are preferred, with shortened pubkeys as a fallback. Author posts participate in profile/context hydration and deduplicated unread counts, including the historical unread-slot list.

Validation

signal-record enforces these server-side constraints:

Public command input cannot provide arbitrary continuation actions. Renderers construct only allow-listed command and client-action sequences.

Delivery Semantics

Public publication is authoritative. If a relay accepts an action but local interaction or signal recording later fails, the public action remains successful and the local failure is surfaced without automatic retry or startup reconstruction.

Repeating the same Create command is idempotent for the same target and signal type. A later successful reviewed Create decision replaces the prior selected features for that key.

Implementation Map

Generic web support for repeated form values, modal cancellation, command sequencing, and interaction continuations remains plugin-agnostic in AppWeaver core.

Release Verification

Before publishing the major release, manually verify: