Magento 2 / product data standardisation

Correcting the catalogue is the easy half. Keeping it corrected is the deliverable.

A working pass over a catalogue in the pre-correction state: encoded option IDs decoded, Cyrillic SKUs repaired, units normalised to SI, every row classified to ETIM and eCl@ss, FR and EN technical copy generated from the corrected attributes. Then the part that makes it stick: six invariants that every row must satisfy before it is allowed to go live.

rows in0
option IDs decoded0
SKUs repaired0
units to SI0
passed gate0
blocked0
Synthetic data. These rows were written to match the four families and the failure modes named in the brief (fasteners, hydraulics, power transmission, bearings). No client catalogue was used, and none was requested. Point the same pipeline at a real export and the mechanics are unchanged.
Class codes are placeholders. Everything shown in the ETIM / eCl@ss column reads DEMO-CLS-nn and DEMO-ECL-nn on purpose. The real ETIM 10.0 and ECLASS 16.0 class lists are licensed releases, so quoting real codes here would be guessing at your classification. What this demonstrates is the mechanism: deterministic rules where every assignment names the rule that produced it. On a live engagement the mapping table comes from the licensed release.
Thread pitches are the ISO 261 coarse values (M6 1.00, M8 1.25, M10 1.50, M12 1.75, M16 2.00), not invented ones.
01

Pipeline

every stage is a pure function, independently tested
02

Row by row

click any row for the decode trail and the generated copy
#SKUFamilyDecoded attributes NormalisedClass (placeholder)Gate
03

The gate

a row failing any single invariant does not go live

Invariants

Blocked rows

running The assertions below run in this page on load. They are the same file that runs under node.