About HN HRCB
HN HRCB is a mirror of Hacker News that
evaluates every story's linked content against the 30 articles and preamble of the UN Universal Declaration
of Human Rights. Each evaluation produces a Human Rights Compatibility Bias (HRCB) score showing how the
content's editorial and structural signals align with fundamental human rights provisions.
A cron worker crawls HN stories every 5 minutes across 6 lists (top, new, best, ask, show, job),
tracking all stories but only auto-evaluating those in the top 7 pages (210 stories) of the
front page plus the top 30 from the best, ask, and show feeds. Stories outside this range are tracked but skipped unless manually triggered.
Fetched content passes through a content gate that classifies non-evaluable pages (paywalls, captchas, bot protection, etc.)
before dispatch. Evaluable content is cleaned and sent via a Cloudflare Queue. A separate consumer worker
evaluates each URL against the UDHR methodology (v3.7) using Claude, with DCP caching per domain
and content snapshots stored in R2. Results are displayed alongside standard HN metadata.
The evaluator operates as a Fair Witness (evidence breakdown) — reporting only what is
directly observable, with no inference beyond the evidence.
Core Construct: HRCB Human Rights Compatibility Bias (HRCB) measures the directional lean
of web content relative to the provisions of the UDHR.
A positive score indicates content that aligns with UDHR provisions; a negative score indicates
content that conflicts with them.
| -1.0 | ← | Strong negative | | | Neutral | | | Strong positive | → | +1.0 | Classification & Sentiment Reference Classification Labels | Strong positive | +0.60 to +1.00 | | Positive | +0.30 to +0.59 | | Leaning positive | +0.10 to +0.29 | | Neutral | -0.09 to +0.09 | | Leaning negative | -0.10 to -0.29 | | Negative | -0.30 to -0.59 | | Strong negative | -0.60 to -1.00 | Story-Level Labels | Theme Tag | Dominant human rights theme (e.g., "Privacy & Surveillance", "Free Expression") | | Sentiment | Overall disposition: Champions, Advocates, Acknowledges, Neutral, Neglects, Undermines, Hostile | | Summary | 2-3 sentence narrative summary in Fair Witness style | Sentiment Labels | Champions | Strongest positive alignment — content actively defends and promotes UDHR provisions | | Advocates | Actively promotes rights-aligned positions with clear editorial support | | Acknowledges | Recognizes rights issues without strong advocacy or opposition | | Neutral | Balanced or no clear directional lean on human rights | | Neglects | Overlooks or minimizes rights concerns that are relevant to the topic | | Undermines | Actively works against rights provisions through content or framing | | Hostile | Strongest negative alignment — content attacks or denies fundamental rights | No Data vs 0.0 No Data No relevant content for this UDHR article. The topic is simply absent. 0.0 (Neutral) Relevant content exists but has balanced signals, netting to zero. The Universal Declaration of Human Rights
Adopted by the United Nations General Assembly on 10 December 1948 (Resolution 217 A),
the UDHR is a milestone document in the history of human rights. It has been translated
into over 500 languages. The Declaration consists of a Preamble and 30 Articles covering civil, political,
economic, social, and cultural rights — from the right to life and liberty
(Article 3) to freedom of expression (Article 19) to the right to education (Article 26).
Methodology Signal Channels Editorial What the content says. Analyzes text, arguments, framing, and sourcing. Structural What the site does. Examines privacy, accessibility, tracking, access models.
Channels are weighted by content type (e.g., Editorial=0.6, Structural=0.4).
Combined: (wE × Editorial) + (wS × Structural).
Content Type Weights | Code | Type | E | S | | ED | Editorial / News | 0.65 | 0.35 | | PO | Policy / Legal | 0.70 | 0.30 | | LP | Landing Page / Marketing | 0.40 | 0.60 | | CM | Community / Forum | 0.55 | 0.45 | | DC | Documentation / Reference | 0.50 | 0.50 | | AC | Academic / Research | 0.75 | 0.25 | | HR | Human Rights Focused | 0.60 | 0.40 | | PR | Product / Service | 0.40 | 0.60 | | PB | Personal Blog | 0.70 | 0.30 | | SO | Social Media | 0.50 | 0.50 | | OT | Other | 0.55 | 0.45 | Content Type Consensus Vote
Content type classification directly determines the E:S weight split, so misclassification can meaningfully distort the final HRCB score.
For example, an editorial article (ED: E=0.65, S=0.35) misclassified as a landing page (LP: E=0.40, S=0.60) shifts 25 percentage points of weight from the editorial channel to the structural channel.
When multiple models evaluate the same story, the system uses a majority vote to determine the consensus content type rather than trusting any single model's classification.
Each full-mode rater contributes one vote; lite-mode raters do not vote (they don't classify content type). The plurality type becomes the consensus content type used for weight assignment.
Validation metrics tracked on the models dashboard:
- Suspect rate — structural-heavy types (PO, LP, PR, AC) where the structural channel has no data, suggesting misclassification
- Cross-model disagreement — stories where raters assigned different content types, indicating ambiguous content
Per-Provision Pipeline Content → E + S → Weights → Combined → DCP → Final → HRCB aggregate
Each of 31 UDHR provisions (Preamble + Articles 1-30) is scored independently on both channels. Per-provision fields:
| editorial | Editorial channel score for this provision | [-1, +1] | | structural | Structural channel score for this provision | [-1, +1] | | combined | Content-type-weighted blend of E + S | [-1, +1] | | final | After DCP modifier (±0.30 max per article) | [-1, +1] | | evidence | Evidence strength for this provision | H / M / L / ND | | directionality | How the content engages with this right | A / P / F / C | SETL — Structural-Editorial Tension Level
SETL measures the divergence between editorial and structural signals for each article.
It captures whether a site's words and infrastructure tell different stories.
| -1.0 | ← | S-dominant | | | Balanced | | | E-dominant | → | +1.0 |
Formula: sign(E-S) × √(|E-S| × max(|E|, |S|)).
A high absolute SETL means the site's content and infrastructure are misaligned on human rights.
Fair Witness Evidence Layer
Inspired by Heinlein's Fair Witnesses from Stranger in a Strange Land,
every evaluation separates its evidence into two categories:
Observable Facts Directly verifiable statements grounded in page content. Any reader could confirm these by visiting the page. Inferences Interpretive conclusions drawn from the observable evidence. These explain why the evidence maps to the score.
The FW Ratio (Fair Witness Ratio) is the proportion of observable facts
to total evidence items. A high ratio means the evaluation is well-grounded in verifiable observations;
a low ratio means more interpretive weight. Toggle Fair Witness
on any item page to switch between the standard view and a stripped-down view showing only the evidence breakdown.
FW Ratio FW Ratio = observable_facts / (observable_facts + inferences)
Scale [0, 1]. Higher = evaluation more grounded in verifiable observations; lower = more interpretive weight.
Evidence Strength & Confidence | High | Direct, explicit content with strong sourcing (max score 1.0) | | Medium | Clear signal but may be secondary (max score 0.7) | | Low | Tangential, indirect, or weakly sourced (max score 0.4) | | ND | Topic absent from content — not counted in aggregate (score 0.0) | Confidence is an evidence-weighted aggregate across all 31 provisions:
H=1.0, M=0.6, L=0.2, ND=0.0. Higher confidence means more provisions had strong evidence.
Directionality Markers | Advocacy | Explicitly argues for or against a right | | Practice | Site infrastructure reflects a rights stance | | Framing | Presents issues in a rights-aligned or rights-opposed frame | | Coverage | Factual content relevant to human rights topics | Volatility
Standard deviation of per-provision combined scores. Measures how uniformly content aligns across different rights.
| Low | < 0.10 — Consistent alignment across provisions | | Medium | 0.10 - 0.25 — Mixed signals across provisions | | High | > 0.25 — Aligns on some rights but conflicts on others | Consensus (Multi-Model)
When multiple models evaluate the same story, a consensus score is computed as a weighted mean.
Each rater's weight combines three factors: prompt mode (full = 1.0, lite = 0.5),
self-reported confidence (floored at 0.2 so no model is silenced), and a content truncation discount.
| Score | Weighted mean across all rater evals [-1, +1] | | Spread | Max minus min score across raters — measures disagreement | | Count | Number of models that contributed evaluations | How Evaluations Work - A URL from HN's top 7 pages (plus top best/ask/show) is fetched as the unit of analysis (other stories can be manually triggered)
- The page's content type is classified (Editorial, Community, HR, etc.); when multiple models evaluate the same story, a majority vote determines the consensus type
- Channel weights are assigned based on the consensus content type
- A Domain Context Profile (DCP) is constructed from 8 domain-level elements
- Each of 31 UDHR provisions is scored for editorial and structural signals
- Fair Witness evidence (observable facts + inferences) is recorded per provision
- Story-level labels are generated (theme tag, sentiment, executive summary)
- Nine supplementary signals are assessed (EQ, PT, SO, ET, SR, TF, GS, CL, TD)
- Aggregate statistics are computed (weighted mean, evidence profile, confidence, SETL, etc.)
- A final classification is assigned (Strong positive to Strong negative)
Evaluation Modes
Two evaluation modes serve different cost/quality trade-offs. Stories with only a lite evaluation
show ~lite in the feed.
| Full | ~lite | | Channels | Editorial + Structural | Editorial only | | Provisions | 31 per-provision scores | Single aggregate score | | DCP | Yes (8 domain elements) | No | | Fair Witness | Yes (facts + inferences) | No | | Supplementary | All 9 signals | 5 (EQ, SO, TD, valence, arousal) + tone | | SETL | Yes | No (single channel) | | Confidence | Evidence-weighted | N/A | | Output tokens | ~4-5K | ~200-400 | | Schema | 3.7 | lite-1.4 | | Models | Claude Haiku 4.5, DeepSeek V3, Llama 3.3 70B | Workers AI (Llama 4 Scout, Llama 3.3 70B) | | Feed label | HRCB | ~lite |
Lite item pages display an editorial summary card instead of the full heatmap.
Lite scores are editorial-only and not directly comparable to full weighted means.
Supplementary Signals & Factions Supplementary Signals
Nine supplementary signals capture how content communicates, orthogonal to HRCB which measures
directional lean. These are grounded in established psychometric and information quality frameworks.
See the live signal dashboard for global averages and distributions.
| EQ | Epistemic Quality | Source quality, evidence reasoning, uncertainty handling, purpose transparency. Based on the CRAAP Test framework from library science. | | PT | Propaganda Flags | Detects 18 propaganda techniques (loaded language, strawman, whataboutism, etc.). Based on Da San Martino et al. (2019) PTC-18 corpus. | | SO | Solution Orientation | Problem-only vs solution-oriented framing, reader agency score. | | ET | Emotional Tone | Primary tone label + valence/arousal/dominance dimensions. Based on Russell's Circumplex Model of Affect. | | SR | Stakeholder Voice | Who speaks vs who is spoken about, perspective count, voice balance. Power-axis taxonomy aligned with UDHR rights-holder/duty-bearer framework. | | TF | Temporal Framing | Retrospective, present, or prospective focus; time horizon from immediate to long-term. | | GS | Geographic Scope | Local, national, regional, or global scope with specific regions mentioned. | | CL | Complexity Level | Reading level, jargon density, and assumed knowledge requirements. | | TD | Transparency | Author identified, conflicts disclosed, funding disclosed. | Domain Signal Profiles (Factions)
The Factions page clusters domains by editorial character
— how they cover topics, not just what they score. Instead of using the 31-dimension UDHR fingerprint,
it clusters on 8 normalized supplementary signal dimensions:
| EQ | Epistemic Quality | SR | Stakeholder Representation | | SO | Solution Orientation | TD | Transparency & Disclosure | | PT | Propaganda (inverted) | AR | Arousal | | VA | Valence | FW | Fair Witness ratio |
Each dimension is z-normalized (zero mean, unit variance) across all domains with 3+ evaluations.
Cosine similarity on the resulting 8D vectors measures editorial character similarity. Domains are
clustered using agglomerative hierarchical clustering with average linkage at golden ratio thresholds:
| Faction | sim ≥ 1/φ (0.618) — core editorial alignment | | Alliance | sim ≥ 1/φ² (0.382) — sympathetic but distinct | | Acquaintance | sim ≥ 1/φ³ (0.236) — occasional overlap | | Neutral | sim ≥ 0 — no meaningful relationship | | Rival | sim < 0 — oppositional editorial profiles | Domain Context Profile (DCP)
Eight domain-level elements provide context modifiers:
| Privacy | ToS | Accessibility | Mission | | Editorial Code | Ownership | Access Model | Ad/Tracking |
Each element shifts per-article scores by up to ±0.30.
DCP profiles cached 7 days in KV, persisted to D1. Only used in full evaluations (not lite).
Content Gate
A pre-evaluation content classifier that identifies non-evaluable pages before they enter the evaluation queue. Pure regex — no LLM calls.
| Category | Description | | paywall | Subscription wall blocks content access | | bot_protection | Cloudflare/Akamai challenge pages | | captcha | CAPTCHA or verification required | | login_wall | Authentication wall | | cookie_wall | Cookie consent blocks content | | geo_restriction | Region-restricted content | | age_gate | Age verification required | | app_gate | Content only available in mobile app | | rate_limited | Rate limit or throttle page | | error_page | 404, 500, or other error pages | | redirect_or_js_required | Redirect chains, dead ends, or JavaScript-only SPAs | | binary_content | PDF, binary, or non-text content type (detected via Content-Type header) | | js_rendered | URL fetched successfully but returned no readable text (JS-rendered SPA) | | no_content | Story has no URL and no self-text (cannot evaluate) | | hn_removed | Story flagged, deleted, or removed from HN after submission |
Runs at two points: cron pre-fetch (primary gate) and consumer (safety net for KV cache misses).
Writes gate_category and gate_confidence to the stories table.
Feeds & Integration RSS Feeds (Atom)
Subscribe to HRCB-evaluated stories via /feed.xml.
Filter by stance, UDHR provision, or domain — combine freely.
Filters combine: /feed.xml?article=12&filter=negative = negative stories affecting privacy.
Download OPML to import all 31 UDHR provision feeds into your reader at once.
Embeddable Score Badges
Embed a domain's HRCB score anywhere — GitHub READMEs, blog footers, documentation.
Markdown:

HTML:
<img src="https://observatory.unratified.org/api/v1/badge/example.com.svg" alt="HRCB Score">
Badge colors match the HRCB score scale (red → amber → green). Cached for 1 hour.
Version History & Technical Details Version History | v1 | External-source methodology, domain-level evaluation | | v2 | On-domain-only, ND vs 0.0 distinction, evidence strength | | v3 | URL-level HRCB with Editorial/Structural channels, content types, rubrics | | v3.3 | Consolidation + roadmap | | v3.4 | Batch protocol, adversarial robustness, JSON output | | v3.5 | Fair Witness evidence layer, SETL, confidence metric | | v3.6 | Story-level labels (theme tag, sentiment, executive summary) | | v3.7 | Current — Nine supplementary signals (EQ, PT, SO, ET, SR, TF, GS, CL, TD) | Technical Details | Schema | 3.7 | Framework | Astro + CF Pages | | Evaluator (full) | Claude Haiku 4.5 | Database | Cloudflare D1 | | Evaluator (~lite) | Workers AI (Llama 4 Scout, Llama 3.3 70B) | Snapshots | R2 (content audit trail) | | Cron | Every 5 min (6 HN lists, top 7 pages) | Cache | KV (content + DCP) | | Queue | CF Queues (fan-out) | Lite schema | lite-1.4 (editorial only, integer 0-100) | |