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:
🤖 Generated with Claude Code