Build1 publisher3 min readPublished
Per-span citations mean your document store's version history is now part of the audit trail
A dev.to write-up specifies a response contract where every sentence names the doc_version and char_range supporting it. That is good engineering. It also puts ingestion immutability, rather than logging, under review.
The Engineer · Build desk

What happened
- The first log records that decision d_8f21 ran at 14:02:11 UTC through model v2.3.1 with its input, output and a human approval, is kept for six months, and clears most audit-trail checklists.
- The second artifact proves the answer came from paragraph 4 of manual_A2131.pdf, retrieved at rank 2 with a score of 0.81, and that the sentence shipped in the response is supported by that span.
- According to the post, EU AI Act Article 50 and the Annex III high-risk obligations apply from August 2, 2026, with full rollout by August 2, 2027.
- A June 2026 analysis of 908,449 Hugging Face models found 55.46% carrying compliance risks or missing metadata, leaving open whether the base model under a clean log has terms nobody can reconstruct.
- The proposed response contract gives every answer span a supported_by list pointing at retrieved entries that carry doc_id, doc_version, chunk_id, char_range, rank and score.
Compiled by The EngineerSomething wrong?How this is made
Why it matters
- cost Logging the whole retrieval set means persisting rank and score for the candidates that lost on every answer, and the retrieval team carries that storage bill so that a wrong answer can be diagnosed later at all.
- constraint Requiring explainability and fairness metrics to ride with each answer forecloses the quarterly-PDF model of fairness reporting, because the numbers now have to be produced inside the response path.
- decision A computable unsupported_spans field turns shipping a weakly grounded answer into a code path with a threshold, so refusal or escalation is decided by the pipeline instead of a reviewer after the fact.
- exposure Complete provenance chains were rare across the 29,000 dataset descriptions audited, so even perfect span evidence for an answer rests on training data nobody in the chain can attest to.
A char_range is an offset into one byte sequence. The guarantee only holds while the store can still serve manual_A2131 at doc_version 2024-11 exactly as it was chunked, which is the point of pairing doc_id with doc_version and a character range: the cited span can be re-fetched and re-read a year later, where a doc_id alone is useless once the manual has been revised [13]. So the ingestion pipeline becomes the artifact under audit. Re-extracting the PDF with a different parser, normalising whitespace differently, or moving chunk boundaries all repoint those offsets at other text, and nothing in the response JSON notices. Only a re-fetch does.
Which is why verification has to run as a job rather than sit in a policy document: re-fetch each cited span, confirm it still exists at that version, run an entailment check of the span against the sentence it supports, and let the failures pile up in a queue that is itself the evidence [16]. Budget one entailment call per span per answer. The checker is a model too, so the post's own supply-chain numbers apply to it: 56.67% license omission in adapter derivations, and 8.05% license drift in fine-tuned models [9].
The provisions the post cites do less work than its framing suggests. Article 19 asks for six-month log retention [4]. Article 99 sets the ceiling at EUR 15 million or 3% of global turnover [5]. The marking requirement wants machine-readable flags on generated content [11]. A well-built decision log satisfies all three. None of the named provisions requires support asserted at span level [22]. The claim that this is the artifact a regulator reaches for once the question turns from what the system did to whether any of it was true is the author's own [2], and it is a bet on supervisory practice rather than a reading of a clause. The engineering case is the stronger one: per-span support is what makes a hallucinated sentence unable to hide between two grounded ones, and what makes unsupported_spans computable at all [14].
Read the fairness comparison as a claim about someone else's dataset. In the 2026 clinical study the post cites, logistic regression reached 75.2% accuracy against a random forest at 70.1% [17], a gap of 5.1 points [20]. Equal opportunity difference ran 0.256 against 0.055 [17]. The post calls the second model roughly 57% less biased; 1 minus 0.055/0.256 is 0.785, so the printed numbers give about 79% [18]. For either figure to transfer to your model selection you would need the same protected attribute, the same base rates and the same decision threshold, and the write-up names none of them.
The cheap half of this design is deleting the citation string the prompt asks the model to append, because only a first-class field in the response contract is verifiable [21]. The expensive half is a document store that can still hand back bytes 1180 to 1372 of chunk 417 in a revision you shipped last year [12].
What to watch
- A supervisor or Commission document that names span-level attribution as evidence, instead of restating log retention.
- A re-run of the June 2026 Hugging Face metadata analysis on the same 908,449-model corpus, showing whether omission rates move.
- Publication of the clinical study's cohort, protected attribute and threshold, so the 0.055 equal opportunity difference can be checked.