Compare commits

..

1 Commits

Author SHA1 Message Date
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
11 changed files with 1105 additions and 145 deletions
@@ -1,36 +0,0 @@
import { describe, expect, it } from 'vitest'
import { calculateAP } from './useFMEA'
describe('calculateAP — AIAG-VDA 2019 Handbook Action Priority', () => {
it('returns H for severity 10 with mid occurrence', () => {
expect(calculateAP(10, 5, 5)).toBe('H')
})
it('returns H for severity 9 with low detection', () => {
expect(calculateAP(9, 4, 7)).toBe('H')
})
it('returns M for severity 9 with low occurrence and good detection', () => {
expect(calculateAP(9, 2, 5)).toBe('M')
})
it('returns L for severity 9 with very low occurrence and detection', () => {
expect(calculateAP(9, 1, 4)).toBe('L')
})
it('returns H for severity 7 with high occurrence', () => {
expect(calculateAP(7, 5, 1)).toBe('H')
})
it('returns M for severity 7 with mid occurrence', () => {
expect(calculateAP(7, 3, 5)).toBe('M')
})
it('returns L for low-severity well-controlled mode', () => {
expect(calculateAP(3, 1, 1)).toBe('L')
})
it('returns L for severity 5 with very low occurrence and detection', () => {
expect(calculateAP(5, 1, 1)).toBe('L')
})
})
@@ -156,52 +156,5 @@ export function useFMEA(projectId: string) {
// Get unique components for the suggest button
const components = [...new Map(rows.map((r) => [r.component.id, r.component])).values()]
/**
* Accept a suggested FM: build an FMEA row from the FM defaults, prepend it
* to the table state, and remove the FM from the suggestion list.
* Returns false if the (component, fm.id) combo already exists in rows.
*/
function acceptSuggestion(fm: FailureMode, componentId: string): boolean {
const comp = components.find((c) => c.id === componentId)
if (!comp) return false
const dup = rows.find((r) => r.component.id === componentId && r.failureMode.id === fm.id)
if (dup) {
// Still drop the suggestion so the UI does not keep offering it.
setSuggestions((prev) => prev.filter((s) => s.id !== fm.id))
return false
}
const s = fm.default_severity || 5
const o = fm.default_occurrence || 5
const d = fm.default_detection || 5
const newRow: FMEARow = {
component: comp,
failureMode: fm,
severity: s,
occurrence: o,
detection: d,
rpz: s * o * d,
ap: calculateAP(s, o, d),
}
setRows((prev) => [newRow, ...prev].sort((a, b) => b.rpz - a.rpz))
setSuggestions((prev) => prev.filter((sg) => sg.id !== fm.id))
return true
}
function rejectSuggestion(fmId: string) {
setSuggestions((prev) => prev.filter((sg) => sg.id !== fmId))
}
return {
rows,
loading,
stats,
components,
suggestFMs,
suggesting,
suggestions,
suggestSource,
setSuggestions,
acceptSuggestion,
rejectSuggestion,
}
return { rows, loading, stats, components, suggestFMs, suggesting, suggestions, suggestSource, setSuggestions }
}
@@ -1,6 +1,6 @@
'use client'
import { useEffect, useState } from 'react'
import { useState } from 'react'
import { useParams } from 'next/navigation'
import { useFMEA, type FMEARow } from './_hooks/useFMEA'
@@ -27,17 +27,8 @@ function rpzLabel(rpz: number): string {
export default function FMEAPage() {
const { projectId } = useParams<{ projectId: string }>()
const { rows, loading, stats, components, suggestFMs, suggesting, suggestions, suggestSource, setSuggestions, acceptSuggestion, rejectSuggestion } = useFMEA(projectId)
const { rows, loading, stats, components, suggestFMs, suggesting, suggestions, suggestSource, setSuggestions } = useFMEA(projectId)
const [suggestComp, setSuggestComp] = useState<string | null>(null)
const [acceptedCount, setAcceptedCount] = useState(0)
// Reset accepted-count when a fresh suggestion run is loaded or the panel closes.
useEffect(() => {
if (suggesting) setAcceptedCount(0)
}, [suggesting])
useEffect(() => {
if (suggestions.length === 0) setAcceptedCount(0)
}, [suggestions.length])
if (loading) {
return (
@@ -106,60 +97,26 @@ export default function FMEAPage() {
{suggestions.length > 0 && (
<div className="bg-purple-50 dark:bg-purple-900/20 border border-purple-200 dark:border-purple-800 rounded-xl p-4">
<div className="flex items-center justify-between mb-3">
<div>
<h3 className="text-sm font-semibold text-purple-800 dark:text-purple-300">
KI-Vorschlaege ({suggestions.length}) {suggestSource === 'llm' ? 'LLM-generiert' : 'Bibliothek-Fallback'}
</h3>
{acceptedCount > 0 && (
<div className="text-xs text-green-700 dark:text-green-400 mt-0.5">
{acceptedCount} Vorschlag{acceptedCount > 1 ? 'e' : ''} uebernommen
</div>
)}
</div>
<h3 className="text-sm font-semibold text-purple-800 dark:text-purple-300">
KI-Vorschlaege ({suggestions.length}) {suggestSource === 'llm' ? 'LLM-generiert' : 'Bibliothek'}
</h3>
<button onClick={() => setSuggestions([])} className="text-xs text-purple-600 hover:text-purple-800">Schliessen</button>
</div>
<div className="space-y-2">
{suggestions.map((fm) => {
const rpz = fm.default_severity * fm.default_occurrence * fm.default_detection
return (
<div key={fm.id} className="flex items-start justify-between gap-3 bg-white dark:bg-gray-800 rounded-lg p-3 border border-purple-100 dark:border-purple-800">
<div className="flex-1 min-w-0">
<div className="text-sm font-medium text-gray-900 dark:text-white">{fm.name_de}</div>
<div className="text-xs text-gray-500 mt-0.5">{fm.effect}</div>
<div className="flex gap-3 mt-1 text-xs text-gray-400">
<span>S={fm.default_severity}</span>
<span>O={fm.default_occurrence}</span>
<span>D={fm.default_detection}</span>
<span className={`font-bold ${rpz > 200 ? 'text-red-600' : rpz > 100 ? 'text-orange-600' : 'text-gray-500'}`}>RPZ={rpz}</span>
</div>
</div>
<div className="flex items-center gap-1.5 shrink-0">
<button
onClick={() => {
if (!suggestComp) return
const ok = acceptSuggestion(fm, suggestComp)
if (ok) setAcceptedCount((c) => c + 1)
}}
disabled={!suggestComp}
className="px-3 py-1.5 bg-green-600 hover:bg-green-700 disabled:opacity-50 disabled:cursor-not-allowed text-white text-xs font-medium rounded transition-colors"
title="Diesen Fehlermodus der FMEA-Tabelle hinzufuegen"
>
Uebernehmen
</button>
<button
onClick={() => rejectSuggestion(fm.id)}
className="px-3 py-1.5 bg-gray-200 dark:bg-gray-700 hover:bg-gray-300 dark:hover:bg-gray-600 text-gray-700 dark:text-gray-300 text-xs font-medium rounded transition-colors"
title="Diesen Vorschlag verwerfen"
>
Ablehnen
</button>
{suggestions.map((fm, i) => (
<div key={i} className="flex items-center justify-between bg-white dark:bg-gray-800 rounded-lg p-3 border border-purple-100 dark:border-purple-800">
<div className="flex-1 min-w-0">
<div className="text-sm font-medium text-gray-900 dark:text-white">{fm.name_de}</div>
<div className="text-xs text-gray-500 mt-0.5">{fm.effect}</div>
<div className="flex gap-3 mt-1 text-xs text-gray-400">
<span>S={fm.default_severity}</span>
<span>O={fm.default_occurrence}</span>
<span>D={fm.default_detection}</span>
<span className="font-bold">RPZ={fm.default_severity * fm.default_occurrence * fm.default_detection}</span>
</div>
</div>
)
})}
</div>
<div className="text-[10px] text-purple-700 dark:text-purple-400 mt-3">
Hinweis: Uebernommene Fehlermodi erscheinen sofort in der Tabelle unten. Bewertung (S/O/D) ist anpassbar Standardwerte aus der Bibliothek.
</div>
))}
</div>
</div>
)}
@@ -73,7 +73,6 @@ export function SidebarModuleList({ collapsed, projectId, pendingCRCount }: Side
<AdditionalModuleItem href="/sdk/ai-registration" icon={<svg className="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16m14 0h2m-2 0h-5m-9 0H3m2 0h5M9 7h1m-1 4h1m4-4h1m-1 4h1m-5 10v-5a1 1 0 011-1h2a1 1 0 011 1v5m-4 0h4" /></svg>} label="EU Registrierung" isActive={pathname?.startsWith('/sdk/ai-registration') ?? false} collapsed={collapsed} projectId={projectId} />
<AdditionalModuleItem href="/sdk/compliance-optimizer" icon={<svg className="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M13 7h8m0 0v8m0-8l-8 8-4-4-6 6" /></svg>} label="Compliance Optimizer" isActive={pathname?.startsWith('/sdk/compliance-optimizer') ?? false} collapsed={collapsed} projectId={projectId} />
<AdditionalModuleItem href="/sdk/agent" icon={<svg className="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z" /></svg>} label="Compliance Agent" isActive={pathname?.startsWith('/sdk/agent') ?? false} collapsed={collapsed} projectId={projectId} />
<AdditionalModuleItem href="/sdk/benchmark" icon={<svg className="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z" /></svg>} label="Branchen-Benchmark" isActive={pathname?.startsWith('/sdk/benchmark') ?? false} collapsed={collapsed} projectId={projectId} />
</div>
{/* CRA Compliance */}
@@ -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),
})
}
@@ -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,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,86 @@
package iace
import (
"testing"
)
func TestCrossRef_Batch1_Coverage(t *testing.T) {
all := ListNormCrossRefs()
if len(all) != 100 {
t.Fatalf("expected 100 cross-ref entries from batch 1, got %d", len(all))
}
}
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