Matrix CR Studio

Counterfoil console · our lab, real data

Find the weak cryptography, fix it, and check the record yourself.

This console shows a snapshot of 5 test servers we run in our lab, set up with problems real servers often have, then scanned and fixed. The data is real: every number comes from real handshakes, and every fix opens a signed record you can verify in your browser.

Dashboard

Records signed · verify any fixLast scan 2026-09-29
1See what we foundSwitch Before fixes / After fixes at the top to see what changed.
2Open a fixClick any fix to see its signed steps: approve, back up, apply, check, settle.
3Check it yourselfPress Verify. The free checker runs in your browser and says PASS or FAIL.
Servers scanned
5
20 algorithm settings graded
On hybrid post-quantum key exchange
5 / 5
was 1 before the fixes
Certificates expired
0
none close to expiry
Limited to TLS 1.2
0
cannot carry hybrid key exchange
Fixes with a signed record
7
6 kept, 1 rolled back by the check
Algorithm distribution
Hybrid post-quantum: 5 of 20Resistant: 5 of 20Quantum-vulnerable: 10 of 2020SETTINGS
Hybrid post-quantum5
X25519MLKEM7685
Resistant5
TLS_AES_256_GCM_SHA3845
Quantum-vulnerable10
RSA-20482
ecdsa-with-SHA2564
EC-prime256v11
RSA-30721
EC-secp384r11
ecdsa-with-SHA3841
Hybrid key exchange
Hybrid post-quantum key exchange: 5 of 55/5ON HYBRID KX
web-rsa✓ X25519MLKEM768
api-ecdsa✓ X25519MLKEM768
portal-expiring✓ X25519MLKEM768
legacy-expired✓ X25519MLKEM768
edge-hybrid✓ X25519MLKEM768

On hybrid means a current client gets hybrid ML-KEM key exchange. Certificates stay RSA and ECDSA: these fixes change how session keys are agreed, not certificate algorithms.

Recent fixes · each one a signed record

Our lab, not a customer: test servers we run, set up with problems real servers often have. Every number was measured from real handshakes by test clients inside the lab network, on the date of the snapshot. The fix records are signed with our key, and the checker shows each one is unaltered and in order. They record what our tools reported. They do not prove a fix suits every client, or that nothing else changed on the host.

Counterfoil

The stub you keep.

Counterfoil is a receipt book for automated work.

A counterfoil is the stub you keep when a ticket or check is issued: your half of the proof. Each step of an automated job is written down, linked to the step before it, and signed. You keep the records. If a record is edited later, the link breaks, and anyone can see it with a free checker that runs on their own machine without contacting us.

WHAT IT PROVES

The record has not changed since it was written, and it was signed with our key.

WHAT IT DOES NOT PROVE

That the work itself was right, or that nothing happened off the record.

CHECK IT ON YOUR OWN MACHINE

The checker is one Python file. Download it with our sample receipt. It needs the internet once, to install one library, and after that it runs with no connection and contacts nobody. It prints PASS, or FAIL with the reason. Change one character in the receipt and run it again to watch it fail. The commands below are for macOS and Linux.

python3 -m venv counterfoil-check
. counterfoil-check/bin/activate
pip install cryptography
python verify_counterfoil.py sample-receipt.json
Request an assessmentCheck a receipt here

Why it matters now

The question has changed from “what did the user do?” to “what did the system do?”

When a person made a change, the log showed what they typed. When an automated system takes fifty steps from one instruction, an auditor asks what the system did, and whether the record of it was touched afterward. That record cannot be written after the fact. You keep it from the start, or you do not have it. Accounting settled this long ago with the ledger. Automated work needs the same thing.

How it works

Four steps, each enforced by the software.

THE FIRST RECORD OF OUR SAMPLE RECEIPT
Step number0
StageSEED
When2026-09-10T16:08:59.572Z
Fingerprint of what happenedb7f6466785…364cac
Points back tonothing: this is the first record
Its own fingerprint521eedc144…8681c9
The record keeps a fingerprint of what happened, not the content itself, and its own fingerprint is computed from every field above.

See a sample of the underlying log on the AI agents page.

What you get

Three things, in order. Here are two real assessments.

An assessment gives you an inventory of your cryptography, a migration plan ranked by exposure, and one evidence file that seals both. Below are two real assessments of open-source projects. Neither project is a customer of ours. One is an SSH library written in Python. The other is over-the-air update software built on Uptane, an update security system for the automotive industry, written mostly in C++. Every row is from the project's source code, and each evidence file verifies in your browser. A row shows where cryptography is used and when it has to move. It is not a defect, and a sample is not an audit of the project or a statement about its security. These two read source code; an assessment for a customer can also measure what their servers negotiate, as the console above does.

paramiko 5.0.0, an open-source SSH library. 41 source files read.

Findings111in 41 files
Must move77by the published rule
Weak classically43DES and MD5 and SHA1; depends on the use
Plan steps13in a safe order

Every use of cryptography our scanner found in the source (41files read), including algorithms the code offers by name, each with its file and line. A scan of source has gaps: it can miss dependencies, compiled code and choices made at runtime. Each finding is ranked by one published rule (Mosca's): if what it protects must stay secret for X = 12 years, and moving off it takes Y = 3 years, then X + Y = 15 years is longer than the Z = 10-year horizon we plan against, so it has to move now. Change those numbers and the ranking changes; they are sealed in the record.

AlgorithmWhereRankingWhy
3DEStransport.py:263Weak classicallyWeak without a quantum computer (MD5 and SHA-1 against collisions, 3DES, DES and other 64-bit-block ciphers by their block size, RC4 outright). Whether that matters depends on the use; replace it where the format allows, whatever the horizon.
3DEStransport.py:182Weak classicallyWeak without a quantum computer (MD5 and SHA-1 against collisions, 3DES, DES and other 64-bit-block ciphers by their block size, RC4 outright). Whether that matters depends on the use; replace it where the format allows, whatever the horizon.
MD5pkey.py:390Weak classicallyWeak without a quantum computer (MD5 and SHA-1 against collisions, 3DES, DES and other 64-bit-block ciphers by their block size, RC4 outright). Whether that matters depends on the use; replace it where the format allows, whatever the horizon.
SHA1config.py:449Weak classicallyWeak without a quantum computer (MD5 and SHA-1 against collisions, 3DES, DES and other 64-bit-block ciphers by their block size, RC4 outright). Whether that matters depends on the use; replace it where the format allows, whatever the horizon.
DHtransport.py:324Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
DHkex_group16.py:35Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
DHkex_group16.py:30Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
DHkex_group14.py:45Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
DHtransport.py:325Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
DHtransport.py:219Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
DHtransport.py:218Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
DHtransport.py:220Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
DHkex_gex.py:51Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
DHtransport.py:326Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
ECecdsakey.py:167Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
ECkex_ecdh_nist.py:113Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
ECecdsakey.py:254Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
ECecdsakey.py:224Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
ECecdsakey.py:268Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
ECecdsakey.py:305Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
ECkex_ecdh_nist.py:151Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
ECkex_ecdh_nist.py:67Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
ECecdsakey.py:242Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
ECkex_ecdh_nist.py:71Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
ECkex_ecdh_nist.py:145Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
ECkex_ecdh_nist.py:117Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
ECkex_ecdh_nist.py:23Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
ECkex_ecdh_nist.py:59Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
ECDHkex_ecdh_nist.py:143Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
ECDHtransport.py:327Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
ECDHkex_ecdh_nist.py:21Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
ECDHtransport.py:329Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
ECDHtransport.py:216Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
ECDHtransport.py:215Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
ECDHtransport.py:328Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
ECDHkex_ecdh_nist.py:149Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
ECDHtransport.py:217Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
ECDSAtransport.py:201Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
ECDSAtransport.py:208Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
ECDSAtransport.py:313Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
ECDSAtransport.py:199Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
ECDSAtransport.py:210Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
ECDSAtransport.py:315Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
ECDSAtransport.py:317Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
ECDSAtransport.py:200Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
ECDSAtransport.py:209Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
ED25519transport.py:198Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
ED25519transport.py:207Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
ED25519ed25519key.py:42Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
ED25519transport.py:319Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
RSArsakey.py:43Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
RSArsakey.py:211Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
RSAagent.py:53Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
RSArsakey.py:210Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
RSAtransport.py:791Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
RSAtransport.py:203Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
RSAclient.py:431Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
RSArsakey.py:41Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
RSAtransport.py:1317Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
RSAagent.py:54Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
RSAtransport.py:1318Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
RSArsakey.py:78Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
RSAtransport.py:211Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
RSAtransport.py:790Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
RSAclient.py:432Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
RSAclient.py:433Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
RSAtransport.py:311Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
RSAtransport.py:212Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
RSArsakey.py:45Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
RSAtransport.py:309Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
RSAclient.py:434Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
RSAtransport.py:202Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
RSAclient.py:430Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists. The scanner did not determine how this key is used, so it takes the stricter case: the harvestable case, where recorded traffic is exposed.
RSArsakey.py:184Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
RSArsakey.py:89Act nowX plus Y exceeds Z by 5 years. Nothing can be harvested from a signature, but once the capability exists the key can be forged; X is how long the key must still be trusted.
X25519transport.py:223Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
X25519kex_curve25519.py:109Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
X25519kex_curve25519.py:45Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
X25519kex_curve25519.py:30Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
X25519transport.py:332Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
X25519kex_curve25519.py:71Act nowX plus Y exceeds Z by 5 years. Anything copied today can be read once the capability exists.
AEStransport.py:177Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
AEStransport.py:251Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
AEStransport.py:178Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
AEStransport.py:179Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
AEStransport.py:227Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
AEStransport.py:257Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
AESpkey.py:727Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
AESpkey.py:691Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
AEStransport.py:233Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
AEStransport.py:176Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
AEStransport.py:239Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
AESpkey.py:693Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
AEStransport.py:181Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
AEStransport.py:245Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
AEStransport.py:180Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
HMACtransport.py:188Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
HMACtransport.py:192Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
HMACtransport.py:287Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
HMACpacket.py:47Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
HMACtransport.py:292Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
HMACtransport.py:194Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
HMACtransport.py:191Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
HMACtransport.py:288Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
HMACtransport.py:290Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
HMACtransport.py:293Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
HMACtransport.py:286Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
HMACtransport.py:193Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
HMAChostkeys.py:300Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
HMACtransport.py:187Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.
SHA256pkey.py:401Safe for this horizonSymmetric key or hash; the known quantum attack (Grover) gives only a square-root speedup. Not a migration target.

How we check our own output

AI states a made-up fact as confidently as a true one.

Invented statute numbers, figures with no source, citations to documents that do not exist: they arrive in the same confident tone as the facts. So we treat every model, including our own, as an untrusted source. Each claim is held to its evidence: numbers, dates, and citations we cannot confirm are removed before anything reaches you. When one of our findings later fails, we correct it in public.

Who it is for

Built for the audit you have not had yet.

US federal contractors

A 2026 executive order sets the end of 2030 for the government's high-value and high-impact systems to use post-quantum key establishment, and orders a proposed procurement rule that would hold covered contractors to the same date. Misstating your cryptographic compliance can bring False Claims Act liability. A scan summary will not answer that question. A record anyone can check will.

Source: Executive Order 14412 (June 2026)

Regulated industries

The EU AI Act requires automatic logging for high-risk AI systems. The 2026 Digital Omnibus moved that deadline to December 2027, but the requirement stands, and a record is far easier to keep from the start than to rebuild later. Counterfoil goes past the requirement: the log is also tamper-evident and checkable by anyone.

Sources: Regulation (EU) 2026/1744 · EU AI Act, Regulation (EU) 2024/1689

Clinical AI and genomics

AI inside regulated medical devices is high-risk under the EU AI Act, with its deadline moved to August 2028. The FDA asks for the same kind of lifecycle evidence in its draft AI guidance. Genomic data raises the bar again: it never expires, so its records must outlast every key that protects it today.

Sources: Regulation (EU) 2026/1744 · FDA draft guidance, January 2025

Anyone deploying AI agents

In a 2026 Grant Thornton survey of nearly 1,000 US senior business leaders, 78 percent were not fully confident they could pass an independent AI governance audit within 90 days. What they lacked was evidence an auditor could check.

Source: Grant Thornton, April 2026

Our summaries of public texts, checked against each source on 30 September 2026. Not legal advice.

Why believe us

Every number here links to its source.

500

IBM Quantum jobs in our account record

See the job ledger
6

Of our own findings corrected in public

Read the corrections
79

Internal capability claims backed by a proof that runs

Checked on our machines, not publicly re-runnable. The public subset is on the claims registry
0 of 1

Published receipts an outside party has recomputed and declared. Our own runs never count

Recompute one and declare it

Next step

Two weeks to know where you stand.

It starts with a two-week readiness assessment: what cryptography you run, where the exposure is, and what your auditor will see.

Start the conversation

Counterfoil here is Matrix CR Studio's evidence format. It is not affiliated with other products or companies that use the name.