Two days on this is brutal, but your error ("credentials generate, then the Thread connectivity check fails with can't reach device") is almost always IPv6 routing between the commissioner and the Thread network, not Matter being broken. Two things about your setup make that the prime suspect.
1. Docker IPv6 (most likely here). You're running HA + OTBR + Matter server as docker containers, and Docker disables IPv6 by default. Thread is IPv6-only, so the device gets provisioned over BLE fine, then the commissioner can't reach it over Thread to finish, exactly your error. Enable IPv6 in the Docker daemon (daemon.json with "ipv6": true plus an IPv6 subnet), make sure the Matter-server and OTBR containers have it, and restart. This is the single most common fix for "stuck at checking Thread connectivity" on a container setup.
2. The IOT VLAN. The phone you commission with must be on the same VLAN/subnet as HA/OTBR and reach it over IPv6. Thread leans on link-local IPv6 and multicast, which generally don't cross VLANs even with mDNS reflection. Easiest test: put your phone on the IOT VLAN temporarily and commission there. Once paired the device works fine; commissioning is the fussy part.
3. Re-sync Thread credentials (Android). Removing the Nest border router scrambles Android's stored Thread creds, so the phone may be handing the bulb an empty/wrong network. HA Android app → Settings → Companion app → Troubleshooting → Sync Thread credentials, keep the Google Home app installed, and commission through the HA companion app (not Google Home) so it uses your OTBR.
4. Factory-reset the KAJPLATS between attempts. Two days of half-finished commissioning can leave the bulb stuck. Do IKEA's power-cycle reset before each fresh try.
5. Undo the "local IPv6" change. If Claude Code had you force link-local/ULA addresses, revert it. OTBR needs proper routable IPv6 (it advertises an off-mesh-routable prefix); forcing local addresses breaks reachability.
The encouraging bit: you already got the BILRESA onto Thread, so the stack fundamentally works. That points squarely at per-attempt IPv6 reachability (Docker IPv6 + the VLAN), not Matter being hopeless. Fix those two and the bulb should go through. For a VLAN'd, container-based setup, commissioning is the painful part, once devices are on, they're stable.
Refs:
btw; Docker disables IPv6 by default, plus Thread's link-local IPv6 doesn't like crossing VLANs...