Browser extension: detect and subscribe to standard.site publications on ATProto substandard.blog

feat(longread): score threads with the panoptiblog tree #509

targeting main from claude/threadbare-score
Closed opened by and assigned to category-karambit.test.pds.did.bot
targeting main from claude/threadbare-score

Threadbare now scores threads with panoptiblog's canonical score tree, version 18. A scan or follows cohort gets factor percentiles within that cohort, six composite scores and an overall percentile. Each post is read as a document — prose, links, embeds and at:// references — and the displayed score is a percentile, not a sum of raw counts. A single thread has no cohort, so it reports raw and bounded factors and says so. Version 18 ranks positive values only for sparse factors; Network link inputs are per kiloword.

Factors that describe publications use Bluesky-post comparables. Audience: reach is log1p(likes), recommends is log1p(reposts + quotes). Network: citations is log1p(root quotes per kiloword), sources is distinct outbound link hosts per kiloword, and embeds is at:// references per kiloword. Pulse: audience inflow is root engagement relative to the author's recent median. Consistency: thread continuity is 1 / (1 + dropped branches), and cadence is the canonical gap-Gini formula over the thread's own posts. Style: structure is entropy over text, image, external, quote and video formats, normalized by the five Bluesky formats. The as-is factors are volume, posts, depth, MTLD, Zipf rarity, readability, recency, distinct link hosts and at:// density. Weights and bounds come only from scripts/panoptiblog/score-tree.json; there are no private weights. Likes, reposts and quotes remain visible diagnostics.

There is no default word floor: a scan keeps every chain with --min-posts (default 5), and --min-words is optional at 0. The table shows the top quarter by cohort percentile; --min-percentile 0 shows every thread, and the cutoff is skipped for cohorts under five. The CLI defaults to ten years of history and includes reply-started chains; --no-include-replies and --since narrow it. Covered by 20 Rust tests (4 unit, 12 integration, 4 parity; 1 ignored live test), cargo fmt --check and cargo clippy --all-targets -- -D warnings. The parity fixture checks the as-is factors against the JS core; the adapted factors have explicit expected values. This branch includes the CLI core until #480 lands; rebase it then to leave only the scoring commit. The browser app and sign-in are in #482.

A default scan, best first:

Canonical score table

🤖 Generated with Claude Code

Commits 9

feat(longread)!: follow panoptiblog v18
feat(longread): default to the top quarter by percentile
feat(longread)!: follow panoptiblog v17 without a word floor
feat(longread): default to the full history and reply-started chains
fix(longread): describe score factors in thread terms
feat(longread): score threads with the panoptiblog tree
feat(longread): embed quotes, hide published threads and add a publication view
test(longread): cover ranking, paging, opt-out and export
feat(longread): add scan and export commands