{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "field_replay.load_report.v2",
  "description": "Load==measurement report. v2: all bare *_mbps are L1 WIRE rate (UDP datagram + IP/UDP/Eth/FCS/preamble/IFG framing) -- the honest network bandwidth. The framing block + *_l2/_l3/_payload siblings give the other layers. (v1 reported UDP-payload rate only, under-counting the link.)",
  "type": "object",
  "required": ["schema", "capacity_mbps", "knee", "working_point", "ramp", "framing"],
  "properties": {
    "schema": {"const": "field_replay.load_report.v2"},
    "direction": {"type": "string"},
    "capacity_mbps": {"type": "number", "description": "delivered-rate plateau (capacity), L1 wire Mbps"},
    "capacity_l2_mbps": {"type": "number", "description": "capacity at L2 Ethernet frame rate"},
    "capacity_l3_mbps": {"type": "number", "description": "capacity at L3/IP datagram rate"},
    "capacity_payload_mbps": {"type": "number", "description": "capacity at UDP payload rate (application goodput)"},
    "latency_budget_ms": {"type": "number"},
    "loss_method": {"type": "string"},
    "loss_warning": {"type": "string"},
    "forward_truth_corrected": {"type": "boolean"},
    "framing": {
      "type": "object",
      "required": ["rate_layer", "datagram_bytes", "l1_overhead_bytes"],
      "description": "Frame-overhead 口径: lets a consumer convert any *_mbps between layers.",
      "properties": {
        "rate_layer": {"const": "l1_wire"},
        "datagram_bytes": {"type": "integer", "description": "UDP datagram (payload) length sent per packet"},
        "l1_overhead_bytes": {"type": "integer", "description": "framing added on the wire below the datagram (untagged Ethernet 66, +4 per VLAN tag)"},
        "vlan_tagged": {"type": "boolean"},
        "layers_reported": {"type": "array", "items": {"type": "string"}},
        "note": {"type": "string"}
      }
    },
    "knee": {"type": "object"},
    "working_point": {"type": "object"},
    "confidence": {"type": "object"},
    "burst_loss": {"type": "object"},
    "ramp": {"type": "array", "items": {"type": "object"}},
    "refine_probes": {"type": "array", "items": {"type": "object"}},
    "backoff_trace": {"type": "array", "items": {"type": "object"}},
    "working_timeline": {"type": "array", "items": {"type": "object"}}
  }
}
