Immutable QC
Document
IQC-OV-01
Revision
Draft 9
Updated
2026-10-18
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.

Lab records that verify themselves.

1Scope

Each result becomes a sealed record: a SHA-256 fingerprint of five of its recorded fields, signed and linked to the record before it, so a later change shows. Built for automated research labs in biotechnology, microbiology, chemistry and materials science, where results arrive faster than people can review them and models train on them. The records and their history stay with the lab; nothing is written to a network.

Fig. 1

One sealed record

Simulated · demo data

Record 6 of 8 · sequence SEQ-0914-02 · Assay of Product 200 mg tablets

Sealed fields

Instrument
HPLC-02
Measurement
hplc
Peak area
1508811
Unit
counts
Captured (UTC)
2026-09-14T08:47:50Z

Context · not sealed in the alpha

Injection
06
Sample
P200-S1, preparation 1
Retention time
4.82 min
  1. Fingerprint recomputedSHA-256 of the five fields vs r6Match
  2. Signature checkedECDSA P-256, demo public keyValid
  3. Link recomputedSHA-256 of h5 + r6 + “6” vs h6Intact

Checked at build. Live checking in your browser needs JavaScript.

Check any record yourself

Raw data · the values the checks above recompute

Payload · instrumentId|sensorType|value|unit|capturedAt

HPLC-02|hplc|1508811|counts|2026-09-14T08:47:50Z

Fingerprint r6

eb1690bc5922a312d90ee139fdf8e20b92bf2cb0feae8ee0e70bd24fbd2b54d7

SHA-256 of the 48-byte payload. One changed character gives a completely different fingerprint.

Signature · ECDSA P-256 over r6 · demo key 7A15F562… · public key in Method

fd3cfca2c73346e6 … 6cadf2dfeb420279

Fig. 1 · Record 6 of the synthetic HPLC sequence SEQ-0914-02, as an auditor or an AI agent would read it. Basis Same five fields, order and link rule as the alpha app’s HPLC import, where the instrument field is the app’s internal instrument number; SHA-256 is FIPS 180-4. Demo signatures. In the alpha, one server key signs imported rows; per-analyst signatures are upcoming.

2Why: one wrong value snowballs

Most bad data is not malicious. But when results arrive faster than people can review them, and models train on them and choose the next experiment, an ordinary mistake travels before anyone sees it.

A wrong value usually comes from ordinary software and operations:

  • a script that “fixed” the units
  • a sync conflict between two copies
  • a crash halfway through a write
  • a backup restored from last week
  • a migration that rounded values
  • an outage that dropped a batch
  • a model that filled in a blank

One wrong value feeds an analysis, a model and the next experiment: a concentration a script wrote in mg/mL where the pipeline expects µg/mL can end up in a dose-response fit, a training set and tomorrow’s plates. Today a seal shows a value changed after it was sealed; the upcoming items in section 5 would catch more.

Deliberate changesA value changed on purpose by someone without the signing key fails the same checks. A rewrite with the key, or a deletion with the rest relinked (which needs no key), passes each record’s checks; question 5.7 on the About page says what would show it.

3How a result becomes a sealed record

One record from the demo sequence, record 6 of SEQ-0914-02, in seven steps from the instrument run to its place in the record history. Every value shown is computed from the signed demo data when the site is built.

  1. 3.1Captured

    Injection 06 on HPLC-02. The chromatography data system (CDS) integrates the peak at 4.82 min, and its area, 1508811 counts, becomes the value of record 6, with four more fields: the instrument, the measurement type, the unit and the capture time.

    Fig. 2.1

    Captured

    Simulated · demo data

    Injection 06illustrative trace

    4.82 min Area 1508811 counts

    Record 6 · five fields

    Instrument
    HPLC-02
    Measurement
    hplc
    Peak area
    1508811
    Unit
    counts
    Captured (UTC)
    2026-09-14T08:47:50Z
    Fig. 2.1 · Injection 06 on HPLC-02, an illustrative trace. The shaded peak at 4.82 min has an area of 1508811 counts, the value of record 6; with four more fields it forms the record.
  2. 3.2Fingerprinted

    The five fields are joined by a vertical bar into one line of 48 bytes: HPLC-02|hplc|1508811|counts|2026-09-14T08:47:50Z. SHA-256 turns that line into a 64-character fingerprint, r6. One changed character gives a completely different fingerprint.

    Fig. 2.2

    Fingerprinted

    Simulated · demo data

    Record 6 · five fields

    Instrument
    HPLC-02
    Measurement
    hplc
    Peak area
    1508811
    Unit
    counts
    Captured (UTC)
    2026-09-14T08:47:50Z

    Payload · five fields · 48 bytes

    HPLC-02|hplc|1508811|counts|2026-09-14T08:47:50Z

    SHA-256Fingerprint r6

    eb1690bc5922a312d90ee139fdf8e20b92bf2cb0feae8ee0e70bd24fbd2b54d7

    Fig. 2.2 · The five fields joined by bars, 48 bytes, and their SHA-256 fingerprint r6, shown in full.
  3. 3.3Signed

    The fingerprint is signed with the demo key (ECDSA P-256, key id 7A15F562…), and anyone with the public key can check that the signature covers this fingerprint and no other.

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

    Fig. 2.3

    Signed

    Simulated · demo data

    Record 6 · five fields· signed

    Instrument
    HPLC-02
    Measurement
    hplc
    Peak area
    1508811
    Unit
    counts
    Captured (UTC)
    2026-09-14T08:47:50Z

    Payload · five fields · 48 bytes

    HPLC-02|hplc|1508811|counts|2026-09-14T08:47:50Z

    SHA-256Fingerprint r6

    eb1690bc5922a312d90ee139fdf8e20b92bf2cb0feae8ee0e70bd24fbd2b54d7

    ECDSA P-256Signature · over r6 · demo key 7A15F562…

    fd3cfca2c73346e6…6cadf2dfeb420279valid

    Fig. 2.3 · The fingerprint signed with the demo key 7A15F562…: the signature is valid and the record’s ring is drawn; its dot fills once the record is linked.
  4. 3.4Linked

    Record 6 also stores the link of record 5, h5. Its own link is h6 = SHA-256(h5 + r6 + “6”), and record 7 carries h6 forward as its previous link. So every record is tied to the one before it, back to the fixed start value of 64 zeros.

    Fig. 2.4

    Linked

    Simulated · demo data

    Sequence SEQ-0914-02

    h5h6
    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8

    simulated anchor: h8 0a35688a…

    h6 = SHA-256(h5 c04af03f… + r6 eb1690bc… + “6”) = c427b83a…

    Fig. 2.4 · Records 1 to 8, each linked to the one before. Record 6 takes in h5 and passes h6 on to record 7; signed and linked, it is sealed, and its dot fills.
  5. 3.5A change shows

    Suppose the peak area is changed after sealing, from 1508811 to 1508911: the recomputed fingerprint differs from the stored r6, the signature fails and the link into record 7 breaks, while records 7 and 8 still pass their own checks. So a changed value fails that record’s fingerprint and signature and breaks only the link into the next record. Replayed from 64 zeros, the head (the newest record’s link) no longer matches the anchored fingerprint, which is simulated here.

    Values in full
    Recomputed fingerprint of record 6
    3cafb26418ae173c328561dcc93084e7deec8bf90d91256182d563b673a554b2
    Recomputed link h6
    9b5c58aa6abab7daa23c1f4e53775232309c59ee360fa24342e2888fadcd8a86
    Link h6 that record 7 carries
    c427b83a4e29adf9380bef67d00302e12ddfd558ae8f5a558547b2b0cf3cba23
    Replayed head
    75d3969cb8e256fdaa255eeaf895a3c57ec59e4ad68158850a6731bfb9cd05d3
    Simulated anchor, h8
    0a35688a4c3ec82a5e621cede1f173a6d436ade0e20f159dca92c2a3711e3dc1

    Fig. 2.5

    A change shows

    Simulated · demo data

    Record 6 · sealed· changed after sealing

    Instrument
    HPLC-02
    Measurement
    hplc
    Peak area
    15088111508911
    Unit
    counts
    Captured (UTC)
    2026-09-14T08:47:50Z

    Payload · five fields · 48 bytes

    HPLC-02|hplc|15088111508911|counts|2026-09-14T08:47:50Z

    SHA-256Fingerprint r6Fingerprint, recomputed≠ stored r6 eb1690bc…

    eb1690bc5922a312d90ee139fdf8e20b92bf2cb0feae8ee0e70bd24fbd2b54d73cafb26418ae173c328561dcc93084e7deec8bf90d91256182d563b673a554b2

    ECDSA P-256Signature · over r6 · demo key 7A15F562…

    fd3cfca2c73346e6…6cadf2dfeb420279validfails

    Sequence SEQ-0914-02

    h5h6 ≠
    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8

    simulated anchor: h8 0a35688a…replayed head 75d3969c… ≠ simulated anchor 0a35688a…

    h6 = SHA-256(h5 c04af03f… + r6 eb1690bc… + “6”) = c427b83a…

    link 6→7 broken: recomputed h6 9b5c58aa… ≠ c427b83a… · records 7 and 8 pass

    Fig. 2.5 · The peak area changed to 1508911: the recomputed fingerprint differs, the signature fails, link 6→7 breaks and the replayed head no longer matches the simulated anchor. Records 7 and 8 pass their own checks.
  6. 3.6A correction is appended

    Made the right way, the same change is a correction: record 6 stays as sealed, and a new record 9 holds the new value, 1508911, with its own fingerprint, a link from record 8 and a signature. Its reason (“Peak reintegrated in the CDS after review; result imported again”) and “corrects #6” sit beside the seal, not inside it; all 9 records pass, and the new head, h9, is not yet anchored.

    Record 9 is signed with a one-time demo key (key id FEE1BE86…), made at build and then discarded, as Check a record signs a correction with a one-time demo key made in your browser; the demo key that signed records 1 to 8 was discarded too, so it cannot sign anything new.

    Values in full
    Fingerprint r9 (the same five fields as the change, so the same fingerprint)
    3cafb26418ae173c328561dcc93084e7deec8bf90d91256182d563b673a554b2
    Link h9
    128206a058f6bf9d72741d670e5ecd966c4eacfadc54137a4871a694d7a393aa
    Signature of record 9
    cb757702b66cf3984809b7c1c1dfb71f4731a5bf6526a4b43893aa95e89c207574cddb19cc97b97d2c40b1a82a33a85d249af2c721a58e26c5e053003ac985b3
    One-time public key (uncompressed point)
    040d586f9eeccc0c9e711002279871b277cca37e8bf05d52610d0415e044dcbfc8e9bb9c57500c81dd5dec6b1276a414a899f9e0a962eab91a9854841f07dbf817
    Its key id (first 16 bytes of SHA-256 of its SPKI)
    FEE1BE866091FC4D427FD85C383BDCA1

    Fig. 2.6

    A correction is appended

    Simulated · demo data

    Record 6 · stays as sealed · peak area 1508811

    Record 9 · other fields as in #6 · one-time demo key FEE1BE86…

    Peak area
    1508911
    Fingerprint r9
    3cafb264…
    Link h9
    128206a0…
    Signature
    cb757702b66cf398…c5e053003ac985b3 valid

    Beside the seal: corrects #6 · reason “Peak reintegrated in the CDS after review; result imported again”

    Sequence SEQ-0914-02

    h5h6corrects #6
    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9

    simulated anchor: h8 0a35688a…simulated anchor matches records 1 to 8 · record 9 not yet anchored

    h6 = SHA-256(h5 c04af03f… + r6 eb1690bc… + “6”) = c427b83a…

    h9 = SHA-256(h8 + r9 + “9”) = 128206a0… · all 9 records pass

    Fig. 2.6 · Record 6 stays as sealed. Record 9 holds the new value with its own fingerprint, a link from h8 and a signature with a one-time demo key; its reason and “corrects #6” sit beside the seal. All 9 records pass, and record 9 is not yet anchored.
  7. 3.7What comes next Upcoming

    Next, the head of a batch, here h8, would be pinned by the lab outside its system, on another drive, a printout or a notebook entry, with no network or ledger involved; a later rewrite of the history would show against it. Upcoming: an AI agent that checks fingerprint, signature, link and anchor before it uses a result.

    IQC-CK-01Check it yourself

    IQC-RD-01 §2Roadmap: what is upcoming

    Fig. 2.7

    What comes next

    Simulated · demo data

    Pinned outside the lab · simulated

    h8 0a35688a…

    A copy the lab would keep elsewhere: a later rewrite would show against it.

    AI agent Upcoming

    1. Fingerprint
    2. Signature
    3. Link
    4. Anchor

    It would check all four before it uses a result.

    Sequence SEQ-0914-02

    corrects #6
    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9

    simulated anchor matches records 1 to 8 · record 9 not yet anchoredh8 0a35688a…, the head of records 1 to 8

    h9 = SHA-256(h8 + r9 + “9”) = 128206a0… · all 9 records pass

    Record 9 would go in the next batch.

    Fig. 2.7 · h8, the head of records 1 to 8, as the lab would pin it outside its system (simulated here), and, upcoming, an AI agent that checks fingerprint, signature, link and anchor. Nothing here touches a network.

4Record history

The whole synthetic sequence, as an auditor would page through it. When the table comes into view, your browser checks every record once and marks each result.

Fig. 3

Record history

Simulated · demo data

Sequence
SEQ-0914-02
Instrument
HPLC-02
Method
Assay of Product 200 mg tablets
Injections
2026-09-14, 08:12 to 09:01 UTC
8 injections, one record each: 5 system-suitability injections of the reference standard (STD-A), then 3 preparations of Product 200 mg tablets (P200-S1 to P200-S3).
SealRecordSample contextRT min · contextCaptured UTCPeak area countsFinger­printLink to nextDemo signatureDemo sig.
1STD-A · system suitability, replicate 14.8215238470135c779fingerprint checked at buildintactvalid
2STD-A · system suitability, replicate 24.8115199629892c300fingerprint checked at buildintactvalid
3STD-A · system suitability, replicate 34.821527410ae3ff253fingerprint checked at buildintactvalid
4STD-A · system suitability, replicate 44.831521188976c4d87fingerprint checked at buildintactvalid
5STD-A · system suitability, replicate 54.8215256031f00a3f2fingerprint checked at buildintactvalid
6P200-S1 · sample, preparation 14.821508811eb1690bcfingerprint checked at buildintactvalid
7P200-S2 · sample, preparation 24.811531274ebe86f04fingerprint checked at buildintactvalid
8P200-S3 · sample, preparation 34.82151603945752d11fingerprint checked at buildintactvalid

StatusChecked at build: 8 of 8 records pass · simulated anchor matches. Live checking in your browser needs JavaScript.

Head (link of the newest record), replayed from 64 zeros0a35688a matches the anchored fingerprint

Anchored fingerprint (simulated, no network call)0a35688a the head of records 1 to 8, stored on this page as a simulated anchor

Read only. Editing lives on Check a record.

Change a value on Check a record
Fig. 3 · The eight records of sequence SEQ-0914-02, oldest first. Your browser checks each one from the values in the table: the fingerprint of its five sealed fields, its signature, and the link it carries into the next record. The head is the link of the newest record, recomputed by replaying the whole history from 64 zeros. Sample and retention time are context, not sealed in the alpha. Signatures as in Fig. 1.

5Today, upcoming and not claimed

  • App · in your browserDrop a data folder and your browser re-reads every file, checks it against the ledgers in the folder and gives one verdict. Nothing is uploaded. Agent steps show traced back to sealed measurements, and a reviewer signs them off in its review mode. A demo shows a pass, a review and a fail.
  • Agent · iqc.mjsSeals every file in a folder as the instrument software writes it, records the steps AI agents take on files and serves the same to AI agents over MCP; a person signs off steps with iqc review. One file for Node.js 22.
  • These pagesThe alpha app’s construction on one synthetic sequence, signed with a demo key at build. Your browser recomputes every check.
  • Alpha app · not publicImports HPLC CSV exports and seals each peak area (instrument, measurement type, value, unit, capture time) with one server key. The capture time is an injection time typed at import, or the server’s clock.
  • UpcomingSealing at capture (SiLA 2 and OPC UA LADS adapters), measured and derived records, lineage and recall, Merkle batches with salted leaves and inclusion checks, per-analyst signatures, signatures that cover each record’s position, server-side verification in the app, sample and method metadata in the seal, and post-quantum signatures. Every anchor on this site is simulated.
  • Not claimedNo customers, no capture at the instrument or orchestrator, no electronic signatures and no validation. Nothing on this site or in the app writes to a network.

BasisThe app seals whole files instead: each file’s SHA-256 fingerprint, path and size, signed and linked in a ledger in the folder.

6Where it fits

In an automated lab, the scheduler or orchestrator, the device drivers and the data pipeline sit between the instrument and the record. Sealing each result in the orchestrator or driver, as the instrument produces it, over SiLA 2 or OPC UA LADS, is upcoming.

Today, Immutable QC sits beside an HPLC CSV export: the alpha app fingerprints, links and signs each imported peak area with one server key. On these pages the record history is tamper-evident. Today a change made before import is not covered; with sealing at capture, only a change made before capture would be.

  1. Instrumentproduces each result
  2. Orchestrator or driverschedules runs and receives results (SiLA 2, OPC UA LADS); sealing here is upcoming
  3. Data pipelinestores, converts and exports results
  4. Models and agentsanalyze results and pick the next experiment

Upcoming: sealed here

Today: an HPLC CSV export

Immutable QC Alpha

Today: imports an HPLC CSV export, then fingerprints, links and signs each peak area. Upcoming: would seal each result as the orchestrator or driver receives it, before anything downstream could change it.

Upcoming: agents would check the sealed history before use

Fig. 4 · Where Immutable QC would sit in an automated lab. Today it imports an HPLC CSV export (solid line); the dashed lines are upcoming.

6.1When your process moves into GMP

Your instrument, CDS, LIMS and QA review stay as they are. In the alpha, Immutable QC sits beside the CDS export and sends nothing back; a reviewer or an auditor would check the sealed history.

  1. Instrumentacquires the run
  2. CDSintegrates peaks; keeps its audit trail
  3. LIMSholds results and specifications
  4. QA reviewreview, approval and release

CSV export from the CDS

Immutable QC Alpha

Imports the HPLC CSV export, then fingerprints, links and signs each peak area.

Upcoming: QA review would check the sealed history

Fig. 5 · Where Immutable QC sits in a GMP lab. The CDS export feeds it and nothing goes back; the dashed link (QA review checking the sealed history) is upcoming.

Built toward the audit-trail expectations of 21 CFR Part 11, EU Annex 11 and ISO/IEC 17025:2017. Not validated. No electronic signatures yet. Not a substitute for your computerized-system validation or SOPs.

Read the regulatory map

7What leaves the lab

Stays with the lab

  • Peak areas and every other value, in readable form
  • Sample, method and sequence records
  • Names, reasons and review notes
  • The record history itself

Pinned outside the lab’s system

Nothing on this site or in the app writes to a network or sends a record anywhere. So that a later rewrite would show, a lab would pin one batch fingerprint for a whole run of records by its own means: a pin file on another drive or share, a printout or a notebook entry. Here it is the link of record 8, which depends on records 1 to 8.

0a35688a4c3ec82a5e621cede1f173a6d436ade0e20f159dca92c2a3711e3dc1

Simulated here, with no network call. Anyone who holds the records can recompute it.

IQC-HS-01 §7The anchor (simulated)

8Agentic workflows

Today the agent records the steps AI agents take on files: what each step read and wrote, by SHA-256, and what it did, in the agent’s own signed ledger, through iqc record or the agent’s MCP server, which AI agents call over standard input and output. Before an agent uses a file, check_inputs says whether its bytes are a sealed measurement, the output of a recorded step, or neither; an audit traces each recorded step’s named inputs back to sealed files, and a person can sign off each step. A trace follows the steps as the agent recorded them: a step can name inputs it did not use, or outputs it did not compute from them. A person’s review checks that.

A pass says a file has not changed since sealing, not that it was right, or that it was ever measured. That works on whole files. With measured and derived records, upcoming, only a record sealed at capture, by the instrument’s or orchestrator’s key, would count as measured, so a number either traces back to a measurement or it does not. A derived number that cites real measurements but was computed or copied wrongly would still pass; a checker would re-run the analysis from its cited inputs where it is deterministic.

Check a record shows one record of this construction as an agent would receive it. A reviewer’s key identifies a computer or a browser, not a person; per-analyst signatures are upcoming.

IQC-AG-01For AI agents: the agent and its MCP server

IQC-RD-01 §2.5Per-analyst signatures

IQC-RD-01 §2.2Measured and derived records

9The document set