Cut weak interest matches and add the rating-driven affinity signal (step 2)

An interest matches an article only when it is in the top three by z and
z >= 1.0, so the Matches line, the stored rows and the weights agree. The
new bounded affinity signal blends each matched interest's rating-derived
weight, gated on attributable ratings like feed affinity.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K9PrjtUS16PAQve8D4bHgc
This commit is contained in:
2026-09-13 05:20:05 +00:00
co-authored by Claude Fable 5.1
parent f0c0927ab8
commit 2d857e3e10
8 changed files with 384 additions and 33 deletions
+8 -4
View File
@@ -138,7 +138,7 @@ slop_value = -1.0 # AI slop: a full negative; the author pena
verdicts_in_prompt = 60
# Every weight, quota, gate and threshold of the personalized ranker. The
# learned signals (`knn`, `feed`) contribute nothing until their gates open:
# learned signals (`knn`, `feed`, `affinity`) contribute nothing until their gates open:
# the weight ramps linearly from `*_floor` to `*_full` rated articles.
[curation.ranking]
triage_max = 800 # eligible articles the triage LLM reads
@@ -153,6 +153,8 @@ knn_floor = 8
knn_full = 25
feed_floor = 15
feed_full = 40
affinity_floor = 15
affinity_full = 40
slop_author_penalty = 0.75 # blend and utility × 0.25 for authors with an AI slop verdict
semantic_min_words = 300
exploration_slots = 5
@@ -166,16 +168,18 @@ knn = 20
# Weights need not sum to 1; they are renormalized over the present signals.
[curation.ranking.weights.preliminary]
interest = 0.35
interest = 0.30
knn = 0.25
affinity = 0.10
heuristic = 0.20
feed = 0.10
social = 0.10
social = 0.05
[curation.ranking.weights.utility]
quality = 0.40
fit = 0.20
knn = 0.15
knn = 0.10
affinity = 0.05
interest = 0.10
feed = 0.05
triage = 0.05