Fresh arithmetic/host-selftest/offlineELF inspection. No hardware/serial-port/GUI execution.

verify_model.py 
{
  "scope": "Pure protocol/ring arithmetic and callback-order decision model; not hardware or interrupt timing",
  "checks_passed": [
    "100 frames streamed byte by byte",
    "32byte-IDLE chunk equivalence",
    "sequence uint32 wrap",
    "sum8 corruption detection example",
    "line overflow discard",
    "NUL/nonprintable rejection",
    "recovery discard toEOL",
    "ring255 capacity",
    "ring wrap1000",
    "sequence discontinuity detection",
    "malformed bounds",
    "error-before-rearm guard"
  ],
  "model_frames_accepted": 100,
  "ring_size": 256,
  "usable_capacity": 255,
  "line_buffer_size": 96,
  "payload_max_bytes": 32,
  "checksum": "sum8 ASCII prefix; not CRC or collision-free integrity guarantee"
}

host_verify_serial.py --self-test
Host frame self-test passed; no serial port opened.

inspect_elf.py 
{
  "gebrabit_lesson13_uart_it_v2/Debug/gebrabit_lesson13_uart_it_v2.elf": {
    "machine": "ARM ELF32 little-endian",
    "entry_address": "0x08005461",
    "debug_section_sizes": {
      ".debug_info": 78401,
      ".debug_abbrev": 16236,
      ".debug_loclists": 6696,
      ".debug_aranges": 2720,
      ".debug_line": 53050,
      ".debug_str": 713636,
      ".debug_frame": 9120,
      ".debug_rnglists": 1896,
      ".debug_macro": 119496,
      ".debug_line_str": 299
    },
    "selected_symbols": {
      "rx_tail": {
        "address": "0x200002EC",
        "size_bytes": 4,
        "section_index": 11
      },
      "ring_drops": {
        "address": "0x200002F4",
        "size_bytes": 4,
        "section_index": 11
      },
      "rx_ring": {
        "address": "0x200001E8",
        "size_bytes": 256,
        "section_index": 11
      },
      "main": {
        "address": "0x08004973",
        "size_bytes": 64,
        "section_index": 2
      },
      "uart_errors": {
        "address": "0x200002FC",
        "size_bytes": 4,
        "section_index": 11
      },
      "rx_head": {
        "address": "0x200002E8",
        "size_bytes": 4,
        "section_index": 11
      }
    },
    "validation": "offline metadata inspection only; no board execution or target debugger observations"
  },
  "gebrabit_lesson13_idle_it_v2/Debug/gebrabit_lesson13_idle_it_v2.elf": {
    "machine": "ARM ELF32 little-endian",
    "entry_address": "0x08005479",
    "debug_section_sizes": {
      ".debug_info": 78402,
      ".debug_abbrev": 16235,
      ".debug_loclists": 6696,
      ".debug_aranges": 2720,
      ".debug_line": 53050,
      ".debug_str": 713636,
      ".debug_frame": 9120,
      ".debug_rnglists": 1896,
      ".debug_macro": 119496,
      ".debug_line_str": 299
    },
    "selected_symbols": {
      "rx_tail": {
        "address": "0x200002EC",
        "size_bytes": 4,
        "section_index": 11
      },
      "ring_drops": {
        "address": "0x200002F4",
        "size_bytes": 4,
        "section_index": 11
      },
      "rx_ring": {
        "address": "0x200001E8",
        "size_bytes": 256,
        "section_index": 11
      },
      "main": {
        "address": "0x0800498B",
        "size_bytes": 64,
        "section_index": 2
      },
      "uart_errors": {
        "address": "0x200002FC",
        "size_bytes": 4,
        "section_index": 11
      },
      "rx_head": {
        "address": "0x200002E8",
        "size_bytes": 4,
        "section_index": 11
      }
    },
    "validation": "offline metadata inspection only; no board execution or target debugger observations"
  }
}

calculate_budget.py
{
  "scope": "Ideal8N1 wire arithmetic with initially empty queue. No real timing, board throughput, or zero-loss guarantee.",
  "baud": 115200,
  "bits_per_frame": 10,
  "ideal_byte_period_us": 86.80555555555556,
  "ideal_one_direction_bytes_per_second": 11520.0,
  "ring_usable_capacity": 255,
  "empty_ring_ideal_backlog_ms": 22.135416666666668,
  "configured_main_TX_timeout_ms": 100,
  "largest_protocol_line_without_EOL_bytes": 80,
  "largest_frame_CRLF_bytes": 82,
  "largest_ACK_bytes": 17,
  "largest_ACK_ideal_wire_ms": 1.4756944444444444,
  "warning": "Actual queue occupancy, IRQ masking/service/rearm gaps, parser/TX work and sender bursts limit behavior. Sum8 and sequence checks do not detect all corruption or quantify every lost byte."
}
