{
  "baseline_mapping": {
    "peer_10_253_1_X_in_vpn": {
      "db_bytes_column": "last_rx_bytes",
      "db_packets_column": "last_rx_packets",
      "semantics": "transit_vpn_to_client"
    },
    "peer_10_253_1_X_out_vpn": {
      "db_bytes_column": "last_tx_bytes",
      "db_packets_column": "last_tx_packets",
      "semantics": "client_to_transit_vpn"
    }
  },
  "delta_formula": {
    "active_now": "delta_packets >= 10 OR delta_bytes >= 16384",
    "delta_bytes": "delta_tx_bytes + delta_rx_bytes",
    "delta_packets": "delta_tx_packets + delta_rx_packets",
    "delta_rx_bytes": "current_in_bytes - last_rx_bytes",
    "delta_rx_packets": "current_in_packets - last_rx_packets",
    "delta_tx_bytes": "current_out_bytes - last_tx_bytes",
    "delta_tx_packets": "current_out_packets - last_tx_packets"
  },
  "migration_required": false,
  "settings": {
    "bytes_min": 16384,
    "cooldown_seconds": 900,
    "force_mode": "off",
    "idle_seconds": 900,
    "packets_min": 10,
    "rebalance_paused": "0",
    "sample_seconds": 120
  },
  "state_policy": {
    "active_delta": "state=active, last_activity_at=now(), update baselines",
    "forced": "assignment not changed; counters/baseline may still update",
    "no_delta_active": "remain active until idle_seconds timeout; later sampler/rebalancer may mark idle",
    "no_delta_idle": "state remains idle, update baselines if counters changed but below threshold"
  },
  "write_columns": [
    "last_tx_packets",
    "last_tx_bytes",
    "last_rx_packets",
    "last_rx_bytes",
    "state",
    "last_activity_at",
    "updated_at",
    "reason"
  ]
}
