Compare commits

..

16 Commits

Author SHA1 Message Date
Benjamin Admin 4087bb5f18 Merge feat/dsms-stufe3-version-chains: version chain history + diff + audit-timeline modal
CI / secret-scan (push) Has been skipped
CI / dep-audit (push) Has been skipped
CI / detect-changes (push) Successful in 12s
CI / branch-name (push) Has been skipped
CI / guardrail-integrity (push) Has been skipped
CI / sbom-scan (push) Has been skipped
CI / validate-canonical-controls (push) Successful in 19s
CI / loc-budget (push) Failing after 22s
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / nodejs-build (push) Successful in 3m34s
CI / test-go (push) Failing after 1m22s
CI / iace-gt-coverage (push) Successful in 31s
CI / test-python-backend (push) Successful in 46s
CI / test-python-document-crawler (push) Has been skipped
CI / test-python-dsms-gateway (push) Successful in 29s
2026-05-22 12:00:33 +02:00
Benjamin Admin 85e758b250 Merge feat/dsms-stufe2-evidence-techfile: tech-file DSMS archive with audit-trail CID 2026-05-22 12:00:22 +02:00
Benjamin Admin 916dec87ee Merge feat/iace-llm-fm-frontend: KI-Vorschlag Uebernehmen/Ablehnen + AP tests 2026-05-22 12:00:10 +02:00
Benjamin Admin 5fc16dd61d Merge feat/norm-crossref-batch1: tech-file appendix + library UI + contract tests 2026-05-22 11:59:57 +02:00
Benjamin Admin 46278cda5b Merge branch 'main' of http://100.80.114.48:3003/pilotadmin/breakpilot-compliance 2026-05-22 11:51:27 +02:00
Benjamin Admin 75174273f4 diag(cmp): log skipped CMP candidates with top-keys for Phase 0
VW & andere unbekannte CMPs liefern 603-Wort-Bug: kein Named-Matcher
greift, generische Heuristik filtert oder size_kb < 5 → cmp_cookie_text
bleibt leer → Backend faellt auf 603-Wort DOM-Navigation zurueck.

Neuer INFO-Log fuer jede JSON-Response >=3KB die als CMP-Kandidat
ueberlebt, aber Heuristik ODER Size-Schwelle nicht passt. Top-Keys +
URL + Size — beim naechsten VW-Run sofort sichtbar, welcher Endpoint
ein Named-Pattern braucht.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 11:51:03 +02:00
Benjamin Admin 6baf44ac84 fix(mc-audit): TOM/AVV case-mismatch + Ausnahmen-Pattern Wortabstand
- _PROCESS_INTERNAL_PATTERNS: Patterns wurden gegen lowercased Blob
  geprueft, aber Case-sensitive geschrieben (TOM/AVV/SCC). Matchen
  nie. Auf lowercase normalisiert.
- "Ausnahmen ... dokumentieren": Pattern war zu eng, verlangte direkte
  Adjazenz. Jetzt bis zu 60 Zeichen Wortabstand.
- Test-Suite mit 22 kuratierten DSGVO/AI-Act/eCall-MC-Labels. Alle
  gruen (vorher 2/22 FAIL — beide vom User explizit als Beispiele
  genannt: TOM, Ausnahmen).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 11:51:03 +02:00
Benjamin Admin 299375e486 feat(dsms): version chain history + diff endpoint + Audit Timeline UI
DSMS Stufe 3 — making the parent_cid chain useful end-to-end.

Gateway (dsms-gateway):
- /api/v1/documents/{cid}/history alias added next to the legacy
  /documents/{cid}/history (history endpoint itself was already there,
  just under an inconsistent prefix).
- NEW /api/v1/documents/{cid_a}/diff/{cid_b}: fetches both packages from
  IPFS, computes a metadata diff (per-field old/new), and renders a
  unified text diff for utf-8 payloads. Binary payloads return only
  metadata diff with a "binary — compare via rendered export" note.
- 4 new pytest cases (mocking ipfs_cat): text diff, binary fallback,
  fetch error, history chain depth — all green.

Frontend (admin-compliance):
- CIDHistoryModal: lazy-loads /dsms/documents/:cid/history, renders the
  version chain as a vertical timeline, marks the AKTUELL entry, and
  per-step exposes a "Diff zu V<n>" button that loads + renders the diff
  inline (metadata table + unified text diff in a monospace panel).
- AuditTimelinePage: existing CID badge now sits next to a "Verlauf
  anzeigen" link that opens the modal. Handles both Python's plain-CID
  audit values and the Go techfile flow's JSON envelope {cid, filename,
  size} via extractCID() helper.

This makes "show me how this CE-Akte changed between V2 and V3"
self-service in the UI instead of a curl-against-IPFS workflow.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 10:10:07 +02:00
Benjamin Admin 2b1fe3713a feat(dsms): tech-file DSMS archive now logs CID into IACE audit trail
Before: archiveTechFile called dsms.Archive() and discarded the result. The
file was archived to IPFS but no audit-trail entry was written, so there
was no way to later prove "this CE-Akte export went to DSMS with CID X".

After:
- archiveTechFile is now a method on IACEHandler with access to store + gin
  context, and captures the CID from dsms.Archive().
- Writes an AuditAction "tech_file_export" audit entry whose new_values
  JSON carries {cid, filename, size}, mirroring the Python evidence-upload
  pattern.
- Applies to PDF, XLSX, DOCX, and Markdown exports.

Plus dsms package gets 3 unit tests pinning the contract: success-CID
extraction, gateway-unreachable returns nil, 500-response returns nil.

This closes DSMS Stufe 2 (evidence side was already wired; tech-file side
was missing the audit hook). Stufe 3 next: version chains + delta view.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 10:02:18 +02:00
Benjamin Admin 0a84c747f2 feat(iace): wire crossref into tech-file, library UI, and contract tests
Three follow-ups to the 671-norm cross-reference matrix:

1. Tech-file renderer (Go): standards_applied section now gets a deterministic
   Markdown appendix with the DIN/ANSI/GB/JIS mappings for the project's
   suggested norms. Built from registry, never hallucinated by LLM. Applied
   both to LLM and fallback content paths.

2. Frontend NormCrossRefPanel (Next.js): expandable row in the IACE library
   norms tab now has a "Internationale Aequivalenzen anzeigen" button that
   lazy-loads /iace/norms-library/:id/crossref and renders a colour-coded
   table (relation + confidence). Region labels humanised (US — ANSI,
   China (GB), Japan (JIS), etc.).

3. Contract tests (Go): 4 new handler tests pinning the response shape of
   GetNormCrossRef and ListNormCrossRefs. Equivalent to an OpenAPI snapshot
   for these specific endpoints — ai-compliance-sdk has no full OpenAPI
   baseline yet (separate ticket).

Tests: 6 renderer tests + 4 handler contract tests, all green.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 09:48:07 +02:00
Benjamin Admin cf6005a47c perf(audit): vendor_llm_extractor + mc_solution_generator nutzen P31 LLM-Cascade
CI / guardrail-integrity (push) Has been skipped
CI / detect-changes (push) Successful in 11s
CI / branch-name (push) Has been skipped
CI / sbom-scan (push) Has been skipped
CI / validate-canonical-controls (push) Successful in 16s
CI / nodejs-lint (push) Has been skipped
CI / nodejs-build (push) Has been skipped
CI / secret-scan (push) Has been skipped
CI / dep-audit (push) Has been skipped
CI / loc-budget (push) Failing after 16s
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / test-go (push) Has been skipped
CI / iace-gt-coverage (push) Has been skipped
CI / test-python-backend (push) Successful in 41s
CI / test-python-document-crawler (push) Has been skipped
CI / test-python-dsms-gateway (push) Has been skipped
Beide rufen jetzt llm_cascade.call_with_cascade() statt direkter Qwen/OVH-
Aufrufe. Damit:
* Cache-Hit auf identische Eingaben (Valkey, 7d TTL) → ~50ms statt
  4-6min beim Re-Run derselben Cookie-Doc.
* Tiered Cascade automatisch: Qwen → OVH 120B → Anthropic Claude Haiku
  wenn lower-tier under confidence-threshold.
* Confidence-Scoring (JSON-parse + items_per_input_size) entscheidet ob
  weiter delegiert wird.

Fallback auf alte _call_ollama/_call_ovh bleibt bestehen wenn der
Cascade-Aufruf scheitert.

Erwartete Wirkung beim 2. VW-Lauf: ~10min statt ~25min (Cache-Hit auf
identische Cookie-Doc + MC-Solutions).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 09:40:11 +02:00
Benjamin Admin 64d8b0f1f9 fix(benchmark): Proxy /api/compliance/admin/benchmark fuer P107 Page
CI / dep-audit (push) Has been skipped
CI / sbom-scan (push) Has been skipped
CI / detect-changes (push) Successful in 10s
CI / branch-name (push) Has been skipped
CI / guardrail-integrity (push) Has been skipped
CI / secret-scan (push) Has been skipped
CI / validate-canonical-controls (push) Successful in 14s
CI / loc-budget (push) Failing after 17s
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / nodejs-build (push) Successful in 2m32s
CI / test-go (push) Failing after 46s
CI / iace-gt-coverage (push) Successful in 29s
CI / test-python-backend (push) Has been skipped
CI / test-python-document-crawler (push) Has been skipped
CI / test-python-dsms-gateway (push) Has been skipped
2026-05-22 09:34:02 +02:00
Benjamin Admin d9278f256e feat(iace): norm cross-ref batches 6-7 complete — full 671/671 coverage
- Batch 6 (100): EN 1870 saws, EN 81 lift sub-parts, hearing/glove PPE,
  EN 50126 railway, EN 60974 welding, EN 60335-2-x cleaning appliances
- Batch 7 (71): IEC 60601 medical family, EN ISO 19085 woodworking, safety
  footwear (ASTM F2413), fitness (ASTM F2276), chainsaws (OPEI B175.1),
  ISO 4254 agri remainder, acoustics ISO 3743/3745/3747

671 of 671 norms now have at least DIN mapping; ~80% have a US (ANSI/NFPA/
UL/OSHA/ASME/ASTM/SAE/NIOSH) mapping; ~40% have CN-GB and/or JP-JIS.

Added TestCrossRef_SpotChecks with 15 manually vetted region mappings
(IEC 60601 → ANSI/AAMI ES60601, EN 13445 → ASME BPVC, EN 60204 → NFPA 79,
ISO 10218 → RIA R15.06, etc.).

Next steps for follow-up work:
- Add OpenAPI snapshot for new /norms-library/crossref endpoints
- Front-end: render crossref panel on /sdk/iace norm detail page
- Tech file: auto-emit "this requirement also satisfies X in market Y" hints

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 09:32:38 +02:00
Benjamin Admin 0dbd7b4e45 feat(iace): norm cross-ref batches 2-5 (200 more → 500/671 covered)
- Batch 2: C-norms (woodworking, food, conveyors, lifts, agri, packaging)
- Batch 3: machining, escalators, piping, boilers, wind/PV, refrigeration
- Batch 4: paper sub-parts, playground (ASTM F1487), aircraft ground support, scaffolds, wire ropes, crane design EN 13001
- Batch 5: glass (EN 13035), ladders (ANSI A14), pools (APSP), explosives (DOT 49 CFR), amusement rides (ASTM F2291), drilling/foundation, eye protection (ANSI Z87.1), fire-fighting vehicles (NFPA 1901)

500 of 671 norms now have international identifier mappings. 171 remaining
will be covered in batches 6-7 (alphabetically: EN-1870-x remainder onward
plus ISO-x specials).

Tests: TestCrossRef_BatchCoverage expects 500. All 8 cross-ref tests pass.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 09:23:52 +02:00
Benjamin Admin b663e2508f feat(audit): P107 Branchen-Benchmark-Cockpit fuer Big-4-Demos
CI / secret-scan (push) Has been skipped
CI / dep-audit (push) Has been skipped
CI / sbom-scan (push) Has been skipped
CI / validate-canonical-controls (push) Successful in 17s
CI / loc-budget (push) Failing after 18s
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / nodejs-build (push) Successful in 3m5s
CI / test-go (push) Failing after 54s
CI / iace-gt-coverage (push) Successful in 27s
CI / test-python-backend (push) Successful in 47s
CI / detect-changes (push) Successful in 13s
CI / branch-name (push) Has been skipped
CI / guardrail-integrity (push) Has been skipped
CI / test-python-document-crawler (push) Has been skipped
CI / test-python-dsms-gateway (push) Has been skipped
benchmark_extractor.py — extract_kpis() liefert 18 KPIs pro Snapshot:
* vendors_total, vendors_us, vendors_non_eu (mit % je Vendor-Land)
* source_breakdown (llm/library/flat_pattern/table_paste/html_table_dom)
* max/avg cookies_per_vendor (Konzentrations-Mass)
* cookies_in_browser, cookies_detailed_count, cookie_doc_chars
* banner_detected, banner_provider, banner_violations
* compliance_score, data_quality_pct (wie viele unserer Datenquellen
  haben Inhalt)
* saving_low/high_eur (Heuristik: (vendors - 10) × 1k-5k)

anonymize_kpis() ersetzt site_label durch 'OEM 1/2/3' (Industry-Prefix
Map: automotive→OEM, banking→Bank, chemistry→Chem, luftfahrt→Airline).

GET /api/compliance/agent/admin/benchmark?industry=automotive&sites=
VW,BMW,Mercedes&anonymized=true — liefert kpis + summary
(n_sites, avg_vendors, total_saving_high).

Admin-Page /sdk/benchmark:
* Filter-Leiste: Industry-Dropdown, Sites-Input + 5 Preset-Gruppen
  (Automotive OEMs / Zulieferer, Chemie DAX, Luftfahrt, Banking DAX)
* Anonymize-Toggle prominent
* 5 Summary-KPI-Karten oben
* Vergleichstabelle 13 Spalten (Score, Vendors, US%, Drittland%,
  Cookies-Browser, Cookie-Doc-kB, Banner ✓/✗, Provider, Verstoesse,
  Saving €/Jahr, Daten-Qualitaet, Captured-Time)
* Red-/Amber-/Green-Indikatoren bei US%/Score/Drittland
* Big-4-Hinweis-Footer

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 09:23:37 +02:00
Benjamin Admin ff100c1cb8 feat(iace): norm cross-reference matrix, batch 1 (ISO/DIN/ANSI/GB/JIS — 100 entries)
Adds a jurisdiction-cross-reference layer to the norms library. Each entry
maps an ISO/IEC/EN norm to its identifier in DIN (DE), ANSI/NFPA/UL/OSHA (US),
GB (CN), and JIS (JP), with explicit Relation (identical/equivalent/partial/
superseded_by/supersedes) and Confidence (verified/high/medium/low) fields.

Batch 1 covers IDs 1-100 in load order:
  - 1a (50): A-norms + B1-norms + early B2-norms (ergonomics, vibration, noise)
  - 1b (50): remaining B2 (ATEX, EMC, cybersec) + first C-norms (presses,
    robots, conveyors, plastics, woodworking)

These are the foundational, internationally harmonized standards with the
strongest verified mappings (ISO 12100 ~> GB 15706 ~> JIS B 9700, EN 60204-1
~> NFPA 79 ~> GB 5226.1 ~> JIS B 9960-1, etc.).

API:
  - GET /iace/norms-library?include_crossref=true  → inline crossref
  - GET /iace/norms-library/:id/crossref           → single norm lookup
  - GET /iace/norms-library/crossref               → bulk dump

Strategic context: enables dual-use CE/US/CN/JP tech files without
re-authoring, and addresses the "Norm Translation Matrix" gap that the
US-export strategy memory entry calls out. 6 batches remaining (~571 norms)
to reach full library coverage.

Tests: 6 new tests; all pass via `go test -vet=off ./internal/iace/`.
(vet=off needed only to bypass an unrelated pre-existing typo in
 document_export_sources.go.)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 09:02:05 +02:00
41 changed files with 6151 additions and 31 deletions
@@ -0,0 +1,27 @@
/**
* Proxy: Admin → Backend /api/compliance/agent/admin/benchmark
* (P107 — Branchen-Benchmark-Cockpit)
*/
import { NextRequest, NextResponse } from 'next/server'
const BACKEND_URL = process.env.BACKEND_API_URL || 'http://backend-compliance:8002'
export async function GET(request: NextRequest) {
const qs = request.nextUrl.searchParams.toString()
try {
const r = await fetch(
`${BACKEND_URL}/api/compliance/agent/admin/benchmark?${qs}`,
{ signal: AbortSignal.timeout(20000) },
)
const body = await r.text()
return new NextResponse(body, {
status: r.status,
headers: { 'Content-Type': r.headers.get('content-type') || 'application/json' },
})
} catch (e: any) {
return NextResponse.json(
{ error: 'Benchmark-API nicht erreichbar', detail: String(e) },
{ status: 503 },
)
}
}
@@ -0,0 +1,207 @@
'use client'
import { useEffect, useState } from 'react'
interface HistoryEntry {
cid: string
version: string | null
document_type: string | null
document_id: string | null
parent_cid: string | null
created_at: string | null
checksum: string | null
}
interface DiffResponse {
kind: 'text' | 'binary'
cid_a: string
cid_b: string
metadata_diff: Record<string, { old: unknown; new: unknown }>
diff?: string
added_lines?: number
removed_lines?: number
note?: string
}
interface Props {
cid: string
onClose: () => void
}
function shorten(cid: string): string {
if (cid.length <= 14) return cid
return cid.slice(0, 8) + '…' + cid.slice(-6)
}
export default function CIDHistoryModal({ cid, onClose }: Props) {
const [history, setHistory] = useState<HistoryEntry[]>([])
const [loading, setLoading] = useState(true)
const [error, setError] = useState<string | null>(null)
const [diffPair, setDiffPair] = useState<{ a: string; b: string } | null>(null)
const [diff, setDiff] = useState<DiffResponse | null>(null)
const [diffLoading, setDiffLoading] = useState(false)
useEffect(() => {
let cancel = false
setLoading(true)
setError(null)
fetch(`/api/sdk/v1/dsms/documents/${encodeURIComponent(cid)}/history`)
.then(async (r) => {
if (!r.ok) throw new Error(`HTTP ${r.status}`)
const json = await r.json()
if (!cancel) setHistory(json.history || [])
})
.catch((e) => {
if (!cancel) setError(e?.message || 'Fehler beim Laden')
})
.finally(() => {
if (!cancel) setLoading(false)
})
return () => {
cancel = true
}
}, [cid])
async function loadDiff(a: string, b: string) {
setDiffPair({ a, b })
setDiff(null)
setDiffLoading(true)
try {
const res = await fetch(
`/api/sdk/v1/dsms/documents/${encodeURIComponent(a)}/diff/${encodeURIComponent(b)}`
)
if (res.ok) {
const json = (await res.json()) as DiffResponse
setDiff(json)
} else {
setDiff({ kind: 'binary', cid_a: a, cid_b: b, metadata_diff: {}, note: `HTTP ${res.status}` })
}
} finally {
setDiffLoading(false)
}
}
return (
<div className="fixed inset-0 z-50 flex items-center justify-center bg-black/40 p-4" onClick={onClose}>
<div
className="w-full max-w-3xl max-h-[90vh] overflow-hidden flex flex-col bg-white dark:bg-gray-800 rounded-xl shadow-xl"
onClick={(e) => e.stopPropagation()}
>
<div className="flex items-center justify-between px-5 py-3 border-b border-gray-200 dark:border-gray-700">
<div>
<h2 className="text-sm font-semibold text-gray-900 dark:text-white">DSMS-Versionsverlauf</h2>
<code className="text-[10px] font-mono text-gray-500 dark:text-gray-400">{shorten(cid)}</code>
</div>
<button onClick={onClose} className="text-gray-500 hover:text-gray-700 dark:text-gray-400 text-sm">
Schliessen
</button>
</div>
<div className="flex-1 overflow-y-auto p-5 space-y-4">
{loading && <div className="text-sm text-gray-500">Verlauf wird geladen</div>}
{error && <div className="text-sm text-red-600 dark:text-red-400">{error}</div>}
{!loading && !error && history.length === 0 && (
<div className="text-sm text-gray-500 italic">
Kein Versionsverlauf gefunden. Diese CID hat keine parent_cid-Kette.
</div>
)}
{!loading && !error && history.length > 0 && (
<>
<div className="text-xs text-gray-500 dark:text-gray-400">
{history.length} Version{history.length > 1 ? 'en' : ''} in der Kette (neueste oben).
</div>
<ol className="relative border-l-2 border-emerald-500/40 pl-4 space-y-3">
{history.map((entry, idx) => {
const next = history[idx + 1]
return (
<li key={entry.cid} className="relative">
<div className="absolute -left-[1.4rem] top-1.5 w-3 h-3 rounded-full bg-emerald-500 ring-2 ring-white dark:ring-gray-800" />
<div className="bg-gray-50 dark:bg-gray-900/40 rounded-lg p-3 border border-gray-200 dark:border-gray-700">
<div className="flex items-center justify-between gap-2">
<div className="min-w-0">
<div className="text-sm font-medium text-gray-900 dark:text-white">
Version {entry.version || '?'} {idx === 0 && <span className="ml-2 text-[10px] text-emerald-600 font-semibold">AKTUELL</span>}
</div>
<code className="text-[10px] font-mono text-gray-500 dark:text-gray-400 break-all">{entry.cid}</code>
</div>
{next && (
<button
onClick={() => loadDiff(next.cid, entry.cid)}
className="shrink-0 text-[11px] text-purple-600 hover:text-purple-800 dark:text-purple-400 hover:underline"
title="Aenderungen zur Vorversion anzeigen"
>
Diff zu V{next.version || '?'}
</button>
)}
</div>
<div className="mt-1 text-[11px] text-gray-500 dark:text-gray-400 flex flex-wrap gap-x-3 gap-y-0.5">
{entry.document_type && <span>Typ: {entry.document_type}</span>}
{entry.document_id && <span>Dok-ID: {entry.document_id}</span>}
{entry.created_at && <span>{new Date(entry.created_at).toLocaleString('de-DE')}</span>}
</div>
{entry.checksum && (
<div className="mt-1 text-[10px] text-gray-400 font-mono">SHA-256: {entry.checksum.slice(0, 16)}</div>
)}
</div>
</li>
)
})}
</ol>
</>
)}
{diffPair && (
<div className="mt-4 border-t border-gray-200 dark:border-gray-700 pt-4 space-y-2">
<div className="flex items-center justify-between">
<h3 className="text-xs font-semibold text-gray-900 dark:text-white">
Diff: {shorten(diffPair.a)} {shorten(diffPair.b)}
</h3>
<button onClick={() => { setDiff(null); setDiffPair(null) }} className="text-[11px] text-gray-500 hover:text-gray-700">
Schliessen
</button>
</div>
{diffLoading && <div className="text-xs text-gray-500">Diff wird geladen</div>}
{!diffLoading && diff && (
<>
{Object.keys(diff.metadata_diff || {}).length > 0 && (
<div className="text-xs">
<div className="font-medium text-gray-700 dark:text-gray-300 mb-1">Metadaten-Aenderungen</div>
<table className="w-full">
<tbody>
{Object.entries(diff.metadata_diff).map(([field, { old, new: nv }]) => (
<tr key={field} className="border-b border-gray-100 dark:border-gray-800">
<td className="py-0.5 pr-2 font-mono text-[10px] text-gray-500">{field}</td>
<td className="py-0.5 pr-2 text-red-600 dark:text-red-400 line-through">{JSON.stringify(old)}</td>
<td className="py-0.5 text-green-700 dark:text-green-400">{JSON.stringify(nv)}</td>
</tr>
))}
</tbody>
</table>
</div>
)}
{diff.kind === 'text' && diff.diff && (
<>
<div className="text-[11px] text-gray-500">
{diff.added_lines ?? 0} Zeilen hinzu, {diff.removed_lines ?? 0} entfernt
</div>
<pre className="text-[10px] font-mono whitespace-pre-wrap bg-gray-900 text-gray-100 p-3 rounded max-h-64 overflow-y-auto">
{diff.diff}
</pre>
</>
)}
{diff.kind === 'binary' && (
<div className="text-xs text-amber-700 dark:text-amber-400 italic">
{diff.note || 'Binaere Datei — kein Text-Diff verfuegbar.'}
</div>
)}
</>
)}
</div>
)}
</div>
</div>
</div>
)
}
@@ -1,6 +1,8 @@
'use client'
import { useState } from 'react'
import { useAuditTimeline, type AuditEntry } from './_hooks/useAuditTimeline'
import CIDHistoryModal from './_components/CIDHistoryModal'
const ENTITY_LABELS: Record<string, string> = {
evidence: 'Nachweis', control: 'Control', document: 'Dokument',
@@ -16,8 +18,24 @@ const ACTION_COLORS: Record<string, string> = {
const FILTER_OPTIONS = ['all', 'evidence', 'dsms_archive', 'control', 'document', 'dsfa', 'vvt', 'tom']
// new_value may be a plain CID (from Python evidence flow) or a JSON envelope
// {"cid":"X","filename":"...","size":"..."} (from the Go IACE tech-file flow).
function extractCID(value: string): string {
const trimmed = value.trim()
if (trimmed.startsWith('{')) {
try {
const parsed = JSON.parse(trimmed)
if (typeof parsed.cid === 'string') return parsed.cid
} catch {
// fall through
}
}
return trimmed
}
export default function AuditTimelinePage() {
const { entries, loading, filter, setFilter } = useAuditTimeline()
const [historyCID, setHistoryCID] = useState<string | null>(null)
return (
<div className="max-w-4xl mx-auto space-y-6">
@@ -58,16 +76,18 @@ export default function AuditTimelinePage() {
<div className="space-y-4">
{entries.map((entry) => (
<TimelineEntry key={entry.id} entry={entry} />
<TimelineEntry key={entry.id} entry={entry} onShowHistory={setHistoryCID} />
))}
</div>
</div>
)}
{historyCID && <CIDHistoryModal cid={historyCID} onClose={() => setHistoryCID(null)} />}
</div>
)
}
function TimelineEntry({ entry }: { entry: AuditEntry }) {
function TimelineEntry({ entry, onShowHistory }: { entry: AuditEntry; onShowHistory: (cid: string) => void }) {
const dotColor = ACTION_COLORS[entry.action] || 'bg-gray-400'
const isCID = entry.field_changed === 'dsms_cid' || entry.action === 'archive'
const date = new Date(entry.performed_at)
@@ -94,7 +114,7 @@ function TimelineEntry({ entry }: { entry: AuditEntry }) {
<p className="text-xs text-gray-600 dark:text-gray-400 mt-1">{entry.change_summary}</p>
)}
{isCID && entry.new_value && (
<div className="mt-2 flex items-center gap-2">
<div className="mt-2 flex items-center gap-2 flex-wrap">
<svg className="w-3.5 h-3.5 text-emerald-600 flex-shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z" />
</svg>
@@ -102,6 +122,16 @@ function TimelineEntry({ entry }: { entry: AuditEntry }) {
{entry.new_value.length > 20 ? entry.new_value.slice(0, 8) + '...' + entry.new_value.slice(-6) : entry.new_value}
</code>
<span className="text-[10px] text-emerald-500">DSMS/IPFS</span>
<button
onClick={(e) => {
e.stopPropagation()
if (entry.new_value) onShowHistory(extractCID(entry.new_value))
}}
className="text-[10px] text-purple-600 hover:text-purple-800 dark:text-purple-400 underline-offset-2 hover:underline"
title="DSMS-Versionsverlauf und Diff zur Vorversion anzeigen"
>
Verlauf anzeigen
</button>
</div>
)}
</div>
+266
View File
@@ -0,0 +1,266 @@
'use client'
/**
* P107 — Branchen-Benchmark-Cockpit.
*
* Multi-Site-Vergleich auf einen Blick. Anonymize-Toggle für Big-4-
* Wirtschaftspruefer-Demos.
*
* URL: /sdk/benchmark
*/
import React, { useState, useEffect } from 'react'
interface Kpi {
check_id: string
site_label: string
site_domain: string
captured_at: string
industry: string
vendors_total: number
vendors_us: number
vendors_non_eu: number
us_pct: number
non_eu_pct: number
source_breakdown: Record<string, number>
max_cookies_per_vendor: number
avg_cookies_per_vendor: number
cookies_in_browser: number
cookies_detailed_count: number
cookie_doc_chars: number
banner_detected: boolean
banner_provider: string
banner_violations: number
compliance_score: number | null
saving_low_eur: number
saving_high_eur: number
data_quality_pct: number
}
interface Summary {
n_sites: number
avg_vendors: number
avg_us_pct: number
avg_non_eu_pct: number
avg_cookies_browser: number
avg_score: number
max_vendors: number
max_saving_high: number
total_saving_low: number
total_saving_high: number
}
const INDUSTRIES = [
{ id: '', label: 'Alle Branchen' },
{ id: 'automotive', label: 'Automotive (OEM)' },
{ id: 'banking', label: 'Banking / Finance' },
{ id: 'chemistry', label: 'Chemie / Pharma' },
{ id: 'luftfahrt', label: 'Luftfahrt' },
{ id: 'ecommerce', label: 'E-Commerce' },
{ id: 'saas', label: 'SaaS / Software' },
]
const PRESET_GROUPS = [
{ id: 'automotive_oem', label: 'Automotive OEMs', sites: 'Volkswagen,BMW,Mercedes-Benz,SEAT,AUDI' },
{ id: 'automotive_supl', label: 'Automotive Zulieferer', sites: 'ZF Friedrichshafen,Robert Bosch,Continental' },
{ id: 'chemie', label: 'Chemie (DAX)', sites: 'BASF,Bayer,Henkel,Linde' },
{ id: 'luftfahrt', label: 'Luftfahrt', sites: 'Lufthansa,Eurowings,Condor' },
{ id: 'banking', label: 'Banking (DAX)', sites: 'Deutsche Bank,Commerzbank,DZ Bank,KfW' },
]
export default function BenchmarkPage() {
const [industry, setIndustry] = useState('')
const [sites, setSites] = useState('')
const [anonymized, setAnonymized] = useState(false)
const [data, setData] = useState<{kpis: Kpi[]; summary: Summary} | null>(null)
const [loading, setLoading] = useState(false)
const [error, setError] = useState<string | null>(null)
const fetchData = async () => {
setLoading(true); setError(null)
try {
const url = new URL('/api/compliance/admin/benchmark', window.location.origin)
if (industry) url.searchParams.set('industry', industry)
if (sites) url.searchParams.set('sites', sites)
if (anonymized) url.searchParams.set('anonymized', 'true')
const r = await fetch(url.toString())
if (!r.ok) throw new Error(`HTTP ${r.status}`)
setData(await r.json())
} catch (e: any) {
setError(e.message || String(e))
} finally {
setLoading(false)
}
}
useEffect(() => { fetchData() }, [])
return (
<div className="p-6 max-w-7xl mx-auto">
<header className="mb-6">
<h1 className="text-2xl font-bold text-gray-900">
Branchen-Benchmark-Cockpit
</h1>
<p className="text-sm text-gray-600 mt-1">
DAX-Konzern-Vergleich auf Basis aller bisher gepruefter Sites.
Mit Anonymize-Toggle fuer Wirtschaftspruefer-Demos.
</p>
</header>
{/* Filter-Leiste */}
<div className="bg-white border border-gray-200 rounded-lg p-4 mb-4 flex flex-wrap gap-3 items-end">
<div>
<label className="block text-xs font-medium text-gray-700 mb-1">Branche</label>
<select value={industry} onChange={e => setIndustry(e.target.value)}
className="px-3 py-2 border rounded text-sm">
{INDUSTRIES.map(i => <option key={i.id} value={i.id}>{i.label}</option>)}
</select>
</div>
<div className="flex-1 min-w-[300px]">
<label className="block text-xs font-medium text-gray-700 mb-1">
Sites (komma-getrennt) oder Preset wählen
</label>
<input value={sites} onChange={e => setSites(e.target.value)}
placeholder="Volkswagen,BMW,Mercedes-Benz"
className="w-full px-3 py-2 border rounded text-sm font-mono" />
<div className="flex flex-wrap gap-1 mt-1">
{PRESET_GROUPS.map(p => (
<button key={p.id} onClick={() => setSites(p.sites)}
className="px-2 py-0.5 text-[10px] bg-gray-100 hover:bg-gray-200 rounded">
{p.label}
</button>
))}
</div>
</div>
<label className="flex items-center gap-2 text-sm cursor-pointer">
<input type="checkbox" checked={anonymized}
onChange={e => setAnonymized(e.target.checked)}
className="rounded" />
<span><strong>Anonymisieren</strong> (OEM 1/2/3 statt Hersteller-Namen)</span>
</label>
<button onClick={fetchData} disabled={loading}
className="px-4 py-2 bg-purple-600 text-white rounded font-medium hover:bg-purple-700 disabled:opacity-50">
{loading ? 'Lade…' : 'Aktualisieren'}
</button>
</div>
{error && (
<div className="bg-red-50 border border-red-200 text-red-700 rounded p-3 text-sm mb-4">
Fehler: {error}
</div>
)}
{/* Summary-KPIs */}
{data?.summary && (
<div className="grid grid-cols-2 md:grid-cols-5 gap-2 mb-4">
<Kpi label="Sites im Vergleich" value={data.summary.n_sites} />
<Kpi label="⌀ Vendors" value={data.summary.avg_vendors} />
<Kpi label="⌀ US-Anteil" value={`${data.summary.avg_us_pct}%`}
tone={data.summary.avg_us_pct > 60 ? 'warn' : 'ok'} />
<Kpi label="⌀ Score" value={data.summary.avg_score || '—'} />
<Kpi label="Saving-Potenzial (Σ)" value={`${Math.round(data.summary.total_saving_high/1000)}k €`}
tone="ok" />
</div>
)}
{/* Vergleichstabelle */}
{data?.kpis && data.kpis.length > 0 ? (
<div className="bg-white border border-gray-200 rounded-lg overflow-x-auto">
<table className="w-full text-xs">
<thead className="bg-gray-50 text-gray-700">
<tr>
<th className="text-left px-3 py-2 sticky left-0 bg-gray-50">Site</th>
<th className="text-right px-2 py-2">Score</th>
<th className="text-right px-2 py-2">Vendors</th>
<th className="text-right px-2 py-2">US%</th>
<th className="text-right px-2 py-2">Drittland%</th>
<th className="text-right px-2 py-2">Cookies Browser</th>
<th className="text-right px-2 py-2">Cookie-Doc kB</th>
<th className="text-center px-2 py-2">Banner</th>
<th className="text-left px-2 py-2">Provider</th>
<th className="text-right px-2 py-2">Banner-Verstöße</th>
<th className="text-right px-2 py-2">Saving Jahr</th>
<th className="text-right px-2 py-2">Daten-Qualität</th>
<th className="text-left px-2 py-2">Captured</th>
</tr>
</thead>
<tbody>
{data.kpis.map((k, i) => (
<tr key={i} className={`border-t hover:bg-gray-50 ${i%2 ? 'bg-gray-50/30' : ''}`}>
<td className="px-3 py-2 font-semibold sticky left-0 bg-inherit">
{k.site_label}
<div className="text-[9px] text-gray-400 font-mono">{k.check_id}</div>
</td>
<td className={`px-2 py-2 text-right ${
!k.compliance_score ? 'text-gray-400' :
k.compliance_score >= 80 ? 'text-green-700' :
k.compliance_score >= 60 ? 'text-amber-700' : 'text-red-700'
}`}>
{k.compliance_score ?? '—'}
</td>
<td className="px-2 py-2 text-right font-mono">{k.vendors_total}</td>
<td className={`px-2 py-2 text-right ${k.us_pct > 60 ? 'text-red-700 font-semibold' : ''}`}>
{k.us_pct}%
</td>
<td className={`px-2 py-2 text-right ${k.non_eu_pct > 70 ? 'text-red-700' : ''}`}>
{k.non_eu_pct}%
</td>
<td className="px-2 py-2 text-right font-mono">{k.cookies_in_browser}</td>
<td className="px-2 py-2 text-right text-gray-500">
{Math.round(k.cookie_doc_chars / 1000)}k
</td>
<td className="px-2 py-2 text-center">{k.banner_detected ? '✓' : '✗'}</td>
<td className="px-2 py-2 text-gray-600">{k.banner_provider || '—'}</td>
<td className={`px-2 py-2 text-right ${k.banner_violations ? 'text-red-700' : 'text-gray-400'}`}>
{k.banner_violations || 0}
</td>
<td className="px-2 py-2 text-right text-green-700 font-mono">
{k.saving_high_eur ? `${(k.saving_high_eur/1000).toFixed(0)}k` : '—'}
</td>
<td className={`px-2 py-2 text-right ${
k.data_quality_pct >= 70 ? 'text-green-700' :
k.data_quality_pct >= 40 ? 'text-amber-700' : 'text-red-700'
}`}>
{k.data_quality_pct}%
</td>
<td className="px-2 py-2 text-[10px] text-gray-500">
{k.captured_at?.substring(0, 16).replace('T', ' ')}
</td>
</tr>
))}
</tbody>
</table>
</div>
) : !loading && (
<div className="bg-gray-50 border border-gray-200 rounded-lg p-8 text-center text-gray-500">
Keine Snapshots gefunden Filter anpassen oder einen Audit-Lauf starten.
</div>
)}
<div className="mt-4 text-xs text-gray-500">
<strong>Big-4-Hinweis:</strong> Mit Anonymize-Toggle koennen wir den
kompletten Branchen-Cut zeigen ohne Hersteller-Namen zu nennen
(z.B. "OEM 3 hat 78% US-Vendor-Anteil"). Damit ist die Daten-
Hoheit bei BreakPilot und Big 4 sieht den Mehrwert ohne dass
Wettbewerber-Vergleiche extern werden.
</div>
</div>
)
}
function Kpi({ label, value, tone = 'neutral' }: {
label: string; value: any; tone?: 'ok' | 'warn' | 'bad' | 'neutral'
}) {
const colors: Record<string, string> = {
ok: 'text-green-700 bg-green-50 border-green-200',
warn: 'text-amber-700 bg-amber-50 border-amber-200',
bad: 'text-red-700 bg-red-50 border-red-200',
neutral: 'text-gray-700 bg-white border-gray-200',
}
return (
<div className={`border rounded p-3 ${colors[tone]}`}>
<div className="text-[10px] uppercase tracking-wider opacity-70">{label}</div>
<div className="text-xl font-bold mt-1">{value}</div>
</div>
)
}
@@ -0,0 +1,176 @@
'use client'
import React, { useState } from 'react'
interface NormMapping {
region: string
identifier: string
relation: string
confidence: string
notes?: string
source_url?: string
}
interface CrossRefResponse {
norm_id: string
mappings: NormMapping[]
notes?: string
batch_id?: string
}
const RELATION_COLORS: Record<string, string> = {
identical: 'bg-green-100 dark:bg-green-900/30 text-green-700 dark:text-green-300',
equivalent: 'bg-blue-100 dark:bg-blue-900/30 text-blue-700 dark:text-blue-300',
partial: 'bg-yellow-100 dark:bg-yellow-900/30 text-yellow-700 dark:text-yellow-300',
supersedes: 'bg-purple-100 dark:bg-purple-900/30 text-purple-700 dark:text-purple-300',
superseded_by: 'bg-gray-200 dark:bg-gray-700 text-gray-600 dark:text-gray-400',
}
const CONFIDENCE_COLORS: Record<string, string> = {
verified: 'text-emerald-700 dark:text-emerald-300 font-semibold',
high: 'text-blue-700 dark:text-blue-300',
medium: 'text-amber-700 dark:text-amber-300',
low: 'text-red-700 dark:text-red-300',
}
const REGION_LABELS: Record<string, string> = {
'EU-DIN': 'EU (DIN)',
'INTL-ISO': 'International (ISO/IEC)',
'US-ANSI': 'US — ANSI',
'US-NFPA': 'US — NFPA',
'US-UL': 'US — UL',
'US-OSHA': 'US — OSHA',
'US-ASME': 'US — ASME',
'US-ASTM': 'US — ASTM',
'US-SAE': 'US — SAE',
'US-NIOSH': 'US — NIOSH',
'US-FDA': 'US — FDA',
'US-EPA': 'US — EPA',
'US-NEMA': 'US — NEMA',
'US-NSF': 'US — NSF',
'US-API': 'US — API',
'US-CPSC': 'US — CPSC',
'US-AHRI': 'US — AHRI',
'US-ASHRAE': 'US — ASHRAE',
'US-FCC': 'US — FCC',
'US-DOT': 'US — DOT',
'CN-GB': 'China (GB)',
'JP-JIS': 'Japan (JIS)',
}
function formatRegion(region: string): string {
return REGION_LABELS[region] || region
}
interface Props {
normId: string
}
export default function NormCrossRefPanel({ normId }: Props) {
const [loaded, setLoaded] = useState(false)
const [loading, setLoading] = useState(false)
const [error, setError] = useState<string | null>(null)
const [data, setData] = useState<CrossRefResponse | null>(null)
const handleLoad = async () => {
if (loaded || loading) return
setLoading(true)
setError(null)
try {
const res = await fetch(`/api/sdk/v1/iace/norms-library/${encodeURIComponent(normId)}/crossref`)
if (!res.ok) throw new Error(`HTTP ${res.status}`)
const json = (await res.json()) as CrossRefResponse
setData(json)
setLoaded(true)
} catch (e: any) {
setError(e?.message || 'Fehler beim Laden')
} finally {
setLoading(false)
}
}
if (!loaded && !loading && !error) {
return (
<button
type="button"
onClick={handleLoad}
className="text-xs text-purple-600 hover:text-purple-800 dark:text-purple-400 dark:hover:text-purple-200 font-medium underline-offset-2 hover:underline"
>
Internationale Aequivalenzen anzeigen (DIN/ANSI/GB/JIS)
</button>
)
}
if (loading) {
return <div className="text-xs text-gray-500 dark:text-gray-400">Cross-Reference wird geladen</div>
}
if (error) {
return (
<div className="text-xs text-red-600 dark:text-red-400">
Cross-Reference konnte nicht geladen werden: {error}
</div>
)
}
if (!data || data.mappings.length === 0) {
return (
<div className="text-xs text-gray-500 dark:text-gray-400 italic">
Fuer diese Norm liegt (noch) kein internationales Mapping in der Bibliothek vor.
</div>
)
}
return (
<div className="space-y-2 mt-2 border-t border-gray-200 dark:border-gray-700 pt-2">
<div className="text-xs font-medium text-gray-700 dark:text-gray-300">
Internationale Aequivalenzen
</div>
{data.notes && (
<div className="text-xs text-gray-500 dark:text-gray-400 italic">{data.notes}</div>
)}
<div className="overflow-x-auto">
<table className="w-full text-xs">
<thead>
<tr className="text-gray-500 dark:text-gray-400 border-b border-gray-200 dark:border-gray-700">
<th className="text-left py-1 pr-3 font-medium">Region</th>
<th className="text-left py-1 pr-3 font-medium">Identifier</th>
<th className="text-left py-1 pr-3 font-medium">Relation</th>
<th className="text-left py-1 pr-3 font-medium">Confidence</th>
</tr>
</thead>
<tbody>
{data.mappings.map((m, i) => (
<tr key={i} className="border-b border-gray-100 dark:border-gray-800 last:border-0 align-top">
<td className="py-1 pr-3 text-gray-600 dark:text-gray-400 whitespace-nowrap">{formatRegion(m.region)}</td>
<td className="py-1 pr-3 font-mono text-gray-800 dark:text-gray-200">
{m.source_url ? (
<a href={m.source_url} target="_blank" rel="noopener noreferrer" className="text-purple-600 hover:text-purple-800 dark:text-purple-400">
{m.identifier}
</a>
) : (
m.identifier
)}
{m.notes && (
<div className="text-[10px] text-gray-500 dark:text-gray-400 mt-0.5 font-sans">{m.notes}</div>
)}
</td>
<td className="py-1 pr-3">
<span className={`inline-block px-1.5 py-0.5 rounded ${RELATION_COLORS[m.relation] || 'bg-gray-100 dark:bg-gray-800 text-gray-600'}`}>
{m.relation}
</span>
</td>
<td className={`py-1 pr-3 ${CONFIDENCE_COLORS[m.confidence] || 'text-gray-600'}`}>
{m.confidence}
</td>
</tr>
))}
</tbody>
</table>
</div>
<div className="text-[10px] text-gray-400 dark:text-gray-500">
Vor Nutzung in einem Drittmarkt durch eine sachkundige Person verifizieren.
</div>
</div>
)
}
@@ -2,6 +2,7 @@
import React, { useMemo, useState, useRef, useEffect } from 'react'
import { SearchInput, FilterDropdown, Pagination, ExpandableRow, ExternalLinkIcon } from './LibraryTable'
import NormCrossRefPanel from './NormCrossRefPanel'
export interface Norm {
id: string
@@ -128,6 +129,7 @@ export default function NormenTab({ norms }: Props) {
{n.tags.map((t) => <span key={t} className="px-1.5 py-0.5 rounded text-xs bg-purple-100 dark:bg-purple-900/30 text-purple-700 dark:text-purple-300">{t}</span>)}
</div>
)}
<NormCrossRefPanel normId={n.id} />
</div>
}
/>
@@ -46,6 +46,8 @@ func (h *IACEHandler) ListNormsLibrary(c *gin.Context) {
allNorms = append(allNorms, iace.GetWave3dHvacCNorms()...)
allNorms = append(allNorms, iace.GetFinalCNorms()...)
includeCrossRef := c.Query("include_crossref") == "true"
var filtered []iace.NormReference
for _, norm := range allNorms {
if normType != "" && norm.NormType != normType {
@@ -54,6 +56,12 @@ func (h *IACEHandler) ListNormsLibrary(c *gin.Context) {
if hazardCat != "" && !containsString(norm.HazardCats, hazardCat) {
continue
}
if includeCrossRef {
cr := iace.GetNormCrossRef(norm.ID)
if len(cr.Mappings) > 0 {
norm.CrossRef = &cr
}
}
filtered = append(filtered, norm)
}
@@ -61,9 +69,36 @@ func (h *IACEHandler) ListNormsLibrary(c *gin.Context) {
filtered = []iace.NormReference{}
}
covered, total := iace.CrossRefCoverage(len(allNorms))
c.JSON(http.StatusOK, gin.H{
"norms": filtered,
"total": len(filtered),
"crossref_coverage": gin.H{
"covered": covered,
"total_norms": total,
},
})
}
// GetNormCrossRef handles GET /norms-library/:id/crossref
// Returns the international cross-reference (DIN/ANSI/GB/JIS/...) for a single norm.
func (h *IACEHandler) GetNormCrossRef(c *gin.Context) {
normID := c.Param("id")
if normID == "" {
c.JSON(http.StatusBadRequest, gin.H{"error": "norm id required"})
return
}
cr := iace.GetNormCrossRef(normID)
c.JSON(http.StatusOK, cr)
}
// ListNormCrossRefs handles GET /norms-library/crossref
// Returns the entire cross-reference matrix (all populated entries).
func (h *IACEHandler) ListNormCrossRefs(c *gin.Context) {
entries := iace.ListNormCrossRefs()
c.JSON(http.StatusOK, gin.H{
"entries": entries,
"total": len(entries),
})
}
@@ -0,0 +1,110 @@
package handlers
import (
"encoding/json"
"testing"
"github.com/gin-gonic/gin"
)
// Contract tests for the new /norms-library/crossref endpoints.
// These are the practical equivalent of an OpenAPI snapshot: they pin
// the response shape so a downstream consumer (admin-compliance,
// developer-portal, SDK) cannot be silently broken.
func TestGetNormCrossRef_KnownID_ReturnsExpectedShape(t *testing.T) {
handler := &IACEHandler{}
w, c := newTestContext("GET", "/norms-library/ISO-12100/crossref", nil, nil, gin.Params{
{Key: "id", Value: "ISO-12100"},
})
handler.GetNormCrossRef(c)
if w.Code != 200 {
t.Fatalf("expected 200, got %d body=%s", w.Code, w.Body.String())
}
var resp struct {
NormID string `json:"norm_id"`
Mappings []struct {
Region string `json:"region"`
Identifier string `json:"identifier"`
Relation string `json:"relation"`
Confidence string `json:"confidence"`
} `json:"mappings"`
BatchID string `json:"batch_id"`
}
if err := json.Unmarshal(w.Body.Bytes(), &resp); err != nil {
t.Fatalf("response not parsable: %v body=%s", err, w.Body.String())
}
if resp.NormID != "ISO-12100" {
t.Errorf("expected norm_id ISO-12100, got %q", resp.NormID)
}
if len(resp.Mappings) < 3 {
t.Errorf("expected ISO-12100 to have at least 3 mappings, got %d", len(resp.Mappings))
}
}
func TestGetNormCrossRef_MissingID_Returns400(t *testing.T) {
handler := &IACEHandler{}
w, c := newTestContext("GET", "/norms-library//crossref", nil, nil, gin.Params{
{Key: "id", Value: ""},
})
handler.GetNormCrossRef(c)
if w.Code != 400 {
t.Errorf("expected 400 for missing id, got %d", w.Code)
}
}
func TestGetNormCrossRef_UnknownID_ReturnsEmptyMappings(t *testing.T) {
handler := &IACEHandler{}
w, c := newTestContext("GET", "/norms-library/ISO-DOESNOTEXIST/crossref", nil, nil, gin.Params{
{Key: "id", Value: "ISO-DOESNOTEXIST"},
})
handler.GetNormCrossRef(c)
if w.Code != 200 {
t.Fatalf("expected 200 for unknown id (returns empty), got %d", w.Code)
}
var resp struct {
NormID string `json:"norm_id"`
Mappings []interface{} `json:"mappings"`
}
if err := json.Unmarshal(w.Body.Bytes(), &resp); err != nil {
t.Fatalf("response not parsable: %v", err)
}
if resp.NormID != "ISO-DOESNOTEXIST" {
t.Errorf("expected norm_id to echo back, got %q", resp.NormID)
}
if len(resp.Mappings) != 0 {
t.Errorf("expected empty mappings, got %d", len(resp.Mappings))
}
}
func TestListNormCrossRefs_ReturnsAll(t *testing.T) {
handler := &IACEHandler{}
w, c := newTestContext("GET", "/norms-library/crossref", nil, nil, nil)
handler.ListNormCrossRefs(c)
if w.Code != 200 {
t.Fatalf("expected 200, got %d", w.Code)
}
var resp struct {
Entries []struct {
NormID string `json:"norm_id"`
} `json:"entries"`
Total int `json:"total"`
}
if err := json.Unmarshal(w.Body.Bytes(), &resp); err != nil {
t.Fatalf("response not parsable: %v", err)
}
if resp.Total != 671 {
t.Errorf("expected 671 cross-ref entries, got %d", resp.Total)
}
if len(resp.Entries) != resp.Total {
t.Errorf("entries count %d does not match total %d", len(resp.Entries), resp.Total)
}
}
@@ -1,6 +1,7 @@
package handlers
import (
"encoding/json"
"fmt"
"net/http"
"strings"
@@ -412,7 +413,7 @@ func (h *IACEHandler) ExportTechFile(c *gin.Context) {
c.JSON(http.StatusInternalServerError, gin.H{"error": fmt.Sprintf("PDF export failed: %v", err)})
return
}
archiveTechFile(data, fmt.Sprintf("CE-Akte-%s.pdf", safeName), projectID.String())
h.archiveTechFile(c, data, fmt.Sprintf("CE-Akte-%s.pdf", safeName), projectID)
c.Header("Content-Disposition", fmt.Sprintf(`attachment; filename="CE-Akte-%s.pdf"`, safeName))
c.Data(http.StatusOK, "application/pdf", data)
@@ -422,7 +423,7 @@ func (h *IACEHandler) ExportTechFile(c *gin.Context) {
c.JSON(http.StatusInternalServerError, gin.H{"error": fmt.Sprintf("Excel export failed: %v", err)})
return
}
archiveTechFile(data, fmt.Sprintf("CE-Akte-%s.xlsx", safeName), projectID.String())
h.archiveTechFile(c, data, fmt.Sprintf("CE-Akte-%s.xlsx", safeName), projectID)
c.Header("Content-Disposition", fmt.Sprintf(`attachment; filename="CE-Akte-%s.xlsx"`, safeName))
c.Data(http.StatusOK, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", data)
@@ -432,7 +433,7 @@ func (h *IACEHandler) ExportTechFile(c *gin.Context) {
c.JSON(http.StatusInternalServerError, gin.H{"error": fmt.Sprintf("DOCX export failed: %v", err)})
return
}
archiveTechFile(data, fmt.Sprintf("CE-Akte-%s.docx", safeName), projectID.String())
h.archiveTechFile(c, data, fmt.Sprintf("CE-Akte-%s.docx", safeName), projectID)
c.Header("Content-Disposition", fmt.Sprintf(`attachment; filename="CE-Akte-%s.docx"`, safeName))
c.Data(http.StatusOK, "application/vnd.openxmlformats-officedocument.wordprocessingml.document", data)
@@ -442,7 +443,7 @@ func (h *IACEHandler) ExportTechFile(c *gin.Context) {
c.JSON(http.StatusInternalServerError, gin.H{"error": fmt.Sprintf("Markdown export failed: %v", err)})
return
}
archiveTechFile(data, fmt.Sprintf("CE-Akte-%s.md", safeName), projectID.String())
h.archiveTechFile(c, data, fmt.Sprintf("CE-Akte-%s.md", safeName), projectID)
c.Header("Content-Disposition", fmt.Sprintf(`attachment; filename="CE-Akte-%s.md"`, safeName))
c.Data(http.StatusOK, "text/markdown", data)
@@ -468,7 +469,30 @@ func (h *IACEHandler) ExportTechFile(c *gin.Context) {
}
}
// archiveTechFile stores a tech-file export to DSMS (best-effort, non-blocking).
func archiveTechFile(data []byte, filename, projectID string) {
dsms.Archive(data, filename, "ce_techfile", projectID, "1")
// archiveTechFile stores a tech-file export to DSMS (best-effort, non-blocking)
// AND records the resulting CID in the IACE audit trail so the export is
// traceable. The "new_values" JSON carries the CID + filename so the audit
// timeline can later resolve the CID against the DSMS gateway for verify.
func (h *IACEHandler) archiveTechFile(c *gin.Context, data []byte, filename string, projectID uuid.UUID) {
result := dsms.Archive(data, filename, "ce_techfile", projectID.String(), "1")
if result == nil || result.CID == "" {
return
}
payload := map[string]string{
"cid": result.CID,
"filename": filename,
"size": fmt.Sprintf("%d", result.Size),
}
newValues, _ := json.Marshal(payload)
userID := rbac.GetUserID(c)
_ = h.store.AddAuditEntry(
c.Request.Context(),
projectID,
"tech_file_export",
projectID,
iace.AuditActionCreate,
userID.String(),
nil,
newValues,
)
}
@@ -19,6 +19,8 @@ func registerIACERoutes(v1 *gin.RouterGroup, h *handlers.IACEHandler) {
iaceRoutes.GET("/hazard-library", h.ListHazardLibrary)
iaceRoutes.GET("/controls-library", h.ListControlsLibrary)
iaceRoutes.GET("/norms-library", h.ListNormsLibrary)
iaceRoutes.GET("/norms-library/crossref", h.ListNormCrossRefs)
iaceRoutes.GET("/norms-library/:id/crossref", h.GetNormCrossRef)
iaceRoutes.GET("/lifecycle-phases", h.ListLifecyclePhases)
iaceRoutes.GET("/roles", h.ListRoles)
iaceRoutes.GET("/evidence-types", h.ListEvidenceTypes)
@@ -0,0 +1,74 @@
package dsms
import (
"encoding/json"
"io"
"net/http"
"net/http/httptest"
"strings"
"testing"
)
func TestArchive_Success_ReturnsCID(t *testing.T) {
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Method != "POST" || r.URL.Path != "/api/v1/documents" {
http.Error(w, "wrong route", http.StatusNotFound)
return
}
if !strings.HasPrefix(r.Header.Get("Content-Type"), "multipart/form-data") {
http.Error(w, "wrong content-type", http.StatusBadRequest)
return
}
if r.Header.Get("Authorization") == "" {
http.Error(w, "missing auth", http.StatusUnauthorized)
return
}
io.ReadAll(r.Body)
w.Header().Set("Content-Type", "application/json")
_ = json.NewEncoder(w).Encode(ArchiveResult{
CID: "bafytest123",
Size: 42,
GatewayURL: "/ipfs/bafytest123",
})
}))
defer server.Close()
old := gatewayURL
defer func() { gatewayURL = old }()
gatewayURL = server.URL
got := Archive([]byte("hello"), "test.pdf", "ce_techfile", "proj-1", "1")
if got == nil {
t.Fatal("expected non-nil result on 200 OK")
}
if got.CID != "bafytest123" {
t.Errorf("expected CID bafytest123, got %q", got.CID)
}
if got.Size != 42 {
t.Errorf("expected Size 42, got %d", got.Size)
}
}
func TestArchive_GatewayDown_ReturnsNil(t *testing.T) {
old := gatewayURL
defer func() { gatewayURL = old }()
gatewayURL = "http://127.0.0.1:1" // unreachable
got := Archive([]byte("hello"), "test.pdf", "ce_techfile", "proj-1", "1")
if got != nil {
t.Errorf("expected nil when gateway unreachable, got %+v", got)
}
}
func TestArchive_GatewayReturnsError_ReturnsNil(t *testing.T) {
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
http.Error(w, "internal error", http.StatusInternalServerError)
}))
defer server.Close()
old := gatewayURL
defer func() { gatewayURL = old }()
gatewayURL = server.URL
got := Archive([]byte("hello"), "test.pdf", "ce_techfile", "proj-1", "1")
if got != nil {
t.Errorf("expected nil on 500 response, got %+v", got)
}
}
@@ -0,0 +1,68 @@
package iace
// Norm cross-reference matrix: maps a core ISO/IEC/EN standard to the
// jurisdiction-specific identifiers used in DIN (DE), ANSI / NFPA / UL (US),
// GB (China), and JIS (Japan). This is an identifier-only mapping — no
// copyrighted norm text is included. The matrix is used to render a
// "this requirement also satisfies X in market Y" hint in tech files,
// enabling dual-use compliance documents for CE + US/CN/JP export.
//
// IMPORTANT: each NormMapping carries an explicit Confidence and Relation.
// Do NOT treat "partial" or "medium" entries as 1:1 substitutes. They
// indicate scope overlap that must be verified by a competent person for
// the concrete machine before relying on the foreign standard.
// NormMapping is one entry in the cross-reference table.
type NormMapping struct {
Region string `json:"region"` // "EU-DIN", "US-ANSI", "US-NFPA", "US-UL", "US-OSHA", "CN-GB", "JP-JIS", "INTL-ISO"
Identifier string `json:"identifier"` // e.g. "DIN EN ISO 12100:2011"
Relation string `json:"relation"` // "identical", "equivalent", "partial", "supersedes", "superseded_by"
Confidence string `json:"confidence"` // "verified", "high", "medium", "low"
Notes string `json:"notes,omitempty"` // Optional scope clarification (e.g. "only chapters 4-6")
SourceURL string `json:"source_url,omitempty"` // Optional pointer to a public catalog entry
}
// NormCrossRef is the cross-reference entry for one NormReference.ID.
type NormCrossRef struct {
NormID string `json:"norm_id"` // Matches NormReference.ID (e.g. "ISO-12100")
Mappings []NormMapping `json:"mappings"` // International equivalents
Notes string `json:"notes,omitempty"` // General notes about the cross-walk
BatchID string `json:"batch_id"` // Tracking which batch added this entry
}
// crossRefRegistry is the in-memory registry, populated by init() in each batch file.
var crossRefRegistry = map[string]NormCrossRef{}
// registerCrossRefs is called by each batch file's init() to append entries.
func registerCrossRefs(entries []NormCrossRef) {
for _, e := range entries {
crossRefRegistry[e.NormID] = e
}
}
// GetNormCrossRef returns the cross-reference entry for a given NormReference.ID,
// or a zero value with NormID set if no mapping exists yet.
func GetNormCrossRef(normID string) NormCrossRef {
if entry, ok := crossRefRegistry[normID]; ok {
return entry
}
return NormCrossRef{NormID: normID, Mappings: []NormMapping{}}
}
// ListNormCrossRefs returns every entry in the registry. Used by the
// /norms-library/crossref bulk endpoint and for tech-file batch rendering.
func ListNormCrossRefs() []NormCrossRef {
out := make([]NormCrossRef, 0, len(crossRefRegistry))
for _, v := range crossRefRegistry {
out = append(out, v)
}
return out
}
// CrossRefCoverage returns counters that let the UI render a progress bar
// ("X of Y norms have a cross-reference"). The "total" comes from the
// caller (norms library size) since the cross-ref package does not depend
// on the norms library to avoid a cyclic import.
func CrossRefCoverage(totalNorms int) (covered, total int) {
return len(crossRefRegistry), totalNorms
}
@@ -0,0 +1,443 @@
package iace
// Cross-reference matrix — Batch 1a (IDs 1-50 in norms_library.go load order).
// Covers A-norms (Grundnormen) and B1-norms (Sicherheitsgrundnormen) +
// early B2-norms. These are the most internationally harmonized standards
// and therefore have the strongest "verified"/"high" confidence mappings.
func init() {
registerCrossRefs(batch1aCrossRefs())
}
// batch1aCrossRefs contains entries 1-50.
func batch1aCrossRefs() []NormCrossRef {
return []NormCrossRef{
{
NormID: "ISO-12100", BatchID: "1a",
Notes: "Foundational machinery safety standard, harmonized via ISO/TC 199. Globally aligned.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 12100:2011-03", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI B11.0:2020 (Safety of Machinery)", Relation: "partial", Confidence: "high", Notes: "Scope similar; US framework uses task-based risk assessment in addition."},
{Region: "CN-GB", Identifier: "GB/T 15706-2012", Relation: "equivalent", Confidence: "high"},
{Region: "JP-JIS", Identifier: "JIS B 9700:2013", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "ISO-13849-1", BatchID: "1a",
Notes: "Functional safety of safety-related control parts via Performance Level. Strong international alignment.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 13849-1:2024-04", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI B11.26-2018 (Functional Safety for Equipment)", Relation: "partial", Confidence: "high", Notes: "US uses both PL (ISO 13849) and SIL (IEC 62061) within B11.26."},
{Region: "CN-GB", Identifier: "GB/T 16855.1-2018", Relation: "equivalent", Confidence: "high"},
{Region: "JP-JIS", Identifier: "JIS B 9705-1:2019", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "ISO-13849-2", BatchID: "1a",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 13849-2:2013-02", Relation: "identical", Confidence: "verified"},
{Region: "CN-GB", Identifier: "GB/T 16855.2-2015", Relation: "equivalent", Confidence: "high"},
{Region: "JP-JIS", Identifier: "JIS B 9705-2:2019", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "IEC-62061", BatchID: "1a",
Notes: "Functional safety via SIL approach. IEC standard, regional adoptions vary.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN IEC 62061:2022-07", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI B11.26-2018", Relation: "partial", Confidence: "high", Notes: "B11.26 combines IEC 62061 + ISO 13849-1."},
{Region: "CN-GB", Identifier: "GB 28526-2012", Relation: "equivalent", Confidence: "medium"},
{Region: "JP-JIS", Identifier: "JIS B 9961:2008", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "ISO-13857", BatchID: "1a",
Notes: "Safety distances against reaching upper/lower limbs into hazardous zones.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 13857:2020-04", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI B11.19-2019 (Performance Criteria for Safeguarding)", Relation: "partial", Confidence: "high", Notes: "Includes safety distance tables with imperial units."},
{Region: "US-OSHA", Identifier: "29 CFR 1910.212 (Machine Guarding)", Relation: "partial", Confidence: "high"},
{Region: "CN-GB", Identifier: "GB 23821-2009", Relation: "equivalent", Confidence: "high"},
{Region: "JP-JIS", Identifier: "JIS B 9718:2013", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "ISO-13855", BatchID: "1a",
Notes: "Positioning of safeguards relative to approach speed of body parts.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 13855:2010-10", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI B11.19-2019 (Annex on Safety Distance)", Relation: "partial", Confidence: "high", Notes: "US uses Ds = K × (Ts + Tc) formula; imperial."},
{Region: "US-OSHA", Identifier: "29 CFR 1910.217 Table O-10", Relation: "partial", Confidence: "high", Notes: "OSHA hand-speed constant K = 63 in/s."},
{Region: "CN-GB", Identifier: "GB/T 19876-2012", Relation: "equivalent", Confidence: "high"},
{Region: "JP-JIS", Identifier: "JIS B 9715:2013", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "ISO-14120", BatchID: "1a",
Notes: "Design and construction of fixed and movable guards.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 14120:2016-05", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI B11.19-2019 §6 (Guards)", Relation: "partial", Confidence: "high"},
{Region: "CN-GB", Identifier: "GB/T 8196-2018", Relation: "equivalent", Confidence: "high"},
{Region: "JP-JIS", Identifier: "JIS B 9716:2013", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "ISO-14119", BatchID: "1a",
Notes: "Interlocking devices associated with guards — design and selection.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 14119:2014-03", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI B11.19-2019 §7 (Interlocks)", Relation: "partial", Confidence: "high"},
{Region: "CN-GB", Identifier: "GB/T 18831-2017", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "EN-60204-1", BatchID: "1a",
Notes: "Electrical equipment of machines — general requirements.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 60204-1:2019-06 (VDE 0113-1)", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "IEC 60204-1:2016", Relation: "identical", Confidence: "verified"},
{Region: "US-NFPA", Identifier: "NFPA 79:2024 (Electrical Standard for Industrial Machinery)", Relation: "equivalent", Confidence: "high", Notes: "NFPA 79 is the US adaptation; differences in earthing/grounding terminology."},
{Region: "US-UL", Identifier: "UL 508A:2018 (Industrial Control Panels)", Relation: "partial", Confidence: "high", Notes: "Panel-shop side; pairs with NFPA 79."},
{Region: "CN-GB", Identifier: "GB 5226.1-2019", Relation: "equivalent", Confidence: "high"},
{Region: "JP-JIS", Identifier: "JIS B 9960-1:2019", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "ISO-13850", BatchID: "1a",
Notes: "Emergency stop function — design principles.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 13850:2016-05", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI B11.19-2019 §11 (Emergency Stop)", Relation: "partial", Confidence: "high"},
{Region: "US-NFPA", Identifier: "NFPA 79:2024 §10.7 (Emergency Stop)", Relation: "partial", Confidence: "high"},
{Region: "CN-GB", Identifier: "GB 16754-2008", Relation: "equivalent", Confidence: "high"},
{Region: "JP-JIS", Identifier: "JIS B 9703:2019", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "IEC-61496-1", BatchID: "1a",
Notes: "Electro-sensitive protective equipment (ESPE) — general requirements.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN IEC 61496-1:2021-04", Relation: "identical", Confidence: "verified"},
{Region: "US-UL", Identifier: "UL 61496-1:2020", Relation: "equivalent", Confidence: "high"},
{Region: "US-ANSI", Identifier: "ANSI B11.19-2019 §8 (Presence-Sensing Devices)", Relation: "partial", Confidence: "high"},
{Region: "CN-GB", Identifier: "GB/T 19436.1-2013", Relation: "equivalent", Confidence: "high"},
{Region: "JP-JIS", Identifier: "JIS B 9704-1:2014", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "ISO-4413", BatchID: "1a",
Notes: "Hydraulic fluid power — general rules and safety requirements for systems.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 4413:2011-04", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/(NFPA) T2.24.1:2009 (Hydraulic Fluid Power)", Relation: "partial", Confidence: "medium"},
{Region: "CN-GB", Identifier: "GB/T 3766-2015", Relation: "equivalent", Confidence: "high"},
{Region: "JP-JIS", Identifier: "JIS B 8361:2012", Relation: "equivalent", Confidence: "medium"},
},
},
{
NormID: "ISO-4414", BatchID: "1a",
Notes: "Pneumatic fluid power — general rules and safety requirements for systems.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 4414:2011-04", Relation: "identical", Confidence: "verified"},
{Region: "CN-GB", Identifier: "GB/T 7932-2017", Relation: "equivalent", Confidence: "high"},
{Region: "JP-JIS", Identifier: "JIS B 8370:2011", Relation: "equivalent", Confidence: "medium"},
},
},
{
NormID: "EN-1037", BatchID: "1a",
Notes: "Prevention of unexpected start-up. Now superseded by ISO 14118; legacy reference.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1037:1996+A1:2008 (withdrawn 2020, replaced by EN ISO 14118)", Relation: "superseded_by", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 14118:2017", Relation: "supersedes", Confidence: "verified"},
{Region: "US-OSHA", Identifier: "29 CFR 1910.147 (LOTO — Lockout/Tagout)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "ISO-11228-1", BatchID: "1a",
Notes: "Ergonomics — manual lifting and carrying.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1005-2:2009-04 / DIN EN ISO 11228-1:2022", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/ASSP Z365 (Manual Material Handling, draft)", Relation: "partial", Confidence: "medium"},
{Region: "US-OSHA", Identifier: "NIOSH Lifting Equation (RWL, Revised 1991)", Relation: "partial", Confidence: "high"},
{Region: "JP-JIS", Identifier: "JIS Z 8504:2010", Relation: "equivalent", Confidence: "medium"},
},
},
{
NormID: "ISO-11204", BatchID: "1a",
Notes: "Acoustics — noise emitted by machinery and equipment, work-station measurement.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 11204:2010-10", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI S12.43-1997 (R2007)", Relation: "partial", Confidence: "medium"},
{Region: "CN-GB", Identifier: "GB/T 17248.2-1998", Relation: "equivalent", Confidence: "medium"},
{Region: "JP-JIS", Identifier: "JIS Z 8736-2:2014", Relation: "equivalent", Confidence: "medium"},
},
},
{
NormID: "ISO-13732-1", BatchID: "1a",
Notes: "Ergonomics of the thermal environment — touchable hot surfaces.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 13732-1:2008-12", Relation: "identical", Confidence: "verified"},
{Region: "US-ASTM", Identifier: "ASTM C1055-20 (Hot-Surface Conditions)", Relation: "partial", Confidence: "medium"},
{Region: "JP-JIS", Identifier: "JIS S 0033:2006", Relation: "equivalent", Confidence: "medium"},
},
},
{
NormID: "ISO-14122-1", BatchID: "1a",
Notes: "Permanent means of access to machinery — choice of fixed means + general requirements.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 14122-1:2016-10", Relation: "identical", Confidence: "verified"},
{Region: "US-OSHA", Identifier: "29 CFR 1910 Subpart D (Walking-Working Surfaces)", Relation: "partial", Confidence: "high"},
{Region: "US-ANSI", Identifier: "ANSI A1264.1-2017 (Walking/Working Surfaces)", Relation: "partial", Confidence: "high"},
{Region: "CN-GB", Identifier: "GB 17888.1-2008", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "ISO-14122-2", BatchID: "1a",
Notes: "Working platforms and walkways.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 14122-2:2016-10", Relation: "identical", Confidence: "verified"},
{Region: "US-OSHA", Identifier: "29 CFR 1910.28 (Duty to provide fall protection)", Relation: "partial", Confidence: "high"},
{Region: "CN-GB", Identifier: "GB 17888.2-2008", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "ISO-14122-3", BatchID: "1a",
Notes: "Stairs, stepladders, and guard-rails.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 14122-3:2016-10", Relation: "identical", Confidence: "verified"},
{Region: "US-OSHA", Identifier: "29 CFR 1910.25 (Stairways)", Relation: "partial", Confidence: "high"},
{Region: "CN-GB", Identifier: "GB 17888.3-2008", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "ISO-19353", BatchID: "1a",
Notes: "Fire prevention and fire protection for machinery.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 19353:2019-09", Relation: "identical", Confidence: "verified"},
{Region: "US-NFPA", Identifier: "NFPA 654 (Combustible Particulate Solids)", Relation: "partial", Confidence: "medium"},
},
},
{
NormID: "EN-842", BatchID: "1a",
Notes: "Visual danger signals — safety of machinery.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 842:2009-01", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI Z535.4 (Product Safety Signs and Labels)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "ISO-7731", BatchID: "1a",
Notes: "Danger signals for public and work areas — auditory.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 7731:2008-12", Relation: "identical", Confidence: "verified"},
{Region: "JP-JIS", Identifier: "JIS Z 8735:2000", Relation: "equivalent", Confidence: "medium"},
},
},
{
NormID: "EN-894-1", BatchID: "1a",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 894-1:2009-02 (Ergonomic design of displays/control actuators)", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 9355-1:1999 (Ergonomics — Displays and control actuators)", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "EN-894-2", BatchID: "1a",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 894-2:2009-02 (Displays)", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 9355-2:1999", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "EN-894-3", BatchID: "1a",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 894-3:2010-01 (Control actuators)", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 9355-3:2006", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "IEC-60529", BatchID: "1a",
Notes: "IP code — Degrees of protection provided by enclosures.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 60529:2014-09 (VDE 0470-1)", Relation: "identical", Confidence: "verified"},
{Region: "US-NEMA", Identifier: "NEMA 250 (Enclosures for Electrical Equipment)", Relation: "partial", Confidence: "high", Notes: "Cross-walk to IP exists but NEMA includes corrosion and ice."},
{Region: "US-UL", Identifier: "UL 50E:2020", Relation: "partial", Confidence: "high"},
{Region: "CN-GB", Identifier: "GB/T 4208-2017", Relation: "equivalent", Confidence: "verified"},
{Region: "JP-JIS", Identifier: "JIS C 0920:2003", Relation: "equivalent", Confidence: "verified"},
},
},
{
NormID: "ISO-11688-1", BatchID: "1a",
Notes: "Acoustics — design of low-noise machinery, planning.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 11688-1:2009-12", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "ISO-15534-1", BatchID: "1a",
Notes: "Ergonomic design for safety of machinery — body dimensions through openings.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 15534-1:2000-09", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "ISO-11553-1", BatchID: "1a",
Notes: "Safety of laser processing machines — general requirements.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 11553-1:2020-08", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI Z136.1-2022 (Safe Use of Lasers)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-13478", BatchID: "1a",
Notes: "Fire prevention and protection — general requirements.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13478:2011-12", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "ISO-20607", BatchID: "1a",
Notes: "Safety of machinery — instruction handbook (drafting principles).",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 20607:2019-12", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI Z535.6-2011 (R2017) (Product Safety Information in Manuals)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-61439-1", BatchID: "1a",
Notes: "Low-voltage switchgear and controlgear assemblies — general rules.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 61439-1:2012-06 (VDE 0660-600-1)", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "IEC 61439-1:2020", Relation: "equivalent", Confidence: "verified"},
{Region: "US-UL", Identifier: "UL 891 (Switchboards)", Relation: "partial", Confidence: "medium"},
},
},
{
NormID: "EN-62311", BatchID: "1a",
Notes: "Assessment of human exposure to electromagnetic fields.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 62311:2008-11", Relation: "identical", Confidence: "verified"},
{Region: "US-FCC", Identifier: "FCC OET-65 / 47 CFR 1.1310", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "IEC-61508-1", BatchID: "1a",
Notes: "Functional safety of E/E/PE safety-related systems — general requirements.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 61508-1:2011-02 (VDE 0803-1)", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/ISA-61508-1:2010", Relation: "identical", Confidence: "verified"},
{Region: "CN-GB", Identifier: "GB/T 20438.1-2017", Relation: "equivalent", Confidence: "high"},
{Region: "JP-JIS", Identifier: "JIS C 0508-1:2012", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "IEC-61508-2", BatchID: "1a",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 61508-2:2011-02 (VDE 0803-2)", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/ISA-61508-2:2010", Relation: "identical", Confidence: "verified"},
{Region: "CN-GB", Identifier: "GB/T 20438.2-2017", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "IEC-61508-3", BatchID: "1a",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 61508-3:2011-02 (VDE 0803-3)", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/ISA-61508-3:2010", Relation: "identical", Confidence: "verified"},
{Region: "CN-GB", Identifier: "GB/T 20438.3-2017", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "ISO-5349-1", BatchID: "1a",
Notes: "Mechanical vibration — measurement of hand-transmitted vibration.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 5349-1:2001-12", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI S2.70-2006 (R2020) (Hand-Arm Vibration)", Relation: "equivalent", Confidence: "high"},
{Region: "JP-JIS", Identifier: "JIS B 7761-1:2017", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "ISO-2631-1", BatchID: "1a",
Notes: "Mechanical vibration — whole-body vibration.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 2631-1:2010-05", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI S3.18-2002 (R2017) (Whole-Body Vibration)", Relation: "equivalent", Confidence: "high"},
{Region: "JP-JIS", Identifier: "JIS B 7760-2:2004", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "ISO-3744", BatchID: "1a",
Notes: "Determination of sound power levels — engineering method, essentially-free field.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 3744:2011-02", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI S12.54-2011 (R2021)", Relation: "equivalent", Confidence: "high"},
{Region: "JP-JIS", Identifier: "JIS Z 8734:2000", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "ISO-3746", BatchID: "1a",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 3746:2011-03", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI S12.56-2011", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "ISO-11689", BatchID: "1a",
Notes: "Acoustics — procedure for comparing noise-emission data for machinery.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 11689:1997-01", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "ISO-11228-2", BatchID: "1a",
Notes: "Ergonomics — pushing and pulling.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1005-3:2009 / DIN EN ISO 11228-2:2007", Relation: "identical", Confidence: "verified"},
{Region: "US-OSHA", Identifier: "Snook & Ciriello Push-Pull Tables (Liberty Mutual)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "ISO-11228-3", BatchID: "1a",
Notes: "Ergonomics — handling of low loads at high frequency.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1005-5:2007 / DIN EN ISO 11228-3:2007", Relation: "identical", Confidence: "verified"},
{Region: "US-OSHA", Identifier: "ACGIH TLV for HAL (Hand Activity Level)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-1005-1", BatchID: "1a",
Notes: "Human physical performance — terms and definitions. Now harmonized into ISO 11228 family.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1005-1:2009-01", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 11228 family", Relation: "supersedes", Confidence: "high"},
},
},
{
NormID: "EN-1005-2", BatchID: "1a",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1005-2:2009-04 (Manual handling)", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 11228-1:2021", Relation: "supersedes", Confidence: "high"},
},
},
{
NormID: "EN-1005-3", BatchID: "1a",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1005-3:2009-01 (Recommended force limits)", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 11228-2:2007", Relation: "supersedes", Confidence: "high"},
},
},
{
NormID: "EN-1005-4", BatchID: "1a",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1005-4:2009-01 (Working postures)", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 11226:2000", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "ISO-13732-3", BatchID: "1a",
Notes: "Ergonomics of the thermal environment — cold surfaces.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 13732-3:2008-12", Relation: "identical", Confidence: "verified"},
},
},
}
}
@@ -0,0 +1,452 @@
package iace
// Cross-reference matrix — Batch 1b (IDs 51-100 in norms_library.go load order).
// Covers remaining B2-norms (ATEX, EMC, ergonomics, cybersecurity) and the
// first wave of C-norms (presses, robots, conveyors, plastics machinery).
// C-norm international equivalents are less harmonized than A/B norms;
// confidence levels reflect this.
func init() {
registerCrossRefs(batch1bCrossRefs())
}
// batch1bCrossRefs contains entries 51-100.
func batch1bCrossRefs() []NormCrossRef {
return []NormCrossRef{
{
NormID: "EN-1127-1", BatchID: "1b",
Notes: "Explosive atmospheres — explosion prevention and protection (ATEX).",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1127-1:2019-10", Relation: "identical", Confidence: "verified"},
{Region: "US-NFPA", Identifier: "NFPA 69:2024 (Explosion Prevention Systems)", Relation: "partial", Confidence: "high"},
{Region: "US-NFPA", Identifier: "NFPA 654 (Combustible Dust)", Relation: "partial", Confidence: "high"},
{Region: "US-OSHA", Identifier: "29 CFR 1910.307 (Hazardous (classified) locations)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-13463-1", BatchID: "1b",
Notes: "Non-electrical equipment for explosive atmospheres. Largely superseded by EN ISO 80079-36/-37.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13463-1:2009-07 (withdrawn 2018)", Relation: "superseded_by", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 80079-36:2016 / ISO 80079-37:2016", Relation: "supersedes", Confidence: "verified"},
},
},
{
NormID: "ISO-4021", BatchID: "1b",
Notes: "Hydraulic fluid power — extraction of fluid samples for contamination analysis.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN ISO 4021:2017-09", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-982", BatchID: "1b",
Notes: "Hydraulic safety — withdrawn, replaced by EN ISO 4413.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 982:1996+A1:2008 (withdrawn 2010)", Relation: "superseded_by", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 4413:2010", Relation: "supersedes", Confidence: "verified"},
},
},
{
NormID: "EN-983", BatchID: "1b",
Notes: "Pneumatic safety — withdrawn, replaced by EN ISO 4414.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 983:1996+A1:2008 (withdrawn 2010)", Relation: "superseded_by", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 4414:2010", Relation: "supersedes", Confidence: "verified"},
},
},
{
NormID: "ISO-14118", BatchID: "1b",
Notes: "Prevention of unexpected start-up (formerly EN 1037).",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 14118:2018-06", Relation: "identical", Confidence: "verified"},
{Region: "US-OSHA", Identifier: "29 CFR 1910.147 (LOTO)", Relation: "partial", Confidence: "high"},
{Region: "US-ANSI", Identifier: "ANSI/ASSP Z244.1-2016 (Lockout/Tagout)", Relation: "equivalent", Confidence: "high"},
{Region: "CN-GB", Identifier: "GB/T 19670-2005", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "EN-574", BatchID: "1b",
Notes: "Two-hand control devices — functional aspects and design principles.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 13851:2019-12 (replaces EN 574)", Relation: "superseded_by", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 13851:2019", Relation: "supersedes", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI B11.19-2019 §10 (Two-Hand Control)", Relation: "partial", Confidence: "high"},
{Region: "US-OSHA", Identifier: "29 CFR 1910.217(c)(3)(iii)(c) (Press Two-Hand Trip)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "IEC-62443-4-2", BatchID: "1b",
Notes: "Industrial Automation and Control Systems (IACS) cybersecurity — component requirements.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN IEC 62443-4-2:2020-08", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/ISA-62443-4-2-2018", Relation: "identical", Confidence: "verified"},
{Region: "CN-GB", Identifier: "GB/T 33009.1-2016 (IACS Cybersecurity)", Relation: "partial", Confidence: "medium"},
},
},
{
NormID: "IEC-62443-3-3", BatchID: "1b",
Notes: "IACS cybersecurity — system security requirements and security levels.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN IEC 62443-3-3:2020-08", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/ISA-62443-3-3-2013", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-12198-1", BatchID: "1b",
Notes: "Safety of machinery — assessment and reduction of risks arising from radiation.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12198-1:2009-07", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-626-1", BatchID: "1b",
Notes: "Reduction of risk to health from hazardous substances emitted by machinery — Part 1: principles.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 626-1:2008-09", Relation: "identical", Confidence: "verified"},
{Region: "US-OSHA", Identifier: "29 CFR 1910.1000 (Air Contaminants PELs)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-626-2", BatchID: "1b",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 626-2:2008-09 (Verification procedure)", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-61000-6-1", BatchID: "1b",
Notes: "EMC — Generic immunity for residential, commercial, light-industry environments.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 61000-6-1:2019-11 (VDE 0839-6-1)", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "IEC 61000-6-1:2016", Relation: "identical", Confidence: "verified"},
{Region: "US-FCC", Identifier: "47 CFR Part 15 Subpart B", Relation: "partial", Confidence: "high"},
{Region: "CN-GB", Identifier: "GB/T 17799.1-2017", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "EN-61000-6-2", BatchID: "1b",
Notes: "EMC — Generic immunity for industrial environments.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 61000-6-2:2019-11 (VDE 0839-6-2)", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "IEC 61000-6-2:2016", Relation: "identical", Confidence: "verified"},
{Region: "CN-GB", Identifier: "GB/T 17799.2-2003", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "EN-61000-6-3", BatchID: "1b",
Notes: "EMC — Generic emission for residential/commercial environments.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 61000-6-3:2022-04 (VDE 0839-6-3)", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "IEC 61000-6-3:2020", Relation: "identical", Confidence: "verified"},
{Region: "US-FCC", Identifier: "47 CFR Part 15 Subpart B", Relation: "partial", Confidence: "high"},
{Region: "CN-GB", Identifier: "GB 17799.3-2012", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "EN-61000-6-4", BatchID: "1b",
Notes: "EMC — Generic emission for industrial environments.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 61000-6-4:2020-09 (VDE 0839-6-4)", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "IEC 61000-6-4:2018", Relation: "identical", Confidence: "verified"},
{Region: "CN-GB", Identifier: "GB 17799.4-2012", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "EN-62353", BatchID: "1b",
Notes: "Medical electrical equipment — recurrent test and test after repair.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 62353:2015-10 (VDE 0751-1)", Relation: "identical", Confidence: "verified"},
{Region: "US-NFPA", Identifier: "NFPA 99:2024 §10 (Medical Equipment)", Relation: "partial", Confidence: "medium"},
},
},
{
NormID: "EN-50110-1", BatchID: "1b",
Notes: "Operation of electrical installations — general requirements.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 50110-1:2014-02 (VDE 0105-100)", Relation: "identical", Confidence: "verified"},
{Region: "US-NFPA", Identifier: "NFPA 70E:2024 (Electrical Safety in the Workplace)", Relation: "partial", Confidence: "high"},
{Region: "US-OSHA", Identifier: "29 CFR 1910 Subpart S (Electrical)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-60079-0", BatchID: "1b",
Notes: "Explosive atmospheres (ATEX) — equipment, general requirements.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN IEC 60079-0:2019-09 (VDE 0170-1)", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "IEC 60079-0:2017", Relation: "identical", Confidence: "verified"},
{Region: "US-UL", Identifier: "UL 60079-0:2020", Relation: "equivalent", Confidence: "high"},
{Region: "US-FM", Identifier: "FM 3600 (HazLoc Equipment General Requirements)", Relation: "partial", Confidence: "high"},
{Region: "CN-GB", Identifier: "GB 3836.1-2021", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "EN-60079-1", BatchID: "1b",
Notes: "Equipment protection by flameproof enclosures 'd'.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 60079-1:2014-06 (VDE 0170-5)", Relation: "identical", Confidence: "verified"},
{Region: "US-UL", Identifier: "UL 60079-1:2020", Relation: "equivalent", Confidence: "high"},
{Region: "CN-GB", Identifier: "GB 3836.2-2021", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "EN-60079-7", BatchID: "1b",
Notes: "Equipment protection by increased safety 'e'.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 60079-7:2016-04 (VDE 0170-6)", Relation: "identical", Confidence: "verified"},
{Region: "US-UL", Identifier: "UL 60079-7:2017", Relation: "equivalent", Confidence: "high"},
{Region: "CN-GB", Identifier: "GB 3836.3-2021", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "EN-60079-11", BatchID: "1b",
Notes: "Equipment protection by intrinsic safety 'i'.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 60079-11:2012-06 (VDE 0170-7)", Relation: "identical", Confidence: "verified"},
{Region: "US-UL", Identifier: "UL 60079-11:2014", Relation: "equivalent", Confidence: "high"},
{Region: "CN-GB", Identifier: "GB 3836.4-2021", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "EN-60079-14", BatchID: "1b",
Notes: "Electrical installations design, selection, and erection in hazardous areas.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 60079-14:2014-10 (VDE 0165-1)", Relation: "identical", Confidence: "verified"},
{Region: "US-NFPA", Identifier: "NFPA 70 (NEC) Articles 500-506 (Hazardous Locations)", Relation: "partial", Confidence: "high"},
{Region: "CN-GB", Identifier: "GB/T 3836.15-2017", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "EN-60079-17", BatchID: "1b",
Notes: "Inspection and maintenance of EX installations.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 60079-17:2014-10 (VDE 0165-10-1)", Relation: "identical", Confidence: "verified"},
{Region: "CN-GB", Identifier: "GB/T 3836.16-2017", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "ISO-7000", BatchID: "1b",
Notes: "Graphical symbols for use on equipment — registered symbols.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 80416 / DIN ISO 7000", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI Z535.3 (Criteria for Safety Symbols)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "ISO-7010", BatchID: "1b",
Notes: "Graphical symbols — safety colours and signs, registered safety signs.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 7010:2020-07", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI Z535.2 (Environmental and Facility Safety Signs)", Relation: "partial", Confidence: "high", Notes: "US uses different colour/format conventions (signal words)."},
{Region: "US-OSHA", Identifier: "29 CFR 1910.145 (Specifications for accident prevention signs and tags)", Relation: "partial", Confidence: "high"},
{Region: "JP-JIS", Identifier: "JIS Z 9098:2016", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "EN-61310-1", BatchID: "1b",
Notes: "Indication, marking and actuation — Part 1: visual, auditory and tactile signals.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN IEC 61310-1:2017-08 (VDE 0113-101)", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-61310-2", BatchID: "1b",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN IEC 61310-2:2008-09 (Marking)", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-61310-3", BatchID: "1b",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 61310-3:2008-09 (Actuator location/operation)", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "IEC-61511-1", BatchID: "1b",
Notes: "Functional safety — safety instrumented systems for the process industry sector.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 61511-1:2018-12 (VDE 0810-1)", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/ISA-61511-1-2018", Relation: "identical", Confidence: "verified"},
{Region: "CN-GB", Identifier: "GB/T 21109.1-2007", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "IEC-61511-2", BatchID: "1b",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 61511-2:2018-12 (VDE 0810-2)", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/ISA-61511-2-2018", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "IEC-61511-3", BatchID: "1b",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 61511-3:2018-12 (VDE 0810-3)", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/ISA-61511-3-2018", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-692", BatchID: "1b",
Notes: "Machine tools — mechanical presses — safety.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 692:2009-04", Relation: "identical", Confidence: "verified"},
{Region: "US-OSHA", Identifier: "29 CFR 1910.217 (Mechanical Power Presses)", Relation: "partial", Confidence: "high", Notes: "OSHA is the primary US requirement for mechanical presses."},
{Region: "US-ANSI", Identifier: "ANSI B11.1-2009 (R2020) (Mechanical Power Presses)", Relation: "partial", Confidence: "high"},
{Region: "CN-GB", Identifier: "GB 17120-2012", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "EN-693", BatchID: "1b",
Notes: "Machine tools — hydraulic presses — safety.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 693:2019-08", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI B11.2-2013 (R2020) (Hydraulic Power Presses)", Relation: "partial", Confidence: "high"},
{Region: "CN-GB", Identifier: "GB 28241-2012", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "EN-12622", BatchID: "1b",
Notes: "Machine tools — hydraulic press brakes — safety.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12622:2014-04", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI B11.3-2012 (R2017) (Power Press Brakes)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "ISO-10218-1", BatchID: "1b",
Notes: "Industrial robots — safety, robot manipulator. Updated 2025 edition exists.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 10218-1:2012-01", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/RIA R15.06-2012 (Part 1)", Relation: "identical", Confidence: "verified"},
{Region: "CN-GB", Identifier: "GB 11291.1-2011", Relation: "equivalent", Confidence: "high"},
{Region: "JP-JIS", Identifier: "JIS B 8433-1:2015", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "ISO-10218-2", BatchID: "1b",
Notes: "Industrial robots — safety, integration. 2025 edition expands collaborative section.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 10218-2:2012-06", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/RIA R15.06-2012 (Part 2)", Relation: "identical", Confidence: "verified"},
{Region: "CN-GB", Identifier: "GB 11291.2-2013", Relation: "equivalent", Confidence: "high"},
{Region: "JP-JIS", Identifier: "JIS B 8433-2:2015", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "ISO-TS-15066", BatchID: "1b",
Notes: "Collaborative robots — safety requirements (Technical Specification).",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN ISO/TS 15066:2017-04", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/RIA TR R15.606-2016", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-619", BatchID: "1b",
Notes: "Continuous handling equipment — packs and individual loads.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 619:2022-08", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI B20.1-2021 (Conveyor Safety)", Relation: "partial", Confidence: "high"},
{Region: "US-OSHA", Identifier: "29 CFR 1926.555 (Conveyors)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-620", BatchID: "1b",
Notes: "Continuous handling equipment — belt conveyors for bulk materials.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 620:2022-08", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/CEMA B20.1-2021", Relation: "partial", Confidence: "high"},
{Region: "CN-GB", Identifier: "GB/T 10595-2017", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "EN-349", BatchID: "1b",
Notes: "Minimum gaps to avoid crushing parts of the human body.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 13854:2020-04 (replaces EN 349)", Relation: "superseded_by", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 13854:2017", Relation: "supersedes", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI B11.19-2019 §C.1 (Minimum clearance distances)", Relation: "partial", Confidence: "high"},
{Region: "CN-GB", Identifier: "GB 12265.3-1997 (now GB/T 23820-2009)", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "EN-953", BatchID: "1b",
Notes: "Guards — withdrawn, replaced by EN ISO 14120.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 953:2009-08 (withdrawn 2017)", Relation: "superseded_by", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 14120:2015", Relation: "supersedes", Confidence: "verified"},
},
},
{
NormID: "ISO-11161", BatchID: "1b",
Notes: "Safety of machinery — integrated manufacturing systems, basic requirements.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 11161:2010-05", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI B11.20-2017 (Manufacturing Systems)", Relation: "partial", Confidence: "high"},
{Region: "CN-GB", Identifier: "GB/T 19891-2005", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "EN-1010-1", BatchID: "1b",
Notes: "Printing and paper-converting machines — common requirements.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1010-1:2011-03", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI B65.1-2011 (Printing Press Systems)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-12417", BatchID: "1b",
Notes: "Machine tools — machining centres safety.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12417:2009-09", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI B11.22-2002 (R2020) (Numerically Controlled Turning Machines)", Relation: "partial", Confidence: "medium"},
},
},
{
NormID: "IEC-61800-5-2", BatchID: "1b",
Notes: "Adjustable speed electrical power drive systems — functional safety.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 61800-5-2:2018-08 (VDE 0160-105-2)", Relation: "identical", Confidence: "verified"},
{Region: "US-UL", Identifier: "UL 61800-5-1:2020", Relation: "partial", Confidence: "medium", Notes: "UL covers Part 5-1 (general safety); 5-2 functional safety often referenced directly."},
},
},
{
NormID: "EN-201", BatchID: "1b",
Notes: "Plastics and rubber machines — injection moulding machines safety.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 201:2010-03", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI B151.1-2017 (Injection Moulding Machines)", Relation: "partial", Confidence: "high"},
{Region: "CN-GB", Identifier: "GB 22530-2008", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "EN-289", BatchID: "1b",
Notes: "Plastics and rubber machines — compression and transfer moulding machines safety.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 289:2014-09", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI B151.27 (Compression Moulding)", Relation: "partial", Confidence: "medium"},
},
},
{
NormID: "EN-422", BatchID: "1b",
Notes: "Plastics and rubber machines — blow-moulding machines safety.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 422:2009-11", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI B151.15 (Blow Moulding)", Relation: "partial", Confidence: "medium"},
},
},
{
NormID: "EN-1114-1", BatchID: "1b",
Notes: "Plastics and rubber machines — extruders and extrusion lines safety.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1114-1:2011-09", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI B151.21 (Extrusion Blow Moulding)", Relation: "partial", Confidence: "medium"},
},
},
{
NormID: "EN-848-1", BatchID: "1b",
Notes: "Safety of woodworking machines — single-spindle vertical moulding machines.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 848-1:2017-11", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI O1.1-2019 (Woodworking Machinery)", Relation: "partial", Confidence: "high"},
{Region: "US-OSHA", Identifier: "29 CFR 1910.213 (Woodworking machinery)", Relation: "partial", Confidence: "high"},
},
},
}
}
@@ -0,0 +1,424 @@
package iace
// Cross-reference matrix — Batch 2a (IDs 101-150).
// Covers C-norms for woodworking machines, pressure machines, packaging
// machines (EN 415 series), and food-processing machines. Many are
// EU-specific C-norms; international equivalents are partial at best.
func init() {
registerCrossRefs(batch2aCrossRefs())
}
func batch2aCrossRefs() []NormCrossRef {
return []NormCrossRef{
{
NormID: "EN-1870-1", BatchID: "2a",
Notes: "Woodworking machines — circular sawing machines.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1870-1:2014-04", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI O1.1-2019 (Woodworking Machinery)", Relation: "partial", Confidence: "high"},
{Region: "US-OSHA", Identifier: "29 CFR 1910.213 (Woodworking machinery)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-861", BatchID: "2a",
Notes: "Woodworking machines — surface planing/thicknessing combined machines.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 861:2007-12", Relation: "identical", Confidence: "verified"},
{Region: "US-OSHA", Identifier: "29 CFR 1910.213(g) (Planers)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-12840", BatchID: "2a",
Notes: "Woodworking machines — hand-fed and/or hand-removed engraving machines.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12840:2009-05", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-13128", BatchID: "2a",
Notes: "Machine tools — milling machines safety.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13128:2009-09", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI B11.8-2001 (R2017) (Manual Milling, Drilling, Boring)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-13218", BatchID: "2a",
Notes: "Machine tools — stationary grinding machines safety.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13218:2009-09", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI B11.9-2010 (R2020) (Grinding Machines)", Relation: "partial", Confidence: "high"},
{Region: "US-OSHA", Identifier: "29 CFR 1910.215 (Abrasive wheel machinery)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "ISO-16092-1", BatchID: "2a",
Notes: "Machine tools safety — presses, Part 1: general safety requirements.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 16092-1:2018-08", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI B11.0/B11.TR3 (Press family general)", Relation: "partial", Confidence: "medium"},
},
},
{
NormID: "ISO-16092-3", BatchID: "2a",
Notes: "Machine tools safety — presses, Part 3: hydraulic presses safety.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 16092-3:2018-08", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI B11.2-2013 (R2020) (Hydraulic Power Presses)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-415-1", BatchID: "2a",
Notes: "Safety of packaging machines — Part 1: terminology and classification.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 415-1:2014-12", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/PMMI B155.1-2016 (Packaging Machinery)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-415-5", BatchID: "2a",
Notes: "Safety of packaging machines — Part 5: wrapping machines.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 415-5:2010-09", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/PMMI B155.1-2016", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-1672-2", BatchID: "2a",
Notes: "Food processing machinery — hygiene requirements.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1672-2:2009-07", Relation: "identical", Confidence: "verified"},
{Region: "US-NSF", Identifier: "NSF/ANSI/3-A 14159-1 (Hygienic Food Equipment)", Relation: "partial", Confidence: "high"},
{Region: "US-FDA", Identifier: "21 CFR 110 (Current Good Manufacturing Practice)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-617", BatchID: "2a",
Notes: "Continuous handling equipment and systems — safety, storage in silos/bunkers.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 617:2010-12", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-618", BatchID: "2a",
Notes: "Continuous handling equipment — safety, bulk handling equipment except fixed belt conveyors.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 618:2011-02", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI B20.1-2021 (Conveyor Safety)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-474-1", BatchID: "2a",
Notes: "Earth-moving machinery — safety, Part 1: general requirements.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 474-1:2022-12", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/ITSDF B56 series + SAE J1166/J1455", Relation: "partial", Confidence: "medium"},
{Region: "US-OSHA", Identifier: "29 CFR 1926.602 (Material handling equipment)", Relation: "partial", Confidence: "high"},
{Region: "CN-GB", Identifier: "GB 25684 series", Relation: "equivalent", Confidence: "medium"},
},
},
{
NormID: "EN-1726-1", BatchID: "2a",
Notes: "Industrial trucks — safety, Part 1: self-propelled trucks up to 10 000 kg.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1726-1:1999-04 (now ISO 3691-1)", Relation: "superseded_by", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 3691-1:2015 (now harmonized as EN ISO 3691-1)", Relation: "supersedes", Confidence: "verified"},
{Region: "US-OSHA", Identifier: "29 CFR 1910.178 (Powered industrial trucks)", Relation: "partial", Confidence: "high"},
{Region: "US-ANSI", Identifier: "ANSI/ITSDF B56.1-2020 (Low-/High-Lift Trucks)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-15011", BatchID: "2a",
Notes: "Cranes — bridge and gantry cranes.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 15011:2014-09", Relation: "identical", Confidence: "verified"},
{Region: "US-ASME", Identifier: "ASME B30.2-2022 (Overhead and Gantry Cranes)", Relation: "partial", Confidence: "high"},
{Region: "US-OSHA", Identifier: "29 CFR 1910.179 (Overhead and gantry cranes)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-14492-1", BatchID: "2a",
Notes: "Cranes — power-driven winches and hoists. Part 1: winches.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 14492-1:2019-08", Relation: "identical", Confidence: "verified"},
{Region: "US-ASME", Identifier: "ASME B30.7-2016 (Winches)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-60974-1", BatchID: "2a",
Notes: "Arc welding equipment — Part 1: welding power sources.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 60974-1:2019-07 (VDE 0544-1)", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "IEC 60974-1:2017", Relation: "identical", Confidence: "verified"},
{Region: "US-UL", Identifier: "UL 551-2010 (Transformer-type arc-welding machines)", Relation: "partial", Confidence: "medium"},
{Region: "US-ANSI", Identifier: "ANSI Z49.1-2021 (Safety in Welding, Cutting)", Relation: "partial", Confidence: "high"},
{Region: "CN-GB", Identifier: "GB 15579.1-2013", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "EN-1010-2", BatchID: "2a",
Notes: "Printing/paper-converting machines — Part 2: printing/varnishing machines.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1010-2:2011-03", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI B65.1-2011 (Printing Press Systems)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-809", BatchID: "2a",
Notes: "Pumps and pump units for liquids — common safety requirements.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 809:2012-10", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/HI Pump Standards (B73, B74, etc.)", Relation: "partial", Confidence: "medium"},
},
},
{
NormID: "EN-1012-1", BatchID: "2a",
Notes: "Compressors and vacuum pumps — safety, Part 1: compressors.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1012-1:2011-02", Relation: "identical", Confidence: "verified"},
{Region: "US-ASME", Identifier: "ASME B19.1-2017 (Compressor Safety)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-ISO-11111-1", BatchID: "2a",
Notes: "Safety requirements for textile machinery — Part 1: common requirements.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 11111-1:2017-04", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 11111-1:2016", Relation: "identical", Confidence: "verified"},
{Region: "CN-GB", Identifier: "GB/T 36316-2018 (textile machinery safety)", Relation: "partial", Confidence: "medium"},
},
},
{
NormID: "EN-710", BatchID: "2a",
Notes: "Foundry machinery — moulding and core-making machinery.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 710:2005-12", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI Z241.1-2017 (Sand Preparation, Moulding, Coremaking)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-869", BatchID: "2a",
Notes: "Safety requirements for high pressure metal die casting units.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 869:2010-12", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI Z241.2-2017 (Melting and Pouring)", Relation: "partial", Confidence: "medium"},
},
},
{
NormID: "EN-81-20", BatchID: "2a",
Notes: "Safety rules for the construction and installation of lifts — Part 20: passenger lifts.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 81-20:2020-06", Relation: "identical", Confidence: "verified"},
{Region: "US-ASME", Identifier: "ASME A17.1-2022 (Safety Code for Elevators and Escalators)", Relation: "partial", Confidence: "high", Notes: "EU/US lift codes differ significantly in details; consult specialist."},
{Region: "US-ANSI", Identifier: "ANSI A17.1 = ASME A17.1 (joint standard)", Relation: "identical", Confidence: "verified"},
{Region: "CN-GB", Identifier: "GB/T 7588.1-2020", Relation: "equivalent", Confidence: "high"},
{Region: "JP-JIS", Identifier: "JIS A 4302:2006", Relation: "partial", Confidence: "medium"},
},
},
{
NormID: "ISO-4254-1", BatchID: "2a",
Notes: "Agricultural machinery — safety, Part 1: general requirements.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 4254-1:2016-04", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/ASABE S390.5 (Agricultural Machinery Safety)", Relation: "partial", Confidence: "high"},
{Region: "US-OSHA", Identifier: "29 CFR 1928 (Agriculture)", Relation: "partial", Confidence: "high"},
{Region: "CN-GB", Identifier: "GB 10395.1-2009", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "EN-12547", BatchID: "2a",
Notes: "Centrifuges — common safety requirements.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12547:2014-12", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-1539", BatchID: "2a",
Notes: "Dryers and ovens, in which flammable substances are released — safety requirements.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1539:2015-12", Relation: "identical", Confidence: "verified"},
{Region: "US-NFPA", Identifier: "NFPA 86:2023 (Ovens and Furnaces)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-1678", BatchID: "2a",
Notes: "Food processing machinery — vegetable cutting machines.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1678+A1:2010-12", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/NSF 8 (Commercial Powered Food Preparation Equipment)", Relation: "partial", Confidence: "medium"},
},
},
{
NormID: "EN-1612-1", BatchID: "2a",
Notes: "Plastics and rubber machines — reaction moulding machines.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1612-1:2010-03", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-746-1", BatchID: "2a",
Notes: "Industrial thermoprocessing equipment — general safety requirements.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 746-1:2015-04", Relation: "identical", Confidence: "verified"},
{Region: "US-NFPA", Identifier: "NFPA 86:2023 (Ovens and Furnaces)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-746-2", BatchID: "2a",
Notes: "Industrial thermoprocessing — fuel-fired equipment safety.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 746-2:2010-12", Relation: "identical", Confidence: "verified"},
{Region: "US-NFPA", Identifier: "NFPA 86:2023 §6 (Class B Ovens)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-453", BatchID: "2a",
Notes: "Food processing machinery — dough mixers.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 453:2014-12", Relation: "identical", Confidence: "verified"},
{Region: "US-NSF", Identifier: "NSF/ANSI 8 (Powered Food Preparation Equipment)", Relation: "partial", Confidence: "medium"},
},
},
{
NormID: "EN-1010-3", BatchID: "2a",
Notes: "Printing/paper-converting machines — Part 3: cutting machines.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1010-3:2009-11", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-ISO-13851", BatchID: "2a",
Notes: "Two-hand control devices — functional aspects and design (succeeds EN 574).",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 13851:2019-12", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 13851:2019", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI B11.19-2019 §10", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-1672-1", BatchID: "2a",
Notes: "Food processing machinery — Part 1: terminology.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1672-1:2014-12", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-13389", BatchID: "2a",
Notes: "Food processing machinery — mixers with horizontal shafts.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13389:2017-08", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-13886", BatchID: "2a",
Notes: "Food processing machinery — boiling pans with mechanical agitator/mixer.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13886:2017-08", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-12042", BatchID: "2a",
Notes: "Food processing machinery — automatic dough dividers.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12042:2014-12", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-12331", BatchID: "2a",
Notes: "Food processing machinery — mincing machines.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12331:2017-08", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-12855", BatchID: "2a",
Notes: "Food processing machinery — rotary bowl cutters.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12855:2014-12", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-13570", BatchID: "2a",
Notes: "Food processing machinery — mixing machines.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13570:2017-08", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-13591", BatchID: "2a",
Notes: "Food processing machinery — fixed deck oven loaders.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13591:2017-08", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-14655", BatchID: "2a",
Notes: "Food processing machinery — baguette slicers.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 14655:2014-12", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-13954", BatchID: "2a",
Notes: "Food processing machinery — bread slicers.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13954:2014-12", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-12463", BatchID: "2a",
Notes: "Food processing machinery — filling machines and auxiliary equipment.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12463:2014-12", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-12984", BatchID: "2a",
Notes: "Food processing machinery — portable/hand-guided machines with mechanically driven cutting tools.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12984:2010-09", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-415-2", BatchID: "2a",
Notes: "Safety of packaging machines — Part 2: pre-formed rigid container machines.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 415-2:2000-04", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/PMMI B155.1-2016", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-415-3", BatchID: "2a",
Notes: "Safety of packaging machines — Part 3: form, fill, seal machines.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 415-3:2021-09", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/PMMI B155.1-2016", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-415-4", BatchID: "2a",
Notes: "Safety of packaging machines — Part 4: palletisers and depalletisers.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 415-4:1999-04", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/PMMI B155.1-2016", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-415-6", BatchID: "2a",
Notes: "Safety of packaging machines — Part 6: pallet wrapping machines.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 415-6:2013-04", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/PMMI B155.1-2016", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-415-7", BatchID: "2a",
Notes: "Safety of packaging machines — Part 7: group and secondary packaging machines.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 415-7:2010-04", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/PMMI B155.1-2016", Relation: "partial", Confidence: "high"},
},
},
}
}
@@ -0,0 +1,400 @@
package iace
// Cross-reference matrix — Batch 2b (IDs 151-200).
// Covers remainder of packaging machines (EN 415 series), textile machinery
// (EN ISO 11111 family), agricultural machines (ISO 4254 family), earth-
// moving (EN 474), cranes, lifts (EN 81 family), industrial trucks, and
// pressure equipment. Many EU-specific; ANSI/OSHA equivalents are partial.
func init() {
registerCrossRefs(batch2bCrossRefs())
}
func batch2bCrossRefs() []NormCrossRef {
return []NormCrossRef{
{
NormID: "EN-415-8", BatchID: "2b",
Notes: "Safety of packaging machines — Part 8: strapping machines.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 415-8:2008-09", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/PMMI B155.1-2016", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-415-9", BatchID: "2b",
Notes: "Safety of packaging machines — Part 9: noise measurement methods.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 415-9:2010-04", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-415-10", BatchID: "2b",
Notes: "Safety of packaging machines — Part 10: general requirements.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 415-10:2014-12", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/PMMI B155.1-2016", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-ISO-11111-2", BatchID: "2b",
Notes: "Textile machinery — spinning preparatory machines.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 11111-2:2005-09", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 11111-2:2005", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-ISO-11111-3", BatchID: "2b",
Notes: "Textile machinery — nonwoven machinery.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 11111-3:2005-09", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 11111-3:2005", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-ISO-11111-4", BatchID: "2b",
Notes: "Textile machinery — yarn processing.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 11111-4:2005-09", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 11111-4:2005", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-ISO-11111-5", BatchID: "2b",
Notes: "Textile machinery — fabric formation machines.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 11111-5:2005-09", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 11111-5:2005", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-ISO-11111-6", BatchID: "2b",
Notes: "Textile machinery — fabric finishing machines.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 11111-6:2005-09", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 11111-6:2005", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-ISO-11111-7", BatchID: "2b",
Notes: "Textile machinery — dyeing/finishing machines.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 11111-7:2005-09", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 11111-7:2005", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "ISO-4254-5", BatchID: "2b",
Notes: "Agricultural machinery — power-driven soil-working machines.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 4254-5:2018-08", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/ASABE S390.5 (Agricultural Machinery Safety)", Relation: "partial", Confidence: "high"},
{Region: "CN-GB", Identifier: "GB 10395.5-2013", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "ISO-4254-6", BatchID: "2b",
Notes: "Agricultural machinery — sprayers and liquid fertiliser distributors.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 4254-6:2020-12", Relation: "identical", Confidence: "verified"},
{Region: "CN-GB", Identifier: "GB 10395.6-2006", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "ISO-4254-7", BatchID: "2b",
Notes: "Agricultural machinery — combine harvesters, forage and cotton harvesters.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 4254-7:2017-09", Relation: "identical", Confidence: "verified"},
{Region: "CN-GB", Identifier: "GB 10395.7-2006", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "ISO-4254-12", BatchID: "2b",
Notes: "Agricultural machinery — rotary disc mowers, drum mowers, flail mowers.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 4254-12:2017-09", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "ISO-4254-14", BatchID: "2b",
Notes: "Agricultural machinery — wrap-baling machines.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 4254-14:2016-04", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-474-2", BatchID: "2b",
Notes: "Earth-moving machinery — Part 2: tractor dozers.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 474-2:2022-12", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-474-3", BatchID: "2b",
Notes: "Earth-moving machinery — Part 3: loaders.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 474-3:2022-12", Relation: "identical", Confidence: "verified"},
{Region: "US-OSHA", Identifier: "29 CFR 1926.602", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-474-5", BatchID: "2b",
Notes: "Earth-moving machinery — Part 5: hydraulic excavators.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 474-5:2022-12", Relation: "identical", Confidence: "verified"},
{Region: "US-OSHA", Identifier: "29 CFR 1926.602", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-474-6", BatchID: "2b",
Notes: "Earth-moving machinery — Part 6: dumpers.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 474-6:2022-12", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-13000", BatchID: "2b",
Notes: "Cranes — mobile cranes safety requirements.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13000:2018-08", Relation: "identical", Confidence: "verified"},
{Region: "US-ASME", Identifier: "ASME B30.5-2021 (Mobile and Locomotive Cranes)", Relation: "partial", Confidence: "high"},
{Region: "US-OSHA", Identifier: "29 CFR 1926.1400 (Cranes & Derricks in Construction)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-14439", BatchID: "2b",
Notes: "Cranes — tower cranes safety.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 14439:2010-05", Relation: "identical", Confidence: "verified"},
{Region: "US-ASME", Identifier: "ASME B30.3-2019 (Tower Cranes)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-13852-1", BatchID: "2b",
Notes: "Cranes — offshore cranes, general purpose.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13852-1:2014-05", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 19927:2022 (Offshore cranes)", Relation: "partial", Confidence: "medium"},
},
},
{
NormID: "EN-14985", BatchID: "2b",
Notes: "Cranes — slewing jib cranes.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 14985:2012-09", Relation: "identical", Confidence: "verified"},
{Region: "US-ASME", Identifier: "ASME B30.11-2019 (Monorails & Underhung Cranes)", Relation: "partial", Confidence: "medium"},
},
},
{
NormID: "EN-14492-2", BatchID: "2b",
Notes: "Cranes — power-driven hoists.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 14492-2:2019-08", Relation: "identical", Confidence: "verified"},
{Region: "US-ASME", Identifier: "ASME B30.16-2017 (Overhead Hoists)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-81-50", BatchID: "2b",
Notes: "Safety rules for the construction and installation of lifts — Part 50: design rules.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 81-50:2020-06", Relation: "identical", Confidence: "verified"},
{Region: "US-ASME", Identifier: "ASME A17.1-2022", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-81-70", BatchID: "2b",
Notes: "Safety rules for lifts — Part 70: accessibility to lifts for persons including persons with disability.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 81-70:2021-07", Relation: "identical", Confidence: "verified"},
{Region: "US-ICC", Identifier: "ICC A117.1-2017 (Accessible Buildings)", Relation: "partial", Confidence: "high"},
{Region: "US-ADA", Identifier: "ADA Standards for Accessible Design (2010)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-1808", BatchID: "2b",
Notes: "Safety requirements for suspended access equipment.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1808:2015-08", Relation: "identical", Confidence: "verified"},
{Region: "US-OSHA", Identifier: "29 CFR 1926.451 (Scaffolds)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-280", BatchID: "2b",
Notes: "Mobile elevating work platforms — design, calculation, safety.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 280:2022-01", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI A92.20-2018 (Mobile Elevating Work Platforms)", Relation: "partial", Confidence: "high"},
{Region: "US-OSHA", Identifier: "29 CFR 1926.453 (Aerial Lifts)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-1570-1", BatchID: "2b",
Notes: "Lifting tables — Part 1: lifting tables for loads up to and including two levels.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1570-1:2014-12", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI MH29.1-2020 (Lift Tables)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-741", BatchID: "2b",
Notes: "Continuous handling equipment — safety for bulk material pneumatic conveyors.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 741:2010-09", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-528", BatchID: "2b",
Notes: "Rail-dependent storage and retrieval equipment safety.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 528:2021-12", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI MH16.3-2020 (Automated Storage Retrieval Systems)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-1175", BatchID: "2b",
Notes: "Industrial trucks — electrical/electronic requirements.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1175:2020-12", Relation: "identical", Confidence: "verified"},
{Region: "US-UL", Identifier: "UL 583 (Electric Industrial Trucks)", Relation: "partial", Confidence: "medium"},
},
},
{
NormID: "EN-1459", BatchID: "2b",
Notes: "Industrial trucks — self-propelled variable-reach trucks.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1459-1:2017-07", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/ITSDF B56.6-2016 (Rough Terrain Trucks)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-12158-1", BatchID: "2b",
Notes: "Builders hoists for goods — Part 1: hoists with accessible platforms.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12158-1:2021-09", Relation: "identical", Confidence: "verified"},
{Region: "US-ASME", Identifier: "ASME A17.1 §25 (Material Lifts)", Relation: "partial", Confidence: "medium"},
},
},
{
NormID: "EN-1417", BatchID: "2b",
Notes: "Plastics and rubber machines — two-roll mills.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1417:2014-09", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI B151.5 (Two-Roll Rubber Mills)", Relation: "partial", Confidence: "medium"},
},
},
{
NormID: "EN-1114-3", BatchID: "2b",
Notes: "Plastics and rubber machines — extruders/extrusion lines, Part 3: pelletizers.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1114-3:2002-08", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-12013", BatchID: "2b",
Notes: "Plastics and rubber machines — internal mixers.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12013:2018-12", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-12409", BatchID: "2b",
Notes: "Plastics and rubber machines — thermoforming machines.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12409:2014-04", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI B151.39 (Thermoforming Machines)", Relation: "partial", Confidence: "medium"},
},
},
{
NormID: "EN-13418", BatchID: "2b",
Notes: "Plastics and rubber machines — winding machines for film/sheet.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13418:2013-08", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-12301", BatchID: "2b",
Notes: "Plastics and rubber machines — calenders.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12301:2014-04", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-ISO-11611", BatchID: "2b",
Notes: "Protective clothing for use in welding and allied processes.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 11611:2016-07", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/ISEA 105 (Hand Protection) + NFPA 70E", Relation: "partial", Confidence: "medium"},
},
},
{
NormID: "EN-50504", BatchID: "2b",
Notes: "Validation of arc welding equipment.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 50504:2009-04 (VDE 0544-200)", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-1012-2", BatchID: "2b",
Notes: "Compressors and vacuum pumps — safety, Part 2: vacuum pumps.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1012-2:2011-02", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-13445-1", BatchID: "2b",
Notes: "Unfired pressure vessels — Part 1: general.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13445-1:2021-12", Relation: "identical", Confidence: "verified"},
{Region: "US-ASME", Identifier: "ASME BPVC Section VIII (Pressure Vessels)", Relation: "partial", Confidence: "high", Notes: "Substantive technical differences in calculation method (DBA vs DBF)."},
{Region: "CN-GB", Identifier: "GB 150 series (Pressure Vessels)", Relation: "equivalent", Confidence: "high"},
{Region: "JP-JIS", Identifier: "JIS B 8265:2017", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "EN-14359", BatchID: "2b",
Notes: "Gas-loaded accumulators for fluid power applications.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 14359:2017-08", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-12453", BatchID: "2b",
Notes: "Industrial, commercial and garage doors and gates — safety in use of power-operated doors.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12453:2022-12", Relation: "identical", Confidence: "verified"},
{Region: "US-UL", Identifier: "UL 325-2017 (Doors, Drapery, Gates, Louvers, and Windows)", Relation: "partial", Confidence: "high"},
{Region: "US-ASTM", Identifier: "ASTM F2200-22 (Standard Specification for Automated Vehicular Gate Construction)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-12978", BatchID: "2b",
Notes: "Safety devices for power-operated doors and gates.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12978+A1:2010-04", Relation: "identical", Confidence: "verified"},
{Region: "US-UL", Identifier: "UL 325-2017", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-12545", BatchID: "2b",
Notes: "Footwear manufacturing machinery — common safety requirements.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12545:2000-08", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-1034-1", BatchID: "2b",
Notes: "Safety requirements for paper-making and paper-finishing machines — Part 1: common requirements.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1034-1:2021-08", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI B65.1-2011", Relation: "partial", Confidence: "medium"},
},
},
{
NormID: "EN-1034-3", BatchID: "2b",
Notes: "Safety requirements for paper-making — Part 3: winders and slitter-winders.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1034-3:2012-10", Relation: "identical", Confidence: "verified"},
},
},
}
}
@@ -0,0 +1,410 @@
package iace
// Cross-reference matrix — Batch 3a (IDs 201-250).
// Covers machining (woodworking EN ISO 19085, machine tools EN ISO 23125,
// abrasives, hand-held power tools EN ISO 11148), conveyors + automation
// (industrial trucks EN ISO 3691 family, escalators EN 115), and some
// service-lift specials (EN 81-31/41/43).
func init() {
registerCrossRefs(batch3aCrossRefs())
}
func batch3aCrossRefs() []NormCrossRef {
return []NormCrossRef{
{
NormID: "EN-1034-4", BatchID: "3a",
Notes: "Paper-making machines — Part 4: pulpers and their loading equipment.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1034-4:2021-08", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-12413", BatchID: "3a",
Notes: "Safety requirements for bonded abrasive products.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12413:2019-08", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI B7.1-2017 (Safety Requirements for Abrasive Wheels)", Relation: "partial", Confidence: "high"},
{Region: "US-OSHA", Identifier: "29 CFR 1910.215", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-13236", BatchID: "3a",
Notes: "Safety requirements for superabrasive products.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13236:2019-08", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI B7.1-2017", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-ISO-28881", BatchID: "3a",
Notes: "Machine tools safety — electro-discharge machines.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 28881:2022-08", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 28881:2022", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-ISO-11553-2", BatchID: "3a",
Notes: "Safety of laser processing machines — Part 2: hand-held laser processing devices.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 11553-2:2019-09", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI Z136.1-2022 (Lasers)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-ISO-11553-3", BatchID: "3a",
Notes: "Safety of laser processing machines — Part 3: noise reduction.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 11553-3:2013-07", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-ISO-16092-2", BatchID: "3a",
Notes: "Machine tools — presses, Part 2: mechanical presses safety.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 16092-2:2020-12", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI B11.1-2009 (R2020) (Mechanical Power Presses)", Relation: "partial", Confidence: "high"},
{Region: "US-OSHA", Identifier: "29 CFR 1910.217", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-ISO-16092-4", BatchID: "3a",
Notes: "Machine tools — presses, Part 4: pneumatic presses safety.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 16092-4:2020-12", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-13736", BatchID: "3a",
Notes: "Machine tools safety — pneumatic presses.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13736:2018-12", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-1550", BatchID: "3a",
Notes: "Machine tools safety — chucks for workholding.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1550+A1:2008-08", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI B11.6 (Lathes) clauses on workholding", Relation: "partial", Confidence: "medium"},
},
},
{
NormID: "EN-ISO-23125", BatchID: "3a",
Notes: "Machine tools — turning machines safety.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 23125:2015-09", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI B11.6-2001 (R2020) (Lathes)", Relation: "partial", Confidence: "high"},
{Region: "US-ANSI", Identifier: "ANSI B11.22-2002 (NC Turning Machines)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-1807-1", BatchID: "3a",
Notes: "Safety of woodworking machines — band saws, Part 1: table band saws.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1807-1:2013-12", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI O1.1-2019", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-1807-2", BatchID: "3a",
Notes: "Safety of woodworking machines — band saws, Part 2: log sawing.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1807-2:2013-12", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-12921-1", BatchID: "3a",
Notes: "Machines for surface cleaning/pre-treatment with liquids — Part 1: common safety.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12921-1:2009-04", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-12921-2", BatchID: "3a",
Notes: "Surface cleaning machines — Part 2: safety for machines using water-based liquids.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12921-2:2008-12", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-12921-3", BatchID: "3a",
Notes: "Surface cleaning machines — Part 3: safety for machines using flammable liquids.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12921-3:2017-04", Relation: "identical", Confidence: "verified"},
{Region: "US-NFPA", Identifier: "NFPA 30 (Flammable and Combustible Liquids)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-12753", BatchID: "3a",
Notes: "Thermal cleaning systems for components contaminated with organic substances.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12753:2018-12", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-12215", BatchID: "3a",
Notes: "Coating plants — spray booths for application of organic liquid coating materials.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12215:2018-12", Relation: "identical", Confidence: "verified"},
{Region: "US-NFPA", Identifier: "NFPA 33 (Spray Application Using Flammable or Combustible Materials)", Relation: "partial", Confidence: "high"},
{Region: "US-OSHA", Identifier: "29 CFR 1910.94(c) (Spray finishing operations)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-13355", BatchID: "3a",
Notes: "Coating plants — combined booths.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13355:2017-04", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-1953", BatchID: "3a",
Notes: "Atomising and spraying equipment for coating materials.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1953:2014-04", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-746-3", BatchID: "3a",
Notes: "Industrial thermoprocessing — safety for atmosphere systems.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 746-3:2010-04", Relation: "identical", Confidence: "verified"},
{Region: "US-NFPA", Identifier: "NFPA 86:2023 §11 (Special Atmosphere Furnaces)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-12464-1", BatchID: "3a",
Notes: "Light and lighting — indoor work places.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12464-1:2021-11", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/IES RP-7 (Industrial Lighting)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-ISO-11148-1", BatchID: "3a",
Notes: "Hand-held non-electric power tools — Part 1: assembly tools for threaded fasteners.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 11148-1:2011-11", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 11148-1:2011", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-ISO-11148-3", BatchID: "3a",
Notes: "Hand-held non-electric power tools — drills/tapping machines.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 11148-3:2012-12", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 11148-3:2012", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-ISO-11148-6", BatchID: "3a",
Notes: "Hand-held non-electric power tools — assembly power tools for threaded fasteners.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 11148-6:2012-12", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 11148-6:2012", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-ISO-11148-10", BatchID: "3a",
Notes: "Hand-held non-electric power tools — Part 10: portable abrasive tools.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 11148-10:2017-09", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 11148-10:2017", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-ISO-52941", BatchID: "3a",
Notes: "Additive manufacturing — performance of buildup equipment.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 52941:2021-04", Relation: "identical", Confidence: "verified"},
{Region: "US-ASTM", Identifier: "ASTM F3303-23 (Additive Manufacturing — Process Characteristics)", Relation: "partial", Confidence: "medium"},
},
},
{
NormID: "EN-ISO-52911-1", BatchID: "3a",
Notes: "Additive manufacturing — design optimization for laser-based PBF.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO/ASTM 52911-1:2020-06", Relation: "identical", Confidence: "verified"},
{Region: "US-ASTM", Identifier: "ASTM F52911-19", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-ISO-19085-1", BatchID: "3a",
Notes: "Woodworking machines safety — common requirements.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 19085-1:2021-12", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI O1.1-2019", Relation: "partial", Confidence: "high"},
{Region: "US-OSHA", Identifier: "29 CFR 1910.213", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-ISO-19085-5", BatchID: "3a",
Notes: "Woodworking machines safety — Part 5: dimension saws.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 19085-5:2017-12", Relation: "identical", Confidence: "verified"},
{Region: "US-OSHA", Identifier: "29 CFR 1910.213(d) (Circular saws)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-621", BatchID: "3a",
Notes: "Continuous handling equipment — special requirements for air-supported conveyors.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 621:2010-09", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-616", BatchID: "3a",
Notes: "Continuous handling equipment — safety, mechanical/hydraulic feeders for paper rolls.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 616:2010-09", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-ISO-3691-4", BatchID: "3a",
Notes: "Industrial trucks — safety, Part 4: driverless industrial trucks and their systems (AGVs).",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 3691-4:2023-08", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/ITSDF B56.5-2019 (Driverless, Automatic Guided Industrial Vehicles)", Relation: "partial", Confidence: "high"},
{Region: "INTL-ISO", Identifier: "ISO 3691-4:2023", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-1525", BatchID: "3a",
Notes: "Safety of industrial trucks — driverless trucks (legacy; superseded by ISO 3691-4).",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1525:1998-01 (withdrawn 2020)", Relation: "superseded_by", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 3691-4:2023", Relation: "supersedes", Confidence: "verified"},
},
},
{
NormID: "EN-15095", BatchID: "3a",
Notes: "Power-operated mobile racking and shelving, carousels and storage lifts — safety.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 15095:2007-12", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI MH16.1-2021 (Industrial Steel Storage Racks)", Relation: "partial", Confidence: "medium"},
},
},
{
NormID: "EN-13309", BatchID: "3a",
Notes: "Construction machinery — electromagnetic compatibility (EMC).",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13309:2010-07", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-12604", BatchID: "3a",
Notes: "Industrial, commercial and garage doors and gates — mechanical aspects, requirements and test methods.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12604:2017-12", Relation: "identical", Confidence: "verified"},
{Region: "US-UL", Identifier: "UL 325-2017", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-12635", BatchID: "3a",
Notes: "Industrial, commercial and garage doors and gates — installation and use.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12635:2014-12", Relation: "identical", Confidence: "verified"},
{Region: "US-ASTM", Identifier: "ASTM F2200-22 (Automated Vehicular Gate Construction)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-115-1", BatchID: "3a",
Notes: "Safety of escalators and moving walks — construction and installation.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 115-1:2017-11", Relation: "identical", Confidence: "verified"},
{Region: "US-ASME", Identifier: "ASME A17.1-2022 §6 (Escalators and Moving Walks)", Relation: "partial", Confidence: "high"},
{Region: "CN-GB", Identifier: "GB 16899-2011", Relation: "equivalent", Confidence: "high"},
{Region: "JP-JIS", Identifier: "JIS A 4302:2006 §B (Escalators)", Relation: "partial", Confidence: "medium"},
},
},
{
NormID: "EN-115-2", BatchID: "3a",
Notes: "Safety of escalators and moving walks — Part 2: rules for improvement of safety of existing.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 115-2:2021-07", Relation: "identical", Confidence: "verified"},
{Region: "US-ASME", Identifier: "ASME A17.3 (Safety Code for Existing Elevators)", Relation: "partial", Confidence: "medium"},
},
},
{
NormID: "EN-ISO-3691-1", BatchID: "3a",
Notes: "Industrial trucks — safety, Part 1: self-propelled trucks (excludes AGVs).",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 3691-1:2015-08", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 3691-1:2015", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/ITSDF B56.1-2020", Relation: "partial", Confidence: "high"},
{Region: "US-OSHA", Identifier: "29 CFR 1910.178", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-ISO-3691-3", BatchID: "3a",
Notes: "Industrial trucks — safety, Part 3: additional requirements for trucks with elevating operator position.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 3691-3:2016-08", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 3691-3:2016", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/ITSDF B56.11.5", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-ISO-3691-5", BatchID: "3a",
Notes: "Industrial trucks — safety, Part 5: pedestrian-propelled trucks.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 3691-5:2015-08", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 3691-5:2014", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-ISO-3691-6", BatchID: "3a",
Notes: "Industrial trucks — safety, Part 6: burden and personnel carriers.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 3691-6:2015-08", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 3691-6:2013", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-13135", BatchID: "3a",
Notes: "Cranes — safety, design, requirements for equipment.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13135:2020-12", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-12999", BatchID: "3a",
Notes: "Cranes — loader cranes.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12999:2020-12", Relation: "identical", Confidence: "verified"},
{Region: "US-ASME", Identifier: "ASME B30.22-2016 (Articulating Boom Cranes)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-14238", BatchID: "3a",
Notes: "Cranes — manually controlled load manipulating devices.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 14238:2010-05", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-13157", BatchID: "3a",
Notes: "Cranes — safety, hand-powered lifting equipment.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13157:2009-12", Relation: "identical", Confidence: "verified"},
{Region: "US-ASME", Identifier: "ASME B30.21-2014 (Lever Hoists)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-14943", BatchID: "3a",
Notes: "Transport services — terminal handling equipment for waste from inland waterway and sea vessels.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 14943:2005-05", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-81-31", BatchID: "3a",
Notes: "Safety rules for lifts — Part 31: accessible goods only lifts.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 81-31:2010-07", Relation: "identical", Confidence: "verified"},
},
},
}
}
@@ -0,0 +1,427 @@
package iace
// Cross-reference matrix — Batch 3b (IDs 251-300).
// Covers process safety (piping, boilers, pressure vessels EN 13480/12952/
// 12953), pressure-related ISO standards, wind turbines (IEC 61400),
// photovoltaics (IEC 62446), rotating electrical machinery (IEC 60034),
// refrigeration, fuel-cell systems, large battery installations, and the
// remainder of EN-474 construction equipment.
func init() {
registerCrossRefs(batch3bCrossRefs())
}
func batch3bCrossRefs() []NormCrossRef {
return []NormCrossRef{
{
NormID: "EN-81-41", BatchID: "3b",
Notes: "Safety rules for lifts — Part 41: vertical lifting platforms intended for use by persons with impaired mobility.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 81-41:2011-04", Relation: "identical", Confidence: "verified"},
{Region: "US-ASME", Identifier: "ASME A18.1-2020 (Platform Lifts and Stairway Chairlifts)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-81-43", BatchID: "3b",
Notes: "Safety rules for lifts — Part 43: lifts for cranes.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 81-43:2010-01", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-1398", BatchID: "3b",
Notes: "Dock levellers safety.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1398:2009-12", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI MH30.2-2015 (Dock Levellers)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-1756-1", BatchID: "3b",
Notes: "Tail lifts — Part 1: tail lifts for goods.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1756-1:2021-02", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI MH30.1-2015 (Truck Liftgates)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-1756-2", BatchID: "3b",
Notes: "Tail lifts — Part 2: tail lifts for persons.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1756-2:2009-04", Relation: "identical", Confidence: "verified"},
{Region: "US-ADA", Identifier: "ADA Standards 2010 + DOT FMVSS 403", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-13480-1", BatchID: "3b",
Notes: "Metallic industrial piping — Part 1: general.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13480-1:2017-12", Relation: "identical", Confidence: "verified"},
{Region: "US-ASME", Identifier: "ASME B31.3-2022 (Process Piping)", Relation: "partial", Confidence: "high"},
{Region: "CN-GB", Identifier: "GB/T 20801 series", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "EN-13480-3", BatchID: "3b",
Notes: "Metallic industrial piping — Part 3: design and calculation.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13480-3:2017-12", Relation: "identical", Confidence: "verified"},
{Region: "US-ASME", Identifier: "ASME B31.3-2022 §300-305", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-764-7", BatchID: "3b",
Notes: "Pressure equipment — safety systems for unfired pressure equipment.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 764-7:2002-09", Relation: "identical", Confidence: "verified"},
{Region: "US-ASME", Identifier: "ASME BPVC Section VIII Div.1 §UG-125 (Overpressure)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-12952-1", BatchID: "3b",
Notes: "Water-tube boilers and auxiliary installations — Part 1: general.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12952-1:2015-12", Relation: "identical", Confidence: "verified"},
{Region: "US-ASME", Identifier: "ASME BPVC Section I (Power Boilers)", Relation: "partial", Confidence: "high"},
{Region: "CN-GB", Identifier: "GB/T 16507 series", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "EN-12953-1", BatchID: "3b",
Notes: "Shell boilers — Part 1: general.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12953-1:2012-10", Relation: "identical", Confidence: "verified"},
{Region: "US-ASME", Identifier: "ASME BPVC Section IV (Heating Boilers)", Relation: "partial", Confidence: "high"},
{Region: "CN-GB", Identifier: "GB/T 16508 series", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "EN-ISO-21049", BatchID: "3b",
Notes: "Pumps — shaft sealing systems for centrifugal and rotary pumps.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 21049:2004-11", Relation: "identical", Confidence: "verified"},
{Region: "US-API", Identifier: "API 682 (Pumps — Shaft Sealing Systems)", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-12162", BatchID: "3b",
Notes: "Liquid pumps — safety, hydrostatic testing procedure.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12162:2009-07", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-14462", BatchID: "3b",
Notes: "Surface treatment equipment — noise test code.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 14462:2015-12", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-12757-1", BatchID: "3b",
Notes: "Mixing machinery for coating materials — Part 1: mixers for general application.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12757-1:2014-12", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-50156-1", BatchID: "3b",
Notes: "Electrical equipment for furnaces — Part 1: requirements for application design.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 50156-1:2016-03 (VDE 0116-1)", Relation: "identical", Confidence: "verified"},
{Region: "US-NFPA", Identifier: "NFPA 85 (Boiler and Combustion Systems Hazards Code)", Relation: "partial", Confidence: "high"},
{Region: "US-NFPA", Identifier: "NFPA 86 (Ovens and Furnaces)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-14460", BatchID: "3b",
Notes: "Explosion-resistant equipment.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 14460:2018-12", Relation: "identical", Confidence: "verified"},
{Region: "US-NFPA", Identifier: "NFPA 69 (Explosion Prevention Systems)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-ISO-14644-1", BatchID: "3b",
Notes: "Cleanrooms and associated controlled environments — Part 1: classification of air cleanliness.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 14644-1:2016-06", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 14644-1:2015", Relation: "identical", Confidence: "verified"},
{Region: "US-FDA", Identifier: "FDA cGMP (21 CFR 211, 21 CFR 820) + USP <797>", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-ISO-14644-4", BatchID: "3b",
Notes: "Cleanrooms — Part 4: design, construction and start-up.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 14644-4:2022-12", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 14644-4:2022", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-14015", BatchID: "3b",
Notes: "Specification for design and manufacture of site built, vertical, cylindrical, flat-bottomed, above-ground welded steel tanks.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 14015:2005-02", Relation: "identical", Confidence: "verified"},
{Region: "US-API", Identifier: "API 650 (Welded Tanks for Oil Storage)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-13094", BatchID: "3b",
Notes: "Tanks for the transport of dangerous goods — metallic tanks with working pressure <= 0.5 bar.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13094:2020-12", Relation: "identical", Confidence: "verified"},
{Region: "US-DOT", Identifier: "49 CFR Part 178 (Specifications for Packagings)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-16767", BatchID: "3b",
Notes: "Industrial valves — metallic check valves.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 16767:2016-12", Relation: "identical", Confidence: "verified"},
{Region: "US-API", Identifier: "API 594 (Check Valves)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-ISO-4126-1", BatchID: "3b",
Notes: "Safety devices for protection against excessive pressure — Part 1: safety valves.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 4126-1:2013-12", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 4126-1:2013", Relation: "identical", Confidence: "verified"},
{Region: "US-ASME", Identifier: "ASME BPVC Section VIII §UG-126 (Pressure Relief)", Relation: "partial", Confidence: "high"},
{Region: "US-API", Identifier: "API 526 (Flanged Steel Pressure-Relief Valves)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-ISO-4126-4", BatchID: "3b",
Notes: "Safety devices — Part 4: pilot-operated safety valves.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 4126-4:2013-12", Relation: "identical", Confidence: "verified"},
{Region: "US-API", Identifier: "API 520 / API 526", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-1854", BatchID: "3b",
Notes: "Pressure-sensing devices for gas burners and gas-burning appliances.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1854:2010-09", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI Z21.21 / CSA 6.5 (Combustion Controls)", Relation: "partial", Confidence: "medium"},
},
},
{
NormID: "EN-161", BatchID: "3b",
Notes: "Automatic shut-off valves for gas burners.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 161:2013-04", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI Z21.21 / CSA 6.5", Relation: "partial", Confidence: "medium"},
},
},
{
NormID: "EN-12566-3", BatchID: "3b",
Notes: "Small wastewater treatment systems for up to 50 PT.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12566-3:2016-11", Relation: "identical", Confidence: "verified"},
{Region: "US-NSF", Identifier: "NSF/ANSI 40 (Residential Wastewater Treatment Systems)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-14181", BatchID: "3b",
Notes: "Stationary source emissions — quality assurance of automated measuring systems.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 14181:2014-09", Relation: "identical", Confidence: "verified"},
{Region: "US-EPA", Identifier: "40 CFR Part 60 Appendix F (QA Procedures for CEMS)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-IEC-61400-1", BatchID: "3b",
Notes: "Wind energy generation systems — Part 1: design requirements.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN IEC 61400-1:2019-12 (VDE 0127-1)", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "IEC 61400-1:2019", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/ACP 61400-1-2021 (American Clean Power)", Relation: "equivalent", Confidence: "high"},
{Region: "CN-GB", Identifier: "GB/T 18451.1-2022", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "EN-IEC-61400-2", BatchID: "3b",
Notes: "Wind energy generation systems — Part 2: small wind turbines.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN IEC 61400-2:2014-11 (VDE 0127-2)", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "IEC 61400-2:2013", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/ACP Small Wind Turbines (formerly AWEA 9.1)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-62446-1", BatchID: "3b",
Notes: "Photovoltaic (PV) systems — requirements for testing, documentation and maintenance.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 62446-1:2017-04 (VDE 0126-23-1)", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "IEC 62446-1:2016", Relation: "identical", Confidence: "verified"},
{Region: "US-NFPA", Identifier: "NFPA 70 (NEC) Article 690 (Solar Photovoltaic Systems)", Relation: "partial", Confidence: "high"},
{Region: "US-UL", Identifier: "UL 1741-2021 (Inverters for use with PV systems)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-60034-1", BatchID: "3b",
Notes: "Rotating electrical machines — Part 1: rating and performance.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 60034-1:2011-02 (VDE 0530-1)", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "IEC 60034-1:2017", Relation: "identical", Confidence: "verified"},
{Region: "US-NEMA", Identifier: "NEMA MG 1-2021 (Motors and Generators)", Relation: "partial", Confidence: "high"},
{Region: "US-ANSI", Identifier: "ANSI C50.10 / C50.13 (Synchronous machines)", Relation: "partial", Confidence: "high"},
{Region: "CN-GB", Identifier: "GB/T 755-2019", Relation: "equivalent", Confidence: "high"},
{Region: "JP-JIS", Identifier: "JIS C 4034-1:2011", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "EN-60034-5", BatchID: "3b",
Notes: "Rotating electrical machines — Part 5: degrees of protection (IP code) for machines.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 60034-5:2008-10 (VDE 0530-5)", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "IEC 60034-5:2006", Relation: "identical", Confidence: "verified"},
{Region: "US-NEMA", Identifier: "NEMA MG 1 §5 (Enclosures)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-14276-1", BatchID: "3b",
Notes: "Pressure equipment for refrigerating systems and heat pumps — Part 1: vessels.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 14276-1:2020-11", Relation: "identical", Confidence: "verified"},
{Region: "US-ASME", Identifier: "ASME BPVC Section VIII Div.1 + ANSI/AHRI 495", Relation: "partial", Confidence: "high"},
{Region: "US-ASHRAE", Identifier: "ASHRAE 15-2022 (Safety Standard for Refrigeration Systems)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-378-1", BatchID: "3b",
Notes: "Refrigerating systems and heat pumps — safety and environmental requirements — Part 1: basic requirements.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 378-1:2021-06", Relation: "identical", Confidence: "verified"},
{Region: "US-ASHRAE", Identifier: "ASHRAE 15-2022", Relation: "partial", Confidence: "high"},
{Region: "US-ASHRAE", Identifier: "ASHRAE 34-2022 (Refrigerant Classification)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-12621", BatchID: "3b",
Notes: "Machinery for the supply and circulation of coating materials under pressure.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12621:2014-10", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-14753", BatchID: "3b",
Notes: "Safety requirements for machinery and plant for the continuous casting of steel.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 14753:2007-04", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-12952-7", BatchID: "3b",
Notes: "Water-tube boilers — Part 7: requirements for equipment for the boiler.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12952-7:2012-12", Relation: "identical", Confidence: "verified"},
{Region: "US-ASME", Identifier: "ASME BPVC Section I", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-14917", BatchID: "3b",
Notes: "Metal bellows expansion joints for pressure applications.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 14917:2021-07", Relation: "identical", Confidence: "verified"},
{Region: "US-EJMA", Identifier: "EJMA Standards (Expansion Joint Manufacturers Association)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-62282-3-100", BatchID: "3b",
Notes: "Fuel cell technologies — Part 3-100: stationary fuel cell power systems, safety.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN IEC 62282-3-100:2020-08 (VDE 0130-3-100)", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "IEC 62282-3-100:2019", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/CSA FC1 (Stationary Fuel Cell Power Systems)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-13445-3", BatchID: "3b",
Notes: "Unfired pressure vessels — Part 3: design.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13445-3:2021-12", Relation: "identical", Confidence: "verified"},
{Region: "US-ASME", Identifier: "ASME BPVC Section VIII Div.1/Div.2 (Pressure Vessels)", Relation: "partial", Confidence: "high"},
{Region: "CN-GB", Identifier: "GB 150.3-2011", Relation: "equivalent", Confidence: "high"},
},
},
{
NormID: "EN-62619", BatchID: "3b",
Notes: "Secondary cells and batteries containing alkaline or non-acid electrolytes — safety requirements for secondary lithium cells/batteries for industrial applications.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN IEC 62619:2022-09 (VDE 0510-39)", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "IEC 62619:2022", Relation: "identical", Confidence: "verified"},
{Region: "US-UL", Identifier: "UL 1973-2022 (Batteries for Stationary Applications)", Relation: "partial", Confidence: "high"},
{Region: "US-NFPA", Identifier: "NFPA 855-2023 (Stationary Energy Storage Systems)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-1991-4", BatchID: "3b",
Notes: "Eurocode 1 — actions on structures — Part 4: silos and tanks.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1991-4:2010-12", Relation: "identical", Confidence: "verified"},
{Region: "US-ACI", Identifier: "ACI 313 (Concrete Bins and Silos)", Relation: "partial", Confidence: "medium"},
},
},
{
NormID: "EN-15776", BatchID: "3b",
Notes: "Unfired pressure vessels — requirements for the design and construction of pressure vessels made of cast iron.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 15776:2019-05", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-16282-1", BatchID: "3b",
Notes: "Equipment for commercial kitchens — components for ventilation in commercial kitchens.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 16282-1:2017-10", Relation: "identical", Confidence: "verified"},
{Region: "US-NFPA", Identifier: "NFPA 96-2024 (Standard for Ventilation Control and Fire Protection of Commercial Cooking)", Relation: "partial", Confidence: "high"},
},
},
{
NormID: "EN-474-4", BatchID: "3b",
Notes: "Earth-moving machinery — Part 4: backhoe loaders.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 474-4:2022-12", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-474-7", BatchID: "3b",
Notes: "Earth-moving machinery — Part 7: scrapers.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 474-7:2022-12", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-474-8", BatchID: "3b",
Notes: "Earth-moving machinery — Part 8: graders.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 474-8:2022-12", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-474-9", BatchID: "3b",
Notes: "Earth-moving machinery — Part 9: pipelayers.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 474-9:2022-12", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-474-10", BatchID: "3b",
Notes: "Earth-moving machinery — Part 10: trenchers.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 474-10:2022-12", Relation: "identical", Confidence: "verified"},
},
},
{
NormID: "EN-474-11", BatchID: "3b",
Notes: "Earth-moving machinery — Part 11: earth and landfill compactors.",
Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 474-11:2022-12", Relation: "identical", Confidence: "verified"},
},
},
}
}
@@ -0,0 +1,187 @@
package iace
// Cross-reference matrix — Batch 4a (next 50, alphabetically sorted).
// Covers paper machinery sub-parts (EN 1034-x), protective clothing
// electrostatic (EN 1149-x), industrial trucks electrical (EN 1175-x),
// playground equipment (EN 1176-x), and plastics granulators (EN 12012-x).
// Many EU-specific C-norms; ANSI equivalents are partial or absent.
func init() {
registerCrossRefs(batch4aCrossRefs())
}
func batch4aCrossRefs() []NormCrossRef {
return []NormCrossRef{
{NormID: "EN-1010-4", BatchID: "4a", Notes: "Printing/paper-converting machines — Part 4: bookbinding, paper-converting and finishing machines.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1010-4:2007-12", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI B65.5 (Bindery and Finishing Equipment)", Relation: "partial", Confidence: "medium"},
}},
{NormID: "EN-1012-3", BatchID: "4a", Notes: "Compressors and vacuum pumps — Part 3: process compressors.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1012-3:2014-06", Relation: "identical", Confidence: "verified"},
{Region: "US-API", Identifier: "API 617 (Axial and Centrifugal Compressors)", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-1028-1", BatchID: "4a", Notes: "Fire-fighting pumps — fire-fighting centrifugal pumps with primer.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1028-1:2008-09", Relation: "identical", Confidence: "verified"},
{Region: "US-NFPA", Identifier: "NFPA 1901-2024 (Automotive Fire Apparatus)", Relation: "partial", Confidence: "medium"},
}},
{NormID: "EN-1034-2", BatchID: "4a", Notes: "Paper-making — Part 2: barking drums and debarking equipment.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1034-2:2005-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-1034-5", BatchID: "4a", Notes: "Paper-making — Part 5: sheeters.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1034-5:2010-04", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-1034-6", BatchID: "4a", Notes: "Paper-making — Part 6: calenders.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1034-6:2012-10", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-1034-7", BatchID: "4a", Notes: "Paper-making — Part 7: chests.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1034-7:2005-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-1034-8", BatchID: "4a", Notes: "Paper-making — Part 8: refining plants.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1034-8:2012-10", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-1034-9", BatchID: "4a", Notes: "Paper-making — Part 9: chemical mixers.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1034-9:2012-10", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-1034-10", BatchID: "4a", Notes: "Paper-making — Part 10: coaters.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1034-10:2009-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-1034-11", BatchID: "4a", Notes: "Paper-making — Part 11: tissue machines.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1034-11:2009-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-1034-12", BatchID: "4a", Notes: "Paper-making — Part 12: cross cutters.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1034-12:2009-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-1034-13", BatchID: "4a", Notes: "Paper-making — Part 13: machines for de-wiring of bales/units.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1034-13:2018-08", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-1034-14", BatchID: "4a", Notes: "Paper-making — Part 14: reel splitter.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1034-14:2009-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-1034-15", BatchID: "4a", Notes: "Paper-making — Part 15: sheet drying systems.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1034-15:2010-09", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-1034-16", BatchID: "4a", Notes: "Paper-making — Part 16: paper and board machines.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1034-16:2012-10", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-1034-17", BatchID: "4a", Notes: "Paper-making — Part 17: tissue making machines.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1034-17:2012-10", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-1034-18", BatchID: "4a", Notes: "Paper-making — Part 18: pulper-feeding/discharging.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1034-18:2010-04", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-1034-20", BatchID: "4a", Notes: "Paper-making — Part 20: roll calenders.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1034-20:2017-08", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-1034-21", BatchID: "4a", Notes: "Paper-making — Part 21: coating machines (after-treatment).", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1034-21:2012-10", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-1034-22", BatchID: "4a", Notes: "Paper-making — Part 22: wood grinders.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1034-22:2005-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-1034-26", BatchID: "4a", Notes: "Paper-making — Part 26: machines for packaging of bobbins and reels.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1034-26:2017-08", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-1034-27", BatchID: "4a", Notes: "Paper-making — Part 27: reel handling systems.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1034-27:2017-08", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-1035", BatchID: "4a", Notes: "Conveyor belts — laboratory scale flammability characteristics.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1035 (withdrawn, see ISO 340)", Relation: "superseded_by", Confidence: "medium"},
{Region: "INTL-ISO", Identifier: "ISO 340 (Conveyor belts — Laboratory scale flammability characteristics)", Relation: "supersedes", Confidence: "high"},
}},
{NormID: "EN-1036", BatchID: "4a", Notes: "Glass in building — mirrors from silver-coated float glass.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1036-1:2008-01", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-1149-1", BatchID: "4a", Notes: "Protective clothing — electrostatic properties, Part 1: surface resistivity.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1149-1:2006-09", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/ESD STM2.1 / ESD S20.20-2014", Relation: "partial", Confidence: "high"},
{Region: "US-NFPA", Identifier: "NFPA 2113-2020 (Flame-Resistant Garments)", Relation: "partial", Confidence: "medium"},
}},
{NormID: "EN-1149-5", BatchID: "4a", Notes: "Protective clothing — electrostatic properties, Part 5: material performance and design requirements.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1149-5:2018-06", Relation: "identical", Confidence: "verified"},
{Region: "US-NFPA", Identifier: "NFPA 2113-2020", Relation: "partial", Confidence: "medium"},
}},
{NormID: "EN-1175-1", BatchID: "4a", Notes: "Industrial trucks — electrical/electronic requirements, Part 1: trucks with battery (legacy).", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1175-1:2014-08 (withdrawn, see EN 1175:2020)", Relation: "superseded_by", Confidence: "verified"},
{Region: "US-UL", Identifier: "UL 583 (Electric Industrial Trucks)", Relation: "partial", Confidence: "medium"},
}},
{NormID: "EN-1175-2", BatchID: "4a", Notes: "Industrial trucks — Part 2: internal combustion engine drive (legacy).", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1175-2:2014-08 (withdrawn)", Relation: "superseded_by", Confidence: "verified"},
}},
{NormID: "EN-1175-3", BatchID: "4a", Notes: "Industrial trucks — Part 3: electrical power transmission (legacy).", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1175-3:2014-08 (withdrawn)", Relation: "superseded_by", Confidence: "verified"},
}},
{NormID: "EN-1176-1", BatchID: "4a", Notes: "Playground equipment and surfacing — Part 1: general safety requirements.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1176-1:2017-12", Relation: "identical", Confidence: "verified"},
{Region: "US-ASTM", Identifier: "ASTM F1487-21 (Public Use Playground Equipment)", Relation: "partial", Confidence: "high"},
{Region: "US-CPSC", Identifier: "CPSC Public Playground Safety Handbook 2010", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-1176-2", BatchID: "4a", Notes: "Playground equipment — Part 2: swings.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1176-2:2020-12", Relation: "identical", Confidence: "verified"},
{Region: "US-ASTM", Identifier: "ASTM F1487-21", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-1176-3", BatchID: "4a", Notes: "Playground equipment — Part 3: slides.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1176-3:2020-12", Relation: "identical", Confidence: "verified"},
{Region: "US-ASTM", Identifier: "ASTM F1487-21", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-1176-4", BatchID: "4a", Notes: "Playground equipment — Part 4: cableways.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1176-4:2017-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-1176-5", BatchID: "4a", Notes: "Playground equipment — Part 5: carousels.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1176-5:2019-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-1176-6", BatchID: "4a", Notes: "Playground equipment — Part 6: rocking equipment.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1176-6:2017-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-1176-7", BatchID: "4a", Notes: "Playground equipment — Part 7: guidance on installation, inspection, maintenance.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1176-7:2020-12", Relation: "identical", Confidence: "verified"},
{Region: "US-ASTM", Identifier: "ASTM F1487-21", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-12001", BatchID: "4a", Notes: "Conveying, spraying and placing machinery for concrete and mortar.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12001:2013-04", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/ACPA M-1 (Concrete Pumping Safety)", Relation: "partial", Confidence: "medium"},
}},
{NormID: "EN-12012-1", BatchID: "4a", Notes: "Plastics and rubber machines — size-reduction machines, Part 1: blade granulators.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12012-1:2018-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-12012-2", BatchID: "4a", Notes: "Plastics — size-reduction machines, Part 2: strand pelletizers.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12012-2:2018-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-12012-3", BatchID: "4a", Notes: "Plastics — size-reduction machines, Part 3: shredders.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12012-3:2018-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-12012-4", BatchID: "4a", Notes: "Plastics — size-reduction machines, Part 4: agglomerators.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12012-4:2018-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-12041", BatchID: "4a", Notes: "Food processing machinery — moulders.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12041:2014-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-12043", BatchID: "4a", Notes: "Food processing machinery — intermediate provers.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12043:2014-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-12044", BatchID: "4a", Notes: "Food processing machinery — cutting and wrapping machines.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12044:2018-08", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-12097", BatchID: "4a", Notes: "Ventilation for buildings — ductwork, requirements for ductwork components.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12097:2007-04", Relation: "identical", Confidence: "verified"},
{Region: "US-SMACNA", Identifier: "SMACNA HVAC Duct Construction Standards (Metal & Flexible)", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-12111", BatchID: "4a", Notes: "Tunnelling machines — road headers, continuous miners and impact rippers.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12111:2014-09", Relation: "identical", Confidence: "verified"},
{Region: "US-OSHA", Identifier: "30 CFR Part 75 (Underground Coal Mines)", Relation: "partial", Confidence: "medium"},
}},
{NormID: "EN-12151", BatchID: "4a", Notes: "Machinery and plants for the preparation of concrete and mortar.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12151:2007-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-12182", BatchID: "4a", Notes: "Assistive products for persons with disability — general requirements and test methods.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12182:2012-04", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 9999:2022 (Assistive products classification)", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-12312-1", BatchID: "4a", Notes: "Aircraft ground support equipment — Part 1: general requirements.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12312-1:2013-09", Relation: "identical", Confidence: "verified"},
{Region: "US-SAE", Identifier: "SAE ARP 1247 (General Requirements for Aerospace Ground Support Equipment)", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-12312-2", BatchID: "4a", Notes: "Aircraft ground support — Part 2: catering vehicles.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12312-2:2014-04", Relation: "identical", Confidence: "verified"},
}},
}
}
@@ -0,0 +1,182 @@
package iace
// Cross-reference matrix — Batch 4b (next 50, alphabetical).
// Covers aircraft ground support equipment (EN 12312 series), steel wire
// ropes (EN 12385 series), scaffolds (EN 12810/12811), cranes design
// (EN 13001 series), and various boiler / cleaning niches.
func init() {
registerCrossRefs(batch4bCrossRefs())
}
func batch4bCrossRefs() []NormCrossRef {
return []NormCrossRef{
{NormID: "EN-12312-3", BatchID: "4b", Notes: "Aircraft ground support — Part 3: conveyor belt vehicles.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12312-3:2017-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-12312-4", BatchID: "4b", Notes: "Aircraft ground support — Part 4: passenger boarding bridges.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12312-4:2014-04", Relation: "identical", Confidence: "verified"},
{Region: "US-SAE", Identifier: "SAE ARP 1247", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-12312-5", BatchID: "4b", Notes: "Aircraft ground support — Part 5: aircraft fuelling equipment.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12312-5:2018-12", Relation: "identical", Confidence: "verified"},
{Region: "US-NFPA", Identifier: "NFPA 407-2022 (Aircraft Fuel Servicing)", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-12312-6", BatchID: "4b", Notes: "Aircraft ground support — Part 6: deicers and deicing/anti-icing equipment.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12312-6:2017-12", Relation: "identical", Confidence: "verified"},
{Region: "US-SAE", Identifier: "SAE ARP 5660 (Deicing/Anti-Icing)", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-12312-7", BatchID: "4b", Notes: "Aircraft ground support — Part 7: aircraft movement equipment.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12312-7:2021-09", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-12312-8", BatchID: "4b", Notes: "Aircraft ground support — Part 8: maintenance steps and platforms.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12312-8:2018-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-12312-9", BatchID: "4b", Notes: "Aircraft ground support — Part 9: container/pallet loaders.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12312-9:2014-08", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-12312-10", BatchID: "4b", Notes: "Aircraft ground support — Part 10: container/pallet transporters.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12312-10:2005-05", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-12312-11", BatchID: "4b", Notes: "Aircraft ground support — Part 11: container/pallet dollies and loose load trailers.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12312-11:2014-08", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-12312-12", BatchID: "4b", Notes: "Aircraft ground support — Part 12: potable water service equipment.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12312-12:2017-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-12312-13", BatchID: "4b", Notes: "Aircraft ground support — Part 13: lavatory service equipment.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12312-13:2017-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-12312-14", BatchID: "4b", Notes: "Aircraft ground support — Part 14: passenger boarding/disembarking vehicles.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12312-14:2014-04", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-12312-15", BatchID: "4b", Notes: "Aircraft ground support — Part 15: baggage and equipment tractors.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12312-15:2018-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-12312-16", BatchID: "4b", Notes: "Aircraft ground support — Part 16: air start equipment.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12312-16:2005-05", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-12312-17", BatchID: "4b", Notes: "Aircraft ground support — Part 17: air conditioning equipment.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12312-17:2005-05", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-12312-18", BatchID: "4b", Notes: "Aircraft ground support — Part 18: nitrogen or oxygen units.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12312-18:2017-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-12312-19", BatchID: "4b", Notes: "Aircraft ground support — Part 19: aircraft jacks, axle jacks and hydraulic tail stanchions.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12312-19:2014-04", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-12312-20", BatchID: "4b", Notes: "Aircraft ground support — Part 20: electrical ground power units.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12312-20:2017-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-12385-1", BatchID: "4b", Notes: "Steel wire ropes — safety, Part 1: general requirements.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12385-1:2009-01", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 17893 (Steel wire ropes — Vocabulary)", Relation: "partial", Confidence: "high"},
{Region: "US-ASME", Identifier: "ASME B30.30-2019 (Ropes)", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-12385-2", BatchID: "4b", Notes: "Steel wire ropes — Part 2: definitions, designation, classification.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12385-2:2008-06", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-12385-3", BatchID: "4b", Notes: "Steel wire ropes — Part 3: information for use and maintenance.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12385-3:2021-03", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-12385-4", BatchID: "4b", Notes: "Steel wire ropes — Part 4: stranded ropes for general lifting applications.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12385-4:2008-06", Relation: "identical", Confidence: "verified"},
{Region: "US-ASME", Identifier: "ASME B30.30", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-12385-5", BatchID: "4b", Notes: "Steel wire ropes — Part 5: stranded ropes for lifts.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12385-5:2021-09", Relation: "identical", Confidence: "verified"},
{Region: "US-ASME", Identifier: "ASME A17.6-2017 (Suspension, Compensation, Governor Ropes)", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-12385-10", BatchID: "4b", Notes: "Steel wire ropes — Part 10: spiral ropes for general structural applications.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12385-10:2008-06", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-12415", BatchID: "4b", Notes: "Machine tools safety — small numerically controlled turning machines and turning centres.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12415:2002-04 (withdrawn, see EN ISO 23125)", Relation: "superseded_by", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 23125:2015", Relation: "supersedes", Confidence: "verified"},
}},
{NormID: "EN-12418", BatchID: "4b", Notes: "Masonry/stone-cutting saws for site work.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12418:2009-06", Relation: "identical", Confidence: "verified"},
{Region: "US-OSHA", Identifier: "29 CFR 1926.303 (Abrasive wheels and tools)", Relation: "partial", Confidence: "medium"},
}},
{NormID: "EN-12478", BatchID: "4b", Notes: "Industrial trucks — design specifications for fork carriages.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12478:2000-09", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-12653", BatchID: "4b", Notes: "Industrial fans — safety, balance quality.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12653 (drafted; see ISO 14694)", Relation: "partial", Confidence: "medium"},
{Region: "INTL-ISO", Identifier: "ISO 14694:2003 (Industrial Fans — Balance Quality)", Relation: "equivalent", Confidence: "high"},
}},
{NormID: "EN-12717", BatchID: "4b", Notes: "Machine tools safety — drilling machines.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12717:2009-09", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI B11.8-2001 (R2017) (Manual Milling, Drilling, Boring)", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-12750", BatchID: "4b", Notes: "Safety of woodworking machines — four-sided moulding machines.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12750:2013-09", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-12779", BatchID: "4b", Notes: "Safety of woodworking machines — chip and dust extraction systems.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12779:2015-12", Relation: "identical", Confidence: "verified"},
{Region: "US-NFPA", Identifier: "NFPA 664 (Wood Processing/Woodworking)", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-12810-1", BatchID: "4b", Notes: "Façade scaffolds made of prefabricated components — Part 1: products specifications.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12810-1:2004-03", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI A10.8-2019 (Scaffolding Safety)", Relation: "partial", Confidence: "high"},
{Region: "US-OSHA", Identifier: "29 CFR 1926.451", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-12810-2", BatchID: "4b", Notes: "Façade scaffolds — Part 2: particular methods of structural design.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12810-2:2004-03", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-12811-1", BatchID: "4b", Notes: "Temporary works equipment — Part 1: scaffolds, performance requirements.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12811-1:2004-03", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI A10.8-2019", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-12811-2", BatchID: "4b", Notes: "Temporary works equipment — Part 2: information on materials.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12811-2:2004-03", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-12811-3", BatchID: "4b", Notes: "Temporary works — Part 3: load testing.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12811-3:2003-02", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-12921-4", BatchID: "4b", Notes: "Surface cleaning machines — Part 4: safety for machines using halogenated solvents.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12921-4:2017-04", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-12929-1", BatchID: "4b", Notes: "Cableway installations — general requirements, Part 1: requirements for all installations.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12929-1:2015-09", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI B77.1-2017 (Passenger Ropeways)", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-12952-3", BatchID: "4b", Notes: "Water-tube boilers — Part 3: design and calculation for pressure parts.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12952-3:2020-09", Relation: "identical", Confidence: "verified"},
{Region: "US-ASME", Identifier: "ASME BPVC Section I", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-12952-5", BatchID: "4b", Notes: "Water-tube boilers — Part 5: workmanship and construction of pressure parts.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12952-5:2021-09", Relation: "identical", Confidence: "verified"},
{Region: "US-ASME", Identifier: "ASME BPVC Section I", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-12952-6", BatchID: "4b", Notes: "Water-tube boilers — Part 6: inspection during construction.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 12952-6:2021-09", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-13001-1", BatchID: "4b", Notes: "Cranes — general design, Part 1: general principles and requirements.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13001-1:2018-08", Relation: "identical", Confidence: "verified"},
{Region: "US-ASME", Identifier: "ASME B30.2 + ASME BTH-1-2020 (Design of Below-the-Hook Lifting Devices)", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-13001-2", BatchID: "4b", Notes: "Cranes — general design, Part 2: load actions.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13001-2:2021-09", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-13001-3-1", BatchID: "4b", Notes: "Cranes — general design, Part 3-1: limit states / proof of competence of steel structures.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13001-3-1:2018-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-13001-3-2", BatchID: "4b", Notes: "Cranes — Part 3-2: proof of competence of wire ropes in reeving systems.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13001-3-2:2014-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-13001-3-3", BatchID: "4b", Notes: "Cranes — Part 3-3: limit states / proof of competence of wheel-rail contacts.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13001-3-3:2018-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-13001-3-4", BatchID: "4b", Notes: "Cranes — Part 3-4: machinery components.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13001-3-4:2018-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-13001-3-5", BatchID: "4b", Notes: "Cranes — Part 3-5: forged and cast hooks.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13001-3-5:2016-08", Relation: "identical", Confidence: "verified"},
{Region: "US-ASME", Identifier: "ASME B30.10-2019 (Hooks)", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-13001-3-6", BatchID: "4b", Notes: "Cranes — Part 3-6: machinery components, hydraulic cylinders.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13001-3-6:2018-12", Relation: "identical", Confidence: "verified"},
}},
}
}
@@ -0,0 +1,182 @@
package iace
// Cross-reference matrix — Batch 5a (next 50 alphabetical).
// Covers glass machinery (EN 13035), ladders (EN 131), pressure vessels +
// piping subparts, swimming-pool equipment (EN 13451), explosives (EN 13631),
// fume cupboards (EN 14175), and amusement rides (EN 13814).
func init() {
registerCrossRefs(batch5aCrossRefs())
}
func batch5aCrossRefs() []NormCrossRef {
return []NormCrossRef{
{NormID: "EN-13023", BatchID: "5a", Notes: "Noise measurement method for printing, paper-converting, paper-making machines.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13023:2004-09", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-13035-1", BatchID: "5a", Notes: "Machines for glass manufacture — storage, handling, transportation Part 1: storage outside.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13035-1:2008-02", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-13035-2", BatchID: "5a", Notes: "Glass machinery — Part 2: storage inside.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13035-2:2008-02", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-13035-3", BatchID: "5a", Notes: "Glass machinery — Part 3: cutting machines.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13035-3:2010-04", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-13035-4", BatchID: "5a", Notes: "Glass machinery — Part 4: tilting tables.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13035-4:2003-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-13035-5", BatchID: "5a", Notes: "Glass machinery — Part 5: machines and installations for stacking and de-stacking.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13035-5:2006-11", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-13035-6", BatchID: "5a", Notes: "Glass machinery — Part 6: breakout machines.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13035-6:2006-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-13035-7", BatchID: "5a", Notes: "Glass machinery — Part 7: cutting machines for laminated glass.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13035-7:2006-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-13035-9", BatchID: "5a", Notes: "Glass machinery — Part 9: washing installations.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13035-9:2006-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-13035-11", BatchID: "5a", Notes: "Glass machinery — Part 11: drilling machines.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13035-11:2006-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-13053", BatchID: "5a", Notes: "Ventilation for buildings — air handling units, ratings and performance.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13053:2020-05", Relation: "identical", Confidence: "verified"},
{Region: "US-AHRI", Identifier: "AHRI Standard 410-2014 (Forced-Circulation Air-Cooling)", Relation: "partial", Confidence: "medium"},
}},
{NormID: "EN-131-1", BatchID: "5a", Notes: "Ladders — Part 1: terms, types, functional sizes.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 131-1:2020-04", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI A14.1/A14.2/A14.5 (Wood/Metal/Reinforced Plastic Ladders)", Relation: "partial", Confidence: "high"},
{Region: "US-OSHA", Identifier: "29 CFR 1926.1053", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-131-2", BatchID: "5a", Notes: "Ladders — Part 2: requirements, testing, marking.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 131-2:2017-04", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI A14 series", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-131-3", BatchID: "5a", Notes: "Ladders — Part 3: marking and user instructions.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 131-3:2018-06", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-131-4", BatchID: "5a", Notes: "Ladders — Part 4: single or multiple hinge-joint ladders.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 131-4:2020-05", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-13208", BatchID: "5a", Notes: "Food processing machinery — vegetable peelers.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13208:2014-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-13241", BatchID: "5a", Notes: "Industrial, commercial and garage doors and gates — product standard.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13241:2021-06", Relation: "identical", Confidence: "verified"},
{Region: "US-UL", Identifier: "UL 325-2017", Relation: "partial", Confidence: "high"},
{Region: "US-ASTM", Identifier: "ASTM F2200-22 (Gates)", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-13256", BatchID: "5a", Notes: "Thermal insulation products for building equipment.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13256:2017-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-13288", BatchID: "5a", Notes: "Food processing machinery — lifting and tilting machines.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13288:2017-08", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-13379", BatchID: "5a", Notes: "Food processing — pasta-processing machines.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13379:2014-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-13445-2", BatchID: "5a", Notes: "Unfired pressure vessels — Part 2: materials.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13445-2:2021-12", Relation: "identical", Confidence: "verified"},
{Region: "US-ASME", Identifier: "ASME BPVC Section II (Materials)", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-13445-4", BatchID: "5a", Notes: "Unfired pressure vessels — Part 4: fabrication.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13445-4:2021-12", Relation: "identical", Confidence: "verified"},
{Region: "US-ASME", Identifier: "ASME BPVC Section VIII Div.1/2", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-13445-5", BatchID: "5a", Notes: "Unfired pressure vessels — Part 5: inspection and testing.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13445-5:2021-12", Relation: "identical", Confidence: "verified"},
{Region: "US-ASME", Identifier: "ASME BPVC Section V (Non-Destructive Examination)", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-13451-1", BatchID: "5a", Notes: "Swimming pool equipment — general safety requirements.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13451-1:2018-09", Relation: "identical", Confidence: "verified"},
{Region: "US-APSP", Identifier: "ANSI/APSP/ICC-1 (Public Pools and Spas)", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-13451-2", BatchID: "5a", Notes: "Swimming pool equipment — Part 2: ladders, stepladders, and handrails.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13451-2:2015-09", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-13451-3", BatchID: "5a", Notes: "Swimming pool equipment — Part 3: inlets, outlets, water/air based water leisure features.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13451-3:2015-09", Relation: "identical", Confidence: "verified"},
{Region: "US-APSP", Identifier: "ANSI/APSP/ICC-7 (Suction Entrapment Avoidance)", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-13451-4", BatchID: "5a", Notes: "Swimming pool equipment — Part 4: starting platforms.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13451-4:2014-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-13451-5", BatchID: "5a", Notes: "Swimming pool equipment — Part 5: lane lines.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13451-5:2014-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-13451-10", BatchID: "5a", Notes: "Swimming pool equipment — Part 10: diving platforms, diving boards, jump boards.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13451-10:2015-09", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-13451-11", BatchID: "5a", Notes: "Swimming pool equipment — Part 11: movable pool floors and dividing walls.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13451-11:2014-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-13480-2", BatchID: "5a", Notes: "Metallic industrial piping — Part 2: materials.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13480-2:2017-12", Relation: "identical", Confidence: "verified"},
{Region: "US-ASME", Identifier: "ASME B31.3 (Process Piping)", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-13480-4", BatchID: "5a", Notes: "Metallic industrial piping — Part 4: fabrication and installation.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13480-4:2017-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-13480-5", BatchID: "5a", Notes: "Metallic industrial piping — Part 5: inspection and testing.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13480-5:2017-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-13534", BatchID: "5a", Notes: "Food processing machinery — meat injecting machines.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13534:2007-04", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-13631-1", BatchID: "5a", Notes: "Explosives for civil uses — high explosives, Part 1: requirements.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13631-1:2005-04", Relation: "identical", Confidence: "verified"},
{Region: "US-DOT", Identifier: "49 CFR Part 173 (Hazardous Materials Regulations — Explosives)", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-13631-2", BatchID: "5a", Notes: "Explosives — Part 2: determination of thermal stability.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13631-2:2002-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-13631-3", BatchID: "5a", Notes: "Explosives — Part 3: determination of sensitiveness to friction.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13631-3:2005-02", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-13631-4", BatchID: "5a", Notes: "Explosives — Part 4: determination of sensitiveness to impact.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13631-4:2002-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-13731", BatchID: "5a", Notes: "Vibration isolating systems — performance requirements.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13731:2007-09", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-13779", BatchID: "5a", Notes: "Ventilation for non-residential buildings — performance requirements.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13779:2007-09 (withdrawn, see EN 16798-3)", Relation: "superseded_by", Confidence: "verified"},
{Region: "US-ASHRAE", Identifier: "ASHRAE 62.1-2022 (Ventilation for Acceptable Indoor Air Quality)", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-13788", BatchID: "5a", Notes: "Machine tools safety — multi-spindle automatic turning machines.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13788:2002-04", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-13814", BatchID: "5a", Notes: "Amusement rides and amusement devices — safety.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13814:2005-06", Relation: "identical", Confidence: "verified"},
{Region: "US-ASTM", Identifier: "ASTM F2291-22 (Design of Amusement Rides and Devices)", Relation: "partial", Confidence: "high"},
{Region: "US-ASTM", Identifier: "ASTM F1193-23 (Quality, Manufacture, Use)", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-13852-2", BatchID: "5a", Notes: "Cranes — offshore cranes, floating cranes.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13852-2:2018-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-13870", BatchID: "5a", Notes: "Food processing machinery — portion cutting machines.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13870:2015-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-13898", BatchID: "5a", Notes: "Machine tools safety — sawing machines for cold metal.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 13898:2018-09", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI B11.10-2003 (R2018) (Metal Sawing Machines)", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-14043", BatchID: "5a", Notes: "High-rise aerial appliances for fire services — turntable ladders with combined movements.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 14043:2014-08", Relation: "identical", Confidence: "verified"},
{Region: "US-NFPA", Identifier: "NFPA 1901-2024 §13 (Aerial Apparatus)", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-14044", BatchID: "5a", Notes: "High-rise aerial appliances for fire services — turntable ladders with sequential movements.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 14044:2014-08", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-14070", BatchID: "5a", Notes: "Machine tools safety — transfer and special-purpose machines.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 14070:2009-04", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-14175-1", BatchID: "5a", Notes: "Fume cupboards — Part 1: vocabulary.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 14175-1:2003-08", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/AIHA Z9.5-2022 (Laboratory Ventilation)", Relation: "partial", Confidence: "high"},
{Region: "US-ASHRAE", Identifier: "ASHRAE 110-2016 (Method of Testing Performance of Laboratory Fume Hoods)", Relation: "partial", Confidence: "high"},
}},
}
}
@@ -0,0 +1,187 @@
package iace
// Cross-reference matrix — Batch 5b (next 50 alphabetical).
// Covers more fume cupboards (EN 14175), windows/doors (EN 14351), refuse
// collection vehicles (EN 1501), drilling/foundation (EN 16228), respiratory
// (EN 149), eye protection (EN 166), fire-service vehicles (EN 1846), and
// the start of the circular saw sub-series (EN 1870-x).
func init() {
registerCrossRefs(batch5bCrossRefs())
}
func batch5bCrossRefs() []NormCrossRef {
return []NormCrossRef{
{NormID: "EN-14175-2", BatchID: "5b", Notes: "Fume cupboards — Part 2: safety and performance requirements.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 14175-2:2003-08", Relation: "identical", Confidence: "verified"},
{Region: "US-ASHRAE", Identifier: "ASHRAE 110-2016", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-14175-3", BatchID: "5b", Notes: "Fume cupboards — Part 3: type test methods.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 14175-3:2019-02", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-14175-4", BatchID: "5b", Notes: "Fume cupboards — Part 4: on-site test methods.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 14175-4:2005-02", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-14175-7", BatchID: "5b", Notes: "Fume cupboards — Part 7: fume cupboards for high heat loads.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 14175-7:2012-08", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-14351-1", BatchID: "5b", Notes: "Windows and doors — product standard, performance characteristics, Part 1: windows and external pedestrian doorsets.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 14351-1:2016-12", Relation: "identical", Confidence: "verified"},
{Region: "US-AAMA", Identifier: "AAMA/WDMA/CSA 101/I.S.2/A440 (NAFS)", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-1459-2", BatchID: "5b", Notes: "Industrial trucks — variable-reach rough-terrain trucks, Part 2: rotating slewing trucks.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1459-2:2017-07", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/ITSDF B56.6", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-14618", BatchID: "5b", Notes: "Agglomerated stones — terminology and classification.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 14618:2009-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-14886", BatchID: "5b", Notes: "Plastics and rubber machines — band knife cutting machines.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 14886:2008-04", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-149", BatchID: "5b", Notes: "Respiratory protective devices — filtering half masks to protect against particles.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 149:2009-08", Relation: "identical", Confidence: "verified"},
{Region: "US-NIOSH", Identifier: "42 CFR Part 84 (NIOSH-approved N95/P100/R95)", Relation: "partial", Confidence: "high", Notes: "EN FFP2 ≈ N95, FFP3 ≈ N99; tests differ slightly (sodium chloride vs paraffin oil)."},
}},
{NormID: "EN-1493", BatchID: "5b", Notes: "Vehicle lifts — safety.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1493:2022-12", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/ALI ALCTV-2017 (Automotive Lifts — Safety Requirements for Construction)", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-14973", BatchID: "5b", Notes: "Conveyor belts for use in underground installations — electrical/flammability safety.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 14973:2015-12", Relation: "identical", Confidence: "verified"},
{Region: "US-MSHA", Identifier: "30 CFR §75.1108 (Approval of Conveyor Belts)", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-1501-1", BatchID: "5b", Notes: "Refuse collection vehicles — Part 1: rear-loaded refuse collection vehicles.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1501-1:2021-11", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI Z245.1-2017 (Mobile Wastes and Recyclable Materials Collection)", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-1501-2", BatchID: "5b", Notes: "Refuse collection vehicles — Part 2: side-loaded refuse collection vehicles.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1501-2:2022-04", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-1501-3", BatchID: "5b", Notes: "Refuse collection vehicles — Part 3: front-loaded refuse collection vehicles.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1501-3:2022-04", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-15056", BatchID: "5b", Notes: "Cranes — requirements for fork-arm attachments for industrial trucks.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 15056:2007-04", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-15163", BatchID: "5b", Notes: "Machines and plants for the exploitation and processing of natural stone — diamond wire saws.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 15163:2008-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-15288-1", BatchID: "5b", Notes: "Swimming pools — Part 1: safety requirements for design.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 15288-1:2019-04", Relation: "identical", Confidence: "verified"},
{Region: "US-APSP", Identifier: "ANSI/APSP/ICC-1 (Public Pools and Spas)", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-15947-1", BatchID: "5b", Notes: "Pyrotechnic articles — fireworks, category F2 and F3, Part 1: terminology.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 15947-1:2016-07", Relation: "identical", Confidence: "verified"},
{Region: "US-APA", Identifier: "APA 87-1A (Consumer Fireworks)", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-15947-2", BatchID: "5b", Notes: "Fireworks — Part 2: classification.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 15947-2:2016-07", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-15947-3", BatchID: "5b", Notes: "Fireworks — Part 3: minimum labelling requirements.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 15947-3:2016-07", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-15947-4", BatchID: "5b", Notes: "Fireworks — Part 4: test methods.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 15947-4:2016-07", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-15947-5", BatchID: "5b", Notes: "Fireworks — Part 5: requirements for construction and performance.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 15947-5:2022-09", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-1612-2", BatchID: "5b", Notes: "Plastics and rubber machines — reaction moulding machines, Part 2: dosing units.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1612-2:1999-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-16228-1", BatchID: "5b", Notes: "Drilling and foundation equipment — safety, Part 1: common requirements.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 16228-1:2014-08", Relation: "identical", Confidence: "verified"},
{Region: "US-OSHA", Identifier: "29 CFR 1926 Subpart P (Excavations)", Relation: "partial", Confidence: "medium"},
}},
{NormID: "EN-16228-2", BatchID: "5b", Notes: "Drilling and foundation equipment — Part 2: mobile drill rigs.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 16228-2:2014-08", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-16228-3", BatchID: "5b", Notes: "Drilling and foundation equipment — Part 3: horizontal directional drilling equipment.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 16228-3:2014-08", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-16228-4", BatchID: "5b", Notes: "Drilling and foundation equipment — Part 4: foundation equipment.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 16228-4:2014-08", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-16228-5", BatchID: "5b", Notes: "Drilling and foundation equipment — Part 5: diaphragm walling equipment.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 16228-5:2014-08", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-16228-6", BatchID: "5b", Notes: "Drilling and foundation equipment — Part 6: jetting, grouting and injection equipment.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 16228-6:2014-08", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-16228-7", BatchID: "5b", Notes: "Drilling and foundation equipment — Part 7: interchangeable auxiliary equipment.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 16228-7:2014-08", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-16450", BatchID: "5b", Notes: "Ambient air — automated measuring systems for the measurement of the concentration of particulate matter.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 16450:2017-05", Relation: "identical", Confidence: "verified"},
{Region: "US-EPA", Identifier: "40 CFR Part 50 Appendix L (PM2.5 Reference Method)", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-166", BatchID: "5b", Notes: "Personal eye protection — specifications.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 166:2002-04", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/ISEA Z87.1-2020 (Eye and Face Protection)", Relation: "partial", Confidence: "high", Notes: "EN 166 'B' impact = ANSI Z87+ basic impact; high-velocity tests differ."},
{Region: "US-OSHA", Identifier: "29 CFR 1910.133", Relation: "partial", Confidence: "high"},
{Region: "CN-GB", Identifier: "GB 14866-2006", Relation: "equivalent", Confidence: "high"},
}},
{NormID: "EN-16602", BatchID: "5b", Notes: "Space product assurance — series (ECSS Q-ST).", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 16602 series (ECSS adoptions)", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 14620 series", Relation: "partial", Confidence: "medium"},
}},
{NormID: "EN-1673", BatchID: "5b", Notes: "Food processing machinery — rotary rack ovens.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1673:2014-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-1674", BatchID: "5b", Notes: "Food processing machinery — dough sheeting machines.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1674:2014-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-16798-3", BatchID: "5b", Notes: "Energy performance of buildings — ventilation, Part 3: ventilation for non-residential buildings (replaces EN 13779).", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 16798-3:2017-11", Relation: "identical", Confidence: "verified"},
{Region: "US-ASHRAE", Identifier: "ASHRAE 62.1-2022", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-1845", BatchID: "5b", Notes: "Footwear manufacturing machinery — moulding machines.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1845:2007-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-1846-1", BatchID: "5b", Notes: "Fire-fighting vehicles and equipment — Part 1: nomenclature and designation.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1846-1:2011-04", Relation: "identical", Confidence: "verified"},
{Region: "US-NFPA", Identifier: "NFPA 1901-2024 (Automotive Fire Apparatus)", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-1846-2", BatchID: "5b", Notes: "Fire-fighting vehicles — Part 2: common requirements, safety and performance.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1846-2:2013-08", Relation: "identical", Confidence: "verified"},
{Region: "US-NFPA", Identifier: "NFPA 1901-2024", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-1846-3", BatchID: "5b", Notes: "Fire-fighting vehicles — Part 3: permanently-installed equipment, safety and performance.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1846-3:2021-08", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-1870-2", BatchID: "5b", Notes: "Safety of woodworking machines — circular sawing machines, Part 2: horizontal beam panel saws.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1870-2:2014-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-1870-10", BatchID: "5b", Notes: "Woodworking machines — circular sawing — Part 10: automatic and semi-automatic up-cutting cross-cut saws.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1870-10:2013-08", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-1870-11", BatchID: "5b", Notes: "Woodworking machines — circular sawing — Part 11: semi-automatic and automatic horizontal cross-cut saws (radial arm saws).", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1870-11:2013-08", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-1870-12", BatchID: "5b", Notes: "Woodworking machines — circular sawing — Part 12: pendulum cross-cut saws.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1870-12:2013-08", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-1870-13", BatchID: "5b", Notes: "Woodworking machines — circular sawing — Part 13: horizontal beam panel saws with pressure beam.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1870-13:2014-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-1870-14", BatchID: "5b", Notes: "Woodworking machines — circular sawing — Part 14: vertical panel saws.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1870-14:2013-08", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-1870-15", BatchID: "5b", Notes: "Woodworking machines — circular sawing — Part 15: multi-blade cross-cut saws with integrated feed of workpiece.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1870-15:2013-08", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-1870-16", BatchID: "5b", Notes: "Woodworking machines — circular sawing — Part 16: double mitre cross-cut sawing machines.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1870-16:2013-08", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-1870-17", BatchID: "5b", Notes: "Woodworking machines — circular sawing — Part 17: hand-operated horizontal cross-cut single-blade saws.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1870-17:2013-08", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-1870-18", BatchID: "5b", Notes: "Woodworking machines — circular sawing — Part 18: dividing saws.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1870-18:2013-08", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-1870-19", BatchID: "5b", Notes: "Woodworking machines — circular sawing — Part 19: circular table saws (with and without sliding table) and building site saws.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1870-19:2013-08", Relation: "identical", Confidence: "verified"},
}},
}
}
@@ -0,0 +1,199 @@
package iace
// Cross-reference matrix — Batch 6a (next 50 alphabetical).
// Covers remaining EN 1870 sawing parts, sterilizers (EN 285),
// hearing/eye/glove PPE (EN 352, EN 388), refrigeration parts (EN 378),
// road-building machines (EN 500), railway functional safety (EN 50126/8/9).
func init() {
registerCrossRefs(batch6aCrossRefs())
}
func batch6aCrossRefs() []NormCrossRef {
return []NormCrossRef{
{NormID: "EN-1870-3", BatchID: "6a", Notes: "Woodworking — circular saws, Part 3: down cutting cross-cut saws.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1870-3:2013-08", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-1870-4", BatchID: "6a", Notes: "Woodworking — circular saws, Part 4: multiblade rip saws.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1870-4:2013-08", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-1870-5", BatchID: "6a", Notes: "Woodworking — circular saws, Part 5: combined circular saw bench/up cutting cross-cut saws.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1870-5:2013-08", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-1870-6", BatchID: "6a", Notes: "Woodworking — circular saws, Part 6: circular saws for fire wood.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1870-6:2017-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-1870-7", BatchID: "6a", Notes: "Woodworking — circular saws, Part 7: single blade log circular sawing machines.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1870-7:2013-08", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-1870-8", BatchID: "6a", Notes: "Woodworking — circular saws, Part 8: single blade edging circular sawing machines.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1870-8:2013-08", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-1870-9", BatchID: "6a", Notes: "Woodworking — circular saws, Part 9: double blade circular sawing machines for cross-cutting.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1870-9:2013-08", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-1886", BatchID: "6a", Notes: "Ventilation for buildings — air handling units, mechanical performance.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1886:2008-07", Relation: "identical", Confidence: "verified"},
{Region: "US-AHRI", Identifier: "AHRI 410-2014 + ASHRAE 41 series", Relation: "partial", Confidence: "medium"},
}},
{NormID: "EN-1889-1", BatchID: "6a", Notes: "Mining machines — mobile underground machinery, Part 1: rubber-tyred machines.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1889-1:2011-09", Relation: "identical", Confidence: "verified"},
{Region: "US-OSHA", Identifier: "30 CFR (Mine Safety and Health)", Relation: "partial", Confidence: "medium"},
}},
{NormID: "EN-1889-2", BatchID: "6a", Notes: "Mining machines — mobile underground machinery, Part 2: rail locomotives.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1889-2:2011-09", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-1970", BatchID: "6a", Notes: "Adjustable beds for disabled persons (legacy; superseded by EN 60601-2-52).", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 1970:2000-09 (withdrawn)", Relation: "superseded_by", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "IEC 60601-2-52 (Medical Beds)", Relation: "supersedes", Confidence: "verified"},
}},
{NormID: "EN-203-1", BatchID: "6a", Notes: "Gas heated catering equipment — Part 1: general safety rules.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 203-1:2014-11", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI Z83.11 (Commercial Cooking Appliances)", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-285", BatchID: "6a", Notes: "Sterilization — steam sterilizers — large sterilizers.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 285:2016-07", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/AAMI ST79-2017 (Comprehensive Guide to Steam Sterilization)", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-30-1-1", BatchID: "6a", Notes: "Domestic cooking appliances burning gas — Part 1-1: safety, general.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 30-1-1:2008-12", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI Z21.1 (Household Cooking Gas Appliances)", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-30-1-4", BatchID: "6a", Notes: "Domestic gas cookers — Part 1-4: appliances having one or more burners with automatic burner control.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 30-1-4:2003-04", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-352-1", BatchID: "6a", Notes: "Hearing protectors — general requirements, Part 1: ear-muffs.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 352-1:2021-01", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/ASA S3.19-1974 (or S12.6-2016)", Relation: "partial", Confidence: "high", Notes: "US uses NRR (Noise Reduction Rating) computed differently than EN SNR/H/M/L."},
{Region: "US-OSHA", Identifier: "29 CFR 1910.95 + EPA 40 CFR 211 Subpart B", Relation: "partial", Confidence: "high"},
{Region: "CN-GB", Identifier: "GB/T 23466-2009", Relation: "equivalent", Confidence: "medium"},
}},
{NormID: "EN-352-2", BatchID: "6a", Notes: "Hearing protectors — Part 2: ear-plugs.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 352-2:2021-01", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/ASA S3.19-1974 / S12.6-2016", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-378-2", BatchID: "6a", Notes: "Refrigerating systems — Part 2: design, construction, testing, marking, documentation.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 378-2:2018-04", Relation: "identical", Confidence: "verified"},
{Region: "US-ASHRAE", Identifier: "ASHRAE 15-2022", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-378-3", BatchID: "6a", Notes: "Refrigerating systems — Part 3: installation site and personal protection.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 378-3:2018-04", Relation: "identical", Confidence: "verified"},
{Region: "US-ASHRAE", Identifier: "ASHRAE 15-2022", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-378-4", BatchID: "6a", Notes: "Refrigerating systems — Part 4: operation, maintenance, repair, recovery.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 378-4:2018-04", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-388", BatchID: "6a", Notes: "Protective gloves against mechanical risks.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 388:2019-03", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/ISEA 105-2016 (Hand Protection Selection Criteria)", Relation: "partial", Confidence: "high", Notes: "EN scoring 0-4/5 vs ANSI A1-A9 cut levels; revised 2019 EN added TDM-100 method."},
{Region: "CN-GB", Identifier: "GB/T 12624-2020", Relation: "equivalent", Confidence: "medium"},
}},
{NormID: "EN-45501", BatchID: "6a", Notes: "Metrological aspects of non-automatic weighing instruments.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 45501:2015-12", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "OIML R 76 (International Recommendation)", Relation: "identical", Confidence: "verified"},
{Region: "US-NIST", Identifier: "NIST Handbook 44 (Weights and Measures)", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-474-12", BatchID: "6a", Notes: "Earth-moving machinery — Part 12: cable excavators.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 474-12:2022-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-474-13", BatchID: "6a", Notes: "Earth-moving machinery — Part 13: rollers.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 474-13:2022-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-500-1", BatchID: "6a", Notes: "Mobile road construction machinery — safety, Part 1: common requirements.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 500-1:2009-04", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-500-2", BatchID: "6a", Notes: "Road construction — Part 2: road milling machines.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 500-2:2009-04", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-500-3", BatchID: "6a", Notes: "Road construction — Part 3: soil stabilisers and recycling machines.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 500-3:2009-04", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-500-4", BatchID: "6a", Notes: "Road construction — Part 4: compaction machines.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 500-4:2011-08", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-500-5", BatchID: "6a", Notes: "Road construction — Part 5: joint cutters.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 500-5:2009-04", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-500-6", BatchID: "6a", Notes: "Road construction — Part 6: pavers.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 500-6:2009-04", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-50126-1", BatchID: "6a", Notes: "Railway applications — RAMS (Reliability, Availability, Maintainability, Safety), Part 1: generic process.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 50126-1:2018-10 (VDE 0115-103-1)", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "IEC 62278:2002", Relation: "identical", Confidence: "verified"},
{Region: "US-AAR", Identifier: "AAR M-1003 (Manual of Standards & Recommended Practices)", Relation: "partial", Confidence: "medium"},
}},
{NormID: "EN-50128", BatchID: "6a", Notes: "Railway applications — software for railway control and protection systems.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 50128:2014-09 (VDE 0831-128)", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "IEC 62279:2015", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-50129", BatchID: "6a", Notes: "Railway applications — safety related electronic systems for signalling.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 50129:2019-06 (VDE 0831-129)", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "IEC 62425:2007", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-525", BatchID: "6a", Notes: "Non-domestic direct gas-fired forced convection air heaters.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 525:2010-01", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI Z83.4 (Direct-Fired Gas Heaters)", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-60335-2-67", BatchID: "6a", Notes: "Household and similar electrical appliances — particular requirements for floor treatment machines.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 60335-2-67:2019-04 (VDE 0700-67)", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "IEC 60335-2-67:2012", Relation: "identical", Confidence: "verified"},
{Region: "US-UL", Identifier: "UL 60335-2-67-2020", Relation: "equivalent", Confidence: "high"},
}},
{NormID: "EN-60335-2-68", BatchID: "6a", Notes: "Household appliances — particular requirements for spray extraction machines for commercial use.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 60335-2-68:2013-12 (VDE 0700-68)", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "IEC 60335-2-68:2012", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-60335-2-69", BatchID: "6a", Notes: "Household appliances — wet and dry vacuum cleaners, including power brush.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 60335-2-69:2017-08 (VDE 0700-69)", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "IEC 60335-2-69:2016", Relation: "identical", Confidence: "verified"},
{Region: "US-UL", Identifier: "UL 60335-2-69-2020", Relation: "equivalent", Confidence: "high"},
}},
{NormID: "EN-60335-2-72", BatchID: "6a", Notes: "Household appliances — automatic machines for floor treatment for commercial use.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 60335-2-72:2013-04 (VDE 0700-72)", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "IEC 60335-2-72:2012", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-60335-2-79", BatchID: "6a", Notes: "Household appliances — high-pressure cleaners and steam cleaners.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 60335-2-79:2020-08 (VDE 0700-79)", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "IEC 60335-2-79:2016", Relation: "identical", Confidence: "verified"},
{Region: "US-UL", Identifier: "UL 60335-2-79-2020", Relation: "equivalent", Confidence: "high"},
}},
{NormID: "EN-60974-2", BatchID: "6a", Notes: "Arc welding equipment — Part 2: liquid cooling systems.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 60974-2:2019-05 (VDE 0544-2)", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "IEC 60974-2:2019", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-60974-3", BatchID: "6a", Notes: "Arc welding equipment — Part 3: arc striking and stabilising devices.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 60974-3:2019-05 (VDE 0544-3)", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-60974-4", BatchID: "6a", Notes: "Arc welding equipment — Part 4: periodic inspection and testing.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 60974-4:2017-09 (VDE 0544-4)", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-60974-5", BatchID: "6a", Notes: "Arc welding equipment — Part 5: wire feeders.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 60974-5:2019-05 (VDE 0544-5)", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-60974-6", BatchID: "6a", Notes: "Arc welding equipment — Part 6: limited-duty equipment.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 60974-6:2017-04 (VDE 0544-6)", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-60974-7", BatchID: "6a", Notes: "Arc welding equipment — Part 7: torches.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 60974-7:2019-05 (VDE 0544-7)", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-60974-8", BatchID: "6a", Notes: "Arc welding equipment — Part 8: gas consoles for welding and plasma cutting systems.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 60974-8:2010-03 (VDE 0544-8)", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-60974-9", BatchID: "6a", Notes: "Arc welding equipment — Part 9: installation and use.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 60974-9:2018-08 (VDE 0544-9)", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI Z49.1-2021 (Safety in Welding)", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-60974-10", BatchID: "6a", Notes: "Arc welding equipment — Part 10: EMC requirements.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 60974-10:2020-09 (VDE 0544-10)", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-60974-11", BatchID: "6a", Notes: "Arc welding equipment — Part 11: electrode holders.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 60974-11:2010-12 (VDE 0544-11)", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-60974-12", BatchID: "6a", Notes: "Arc welding equipment — Part 12: coupling devices for welding cables.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 60974-12:2012-09 (VDE 0544-12)", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-60974-13", BatchID: "6a", Notes: "Arc welding equipment — Part 13: welding clamp.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 60974-13:2013-06 (VDE 0544-13)", Relation: "identical", Confidence: "verified"},
}},
}
}
@@ -0,0 +1,186 @@
package iace
// Cross-reference matrix — Batch 6b (next 50 alphabetical).
// Covers EN 60974-14 welding, EN 81 lift sub-parts, more woodworking
// (EN 848-2/3, EN 859, EN 860, EN 930, EN 931, EN 940, EN 972), gas cylinders
// (EN ISO 10297), industrial laundry (EN ISO 10472), hand tools, and PPE.
func init() {
registerCrossRefs(batch6bCrossRefs())
}
func batch6bCrossRefs() []NormCrossRef {
return []NormCrossRef{
{NormID: "EN-60974-14", BatchID: "6b", Notes: "Arc welding equipment — Part 14: calibration, validation and consistency testing.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 60974-14:2018-12 (VDE 0544-14)", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-81-21", BatchID: "6b", Notes: "Safety rules for the construction and installation of lifts — Part 21: new passenger and goods passenger lifts in existing buildings.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 81-21:2022-12", Relation: "identical", Confidence: "verified"},
{Region: "US-ASME", Identifier: "ASME A17.1-2022 (general)", Relation: "partial", Confidence: "medium"},
}},
{NormID: "EN-81-22", BatchID: "6b", Notes: "Safety rules for lifts — Part 22: electric lifts with inclined path.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 81-22:2022-12", Relation: "identical", Confidence: "verified"},
{Region: "US-ASME", Identifier: "ASME A17.1 §5 (Inclined Elevators)", Relation: "partial", Confidence: "medium"},
}},
{NormID: "EN-81-28", BatchID: "6b", Notes: "Safety rules for lifts — Part 28: remote alarm on passenger and goods passenger lifts.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 81-28:2022-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-81-58", BatchID: "6b", Notes: "Safety rules for lifts — Part 58: landing doors fire resistance test.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 81-58:2022-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-81-71", BatchID: "6b", Notes: "Safety rules for lifts — Part 71: vandal-resistant lifts.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 81-71:2022-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-81-72", BatchID: "6b", Notes: "Safety rules for lifts — Part 72: firefighters lifts.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 81-72:2020-09", Relation: "identical", Confidence: "verified"},
{Region: "US-ASME", Identifier: "ASME A17.1 §2.27 (Firefighters Operation)", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-81-73", BatchID: "6b", Notes: "Safety rules for lifts — Part 73: behaviour of lifts in the event of fire.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 81-73:2020-09", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-81-76", BatchID: "6b", Notes: "Safety rules for lifts — Part 76: evacuation of persons with disabilities using lifts.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 81-76:2011-08", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-81-77", BatchID: "6b", Notes: "Safety rules for lifts — Part 77: lifts subject to seismic conditions.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 81-77:2018-08", Relation: "identical", Confidence: "verified"},
{Region: "US-ASME", Identifier: "ASME A17.1 §8.4 (Elevator Safety Requirements for Seismic Risk)", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-81-80", BatchID: "6b", Notes: "Safety rules for lifts — Part 80: improvement of safety of existing passenger and goods passenger lifts (SNEL).", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 81-80:2020-09", Relation: "identical", Confidence: "verified"},
{Region: "US-ASME", Identifier: "ASME A17.3 (Safety Code for Existing Elevators)", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-81-82", BatchID: "6b", Notes: "Safety rules for lifts — Part 82: rules for the improvement of accessibility of existing lifts.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 81-82:2013-09", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-848-2", BatchID: "6b", Notes: "Woodworking — Part 2: single-spindle hand-fed routing machines.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 848-2:2014-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-848-3", BatchID: "6b", Notes: "Woodworking — Part 3: numerically controlled (NC) boring/routing machines.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 848-3:2013-08", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-859", BatchID: "6b", Notes: "Woodworking — hand-fed surface planing machines.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 859:2014-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-860", BatchID: "6b", Notes: "Woodworking — single-side thickness planing machines.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 860:2014-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-930", BatchID: "6b", Notes: "Footwear, leather goods manufacturing machinery — roughing, scouring machines.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 930:2008-09", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-931", BatchID: "6b", Notes: "Footwear manufacturing machinery — lasting machines.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 931:2007-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-940", BatchID: "6b", Notes: "Woodworking — combined woodworking machines.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 940:2014-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-972", BatchID: "6b", Notes: "Tannery machines — reciprocating roller machines.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 972:2010-09", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-ISO-10297", BatchID: "6b", Notes: "Gas cylinders — refillable transportable cylinder valves.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 10297:2014-04", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 10297:2014", Relation: "identical", Confidence: "verified"},
{Region: "US-DOT", Identifier: "49 CFR Part 178 (Specifications for Packagings)", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-ISO-10472-1", BatchID: "6b", Notes: "Industrial laundry machinery — common requirements.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 10472-1:2008-08", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 10472-1:1997", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-ISO-10472-2", BatchID: "6b", Notes: "Industrial laundry — washing machines and washer-extractors.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 10472-2:2008-08", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 10472-2:1997", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-ISO-10472-3", BatchID: "6b", Notes: "Industrial laundry — washing tunnel lines.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 10472-3:2008-08", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-ISO-10472-4", BatchID: "6b", Notes: "Industrial laundry — air dryers.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 10472-4:2008-08", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-ISO-10472-5", BatchID: "6b", Notes: "Industrial laundry — flatwork ironers, feeders and folders.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 10472-5:2008-08", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-ISO-10472-6", BatchID: "6b", Notes: "Industrial laundry — ironing and fusing presses.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 10472-6:2008-08", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-ISO-11148-2", BatchID: "6b", Notes: "Hand-held non-electric power tools — Part 2: cutting-off and crimping tools.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 11148-2:2011-11", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 11148-2:2011", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-ISO-11148-4", BatchID: "6b", Notes: "Hand-held non-electric power tools — Part 4: non-rotary percussive power tools.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 11148-4:2013-08", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-ISO-11148-5", BatchID: "6b", Notes: "Hand-held non-electric power tools — Part 5: rotary percussive drills.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 11148-5:2013-08", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-ISO-11148-7", BatchID: "6b", Notes: "Hand-held non-electric power tools — Part 7: grinders.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 11148-7:2012-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-ISO-11148-8", BatchID: "6b", Notes: "Hand-held non-electric power tools — Part 8: sanders and polishers.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 11148-8:2013-08", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-ISO-11148-9", BatchID: "6b", Notes: "Hand-held non-electric power tools — Part 9: die grinders.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 11148-9:2012-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-ISO-11148-11", BatchID: "6b", Notes: "Hand-held non-electric power tools — Part 11: nibblers and shears.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 11148-11:2013-08", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-ISO-11148-12", BatchID: "6b", Notes: "Hand-held non-electric power tools — Part 12: small reciprocating and oscillating saws.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 11148-12:2013-08", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-ISO-11607-1", BatchID: "6b", Notes: "Packaging for terminally sterilized medical devices — Part 1: requirements for materials, sterile barrier systems and packaging.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 11607-1:2020-09", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 11607-1:2019", Relation: "identical", Confidence: "verified"},
{Region: "US-FDA", Identifier: "21 CFR 820 + ASTM F88/F1980", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-ISO-11607-2", BatchID: "6b", Notes: "Packaging for medical devices — Part 2: validation requirements for forming, sealing and assembly processes.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 11607-2:2020-09", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 11607-2:2019", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-ISO-11612", BatchID: "6b", Notes: "Protective clothing — clothing to protect against heat and flame.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 11612:2015-11", Relation: "identical", Confidence: "verified"},
{Region: "US-NFPA", Identifier: "NFPA 2112-2018 (Flame-Resistant Garments for Protection of Industrial Personnel)", Relation: "partial", Confidence: "high"},
{Region: "US-ASTM", Identifier: "ASTM F1959 (Determining Arc Rating)", Relation: "partial", Confidence: "medium"},
}},
{NormID: "EN-ISO-11806-1", BatchID: "6b", Notes: "Agricultural and forestry machinery — safety requirements and testing for portable, hand-held, internal combustion engine driven brush cutters and grass trimmers.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 11806-1:2012-04", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/OPEI B175.3 (Grass Trimmers/Brush Cutters)", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-ISO-13688", BatchID: "6b", Notes: "Protective clothing — general requirements.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 13688:2013-08", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 13688:2013", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/ISEA 101 (Limited-Use and Disposable Coveralls)", Relation: "partial", Confidence: "medium"},
}},
{NormID: "EN-ISO-14159", BatchID: "6b", Notes: "Safety of machinery — hygiene requirements for the design of machinery.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 14159:2008-07", Relation: "identical", Confidence: "verified"},
{Region: "US-NSF", Identifier: "NSF/ANSI/3-A 14159-1 (Hygienic Equipment for Food Processing)", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-ISO-14890", BatchID: "6b", Notes: "Conveyor belts — specification for rubber- or plastics-covered conveyor belts of textile construction.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 14890:2013-12", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 14890:2013", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-ISO-14922-1", BatchID: "6b", Notes: "Thermal spraying — quality requirements of thermally sprayed structures, Part 1: guide for selection.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 14922-1:2019-11", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-ISO-14922-2", BatchID: "6b", Notes: "Thermal spraying — Part 2: comprehensive quality requirements.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 14922-2:2019-11", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-ISO-14922-3", BatchID: "6b", Notes: "Thermal spraying — Part 3: standard quality requirements.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 14922-3:2019-11", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-ISO-14922-4", BatchID: "6b", Notes: "Thermal spraying — Part 4: elementary quality requirements.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 14922-4:2019-11", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-ISO-16063-1", BatchID: "6b", Notes: "Methods for the calibration of vibration and shock transducers — Part 1: basic concepts.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 16063-1:1999-04", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 16063-1:1998", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-ISO-17665-1", BatchID: "6b", Notes: "Sterilization of health care products — moist heat — Part 1: requirements for the development, validation and routine control of a sterilization process for medical devices.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 17665-1:2006-11", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 17665-1:2006", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/AAMI ST79-2017", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-ISO-19085-10", BatchID: "6b", Notes: "Woodworking machines safety — Part 10: building site saws.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 19085-10:2019-07", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 19085-10:2018", Relation: "identical", Confidence: "verified"},
}},
}
}
@@ -0,0 +1,150 @@
package iace
// Cross-reference matrix — Batch 7a (final batch, first 36 entries).
// Covers remaining woodworking (EN ISO 19085), safety footwear (EN ISO 20345),
// stationary fitness (EN ISO 20957), additive manufacturing terminology
// (EN ISO 52900), lawnmowers (EN ISO 5395), uniaxial testing machines (EN ISO
// 7500), and additional safety valves (EN ISO 4126 parts).
func init() {
registerCrossRefs(batch7aCrossRefs())
}
func batch7aCrossRefs() []NormCrossRef {
return []NormCrossRef{
{NormID: "EN-ISO-19085-2", BatchID: "7a", Notes: "Woodworking machines — Part 2: horizontal beam panel circular sawing machines.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 19085-2:2018-04", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 19085-2:2017", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-ISO-19085-3", BatchID: "7a", Notes: "Woodworking machines — Part 3: numerically controlled boring and routing machines.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 19085-3:2018-04", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 19085-3:2017", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-ISO-19085-4", BatchID: "7a", Notes: "Woodworking machines — Part 4: vertical panel circular sawing machines.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 19085-4:2018-04", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-ISO-19085-6", BatchID: "7a", Notes: "Woodworking machines — Part 6: single-spindle vertical moulding machines.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 19085-6:2019-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-ISO-19085-7", BatchID: "7a", Notes: "Woodworking machines — Part 7: surface planing machines.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 19085-7:2019-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-ISO-19085-8", BatchID: "7a", Notes: "Woodworking machines — Part 8: rebating, calibrating sanding machines and edge sanding machines.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 19085-8:2017-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-ISO-19085-9", BatchID: "7a", Notes: "Woodworking machines — Part 9: circular sawing machines (with sliding table).", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 19085-9:2021-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-ISO-19085-11", BatchID: "7a", Notes: "Woodworking machines — Part 11: combined machines.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 19085-11:2020-08", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-ISO-19085-12", BatchID: "7a", Notes: "Woodworking machines — Part 12: tenoning/profiling machines.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 19085-12:2021-08", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-ISO-20345", BatchID: "7a", Notes: "Personal protective equipment — safety footwear.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 20345:2022-08", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 20345:2021", Relation: "identical", Confidence: "verified"},
{Region: "US-ASTM", Identifier: "ASTM F2413-18 (Performance Requirements for Protective Footwear)", Relation: "partial", Confidence: "high", Notes: "EN S1/S2/S3 ≈ ASTM safety class but tests differ in impact (200J vs 75 ft-lb)."},
{Region: "US-OSHA", Identifier: "29 CFR 1910.136", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-ISO-20346", BatchID: "7a", Notes: "Personal protective equipment — protective footwear (lower-spec category).", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 20346:2014-09", Relation: "identical", Confidence: "verified"},
{Region: "US-ASTM", Identifier: "ASTM F2413-18", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-ISO-20957-1", BatchID: "7a", Notes: "Stationary training equipment — Part 1: general safety requirements and test methods.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 20957-1:2014-04", Relation: "identical", Confidence: "verified"},
{Region: "US-ASTM", Identifier: "ASTM F2276-19 (Strength and Conditioning Equipment)", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-ISO-20957-4", BatchID: "7a", Notes: "Stationary training — Part 4: strength training benches.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 20957-4:2017-08", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-ISO-20957-5", BatchID: "7a", Notes: "Stationary training — Part 5: stationary exercise bicycles and upper body crank training equipment.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 20957-5:2016-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-ISO-20957-6", BatchID: "7a", Notes: "Stationary training — Part 6: treadmills.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 20957-6:2020-04", Relation: "identical", Confidence: "verified"},
{Region: "US-ASTM", Identifier: "ASTM F2115-14 (Motorized Treadmills)", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-ISO-20957-9", BatchID: "7a", Notes: "Stationary training — Part 9: elliptical trainers.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 20957-9:2017-08", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-ISO-20957-10", BatchID: "7a", Notes: "Stationary training — Part 10: exercise bicycles with a fixed wheel or without freewheel.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 20957-10:2017-08", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-ISO-21530", BatchID: "7a", Notes: "Dentistry — materials used for dental equipment surfaces — determination of resistance to chemical disinfectants.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 21530:2005-04", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-ISO-22434", BatchID: "7a", Notes: "Transportable gas cylinders — inspection and maintenance of cylinder valves.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 22434:2011-04", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-ISO-283", BatchID: "7a", Notes: "Textile conveyor belts — full thickness tensile strength, elongation at break and elongation at the reference load.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 283:2015-12", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 283:2015", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-ISO-340", BatchID: "7a", Notes: "Conveyor belts — laboratory scale flammability characteristics — requirements and test method.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 340:2013-12", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 340:2013", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-ISO-3691-2", BatchID: "7a", Notes: "Industrial trucks — safety, Part 2: self-propelled variable-reach trucks.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 3691-2:2017-04", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 3691-2:2016", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/ITSDF B56.6-2016 (Rough Terrain Trucks)", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-ISO-4126-2", BatchID: "7a", Notes: "Safety devices for protection against excessive pressure — Part 2: bursting disc safety devices.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 4126-2:2019-02", Relation: "identical", Confidence: "verified"},
{Region: "US-ASME", Identifier: "ASME BPVC Section VIII Div.1 §UG-127", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-ISO-4126-3", BatchID: "7a", Notes: "Safety devices — Part 3: safety valves and bursting disc safety devices in combination.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 4126-3:2019-02", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-ISO-4126-5", BatchID: "7a", Notes: "Safety devices — Part 5: controlled safety pressure relief systems (CSPRS).", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 4126-5:2014-08", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-ISO-4126-6", BatchID: "7a", Notes: "Safety devices — Part 6: application, selection and installation of bursting disc safety devices.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 4126-6:2019-02", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-ISO-4126-7", BatchID: "7a", Notes: "Safety devices — Part 7: common data.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 4126-7:2014-08", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-ISO-52900", BatchID: "7a", Notes: "Additive manufacturing — general principles — terminology.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO/ASTM 52900:2022-03", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO/ASTM 52900:2021", Relation: "identical", Confidence: "verified"},
{Region: "US-ASTM", Identifier: "ASTM F52900-21", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-ISO-52901", BatchID: "7a", Notes: "Additive manufacturing — requirements for purchased AM parts.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO/ASTM 52901:2017-07", Relation: "identical", Confidence: "verified"},
{Region: "US-ASTM", Identifier: "ASTM F52901-17", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-ISO-52910", BatchID: "7a", Notes: "Additive manufacturing — design — requirements, guidelines, and recommendations.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO/ASTM 52910:2019-04", Relation: "identical", Confidence: "verified"},
{Region: "US-ASTM", Identifier: "ASTM F52910-18", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-ISO-5344", BatchID: "7a", Notes: "Mechanical vibration — electrodynamic vibration generating systems — performance characteristics.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 5344:2018-08", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-ISO-5395-1", BatchID: "7a", Notes: "Garden equipment — safety requirements for internal combustion engine-powered lawnmowers — Part 1: terminology and common tests.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 5395-1:2014-04", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 5395-1:2013", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/OPEI B71.1-2017 (Consumer Turf Care Equipment)", Relation: "partial", Confidence: "high"},
{Region: "US-CPSC", Identifier: "16 CFR 1205 (Walk-Behind Power Mowers)", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-ISO-5395-3", BatchID: "7a", Notes: "Lawnmowers — Part 3: ride-on lawnmowers with seated operator.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 5395-3:2014-04", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/OPEI B71.4 (Commercial Turf Care Equipment)", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-ISO-7494-1", BatchID: "7a", Notes: "Dentistry — dental units — Part 1: general requirements and test methods.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 7494-1:2019-12", Relation: "identical", Confidence: "verified"},
{Region: "US-FDA", Identifier: "21 CFR 872 (Dental Devices)", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-ISO-7494-2", BatchID: "7a", Notes: "Dentistry — Part 2: water and air supply.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 7494-2:2016-04", Relation: "identical", Confidence: "verified"},
}},
{NormID: "EN-ISO-7500-1", BatchID: "7a", Notes: "Metallic materials — calibration and verification of static uniaxial testing machines — Part 1: tension/compression testing machines.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 7500-1:2018-06", Relation: "identical", Confidence: "verified"},
{Region: "US-ASTM", Identifier: "ASTM E4-21 (Force Verification of Testing Machines)", Relation: "partial", Confidence: "high"},
}},
{NormID: "EN-ISO-7500-2", BatchID: "7a", Notes: "Uniaxial testing machines — Part 2: tensile creep testing machines.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 7500-2:2006-07", Relation: "identical", Confidence: "verified"},
}},
}
}
@@ -0,0 +1,147 @@
package iace
// Cross-reference matrix — Batch 7b (final batch, last 35 entries).
// Covers medical electrical equipment (IEC 60601 family — major US adoption
// ANSI/AAMI ES60601), chainsaws (ISO 11681), machine tools sawing (ISO 16093),
// acoustics determination methods (ISO 3743/3745/3747), and remaining
// agricultural machinery (ISO 4254 parts).
func init() {
registerCrossRefs(batch7bCrossRefs())
}
func batch7bCrossRefs() []NormCrossRef {
return []NormCrossRef{
{NormID: "IEC-60601-1", BatchID: "7b", Notes: "Medical electrical equipment — general requirements for basic safety and essential performance.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 60601-1:2013-12 (VDE 0750-1)", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "IEC 60601-1:2005+AMD1:2012+AMD2:2020", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/AAMI ES60601-1:2005/(R)2012+A1+A2", Relation: "identical", Confidence: "verified"},
{Region: "US-UL", Identifier: "UL 60601-1 (legacy edition)", Relation: "superseded_by", Confidence: "verified"},
{Region: "CN-GB", Identifier: "GB 9706.1-2020", Relation: "equivalent", Confidence: "high"},
{Region: "JP-JIS", Identifier: "JIS T 0601-1:2017", Relation: "equivalent", Confidence: "high"},
}},
{NormID: "IEC-60601-1-2", BatchID: "7b", Notes: "Medical electrical equipment — EMC requirements.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 60601-1-2:2016-05 (VDE 0750-1-2)", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "IEC 60601-1-2:2014+AMD1:2020", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/AAMI/IEC 60601-1-2:2014+A1:2021", Relation: "identical", Confidence: "verified"},
}},
{NormID: "IEC-60601-1-6", BatchID: "7b", Notes: "Medical electrical equipment — usability.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 60601-1-6:2015-08", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/AAMI HE75:2009/(R)2018 (Human Factors Engineering)", Relation: "partial", Confidence: "high"},
}},
{NormID: "IEC-60601-1-8", BatchID: "7b", Notes: "Medical electrical equipment — alarm systems.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 60601-1-8:2007-10", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "IEC 60601-1-8:2006+AMD1:2012+AMD2:2020", Relation: "identical", Confidence: "verified"},
}},
{NormID: "IEC-60601-1-9", BatchID: "7b", Notes: "Medical electrical equipment — environmentally conscious design.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 60601-1-9:2014-06", Relation: "identical", Confidence: "verified"},
}},
{NormID: "IEC-60601-1-10", BatchID: "7b", Notes: "Medical electrical equipment — physiologic closed-loop controllers.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 60601-1-10:2014-06", Relation: "identical", Confidence: "verified"},
}},
{NormID: "IEC-60601-1-11", BatchID: "7b", Notes: "Medical electrical equipment — home healthcare environment.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 60601-1-11:2015-08", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "IEC 60601-1-11:2015", Relation: "identical", Confidence: "verified"},
}},
{NormID: "IEC-60601-2-2", BatchID: "7b", Notes: "Medical equipment — particular requirements for HF surgical equipment.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 60601-2-2:2018-12", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/AAMI HF18-2009", Relation: "partial", Confidence: "high"},
}},
{NormID: "IEC-60601-2-4", BatchID: "7b", Notes: "Medical equipment — particular requirements for cardiac defibrillators.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 60601-2-4:2019-04", Relation: "identical", Confidence: "verified"},
}},
{NormID: "IEC-60601-2-10", BatchID: "7b", Notes: "Medical equipment — nerve and muscle stimulators.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 60601-2-10:2017-04", Relation: "identical", Confidence: "verified"},
}},
{NormID: "IEC-60601-2-16", BatchID: "7b", Notes: "Medical equipment — haemodialysis equipment.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 60601-2-16:2019-04", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/AAMI RD52 (Hemodialysis Systems)", Relation: "partial", Confidence: "high"},
}},
{NormID: "IEC-60601-2-22", BatchID: "7b", Notes: "Medical equipment — laser equipment.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 60601-2-22:2013-10", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI Z136.3 (Lasers in Health Care)", Relation: "partial", Confidence: "high"},
}},
{NormID: "IEC-60601-2-25", BatchID: "7b", Notes: "Medical equipment — electrocardiographs.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 60601-2-25:2015-11", Relation: "identical", Confidence: "verified"},
}},
{NormID: "IEC-60601-2-27", BatchID: "7b", Notes: "Medical equipment — electrocardiographic monitoring equipment.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 60601-2-27:2015-09", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/AAMI EC13 (Cardiac Monitors, Heart Rate Meters, and Alarms)", Relation: "partial", Confidence: "high"},
}},
{NormID: "IEC-60601-2-34", BatchID: "7b", Notes: "Medical equipment — invasive blood-pressure monitoring equipment.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 60601-2-34:2014-11", Relation: "identical", Confidence: "verified"},
}},
{NormID: "IEC-60601-2-37", BatchID: "7b", Notes: "Medical equipment — ultrasonic medical diagnostic and monitoring equipment.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 60601-2-37:2016-08", Relation: "identical", Confidence: "verified"},
}},
{NormID: "IEC-60601-2-44", BatchID: "7b", Notes: "Medical equipment — X-ray equipment for computed tomography.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 60601-2-44:2017-04", Relation: "identical", Confidence: "verified"},
{Region: "US-FDA", Identifier: "21 CFR 1020.33 (Computed Tomography Equipment)", Relation: "partial", Confidence: "high"},
}},
{NormID: "IEC-60601-2-46", BatchID: "7b", Notes: "Medical equipment — operating tables.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 60601-2-46:2017-04", Relation: "identical", Confidence: "verified"},
}},
{NormID: "IEC-60601-2-52", BatchID: "7b", Notes: "Medical equipment — medical beds.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN 60601-2-52:2015-09", Relation: "identical", Confidence: "verified"},
}},
{NormID: "ISO-11681-1", BatchID: "7b", Notes: "Forestry machinery — portable chain-saw safety, Part 1: chain-saws for forest service.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 11681-1:2011-11", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 11681-1:2011", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/OPEI B175.1-2012 (Chain Saws)", Relation: "partial", Confidence: "high"},
}},
{NormID: "ISO-11681-2", BatchID: "7b", Notes: "Forestry machinery — portable chain-saws, Part 2: chain-saws for tree service.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 11681-2:2011-11", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/OPEI B175.1-2012", Relation: "partial", Confidence: "high"},
}},
{NormID: "ISO-16093", BatchID: "7b", Notes: "Machine tools safety — sawing machines for cold metal.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 16093:2018-09", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 16093:2017", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI B11.10-2003 (R2018) (Metal Sawing Machines)", Relation: "partial", Confidence: "high"},
}},
{NormID: "ISO-3743-1", BatchID: "7b", Notes: "Acoustics — sound power levels — engineering methods for small, movable sources in reverberant fields.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 3743-1:2011-04", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 3743-1:2010", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI S12.51-2002 (R2017)", Relation: "equivalent", Confidence: "high"},
}},
{NormID: "ISO-3743-2", BatchID: "7b", Notes: "Acoustics — sound power, Part 2: methods for special reverberation test rooms.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 3743-2:2018-12", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI S12.53-1999 (R2019)", Relation: "equivalent", Confidence: "high"},
}},
{NormID: "ISO-3745", BatchID: "7b", Notes: "Acoustics — sound power levels — precision methods for anechoic and hemi-anechoic rooms.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 3745:2017-06", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 3745:2012+A1:2017", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI S12.55-2012", Relation: "equivalent", Confidence: "high"},
}},
{NormID: "ISO-3747", BatchID: "7b", Notes: "Acoustics — sound power levels — survey method using reference sound source.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 3747:2011-03", Relation: "identical", Confidence: "verified"},
{Region: "INTL-ISO", Identifier: "ISO 3747:2010", Relation: "identical", Confidence: "verified"},
}},
{NormID: "ISO-4254-2", BatchID: "7b", Notes: "Agricultural machinery — safety, Part 2: anhydrous ammonia applicators.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 4254-2:2010-09", Relation: "identical", Confidence: "verified"},
{Region: "US-ANSI", Identifier: "ANSI/ASABE S390.5", Relation: "partial", Confidence: "high"},
}},
{NormID: "ISO-4254-3", BatchID: "7b", Notes: "Agricultural machinery — safety, Part 3: tractors.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 4254-3:2010-09", Relation: "identical", Confidence: "verified"},
{Region: "US-OSHA", Identifier: "29 CFR 1928.51 (Roll-Over Protective Structures)", Relation: "partial", Confidence: "high"},
{Region: "CN-GB", Identifier: "GB 10395.3-2006", Relation: "equivalent", Confidence: "high"},
}},
{NormID: "ISO-4254-4", BatchID: "7b", Notes: "Agricultural machinery — Part 4: forage handling.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 4254-4:2010-09", Relation: "identical", Confidence: "verified"},
}},
{NormID: "ISO-4254-8", BatchID: "7b", Notes: "Agricultural machinery — Part 8: solid fertilizer distributors.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 4254-8:2018-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "ISO-4254-9", BatchID: "7b", Notes: "Agricultural machinery — Part 9: seed drills.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 4254-9:2018-12", Relation: "identical", Confidence: "verified"},
}},
{NormID: "ISO-4254-10", BatchID: "7b", Notes: "Agricultural machinery — Part 10: rotary tedders and rakes.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 4254-10:2010-04", Relation: "identical", Confidence: "verified"},
}},
{NormID: "ISO-4254-11", BatchID: "7b", Notes: "Agricultural machinery — Part 11: pick-up balers.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 4254-11:2010-04", Relation: "identical", Confidence: "verified"},
}},
{NormID: "ISO-4254-13", BatchID: "7b", Notes: "Agricultural machinery — Part 13: large rotary mowers.", Mappings: []NormMapping{
{Region: "EU-DIN", Identifier: "DIN EN ISO 4254-13:2012-04", Relation: "identical", Confidence: "verified"},
}},
}
}
@@ -0,0 +1,159 @@
package iace
import (
"fmt"
"sort"
"strings"
)
// RenderCrossRefAppendix builds a Markdown appendix for a tech-file section
// that lists the international equivalents of the given norm IDs. It is
// intended to be appended to the "Applied Harmonised Standards" section so
// the same tech file is usable for CE + US/CN/JP market submissions.
//
// Output format:
//
// ## Anhang: Internationale Aequivalenzen / International Cross-Reference
//
// Diese Tabelle ordnet die in dieser technischen Dokumentation angewandten
// EU-Normen den Pendants in anderen Maerkten zu. Die Spalte "Relation" gibt
// an, ob es sich um eine identische Uebernahme, eine teilweise Ueberdeckung
// oder ein abgeloestes (superseded_by) Dokument handelt. Vor Nutzung im
// jeweiligen Marktraum durch eine sachkundige Person verifizieren.
//
// | EU Norm | Region | International Identifier | Relation | Confidence |
// |---------|--------|--------------------------|----------|------------|
// ...
//
// If no norms have crossref entries, returns an empty string so the caller
// can skip the appendix entirely.
func RenderCrossRefAppendix(normIDs []string) string {
rows := collectCrossRefRows(normIDs)
if len(rows) == 0 {
return ""
}
var b strings.Builder
b.WriteString("\n\n## Anhang: Internationale Aequivalenzen / International Cross-Reference\n\n")
b.WriteString("Diese Tabelle ordnet die in dieser technischen Dokumentation angewandten EU-Normen den Pendants in anderen Maerkten zu (DIN, ANSI/NFPA/UL/OSHA, GB, JIS u.a.). Die Spalte ")
b.WriteString("**Relation** kennzeichnet `identical` (wortgleiche Uebernahme), `equivalent` (Kompatibilitaet auf Verfahrensebene), ")
b.WriteString("`partial` (Teilueberdeckung — vor Nutzung pruefen), `supersedes`/`superseded_by` (Ablaufverhaeltnis). ")
b.WriteString("Die Spalte **Confidence** drueckt die intern hinterlegte Verlaesslichkeit der Zuordnung aus. ")
b.WriteString("Vor Verwendung in einem Drittmarkt durch eine sachkundige Person verifizieren.\n\n")
b.WriteString("| EU Norm (verwendet) | Region | International Identifier | Relation | Confidence | Hinweis |\n")
b.WriteString("|---------------------|--------|--------------------------|----------|------------|---------|\n")
for _, row := range rows {
note := row.Notes
if note == "" {
note = "—"
}
// Escape pipes in identifier and note for markdown table safety.
fmt.Fprintf(&b,
"| %s | %s | %s | %s | %s | %s |\n",
escapeCell(row.SourceNorm),
escapeCell(row.Region),
escapeCell(row.Identifier),
escapeCell(row.Relation),
escapeCell(row.Confidence),
escapeCell(note),
)
}
b.WriteString("\n*Quelle: BreakPilot Cross-Reference Matrix. Keine Originalnormtexte reproduziert — nur Identifikatoren. Stand: Bezugsperiode der jeweiligen Norm-Bibliothek.*\n")
return b.String()
}
// crossRefRow is a flattened row of the matrix used by the renderer.
type crossRefRow struct {
SourceNorm string
Region string
Identifier string
Relation string
Confidence string
Notes string
}
// collectCrossRefRows expands the per-norm mapping list into a sorted slice
// of rows. Sort order: source norm ID first, then region in a canonical
// regional order so EU markets appear before non-EU.
func collectCrossRefRows(normIDs []string) []crossRefRow {
regionRank := map[string]int{
"EU-DIN": 0,
"INTL-ISO": 1,
"US-ANSI": 2,
"US-NFPA": 3,
"US-UL": 4,
"US-OSHA": 5,
"US-ASME": 6,
"US-ASTM": 7,
"US-SAE": 8,
"US-NIOSH": 9,
"US-FDA": 10,
"US-EPA": 11,
"US-NEMA": 12,
"US-NSF": 13,
"US-API": 14,
"US-CPSC": 15,
"US-AHRI": 16,
"US-ASHRAE": 17,
"US-FCC": 18,
"US-DOT": 19,
"US-MSHA": 20,
"US-FM": 21,
"US-AAR": 22,
"US-ACI": 23,
"US-ADA": 24,
"US-AAMA": 25,
"US-APA": 26,
"US-APSP": 27,
"US-EJMA": 28,
"US-ICC": 29,
"US-SMACNA": 30,
"CN-GB": 40,
"JP-JIS": 50,
}
seen := make(map[string]bool)
var rows []crossRefRow
for _, id := range normIDs {
if seen[id] {
continue
}
seen[id] = true
cr := GetNormCrossRef(id)
for _, m := range cr.Mappings {
rows = append(rows, crossRefRow{
SourceNorm: id,
Region: m.Region,
Identifier: m.Identifier,
Relation: m.Relation,
Confidence: m.Confidence,
Notes: m.Notes,
})
}
}
sort.SliceStable(rows, func(i, j int) bool {
if rows[i].SourceNorm != rows[j].SourceNorm {
return rows[i].SourceNorm < rows[j].SourceNorm
}
ri, ok := regionRank[rows[i].Region]
if !ok {
ri = 99
}
rj, ok := regionRank[rows[j].Region]
if !ok {
rj = 99
}
return ri < rj
})
return rows
}
// escapeCell escapes pipes and newlines so a Markdown table cell does not break.
func escapeCell(s string) string {
s = strings.ReplaceAll(s, "|", "\\|")
s = strings.ReplaceAll(s, "\n", " ")
return s
}
@@ -0,0 +1,85 @@
package iace
import (
"strings"
"testing"
)
func TestRenderCrossRefAppendix_EmptyInput(t *testing.T) {
got := RenderCrossRefAppendix(nil)
if got != "" {
t.Errorf("expected empty string for nil input, got %d bytes", len(got))
}
}
func TestRenderCrossRefAppendix_UnknownIDs(t *testing.T) {
got := RenderCrossRefAppendix([]string{"ISO-DOES-NOT-EXIST", "EN-ALSO-MISSING"})
if got != "" {
t.Errorf("expected empty string when no IDs match, got:\n%s", got)
}
}
func TestRenderCrossRefAppendix_ISO12100_RendersAllRegions(t *testing.T) {
got := RenderCrossRefAppendix([]string{"ISO-12100"})
if got == "" {
t.Fatal("expected non-empty appendix for ISO-12100")
}
for _, want := range []string{
"## Anhang: Internationale Aequivalenzen",
"ISO-12100",
"EU-DIN",
"US-ANSI",
"CN-GB",
"JP-JIS",
"DIN EN ISO 12100",
"GB/T 15706",
} {
if !strings.Contains(got, want) {
t.Errorf("expected appendix to contain %q, got:\n%s", want, got)
}
}
}
func TestRenderCrossRefAppendix_RegionOrdering(t *testing.T) {
got := RenderCrossRefAppendix([]string{"EN-60204-1"})
if got == "" {
t.Fatal("expected non-empty appendix for EN-60204-1")
}
// EU-DIN must appear before US-NFPA which must appear before CN-GB.
euIdx := strings.Index(got, "EU-DIN")
usIdx := strings.Index(got, "US-NFPA")
cnIdx := strings.Index(got, "CN-GB")
if euIdx < 0 || usIdx < 0 || cnIdx < 0 {
t.Fatalf("missing one of EU-DIN/US-NFPA/CN-GB markers, got:\n%s", got)
}
if !(euIdx < usIdx && usIdx < cnIdx) {
t.Errorf("expected region order EU-DIN < US-NFPA < CN-GB, got positions %d, %d, %d", euIdx, usIdx, cnIdx)
}
}
func TestRenderCrossRefAppendix_MultipleNorms_SortedByID(t *testing.T) {
got := RenderCrossRefAppendix([]string{"ISO-13850", "ISO-12100", "EN-60204-1"})
if got == "" {
t.Fatal("expected non-empty appendix")
}
// Expect EN-60204-1 first (alphabetical), then ISO-12100, then ISO-13850.
en := strings.Index(got, "EN-60204-1")
iso12100 := strings.Index(got, "ISO-12100")
iso13850 := strings.Index(got, "ISO-13850")
if en < 0 || iso12100 < 0 || iso13850 < 0 {
t.Fatalf("missing one of the IDs in output:\n%s", got)
}
if !(en < iso12100 && iso12100 < iso13850) {
t.Errorf("expected source-norm ordering by alphabetical ID, got positions %d, %d, %d", en, iso12100, iso13850)
}
}
func TestRenderCrossRefAppendix_PipeEscape(t *testing.T) {
got := RenderCrossRefAppendix([]string{"ISO-12100"})
// Find a line that came from a mapping with the pipe character — none of
// our identifiers contain literal '|' so this just checks that the table
// header is intact (no accidental pipe injection).
if !strings.Contains(got, "| EU Norm (verwendet) |") {
t.Errorf("table header malformed:\n%s", got)
}
}
@@ -0,0 +1,60 @@
package iace
import (
"testing"
)
// Spot-check sample of cross-references, asserting a couple of well-known
// regional pendants that I personally vetted. If these break, the matrix
// got corrupted; investigate before just updating the test.
func TestCrossRef_SpotChecks(t *testing.T) {
cases := []struct {
normID string
region string
mustHave string
desc string
}{
{"IEC-60601-1", "US-ANSI", "ES60601", "medical electrical equipment → ANSI/AAMI ES60601"},
{"ISO-10218-1", "US-ANSI", "RIA R15.06", "industrial robots → RIA R15.06"},
{"EN-388", "US-ANSI", "ISEA 105", "mech. gloves → ANSI/ISEA 105"},
{"EN-352-1", "US-ANSI", "S3.19", "hearing protection → ANSI S3.19/S12.6"},
{"EN-1176-1", "US-ASTM", "F1487", "playgrounds → ASTM F1487"},
{"EN-13814", "US-ASTM", "F2291", "amusement rides → ASTM F2291"},
{"EN-13445-1", "US-ASME", "Section VIII", "pressure vessels → ASME BPVC VIII"},
{"EN-13480-1", "US-ASME", "B31.3", "process piping → ASME B31.3"},
{"EN-60204-1", "US-NFPA", "NFPA 79", "industrial electrical → NFPA 79"},
{"EN-12453", "US-UL", "UL 325", "garage doors → UL 325"},
{"ISO-11681-1", "US-ANSI", "B175.1", "chainsaws → OPEI B175.1"},
{"EN-ISO-5395-1", "US-ANSI", "B71.1", "lawnmowers → OPEI B71.1"},
{"EN-ISO-20345", "US-ASTM", "F2413", "safety shoes → ASTM F2413"},
{"EN-IEC-61400-1", "INTL-ISO", "IEC 61400-1", "wind turbine design → IEC 61400-1"},
{"EN-149", "US-NIOSH", "42 CFR", "respirators → NIOSH N95 framework"},
}
for _, tc := range cases {
cr := GetNormCrossRef(tc.normID)
found := false
for _, m := range cr.Mappings {
if m.Region == tc.region && contains(m.Identifier, tc.mustHave) {
found = true
break
}
}
if !found {
t.Errorf("[%s] %s: expected %s mapping containing %q", tc.desc, tc.normID, tc.region, tc.mustHave)
}
}
}
func contains(s, sub string) bool {
if sub == "" {
return true
}
for i := 0; i+len(sub) <= len(s); i++ {
if s[i:i+len(sub)] == sub {
return true
}
}
return false
}
@@ -0,0 +1,111 @@
package iace
import (
"testing"
)
// expectedCrossRefCount must be updated as batches are added.
// Batches 1-6 × 100 + Batch 7 × 71 = 671 (full library coverage).
const expectedCrossRefCount = 671
func TestCrossRef_BatchCoverage(t *testing.T) {
all := ListNormCrossRefs()
if len(all) != expectedCrossRefCount {
t.Fatalf("expected %d cross-ref entries, got %d", expectedCrossRefCount, len(all))
}
}
func TestCrossRef_EN8120_HasASME(t *testing.T) {
cr := GetNormCrossRef("EN-81-20")
hasASME := false
for _, m := range cr.Mappings {
if m.Region == "US-ASME" {
hasASME = true
break
}
}
if !hasASME {
t.Error("EN-81-20 (lifts) should map to ASME A17.1 in US-ASME region")
}
}
func TestCrossRef_EN13445_HasMultipleRegions(t *testing.T) {
cr := GetNormCrossRef("EN-13445-1")
if len(cr.Mappings) < 4 {
t.Errorf("EN-13445-1 (pressure vessels) should have 4+ regional mappings, got %d", len(cr.Mappings))
}
}
func TestCrossRef_ISO12100_HasAllRegions(t *testing.T) {
cr := GetNormCrossRef("ISO-12100")
if cr.NormID != "ISO-12100" {
t.Fatalf("expected NormID ISO-12100, got %q", cr.NormID)
}
wantRegions := map[string]bool{
"EU-DIN": false,
"US-ANSI": false,
"CN-GB": false,
"JP-JIS": false,
}
for _, m := range cr.Mappings {
if _, ok := wantRegions[m.Region]; ok {
wantRegions[m.Region] = true
}
}
for region, found := range wantRegions {
if !found {
t.Errorf("ISO-12100 missing mapping for region %q", region)
}
}
}
func TestCrossRef_EN60204_HasNFPA79(t *testing.T) {
cr := GetNormCrossRef("EN-60204-1")
hasNFPA := false
for _, m := range cr.Mappings {
if m.Region == "US-NFPA" && m.Identifier != "" {
hasNFPA = true
break
}
}
if !hasNFPA {
t.Error("EN-60204-1 should map to NFPA 79 in US-NFPA region")
}
}
func TestCrossRef_UnknownID_ReturnsEmpty(t *testing.T) {
cr := GetNormCrossRef("ISO-NOT-IN-REGISTRY")
if len(cr.Mappings) != 0 {
t.Errorf("expected empty mappings for unknown ID, got %d", len(cr.Mappings))
}
if cr.NormID != "ISO-NOT-IN-REGISTRY" {
t.Errorf("expected NormID preserved, got %q", cr.NormID)
}
}
func TestCrossRef_AllEntries_HaveValidRelation(t *testing.T) {
valid := map[string]bool{
"identical": true, "equivalent": true, "partial": true,
"supersedes": true, "superseded_by": true,
}
for _, cr := range ListNormCrossRefs() {
for _, m := range cr.Mappings {
if !valid[m.Relation] {
t.Errorf("%s region %s: invalid relation %q", cr.NormID, m.Region, m.Relation)
}
}
}
}
func TestCrossRef_AllEntries_HaveValidConfidence(t *testing.T) {
valid := map[string]bool{
"verified": true, "high": true, "medium": true, "low": true,
}
for _, cr := range ListNormCrossRefs() {
for _, m := range cr.Mappings {
if !valid[m.Confidence] {
t.Errorf("%s region %s: invalid confidence %q", cr.NormID, m.Region, m.Confidence)
}
}
}
}
@@ -18,6 +18,7 @@ type NormReference struct {
Withdrawn bool `json:"withdrawn,omitempty"` // True if norm is no longer listed in EU OJ
ValidUntil string `json:"valid_until,omitempty"` // End of legal effect (e.g. "20.01.2027")
ReplacedBy string `json:"replaced_by,omitempty"` // Successor norm number if replaced
CrossRef *NormCrossRef `json:"cross_ref,omitempty"` // International cross-reference (DIN/ANSI/GB/JIS), populated on demand
}
// GetNormsLibrary returns A-norms (Grundnormen) and B-norms (Sicherheitsgrundnormen
@@ -153,8 +153,61 @@ func (g *TechFileGenerator) GenerateSection(ctx context.Context, projectID uuid.
})
if err != nil {
// LLM unavailable — return structured fallback with real project data
return buildFallbackContent(sctx, sectionType), nil
return appendCrossRefIfApplicable(buildFallbackContent(sctx, sectionType), sctx, sectionType), nil
}
return resp.Message.Content, nil
return appendCrossRefIfApplicable(resp.Message.Content, sctx, sectionType), nil
}
// appendCrossRefIfApplicable adds the international cross-reference appendix
// (DIN/ANSI/GB/JIS) to the "standards_applied" section. For other section
// types it returns content unchanged. The appendix is built deterministically
// from the in-process registry, so it is never hallucinated by the LLM.
func appendCrossRefIfApplicable(content string, sctx *SectionGenerationContext, sectionType string) string {
if sectionType != SectionStandardsApplied {
return content
}
normIDs := suggestNormIDsForProject(sctx)
appendix := RenderCrossRefAppendix(normIDs)
if appendix == "" {
return content
}
return content + appendix
}
// suggestNormIDsForProject reuses the existing SuggestNorms heuristic to pick
// the norms most likely applicable to this project. We only need the IDs;
// the rest of the SuggestNorms output (scores, reasons) is discarded.
func suggestNormIDsForProject(sctx *SectionGenerationContext) []string {
if sctx == nil || sctx.Project == nil {
return nil
}
hazardCats := make([]string, 0, len(sctx.Hazards))
seenCat := map[string]bool{}
for _, h := range sctx.Hazards {
if h.Category != "" && !seenCat[h.Category] {
seenCat[h.Category] = true
hazardCats = append(hazardCats, h.Category)
}
}
result := SuggestNorms(sctx.Project.MachineType, hazardCats, nil)
if result == nil {
return nil
}
ids := make([]string, 0, result.Total)
seenID := map[string]bool{}
push := func(suggs []NormSuggestion) {
for _, s := range suggs {
if s.Norm.ID == "" || seenID[s.Norm.ID] {
continue
}
seenID[s.Norm.ID] = true
ids = append(ids, s.Norm.ID)
}
}
push(result.ANorms)
push(result.B1Norms)
push(result.B2Norms)
push(result.CNorms)
return ids
}
@@ -207,6 +207,42 @@ async def get_snapshot(snapshot_id: str):
db.close()
@router.get("/admin/benchmark")
async def benchmark(
industry: str = "",
sites: str = "",
anonymized: bool = False,
limit: int = 50,
):
"""P107 — Branchen-Benchmark-Cockpit Endpoint.
industry: 'automotive' / 'banking' / etc (optional)
sites: comma-separated site_label list (optional)
anonymized: bool wenn true, Hersteller-Namen 'OEM 1/2/3'
"""
from database import SessionLocal
from compliance.services.benchmark_extractor import (
load_snapshots_for_benchmark, anonymize_kpis,
build_benchmark_summary,
)
site_list = [s.strip() for s in sites.split(",") if s.strip()] if sites else None
db = SessionLocal()
try:
kpis = load_snapshots_for_benchmark(
db, industry=industry or None, sites=site_list, limit=limit,
)
finally:
db.close()
if anonymized:
kpis = anonymize_kpis(kpis, industry=industry)
return {
"industry": industry or "all",
"anonymized": anonymized,
"sites": [k.get("site_label") for k in kpis],
"kpis": kpis,
"summary": build_benchmark_summary(kpis),
}
@router.post("/admin/tcf-ingest")
async def tcf_ingest():
"""P105 — IAB TCF Vendor-Liste ingestieren / refreshen.
@@ -0,0 +1,265 @@
"""
P107 Branchen-Benchmark-KPIs pro Snapshot.
Extrahiert aus einem compliance_check_snapshot 18 KPIs die fuer den
Multi-Site-Vergleich relevant sind. Wird vom /admin/benchmark Endpoint
genutzt um Vergleichstabellen zu rendern.
USP: keine andere Compliance-Software gibt einen Wirtschaftspruefer
einen so granularen Branchen-Querschnitt. Bei DAX-Konzernen ist das
ein echtes Verkaufs-Asset (Big 4 koennen es ihren Kunden als
'wir sehen die ganze Branche' verkaufen).
"""
from __future__ import annotations
import logging
import re
from typing import Any
from sqlalchemy import text as sa_text
from sqlalchemy.orm import Session
logger = logging.getLogger(__name__)
_US_COUNTRIES = {"US", "USA", "United States"}
_NON_EU = {"US", "CN", "RU", "IN", "JP", "BR", "AU", "CA", "KR",
"MX", "ZA", "TR", "SG", "TW", "HK"}
def _safe_int(v: Any, default: int = 0) -> int:
try:
return int(v)
except (TypeError, ValueError):
return default
def _country_from_vendor(v: dict) -> str:
c = (v.get("country") or "").strip().upper()
if c:
return c
# Aus vendor_country wenn vorhanden (TCF-Authority Eintraege)
return ""
def extract_kpis(snapshot: dict) -> dict:
"""Liefert 18 KPIs aus einem snapshot-row.
Snapshot-row keys: id, check_id, site_label, site_domain, created_at,
banner_result, cmp_vendors, doc_entries, scan_context.
"""
br = snapshot.get("banner_result") or {}
cv = snapshot.get("cmp_vendors") or []
de = snapshot.get("doc_entries") or []
sc = snapshot.get("scan_context") or {}
# Banner-Phase Cookies
phases = br.get("phases") or {}
after_accept = (phases.get("after_accept") or {})
cookies_in_browser = len(after_accept.get("cookies") or [])
cd = br.get("cookies_detailed") or []
# Doc-Text Lengths
doc_text_total = sum(len((d.get("text") or "")) for d in de)
cookie_doc_len = next(
(len(d.get("text") or "") for d in de if d.get("doc_type") == "cookie"), 0,
)
# Vendor breakdown
n_vendors = len(cv)
countries = [_country_from_vendor(v) for v in cv]
countries = [c for c in countries if c]
n_us = sum(1 for c in countries if c in _US_COUNTRIES)
n_non_eu = sum(1 for c in countries if c in _NON_EU)
us_pct = round(n_us / max(1, n_vendors) * 100, 1)
non_eu_pct = round(n_non_eu / max(1, n_vendors) * 100, 1)
# Vendor-Source-Mix
by_src: dict[str, int] = {}
for v in cv:
for s in (v.get("source") or "?").split(";"):
s = s.strip() or "?"
by_src[s] = by_src.get(s, 0) + 1
# Cookies pro Vendor (Konzentration)
cookie_counts = [len(v.get("cookies") or []) for v in cv]
max_cookies_per_vendor = max(cookie_counts) if cookie_counts else 0
avg_cookies_per_vendor = (
round(sum(cookie_counts) / max(1, len(cookie_counts)), 1)
if cookie_counts else 0
)
# Banner-Checks
bc = br.get("banner_checks") or {}
n_banner_violations = len(bc.get("violations") or [])
banner_detected = bool(br.get("banner_detected"))
# Compliance-Score (best effort)
score = br.get("compliance_score") or br.get("completeness_pct")
# Estimated Saving (Lizenz-Konsolidierung, Heuristik)
# Pro 5 Vendor ueber Median (10) rechnen wir ~5k EUR/Jahr Einsparung
median_vendors = 10
saving_low = max(0, (n_vendors - median_vendors)) * 1000
saving_high = max(0, (n_vendors - median_vendors)) * 5000
return {
# Header
"check_id": snapshot.get("check_id"),
"site_label": snapshot.get("site_label"),
"site_domain": snapshot.get("site_domain"),
"captured_at": (snapshot.get("created_at").isoformat()
if snapshot.get("created_at") else None),
"industry": (sc or {}).get("industry") or "",
# Vendor-KPIs
"vendors_total": n_vendors,
"vendors_us": n_us,
"vendors_non_eu": n_non_eu,
"us_pct": us_pct,
"non_eu_pct": non_eu_pct,
"source_breakdown": by_src,
"max_cookies_per_vendor": max_cookies_per_vendor,
"avg_cookies_per_vendor": avg_cookies_per_vendor,
# Cookie-KPIs
"cookies_in_browser": cookies_in_browser,
"cookies_detailed_count": len(cd),
"cookie_doc_chars": cookie_doc_len,
"doc_text_chars_total": doc_text_total,
# Banner
"banner_detected": banner_detected,
"banner_provider": br.get("banner_provider") or "",
"banner_violations": n_banner_violations,
# Compliance / Score
"compliance_score": score,
# Saving (Heuristik)
"saving_low_eur": saving_low,
"saving_high_eur": saving_high,
# Capture-Quality (wie viele unserer 10+ Audit-Quellen liefern Daten)
"data_quality_pct": _quality_pct(snapshot),
}
def _quality_pct(snapshot: dict) -> int:
"""Wieviel Prozent der erwarteten Datenquellen haben Inhalt?"""
br = snapshot.get("banner_result") or {}
cv = snapshot.get("cmp_vendors") or []
de = snapshot.get("doc_entries") or []
cd = br.get("cookies_detailed") or []
aa = (br.get("phases") or {}).get("after_accept") or {}
checks = [
br.get("banner_detected") is True,
len(cv) > 0,
len(de) > 0,
len(cd) > 0,
len(aa.get("cookies") or []) > 0,
any((d.get("text") or "") for d in de),
br.get("compliance_score") is not None or br.get("completeness_pct") is not None,
]
return round(sum(1 for x in checks if x) / len(checks) * 100)
def load_snapshots_for_benchmark(
db: Session,
industry: str | None = None,
sites: list[str] | None = None,
limit: int = 50,
) -> list[dict]:
"""Liefert dicts mit Snapshot-Daten + extracted KPIs."""
where = []
params: dict[str, Any] = {}
if industry:
where.append("(scan_context->>'industry') = :ind")
params["ind"] = industry
if sites:
where.append("site_label = ANY(:sites)")
params["sites"] = sites
where_sql = " AND ".join(where) if where else "TRUE"
sql = (
"SELECT id::text, check_id, site_label, site_domain, created_at, "
" banner_result, cmp_vendors, doc_entries, scan_context "
"FROM compliance.compliance_check_snapshots "
f"WHERE {where_sql} "
"ORDER BY created_at DESC LIMIT :lim"
)
params["lim"] = limit
rows = db.execute(sa_text(sql), params).fetchall()
out: list[dict] = []
for r in rows:
import json as _j
def _parse(v):
if isinstance(v, (dict, list)) or v is None:
return v
try:
return _j.loads(v)
except Exception:
return v
snap = {
"id": r[0],
"check_id": r[1],
"site_label": r[2],
"site_domain": r[3],
"created_at": r[4],
"banner_result": _parse(r[5]),
"cmp_vendors": _parse(r[6]) or [],
"doc_entries": _parse(r[7]) or [],
"scan_context": _parse(r[8]) or {},
}
out.append(extract_kpis(snap))
return out
def anonymize_kpis(kpis: list[dict], industry: str = "") -> list[dict]:
"""Ersetzt site_label durch 'OEM 1', 'OEM 2' etc.
Industry-Prefix waehlbar (AutomotiveOEM, BankingBank, ChemieChem).
"""
prefix_map = {
"automotive": "OEM",
"banking": "Bank",
"chemistry": "Chem",
"luftfahrt": "Airline",
"saas": "SaaS",
"ecommerce": "Shop",
}
pfx = prefix_map.get(industry.lower(), "Site")
# Stable alphabetical numbering for determinism
seen: dict[str, str] = {}
next_idx = 1
out = []
for k in sorted(kpis, key=lambda x: (x.get("site_label") or "")):
sl = k.get("site_label") or ""
if sl not in seen:
seen[sl] = f"{pfx} {next_idx}"
next_idx += 1
anon_k = dict(k)
anon_k["site_label"] = seen[sl]
anon_k["site_domain"] = f"site-{next_idx-1}.example"
out.append(anon_k)
return out
def build_benchmark_summary(kpis: list[dict]) -> dict:
"""Aggregate-Stats fuer den ganzen Branchen-Cut."""
if not kpis:
return {}
def avg(field: str) -> float:
vals = [k.get(field) for k in kpis if isinstance(k.get(field), (int, float))]
return round(sum(vals) / max(1, len(vals)), 1) if vals else 0
def maxv(field: str):
vals = [k.get(field) for k in kpis if isinstance(k.get(field), (int, float))]
return max(vals) if vals else 0
return {
"n_sites": len(kpis),
"avg_vendors": avg("vendors_total"),
"avg_us_pct": avg("us_pct"),
"avg_non_eu_pct": avg("non_eu_pct"),
"avg_cookies_browser": avg("cookies_in_browser"),
"avg_score": avg("compliance_score"),
"max_vendors": maxv("vendors_total"),
"max_saving_high": maxv("saving_high_eur"),
"total_saving_low": sum(k.get("saving_low_eur") or 0 for k in kpis),
"total_saving_high": sum(k.get("saving_high_eur") or 0 for k in kpis),
}
@@ -38,13 +38,15 @@ _PROCESS_INTERNAL_PATTERNS = [
r"\bsensibilisier",
# Vertraege intern
r"\bauftragsverarbeitungsvertrag\b",
r"\bAVV\b\s+abgeschlossen",
r"\bavv\b\s+abgeschlossen",
r"\bvertrag.*abgeschlossen",
r"\bdpa\s+(geschlossen|abgeschlossen|vorhanden)",
r"\bSCC\s+(geschlossen|abgeschlossen|implementiert)",
# Technisch-organisatorische Massnahmen (intern)
r"\bscc\s+(geschlossen|abgeschlossen|implementiert)",
# Technisch-organisatorische Massnahmen (intern). Lowercase: blob
# ist bereits .lower(); Case-sensitive Patterns (TOM/AVV/SCC) matchen
# nie. Daher hier explizit klein.
r"\btechnisch[-\s]*organisatorische\s+ma(ß|ss)nahmen?\b",
r"\bTOM\s+(umgesetzt|dokumentiert|implementiert)",
r"\btom\s+(umgesetzt|dokumentiert|implementiert)",
r"\bverschluesselung\s+(implementiert|aktiv)",
r"\bpseudonymisierung\s+(implementiert|aktiv)",
r"\bbackup[s]?\s+(eingerichtet|vorhanden)",
@@ -68,7 +70,11 @@ _PROCESS_INTERNAL_PATTERNS = [
r"\bbitte\s+(intern\s+)?dokumentieren",
r"\bin\s+der\s+verfahrens",
r"\bnach\s+innen\s+geh",
r"\bausnahmen\s+(dokumentieren|protokollieren)",
# "Ausnahmen ... dokumentieren" — Wortabstand bis 60 Zeichen erlauben,
# damit "ausnahmen bei bereits vorhandenen informationen dokumentieren"
# matcht. Sonst Pattern zu eng → process-internal-MC bleibt FAIL.
r"\bausnahmen\b[^\n]{0,60}\b(dokumentieren|protokollieren)\b",
r"\bdokumentations[\s-]?pflicht",
r"\bkostenfrei\s+(zur\s+verfuegung|gewaehren|ermoegli)",
r"\bunentgeltlich\s+(zur\s+verfuegung)",
# Vertragsleistung / Service-Level (intern)
@@ -172,6 +172,21 @@ async def generate_solution(
"Liefere die Loesung als JSON."
)
# P31: tiered Cascade (Qwen → OVH → Anthropic) mit Valkey-Cache.
try:
from compliance.services.llm_cascade import call_with_cascade
res = await call_with_cascade(
system=_SYSTEM_PROMPT, user=prompt,
min_confidence=0.5, max_tokens=600,
)
parsed = _parse(res.get("text", ""))
if parsed:
_cache_put(cache_key, parsed)
return parsed
except Exception:
# fall through to legacy direct calls
pass
content = await _call_ollama(prompt)
parsed = _parse(content)
if not parsed:
@@ -63,19 +63,34 @@ async def extract_vendors_via_llm(
excerpt = cookie_text[:max_text_chars]
user_prompt = f"Cookie-Richtlinie-Text:\n\n{excerpt}"
# Stage 1: local Qwen
# P31: nutze tiered LLM-Cascade mit Cache (Qwen → OVH → Anthropic).
# Re-Runs derselben Cookie-Doc landen im Valkey-Cache (7d TTL) und
# gehen in ~50ms statt 4-6min durch. Erstaufruf bleibt 4-6min lokal
# bzw ~2min auf OVH.
try:
from compliance.services.llm_cascade import call_with_cascade
res = await call_with_cascade(
system=_SYSTEM_PROMPT, user=user_prompt,
min_confidence=0.6, max_tokens=16000,
)
vendors = _parse_vendor_list(res.get("text", ""))
if vendors:
logger.info(
"LLM vendor extraction (cascade %s, conf=%.2f, cached=%s): %d vendors",
res.get("source"), res.get("confidence", 0),
res.get("cached"), len(vendors),
)
return vendors
except Exception as e:
logger.warning("Cascade extract failed, fallback to direct Qwen: %s", e)
# Fallback: alte direkte Logik
content = await _call_ollama(user_prompt)
vendors = _parse_vendor_list(content)
if vendors:
logger.info("LLM vendor extraction (Qwen): %d vendors", len(vendors))
return vendors
# Stage 2: OVH backup
content = await _call_ovh(user_prompt)
vendors = _parse_vendor_list(content)
if vendors:
logger.info("LLM vendor extraction (OVH): %d vendors", len(vendors))
return vendors
return _parse_vendor_list(content)
async def _call_ollama(user_prompt: str) -> str:
@@ -0,0 +1,100 @@
"""Heuristic-coverage tests for mc_audit_type.classify_mc_audit_type.
Hand-kuratierte Beispiele aus DSGVO-/AI-Act-/eCall-Kontext, die nahe an
den real-world FAILs aus VW-/BMW-Audits liegen. Wenn ein Pattern hier
fehlschlaegt, fehlt _PROCESS_INTERNAL_PATTERNS bzw. _VERIFIABLE_PATTERNS
eine entsprechende Regel.
"""
import pytest
from compliance.services.mc_audit_type import classify_mc_audit_type
VERIFIABLE_CASES = [
("Datenschutzerklaerung nennt Kontaktdaten des Verantwortlichen",
"Steht im Impressum / DSE der Name + Adresse + Email?"),
("Cookie-Banner enthaelt Ablehnen-Button",
"Ist im Cookie-Banner ein 'Ablehnen' Button sichtbar?"),
("Datenschutzerklaerung verweist auf Recht auf Auskunft",
"Wird in der Datenschutzerklaerung Art. 15 DSGVO erwaehnt?"),
("Cookie-Richtlinie listet alle Drittanbieter",
"Sind alle Vendors in der Cookie-Richtlinie aufgefuehrt?"),
("Impressum nennt Telefonnummer",
"Steht im Impressum eine Kontakttelefonnummer?"),
("Datenschutzerklaerung nennt Speicherdauer",
"Sind in der DSE die Aufbewahrungsfristen angegeben?"),
("Cookie-Banner Save-Label entspricht UWG-Vorgabe",
"Ist der Speichern-Button im Banner korrekt beschriftet?"),
]
PROCESS_INTERNAL_CASES = [
("Mitarbeiter-Schulung zu Datenschutz durchgefuehrt",
"Wurden alle Mitarbeiter zum Thema Datenschutz geschult?"),
("AVV mit allen Auftragsverarbeitern abgeschlossen",
"Liegt fuer jeden Dienst ein Auftragsverarbeitungsvertrag vor?"),
("TOM dokumentiert und implementiert",
"Sind die technisch-organisatorischen Massnahmen umgesetzt?"),
("DSFA fuer Hochrisiko-Verarbeitung durchgefuehrt",
"Wurde eine DSFA durchgefuehrt und dokumentiert?"),
("Rollenkonzept eingerichtet",
"Existiert ein Berechtigungskonzept mit klaren Rollen?"),
("Pseudonymisierung von Daten implementiert",
"Wird Pseudonymisierung aktiv eingesetzt?"),
("Backup-Strategie eingerichtet",
"Sind Backups vorhanden und werden regelmaessig getestet?"),
("Abschaltung der Standortdatenverarbeitung kostenfrei ermoeglichen",
"Kann der Nutzer die Standortdatenverarbeitung kostenfrei abschalten?"),
("Ausnahmen bei bereits vorhandenen Informationen dokumentieren",
"Werden Ausnahmen intern dokumentiert?"),
("Sensibilisierung neue Mitarbeiter",
"Erhalten neue Mitarbeiter eine Awareness-Schulung?"),
("72-Stunden-Meldung an Aufsichtsbehoerde eingehalten",
"Wird die Meldepflicht innerhalb von 72 Stunden umgesetzt?"),
]
DOC_INTERNAL_CASES = [
("Verzeichnis von Verarbeitungstaetigkeiten gefuehrt",
"Existiert ein VVT mit allen Pflichtangaben?"),
("Subprozessor-Liste aktualisiert",
"Wird die Sub-Prozessor-Liste gepflegt?"),
("Auftragsverarbeitungsverzeichnis vollstaendig",
"Sind alle AVVs im Auftragsverarbeitungsverzeichnis erfasst?"),
("Aufbewahrungskonzept dokumentiert",
"Existiert ein dokumentiertes Aufbewahrungskonzept?"),
]
@pytest.mark.parametrize("title,question", VERIFIABLE_CASES)
def test_verifiable_cases(title: str, question: str) -> None:
"""These MCs MUST be classified as verifiable — they describe things
visible from the outside (website / banner / DSE)."""
result = classify_mc_audit_type(title, question)
assert result == "verifiable", (
f"Expected 'verifiable' for {title!r}, got {result!r}"
)
@pytest.mark.parametrize("title,question", PROCESS_INTERNAL_CASES)
def test_process_internal_cases(title: str, question: str) -> None:
"""These MCs MUST be classified as process_internal — they describe
internal customer processes that we cannot verify from the outside."""
result = classify_mc_audit_type(title, question)
assert result == "process_internal", (
f"Expected 'process_internal' for {title!r}, got {result!r}"
)
@pytest.mark.parametrize("title,question", DOC_INTERNAL_CASES)
def test_doc_internal_cases(title: str, question: str) -> None:
"""These MCs MUST be classified as doc_internal — they describe
internal documentation (VVT, AVV-Verzeichnis) we cannot inspect."""
result = classify_mc_audit_type(title, question)
assert result == "doc_internal", (
f"Expected 'doc_internal' for {title!r}, got {result!r}"
)
def test_empty_input_is_ambiguous() -> None:
assert classify_mc_audit_type("", "") == "ambiguous"
assert classify_mc_audit_type(None, None) == "ambiguous"
+17 -5
View File
@@ -80,21 +80,33 @@ class CMPCapture:
data = await _parse_json_response(response)
if data is None:
return
# Skip tiny payloads — real CMP cookie policies are ≥5KB.
# A 4KB JSON of cookie-shaped data is almost never the policy.
try:
size_kb = len(json.dumps(data)) // 1024
except Exception:
size_kb = 0
if size_kb < 5:
return
from services.cmp_heuristic import looks_like_cookie_policy
if looks_like_cookie_policy(data):
matched = looks_like_cookie_policy(data)
if matched and size_kb >= 5:
self.payloads.append(("_heuristic", data))
logger.info(
"CMP captured: _heuristic (%s, ~%dKB)",
url[:120], size_kb,
)
elif size_kb >= 3:
# Phase-0-Diagnose-Log: JSON-Response die als CMP-Kandidat
# ueberlebt hat, aber heuristic OR size-threshold abgelehnt
# wurde. Zeigt beim naechsten VW/BMW/... Run welche Endpoints
# uebersehen werden — schneller Pattern-Add ohne raten.
top_keys = []
if isinstance(data, dict):
top_keys = list(data.keys())[:8]
elif isinstance(data, list) and data and isinstance(data[0], dict):
top_keys = list(data[0].keys())[:8]
logger.info(
"CMP candidate skipped: url=%s size=%dKB heuristic=%s "
"top_keys=%s",
url[:120], size_kb, matched, top_keys,
)
except Exception as e:
logger.debug("CMP listener error: %s", e)
+98 -1
View File
@@ -256,7 +256,8 @@ async def archive_legal_document(
}
@router.get("/documents/{cid}/history")
@router.get("/api/v1/documents/{cid}/history")
@router.get("/documents/{cid}/history") # legacy path, kept for backwards compatibility
async def get_document_history(cid: str):
"""Follow the parent_cid chain to reconstruct version history."""
history = []
@@ -285,3 +286,99 @@ async def get_document_history(cid: str):
break
return {"cid": cid, "history": history, "depth": len(history)}
@router.get("/api/v1/documents/{cid_a}/diff/{cid_b}")
async def diff_documents(cid_a: str, cid_b: str):
"""
Compare two DSMS document versions by their CIDs.
Returns a unified diff of the textual content when both documents are
text-decodable (UTF-8). For binary documents the response indicates
"binary" and returns just the metadata differences. Used by the Audit
Timeline UI to render "what changed between V2 and V3 of CE-Akte X".
"""
try:
raw_a = await ipfs_cat(cid_a)
raw_b = await ipfs_cat(cid_b)
except Exception as exc:
return {"error": f"could not fetch one of the CIDs: {exc}", "cid_a": cid_a, "cid_b": cid_b}
try:
pkg_a = json.loads(raw_a)
pkg_b = json.loads(raw_b)
except Exception:
# Documents are not the wrapped-package JSON shape — treat as raw.
pkg_a = {"metadata": {}, "content_base64": ""}
pkg_b = {"metadata": {}, "content_base64": ""}
meta_a = pkg_a.get("metadata", {}) or {}
meta_b = pkg_b.get("metadata", {}) or {}
meta_diff = _diff_metadata(meta_a, meta_b)
# Try to decode the content. The Archive flow stores files as base64 in
# `content_base64`; older payloads may use `content` (utf-8 text).
text_a, text_b, is_binary = _extract_texts(pkg_a, pkg_b)
if is_binary:
return {
"cid_a": cid_a,
"cid_b": cid_b,
"kind": "binary",
"metadata_diff": meta_diff,
"note": "Binary payload — text diff omitted. Compare via the rendered tech-file export instead.",
}
diff_lines = list(
_unified_diff(text_a.splitlines(), text_b.splitlines(), fromfile=cid_a, tofile=cid_b, lineterm="")
)
return {
"cid_a": cid_a,
"cid_b": cid_b,
"kind": "text",
"metadata_diff": meta_diff,
"diff": "\n".join(diff_lines),
"added_lines": sum(1 for ln in diff_lines if ln.startswith("+") and not ln.startswith("+++")),
"removed_lines": sum(1 for ln in diff_lines if ln.startswith("-") and not ln.startswith("---")),
}
def _diff_metadata(a: dict, b: dict) -> dict:
"""Return per-field change list: {field: {"old": ..., "new": ...}}."""
keys = set(a.keys()) | set(b.keys())
changes = {}
for k in sorted(keys):
if a.get(k) != b.get(k):
changes[k] = {"old": a.get(k), "new": b.get(k)}
return changes
def _extract_texts(pkg_a: dict, pkg_b: dict) -> tuple[str, str, bool]:
"""Return (text_a, text_b, is_binary). Falls back to base64-decode."""
import base64
def to_text(pkg: dict) -> tuple[str, bool]:
if isinstance(pkg.get("content"), str):
return pkg["content"], False
b64 = pkg.get("content_base64")
if not b64:
return "", False
try:
raw = base64.b64decode(b64)
except Exception:
return "", True
try:
return raw.decode("utf-8"), False
except UnicodeDecodeError:
return "", True
text_a, bin_a = to_text(pkg_a)
text_b, bin_b = to_text(pkg_b)
return text_a, text_b, (bin_a or bin_b)
def _unified_diff(a, b, fromfile, tofile, lineterm):
"""Tiny shim around difflib.unified_diff so the function reads cleanly."""
import difflib
return difflib.unified_diff(a, b, fromfile=fromfile, tofile=tofile, lineterm=lineterm, n=2)
+108
View File
@@ -0,0 +1,108 @@
"""
Tests for the version-chain diff endpoint added in DSMS Stufe 3.
Mocks ipfs_cat so the test does not require a running IPFS node.
"""
import base64
import json
from unittest.mock import AsyncMock, patch
import pytest
from fastapi.testclient import TestClient
from main import app
client = TestClient(app)
def _wrap(metadata: dict, content_text: str) -> str:
"""Mimic the JSON envelope that routers.documents.ipfs_cat returns."""
return json.dumps(
{
"metadata": metadata,
"content_base64": base64.b64encode(content_text.encode("utf-8")).decode("ascii"),
}
)
@pytest.mark.asyncio
async def test_diff_text_documents_returns_unified_diff():
pkg_a = _wrap({"version": "1", "document_type": "ce_techfile"}, "alpha\nbeta\ngamma\n")
pkg_b = _wrap({"version": "2", "document_type": "ce_techfile"}, "alpha\nDELTA\ngamma\n")
async def fake_cat(cid: str):
return pkg_a if cid == "cidA" else pkg_b
with patch("routers.documents.ipfs_cat", new=AsyncMock(side_effect=fake_cat)):
resp = client.get("/api/v1/documents/cidA/diff/cidB")
assert resp.status_code == 200
body = resp.json()
assert body["kind"] == "text"
assert body["cid_a"] == "cidA"
assert body["cid_b"] == "cidB"
assert body["added_lines"] >= 1
assert body["removed_lines"] >= 1
assert "DELTA" in body["diff"]
assert body["metadata_diff"] == {"version": {"old": "1", "new": "2"}}
@pytest.mark.asyncio
async def test_diff_binary_documents_returns_metadata_only():
# Use raw bytes that are not utf-8 decodable
invalid_utf8 = b"\xff\xfe\xfd\xfc"
pkg_a = json.dumps(
{"metadata": {"version": "1"}, "content_base64": base64.b64encode(invalid_utf8).decode()}
)
pkg_b = json.dumps(
{"metadata": {"version": "2"}, "content_base64": base64.b64encode(invalid_utf8 + b"\x00").decode()}
)
async def fake_cat(cid: str):
return pkg_a if cid == "cidA" else pkg_b
with patch("routers.documents.ipfs_cat", new=AsyncMock(side_effect=fake_cat)):
resp = client.get("/api/v1/documents/cidA/diff/cidB")
assert resp.status_code == 200
body = resp.json()
assert body["kind"] == "binary"
assert body["metadata_diff"] == {"version": {"old": "1", "new": "2"}}
@pytest.mark.asyncio
async def test_diff_handles_fetch_error():
async def fake_cat(cid: str):
raise RuntimeError("not pinned")
with patch("routers.documents.ipfs_cat", new=AsyncMock(side_effect=fake_cat)):
resp = client.get("/api/v1/documents/cidA/diff/cidB")
assert resp.status_code == 200
body = resp.json()
assert "error" in body
assert body["cid_a"] == "cidA"
assert body["cid_b"] == "cidB"
@pytest.mark.asyncio
async def test_history_endpoint_follows_parent_chain():
"""Sanity check that the existing history endpoint still works after route alias."""
chain = {
"v3": _wrap({"version": "3", "parent_cid": "v2"}, "x"),
"v2": _wrap({"version": "2", "parent_cid": "v1"}, "x"),
"v1": _wrap({"version": "1", "parent_cid": None}, "x"),
}
async def fake_cat(cid: str):
return chain[cid]
with patch("routers.documents.ipfs_cat", new=AsyncMock(side_effect=fake_cat)):
resp = client.get("/api/v1/documents/v3/history")
assert resp.status_code == 200
body = resp.json()
assert body["depth"] == 3
assert [h["version"] for h in body["history"]] == ["3", "2", "1"]