{
  "schemaVersion": 1,
  "modelVersion": "1.2.0",
  "name": "Metkagram multilingual domain model",
  "description": "Language-independent Moves, stable Pattern Frames, explicit canonical Frames, reviewed-pilot FrameVariant relations and reviewed cross-language Bridges.",
  "compatibility": "Every existing Pattern ID and Pattern Frame remains valid. Reviewed canonical Frame families add a semantic layer over contextual Pattern variants; they do not delete or rename legacy records.",
  "invariants": [
    "A Move has no learning language.",
    "A Frame belongs to exactly one enabled learning language.",
    "A Bridge connects two existing Frames in different languages.",
    "No Bridge is published merely because two strings look similar; a reviewed mapping source is required.",
    "Translation locale, learning language, interface locale and annotation capability are independent.",
    "A learning language may publish reviewed Frame extensions before annotation or interface localization exists.",
    "A stable Pattern Frame may resolve to itself or to one explicit canonical Frame.",
    "A FrameVariant relation never deletes, renames or rewrites the stable Pattern ID that produced it.",
    "Canonical Frame grouping is published only from the explicit reviewed-pilot manifest; audit similarity alone cannot create a family.",
    "Canonical Frame membership is language-specific and does not imply cross-language equivalence; Bridges remain separate reviewed relations."
  ],
  "counts": {
    "patterns": 948,
    "moves": 14,
    "frames": 1916,
    "extensionFrames": 20,
    "bridges": 70,
    "languagePilots": 1,
    "canonicalFrames": 0,
    "frameVariants": 0,
    "canonicalFrameFamilies": 0
  },
  "languages": {
    "schemaVersion": 1,
    "interfaceLocales": [
      "en",
      "ru"
    ],
    "learningLanguages": [
      "en",
      "de",
      "fr"
    ],
    "translationLocales": [
      "ru"
    ],
    "annotationLanguages": [
      "en",
      "de"
    ],
    "languages": {
      "en": {
        "code": "en",
        "slug": "english",
        "nativeName": "English",
        "direction": "ltr",
        "status": "stable",
        "roles": {
          "interface": true,
          "learning": true,
          "translation": false,
          "annotation": true
        }
      },
      "de": {
        "code": "de",
        "slug": "german",
        "nativeName": "Deutsch",
        "direction": "ltr",
        "status": "stable",
        "roles": {
          "interface": false,
          "learning": true,
          "translation": false,
          "annotation": true
        }
      },
      "fr": {
        "code": "fr",
        "slug": "french",
        "nativeName": "Français",
        "direction": "ltr",
        "status": "pilot",
        "roles": {
          "interface": false,
          "learning": true,
          "translation": false,
          "annotation": false
        }
      },
      "ru": {
        "code": "ru",
        "slug": "russian",
        "nativeName": "Русский",
        "direction": "ltr",
        "status": "stable",
        "roles": {
          "interface": true,
          "learning": false,
          "translation": true,
          "annotation": false
        }
      }
    }
  },
  "languagePilots": {
    "fr": {
      "status": "editorial_pilot",
      "frameCount": 20,
      "exampleCount": 60,
      "patternIds": [
        "CLF041",
        "CLF042",
        "CLF043",
        "CLF045",
        "CLF046",
        "CLF047",
        "CLF049",
        "CLF050",
        "CLF051",
        "CLF053",
        "CLF054",
        "CLF055",
        "CLF056",
        "CLF057",
        "CLF058",
        "CLF059",
        "CLF061",
        "CLF062",
        "CLF063",
        "CLF064"
      ],
      "sourceFiles": [
        "data/language-pilots/french-v1.json"
      ],
      "translationLocales": [
        "ru"
      ],
      "reviewedBridges": 0,
      "pages": {
        "en": "https://metkagram.github.io/en/practice/language/french/",
        "ru": "https://metkagram.github.io/ru/practice/language/french/"
      },
      "boundary": "Frame-only pilot. No annotation capability and no cross-language Bridge is implied by the existence of a French Frame."
    }
  },
  "datasets": {
    "moves": "https://metkagram.github.io/data/domain/moves.json",
    "frames": "https://metkagram.github.io/data/domain/frames.json",
    "bridges": "https://metkagram.github.io/data/domain/bridges.json",
    "patternIndex": "https://metkagram.github.io/data/domain/pattern-index.json",
    "languagePilots": "https://metkagram.github.io/data/domain/language-pilots.json",
    "canonicalFrames": "https://metkagram.github.io/data/domain/canonical-frames.json",
    "frameVariants": "https://metkagram.github.io/data/domain/frame-variants.json"
  },
  "api": {
    "manifest": "https://metkagram.github.io/api/v1/domain-model.json",
    "moves": "https://metkagram.github.io/api/v1/moves.json",
    "frames": "https://metkagram.github.io/api/v1/frames.json",
    "bridges": "https://metkagram.github.io/api/v1/bridges.json",
    "languagePilots": "https://metkagram.github.io/api/v1/language-pilots.json",
    "canonicalFrames": "https://metkagram.github.io/api/v1/canonical-frames.json",
    "frameVariants": "https://metkagram.github.io/api/v1/frame-variants.json"
  }
}
