1. Abstract

Regulators, courts and the public increasingly need to establish not what an AI provider said about its training data, but what it had not said, and for how long. Presence is easy to prove: a disclosure is published, hashed, timestamped. Absence is hard: an absence has no document, no author and no date, and the party who could produce one has every incentive not to.

Crovia runs TACET, a protocol and a live public service that turns the absence of disclosure into a verifiable object. Every hour a public randomness beacon opens an epoch. An observer fetches the public model cards of the AI systems under watch, runs a versioned, published predicate over the bytes (does this card name its training data?), signs each result, and commits all of them to one sparse Merkle map. The map root, the beacon and the Merkle root of the hour's snapshots are signed into an epoch sheet whose hash is timestamped in Bitcoin. A silence proof is the chain of non-inclusion proofs for one model across a range of anchored epochs, together with the negative snapshots that justify each hour. Anyone can verify it offline; nobody has to trust Crovia.

The claim TACET makes is narrow and defensible: "between these beacon rounds and these Bitcoin blocks, on these public surfaces, the published predicate returned false in every hour we observed, and here are the signed bytes." It never says why, and it never says what the provider knew.

2. The problem: absence has no witness

Article 53 of the EU AI Act requires providers of general-purpose models to publish a sufficiently detailed summary of training content. Similar duties are emerging in other jurisdictions and in private contracts (licences, indemnities, M&A warranties). Every such duty produces the same evidentiary question in dispute: when did the disclosure appear, and what was there before?

What is missing is an independent, continuous, tamper-evident witness of absence whose output can be checked by the party it is used against. That is the specification TACET was written to.

3. TACET in one page

ElementWhat it isWhy it is there
EpochOne hour, numbered from genesis 2026-09-19T18:00:00Z.Time is quantised so proofs are about intervals, not instants.
BeaconA drand quicknet round fetched at epoch start; chain hash pinned in the trust root.Unpredictable randomness that did not exist before the hour began — a lower time bound.
SnapshotSigned record of one fetch: URL, HTTP status, body SHA-256, TLS certificate SHA-256, IP, timing, predicate id + code hash, verdict, beacon round.Binds the observation to the bytes and to the hour.
PredicateA pure function bytes → bool, versioned and hashed. Current: crovia.pred.hf-card-training-data 1.0.0.Removes judgement from the observer. Anyone can re-run it on the archived bytes.
MapA 256-deep sparse Merkle map, key = SHA-256 of the canonical target id, value = the latest disclosure/commitment object or empty.Efficient non-inclusion proofs; one root commits to the state of every model at once.
Epoch sheetSigned object: map root, previous sheet hash, beacon, snapshots root, size.Chains hours together; the thing that gets anchored.
AnchorOpenTimestamps attestation of the sheet hash, confirmed in a Bitcoin block.Upper time bound. Only anchored epochs count toward silence.
Silence proofDelta-encoded chain of non-inclusion paths plus negative snapshots, for one target over a range of epochs, wrapped in a Crovia Seal.The portable object a court or regulator receives.

4. The temporal sandwich

Every epoch is bounded on both sides by things Crovia does not control.

drand round rpublic randomness · did not exist before epoch start
→
epoch sheetroot · snapshots root · operator signature
→
Bitcoin block hOpenTimestamps · sheet existed before this block

The beacon value is included in the signed region of the sheet and in every snapshot; the sheet hash is what the OpenTimestamps proof commits to. A verifier checks that the beacon round corresponds to the epoch's start time using drand's published genesis and period, and checks the OTS proof against the Bitcoin block header independently. Crovia cannot move an observation earlier than the beacon nor later than the block; it can only omit hours, and omitted hours contribute nothing to silence (§7).

5. The verifiable map

The map is a sparse Merkle tree of depth 256 with canonical empty-subtree hashes, domain-separated leaf and node hashing, and CSC-1 canonical JSON for all values. Slot transitions are forward-only: empty → commitment → disclosure or empty → disclosure. A disclosure is never removed. The map therefore answers, for any target and any epoch, exactly one of three states: never-committed, committed-unrevealed, revealed.

Non-inclusion across consecutive epochs is delta-encoded: the proof carries a full path for the first epoch and, for each later epoch, only the siblings that changed. For a map of a few thousand targets this keeps a month-long proof in the tens of kilobytes.

6. Surfaces and the public predicate

The primary surface for a Hugging Face model is https://huggingface.co/<org>/<model>/raw/main/README.md; the rendered model page is the fallback. The predicate examines YAML front-matter (datasets:), headings that name training data, and lead phrases in prose. It is deliberately permissive: a thin disclosure counts as present. TACET records absence; it does not grade quality.

The predicate's source is published in the countersign repository with real-card conformance vectors; its SHA-256 is recorded in every snapshot. A disagreement about a verdict is a disagreement about public code on public bytes — reproducible by either party.

7. Silence proofs and strength levels

LevelNameWhat is proven
1map-silenceThe slot was empty in every epoch of the range. Says nothing about the world; displayed only as "map silence".
2surface-silenceLevel 1, and for every counted epoch a negative snapshot exists, is included under that epoch's snapshots root, and carries the epoch's beacon. Only anchored epochs count. Minimum for any public statement.
3witnessed-silence (k/n)Level 2, and every sheet carries at least k countersignatures from an independent witness set of size n.

The monotonicity rule

observed_epochs = #{ e : sheet(e).closed.status == "bitcoin" ∧ ∃ negative snapshot for target in e }
silence_seconds = Σ over observed epochs of (epoch_end − epoch_start)
silence_days    = silence_seconds / 86400

Hours without a negative snapshot — observer down, surface unreachable, predicate error — contribute nothing. Unanchored hours contribute nothing. Operator downtime contributes nothing. Silence cannot grow while observation is paused, and any verifier can recompute the figure from the proof alone. Every displayed silence figure carries its observed_to.

8. Crovia Seal: the envelope

Every TACET proof and every certificate is delivered as a crovia.seal.v1 object — the tamper-evident receipt format specified in IETF Internet-Draft draft-crovia-seal: CSC-1 canonicalization, Ed25519 signature, issuer identity, hash of the payload, optional hash-chain and countersignatures. The draft is frozen; TACET uses it unmodified, as a profile. The same envelope is used by Causari for a different payload, which is the point of a standard.

# three lines, offline
from crovia_seal import verify_seal
seal = json.load(open("mistralai__Mistral-7B-v0.1.seal.json"))
print(verify_seal(seal, trust_root))   # signature, canonical form, payload hash

9. LACUNA certificates

A LACUNA (loss-of-auditability) certificate is a TACET level-2 silence proof for a named model and a named window, wrapped in a Seal that Crovia signs as issuer, delivered with the archived surface bytes, the predicate source at the recorded hash, and a counsel-facing narrative that states exactly what is and is not asserted. Public candidates — every model with anchored negative hours — are listed live at /registry/lacuna/; the proofs themselves are free under CC-BY-4.0. The certificate service is the paid, human part: window selection, packaging, declaration, and availability to explain the method.

A LACUNA certificate is not a fraud finding, not a statement that evidence never existed, not a claim of bad faith, not a compliance certification and not a quality grade. It is a record of what an independent observer saw, when, bounded by two public clocks.

10. Commit-then-reveal for providers

TACET is symmetric. A provider that wants protection against silence claims can pre-register a training-data summary: publish a Seal over H(summary ‖ salt), have it inserted into its slot as a commitment, and reveal the summary at release. The temporal sandwich then proves timely, unchanged publication without depending on Crovia's honesty, and a silence proof for that slot becomes impossible by construction. The three states — never-committed, committed-unrevealed, revealed — are reported as such.

11. The 2026 archive

From January to June 2026 Crovia operated a first-generation stack (the "AXIOM ledger": autonomous collectors, signed envelopes, batch Merkle seals, OpenTimestamps anchors) and a set of derived products — a transparency index, provenance graph, per-model passports, compliance timelines. Observation on that ledger paused on 2026-06-01. Its data remains public and verifiable under /registry/data/substrate/ and is browsable through Explore, Verify, Compliance and Provenance. Its silence figures are observation-bounded and stop at the last observation.

The archive is why TACET exists in its current form. Three lessons from it are now normative: silence must not accrue without observation; headline numbers must be recomputable from public files; and every product name must map to exactly one object. The March 2026 whitepaper describes that stack and is kept for the record.

12. Operational status

As of 2026-09-19. This table is maintained together with the site canon; a component is "live" only if its output file on this domain is updating on schedule.

ComponentStatusPublic output
TACET operator (hourly epochs, drand, OTS)live/registry/data/tacet/ — sheets, snapshots, values, changes, ots, latest.json, targets.json
TACET predicate hf-card-training-data 1.0.0livesource + vectors in countersign
Featured silence proofs (daily rebuild)live/registry/data/tacet/proofs/
Witness countersignatures (level 3)planned—
Crovia Seal reference implementation (Python)livecrovia-seal on GitHub / PyPI; in-browser verifier
seal.croviatrust.com signing service + transparency loglive/registry/data/seal/transparency_log.json
AXIOM ledger collectorsarchivepaused 2026-06-01; data public and anchored
Substrate root anchoring (OTS)live/registry/data/substrate/ots_anchors.json — distinct roots only
Transparency index, provenance graph, passports, compliance hubarchivederived from the ledger; read-only
Outreach to model maintainersstoppedvoluntarily suspended; no automated contact is made
Forensic dossiers, memorization probeson requestprofessional; engagement letter first

13. Threat model

14. What Crovia does and does not claim

Crovia saysCrovia does not say
"The predicate returned false on these bytes, fetched at these times, from this URL.""The provider deliberately kept its training data secret."
"These hours are bounded by beacon round r and Bitcoin block h.""The provider knew it was non-compliant."
"This is the sum of anchored, observed hours; here is how to recompute it.""This model is unsafe / low quality / infringing."
"Here are the exact bytes; run the predicate yourself.""No disclosure existed anywhere in the world."

15. Public, professional, and money

16. Roadmap

ItemEffectStatus
Independent witnesses (countersign protocol)Level-3 proofs; removes the single-vantage-point limitationnext
Second predicate: EU AI Act Art. 53 summary templateDistinguishes "some disclosure" from "the required summary" without gradingplanned
Additional surfaces (GitHub READMEs, provider documentation pages)Same protocol, more of the worldplanned
Provider commitments in productionCommit-then-reveal available to any provider through the Seal serviceplanned
Browser verifier for TACET proofsLoad a .seal.json by URL or paste; verifies signatures, roots, snapshots, silence and the Bitcoin anchors (SPEC §8.6) without installing anythinglive

17. How to verify this document's claims

# reference + operator (Python ≥ 3.10)
git clone https://github.com/croviatrust/countersign
git clone https://github.com/croviatrust/crovia-seal
pip install -e countersign/tacet/reference/python -e crovia-seal/reference/python -e countersign/tacet/operator
pip install opentimestamps-client

# the live log
curl -s https://croviatrust.com/registry/data/tacet/latest.json
curl -s https://croviatrust.com/registry/data/tacet/trust_root.json

# a proof, verified (recomputes roots, checks drand rounds, parses the OTS proofs and matches Bitcoin headers, signatures, silence)
curl -sO https://croviatrust.com/registry/data/tacet/proofs/mistralai__Mistral-7B-v0.1.seal.json
tacet-operator verify mistralai__Mistral-7B-v0.1.seal.json

The live pages at /registry/tacet/ and /registry/lacuna/ read the same files. If a number on this site cannot be recomputed from a public file, it is a bug: info@croviatrust.com.

Crovia Trust · Whitepaper v3.0 · 2026-09-19 · Text CC-BY-4.0 · Prior version: v2.0, March 2026.