Paulopus
World Cup 2026 oracle — predictions, briefs and the writer routine.
Context
The FIFA World Cup 2026 ran from June 11 to July 19, 2026. Paulopus is a prediction site built to run alongside it, fronted by an oracle octopus whose name is a deliberate double pun: Paul the Octopus, the animal that became known for correctly calling 2010 World Cup results, crossed with Claude Opus, the model doing the picking this time around.
The premise sits at the intersection of a joke and an engineering problem. An octopus predicting football is absurd on its face. Reusing that image for an AI oracle keeps the joke intact while asking a straight question underneath it: can a language model, working from real data and on a fixed public schedule, commit to a scoreline before kickoff and then be judged, honestly, against what actually happened?
This page is the record of how that question got answered in practice. It is built as a case study — a set of linked pieces, each one a close, sourced account of a single part of the system, gathered here into one narrative that reads top to bottom. The format exists because "we built an AI that predicts football" is not, on its own, a claim anyone should take at face value. The pieces underneath this page are where the verification lives: the data model, the scoring rules, the pipeline that generated the writing, the numbers the octopus actually posted. This page compresses that work into a single pass — what the project set out to do, how it was built, what happened when the results came in, and what the build taught in hindsight.
Everything below traces back to those pieces. Nothing here is asserted without a page underneath it that shows the work.
Intention
The ambition was specific: build an AI that predicts match scorelines and grades itself publicly and deterministically, in the open, for the entire duration of a World Cup. Not a single flashy pick, and not a private scoring spreadsheet — a running, visible record where every call is locked before a ball is kicked and every verdict is computed the same way every time, from the same data, with no discretion applied after the fact. The bar was accountability as a feature, not an afterthought bolted onto a prediction feed.
That ambition ran headfirst into a constraint that could not be negotiated: the tournament schedule. Kickoffs land when FIFA says they land. Nothing about 104 matches on fixed dates moves because a script is behind, a deploy is broken, or a routine didn't run in time. A prediction that isn't locked before its match starts isn't late — it's simply gone, because the match itself has already answered the question. That asymmetry shaped the whole build: the editorial pipeline that researched and wrote every pronostic, brief, and debrief had to keep pace with reality itself, not with an internal notion of "done." There was no slipping a deadline by a day to polish something. Either the machinery produced a committed call before kickoff, or the match went unpredicted.
That combination — a public, deterministic scorecard, running unattended against a schedule with zero slack — is the thread that runs through everything that follows: how predictions were timed and locked, how a single match's record was structured to hold a before and an after, how karma was computed so it could never drift from the matches that produced it, how the underlying results were sourced from a source of truth rather than guessed at, how the writing itself got generated without a human in the loop for every match, and how the whole thing was skinned in a voice and a look distinct enough to be worth building a mascot for.
Execution
The build starts with time. The Prediction Timelines piece covers the arc every call goes through: live and revisable while a fixture is still ahead, then frozen into a verdict once the result lands. The home page split into Upcoming, History, and Teams tabs so that arc was structural rather than a badge to read, with the move to History delayed to kickoff plus two hours so no match vanished from view mid-game. Underneath that sits a drafts[] revision history — the pronostic can absorb a confirmed lineup or a fresh injury report right up to kickoff — backstopped by a deadline-lock fallback that guarantees every match that kicks off has a call attached to it, even if the scheduled routine missed its narrow primary window.
That timeline lives inside a single match record, covered in Match Anatomy: each of the 104 matches splits into a Pronostic, Brief, and Debrief tab, mapped to distinct fields rather than a view filter, with a structured DetailedBrief written once before kickoff and source citations rendered as branded chips instead of raw URLs. Karma & Accountability is the layer that gives the whole thing teeth: four deliberately asymmetric verdicts — Perfect, Inspired, Missed, RedCard — scored against the score actually played, not the 90th minute, with no stored ledger; karma is derived fresh from the match records on every read, so nothing can drift out of sync with the outcomes that produced it.
None of that grading means anything without trustworthy results, which is what the Live Data Pipeline piece covers: openfootball/worldcup.json as the single authoritative source for fixtures and scorelines, seeded and synced into MongoDB during the live tournament, then frozen into a static snapshot once the tournament ended. The writing itself — every pronostic, brief, and debrief — came out of the Agentic Editorial Pipeline: a claude.ai scheduled routine, not a billed API harness, doing its own research and prose, gated by pure functions that computed exactly what work was due and rationed under a fixed per-run budget, writing back through a single guarded ingest path that enforced append-only, pre-kickoff-only, https-only rules mechanically. Wrapping all of it is Brand & Voice: a fully committed retro pixel aesthetic, pixel-art flags, a mascot that reacts to each verdict, and an octopus persona kept scoped strictly to the match content it generates — never leaking into the chrome around it.
Outcome
The scorecard is the point, and the numbers are drawn from the Prediction Performance focus: all 104 matches of the tournament were graded, ending at a net karma of +25. The distribution across the four verdicts was 14 Perfect, 39 Inspired, 16 Missed, and 35 RedCard — meaning the octopus landed a positive-karma call (Perfect or Inspired together) 53 times out of 104, a hair over half, while a third of its calls went red.
The shape of that record has texture beyond the headline total. The fourteen exact hits skewed toward the knockout rounds — eight came from the group stage, six from the round of 32 onward, including calls on the France–Morocco quarter-final and the England–Argentina semi-final — a sign the predictions got sharper, not looser, as the field narrowed. The misses had their own pattern: the recurring failure mode was a confidently predicted decisive scoreline that the match instead settled as a draw, with the knockout stage delivering some of the hardest reversals, including a semi-final that flipped entirely and a third-place match that detonated into a 4-6 that no 2-1 call could survive.
Streaks tell the volatility story a net total can't. At its best, the product strung together ten consecutive positive-karma verdicts in a row; at its worst, it went four matches red in a row. That asymmetry — a peak streak more than double the worst slump — is a meaningful part of why the tournament closed with karma above water despite RedCards claiming a third of the graded matches.
The record isn't fully clean, and the Outcome page says so directly rather than smoothing it over: four graded matches carry a verdict but no prediction on file, having apparently lost their originating prediction in a mid-project migration. Their verdicts survived and are counted in every number above — the +25 net, the 104 graded total, the streaks all include them, which is exactly why these figures match the product's own public karma page rather than a cleaner, recomputed one.
Reflection
Running an unattended agent for six weeks against a schedule that cannot be renegotiated surfaced lessons no amount of planning would have produced, and the Research & Process Reflection focus is where the builder lays them out directly. The biggest structural bet — moving generation off a billed API harness and onto a claude.ai scheduled routine running under a Max subscription, at zero marginal API cost — is the pivot described as one to make again without hesitation. But it came with a real cost: pushing generation into a cloud sandbox meant the routine couldn't open a raw connection to the database, so it wrote back by dispatching an encoded payload into a CI workflow instead. That bridge failed silently once, when a large run exceeded the dispatch size ceiling and was dropped with no visible error — a reminder that when nobody is watching a scheduled process in real time, a failure that doesn't announce itself simply doesn't get noticed.
The honest wrinkle in the data gets named plainly rather than hidden: four already-graded matches lost their originating prediction when the storage model migrated from write-once locks to a revisable drafts history. The verdicts and karma for those four are real and are fully counted, but the specific scorelines that earned them can no longer be shown or reconstructed — inferred to have been dropped silently in that schema change rather than deliberately discarded. It's flagged as the one change the builder would most want back, and the lesson drawn from it is concrete: a migration touching already-graded rows should fail loudly rather than quietly drop a field four scored records depended on.
Other decisions read as more settled in hindsight. Grading was reworked partway through to score matches on what was actually played — extra time, penalties — rather than the 90-minute score, correcting nine knockout verdicts that a regulation-only rule had gotten wrong. And two features that were designed and never built, or built and later removed, are treated as correct calls rather than gaps: a fixed deadline, it turns out, is very good at showing you which planned surface area was never worth carrying.








