Immutable QC
Document
IQC-CK-01
Revision
Draft 6
Updated
2026-10-07
Status
Independent project · Open alpha · Synthetic demo data · No customers yet
Use
Informational draft. Not a controlled document; not a regulatory assessment or a validation statement.

Check a record

1Change a value and watch the checks

Change any sealed field of the eight synthetic records. As you type, your browser recomputes the fingerprint, checks the signature and the link into the next record, and replays the whole history against the anchored fingerprint.

Sequence SEQ-0914-02

HPLC-02 · Assay of Product 200 mg tablets · records 1 to 8

Simulated · demo data

Checked at build: 8 of 8 records pass · simulated anchor matches. Live checking needs JavaScript; the fields stay read-only without it.

1.1Pick a record

1.2Sealed fields of record 6

Injection 06 · sample P200-S1, preparation 1 · retention time 4.82 min (context, not sealed in the alpha)

Payload · UTF-8 · 48 bytesHPLC-02|hplc|1508811|counts|2026-09-14T08:47:50Z

Record 6 nowFingerprint MatchSignature ValidLink IntactAnchor Matches

What the check findsRecord history

1.3Rewrite or correct

Change a sealed field above, then choose what to do with the change.

Store the changed record’s new fingerprint and recompute every link from it on, so the links are consistent again.

Keep the original as sealed and add a new record with your reason, signed with a one-time demo key made in your browser. A reintegration belongs in the CDS: correct it there and import the result again.

1.4What the check finds

Fingerprint r6SHA-256 of the payload
Match
recomputedeb1690bc5922a312d90ee139fdf8e20b92bf2cb0feae8ee0e70bd24fbd2b54d7storedeb1690bc5922a312d90ee139fdf8e20b92bf2cb0feae8ee0e70bd24fbd2b54d7

Recomputed from the five fields: the same as the stored fingerprint.

SignatureECDSA P-256 over the fingerprint
Valid

Checked at build with demo key 7A15F562… (public key under Method).

Link h6SHA-256 of the stored h5 + r6 + position
Intact
recomputedc427b83a4e29adf9380bef67d00302e12ddfd558ae8f5a558547b2b0cf3cba23storedc427b83a4e29adf9380bef67d00302e12ddfd558ae8f5a558547b2b0cf3cba23

The same as the stored link, which record 7 carries as its previous link.

Anchorwhole history replayed from 64 zeros: link of record 8 vs the anchored fingerprint
Matches
replayed h80a35688a4c3ec82a5e621cede1f173a6d436ade0e20f159dca92c2a3711e3dc1anchored0a35688a4c3ec82a5e621cede1f173a6d436ade0e20f159dca92c2a3711e3dc1

Anchored fingerprint (simulated, no network call): the link of record 8, stored on this page in place of a real anchor.

1.5Check it outside the browser

# record 6: fingerprint of the five sealed fields, in a UTF-8 terminal (macOS: shasum -a 256)
printf '%s' 'HPLC-02|hplc|1508811|counts|2026-09-14T08:47:50Z' | sha256sum
eb1690bc5922a312d90ee139fdf8e20b92bf2cb0feae8ee0e70bd24fbd2b54d7  -
# same as the stored fingerprint
# link: the previous link stored with record 6, then the fingerprint, then 6
printf '%s' 'c04af03f4b9c69a30d06e27d9906e4e7f2bc176b7ba0a212582ad8c65f6bdfd5eb1690bc5922a312d90ee139fdf8e20b92bf2cb0feae8ee0e70bd24fbd2b54d76' | sha256sum
c427b83a4e29adf9380bef67d00302e12ddfd558ae8f5a558547b2b0cf3cba23  -
# same as the stored link, which record 7 carries

The commands follow the record as you edit it. They need only printf and sha256sum.

1.6Record history

Record history of sequence SEQ-0914-02, with the result of each check per record
#InjectionSamplePeak areaStored fingerprintStored linkFPSigLinkStatus
101 · SSTSTD-A15238470135c779…c891c783…fingerprint matchessignature validlink to the next record intactchecks passed at build
202 · SSTSTD-A15199629892c300…7a4953a2…fingerprint matchessignature validlink to the next record intactchecks passed at build
303 · SSTSTD-A1527410ae3ff253…5bca5e02…fingerprint matchessignature validlink to the next record intactchecks passed at build
404 · SSTSTD-A1521188976c4d87…469c206d…fingerprint matchessignature validlink to the next record intactchecks passed at build
505 · SSTSTD-A15256031f00a3f2…c04af03f…fingerprint matchessignature validlink to the next record intactchecks passed at build
606 · SampleP200-S11508811eb1690bc…c427b83a…fingerprint matchessignature validlink to the next record intactchecks passed at build
707 · SampleP200-S21531274ebe86f04…b43dc487…fingerprint matchessignature validlink to the next record intactchecks passed at build
808 · SampleP200-S3151603945752d11…0a35688a…fingerprint matchessignature validlink to the next record intactchecks passed at build

Anchored fingerprint · simulated, no network call · covers records 1 to 8: 0a35688a… Matches

System suitability: 5 replicate injections of the reference standard, peak-area RSD 0.20% (computed at build). Sample peak areas are 99.0%, 100.5%, 99.5% of the standard mean. Synthetic and illustrative: acceptance criteria come from your method, these area ratios are not an assay calculation, and blanks and bracketing standards are left out for brevity.

How to read it: each record’s link is checked from the previous link it stores, so a changed value fails that record’s fingerprint and signature and breaks only the link into the next record. The anchor check replays the whole history from 64 zeros, so after any change the head no longer matches.

Note Demo signatures. In the alpha, one server key signs imported rows; per-analyst signatures are upcoming.

2What an AI agent would receive Upcoming

Upcoming: experiment data that AI agents could check before they use it. This is not an API; it shows the record selected above, as stored, the way an agent would receive it.

{
  "record": 6,
  "sequence": "SEQ-0914-02",
  "fields": {
    "instrumentId": "HPLC-02",
    "sensorType": "hplc",
    "value": "1508811",
    "unit": "counts",
    "capturedAt": "2026-09-14T08:47:50Z"
  },
  "fingerprint": "eb1690bc5922a312d90ee139fdf8e20b92bf2cb0feae8ee0e70bd24fbd2b54d7",
  "previous": "c04af03f4b9c69a30d06e27d9906e4e7f2bc176b7ba0a212582ad8c65f6bdfd5",
  "link": "c427b83a4e29adf9380bef67d00302e12ddfd558ae8f5a558547b2b0cf3cba23",
  "position": {
    "n": 6,
    "of": 8
  },
  "signature": {
    "alg": "ECDSA P-256 with SHA-256 over the fingerprint bytes",
    "encoding": "IEEE P1363, hex",
    "value": "fd3cfca2c73346e62ecca8b63809472ef61f4c01d375e91bce8f023b3fefb8cc6904175a9db890fe6bc0e8fe5fc34203cf5297b361db971e6cadf2dfeb420279"
  },
  "publicKeyId": "7A15F56288146023D45A47796F6A5553",
  "publicKey": "0458f36cfc0c1e0df9d1b97e3cd6e3e3ca7bc3acd4fa6b835584f63aa4551ef83855cbc7609030d0ddbe6a92bdb73176884a951eb6ba33eece29bdcb30d6b7c66f",
  "anchor": {
    "status": "simulated, no network call",
    "covers": "records 1 to 8",
    "fingerprint": "0a35688a4c3ec82a5e621cede1f173a6d436ade0e20f159dca92c2a3711e3dc1"
  }
}

An agent would recompute the fingerprint from the fields, check the signature with the public key, recompute the link from the previous link the record stores, and replay the history to compare the anchor. Only if all four pass would it treat the record as unchanged since sealing; in use, it would take the public key and the anchor from outside the lab’s system.

Checked at build: fingerprint, signature, link and anchor pass for this record.

3Method

  • PayloadinstrumentId|sensorType|value|unit|capturedAt, UTF-8, no spaces around the bars: the alpha app’s canonical payload for an HPLC peak area, where the instrument field is the app’s internal instrument number. The alpha records peak area with the unit “counts”. No field may hold the bar or a control character; a record whose fields do fails its fingerprint check.
  • Fingerprintrn = SHA-256 of the payload’s UTF-8 bytes as they are, with no Unicode normalization (FIPS 180-4), as lowercase hex. Check: the recomputed rn against the stored one.
  • Linkhn = SHA-256 of the text hn−1 + rn + n (lowercase hex, then the decimal position), starting from 64 zeros. Check: SHA-256 of the previous link the record stores, its recomputed fingerprint and n, against the link it stores, which the next record carries. A changed value breaks only the link into the next record.
  • SignatureECDSA P-256 with SHA-256 over the 32 bytes of rn (FIPS 186-5), IEEE P1363 encoding in its low-S form only (the high-S twin of a signature is refused), checked against the recomputed fingerprint. Where your browser checks signatures, a record with no signature fails. Records 1 to 8 were signed at build time with a demo key whose private half was then discarded. Demo key id 7A15F56288146023D45A47796F6A5553 (first 16 bytes of SHA-256 of its SPKI). Public key, uncompressed point:0458f36cfc0c1e0df9d1b97e3cd6e3e3ca7bc3acd4fa6b835584f63aa4551ef83855cbc7609030d0ddbe6a92bdb73176884a951eb6ba33eece29bdcb30d6b7c66f
  • AnchorThe whole history replayed from 64 zeros over the recomputed fingerprints; the replayed link of record 8 against the anchored fingerprint stored on this page (simulated, no network call). A correction moves the head on; it stays “not yet anchored” until a new anchor.
  • PassA record passes when its fingerprint and link match and its signature does not fail. Without the browser’s own checking tools (an http:// page), fingerprints and links are recomputed with a SHA-256 built into the page and signatures are not checked, so no record is called unchanged.
  • LimitsOn this page the public key and the anchor come with the records, so they show the method, not independent evidence. Whoever can rewrite the page can replace the key, the signatures and the anchor together. In use, both would come from outside the lab’s system: a key published elsewhere, and a fingerprint anchored on a public network, which is upcoming. Signatures cover each record’s own fingerprint, not its position, so a removed record with every later link rewritten passes every check but the anchor. A correction’s one-time key travels with the correction, so its signature shows only that the correction has not changed since it was signed.

BasisThe same payload and link rule as the alpha app’s HPLC import; the same link rule as the record figure on joseqc.com.