Udev SYMLINK not applying

I’ve got a USB device which exposes 2 CDC-ACM endpoints and one USB-DFU endpoint. I want to ensure all endpoints can be accessed by the logged-in user, and additionally that the CDC-ACM endpoints’ TTY devices show up as /dev/ttyCUST# for some number #. I don’t care if they still show up as /dev/ttyACM#, just as long as they also end up as /dev/ttyCUST#.

I’ve got the following UDEV rules in my configuration:

  services.udev.extraRules = ''
    SUBSYSTEM=="tty", ATTR{idVendor}=="36dc", ATTR{idProduct}=="0005", MODE:="0660", TAG+="uaccess", SYMLINK+="ttyCUST%n"
    SUBSYSTEM=="usb", ATTR{idVendor}=="36dc", ATTR{idProduct}=="0005", MODE:="0660", TAG+="uaccess", ATTR{power/wakeup}="enabled"
  '';

Udevadm info attribute walk up to the hub:

  looking at device '/devices/pci0000:00/0000:00:14.0/usb3/3-6/3-6.4/3-6.4.3/3-6.4.3.3/3-6.4.3.3.2/3-6.4.3.3.2:1.0/tty/ttyACM0':
    KERNEL=="ttyACM0"
    SUBSYSTEM=="tty"
    DRIVER==""
    ATTR{power/async}=="disabled"
    ATTR{power/control}=="auto"
    ATTR{power/runtime_active_kids}=="0"
    ATTR{power/runtime_active_time}=="0"
    ATTR{power/runtime_enabled}=="disabled"
    ATTR{power/runtime_status}=="unsupported"
    ATTR{power/runtime_suspended_time}=="0"
    ATTR{power/runtime_usage}=="0"

  looking at parent device '/devices/pci0000:00/0000:00:14.0/usb3/3-6/3-6.4/3-6.4.3/3-6.4.3.3/3-6.4.3.3.2/3-6.4.3.3.2:1.0':
    KERNELS=="3-6.4.3.3.2:1.0"
    SUBSYSTEMS=="usb"
    DRIVERS=="cdc_acm"
    ATTRS{authorized}=="1"
    ATTRS{bAlternateSetting}==" 0"
    ATTRS{bInterfaceClass}=="02"
    ATTRS{bInterfaceNumber}=="00"
    ATTRS{bInterfaceProtocol}=="00"
    ATTRS{bInterfaceSubClass}=="02"
    ATTRS{bNumEndpoints}=="01"
    ATTRS{bmCapabilities}=="2"
    ATTRS{iad_bFirstInterface}=="00"
    ATTRS{iad_bFunctionClass}=="02"
    ATTRS{iad_bFunctionProtocol}=="00"
    ATTRS{iad_bFunctionSubClass}=="02"
    ATTRS{iad_bInterfaceCount}=="02"
    ATTRS{power/async}=="enabled"
    ATTRS{power/runtime_active_kids}=="0"
    ATTRS{power/runtime_enabled}=="enabled"
    ATTRS{power/runtime_status}=="suspended"
    ATTRS{power/runtime_usage}=="0"
    ATTRS{supports_autosuspend}=="1"

  looking at parent device '/devices/pci0000:00/0000:00:14.0/usb3/3-6/3-6.4/3-6.4.3/3-6.4.3.3/3-6.4.3.3.2':
    KERNELS=="3-6.4.3.3.2"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{authorized}=="1"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bDeviceClass}=="ef"
    ATTRS{bDeviceProtocol}=="01"
    ATTRS{bDeviceSubClass}=="02"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{bMaxPower}=="100mA"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bNumInterfaces}==" 5"
    ATTRS{bcdDevice}=="0304"
    ATTRS{bmAttributes}=="e0"
    ATTRS{busnum}=="3"
    ATTRS{configuration}==""
    ATTRS{devnum}=="28"
    ATTRS{devpath}=="6.4.3.3.2"
    ATTRS{idProduct}=="0005"
    ATTRS{idVendor}=="36dc"
    ATTRS{ltm_capable}=="no"
    ATTRS{manufacturer}=="Motive Tech Inc."
    ATTRS{maxchild}=="0"
    ATTRS{power/active_duration}=="51872"
    ATTRS{power/async}=="enabled"
    ATTRS{power/autosuspend}=="2"
    ATTRS{power/autosuspend_delay_ms}=="2000"
    ATTRS{power/connected_duration}=="51872"
    ATTRS{power/control}=="on"
    ATTRS{power/level}=="on"
    ATTRS{power/persist}=="1"
    ATTRS{power/runtime_active_kids}=="0"
    ATTRS{power/runtime_active_time}=="51697"
    ATTRS{power/runtime_enabled}=="forbidden"
    ATTRS{power/runtime_status}=="active"
    ATTRS{power/runtime_suspended_time}=="0"
    ATTRS{power/runtime_usage}=="1"
    ATTRS{power/wakeup}=="enabled"
    ATTRS{power/wakeup_abort_count}=="0"
    ATTRS{power/wakeup_active}=="0"
    ATTRS{power/wakeup_active_count}=="0"
    ATTRS{power/wakeup_count}=="0"
    ATTRS{power/wakeup_expire_count}=="0"
    ATTRS{power/wakeup_last_time_ms}=="0"
    ATTRS{power/wakeup_max_time_ms}=="0"
    ATTRS{power/wakeup_total_time_ms}=="0"
    ATTRS{product}=="cust_dev,0.8.0-dev"
    ATTRS{quirks}=="0x0"
    ATTRS{removable}=="unknown"
    ATTRS{remove}=="(not readable)"
    ATTRS{rx_lanes}=="1"
    ATTRS{serial}=="00000000000A0034"
    ATTRS{speed}=="12"
    ATTRS{tx_lanes}=="1"
    ATTRS{urbnum}=="14"
    ATTRS{version}==" 2.00"

Udevadm monitor of plugging the device in:

KERNEL[11020.462325] add      /devices/pci0000:00/0000:00:14.0/usb3/3-6/3-6.4/3-6.4.3/3-6.4.3.3/3-6.4.3.3.2 (usb)
KERNEL[11020.482771] change   /devices/pci0000:00/0000:00:14.0/usb3/3-6/3-6.4/3-6.4.3/3-6.4.3.3/3-6.4.3.3.2 (usb)
KERNEL[11020.482854] add      /devices/pci0000:00/0000:00:14.0/usb3/3-6/3-6.4/3-6.4.3/3-6.4.3.3/3-6.4.3.3.2/3-6.4.3.3.2:1.0 (usb)
KERNEL[11020.483214] add      /devices/pci0000:00/0000:00:14.0/usb3/3-6/3-6.4/3-6.4.3/3-6.4.3.3/3-6.4.3.3.2/3-6.4.3.3.2:1.0/tty/ttyACM0 (tty)
KERNEL[11020.483263] bind     /devices/pci0000:00/0000:00:14.0/usb3/3-6/3-6.4/3-6.4.3/3-6.4.3.3/3-6.4.3.3.2/3-6.4.3.3.2:1.0 (usb)
KERNEL[11020.483302] add      /devices/pci0000:00/0000:00:14.0/usb3/3-6/3-6.4/3-6.4.3/3-6.4.3.3/3-6.4.3.3.2/3-6.4.3.3.2:1.1 (usb)
KERNEL[11020.483336] bind     /devices/pci0000:00/0000:00:14.0/usb3/3-6/3-6.4/3-6.4.3/3-6.4.3.3/3-6.4.3.3.2/3-6.4.3.3.2:1.1 (usb)
KERNEL[11020.483363] add      /devices/pci0000:00/0000:00:14.0/usb3/3-6/3-6.4/3-6.4.3/3-6.4.3.3/3-6.4.3.3.2/3-6.4.3.3.2:1.2 (usb)
KERNEL[11020.483393] add      /devices/pci0000:00/0000:00:14.0/usb3/3-6/3-6.4/3-6.4.3/3-6.4.3.3/3-6.4.3.3.2/3-6.4.3.3.2:1.3 (usb)
KERNEL[11020.483674] add      /devices/pci0000:00/0000:00:14.0/usb3/3-6/3-6.4/3-6.4.3/3-6.4.3.3/3-6.4.3.3.2/3-6.4.3.3.2:1.3/tty/ttyACM1 (tty)
KERNEL[11020.483739] bind     /devices/pci0000:00/0000:00:14.0/usb3/3-6/3-6.4/3-6.4.3/3-6.4.3.3/3-6.4.3.3.2/3-6.4.3.3.2:1.3 (usb)
KERNEL[11020.483782] add      /devices/pci0000:00/0000:00:14.0/usb3/3-6/3-6.4/3-6.4.3/3-6.4.3.3/3-6.4.3.3.2/3-6.4.3.3.2:1.4 (usb)
KERNEL[11020.483819] bind     /devices/pci0000:00/0000:00:14.0/usb3/3-6/3-6.4/3-6.4.3/3-6.4.3.3/3-6.4.3.3.2/3-6.4.3.3.2:1.4 (usb)
KERNEL[11020.483864] bind     /devices/pci0000:00/0000:00:14.0/usb3/3-6/3-6.4/3-6.4.3/3-6.4.3.3/3-6.4.3.3.2 (usb)
KERNEL[11020.489583] add      /devices/pci0000:00/0000:00:14.0/usb3/3-6/3-6.4/3-6.4.3/3-6.4.3.3/3-6.4.3.3.2/wakeup/wakeup55 (wakeup)
UDEV  [11020.489841] add      /devices/pci0000:00/0000:00:14.0/usb3/3-6/3-6.4/3-6.4.3/3-6.4.3.3/3-6.4.3.3.2 (usb)
KERNEL[11020.491849] add      /devices/pci0000:00/0000:00:14.0/usb3/3-6/3-6.4/3-6.4.3/3-6.4.3.3/3-6.4.3.3.2/wakeup/wakeup63 (wakeup)
KERNEL[11020.491867] remove   /devices/pci0000:00/0000:00:14.0/usb3/3-6/3-6.4/3-6.4.3/3-6.4.3.3/3-6.4.3.3.2/wakeup/wakeup63 (wakeup)
UDEV  [11020.492185] change   /devices/pci0000:00/0000:00:14.0/usb3/3-6/3-6.4/3-6.4.3/3-6.4.3.3/3-6.4.3.3.2 (usb)
UDEV  [11020.493439] add      /devices/pci0000:00/0000:00:14.0/usb3/3-6/3-6.4/3-6.4.3/3-6.4.3.3/3-6.4.3.3.2/3-6.4.3.3.2:1.0 (usb)
UDEV  [11020.493638] add      /devices/pci0000:00/0000:00:14.0/usb3/3-6/3-6.4/3-6.4.3/3-6.4.3.3/3-6.4.3.3.2/3-6.4.3.3.2:1.4 (usb)
UDEV  [11020.493744] add      /devices/pci0000:00/0000:00:14.0/usb3/3-6/3-6.4/3-6.4.3/3-6.4.3.3/3-6.4.3.3.2/3-6.4.3.3.2:1.3 (usb)
UDEV  [11020.494030] add      /devices/pci0000:00/0000:00:14.0/usb3/3-6/3-6.4/3-6.4.3/3-6.4.3.3/3-6.4.3.3.2/3-6.4.3.3.2:1.2 (usb)
UDEV  [11020.494113] add      /devices/pci0000:00/0000:00:14.0/usb3/3-6/3-6.4/3-6.4.3/3-6.4.3.3/3-6.4.3.3.2/3-6.4.3.3.2:1.1 (usb)
UDEV  [11020.495361] bind     /devices/pci0000:00/0000:00:14.0/usb3/3-6/3-6.4/3-6.4.3/3-6.4.3.3/3-6.4.3.3.2/3-6.4.3.3.2:1.1 (usb)
UDEV  [11020.495867] bind     /devices/pci0000:00/0000:00:14.0/usb3/3-6/3-6.4/3-6.4.3/3-6.4.3.3/3-6.4.3.3.2/3-6.4.3.3.2:1.4 (usb)
UDEV  [11020.496049] add      /devices/pci0000:00/0000:00:14.0/usb3/3-6/3-6.4/3-6.4.3/3-6.4.3.3/3-6.4.3.3.2/3-6.4.3.3.2:1.0/tty/ttyACM0 (tty)
UDEV  [11020.496650] add      /devices/pci0000:00/0000:00:14.0/usb3/3-6/3-6.4/3-6.4.3/3-6.4.3.3/3-6.4.3.3.2/3-6.4.3.3.2:1.3/tty/ttyACM1 (tty)
UDEV  [11020.497480] bind     /devices/pci0000:00/0000:00:14.0/usb3/3-6/3-6.4/3-6.4.3/3-6.4.3.3/3-6.4.3.3.2/3-6.4.3.3.2:1.3 (usb)
UDEV  [11020.497599] bind     /devices/pci0000:00/0000:00:14.0/usb3/3-6/3-6.4/3-6.4.3/3-6.4.3.3/3-6.4.3.3.2/3-6.4.3.3.2:1.0 (usb)
KERNEL[11020.500307] add      /devices/pci0000:00/0000:00:14.0/usb3/3-6/3-6.4/3-6.4.3/3-6.4.3.3/3-6.4.3.3.2/wakeup/wakeup63 (wakeup)
KERNEL[11020.500319] remove   /devices/pci0000:00/0000:00:14.0/usb3/3-6/3-6.4/3-6.4.3/3-6.4.3.3/3-6.4.3.3.2/wakeup/wakeup63 (wakeup)
UDEV  [11020.500478] bind     /devices/pci0000:00/0000:00:14.0/usb3/3-6/3-6.4/3-6.4.3/3-6.4.3.3/3-6.4.3.3.2 (usb)
UDEV  [11020.501385] add      /devices/pci0000:00/0000:00:14.0/usb3/3-6/3-6.4/3-6.4.3/3-6.4.3.3/3-6.4.3.3.2/wakeup/wakeup55 (wakeup)
UDEV  [11020.501411] add      /devices/pci0000:00/0000:00:14.0/usb3/3-6/3-6.4/3-6.4.3/3-6.4.3.3/3-6.4.3.3.2/wakeup/wakeup63 (wakeup)
UDEV  [11020.501846] remove   /devices/pci0000:00/0000:00:14.0/usb3/3-6/3-6.4/3-6.4.3/3-6.4.3.3/3-6.4.3.3.2/wakeup/wakeup63 (wakeup)
UDEV  [11020.502419] add      /devices/pci0000:00/0000:00:14.0/usb3/3-6/3-6.4/3-6.4.3/3-6.4.3.3/3-6.4.3.3.2/wakeup/wakeup63 (wakeup)
UDEV  [11020.502828] remove   /devices/pci0000:00/0000:00:14.0/usb3/3-6/3-6.4/3-6.4.3/3-6.4.3.3/3-6.4.3.3.2/wakeup/wakeup63 (wakeup)

Since the wakeup calls show I believe the rule is being run.

The configuration does add the rule to /etc/udev/rules.d/99-local.rules as expected, but no /dev/ttyCUST# symlink is created. What do I need to get the symlink to work?

Seems like 60-serial.rules gets applied, but 99-local.rules doesn’t.

❯ sudo udevadm test -a add $(udevadm info -q path -n /dev/ttyACM0)
This program is for debugging only, it does not run any program
specified by a RUN key. It may show incorrect results, because
some values may be different, or not available at a simulation run.

Trying to open "/etc/udev/hwdb.bin"...
=== trie on-disk ===
tool version:          254
file size:        12273114 bytes
header size             80 bytes
strings            2541602 bytes
nodes              9731432 bytes
Loading kernel module index.
Found cgroup2 on /sys/fs/cgroup/, full unified hierarchy
Found container virtualization none.
Using default interface naming scheme 'v253'.
Parsed configuration file "/nix/store/vapnrxrw3b21c7ji61bmnbzl2cj1vl96-systemd-254.3/lib/systemd/network/99-default.link"
Created link configuration context.
Reading rules file: /nix/store/p520zq0z6sd42z7xigr0vx824jgkj1is-udev-rules/00-path.rules
Reading rules file: /nix/store/p520zq0z6sd42z7xigr0vx824jgkj1is-udev-rules/01-md-raid-creating.rules
Reading rules file: /nix/store/p520zq0z6sd42z7xigr0vx824jgkj1is-udev-rules/10-dm.rules
Reading rules file: /nix/store/p520zq0z6sd42z7xigr0vx824jgkj1is-udev-rules/11-dm-lvm.rules
Reading rules file: /nix/store/p520zq0z6sd42z7xigr0vx824jgkj1is-udev-rules/13-dm-disk.rules
Reading rules file: /nix/store/p520zq0z6sd42z7xigr0vx824jgkj1is-udev-rules/40-usb-media-players.rules
Reading rules file: /nix/store/p520zq0z6sd42z7xigr0vx824jgkj1is-udev-rules/49-stlinkv1.rules
Reading rules file: /nix/store/p520zq0z6sd42z7xigr0vx824jgkj1is-udev-rules/49-stlinkv2-1.rules
Reading rules file: /nix/store/p520zq0z6sd42z7xigr0vx824jgkj1is-udev-rules/49-stlinkv2.rules
Reading rules file: /nix/store/p520zq0z6sd42z7xigr0vx824jgkj1is-udev-rules/49-stlinkv3.rules
Reading rules file: /nix/store/vapnrxrw3b21c7ji61bmnbzl2cj1vl96-systemd-254.3/lib/udev/rules.d/50-udev-default.rules
Reading rules file: /nix/store/vapnrxrw3b21c7ji61bmnbzl2cj1vl96-systemd-254.3/lib/udev/rules.d/60-autosuspend.rules
Reading rules file: /nix/store/vapnrxrw3b21c7ji61bmnbzl2cj1vl96-systemd-254.3/lib/udev/rules.d/60-block.rules
Reading rules file: /nix/store/vapnrxrw3b21c7ji61bmnbzl2cj1vl96-systemd-254.3/lib/udev/rules.d/60-cdrom_id.rules
Reading rules file: /nix/store/vapnrxrw3b21c7ji61bmnbzl2cj1vl96-systemd-254.3/lib/udev/rules.d/60-dmi-id.rules
Reading rules file: /nix/store/vapnrxrw3b21c7ji61bmnbzl2cj1vl96-systemd-254.3/lib/udev/rules.d/60-drm.rules
Reading rules file: /nix/store/vapnrxrw3b21c7ji61bmnbzl2cj1vl96-systemd-254.3/lib/udev/rules.d/60-evdev.rules
Reading rules file: /nix/store/vapnrxrw3b21c7ji61bmnbzl2cj1vl96-systemd-254.3/lib/udev/rules.d/60-fido-id.rules
Reading rules file: /nix/store/vapnrxrw3b21c7ji61bmnbzl2cj1vl96-systemd-254.3/lib/udev/rules.d/60-infiniband.rules
Reading rules file: /nix/store/vapnrxrw3b21c7ji61bmnbzl2cj1vl96-systemd-254.3/lib/udev/rules.d/60-input-id.rules
Reading rules file: /nix/store/vapnrxrw3b21c7ji61bmnbzl2cj1vl96-systemd-254.3/lib/udev/rules.d/60-persistent-alsa.rules
Reading rules file: /nix/store/vapnrxrw3b21c7ji61bmnbzl2cj1vl96-systemd-254.3/lib/udev/rules.d/60-persistent-input.rules
Reading rules file: /nix/store/vapnrxrw3b21c7ji61bmnbzl2cj1vl96-systemd-254.3/lib/udev/rules.d/60-persistent-storage-tape.rules
Reading rules file: /nix/store/vapnrxrw3b21c7ji61bmnbzl2cj1vl96-systemd-254.3/lib/udev/rules.d/60-persistent-storage.rules
Reading rules file: /nix/store/vapnrxrw3b21c7ji61bmnbzl2cj1vl96-systemd-254.3/lib/udev/rules.d/60-persistent-v4l.rules
Reading rules file: /nix/store/vapnrxrw3b21c7ji61bmnbzl2cj1vl96-systemd-254.3/lib/udev/rules.d/60-sensor.rules
Reading rules file: /nix/store/vapnrxrw3b21c7ji61bmnbzl2cj1vl96-systemd-254.3/lib/udev/rules.d/60-serial.rules
Reading rules file: /nix/store/p520zq0z6sd42z7xigr0vx824jgkj1is-udev-rules/63-md-raid-arrays.rules
Reading rules file: /nix/store/vapnrxrw3b21c7ji61bmnbzl2cj1vl96-systemd-254.3/lib/udev/rules.d/64-btrfs.rules
Reading rules file: /nix/store/p520zq0z6sd42z7xigr0vx824jgkj1is-udev-rules/64-md-raid-assembly.rules
Reading rules file: /nix/store/p520zq0z6sd42z7xigr0vx824jgkj1is-udev-rules/69-bcache.rules
Reading rules file: /nix/store/p520zq0z6sd42z7xigr0vx824jgkj1is-udev-rules/69-dm-lvm.rules
Reading rules file: /nix/store/p520zq0z6sd42z7xigr0vx824jgkj1is-udev-rules/69-libmtp.rules
Reading rules file: /nix/store/p520zq0z6sd42z7xigr0vx824jgkj1is-udev-rules/69-md-clustered-confirm-device.rules
Reading rules file: /nix/store/vapnrxrw3b21c7ji61bmnbzl2cj1vl96-systemd-254.3/lib/udev/rules.d/70-camera.rules
Reading rules file: /nix/store/vapnrxrw3b21c7ji61bmnbzl2cj1vl96-systemd-254.3/lib/udev/rules.d/70-joystick.rules
Reading rules file: /nix/store/vapnrxrw3b21c7ji61bmnbzl2cj1vl96-systemd-254.3/lib/udev/rules.d/70-memory.rules
Reading rules file: /nix/store/vapnrxrw3b21c7ji61bmnbzl2cj1vl96-systemd-254.3/lib/udev/rules.d/70-mouse.rules
Reading rules file: /nix/store/vapnrxrw3b21c7ji61bmnbzl2cj1vl96-systemd-254.3/lib/udev/rules.d/70-power-switch.rules
Reading rules file: /nix/store/p520zq0z6sd42z7xigr0vx824jgkj1is-udev-rules/70-printers.rules
Reading rules file: /nix/store/vapnrxrw3b21c7ji61bmnbzl2cj1vl96-systemd-254.3/lib/udev/rules.d/70-touchpad.rules
Reading rules file: /nix/store/vapnrxrw3b21c7ji61bmnbzl2cj1vl96-systemd-254.3/lib/udev/rules.d/70-uaccess.rules
Reading rules file: /nix/store/vapnrxrw3b21c7ji61bmnbzl2cj1vl96-systemd-254.3/lib/udev/rules.d/71-seat.rules
Reading rules file: /nix/store/vapnrxrw3b21c7ji61bmnbzl2cj1vl96-systemd-254.3/lib/udev/rules.d/73-seat-late.rules
Reading rules file: /nix/store/vapnrxrw3b21c7ji61bmnbzl2cj1vl96-systemd-254.3/lib/udev/rules.d/75-net-description.rules
Reading rules file: /nix/store/vapnrxrw3b21c7ji61bmnbzl2cj1vl96-systemd-254.3/lib/udev/rules.d/75-probe_mtd.rules
Reading rules file: /nix/store/p520zq0z6sd42z7xigr0vx824jgkj1is-udev-rules/77-mm-broadmobi-port-types.rules
Reading rules file: /nix/store/p520zq0z6sd42z7xigr0vx824jgkj1is-udev-rules/77-mm-cinterion-port-types.rules
Reading rules file: /nix/store/p520zq0z6sd42z7xigr0vx824jgkj1is-udev-rules/77-mm-dell-port-types.rules
Reading rules file: /nix/store/p520zq0z6sd42z7xigr0vx824jgkj1is-udev-rules/77-mm-dlink-port-types.rules
Reading rules file: /nix/store/p520zq0z6sd42z7xigr0vx824jgkj1is-udev-rules/77-mm-ericsson-mbm.rules
Reading rules file: /nix/store/p520zq0z6sd42z7xigr0vx824jgkj1is-udev-rules/77-mm-fibocom-port-types.rules
Reading rules file: /nix/store/p520zq0z6sd42z7xigr0vx824jgkj1is-udev-rules/77-mm-foxconn-port-types.rules
Reading rules file: /nix/store/p520zq0z6sd42z7xigr0vx824jgkj1is-udev-rules/77-mm-gosuncn-port-types.rules
Reading rules file: /nix/store/p520zq0z6sd42z7xigr0vx824jgkj1is-udev-rules/77-mm-haier-port-types.rules
Reading rules file: /nix/store/p520zq0z6sd42z7xigr0vx824jgkj1is-udev-rules/77-mm-huawei-net-port-types.rules
Reading rules file: /nix/store/p520zq0z6sd42z7xigr0vx824jgkj1is-udev-rules/77-mm-linktop-port-types.rules
Reading rules file: /nix/store/p520zq0z6sd42z7xigr0vx824jgkj1is-udev-rules/77-mm-longcheer-port-types.rules
Reading rules file: /nix/store/p520zq0z6sd42z7xigr0vx824jgkj1is-udev-rules/77-mm-mtk-port-types.rules
Reading rules file: /nix/store/p520zq0z6sd42z7xigr0vx824jgkj1is-udev-rules/77-mm-nokia-port-types.rules
Reading rules file: /nix/store/p520zq0z6sd42z7xigr0vx824jgkj1is-udev-rules/77-mm-qcom-soc.rules
Reading rules file: /nix/store/p520zq0z6sd42z7xigr0vx824jgkj1is-udev-rules/77-mm-quectel-port-types.rules
Reading rules file: /nix/store/p520zq0z6sd42z7xigr0vx824jgkj1is-udev-rules/77-mm-sierra.rules
Reading rules file: /nix/store/p520zq0z6sd42z7xigr0vx824jgkj1is-udev-rules/77-mm-simtech-port-types.rules
Reading rules file: /nix/store/p520zq0z6sd42z7xigr0vx824jgkj1is-udev-rules/77-mm-telit-port-types.rules
Reading rules file: /nix/store/p520zq0z6sd42z7xigr0vx824jgkj1is-udev-rules/77-mm-tplink-port-types.rules
Reading rules file: /nix/store/p520zq0z6sd42z7xigr0vx824jgkj1is-udev-rules/77-mm-ublox-port-types.rules
Reading rules file: /nix/store/p520zq0z6sd42z7xigr0vx824jgkj1is-udev-rules/77-mm-x22x-port-types.rules
Reading rules file: /nix/store/p520zq0z6sd42z7xigr0vx824jgkj1is-udev-rules/77-mm-zte-port-types.rules
Reading rules file: /nix/store/vapnrxrw3b21c7ji61bmnbzl2cj1vl96-systemd-254.3/lib/udev/rules.d/78-sound-card.rules
Reading rules file: /nix/store/vapnrxrw3b21c7ji61bmnbzl2cj1vl96-systemd-254.3/lib/udev/rules.d/80-drivers.rules
Reading rules file: /nix/store/p520zq0z6sd42z7xigr0vx824jgkj1is-udev-rules/80-libinput-device-groups.rules
Reading rules file: /nix/store/p520zq0z6sd42z7xigr0vx824jgkj1is-udev-rules/80-mm-candidate.rules
Reading rules file: /nix/store/vapnrxrw3b21c7ji61bmnbzl2cj1vl96-systemd-254.3/lib/udev/rules.d/80-net-setup-link.rules
Reading rules file: /nix/store/p520zq0z6sd42z7xigr0vx824jgkj1is-udev-rules/80-udisks2.rules
Reading rules file: /nix/store/vapnrxrw3b21c7ji61bmnbzl2cj1vl96-systemd-254.3/lib/udev/rules.d/81-net-dhcp.rules
Reading rules file: /nix/store/p520zq0z6sd42z7xigr0vx824jgkj1is-udev-rules/84-nm-drivers.rules
Reading rules file: /nix/store/p520zq0z6sd42z7xigr0vx824jgkj1is-udev-rules/85-nm-unmanaged.rules
Reading rules file: /nix/store/vapnrxrw3b21c7ji61bmnbzl2cj1vl96-systemd-254.3/lib/udev/rules.d/90-iocost.rules
Reading rules file: /nix/store/p520zq0z6sd42z7xigr0vx824jgkj1is-udev-rules/90-libinput-fuzz-override.rules
Reading rules file: /nix/store/p520zq0z6sd42z7xigr0vx824jgkj1is-udev-rules/90-nm-thunderbolt.rules
Reading rules file: /nix/store/p520zq0z6sd42z7xigr0vx824jgkj1is-udev-rules/90-pipewire-alsa.rules
Reading rules file: /nix/store/vapnrxrw3b21c7ji61bmnbzl2cj1vl96-systemd-254.3/lib/udev/rules.d/90-vconsole.rules
Reading rules file: /nix/store/p520zq0z6sd42z7xigr0vx824jgkj1is-udev-rules/95-dm-notify.rules
Reading rules file: /nix/store/p520zq0z6sd42z7xigr0vx824jgkj1is-udev-rules/95-upower-hid.rules
Reading rules file: /nix/store/p520zq0z6sd42z7xigr0vx824jgkj1is-udev-rules/95-upower-wup.rules
Reading rules file: /nix/store/p520zq0z6sd42z7xigr0vx824jgkj1is-udev-rules/97-hid2hci.rules
Reading rules file: /nix/store/p520zq0z6sd42z7xigr0vx824jgkj1is-udev-rules/98-ipv6-privacy-extensions.rules
Skipping empty file: /nix/store/p520zq0z6sd42z7xigr0vx824jgkj1is-udev-rules/99-ipv6-privacy-extensions.rules
Reading rules file: /nix/store/p520zq0z6sd42z7xigr0vx824jgkj1is-udev-rules/99-local.rules
Reading rules file: /nix/store/vapnrxrw3b21c7ji61bmnbzl2cj1vl96-systemd-254.3/lib/udev/rules.d/99-systemd.rules
sd-device: Failed to chase symlinks in "/devices/pci0000:00/0000:00:14.0/usb3/3-6/3-6.4/3-6.4.3/3-6.4.3.3/3-6.4.3.3.2/3-6.4.3.3.2:1.0/tty/ttyACM0".
ttyACM0: /nix/store/vapnrxrw3b21c7ji61bmnbzl2cj1vl96-systemd-254.3/lib/udev/rules.d/50-udev-default.rules:38 GROUP 27
ttyACM0: /nix/store/vapnrxrw3b21c7ji61bmnbzl2cj1vl96-systemd-254.3/lib/udev/rules.d/60-serial.rules:6 Importing properties from results of builtin command 'usb_id'
3-6.4.3.3.2:1.0: if_class:2 protocol:0
ttyACM0: /nix/store/vapnrxrw3b21c7ji61bmnbzl2cj1vl96-systemd-254.3/lib/udev/rules.d/60-serial.rules:6 Importing properties from results of builtin command 'hwdb --subsystem=usb'
ttyACM0: hwdb modalias key: "usb:v36DCp0005d0304dcEFdsc02dp01ic02isc02ip00in00"
ttyACM0: /nix/store/vapnrxrw3b21c7ji61bmnbzl2cj1vl96-systemd-254.3/lib/udev/rules.d/60-serial.rules:16 Importing properties from results of builtin command 'path_id'
ttyACM0: /nix/store/vapnrxrw3b21c7ji61bmnbzl2cj1vl96-systemd-254.3/lib/udev/rules.d/60-serial.rules:17 Added SYMLINK 'serial/by-path/pci-0000:00:14.0-usb-0:6.4.3.3.2:1.0'
ttyACM0: /nix/store/vapnrxrw3b21c7ji61bmnbzl2cj1vl96-systemd-254.3/lib/udev/rules.d/60-serial.rules:18 Added SYMLINK 'serial/by-path/pci-0000:00:14.0-usbv2-0:6.4.3.3.2:1.0'
ttyACM0: /nix/store/vapnrxrw3b21c7ji61bmnbzl2cj1vl96-systemd-254.3/lib/udev/rules.d/60-serial.rules:25 Added SYMLINK 'serial/by-id/usb-Motive_Tech_Inc._cust_dev_0.8.0-dev_36305005005A0034-if00'
ttyACM0: Preserve permissions of /dev/ttyACM0, uid=0, gid=27, mode=0660
ttyACM0: Successfully created symlink '/dev/char/166:0' to '/dev/ttyACM0'
ttyACM0: sd-device: Created db file '/run/udev/data/c166:0' for '/devices/pci0000:00/0000:00:14.0/usb3/3-6/3-6.4/3-6.4.3/3-6.4.3.3/3-6.4.3.3.2/3-6.4.3.3.2:1.0/tty/ttyACM0'
DEVPATH=/devices/pci0000:00/0000:00:14.0/usb3/3-6/3-6.4/3-6.4.3/3-6.4.3.3/3-6.4.3.3.2/3-6.4.3.3.2:1.0/tty/ttyACM0
DEVNAME=/dev/ttyACM0
MAJOR=166
MINOR=0
ACTION=add
PATH=/nix/store/bvsd4b3lsigvp5653pp0rj42cg36f07k-udev-path/bin:/nix/store/bvsd4b3lsigvp5653pp0rj42cg36f07k-udev-path/sbin
SUBSYSTEM=tty
TAGS=:systemd:
ID_BUS=usb
ID_MODEL=cust_dev_0.8.0-dev
ID_MODEL_ENC=cust_dev\x2c0.8.0-dev
ID_MODEL_ID=0005
ID_SERIAL=Motive_Tech_Inc._cust_dev_0.8.0-dev_36305005005A0034
ID_SERIAL_SHORT=36305005005A0034
ID_VENDOR=Motive_Tech_Inc.
ID_VENDOR_ENC=Motive\x20Tech\x20Inc.
ID_VENDOR_ID=36dc
ID_REVISION=0304
ID_TYPE=generic
ID_USB_MODEL=cust_dev_0.8.0-dev
ID_USB_MODEL_ENC=cust_dev\x2c0.8.0-dev
ID_USB_MODEL_ID=0005
ID_USB_SERIAL=Motive_Tech_Inc._cust_dev_0.8.0-dev_36305005005A0034
ID_USB_SERIAL_SHORT=36305005005A0034
ID_USB_VENDOR=Motive_Tech_Inc.
ID_USB_VENDOR_ENC=Motive\x20Tech\x20Inc.
ID_USB_VENDOR_ID=36dc
ID_USB_REVISION=0304
ID_USB_TYPE=generic
ID_USB_INTERFACES=:020200:0a0000:fe0101:
ID_USB_INTERFACE_NUM=00
ID_USB_DRIVER=cdc_acm
ID_USB_CLASS_FROM_DATABASE=Miscellaneous Device
ID_USB_PROTOCOL_FROM_DATABASE=Interface Association
ID_PATH_WITH_USB_REVISION=pci-0000:00:14.0-usbv2-0:6.4.3.3.2:1.0
ID_PATH=pci-0000:00:14.0-usb-0:6.4.3.3.2:1.0
ID_PATH_TAG=pci-0000_00_14_0-usb-0_6_4_3_3_2_1_0
DEVLINKS=/dev/serial/by-id/usb-Motive_Tech_Inc._cust_dev_0.8.0-dev_36305005005A0034-if00 /dev/serial/by-path/pci-0000:00:14.0-usb-0:6.4.3.3.2:1.0 /dev/serial/by-path/pci-0000:00:14.0-usbv2-0:6.4.3.3.2:1.0
ID_MM_CANDIDATE=1
CURRENT_TAGS=:systemd:
USEC_INITIALIZED=22747111062
Unload kernel module index.
Unloaded

Ended up with

ACTION=="add", SUBSYSTEM=="tty", ENV{ID_USB_VENDOR_ID}=="36dc", MODE:="0660", TAG+="uaccess", SYMLINK+="ttyCUST%n"

which works. The tty subsystem doesn’t directly have the ATTR{idVendor} or ATTR{idProduct} fields, only its parent usb two levels up. Udev only allows a single subsystem and one parent to be used, so I’d think it’d work, but if it’s only allowing the subsystem and its direct parent then this would make sense. The parent sets the ID_USB_VENDOR_ID environment, so triggering off of that in the tty subsystem works.