| Commit message (Collapse) | Author | Age |
| | |
|
| | |
|
| |
|
|
|
|
|
|
| |
The single documented exception to labels.jsonl's append-only rule:
trims feeds over the ceiling (keeping each one's NEWEST negatives),
positives untouched, LABELS.bak written first, idempotent, --dry-run.
Existence justified by the ceiling only bounding the future, while
pre-cap history would otherwise never age out.
|
| |
|
|
|
|
|
|
|
| |
No feed may hold more than 5% (floor 50) of the negative target, counting
existing history: uncapped, a few firehoses own the negative class because
the read+unstarred pool is sized by feed volume. Enforced by skipping
ceiling-full feeds mid seeded permutation walk; shortfall vs the ratio is
reported, neg_capped added to the run summary. Also makes bulk mark-read
of high-volume feeds safe for training data.
|
| |
|
|
|
|
|
| |
GET /v1/feeds + feed_id entries filter in the client, one cheap volume
probe per feed over a --days window, star stats joined from labels.jsonl
by feed id, category column, --min-per-day/--min-seen filters. Read-only;
justfile recipe with one-line doc comments throughout.
|
| |
|
|
|
|
|
|
|
| |
/api/poll runs an out-of-schedule poll through the same serialized path
as the scheduler (TryLock, so curls and refreshes can't race the cursor),
is POST-only, and 429s inside a 1-minute cooldown after any run. Response
is JSON: polled/new_run plus the fresh row's stats when entries arrived.
Also rename the RSS channel to Fluxrecs (Miniflux adopts upstream title
changes as the feed name). just poll-now wraps the curl.
|
| |
|
|
|
|
|
| |
Descriptions render as sanitized HTML in readers, where bare newlines
collapse and the feed/score line ran into the article text. Wrap the
headline in <p><em> so it breaks cleanly and reads as metadata, escaped
on the wire by encoding/xml as description-carried HTML should be.
|
| |
|
|
|
|
|
|
|
| |
Item titles gain a rune-capped source-feed suffix so list views (which
only ever show the channel title) display provenance inline. Item bodies
open with feed, model score, and the batch-wide score median; the median
is computed over every scored entry at poll time and stored on the run
row as a nil-safe pointer, so old rows render without it. /api/status
exposes the median too.
|
| |
|