TACET · verifiable silence · protocol v0.1-draft · live since 2026-09-19 18:00 UTC

Silence you can verify.

Every hour, Crovia opens an epoch with a public randomness beacon, fetches the model cards of the AI systems under watch, runs a published predicate over the bytes, signs what it saw, and closes the hour with a Bitcoin anchor. A model that never discloses its training data accumulates anchored negative observations — and nothing else. No observation, no silence.

epochs emitted
hourly since genesis
epochs confirmed in Bitcoin
only these count
negative snapshots, signed
absence observed
disclosures in the map
forward-only slots
models observed so far
of the watch list

How one hour becomes evidence

The latest epoch, field by field. Every value below is in latest.json and the sheet it points to.

loading…
1 · open

drand beacon

A League-of-Entropy round that did not exist before the hour began. Nothing in the epoch can predate it.

round
chain 8990e7…
2 · observe

Surface snapshots

Raw model card bytes fetched over TLS: status, SHA-256, length, certificate hash, peer IP. Signed by the observer key.

snapshots · negative
root
3 · decide

Public predicate

A pure function bytes → bool, versioned and hashed. Anyone can re-run it on an archived copy of the card.

crovia.pred.hf-card-training-data 1.0.0
code
4 · commit

Sparse Merkle map

Disclosed models get a slot; silent ones do not. Slots only move forward, so emptiness at epoch e implies emptiness before.

size
root
5 · close

Bitcoin anchor

The signed sheet hash is stamped with OpenTimestamps. Once in a block, the hour is bounded from above.

status
sheet

The latest epoch, as observed

Negative snapshots first. absent means the predicate found no training-data disclosure in the bytes fetched; present means it did. Unreachable surfaces produce no row at all.

loading snapshots…

Predicate 1.0.0 accepts a disclosure that is thin (a datasets: tag, a paragraph under a training-data heading). TACET records absence; it does not grade quality. Quantities alone ("trained on 15T tokens") are not a disclosure of provenance.

Silence proofs

Level-2 proofs for featured models, regenerated daily, wrapped in an unmodified crovia.seal.v1. Each carries every epoch sheet in range, the delta-encoded non-inclusion path, and the negative snapshots with their Merkle inclusion.

loading…
The rule is normative and recomputed by the verifier: silence_seconds = Σ (epoch_end − epoch_start) over epochs that are confirmed in Bitcoin and hold a negative snapshot for the model. Hours where the observer was down, the surface unreachable or the anchor pending contribute exactly zero. A silence figure is always shown with its observed_to.

Don't trust the page. Verify the file.

Two independent verifiers, same checks. In your browser: operator signatures and chaining, the empty slot under every depth-256 root, observer signatures and inclusion of each negative snapshot, the silence block — and, with network checks on, every .ots proof parsed in the page and its merkle root matched to the Bitcoin block header. Or offline, with the reference implementation below. Neither needs a Bitcoin node, an OpenTimestamps client, or a Crovia server.

# 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 # pick a proof from /registry/data/tacet/proofs/ 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 \ --operator-pubkey

Trust root

mapurn:crovia:tacet:map:disclosure
genesis
operator key
observer key
proof issuer
beacondrand · 8990e7… · 30 s
anchorOpenTimestamps → Bitcoin

Pin these keys. Everything under /registry/data/tacet/ is CC-BY-4.0 and fetchable directly; trust_root.json is the only file you need to trust once.

What TACET does not claim

Precision is the product. These limits are part of the specification.

Not a statement about intent

A negative snapshot says the predicate returned false on those bytes at that time. It does not say why, and the site never uses words like "hid" or "refused".

Not a statement about the world in between

Silence is counted per anchored hour with an observation. Gaps between observations, downtime and unreachable surfaces count zero — even when everyone suspects the answer.

Not a quality judgement

The predicate accepts thin disclosures. A model with datasets: [x] is "present". Grading completeness is a different product (see the compliance hub).

Not language-neutral yet

Predicate 1.0.0 reads a YAML datasets: block and English lead phrases. A card that discloses only in another language is recorded as absent. Multilingual rules are an open issue; when they land they ship as a new predicate version, and existing proofs keep the version they name.

Not a single observer's word

Level 3 adds k-of-n witness countersignatures over each sheet. The witness protocol lives in countersign; independent witnesses are welcome.

For model providers

The map is open to you. Publish a commitment today and reveal the summary when your legal team is ready; the commitment's hour is recorded, and the silence stops accruing the moment you disclose.

Commit-then-reveal

Send H(summary ‖ salt) signed with your Seal key; your slot moves ∅ → commitment in the next epoch. Reveal later with the salt and the summary URL; the slot moves to disclosure. Both are Seals you sign, not us. Specification §11.

Witness the log

Run a witness that countersigns each sheet hash after checking the chain. A provider that witnesses the log that observes it is the strongest answer to "who audits the auditor". [email protected].