The record

Every hit. Every miss.

Every prediction is put on the record before kickoff — with its reasoning, and with no way to change it afterwards. Results follow later, the missed ones too. Next to them stands what the plain table favourite would have got right: a prediction that does not beat it is not one.

Checked so far

Record by competition

How to check it yourself

For every match the largest model value counts. Compare it with the result event of the same matchId. The table favourite is right when its stored outcome matches the result.

The finished record is at /v1/competitions/de.bl1/record, the raw events at /v1/ledger. Both answers are open and need no key.

A match without a recorded prediction does not count. It does not disappear either: it stands in the protocol as an event of its own, so it stays visible that nothing was filled in afterwards.

Why nothing can be fitted afterwards

Every event carries a checksum over itself and over its predecessor: sha256(prevHash + "\n" + JSON of the event), keys sorted alphabetically, without the hash and prevHash fields themselves. Whoever kept an older answer spots any later change by a checksum that no longer adds up.

The chain makes a change visible, not impossible. We deliberately do not recompute it in the browser: the stored payload holds values such as 0.0, which JavaScript shortens to 0 when it converts them — the check would then report a break where there is none. The tool tool/verify_ledger_chain.dart recomputes it correctly in Dart.

What the protocol below states is therefore the chainIntact field of the service answer — the service reporting on itself, not a check by this page.