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
#
SKU
Family
Decoded attributes
Normalised
Class (placeholder)
Gate
03
The gate
a row failing any single invariant does not go live
Invariants
Blocked rows
runningThe assertions below run in this page on load. They are the same file that runs under node.