{
  "registry": "DocuLife — Registr exportních struktur (EU Data Act čl. 26)",
  "registry_version": "1.0",
  "schema_version": 1,
  "description": "Strojově čitelný popis struktury kompletního exportního balíčku DocuLife (univerzální exit — dostupný každé organizaci bez ohledu na tarif). Kódování UTF-8; časy ISO-8601; identifikátory UUID; JSONL = jeden JSON objekt na řádek.",
  "contact": "info@doculife.cz",
  "package": {
    "artifacts": [
      {
        "name": "part-NNNNN.zip",
        "kind": "data | files",
        "description": "Části balíčku, číslované jednou společnou sekvencí (5 míst). DATA část obsahuje právě jeden soubor records.jsonl (max. 50 000 záznamů na část). FILES část obsahuje originály příloh na cestě soubory/{record_id}/{file_id}_{název_souboru} (cílová velikost části ~2 GB; větší soubor dostane vlastní část)."
      },
      { "name": "structure.json", "description": "Popis prostředí organizace — viz structure_json níže." },
      { "name": "{kategorie}-NNNNN.jsonl / .csv", "description": "Metadata organizace po kategoriích (chunkované) — viz metadata níže." },
      { "name": "manifest.json", "description": "Rozcestník balíčku s kontrolními součty — viz manifest_json níže." },
      { "name": "manifest.json.sha256", "description": "Samostatný SHA-256 otisk manifestu ve tvaru \"{sha256}  manifest.json\\n\"." }
    ],
    "integrity": "SHA-256 se počítá pro každý artefakt (části, metadata soubory, structure.json i manifest.json); manifest agreguje otisky všech částí a structure artefaktu."
  },
  "records_jsonl": {
    "description": "Jeden záznam na řádek. Hodnoty polí (fields) jsou schválené hodnoty záznamu.",
    "fields": {
      "schema_version": "int — verze schématu řádku (aktuálně 1)",
      "record_id": "string (UUID)",
      "record_type_id": "string (UUID) | null — typ záznamu (složka)",
      "agenda_id": "string (UUID) | null",
      "status": "string — stav záznamu",
      "workflow_status": "string | null — stav schvalování",
      "description": "string | null",
      "created_at": "string (ISO-8601)",
      "updated_at": "string (ISO-8601)",
      "deleted_at": "null (živé záznamy)",
      "created_by_user_id": "string (UUID) | null",
      "auto_number": "string | null — automatické číslo záznamu",
      "fields": "object — hodnoty polí dle klíče pole; skalární hodnoty přímo; výběr: [{option_id, label}]; vazba na záznam: [{record_id, display_name|null}]; osoba: [{user_id, display_name}]",
      "files": "array — odkazy na přiložené soubory; prvek: {file_id, path, original_filename, size_bytes, content_type, checksum_sha256}; path odkazuje do FILES části balíčku (soubory/{record_id}/{file_id}_{název})"
    }
  },
  "structure_json": {
    "description": "Popis prostředí organizace, čteno při dokončení exportu.",
    "keys": {
      "schema_version": "int (1)",
      "agendas": "agendy organizace",
      "record_types": "typy záznamů (složky) včetně definic polí",
      "select_options": "možnosti výběrových polí",
      "views": "uložené pohledy",
      "deadline_rules": "pravidla termínů",
      "access_model": "{schema_version, categories} — přehled kategorií přístupového modelu a jejich formátů"
    }
  },
  "manifest_json": {
    "description": "Deterministický JSON (UTF-8, seřazené klíče).",
    "keys": {
      "schema_version": "int (1)",
      "job_id": "string (UUID)",
      "consistency": "string — \"materialized_scope_not_point_in_time\" (obsah se čte průběžně, ne k jednomu okamžiku)",
      "status": "string — stav exportu",
      "selection_at": "string (ISO-8601) | null",
      "generated_at": "string (ISO-8601)",
      "counts": "{records: {total, exported, deleted_during_export, error}, files: {total, exported, deleted_during_export, error}, bytes_total}",
      "parts": "array — {part_number, artifact_name, sha256, size_bytes}, řazeno dle part_number",
      "failed_parts": "int — počet nedokončených částí",
      "structure_artifact": "{name, sha256, size_bytes}",
      "errors": "array — {category, record_id, file_id, error}",
      "deleted_during_export": "array — {category, record_id, file_id}",
      "metadata": "array — {category, status, rows_written, artifacts: [{name, sha256, size_bytes, rows}]}",
      "not_exported": "objekt s odůvodněním, co balíček záměrně neobsahuje: embeddings (AI indexy), logs_telemetry (provozní logy), infrastructure_config (konfigurace infrastruktury) — každý s reason"
    }
  },
  "metadata": {
    "description": "Metadata organizace po kategoriích; soubory {kategorie}-NNNNN.jsonl, u vybraných kategorií navíc CSV. Každý JSONL řádek nese schema_version = 1.",
    "jsonl_categories": {
      "memberships": ["membership_id", "user_id", "email", "full_name", "role", "status", "created_at"],
      "groups": "dva typy řádků: {type: \"group\", id, name, description, created_at} a {type: \"group_membership\", id, group_id, user_id, created_at}",
      "acl_grants": ["type", "grant_id", "created_at", "principal_type", "principal_id", "principal_label", "resource_type", "resource_id", "resource_label", "access_level", "granted_by_user_id", "granted_by_display"],
      "user_audit": ["type", "id", "occurred_at", "actor_user_id", "actor_display", "action", "resource_type", "resource_id", "resource_name_snapshot", "target_user_id", "target_display", "metadata"],
      "acl_audit": ["type", "id", "occurred_at", "actor_user_id", "actor_display", "action", "principal_type", "principal_id", "principal_label", "resource_type", "resource_id", "resource_label", "metadata"],
      "token_audit": ["type", "id", "occurred_at", "actor_user_id", "actor_display", "api_token_id", "token_name", "action", "metadata"]
    },
    "csv_variants": {
      "categories": ["memberships", "user_audit", "acl_audit", "token_audit"],
      "format": "UTF-8 s BOM, dialekt Excel, hlavička na začátku každého souboru; sloupce odpovídají klíčům JSONL varianty; vnořený objekt metadata je v buňce jako kompaktní JSON řetězec; buňky začínající = + - @ jsou prefixovány apostrofem (ochrana před formula injection)"
    }
  },
  "xlsx_export_note": "Vedle kompletního balíčku existuje interaktivní export jednotlivého pohledu do .xlsx (volitelně ZIP se soubory), omezený na 1 000 záznamů / 500 souborů / 100 MB; neobsahuje manifest ani kontrolní součty. Pro migraci celé organizace je určen kompletní balíček popsaný v tomto registru."
}
