search_queries rows capture both the query and the clicked result
(api.py:17395 api_search_click). We never use that data. Build a
per-session recommender: from the last 30 days of queries + clicks,
infer the session's interest vector (entities, genes, layers,
artifact types) and generate "You might want to look at" cards on
/dashboard and an "Adjacent artifacts" sidebar on every artifact
page.
scidex/atlas/recommender.py::interest_vector(session_id, days=30) -> np.ndarray derived from clicked-artifact embeddings (reuse vector_search).recommend_for_session(session_id, k=10) returns top-k unseen artifacts ranked by cosine similarity to interest vector × (1 - already_seen_decay).search_session_interests(session_id PK, vector_bytes, computed_at); search_recommendations_log(session_id, artifact_id, recommended_at, clicked, dismissed)./dashboard adds a "Recommended for you" card when ≥ 5 clicks in window./artifact/{id} page gets an "Adjacent artifacts" sidebar (top 5).
X-Search-Recommendations: off header disables tracking entirely.q-srch-hybrid-rerank (shares the embedding store).search_queries.user_session, clicked_result_id (existing).