Evidence infrastructure for CRA Art. 14 and Machinery Reg. 2023/1230
IAAIndustrial Autonomous Assurance
Talk to salesStart free
Menu
PricingPrivacy

The fleet layer

assurance machine answers for one run. assurance machinery answers for one machine. This answers for everything an integrator is on the hook for at once — and it is the part that gets more valuable with every machine enrolled.

assurance fleet list      --ledger register.db
assurance fleet advisory  advisory.json --ledger register.db
assurance fleet declare   manifest.json --doc-id DOC-0412 --issued-by "..." \
                          --legislation "Regulation (EU) 2023/1230" --out doc.json
assurance fleet declaration doc.json --manifest manifest.json --ledger register.db

Monday morning

machine                      site                   worst             stale  fns  config
-----------------------------------------------------------------------------------------
Grimaldi/AR-7#0501           Plant 7, Cell A        stale                 1    2  9c4dbacf06a9
Grimaldi/AR-7#0733           Plant 9, Line 1        never_verified        0    2  b050efe446c3
Grimaldi/AR-7#0412           Plant 2, Line 4        current               0    2  4d77ffb0f71b

5 machine(s): 3 covered, 2 with gaps

Worst first, because that is the order somebody reads it in. Every row comes from the same assess_coverage that answers one machine — this is aggregation, not new inference, and that is deliberate.

The choke point

A supplier publishes an advisory. Today it lands in an inbox and the integrator who carries the CE liability for forty cells cannot answer the only question that matters. The mailing list does not know what is installed anywhere. The plant does not know what its cells are made of. The supplier does not know who bought what.

The manifest fleet does — and because the manifest already maps item → safety function → verification check → coverage, the advisory does not stop at you have four affected machines:

CTRL-2026-11 (ControlCo, safety_relevant) — EXPOSED
  4 of 5 machine(s) match; 3 safety function(s) newly in question

  Grimaldi/AR-7#0412   Plant 2, Line 4   [confirmed] ITM-FW 3.8.2
      the artefact on this machine is byte-identical to one ControlCo named
      as affected (111111111111).
      SF-01  Protective stop on zone intrusion, verified 2026-02-09  → NOW IN QUESTION
      SF-02  Speed limit in collaborative operation, verified 2026-02-09  → NOW IN QUESTION

Matching: a label is not an artefact

assurance.machinery already proves a firmware can be replaced without the version string moving. So an advisory is matched on the strongest available evidence and the basis is always reported, never flattened to a boolean:

basis confidence meaning
hash confirmed the artefact is byte-identical to one the supplier named
hash_mismatch contradictory the label matches and the artefact does not
version probable the label matches; the supplier published no hash
name_only possible same component, version unknown or unlisted

hash_mismatch is the finding no other system on the market can produce:

  Grimaldi/AR-7#0418   Plant 2, Line 6   [contradictory] ITM-FW 3.8.2
      this machine reports version '3.8.2', which the advisory names, but the
      artefact hashes to 222222222222, which is not among the hashes ControlCo
      published for that version. Either the supplier's figure is wrong or this
      machine is not running what it says it is running. Both need a person.
      SF-01  → UNRESOLVED (coverage: current)

It is counted in neither column. Not affected, not clear.

No version-range arithmetic. Vendor version schemes are not semver, parsing them as if they were is how a cell gets cleared that should have been stopped, and an advisory that means "everything before 3.9" can enumerate the versions it means.

Already-lapsed is not newly in question

A machine whose coverage was already stale is reported and is not counted as newly in question. An advisory does not make a lapsed function worse, and mixing the two hides the machines that were fine until this morning — which are the ones somebody has to go and look at today.

The Declaration of Conformity

A DoC has never named the software configuration it was signed against, because until there was a configuration hash there was nothing to name. So it goes on describing a machine that stopped existing the day a technician updated the firmware, and nobody can point at the moment it stopped being true.

DOC-AR7-0412 — CONFIGURATION CHANGED
  declaration DOC-AR7-0412, issued 2026-01-20 by Grimaldi Engineering, covers
  configuration 108b15f43f26. Grimaldi/AR-7#0412 currently runs 6acb6ee2e14e.
  The declaration does not describe this machine.

Two questions, reported separately because they have different remedies:

  • configuration_changed — the declaration is about software that is no longer installed.
  • configuration_intact_evidence_lapsed — the software is right and the demonstration behind it has lapsed.

assurance fleet declare binds a declaration to the configuration in front of you, so every later manifest either matches it or does not.

This makes no legal judgement and says so in every output. Whether a changed configuration amounts to a substantial modification requiring a new conformity assessment is a question for the manufacturer and their notified body. What this establishes is the fact that question rests on.

What is free, and why

POST /v1/fleet/advisory/check — one advisory, one machine, no account, 10/day. A bulletin landed this morning; an integrator can answer is this cell one of them before finishing their coffee.

POST /v1/fleet/declaration/check — free for anyone, forever. The person who most needs to know a declaration has stopped describing a machine is the buyer, not the seller. Gating it behind an account with the people who sold them the machine would make it worthless.

The fan-out across an enrolled fleet is the paid product, because it requires the manifests to be in the ledger — which is exactly the thing worth paying for.