g1vm check devices — check-devices on g1-ci-5.us-central1-a.c.lockinweb-487307.internal (Linux aarch64), accel kvm, cpu host, -smp 8 -m 16G, CAN peak, boot path uefi, QEMU emulator version 11.1.2
run /home/ubuntu/.local/state/g1vm/runs/20261024T213315Z-check-devices-kvm

[PASS     ] CPU cores, judged by nproc (Cortex-A78AE on the robot; the model only under tcg, the host CPU under kvm/hvf) — count 8 (U1)
            cpu: nproc=8, cpu_part=0xd8e, cpu_model=host
[PASS     ] RAM — count 16 GB (U1)
            ram: mem_total_gib=15.59, qemu_m=16G
[PASS     ] NVMe nvme0n1, 15-partition GPT — count 1 (U7)
            nvme: disk=nvme0n1, partitions=15, root=/dev/nvme0n1p1, root_partuuid=71d8b760-717d-42d8-82dc-832a284dc6d3
[PASS     ] Boot firmware: UEFI, ESP -> L4TLauncher -> extlinux, UEFI variables — count 1 (U7)
            firmware: l4tlauncher_direct_boot=True, efi_initrd=True, kernel_on_qemu_line=False, cmdline_is_extlinux_primary=True, efivars=38, bootloader_slot_a=True
[OUT      ] Boot firmware: QSPI bootloader slots, recovery-mode USB — count 1 (-)
            ruling: R2 N3: the system-disk half, boot and A/B in the VM; recovery mode and the QSPI write on real hardware only
[OUT      ] Rootfs A/B slot switch — count - (-)
            ruling: Decision 16: the image has one APP partition, no second rootfs slot
[PASS     ] GbE enP8p1s0 — count 1 (U2, U3)
            nic: link=enP8p1s0 UP 52:54:00:12:01:64 <BROADCAST,MULTICAST,UP,LOWER_UP>, addr=enP8p1s0 UP 192.168.123.164/24
[PASS     ] USB Wi-Fi wlx94ba06f70f6c — count 1 (U4)
            wifi: profile={'key_mgmt': 'wpa-psk', 'ap': ['coScene-Robot:WPA2:5240 MHz:1E\\:C1\\:56\\:46\\:BA\\:43'], 'ok': True}, state=activated, address=wlx94ba06f70f6c@g1wifi-eth UP 192.168.90.66/24 fe80::96ba:6ff:fef7:f6c/64
[OUT      ] Wi-Fi radio driver rtl8852bu, radio flows (scan, power save) — count - (-)
            ruling: Decision 7: the rtl8852bu driver on real hardware only; mac80211_hwsim is a follow-on card
[PASS     ] Wrist cameras ELP 32e4:8430 (capture + metadata node each) — count 2 x 2 nodes (U5)
            cameras: usb=['1-5 32e4:8430 480 uvcvideo', '1-6 32e4:8430 480 uvcvideo'], video_nodes=['/dev/video0', '/dev/video1', '/dev/video2', '/dev/video3'], robot_bypath={'platform-3610000.usb-usb-0:2.1.3:1.0-video-index0': '/dev/video0', 'platform-3610000.usb-usb-0:2.1.3:1.0-video-index1': '/dev/video1', 'platform-3610000.usb-usb-0:2.1.4:1.0-video-index0': '/dev/video2', 'platform-3610000.usb-usb-0:2.1.4:1.0-video-index1': '/dev/video3'}, frames={'2.1.3': 90.0, '2.1.4': 90.0}
[PASS     ] Wrist cameras: MJPG 640x480 at 30 fps — count 2 (U5)
            camera_rate: fps={'2.1.3': 30.03, '2.1.4': 30.03}, accel=kvm
[OUT      ] Head camera OAK-D-W — count 1 (-)
            ruling: R1 N4: 「暂时不碰它」 — private protocol, not now; a partial model later as its own card
[PASS     ] USB-CAN adapters (PEAK PCAN-USB on 66, canable2 gs_usb on the fleet) — count 2 (U6a, U6b)
            can: personality=peak, interfaces={'can_gripper_l': {'port': '1-3', 'driver': 'peak_usb', 'operstate': 'UP', 'state': 'ERROR-ACTIVE', 'bitrate': 1000000}, 'can_gripper_r': {'port': '1-2.2', 'driver': 'peak_usb', 'operstate': 'UP', 'state': 'ERROR-ACTIVE', 'bitrate': 1000000}}, rule_md5=0dfbc2140f37fab5ded923eef4a9488a, others=[]
[PASS     ] YAM grippers (DM4310 motors) — count 2 (U6c)
            grippers: motors={'can_gripper_l': [7], 'can_gripper_r': [7]}, mst_id={'can_gripper_l': 23, 'can_gripper_r': 23}, replies={'can_gripper_l': 500, 'can_gripper_r': 500}
[PASS     ] YAM grippers: 50 Hz state poll, no exchange lost — count 2 (U6c)
            gripper_rate: hz={'can_gripper_l': 50.001, 'can_gripper_r': 50.0}, lost={'can_gripper_l': 0, 'can_gripper_r': 0}, max_gap_ms={'can_gripper_l': 20.56, 'can_gripper_r': 20.43}, accel=kvm
[NOT RUN  ] GPU (T4G via VFIO, SBSA stack) — count 1 (U9)
            g1vm --gpu (U9: the T4G passed through on g5g.metal) is not built; quota-blocked
            gpu: skipped=g1vm --gpu (U9: the T4G passed through on g5g.metal) is not built; quota-blocked
[OUT      ] DLA, NVENC, nvargus, the Jetson GPU driver — count - (-)
            ruling: R2 N2: the server GPU passed through; DLA, NVENC, nvargus and the Jetson driver on real hardware only
[PASS     ] Thermal zones — count 9 (U2, U4)
            thermal: zones=['cpu-thermal 45000', 'gpu-thermal 43000', 'cv0-thermal 42000', 'cv1-thermal 42000', 'cv2-thermal 42000', 'soc0-thermal 44000', 'soc1-thermal 44000', 'soc2-thermal 44000', 'tj-thermal 46000']
[PASS     ] USB by-path identities — count - (U2, U6a)
            bypath: cameras=['platform-3610000.usb-usb-0:2.1.3:1.0-video-index0', 'platform-3610000.usb-usb-0:2.1.3:1.0-video-index1', 'platform-3610000.usb-usb-0:2.1.4:1.0-video-index0', 'platform-3610000.usb-usb-0:2.1.4:1.0-video-index1'], can={'can_gripper_l': '1-3', 'can_gripper_r': '1-2.2'}
[PASS     ] Headset link (PICO over Wi-Fi) — count 1 (U4)
            headset: from=['192.168.90.87'], reports=59, hz_median=90.0, hz_min=90.0, hz_max=92.0, window_s=60, accel=kvm
[PASS     ] Motors rt/lowstate / rt/lowcmd — count 29 of 35 (U3)
            motors: slots=[35, 35], in_use=[29, 29], samples=62499 | lowcmd: sent=1000, written=1000, hz=500, pc1d_received=1000
[PASS     ] Motors: rt/lowstate at 1 kHz, no sample lost (take + synthetic) — count 1 (U3)
            lowstate_rate: samples_hz=1041.65, ticks_hz=999.97, gaps_seen=69, backwards_seen=31, take_own=100, gaps_beyond_take=0, synth_hz=1000.0, synth_lost=0, synth_missing=0, window_s=60.0, accel=kvm
[PASS     ] Pelvis IMU, torso IMU, BMS, remote-controller bytes — count 1 each (U3)
            pc1_topics: bmsstate=60, secondary_imu=30000
[PASS     ] Speaker (PlayStream), microphone array (multicast), LEDs (API 1010) — count 1 each (U3)
            voice: rpc={'ret': 0, 'calls': 20, 'ms_median': 0.41, 'ms_max': 0.65, 'ok': True}, mic={'packets': 393, 'packets_hz': 6.25, 'bytes_per_s': 32000.0, 'lengths': [5120], 'ok': True}, play={'ret': 0, 'stop_ret': 0, 'bytes': 16000, 'pc1d': [{'api': 1003, 'code': 0, 'binary': 16000, 'param': '{"app_name":"g1vm-probe","stream_id":"g1vm-probe-1"}'}], 'ok': True}, led={'ret': 0, 'rgb': [10, 200, 30], 'pc1d_led': [10, 200, 30], 'ok': True}
[PASS     ] Dex3 hands — count 0 (U3)
            dex3: left={'cmd_sent': 100, 'cmd_written': 100, 'pc1d_received': 100, 'state_samples': 6000, 'state_motors': [7, 7], 'moved': False}, right={'cmd_sent': 100, 'cmd_written': 100, 'pc1d_received': 100, 'state_samples': 6000, 'state_motors': [7, 7], 'moved': False}
[PASS     ] Internal L2 switch — count 1 (U3)
            lan_switch: pc1={'address': '192.168.123.161', 'interface': 'robot', 'mac': '52:54:00:12:01:61'}, pc2=192.168.123.164, via=VDE switch robot
[OUT      ] Inspire/DFX hands, Mid-360, RealSense, router .1 — count 0 / unknown on 66 (-)
            ruling: not on robot 66's inventory (results/explore/g1-devices.md § 2b-2c)
[OUT      ] Real control-loop timing, the Orin's microarchitecture — count - (-)
            ruling: r3-followups: only a real Jetson

PASS devices, exit 0: pass 20, not run 1, out 7 of 28 rows; 1 not judged on this run
