Ground rules: nothing invented
The rules the legal team set for BINA, why each exists, and where the code enforces it.
A BINA report is sent to lawyers who will rely on it in front of clients. One invented figure would make the whole report unusable, so the legal team wrote a short list of rules and the code enforces each of them. They are not style guidelines; a request that breaks one is refused.
#The rules
| Rule | What it means in practice | Enforced in |
|---|---|---|
| Nothing without a source | Every figure, date and name points to a recital, a press release or a URL. | Validators in server/radar/contract.mjs |
| Quote the decision as it is | A category 1 party or summary line quotes its recital verbatim, or it is refused with 422. | verifyQuote in server/radar/text.mjs |
| Estimates say "estimate" | Anything computed carries estimate: true, its legal basis and a caveat. | server/radar/deadlines.mjs, cartel.mjs |
| Levels are fixed first | The level table is frozen, hashed and names its reviewer before any case is run. | server/radar/levels.mjs |
| EU facts only | The radar reads the European Commission and the Autorité de la concurrence. | server/radar/ingest.mjs |
| Respect site terms | No Google scraping (a search API instead), no automated Pappers. ADLC data is Licence Ouverte 2.0 via data.gouv.fr. | Source registry |
| Never truncate | Decision text is stored complete; the original stays available by hash. | server/raw.mjs |
#Why refusal instead of warning
Many systems flag doubtful content and let it through. BINA refuses it instead. A warning on a quote that is not in the decision would still put words in the authority's mouth; a reader skimming the report would not see the flag. A 422 keeps the claim out of the record entirely, and the person proposing it gets a precise reason (quote_not_in_recital, name_not_in_quote, …).
#Why "unknown" is a valid answer
Where data is not available, BINA says so. Every case report lists all five claimant-signal criteria, and a criterion with no data or no implementation is shown as unavailable rather than filled in. A blank that says "not connected" is honest; a zero would be a claim.
#What BINA does not do
- It does not decide liability, standing, causation, harm or damages.
- It does not assign levels with a model — levels come only from the table.
- It does not treat a name match as an identity finding.
- It does not send client lists or reviewer identities to a model.
The model guard is literal: server/model.mjs refuses any model whose decides property is not false, and hosted extraction keeps that guard.