Profile v2: split conflict from statecraft, add space, expand vetoes
Second elicitation round. The significant correction is Connor's own framing:
"my actual war interest is low, but unfortunately all wars are important." The
click history looked war-heavy only because world-news feeds are war-heavy, so
geopolitics-at-weight-1.0 was reading the corpus, not the reader. Statecraft is
now its own block and armed conflict is five weighted bands (anti-imperial,
US-involved, Mideast/Israel, undercovered, general) routed mainly by importance.
New: space-aerospace at 0.95, the highest-weighted block -- Connor is an
aerospace engineer. Plus science-discovery, environment-ecology,
ohio-state-politics, left-movements, anticolonial-sovereignty, far-right-watch,
political-theory. Linux/ricing/neovim folded into software-systems.
Introduces `demote` blocks, distinct from hard vetoes, for categories adjacent to
real interests: crypto/AI hype sits next to AI regulation, culture-war outrage
next to far-right-watch, true crime next to criminal-justice policy. Hard-vetoing
those would take real stories with them -- the lesson from the Europa League
story that both a substring blocklist and a cosine threshold wrongly killed.
Sources 39 -> 56, all fetched and verified: space (SpaceNews, Spaceflight Now,
NASASpaceflight, NASA, ESA, Phys.org), Linux (Phoronix, LWN, It's FOSS,
r/unixporn), left/anticolonial (Intercept, Drop Site, Tribune, African
Arguments). Rejected on inspection: nature.rss is journal metadata ("Author
Correction: ...") and sciencedaily is a press-release mill.
Embedding stays English-only, measured rather than assumed: the same story in
Spanish and English scored 0.758 and 0.600 cosine against a random-pair p99 of
0.634, so one pair was indistinguishable from an unrelated article. Italy and
Mexico are covered by English-language sources instead.
Also fixes clustering performance: centroids are held in memory across a batch
instead of one SELECT plus a numpy rebuild per item, which had taken ~15 minutes
for 1,258 items.
This commit is contained in:
1 parent
64690ecfe0
commit
6dc3694260
4 files changed
+572
-193
No files matched your search
+294
-82
@@ -3,24 +3,127 @@
|
||||
# never the mean. Probes are written as prose resembling article text, because
|
||||
# that is what they are compared against.
|
||||
#
|
||||
# Weights multiply the similarity. Feedback moves these vectors over time; the
|
||||
# text here is the cold-start seed.
|
||||
# Blocks are compared by z-score WITHIN block, then multiplied by `weight`.
|
||||
# See profile/CALIBRATION.md -- raw cosine is not comparable across blocks.
|
||||
|
||||
schema_version = 1
|
||||
schema_version = 2
|
||||
|
||||
# ---------------------------------------------------------------- interests --
|
||||
# =========================================================== interests =======
|
||||
|
||||
# --- foreign affairs, split from armed conflict ------------------------------
|
||||
# Connor: "my actual war interest is low, but unfortunately all wars are
|
||||
# important." The click history looked war-heavy only because world-news feeds
|
||||
# are war-heavy. Statecraft is the standing interest; combat reporting is
|
||||
# routed by importance instead. Keeping them in one block conflated the two.
|
||||
|
||||
[[interest]]
|
||||
id = "geopolitics"
|
||||
weight = 1.0
|
||||
id = "diplomacy-foreign-policy"
|
||||
weight = 0.9
|
||||
probes = [
|
||||
"Escalation in the Middle East as strikes continue and diplomatic efforts stall.",
|
||||
"China expands its influence abroad through investment, diplomacy and security agreements.",
|
||||
"US foreign policy shifts as the administration reconsiders its posture toward an ally.",
|
||||
"The United Nations Security Council debates sanctions and an arms embargo.",
|
||||
"Ceasefire negotiations falter amid disputes over withdrawal and prisoner exchange.",
|
||||
"Two governments sign a treaty realigning trade and security ties in the region.",
|
||||
"A diplomatic crisis erupts as one country expels another's ambassador.",
|
||||
]
|
||||
|
||||
# The A-E ordering Connor gave, encoded as weights. Even the lowest band still
|
||||
# reaches him -- but through importance, on major developments only.
|
||||
[[interest]]
|
||||
id = "conflict-anti-imperial" # (A) top of his ordering
|
||||
weight = 0.9
|
||||
probes = [
|
||||
"An armed liberation movement fights a colonial or occupying power for self-determination.",
|
||||
"A socialist or revolutionary force gains ground against a US-backed government.",
|
||||
"Anti-imperialist resistance movements coordinate against foreign military presence.",
|
||||
]
|
||||
|
||||
[[interest]]
|
||||
id = "conflict-us-involved" # (B)
|
||||
weight = 0.85
|
||||
probes = [
|
||||
"US forces carry out strikes and the administration defends the legal basis for the war.",
|
||||
"American troops, weapons or funding are central to an ongoing foreign conflict.",
|
||||
]
|
||||
|
||||
[[interest]]
|
||||
id = "conflict-mideast-israel" # (C)
|
||||
weight = 0.8
|
||||
probes = [
|
||||
"Israeli forces strike targets in Gaza, Lebanon or Syria amid continuing escalation.",
|
||||
"Ceasefire negotiations falter amid disputes over withdrawal and prisoner exchange.",
|
||||
"Palestinians face displacement, demolition and occupation in the West Bank.",
|
||||
]
|
||||
|
||||
[[interest]]
|
||||
id = "conflict-undercovered" # (D)
|
||||
weight = 0.75
|
||||
probes = [
|
||||
"Fighting intensifies in Sudan as famine spreads and aid convoys are blocked.",
|
||||
"Armed groups clash in the eastern Democratic Republic of Congo, displacing thousands.",
|
||||
"Conflict in Myanmar, the Sahel or Yemen continues with little international attention.",
|
||||
]
|
||||
|
||||
[[interest]]
|
||||
id = "conflict-general" # (E) -- low interest, still important
|
||||
weight = 0.45
|
||||
probes = [
|
||||
"Front-line fighting continues as both sides exchange drone and artillery strikes.",
|
||||
"A long-running interstate war grinds on with incremental territorial changes.",
|
||||
]
|
||||
|
||||
# --- space and aerospace -----------------------------------------------------
|
||||
# Connor is an aerospace engineer. He asked for launches/missions/spacecraft,
|
||||
# deep technical, and astronomy/planetary science -- deliberately NOT the
|
||||
# industry-and-contracts beat, which his policy blocks would catch anyway.
|
||||
[[interest]]
|
||||
id = "space-aerospace"
|
||||
weight = 0.95
|
||||
probes = [
|
||||
"The rocket lifted off carrying the spacecraft to orbit; the booster landed and the mission reached its next milestone.",
|
||||
"Engineers trace a launch failure to a propulsion anomaly and publish the post-mortem.",
|
||||
"Propulsion, materials and orbital mechanics choices shape the vehicle's design trade-offs.",
|
||||
"A planetary probe returns data from its flyby, reshaping models of the body's formation.",
|
||||
"Astronomers report observations of exoplanets, galaxies or a transient event from a space telescope.",
|
||||
"A crewed mission's schedule slips as the spacecraft completes qualification testing.",
|
||||
]
|
||||
|
||||
[[interest]]
|
||||
id = "science-discovery"
|
||||
weight = 0.8
|
||||
probes = [
|
||||
"Researchers report a finding that overturns the prevailing explanation in the field.",
|
||||
"A study in physics, biology or archaeology reveals something previously unknown.",
|
||||
"New evidence changes scientists' understanding of a long-standing question.",
|
||||
]
|
||||
|
||||
[[interest]]
|
||||
id = "environment-ecology"
|
||||
weight = 0.75
|
||||
probes = [
|
||||
"Protections for an endangered species are rolled back, alarming conservation biologists.",
|
||||
"An ecosystem shifts as habitat loss and invasive species reshape which animals survive.",
|
||||
"Public land and wildlife management rules are rewritten.",
|
||||
]
|
||||
|
||||
# --- software and systems (push-eligible) ------------------------------------
|
||||
[[interest]]
|
||||
id = "software-systems"
|
||||
weight = 0.9
|
||||
push_eligible = true
|
||||
probes = [
|
||||
"Running large language models locally: quantization, throughput, context length and memory bandwidth on consumer hardware.",
|
||||
"A new open-weights model is released with benchmarks and quantized builds available.",
|
||||
"A new release of the systems programming language changes the compiler, borrow checker or toolchain.",
|
||||
"WebAssembly gains new capabilities for running compiled code in the browser.",
|
||||
"Self-hosting a service stack with containers, reverse proxies and automated deployment.",
|
||||
"A widely used open source project announces a breaking change, a license change, or a governance dispute.",
|
||||
# Connor's words: "Linux news in general. The ricing world/neovim configs/etc"
|
||||
"A Linux desktop release brings changes to the compositor, window manager and display stack.",
|
||||
"Customizing a desktop setup: window manager configuration, terminal theming, dotfiles and Neovim plugins.",
|
||||
]
|
||||
|
||||
# --- policy and political economy --------------------------------------------
|
||||
[[interest]]
|
||||
id = "tech-science-policy"
|
||||
weight = 0.9
|
||||
@@ -34,7 +137,7 @@ probes = [
|
||||
|
||||
[[interest]]
|
||||
id = "labor-inequality"
|
||||
weight = 0.9
|
||||
weight = 0.85
|
||||
probes = [
|
||||
"Workers vote to unionize after a long organizing campaign; the employer contests the result.",
|
||||
"A strike over wages and staffing shuts down operations across the sector.",
|
||||
@@ -44,67 +147,39 @@ probes = [
|
||||
]
|
||||
|
||||
[[interest]]
|
||||
id = "software-systems"
|
||||
weight = 0.9
|
||||
push_eligible = true
|
||||
id = "left-movements"
|
||||
weight = 0.85
|
||||
probes = [
|
||||
"A new release of the systems programming language brings major changes to the compiler and toolchain.",
|
||||
"Running large language models locally on consumer hardware: quantization, throughput and memory bandwidth.",
|
||||
"Self-hosting a service stack with containers, reverse proxies and automated deployment.",
|
||||
"A widely used open source project announces a breaking change, a license change, or a governance dispute.",
|
||||
"WebAssembly gains new capabilities for running compiled code in the browser.",
|
||||
"A serious vulnerability is disclosed in widely deployed infrastructure software.",
|
||||
"A socialist party wins a decisive election, shifting the governing coalition leftward.",
|
||||
"A mass movement mobilizes in the streets demanding redistribution and public ownership.",
|
||||
"Cooperatives, mutual aid networks and tenant unions expand their organizing base.",
|
||||
]
|
||||
|
||||
[[interest]]
|
||||
id = "urbanism"
|
||||
id = "anticolonial-sovereignty"
|
||||
weight = 0.8
|
||||
probes = [
|
||||
"The city council votes to reform zoning rules and allow denser housing near transit.",
|
||||
"A new bus rapid transit and light rail line reshapes how residents move through the city.",
|
||||
"Planners redesign streets to reduce traffic deaths and reclaim space from cars.",
|
||||
"A downtown redevelopment project raises questions about displacement and public space.",
|
||||
"Indigenous communities win recognition of land rights against extractive industry.",
|
||||
"A former colony renegotiates resource contracts and asserts control over its minerals.",
|
||||
"IMF and World Bank conditionality drives austerity, prompting debt-relief demands.",
|
||||
]
|
||||
|
||||
# Tracked as a threat, not out of sympathy. Connor's AfD and Tate clicks fit here.
|
||||
[[interest]]
|
||||
id = "energy-climate"
|
||||
weight = 0.6
|
||||
id = "far-right-watch"
|
||||
weight = 0.75
|
||||
probes = [
|
||||
"Grid operators struggle to connect new renewable generation as storage capacity lags demand.",
|
||||
"A national climate policy sets emissions targets and restructures energy subsidies.",
|
||||
"Conservation rules protecting endangered species and public land are rolled back.",
|
||||
"A far-right party surges in a regional election, unsettling the political mainstream.",
|
||||
"An authoritarian government consolidates power over courts, press and elections.",
|
||||
"Extremist organizing and street violence grow as mainstream parties adopt their rhetoric.",
|
||||
]
|
||||
|
||||
# Confirmed by Connor 2026-09-08: wanted, at a level that keeps him up to date
|
||||
# rather than saturating the feed. Also supported by three of eighteen starred
|
||||
# items (Uber exiting Nigeria and Uganda, India's grid crunch, the Bolivian base
|
||||
# explosions).
|
||||
[[interest]]
|
||||
id = "global-south"
|
||||
id = "political-theory"
|
||||
weight = 0.7
|
||||
probes = [
|
||||
"An international company withdraws from several African markets amid regulatory pressure.",
|
||||
"Elections and political upheaval reshape governments across Latin America.",
|
||||
"Infrastructure and economic development across South Asia strains under rapid growth.",
|
||||
]
|
||||
|
||||
# ---------------------------------------------------------------- geography --
|
||||
|
||||
[[interest]]
|
||||
id = "cincinnati"
|
||||
weight = 0.9
|
||||
local = true
|
||||
probes = [
|
||||
"Cincinnati city council debates a development, budget or policing decision affecting neighborhoods.",
|
||||
"Local news from Cincinnati and Hamilton County, Ohio.",
|
||||
]
|
||||
|
||||
[[interest]]
|
||||
id = "kentucky-louisville"
|
||||
weight = 0.6
|
||||
local = true
|
||||
probes = [
|
||||
"Louisville and Kentucky state politics, legislation and local government decisions.",
|
||||
"An essay argues about socialism, imperialism and political economy, drawing on history rather than reporting a news event.",
|
||||
"A critical analysis of capitalism's structure and its alternatives.",
|
||||
]
|
||||
|
||||
[[interest]]
|
||||
@@ -116,19 +191,93 @@ probes = [
|
||||
"Federal agencies are restructured by executive order, prompting legal challenges.",
|
||||
]
|
||||
|
||||
# --- place -------------------------------------------------------------------
|
||||
[[interest]]
|
||||
id = "urbanism"
|
||||
weight = 0.8
|
||||
probes = [
|
||||
"The city council votes to reform zoning rules and allow denser housing near transit.",
|
||||
"A new bus rapid transit and light rail line reshapes how residents move through the city.",
|
||||
"Planners redesign streets to reduce traffic deaths and reclaim space from cars.",
|
||||
"A downtown redevelopment project raises questions about displacement and public space.",
|
||||
]
|
||||
|
||||
[[interest]]
|
||||
id = "cincinnati"
|
||||
weight = 0.9
|
||||
local = true
|
||||
probes = [
|
||||
"Cincinnati city council votes on a budget, a zoning change or a development project downtown.",
|
||||
"A regional transit plan or street redesign changes how people move around Cincinnati.",
|
||||
"Rent, eviction and homelessness policy in Hamilton County; a local union drive or strike.",
|
||||
"Neighborhood institutions, local arts, food and community life in Cincinnati.",
|
||||
"Local news from Cincinnati and Hamilton County, Ohio.",
|
||||
]
|
||||
|
||||
[[interest]]
|
||||
id = "kentucky-louisville"
|
||||
weight = 0.6
|
||||
local = true
|
||||
probes = [
|
||||
"Louisville and Kentucky state politics, legislation and local government decisions.",
|
||||
]
|
||||
|
||||
# The level above city hall: Connor asked for Ohio and Kentucky statehouse
|
||||
# coverage alongside Cincinnati city government.
|
||||
[[interest]]
|
||||
id = "ohio-state-politics"
|
||||
weight = 0.75
|
||||
local = true
|
||||
probes = [
|
||||
"The Ohio statehouse passes legislation over the governor's objection.",
|
||||
"Redistricting, election law and statewide ballot measures in Ohio.",
|
||||
]
|
||||
|
||||
# Connor follows both for politics, but also because he is learning the
|
||||
# languages and expects to travel there -- so culture and popular culture count
|
||||
# as signal here, not noise. He said: "pop culture stuff from Mexico/Italy is
|
||||
# even ok. Learning the culture helps me learn the language and travel there
|
||||
# better." That makes this the one block where lifestyle content is wanted, so
|
||||
# the consumer-lifestyle veto must not swallow it.
|
||||
[[interest]]
|
||||
id = "italy-mexico"
|
||||
weight = 0.7
|
||||
weight = 0.75
|
||||
probes = [
|
||||
"Italian politics, government coalitions and social policy in Italy.",
|
||||
"Mexican politics, security policy and the relationship with the United States.",
|
||||
"Regional life, cost of living and transport across Italy; what is changing in its cities.",
|
||||
"Mexican and Italian music, film, television and food culture; what people are talking about.",
|
||||
]
|
||||
|
||||
# ------------------------------------------------------------------- vetoes --
|
||||
# Confirmed by Connor 2026-09-08: wanted, at a level that keeps him up to date
|
||||
# rather than saturating the feed.
|
||||
[[interest]]
|
||||
id = "global-south"
|
||||
weight = 0.7
|
||||
probes = [
|
||||
"An international company withdraws from several African markets amid regulatory pressure.",
|
||||
"Elections and political upheaval reshape governments across Latin America.",
|
||||
"Infrastructure and economic development across South Asia strains under rapid growth.",
|
||||
]
|
||||
|
||||
[[interest]]
|
||||
id = "energy-climate"
|
||||
weight = 0.6
|
||||
probes = [
|
||||
"Grid operators struggle to connect new renewable generation as storage capacity lags demand.",
|
||||
"A national climate policy sets emissions targets and restructures energy subsidies.",
|
||||
]
|
||||
|
||||
# =========================================================== vetoes ==========
|
||||
# Hard vetoes only for categories that never overlap a real interest. Anything
|
||||
# that *might* overlap is a demote instead -- see below. This split exists
|
||||
# because a hard veto on a sports-adjacent region killed "Belgian mayor blocks
|
||||
# club from hosting Israeli opponent in Europa League", which is Middle East
|
||||
# politics. Overlap is the norm, not the exception.
|
||||
|
||||
[[veto]]
|
||||
id = "us-big-three-sports"
|
||||
threshold = 0.55
|
||||
threshold = 0.60
|
||||
probes = [
|
||||
"The team beat their rivals in a game recap with final scores, statistics and player performances.",
|
||||
"A player is traded, drafted or signs a contract; the league fines a franchise over salary cap rules.",
|
||||
@@ -139,20 +288,57 @@ probes = [
|
||||
|
||||
[[veto]]
|
||||
id = "royal-celebrity-gossip"
|
||||
threshold = 0.55
|
||||
threshold = 0.60
|
||||
probes = [
|
||||
"The royal family attends an event; speculation continues about the couple's status and future.",
|
||||
"Celebrity red carpet appearances, box office returns and influencer controversy.",
|
||||
]
|
||||
|
||||
[[veto]]
|
||||
id = "listicle-filler"
|
||||
id = "consumer-lifestyle"
|
||||
threshold = 0.60
|
||||
probes = [
|
||||
"Horoscopes, quizzes, and a roundup of the best products to buy this week.",
|
||||
"The best products to buy this week, ranked, with deals and discount codes.",
|
||||
"Horoscopes, quizzes, recipes and a travel guide to the perfect weekend away.",
|
||||
"Personal finance tips: how to budget, save and pick a credit card.",
|
||||
]
|
||||
|
||||
# ------------------------------------------------------- the importance lane --
|
||||
# =========================================================== demotes =========
|
||||
# Penalty applied to the interest score, not a hard exclusion. These categories
|
||||
# each sit adjacent to something Connor genuinely wants, so removing them
|
||||
# outright would take real stories with them.
|
||||
|
||||
# Adjacent to: tech-science-policy (AI regulation) and software-systems (local
|
||||
# inference). A hard veto here would be actively harmful.
|
||||
[[demote]]
|
||||
id = "crypto-ai-hype"
|
||||
penalty = 1.0
|
||||
probes = [
|
||||
"The token surged after the exchange listing as investors piled into the crypto rally.",
|
||||
"The startup raised a funding round at a multibillion-dollar valuation to build AI agents.",
|
||||
"A company announces its new AI-powered product will transform the industry.",
|
||||
]
|
||||
|
||||
# Adjacent to: far-right-watch. "X said Y and Z reacted" is noise; a far-right
|
||||
# party winning a state is not.
|
||||
[[demote]]
|
||||
id = "culture-war-outrage"
|
||||
penalty = 1.0
|
||||
probes = [
|
||||
"A politician's remark sparked backlash online and critics demanded an apology.",
|
||||
"A manufactured controversy over a advertisement or a celebrity's comment dominates social media for a day.",
|
||||
]
|
||||
|
||||
# Adjacent to: policing and criminal-justice policy, which Connor does want.
|
||||
[[demote]]
|
||||
id = "true-crime-blotter"
|
||||
penalty = 0.8
|
||||
probes = [
|
||||
"Police arrested a suspect in the killing; the trial opens with jury selection this week.",
|
||||
"A missing person case takes a turn as investigators search a rural property.",
|
||||
]
|
||||
|
||||
# ============================================= the importance lane ===========
|
||||
# Independent of interest. Vetoes still apply here -- v0.2's bypass lane ignored
|
||||
# relevance entirely (gate.rs:302), which let blocklisted items fire at priority 5.
|
||||
|
||||
@@ -162,6 +348,7 @@ weight = 1.0
|
||||
probes = [
|
||||
"One state launches military strikes on another, marking a major escalation of the conflict.",
|
||||
"Nuclear facilities are targeted or a state signals willingness to use weapons of mass destruction.",
|
||||
"A major new offensive opens a front, or a ceasefire is signed and takes effect.",
|
||||
]
|
||||
|
||||
[[importance]]
|
||||
@@ -198,34 +385,59 @@ probes = [
|
||||
"A prominent political figure dies or resigns unexpectedly.",
|
||||
]
|
||||
|
||||
# ------------------------------------------------------- calibrated scoring --
|
||||
# These constants are not guesses. They were fitted on 2026-09-08 against all
|
||||
# 3,885 items in the v0.2 database and Connor's 40 real feedback labels.
|
||||
# See profile/CALIBRATION.md for the measurements.
|
||||
# =========================================================== delivery ========
|
||||
|
||||
[delivery]
|
||||
# Settled with Connor 2026-09-08.
|
||||
digest_hour = "08:45"
|
||||
quiet_hours = { start = "22:00", end = "07:00" }
|
||||
# The importance lane MAY override quiet hours. The interest lane never may.
|
||||
importance_may_wake = true
|
||||
# No format filter: Connor reads analysis, wire copy, investigations AND opinion,
|
||||
# so writing style is deliberately not a scoring axis. This also confirms the old
|
||||
# config's notify_opinions = true was intentional.
|
||||
format_filter = false
|
||||
# Filter-bubble counterweight. The digest always reserves slots for items that
|
||||
# scored well on quality and importance but POORLY on the interest profile,
|
||||
# labelled "outside your usual". Notifications stay strictly on-profile; this is
|
||||
# a reading surface, not an interruption.
|
||||
serendipity_slots = 3
|
||||
|
||||
# The digest is a complete record of the day, including items that already
|
||||
# fired a notification -- not just the leftovers.
|
||||
digest_includes_notified = true
|
||||
# Saturday and Sunday editions run longer and lean toward longform, analysis and
|
||||
# the serendipity slots.
|
||||
weekend_digest_multiplier = 2.0
|
||||
|
||||
# Aggregator maturation. An HN post at 3 points is noise; the same post at 300
|
||||
# is news. Items below this score are ingested and clustered but never scored
|
||||
# for routing, so the system waits for the crowd instead of firing on arrival.
|
||||
hn_min_score = 150
|
||||
|
||||
# Feedback stays binary: interested / not interested. Low friction matters more
|
||||
# than richness here -- the model wants many labels, and the old system's
|
||||
# failure was collecting 32 of them, not collecting shallow ones.
|
||||
feedback_actions = ["interested", "not_interested"]
|
||||
|
||||
# Embedding stays English-only (bge-small-en-v1.5). Measured 2026-09-08: the
|
||||
# same story in Spanish and English scored 0.758 and 0.600 cosine, against a
|
||||
# random-pair p99 of 0.634 -- so one of two translation pairs was
|
||||
# indistinguishable from an unrelated article. Native-language Italian and
|
||||
# Spanish feeds would rank erratically, so Italy and Mexico are covered by
|
||||
# English-language sources (ANSA English, Mexico News Daily) instead. Revisit
|
||||
# with multilingual-e5-small only if native sources become worth re-calibrating
|
||||
# every threshold for.
|
||||
embedding_language = "en"
|
||||
# Conflict outside categories A-D notifies only on a major development -- a new
|
||||
# offensive, a ceasefire, mass casualties, a state entering. Routine front-line
|
||||
# reporting goes to the digest.
|
||||
conflict_general_requires_importance = true
|
||||
|
||||
# =========================================================== scoring =========
|
||||
# Fitted 2026-09-08 against 3,885 items and 40 real feedback labels.
|
||||
# See profile/CALIBRATION.md.
|
||||
|
||||
[scoring]
|
||||
# Compare blocks by z-score WITHIN each block, never by raw cosine. Raw cosine
|
||||
# is not comparable across blocks -- "geopolitics" averages 0.501 similarity to
|
||||
# world-news text while "kentucky-louisville" averages 0.441 -- so a plain max
|
||||
# let geopolitics win 78% of all items. Per-block z-scoring drops that to 19%
|
||||
# and moves the median rank of a known-liked item from 1246 to 293 of 3885.
|
||||
normalize = "zscore-per-block"
|
||||
|
||||
# Veto is deliberately NOT a plain similarity threshold. A story can be
|
||||
# genuinely sports-adjacent and still be wanted: "Belgian mayor blocks club from
|
||||
# hosting Israeli opponent in Europa League" is Middle East politics, and both a
|
||||
# substring blocklist AND a 0.55 cosine threshold falsely killed it.
|
||||
#
|
||||
# So: veto on unambiguous similarity, OR when the veto signal beats the best
|
||||
# interest signal by a margin. Measured at these values: 17/22 of Connor's real
|
||||
# rejections caught, 0/18 of his likes lost, ~21% of the corpus vetoed, and all
|
||||
# four sports-adjacent news canaries survive.
|
||||
veto_absolute = 0.60
|
||||
veto_margin_over_interest = 0.3
|
||||
Reference in new issue
Block a user