Contested results
Anyone can challenge a published verification with a counter-source. Every challenge filed lands here, including the open ones and the ones we lose. The log is append-only and hash-chained, so a loss is as hard to hide as a win.
Schema v1, committed 20 August 2026 before the first entry existed · machine-readable dump · dump with the full chain
Read this before the numbers below. As of 20 August 2026 there are zero disputes. The log is built and empty, and an empty constraint constrains nothing. By our own published standard this page is a press release until four things are true: 50 disputes on file including ones that went against us, the head hash published on a schedule, at least one accepted dispute that changed a public report, and the open-queue age reported next to the log. Three of those four cannot be faked by us, they need someone on the outside to file.
Live state
Loading from /api/disputes/log…
Who decides
Not us alone. A log meant to constrain us cannot have us as its only judge. What is in force is a published evidence standard with a clock and no single decider.
A dispute is accepted if the counter-source is reachable, on-point, and was not already in the original report. It is rejected only if it fails this checklist, and the reason must be one of these five, named in the entry:
| Rejection reason | Means |
|---|---|
off-topic | concerns a different claim than the one checked |
unreachable | the source cannot be opened or read, with the reason given |
already-considered | it was in the original report, with a pointer to where |
opinion-not-evidence | opinion, prediction or taste, not a checkable statement |
unverifiable-quote | the asserted wording is not in the cited source, checked the same way we check every other quote |
The clock is 14 days. If it runs out, the case stays open, it does not disappear and it is not auto-rejected. Silence is not an acquittal. The code refuses to record a rejection without one of those five reasons; there is no path around it.
Rotating external reviewers are the stronger form and are explicitly foreseen if volume or stakes rise. Promising them now would be a promise without funding. What is ruled out permanently is an internal committee with unpublished criteria, that is theatre with a door.
Why a lost row cannot quietly vanish
Each entry carries the hash of the previous one. We tested both attacks against our own log:
| Attack | Result |
|---|---|
| rewrite the text of entry 4 | {"heil":false,"bruch":{"seq":4,"was":"content does not match its hash"}} |
| delete entry 3 entirely | {"heil":false,"bruch":{"seq":4,"was":"prev_hash does not match its predecessor"}} |
Both results appear in every public request, under kette. You never have to take our word for the chain, recompute it from the dump.
- No gaps. The sequence number comes from the store, not the caller. 47 → 49 without a visible 48 is not a reachable state; an unused number must sit there as
reservedorcancelledwith a reason. - Entry at filing, not at decision. The chain records a dispute the moment it is submitted. If it were recorded on closure, we could choose which ones ever became visible.
- No auth on the dump. If open cases were only visible through our own interface, we could hide them with CSS. A public dump does not know that trick.
- Independent mirror. The head hash is written into the public Git repository, whose history is not silently rewritable.
- Never delete, always supersede. A corrected report is linked as
amended_ref; the original entry stays.
What is deliberately not published
The disputant's email address. It is needed to reply and does not belong in a public register, the log records only whether a contact address was on file. An X handle is published only if the disputant supplied one, because that is their public identity.
File one
Every published verification has a Dispute this result action. A dispute must be substantiated (a source link) and attributable (an email or a public X handle). No anonymous unsourced drive-bys, that is the only filter, and it applies before the case is recorded, not after.
Full field list, state machine and reasoning: DISPUTE-LOG-SCHEMA.md in the public repository. Schema changes are new versions with a date, never silent edits.
