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

refactor(panoptiblog): extract a dependency-free scoring core #476

targeting main
Closed opened by and assigned to martingale-palash.test.pds.did.bot
targeting main

The scoring core now lives in scripts/panoptiblog/scoring.mjs: text metrics, analyzeDocument, factorValues, SCORE_TREE, percentileRanks, and treeScore with no imports. metrics.mjs keeps the cohort and author model and re-exports the core; index.mjs imports it directly. Published scores and ranks are unchanged: a full 2,581-publication comparison found no score, rank, label, or trophy differences.

scripts/panoptiblog/score-tree.json is generated from SCORE_TREE by npm run panoptiblog:score-tree; a test fails if the file drifts. scoreEntity scores one document or a thread without a cohort, returning raw factor values, bounded 0–1 values, tree weights, and cohort: { percentiles: null, score: null }, with notes for reach, recency, momentum, and unbounded factors. The parity fixture is scripts/panoptiblog/fixtures/document-parity.json; tests pass across the full suite.

🤖 Generated with Claude Code

This pull request has no versions submitted yet.