The problem in brief
You receive 22,458 Philippine online news articles (2016 to 2018) in English, Filipino, Taglish and some regional languages, and no labels at all. For each article your pipeline must output six fields: veracity (Real or Fake), one of six manipulation types (Authentic, Satire-as-fact, Opinion-as-fact, Politically-motivated fabrication, Misleading-headline, Fabricated), a target group, a harm level, a fact-check flag, and a confidence score. The intended tool is a free-tier LLM API (Gemini, Groq, OpenRouter) driven by few-shot prompts, with strict JSON output and retry logic for rate limits. One rule shapes everything: the hidden labels come from the source website of each article, but mapping sources or URLs to labels is forbidden. You must judge content, tone and rhetoric.
What we could reproduce. Free-tier APIs need accounts, which we may not create, so the LLM part of the intended pipeline cannot be run here. The Kaggle leaderboard labels are private, but the statement says they are derived from the public Philippine Fake News Corpus. A previous step rebuilt per-article labels from that corpus, used only for scoring, never for fitting, and drew a balanced evaluation sample of 360 articles (60 per manipulation type). All numbers below are on that sample, also reweighted to the real class mix.
How you are scored
The Kaggle part is the macro-F1 of veracity and of manipulation type, averaged over classes:
with and the precision and recall of class . It is converted into points relative to the best candidate, , so there is no absolute target. Calibration of confidence_score is graded by the expected calibration error
over 10 confidence bins: ECE below 0.1 is "Elite", 0.1 to 0.2 "Strong". Prompts, ethics and engineering are reviewed by hand. There is a 2-point penalty if more than 90 % of the confidences are exactly 1.0, and 5 points for any source lookup.
Two facts about the labels matter. The class mix is very unbalanced: 14,802 Authentic and only 532 Fabricated. And labels are per source: every Adobo Chronicles article is "Satire-as-fact", whatever it says. Content alone therefore has a ceiling, especially for the six-way type.
First look at the data
Credible broadsheet articles look like wire reports: long, many attributions ("said", "according to", "ayon kay", "sinabi"), few exclamation marks, no direct address to the reader. The not-credible sites mix rants in the first and second person, calls to "share" or "watch the video", and much shorter texts. Satire (Adobo Chronicles) is the hard case: it deliberately imitates the broadsheet style.
A first baseline
- Naive benchmark (the organisers' file): everything Real / Authentic. On the real class mix this gives veracity macro-F1 0.397 (it gets the 66 % majority right and has F1 0 on Fake) and type macro-F1 0.132.
- A small local LLM as a stand-in for the API. Within our 3 GB memory budget the largest instruction model we could run is Qwen2.5-0.5B-Instruct. We gave it a careful system prompt (code-switching, regional languages, "judge by content, never by the website"), category definitions and four few-shot examples, then read the probabilities of the letters A to F, about 1 s per article on the GPU. The result is sobering: the probability of "Authentic" separates Real from Fake with AUC 0.51, chance level, and the macro-F1 drops below the naive baseline (0.25 veracity, 0.07 type on the real mix). Contextual calibration, i.e. dividing by the probabilities given to an empty input, does not help, because there is no signal to recalibrate. A 0.5B model cannot do this task. The intended free-tier models are 10 to 100 times larger.
The key idea
Two things can be done with no labels at all, and both are rewarded by the rubric.
1. Rhetoric as a measurable signal. Encode a few cues as rates per word, fixing the direction of each before looking at any label: exclamation marks, all-caps words, first-person and second-person pronouns, calls to share or watch, length (negative direction), and attribution verbs (negative direction: reporting sounds like reporting). Each cue has its English, Filipino, Cebuano, Ilocano and Waray forms ("ako, kami, tayo, siak", "ayon kay, sinabi, matod pa, kuna ni"), which is also how the pipeline answers the linguistic-equity requirement. Each cue is standardised robustly on the unlabelled test set, , clipped to , and the score is the plain sum of the 's. No weight is learned.
2. Use the prior the statement gives you. The statement says 7,656 of the 22,458 articles are not credible. Instead of guessing a threshold, label as Fake exactly the 34 % highest scores:
where is a quantile over the unlabelled test set. Then turn the distance to the threshold into a monotone probability, , and set confidence_score . The confidence is high far from the threshold and close to 0.5 near it, which is exactly what ECE asks for.

The middle panel shows why the sum works: every cue alone is weak (AUC 0.54 to 0.76; the capital-letters cue is even slightly backwards), but summing roughly independent weak cues gives AUC 0.80. Politically-motivated fabrications and misleading headlines score very high, while satire overlaps the authentic articles: content cannot separate a good parody from the original style.
The full solution
- Features per article: 7 rhetorical rates (plus a "politics" density used only for the type).
- Score and veracity: robust on the unlabelled test set, sum, threshold at the published prior.
- Confidence: logistic of the distance to the threshold. No confidence is exactly 1.0 (2 % are above 0.99, median 0.78), so the overconfidence penalty is avoided by construction.
- Manipulation type (rules, for articles predicted Fake): heavy politics plus first or second person gives Opinion-as-fact; heavy politics alone, Politically-motivated fabrication; many share/viral cues, Misleading-headline; more attributions than the median (deadpan news style), Satire-as-fact; otherwise Fabricated.
- Other fields: target group Political-figure when politics is dense, otherwise None; harm High for political or viral fakes, Medium for other fakes, None for real articles;
needs_fact_check= Yes if Fake or confidence below 0.7. - Output the 134,748 rows
[index]_[field].
In the intended contest pipeline, the LLM would replace steps 4 and 5 (and refine step 2), with strict JSON parsing and exponential backoff around each API call. The prior-matched threshold and the score-to-confidence mapping still apply on top of the LLM's probabilities: an LLM's raw verbal confidence is notoriously overconfident.
Results
360-article balanced sample, labels rebuilt from the public corpus (scoring only). "Real mix" reweights each type to its true frequency in the 22,458 articles, which is what a leaderboard on the full test set would see.
| approach | veracity F1 (balanced) | type F1 (balanced) | veracity F1 (real mix) | type F1 (real mix) | ECE (real mix) |
|---|---|---|---|---|---|
| naive benchmark: all Real / Authentic | 0.143 | 0.048 | 0.397 | 0.132 | 0.33 |
| Qwen2.5-0.5B few-shot (letter probabilities) | 0.455 | 0.126 | 0.254 | 0.072 | 0.49 |
| same + contextual calibration | 0.455 | 0.102 | 0.254 | 0.036 | 0.59 |
rhetorical score + prior threshold + rules (final, solution.py) | 0.610 | 0.178 | 0.653 | 0.184 | 0.081 |
The final pipeline separates Real from Fake with AUC 0.80. Its ECE of 0.081 is in the "Elite" calibration band, and it is far above the naive benchmark on veracity. The six-way type stays weak (0.18): the confusion matrix shows satire is mostly called Authentic (27 of 60), and the four other fake types are mixed among themselves. That is the expected ceiling of rhetoric-only rules against source-level labels.
Honest limits. We could not run the free-tier LLMs the task is built around, so this is not a reproduction of a contestant's leaderboard score. No published leaderboard value exists to compare with (points are relative to the best candidate). The cue lists were written before scoring and evaluated once; the 360-article sample is small (one article is about 0.3 points of F1).
What to remember
- With no labels, use every number the organisers publish. The 34 % prior turned a score into a decision rule without any training data.
- Calibration is a separate, cheap win. A monotone map from score to probability, centred on the decision threshold, gave ECE 0.08 for free. Never output a constant or verbal "100 % sure" confidence.
- Sum many weak, interpretable cues. Seven cues with AUC 0.54 to 0.76 add up to 0.80, and every decision can be explained, which the manual ethics review rewards.
- Measure your model before trusting it. A 0.5B LLM with a polished prompt was at chance level. Check AUC against a trivial baseline before building a pipeline around a model.
- Know what the labels mean. Source-level labels cap what content can achieve. Satire that perfectly imitates journalism is indistinguishable by style, so do not over-tune on it.