diff --git a/admin-compliance/app/sdk/cra/_components/DatasheetExtract.tsx b/admin-compliance/app/sdk/cra/_components/DatasheetExtract.tsx
index ff69181c..c7c54cad 100644
--- a/admin-compliance/app/sdk/cra/_components/DatasheetExtract.tsx
+++ b/admin-compliance/app/sdk/cra/_components/DatasheetExtract.tsx
@@ -70,7 +70,7 @@ export function DatasheetExtract() {
})
if (!cr.ok) return
const proj = await cr.json()
- const pid = proj.id || proj.project_id
+ const pid = proj.project?.id || proj.id || proj.project_id
if (!pid) return
await fetch(`/api/sdk/v1/iace/projects/${pid}`, {
method: 'PUT', headers: { 'Content-Type': 'application/json' },
diff --git a/admin-compliance/app/sdk/cra/_components/ReadinessResult.tsx b/admin-compliance/app/sdk/cra/_components/ReadinessResult.tsx
index ab7c97ce..b65cb104 100644
--- a/admin-compliance/app/sdk/cra/_components/ReadinessResult.tsx
+++ b/admin-compliance/app/sdk/cra/_components/ReadinessResult.tsx
@@ -15,6 +15,7 @@ export interface ReadinessResult {
conformity_path_hint: string
regulations: string[]
guideline: { code: GuidelineItem[]; process: GuidelineItem[]; document: GuidelineItem[] }
+ machinery_guideline?: GuidelineItem[]
counts: { code: number; process: number; document: number }
total_effort_days: number
deadlines: { date: string; label: string }[]
@@ -172,9 +173,6 @@ export function ReadinessResultView({ result, onCreateProject }: { result: Readi
{result.guideline[b.key].map((it) => (
-
- {it.source === 'Maschinen-VO' && (
- MaschVO
- )}
{it.title}
· {it.annex_anchor}
@@ -183,6 +181,25 @@ export function ReadinessResultView({ result, onCreateProject }: { result: Readi
))}
+ {result.machinery_guideline && result.machinery_guideline.length > 0 && (
+
+
+ Maschinensicherheit — Maschinenverordnung (EU) 2023/1230
+
+
+ Eigene Pflichten zur Personensicherheit — getrennt von den CRA-Cyber-Anforderungen.
+
+
+ {result.machinery_guideline.map((it) => (
+ -
+ {it.title}
+ · {it.annex_anchor}
+
+ ))}
+
+
+ )}
+
CRA-Fristen:
{result.deadlines.map((d) => (
diff --git a/backend-compliance/compliance/api/cra_assess_routes.py b/backend-compliance/compliance/api/cra_assess_routes.py
index 0bf5883c..23768e44 100644
--- a/backend-compliance/compliance/api/cra_assess_routes.py
+++ b/backend-compliance/compliance/api/cra_assess_routes.py
@@ -274,6 +274,7 @@ async def readiness(body: ReadinessRequest):
classification, rationale = _classify(intake)
in_scope = classification != "NOT_IN_SCOPE"
groups = {"code": [], "process": [], "document": []}
+ machinery_guideline = []
regulations = []
if in_scope:
regulations.append("CRA")
@@ -286,14 +287,14 @@ async def readiness(body: ReadinessRequest):
"measures": [{"id": m, "name": MEASURES.get(m, m)} for m in req.get("mapped_measures", [])],
"source": "CRA",
})
- # Machine/plant builders are ALSO hit by the new Machinery Regulation's
- # cyber-with-safety essential requirements (Annex III) — show the combination.
+ # Machinery-Regulation safety obligations are NOT CRA Annex-I cyber controls
+ # — keep them in their OWN section, not mixed into the Code/Process/Document
+ # cyber buckets (machine safety != cybersecurity).
if body.is_machinery or machine_integrator:
machinery = _machinery_obligations()
if machinery:
regulations.append("Maschinen-VO 2023/1230")
- for bucket, item in machinery:
- groups[bucket].append(item)
+ machinery_guideline = [item for _bucket, item in machinery]
total_effort = sum(r["effort_days"] for g in groups.values() for r in g if r.get("effort_days"))
verdict = compute_verdict(
classification, body.placed_on_market_after_2027,
@@ -306,6 +307,7 @@ async def readiness(body: ReadinessRequest):
"conformity_path_hint": _PATH_HINT.get(classification, ""),
"regulations": regulations,
"guideline": groups,
+ "machinery_guideline": machinery_guideline,
"counts": {k: len(v) for k, v in groups.items()},
"total_effort_days": total_effort,
"deadlines": list(DEADLINES),