{
  "schema_version": "qazstack-language-surface-v1",
  "project_id": "qazgeo",
  "public_surface": "https://qgeo.tech",
  "public_machine_artifact": {
    "url": "https://qgeo.tech/.well-known/qazstack-language-surface.json",
    "media_type": "application/json",
    "indexing": "noindex",
    "cache_control": "public, max-age=300"
  },
  "canonical_locales": ["kk", "ru", "en"],
  "legacy_aliases": {
    "kz": "kk",
    "kz-KZ": "kk",
    "kk-KZ": "kk"
  },
  "interface": {
    "supported_locales": ["ru", "kk"],
    "default_locale": "ru",
    "route_strategy": "query-lang-with-canonical-output",
    "parity_status": "catalog-complete-record-dependent",
    "english_ui": "not-present",
    "evidence": [
      "app/services/localization.py",
      "templates/map.html",
      "templates/mapregion.html",
      "templates/data.html",
      "templates/workbench.html",
      "tests/test_public_pages.py"
    ]
  },
  "content": {
    "geographic_identity": {
      "supported_locales": ["ru", "kk", "en"],
      "storage_fields": ["name_ru", "name_kz", "name_en"],
      "canonical_kazakh_field": "name_kk",
      "legacy_kazakh_fields": ["name_kz"],
      "parity_status": "source-owned-record-labels",
      "source_files": [
        "app/models.py",
        "app/services/reverse.py",
        "app/services/choropleth.py",
        "app/routers/external_layers.py",
        "data/layer-catalog.json"
      ]
    },
    "geocoder_goldset": {
      "supported_locales": ["ru", "kk", "en"],
      "source_file": "data/benchmarks/geocoder_ru_kk.json",
      "status": "language-covered-benchmark-not-translation-memory"
    },
    "parity_status": "surface-specific",
    "missing_content_policy": "a missing localized geographic label is a data-coverage gap; source-language labels must not be copied as a translation"
  },
  "processing": {
    "geocoder": {
      "supported_locales": ["ru", "kk", "en"],
      "capability": "multilingual-name-search-and-location-resolution",
      "source_files": [
        "app/services/geocoder.py",
        "app/services/territory_aliases.py",
        "app/services/photon_geocoder.py"
      ]
    },
    "qazlake": {
      "language_metadata": "source-owned-and-projection-specific",
      "translation_runtime": false,
      "source_files": [
        "app/routers/external_layers.py",
        "docs/QAZGEO_ECOSYSTEM_OPERATING_MODEL_2026-07-15.md"
      ]
    },
    "observability": {
      "runtime_connected": false,
      "mode": "contract-only",
      "report_schema": "https://platform.qdev.run/schemas/qazstack-language-observability-v1.json",
      "dimensions": ["ui_locale", "source_language", "entity_locale"],
      "metrics": [
        "ui_catalog_parity_rate",
        "geographic_label_language_metadata_known_rate",
        "geographic_label_canonical_language_rate",
        "public_translation_coverage_rate",
        "candidate_count",
        "approved_count",
        "rejected_count"
      ],
      "raw_text_export": false,
      "remote_write": false,
      "automatic_memory_promotion": false,
      "release_boundary": "geographic labels and geocoder aliases only; source/projection language is not translation quality or memory input"
    }
  },
  "translation": {
    "portfolio_memory_runtime_connected": false,
    "automatic_translation": false,
    "human_review_required_for_public_translation": true,
    "memory_write_policy": "approved-only",
    "feedback_loop": "planned-through-qmt-qazlake-qazcompute",
    "raw_or_unreviewed_text_to_memory": false
  },
  "legacy_boundary": {
    "public_locale": "kk",
    "integration_only_aliases": ["kz", "kz-KZ", "kk-KZ"],
    "rule": "Canonical kk is used for UI and shared contracts. Existing name_kz database/source fields remain compatibility fields and must be projected as name_kk only at an explicitly versioned public boundary."
  },
  "quality_rules": [
    "RU/KK UI catalog parity is measured separately from geographic record-label parity and English data fields.",
    "name_kz is a legacy field name, not a new shared locale identifier.",
    "Geocoder aliases and language-aware search improve matching but do not establish translation quality.",
    "English geographic fields do not imply an English QazGeo interface.",
    "QazLake language metadata describes source or projection state and is not translation coverage.",
    "Only approved, source-verified corrections may enter shared QazStack translation memory."
  ],
  "qazstack_consumer_contract": "docs/qazstack/consumer-contract.json"
}
