# News seed — method, feed results, known gaps

Dataset: `data/news_seed.json` / `data/news_seed.csv` (250 records, as of 2026-10-10). The static seed of `/news` and the home ticker; the live table `news_items` (Supabase) replaces it in the browser once the site is configured. Built by `scripts/build_news_seed.py`.

## 1. Method

* The 23 RSS and Atom feeds of `data/sources_registry.json` (type `rss`) were fetched once by the fetch workflow on a GitHub Actions runner (`scripts/fetch/news_feeds.txt`, one GET per feed, the fetcher's user agent) and stored under `data/raw/news/<date>/`.
* Each item is taken as published: title and description with HTML stripped, the link made canonical (tracking parameters removed, fragment dropped, host lower-cased; `supabase/functions/_shared/canon_fixtures.json` fixes the rule and is run as a self-test), the date parsed to UTC.
* Category and tags are the output of the keyword rules in `supabase/functions/_shared/rules.json` (first matching category rule wins, else the source's `category_default` when it is one of the five categories, else none); companies and countries are whole-word alias matches from `entities.json`. The same two files drive the `ingest-news` Edge Function, so the seed and the live table classify alike.
* Duplicates by canonical URL are dropped (first feed wins); at most 25 items per feed and 250 in total are kept, newest first.

## 2. Feed results

| Source | Feed | HTTP | Kind | Items in feed | Kept | Note |
|---|---|---|---|---|---|---|
| world-nuclear-news | https://www.world-nuclear-news.org/rss | 200 | rss | 47 | 25 |  |
| nucnet | https://www.nucnet.org/feed.rss | 403 |  | 0 | 0 | the feed answered HTTP 403 to the runner's request; no items |
| ans-newswire | https://www.ans.org/news/feed/ | 200 | rss | 50 | 25 |  |
| iaea-top-news | https://www.iaea.org/feeds/topnews | 200 | rss | 15 | 15 |  |
| nrc-news-releases | https://www.nrc.gov/public-involve/rss?feed=news | 200 | rss | 164 | 25 |  |
| nrc-event-reports | https://www.nrc.gov/public-involve/rss?feed=event | 403 |  | 0 | 0 | the feed answered HTTP 403 to the runner's request; no items |
| nrc-plant-status | https://www.nrc.gov/public-involve/rss?feed=plant-status | 200 | rss | 99 | 23 |  |
| doe-ne-press-releases | https://www.energy.gov/rss/ne/2282917 | 200 | rss | 10 | 10 |  |
| our-world-in-data | https://ourworldindata.org/atom.xml | 200 | atom | 10 | 10 |  |
| eia-today-in-energy | https://www.eia.gov/rss/todayinenergy.xml | 200 | rss | 15 | 15 |  |
| cameco-news | https://www.cameco.com/rss/news | 200 | rss | 10 | 10 |  |
| centrus-ir-news | https://investors.centrusenergy.com/rss/news-releases.xml | 403 |  | 0 | 0 | the feed answered HTTP 403 to the runner's request; no items |
| energy-fuels-ir-news | https://investors.energyfuels.com/news-releases?pagetemplate=rss | 200 | rss | 5 | 5 |  |
| ur-energy-news | https://www.ur-energy.com/news-media/press-releases/rss | 200 | rss | 10 | 10 |  |
| constellation-ir-news | https://investors.constellationenergy.com/rss/news-releases.xml | 403 |  | 0 | 0 | the feed answered HTTP 403 to the runner's request; no items |
| vistra-ir-news | https://investor.vistracorp.com/news?pagetemplate=rss | 200 | rss | 5 | 5 |  |
| bwxt-ir-news | https://investors.bwxt.com/rss/news-releases.xml | 403 |  | 0 | 0 | the feed answered HTTP 403 to the runner's request; no items |
| ge-vernova-news | https://www.gevernova.com/news/subscribe/all/rss.xml | 200 | rss | 20 | 20 |  |
| x-energy-feed | https://x-energy.com/feed/ | 200 | rss | 12 | 12 |  |
| holtec-feed | https://holtecinternational.com/feed/ | 200 | rss | 10 | 10 |  |
| westinghouse-news | https://info.westinghousenuclear.com/news/rss.xml | 200 | rss | 10 | 10 |  |
| atomic-insights | https://atomicinsights.com/feed/ | 200 | rss | 20 | 20 |  |
| nei-magazine | https://www.neimagazine.com/feed/ | 403 |  | 0 | 0 | the feed answered HTTP 403 to the runner's request; no items |

## 3. Categories

| Category | Items |
|---|---|
| regulatory_policy | 65 |
| uranium | 14 |
| reactors_technology | 93 |
| companies_capital | 55 |
| markets | 20 |
| none | 3 |

## 4. Known gaps

* 6 of 23 registry feeds gave no items at the fetch (nucnet (the feed answered HTTP 403 to the runner's request; no items), nrc-event-reports (the feed answered HTTP 403 to the runner's request; no items), centrus-ir-news (the feed answered HTTP 403 to the runner's request; no items), constellation-ir-news (the feed answered HTTP 403 to the runner's request; no items), bwxt-ir-news (the feed answered HTTP 403 to the runner's request; no items), nei-magazine (the feed answered HTTP 403 to the runner's request; no items)); the ingest function tries them again every 30 minutes from Supabase's network and records the outcome on news_sources.last_status.
* The seed is a snapshot of the fetch date: at most 25 items per feed and 250 in total, newest first; the live table holds everything the ingest function has seen since it was deployed.
* Categories and tags come from keyword rules (rules.json, version 2026-10-10), not from a reader: 3 items matched no rule and have no category. An item's category can be wrong where a headline mixes topics.
* Company and country links are whole-word alias matches on the title and summary (entities.json); a story about a company named only by its ticker, or a country named by a city, carries no link.
* Summaries are the feed's own description, HTML stripped and cut at 300 characters; a feed without descriptions gives none. The site never writes its own summary.
* YouTube channel feeds and X accounts of the registry are not ingested in this part (the YouTube Data API needs a key; X has no feed); the registry keeps them for the Voices section.
