Lenovo Z13 multimedia keys not recognised in i3

I’m running a relatively new NixOS install on an AMD based Lenovo Z13. I’m using i3 as my window manager. Only some of the multimedia/soft keys which are the alternates of the function keys are recognised.

Specifically, none of the multimedia keys (mute speakers, mute mic, vol up/vol down) send XF events.

The brightness up/down buttons send XF events, but don’t appear to be plumbed through correctly.

The “toggle flight mode” button appears to work correctly end to end.

Relevant configuration snippets:

{
  imports =
    [
       <nixos-hardware/lenovo/thinkpad/z/gen2/z13>
       ./hardware-configuration.nix
    ];
...

    services.xserver.xkb = {
        layout = "gb";
        variant = "dvorak";
        options = "ctrl:nocaps";
    }

Example input seen by xev when I hit F1 with FnLock off (should be “mute/unmute”):

KeymapNotify event, serial 34, synthetic NO, window 0x0,
    keys:  2   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
           0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

Compare that to F5:

KeyPress event, serial 34, synthetic NO, window 0x1000001,
    root 0x59d, subw 0x0, time 1529406, (41,1224), root:(1967,1256),
    state 0x0, keycode 232 (keysym 0x1008ff03, XF86MonBrightnessDown), same_screen YES,
    XLookupString gives 0 bytes:
    XmbLookupString gives 0 bytes:
    XFilterEvent returns: False

KeyRelease event, serial 34, synthetic NO, window 0x1000001,
    root 0x59d, subw 0x0, time 1529406, (41,1224), root:(1967,1256),
    state 0x0, keycode 232 (keysym 0x1008ff03, XF86MonBrightnessDown), same_screen YES,
    XLookupString gives 0 bytes:
    XFilterEvent returns: False

Two questions:

  1. What configuration is missing to generate the correct XF86* events?
  2. What is the correct way to set those up in NixOS?