Grounded extraction
How a model's proposals become part of a report, what the quote gate checks, and what it deliberately does not claim.
Reading a 300-recital decision for every party, figure and effect is slow work. BINA uses a hosted language model to propose those items. A proposal becomes part of the record only after deterministic code checks it against the decision text.
#Propose, then verify
The model receives public decision recitals and returns structured JSON. Application code — not the model — then checks each proposal:
- Schema — only allowed fields and kinds.
- Citation — the cited recital exists in the stored text.
- Exact quote — the quote occurs verbatim in that recital (
verifyQuote). - Named-party span — a proposed party's name occurs inside its quote.
- Source version — the proposal belongs to the current text; changing the source invalidates old proposals.
Proposals that pass are accepted automatically (autoApproved: true, reviewer auto-approve policy). Party proposals are promoted to category 1.
#How the quote comparison works
Published texts are messy. ADLC's data.gouv text loses spaces where a line wrapped, and both authorities glue footnote calls to the preceding word. A lawyer quoting the passage writes neither. So both sides are reduced to the same key before comparing:
- quote marks and dashes are folded to one form;
- case and whitespace are ignored;
- a footnote call — 1–3 digits right after a letter and before a space, punctuation or the end — is dropped.
Art.5, 2021 and EUR 430 are untouched. The quote must still reproduce every letter and number of the passage, in order. A quote shorter than 8 characters is refused as too short to verify.
#What the gate does not prove
That is why every auto-accepted item can be rejected afterwards through POST /v1/radar/extractions/:id/review. Rejection is the retraction path, and it is recorded in the append-only log together with the source version, model, prompt hash, raw response hash, coverage and usage.
#Summaries are built from verified notes
The headline, the bulletin's In brief and the three summary lines are written by a separate summary pass from quote-verified notes only. Each line names the notes it rests on, and checkSummaryLine refuses:
- any number that is not in those notes;
- any name that is not in the decision.
When a note is rejected or superseded, every line that cites it is withdrawn.
#The prompt
Prompt version radar-llm-4 allows up to twelve distinct proposals per source section, keeps economic effects separate from fines and market descriptions, and extracts explicit records — notices, contracts, complaints — that may show who belongs to an affected group, without classifying legal identifiability. A completed run is reused when source, recital parse, prompt and model are unchanged.
#What never reaches the model
Client lists and reviewer identities stay out of every prompt. Watchlist matching runs locally.