03 – JSON-Schema für Antworten, Evidenzen und Export

Formale Schemata liegen unter docs/schema/ (JSON Schema Draft 2020-12):

Zwischenstand (state)

{
  "version": "1.0.0",
  "meta": { "project": "Bochum IIS-SRV01", "interviewer": "…", "itContact": "…",
            "createdAt": "2026-09-07T10:00:00.000Z", "updatedAt": "2026-09-07T11:30:00.000Z" },
  "answers": {
    "C27": { "value": "ja", "note": "", "evidence": "Web-WebSockets Installed\nwebSocket enabled=\"true\"",
             "status": "confirmed", "itConfirmed": true, "later": false, "updatedAt": "…" },
    "D_php_tech": { "value": "nicht_installierbar", "status": "na", "note": "keine PHP-Freigabe", "evidence": "", "itConfirmed": false, "later": false, "updatedAt": "…" },
    "C02": { "value": ["static", "windows_auth", "websocket"], "status": "confirmed", "note": "", "evidence": "Get-WindowsFeature Web-* …", "itConfirmed": false, "later": false, "updatedAt": "…" }
  },
  "profiles": [ { "…": "siehe Clientprofil" } ]
}

Werttypen je Fragetyp: ynu/single → String (Optionswert); multi → Array von Strings; number → Number; version/text → String; check → Boolean.

Clientprofil (cct-profile/1.0)

{
  "schema": "cct-profile/1.0",
  "id": "iphone-mobileiron-web-work", "name": "iPhone MobileIron/Web@Work",
  "deviceType": "Smartphone", "os": "iOS", "osVersion": "17.5",
  "browser": "Web@Work 3.x", "mdm": "Ivanti EPMM", "mdmVersion": "12.1",
  "accessPath": "MobileIron/Ivanti-Tunnel (Per-App-VPN)", "userGroup": "Einsatzkräfte",
  "mandatory": true,
  "ua": "Mozilla/5.0 (iPhone; …)", "auto": { "screen": "390×844 @3", "touch": true, "secure": true, "…": "…" },
  "probeBase": "https://app.intern/probe", "probeAvailable": true,
  "results": {
    "fetch":     { "ok": true,  "detail": "HTTP 200 application/json", "note": "", "manual": false, "ts": "…" },
    "websocket": { "ok": false, "detail": "Timeout – kein Echo (Tunnel/Proxy blockiert Upgrade?)", "note": "Screenshot 12", "manual": false, "ts": "…" },
    "download":  { "ok": true,  "detail": "Manueller Test", "note": "Datei in Files-App sichtbar", "manual": true, "ts": "…" }
  },
  "createdAt": "…", "updatedAt": "…"
}

ok: true = Erfolg, false = Fehler, null = Unbekannt. manual = true bedeutet, das Ergebnis wurde vom Tester überschrieben; autoOk bewahrt das automatische Ergebnis.

Rohdatenexport (tdt-export/1.0)

{
  "schema": "tdt-export/1.0", "exportedAt": "…", "catalogVersion": "1.0.0",
  "meta": { "…": "…" },
  "answers": { "…": "wie Zwischenstand" },
  "profiles": [ "…" ],
  "evaluation": {
    "gates": { "SERVER": { "total": 40, "checked": 31, "coverage": 0.78, "essentialOpen": [], "red": ["…"], "ready": true, "label": "belastbar geprüft" } },
    "caps": [ { "id": "iis_websocket", "gate": "SERVER", "name": "WebSocket-Protokoll (Server)", "status": "G", "statusLabel": "GRÜN", "evidence": "C27: Ja | Nachweis: … | durch IT bestätigt", "meaning": "…", "consequence": "…", "essential": false } ],
    "frontend": { "grade": "B", "label": "B – Progressive Enhancement empfohlen", "reasons": ["…"], "assets": "…" },
    "blockers": [ { "type": "ROT (essenziell)", "text": "…", "id": "db_backup" } ],
    "open": [ { "id": "E11", "sec": "E", "title": "…", "cmd": "…", "gui": "…", "reason": "nicht beantwortet", "later": false } ],
    "matrix": { "profiles": [ "…" ], "rows": [ { "id": "fetch", "name": "Fetch API", "group": "Netzwerk", "cells": ["OK", "OK"], "code": "G", "decision": "Nutzbar (alle Pflichtclients)", "detail": "…" } ], "lcd": ["…"], "partial": ["…"], "blocked": ["…"], "unknown": ["…"] },
    "stacks": [ { "variant": "Bevorzugt", "title": "…", "backend": "…", "frontend": "…", "db": "…", "auth": "…", "api": "…", "jobs": "…", "realtime": "…", "logging": "…", "deploy": "…", "test": "…", "prereq": ["…"], "pros": "…", "cons": "…", "status": "G", "statusLabel": "GRÜN" } ],
    "levels": { "inside": ["…"], "extend": [ { "id": "rt_hosting", "text": "…", "status": "GELB" } ], "outside": ["…"] }
  },
  "catalog": [ { "id": "A01", "sec": "A", "title": "…", "type": "version" } ]
}

Der Export enthält den Katalog-Snapshot (IDs, Typen, Optionswerte), damit Rohdaten auch ohne das Tool interpretierbar bleiben.