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.
140 lines
7.1 KiB
Markdown
140 lines
7.1 KiB
Markdown
# Connor's news profile
|
||
|
||
The thing the previous system never had. `news_triage` v0.2's entire model of taste
|
||
was three keywords and two blocked substrings; everything else was ranking
|
||
machinery with nothing meaningful to rank. This file is the replacement, and
|
||
`profile.toml` is its machine-readable form.
|
||
|
||
Written 2026-09-08 from a structured interview plus evidence from 40 real feedback
|
||
clicks in the v0.2 database. Schema v2.
|
||
|
||
## How this is used
|
||
|
||
Every `description` and `probe` is embedded (bge-small-en-v1.5, CPU) into a vector.
|
||
An item's score for a block is the **max** cosine across that block's probes, never
|
||
the mean — averaging "Middle East geopolitics" with "grid-scale energy storage"
|
||
gives a vector near neither. Blocks are then compared by **z-score within block**,
|
||
because raw cosine is not comparable across blocks; see `CALIBRATION.md`.
|
||
|
||
Feedback moves these vectors over time. The written text is the cold-start seed, so
|
||
the system is useful on day one rather than after 200 clicks.
|
||
|
||
## Interests
|
||
|
||
**Foreign affairs is split in two.** 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 statecraft —
|
||
`diplomacy-foreign-policy`, weight 0.9 — is the standing interest, while armed
|
||
conflict is weighted lower and routed mainly through importance.
|
||
|
||
Within conflict, his stated ordering became five weighted blocks:
|
||
|
||
| block | weight | |
|
||
|---|---|---|
|
||
| `conflict-anti-imperial` | 0.90 | anti-colonial and socialist-revolutionary wars |
|
||
| `conflict-us-involved` | 0.85 | wars the US is actively engaged in |
|
||
| `conflict-mideast-israel` | 0.80 | Middle East, especially engagements with Israel |
|
||
| `conflict-undercovered` | 0.75 | Sudan, DRC, Myanmar, the Sahel, Yemen |
|
||
| `conflict-general` | 0.45 | everything else — low interest, still important |
|
||
|
||
**Space and aerospace** (0.95) is the single highest-weighted block: Connor is an
|
||
aerospace engineer. He asked for launches and missions, deep technical coverage
|
||
(propulsion, materials, orbital mechanics, failure post-mortems), and
|
||
astronomy/planetary science — deliberately *not* the industry-and-contracts beat,
|
||
which his policy blocks already catch.
|
||
|
||
**Software and systems** (0.9, push-eligible) covers local model inference, Rust and
|
||
WebAssembly, self-hosting and infrastructure, and — in his words — *"Linux news in
|
||
general. The ricing world/neovim configs/etc."* Notably he did **not** pick security
|
||
and vulnerabilities, so that is absent rather than assumed.
|
||
|
||
**Political economy** spans `labor-inequality` (0.85), `left-movements` (0.85),
|
||
`anticolonial-sovereignty` (0.8), `far-right-watch` (0.75, tracked as a threat
|
||
rather than out of sympathy), and `political-theory` (0.7).
|
||
|
||
**Place**: `cincinnati` (0.9 — where he lives, so a lower bar), `ohio-state-politics`
|
||
(0.75), `kentucky-louisville` (0.6 — where he's from), `us-national` (0.8), and
|
||
`italy-mexico` (0.75).
|
||
|
||
Italy and Mexico are a special case. He 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 in this block, not noise** — the one place where lifestyle
|
||
content is wanted. The `consumer-lifestyle` veto must not swallow it.
|
||
|
||
Also carried: `science-discovery` (0.8), `environment-ecology` (0.75),
|
||
`tech-science-policy` (0.9), `urbanism` (0.8), `global-south` (0.7),
|
||
`energy-climate` (0.6).
|
||
|
||
## Vetoes, and why some things are demotes instead
|
||
|
||
Hard vetoes are reserved for categories that never overlap a real interest: US
|
||
big-three sports recaps, royal and celebrity gossip, consumer/lifestyle filler.
|
||
|
||
Anything that *might* overlap is a **demote** — a penalty on the score rather than
|
||
exclusion. This distinction 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:
|
||
|
||
- `crypto-ai-hype` sits next to AI regulation and local-inference news
|
||
- `culture-war-outrage` sits next to `far-right-watch`
|
||
- `true-crime-blotter` sits next to criminal-justice policy
|
||
|
||
### Explicitly not vetoed
|
||
|
||
Connor is not anti-sport; he is anti *US-big-three-wire-recap*. **Rock climbing,
|
||
chess, the Olympics and oddball sports are actively wanted.** Soccer is not blocked
|
||
as a concept — he is trying to get into it — though match previews and live threads
|
||
are noise. Sports *governance* (FIFA/UEFA corruption, Olympic host-city displacement,
|
||
Qatar migrant labour) reads as politics and stays.
|
||
|
||
## The importance lane
|
||
|
||
Independent of interest, and half the reason the project exists: war and escalation,
|
||
mass-casualty events, US federal shocks, economic breaks, and major US political
|
||
events (decisive elections, deaths of political figures).
|
||
|
||
**Vetoes still apply on this lane.** In v0.2 the bypass lane ignored relevance
|
||
entirely (`gate.rs:302`), so a blocklisted item could still fire at priority 5.
|
||
|
||
## Delivery
|
||
|
||
- Digest at **08:45**, quiet hours **22:00–07:00**. The importance lane **may** wake
|
||
him; the interest lane never may.
|
||
- 2–5 pushes/day across both lanes.
|
||
- 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.
|
||
- HN items are ignored below **150 points**: the crowd does the first filtering pass.
|
||
- The digest is a **complete record** of the day, including already-notified items,
|
||
and the weekend edition runs longer and leans longform.
|
||
- **Three serendipity slots** in every digest for items that scored well on quality
|
||
and importance but poorly on the profile, labelled "outside your usual". A system
|
||
that only shows you what you already like tightens its own bubble as it learns.
|
||
- No format filter: he reads analysis, wire copy, investigations *and* opinion, which
|
||
also confirms the old config's `notify_opinions = true` was deliberate.
|
||
- Feedback stays **binary**. The old system's failure was collecting 32 labels, not
|
||
collecting shallow ones.
|
||
|
||
## Source trust
|
||
|
||
`weight` in `sources.toml` is editorial trust, carried over from the old config where
|
||
Connor had deliberately set Al Jazeera highest (1.2) and NYT lowest (0.8), and
|
||
extended to weight independent outlets (The Intercept, Drop Site, Tribune, African
|
||
Arguments, Middle East Eye, +972) at 1.1. It affects importance and tie-breaking,
|
||
never whether an item is visible.
|
||
|
||
## Language
|
||
|
||
Embedding is English-only. Measured: the same story in Spanish and English scored
|
||
0.758 and 0.600 cosine against a random-pair p99 of 0.634 — one of two translation
|
||
pairs was indistinguishable from an unrelated article. Native-language feeds would
|
||
rank erratically, so Italy and Mexico are covered by English-language sources.
|
||
Revisit with a multilingual model only if that becomes worth re-calibrating every
|
||
threshold for.
|
||
|
||
## Open questions
|
||
|
||
- Whether `global-south` is a genuine standing interest or an artifact of a small
|
||
sample. Confirmed wanted by Connor, but worth re-checking against real feedback.
|
||
- Exact score at which the importance lane may override quiet hours.
|