The four subscores
Origin Score (weight: 30%) — URL reachability. Can the original post be accessed at its claimed source? The verifier agent checks whether the URL is reachable and whether platform-specific signals (hostname, structure) match the declared platform. A clean match scores
1.0; a mismatch defaults to 0.5.Corroboration Score (weight: 25%) — AI confidence. This is the
confidenceScore returned by the Gemini-powered corroboration agent after searching trusted domains for independent sources that support or refute the claim. Ranges from 0.0 (no evidence) to 1.0 (strong independent confirmation).Bias Score (weight: 25%) — Source ratio. Calculated as the ratio of supporting sources to total sources found:
supportingSources / totalSources. When no sources are found, the score defaults to 0.5 (neutral) to avoid penalizing posts that are simply too niche to index.Temporal Score (weight: 20%) — Timestamp alignment. Does the post’s publication date match the narrative it belongs to? The verifier agent checks timestamp coherence against search results. The current implementation defaults to
0.8 when no strong temporal contradiction is detected.Weighted formula
The exact formula fromsrc/lib/postcard.ts:
SCORING_WEIGHTS is defined in src/lib/config.ts:
Score interpretation
| Range | Verdict | Meaning |
|---|---|---|
| 80–100 | verified | Multiple trusted sources confirm the core claims. Strong forensic signal. |
| 50–79 | inconclusive | Some related sources found, but insufficient evidence to confirm or deny. |
| 1–49 | disputed | Evidence is mixed, or trusted sources actively contradict the claims. |
| 0 | insufficient_data | No meaningful sources found. Pipeline may have been blocked by a login wall or rate limit. |
Verdict states
The verdict is determined independently by the corroboration agent and stored alongside the numeric score. The four possible values are:verified— Multiple trusted sources confirm the core claims.disputed— Evidence is mixed, or trusted sources contradict the claims.inconclusive— Insufficient evidence to determine truthfulness, but some related sources were found.insufficient_data— No meaningful sources found to evaluate the content.
How the score is stored
The database storespostcardScore as a real column (0–100 integer range) in the postcards table:
0.0–1.0 float:
85 becomes 0.85 in the API response.
Configuring weights
Override the default weights with environment variables. All four must be set together if you change any of them.| Variable | Default | Description |
|---|---|---|
POSTCARD_WEIGHT_ORIGIN | 0.3 | Weight for URL reachability score |
POSTCARD_WEIGHT_CORROBORATION | 0.25 | Weight for AI corroboration confidence |
POSTCARD_WEIGHT_BIAS | 0.25 | Weight for supporting/total source ratio |
POSTCARD_WEIGHT_TEMPORAL | 0.2 | Weight for timestamp alignment score |