# Bottleneck Parent: 10-node focused Bluetooth bottleneck test
#
# Explicit topology with two Bluetooth (L2CAP) links that create
# bottleneck parent candidates. Tests that nodes avoid choosing
# Bluetooth parents when fiber alternatives exist at the same or
# slightly greater depth.
#
# Topology:
#
#        n01 (root)
#       / | \  \
#      f  f  f  f
#     /   |   \  \
#   n02  n03  n04 n05
#    |  / | \   |
#    BT f  f    BT
#    | /  |   \  |
#   n06  n07  n08 n09
#              |
#              f
#              |
#             n10
#
# Edges and link types:
#   Fiber:     n01-n02, n01-n03, n01-n04, n01-n05,
#              n03-n06, n03-n07, n04-n08, n08-n10
#   Bluetooth: n02-n06, n05-n09
#
# Cross-links: n03-n08 (fiber) — gives n08 a fiber alternative to n04
#
# Test subjects:
#   - n06 has Bluetooth (n02) and fiber (n03) at depth 1 — should pick n03
#   - n09 has only Bluetooth (n05) — no alternative, stuck with BT parent

scenario:
  name: "bottleneck-parent"
  seed: 42
  duration_secs: 60

topology:
  algorithm: explicit
  num_nodes: 10
  params:
    adjacency:
      - [n01, n02]
      - [n01, n03]
      - [n01, n04]
      - [n01, n05]
      - [n02, n06]
      - [n03, n06]
      - [n03, n07]
      - [n03, n08]
      - [n04, n08]
      - [n05, n09]
      - [n08, n10]
  subnet: "172.20.0.0/24"
  ip_start: 10

netem:
  enabled: true
  default_policy:
    delay_ms: [1, 5]
    jitter_ms: [0, 1]
    loss_pct: [0, 0.5]
  link_policies:
    # Bluetooth (L2CAP) links
    - edges: ["n02-n06", "n05-n09"]
      policy:
        delay_ms: [15, 40]
        jitter_ms: [5, 15]
        loss_pct: [2, 8]
  mutation:
    interval_secs: {min: 30, max: 60}
    fraction: 0.2
    policies:
      normal:
        delay_ms: [1, 5]
        loss_pct: [0, 0.5]

link_flaps:
  enabled: false

traffic:
  enabled: true
  max_concurrent: 2
  interval_secs: {min: 15, max: 30}
  duration_secs: {min: 5, max: 10}
  parallel_streams: 2

logging:
  rust_log: "info"
  output_dir: "./sim-results"
