···469469 JOIN main.users u ON u.did = sim.peer_did
470470 LEFT JOIN main.follows f ON f.user_did = ? AND f.target_did = u.did
471471 WHERE EXISTS (SELECT 1 FROM articles.subscriptions s JOIN articles.feeds f ON s.feed_url = f.feed_url WHERE s.user_did = u.did AND f.subscriber_count > 0)
472472+ AND NOT EXISTS (SELECT 1 FROM main.dismissed_recommendations d WHERE d.user_did = ? AND d.target_type = 'person' AND d.target_id = u.did)
472473 ORDER BY sim.jaccard DESC
473474 LIMIT ?
474474- `, userDID, userDID, userDID, limit)
475475+ `, userDID, userDID, userDID, userDID, limit)
475476 if err != nil {
476477 return nil, err
477478 }
+2-2
internal/db/db.go
···209209210210 `CREATE TABLE IF NOT EXISTS dismissed_recommendations (
211211 user_did TEXT NOT NULL,
212212- target_type TEXT NOT NULL CHECK(target_type IN ('feed', 'article')),
212212+ target_type TEXT NOT NULL CHECK(target_type IN ('feed', 'article', 'person')),
213213 target_id TEXT NOT NULL,
214214 reason TEXT,
215215 dismissed_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
···218218219219 `CREATE TABLE IF NOT EXISTS recommendation_impressions (
220220 user_did TEXT NOT NULL,
221221- target_type TEXT NOT NULL CHECK(target_type IN ('feed', 'article')),
221221+ target_type TEXT NOT NULL CHECK(target_type IN ('feed', 'article', 'person')),
222222 target_id TEXT NOT NULL,
223223 first_shown_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
224224 last_shown_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,