From 9660724a2c69c3fab89e0629c33bbc1cb2ae0bad Mon Sep 17 00:00:00 2001 From: Benjamin Admin Date: Sun, 14 Jun 2026 13:33:09 +0200 Subject: [PATCH] feat(cra): CRA Readiness Check lead-magnet on /sdk/cra (Track A) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Low-friction, stateless readiness check (no project/DB): business-scope answers (internet / parameter app / remote maintenance / updates / firmware / personal data / critical infra) -> Annex III/IV classification (reuses _classify) + a high-level guideline grouped Code / Prozess / Dokumentation (via Annex I evidence_type) + conformity path + deadlines + rough effort + the "we implement" hook and a CTA into the existing project workflow. Endpoint POST /api/v1/cra/ readiness. Reuse + reframe of the existing CRA module — no duplicate questionnaire. Co-Authored-By: Claude Opus 4.7 --- .../sdk/cra/_components/ReadinessCheck.tsx | 152 ++++++++++++++++++ admin-compliance/app/sdk/cra/page.tsx | 3 + .../compliance/api/cra_assess_routes.py | 63 ++++++++ .../tests/test_cra_readiness.py | 31 ++++ 4 files changed, 249 insertions(+) create mode 100644 admin-compliance/app/sdk/cra/_components/ReadinessCheck.tsx create mode 100644 backend-compliance/tests/test_cra_readiness.py diff --git a/admin-compliance/app/sdk/cra/_components/ReadinessCheck.tsx b/admin-compliance/app/sdk/cra/_components/ReadinessCheck.tsx new file mode 100644 index 00000000..f788f84b --- /dev/null +++ b/admin-compliance/app/sdk/cra/_components/ReadinessCheck.tsx @@ -0,0 +1,152 @@ +'use client' + +import { useState } from 'react' + +interface GuidelineItem { + req_id: string + title: string + category: string + annex_anchor: string + severity: string + effort_days?: number + measures: { id: string; name: string }[] +} +interface ReadinessResult { + in_scope: boolean + classification: string + rationale: string[] + conformity_path_hint: string + guideline: { code: GuidelineItem[]; process: GuidelineItem[]; document: GuidelineItem[] } + counts: { code: number; process: number; document: number } + total_effort_days: number + deadlines: { date: string; label: string }[] +} + +const CLASS_LABEL: Record = { + CRITICAL: 'Kritisch', IMPORTANT_II: 'Wichtig (Klasse II)', IMPORTANT_I: 'Wichtig (Klasse I)', + STANDARD: 'Standard', NOT_IN_SCOPE: 'Nicht im CRA-Anwendungsbereich', +} +const BUCKETS: { key: 'code' | 'process' | 'document'; label: string; hint: string }[] = [ + { key: 'code', label: 'Code / Technik', hint: 'im Produkt umzusetzen' }, + { key: 'process', label: 'Prozesse', hint: 'organisatorisch zu etablieren' }, + { key: 'document', label: 'Dokumentation', hint: 'nachzuweisen / beizulegen' }, +] + +export function ReadinessCheck({ onCreateProject }: { onCreateProject?: () => void }) { + const [intendedUse, setIntendedUse] = useState('') + const [flags, setFlags] = useState>({}) + const [result, setResult] = useState(null) + const [loading, setLoading] = useState(false) + + const toggle = (k: string) => setFlags((f) => ({ ...f, [k]: !f[k] })) + + const run = async () => { + setLoading(true) + try { + const res = await fetch('/api/v1/cra/readiness', { + method: 'POST', headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ intended_use: intendedUse, ...flags }), + }) + setResult(res.ok ? await res.json() : null) + } finally { setLoading(false) } + } + + const QUESTIONS: { k: string; label: string }[] = [ + { k: 'connected_to_internet', label: 'Hängt das Produkt am Internet (oder soll es)?' }, + { k: 'user_parameter_app', label: 'Gibt es eine App, mit der Nutzer Parameter einstellen?' }, + { k: 'remote_maintenance', label: 'Bietet ihr Fernwartung an?' }, + { k: 'has_software_updates', label: 'Hat es Software-/Firmware-Updates?' }, + { k: 'has_firmware', label: 'Enthält es Firmware (Embedded/IoT)?' }, + { k: 'processes_personal_data', label: 'Verarbeitet es personenbezogene Daten?' }, + { k: 'is_critical_infra_supplier', label: 'Wird es in kritischer Infrastruktur eingesetzt?' }, + ] + + return ( +
+

CRA-Readiness-Check

+

+ Was kommt mit dem Cyber Resilience Act auf Ihr Produkt zu? Ein paar Fragen — Sie bekommen sofort + eine auf Ihren Scope zugeschnittene Übersicht (Code, Prozesse, Dokumentation). Wir analysieren — + und setzen es mit Ihnen um. +

+ +