jlpoole@zerodev1:/usr/local/src/ble-reticulum $ cd /usr/local/src/ble-reticulum
git pull
cd migration/protocol_core
python3 setup.py build_ext --inplace
cd ../..
/home/jlpoole/rnsenv/bin/python3 -m pytest migration/tests/test_identity_helpers_cpp_equivalence.py -q -rs
/home/jlpoole/rnsenv/bin/python3 -m pytest migration/tests/test_fragmentation_cpp_equivalence.py migration/tests/test_fragmentation_backend_shim.py -q
remote: Enumerating objects: 24, done.
remote: Counting objects: 100% (24/24), done.
remote: Compressing objects: 100% (17/17), done.
remote: Total 17 (delta 8), reused 0 (delta 0), pack-reused 0 (from 0)
Unpacking objects: 100% (17/17), 6.84 KiB | 94.00 KiB/s, done.
From https://salemdata.net/repo/jlpoole/ble-reticulum
   7f0b302..91037ea  c++migration                      -> origin/c++migration
 * [new tag]         phase1-ble-protocol-core-20260517 -> phase1-ble-protocol-core-20260517
Updating 7f0b302..91037ea
Fast-forward
 migration/Migration_Testing_Journal.md                        |   1 +
 migration/preserved_runs/README.md                            |   2 +-
 migration/reports/executive_summary_20260517_1325.txt         | 266 +++++++++++++++++++++++++++
 migration/reports/identities_20260517_report.md               | 101 ++++++++++
 migration/reports/phase1_freeze_20260517_1331.md              |  63 +++++++
 .../sql/mark_identity_helpers_field_accepted_20260517.sql     |  53 ++++++
 6 files changed, 485 insertions(+), 1 deletion(-)
 create mode 100644 migration/reports/executive_summary_20260517_1325.txt
 create mode 100644 migration/reports/identities_20260517_report.md
 create mode 100644 migration/reports/phase1_freeze_20260517_1331.md
 create mode 100644 migration/sql/mark_identity_helpers_field_accepted_20260517.sql
running build_ext
copying build/lib.linux-aarch64-cpython-313/ble_protocol_core_cpp.cpython-313-aarch64-linux-gnu.so -> 
-bash: /home/jlpoole/rnsenv/bin/python3: No such file or directory
-bash: /home/jlpoole/rnsenv/bin/python3: No such file or directory
jlpoole@zerodev1:/usr/local/src/ble-reticulum $ python3 -m pytest migration/tests/test_identity_helpers_cpp_equivalence.py -q -rs
====================================== test session starts ======================================
platform linux -- Python 3.13.5, pytest-8.3.5, pluggy-1.5.0
rootdir: /usr/local/src/ble-reticulum
configfile: pytest.ini
plugins: typeguard-4.4.2, asyncio-0.25.1
asyncio: mode=Mode.AUTO, asyncio_default_fixture_loop_scope=function
collected 21 items                                                                              

migration/tests/test_identity_helpers_cpp_equivalence.py ..s..................            [100%]

==================================== short test summary info ====================================
SKIPPED [1] migration/tests/test_identity_helpers_cpp_equivalence.py:64: BLEInterface importable; source fallback not used
================================= 20 passed, 1 skipped in 1.02s =================================
jlpoole@zerodev1:/usr/local/src/ble-reticulum $ python3 -m pytest migration/tests/test_fragmentation_cpp_equivalence.py migration/tests/test_fragmentation_backend_shim.py -q
====================================== test session starts ======================================
platform linux -- Python 3.13.5, pytest-8.3.5, pluggy-1.5.0
rootdir: /usr/local/src/ble-reticulum
configfile: pytest.ini
plugins: typeguard-4.4.2, asyncio-0.25.1
asyncio: mode=Mode.AUTO, asyncio_default_fixture_loop_scope=function
collected 36 items                                                                              

migration/tests/test_fragmentation_cpp_equivalence.py ............................        [ 77%]
migration/tests/test_fragmentation_backend_shim.py ........                               [100%]

====================================== 36 passed in 4.97s =======================================
jlpoole@zerodev1:/usr/local/src/ble-reticulum $ ls -l ~/.reticulum/interfaces
readlink -f ~/.reticulum/interfaces/BLEInterface.py
readlink -f ~/.reticulum/interfaces/BLEFragmentationBackend.py

bluetoothctl show
sudo btmgmt find
# Control-C to exit btmgmt if it launches
total 324
lrwxrwxrwx 1 jlpoole jlpoole     58 May 17 04:35 BLEAgent.py -> /usr/local/src/ble-reticulum/src/ble_reticulum/BLEAgent.py
-rw-rw-r-- 1 jlpoole jlpoole   9751 May 15 12:19 BLEAgent.py.saved
lrwxrwxrwx 1 jlpoole jlpoole     66 May 17 04:35 BLEFragmentation.py -> /usr/local/src/ble-reticulum/src/ble_reticulum/BLEFragmentation.py
-rw-rw-r-- 1 jlpoole jlpoole  20471 May 15 12:19 BLEFragmentation.py.saved
lrwxrwxrwx 1 jlpoole jlpoole     73 May 17 04:35 BLEFragmentationBackend.py -> /usr/local/src/ble-reticulum/src/ble_reticulum/BLEFragmentationBackend.py
lrwxrwxrwx 1 jlpoole jlpoole     63 May 17 04:35 BLEGATTServer.py -> /usr/local/src/ble-reticulum/src/ble_reticulum/BLEGATTServer.py
-rw-rw-r-- 1 jlpoole jlpoole  27092 May 15 12:19 BLEGATTServer.py.saved
lrwxrwxrwx 1 jlpoole jlpoole     62 May 17 04:35 BLEInterface.py -> /usr/local/src/ble-reticulum/src/ble_reticulum/BLEInterface.py
-rw-rw-r-- 1 jlpoole jlpoole 119128 May 15 12:19 BLEInterface.py.saved
-rw-rw-r-- 1 jlpoole jlpoole      0 May 15 12:19 __init__.py
drwxrwxr-x 2 jlpoole jlpoole   4096 May 15 16:35 __pycache__
lrwxrwxrwx 1 jlpoole jlpoole     66 May 17 04:35 bluetooth_driver.py -> /usr/local/src/ble-reticulum/src/ble_reticulum/bluetooth_driver.py
-rw-rw-r-- 1 jlpoole jlpoole   7340 May 15 12:19 bluetooth_driver.py.saved
lrwxrwxrwx 1 jlpoole jlpoole     72 May 17 04:35 linux_bluetooth_driver.py -> /usr/local/src/ble-reticulum/src/ble_reticulum/linux_bluetooth_driver.py
-rw-rw-r-- 1 jlpoole jlpoole 107783 May 15 12:19 linux_bluetooth_driver.py.saved
/usr/local/src/ble-reticulum/src/ble_reticulum/BLEInterface.py
/usr/local/src/ble-reticulum/src/ble_reticulum/BLEFragmentationBackend.py
Controller B8:27:EB:82:B2:4C (public)
        Manufacturer: 0x000f (15)
        Version: 0x08 (8)
        Name: zerodev1
        Alias: zerodev1
        Class: 0x00000000 (0)
        Powered: yes
        PowerState: on
        Discoverable: no
        DiscoverableTimeout: 0x000000b4 (180)
        Pairable: no
        UUID: Broadcast Audio Scan      (0000184f-0000-1000-8000-00805f9b34fb)
        UUID: Generic Access Profile    (00001800-0000-1000-8000-00805f9b34fb)
        UUID: Generic Attribute Profile (00001801-0000-1000-8000-00805f9b34fb)
        UUID: Volume Control            (00001844-0000-1000-8000-00805f9b34fb)
        UUID: Audio Input Control       (00001843-0000-1000-8000-00805f9b34fb)
        UUID: Microphone Control        (0000184d-0000-1000-8000-00805f9b34fb)
        UUID: Volume Offset Control     (00001845-0000-1000-8000-00805f9b34fb)
        UUID: Device Information        (0000180a-0000-1000-8000-00805f9b34fb)
        Modalias: usb:v1D6Bp0246d0552
        Discovering: no
        Roles: central
        Roles: peripheral
Advertising Features:
        ActiveInstances: 0x00 (0)
        SupportedInstances: 0x05 (5)
        SupportedIncludes: tx-power
        SupportedIncludes: appearance
        SupportedIncludes: local-name
        SupportedCapabilities.MinTxPower: 0x0007 (7)
        SupportedCapabilities.MaxTxPower: 0x0000 (0)
        SupportedCapabilities.MaxAdvLen: 0x1f (31)
        SupportedCapabilities.MaxScnRspLen: 0x1f (31)
Advertisement Monitor Features:
        SupportedMonitorTypes: or_patterns
Unable to start discovery. status 0x0b (Rejected)
jlpoole@zerodev1:/usr/local/src/ble-reticulum $ date
git rev-parse HEAD
git status --short --branch

pgrep -af 'ble_dual_node_echo|python|rnsd|bleak|bluezero'
bluetoothctl show
journalctl -u bluetooth --since "30 minutes ago" --no-pager
sudo btmgmt find
Sun May 17 14:05:43 PDT 2026
91037ea77d05ec9e3e33ec72e5b0da85d5eb8a53
## c++migration...origin/c++migration
?? If.txt
?? If_full.txt
?? scripts/run_sync.sh
Controller B8:27:EB:82:B2:4C (public)
        Manufacturer: 0x000f (15)
        Version: 0x08 (8)
        Name: zerodev1
        Alias: zerodev1
        Class: 0x00000000 (0)
        Powered: yes
        PowerState: on
        Discoverable: no
        DiscoverableTimeout: 0x000000b4 (180)
        Pairable: no
        UUID: Broadcast Audio Scan      (0000184f-0000-1000-8000-00805f9b34fb)
        UUID: Generic Access Profile    (00001800-0000-1000-8000-00805f9b34fb)
        UUID: Generic Attribute Profile (00001801-0000-1000-8000-00805f9b34fb)
        UUID: Volume Control            (00001844-0000-1000-8000-00805f9b34fb)
        UUID: Audio Input Control       (00001843-0000-1000-8000-00805f9b34fb)
        UUID: Microphone Control        (0000184d-0000-1000-8000-00805f9b34fb)
        UUID: Volume Offset Control     (00001845-0000-1000-8000-00805f9b34fb)
        UUID: Device Information        (0000180a-0000-1000-8000-00805f9b34fb)
        Modalias: usb:v1D6Bp0246d0552
        Discovering: no
        Roles: central
        Roles: peripheral
Advertising Features:
        ActiveInstances: 0x00 (0)
        SupportedInstances: 0x05 (5)
        SupportedIncludes: tx-power
        SupportedIncludes: appearance
        SupportedIncludes: local-name
        SupportedCapabilities.MinTxPower: 0x0007 (7)
        SupportedCapabilities.MaxTxPower: 0x0000 (0)
        SupportedCapabilities.MaxAdvLen: 0x1f (31)
        SupportedCapabilities.MaxScnRspLen: 0x1f (31)
Advertisement Monitor Features:
        SupportedMonitorTypes: or_patterns
May 17 13:58:12 zerodev1 bluetoothd[509]: Adv Monitor app :1.36 disconnected from D-Bus
May 17 14:05:43 zerodev1 bluetoothd[509]: Adv Monitor app :1.37 disconnected from D-Bus
Unable to start discovery. status 0x0b (Rejected)
jlpoole@zerodev1:/usr/local/src/ble-reticulum $ pgrep -af 'ble_dual_node_echo|python|rnsd|bleak|bluezero'
jlpoole@zerodev1:/usr/local/src/ble-reticulum $ date
sudo systemctl restart bluetooth
sleep 5
bluetoothctl show
sudo btmgmt find
Sun May 17 14:07:24 PDT 2026
Controller B8:27:EB:82:B2:4C (public)
        Manufacturer: 0x000f (15)
        Version: 0x08 (8)
        Name: zerodev1
        Alias: zerodev1
        Class: 0x00000000 (0)
        Powered: yes
        PowerState: on
        Discoverable: no
        DiscoverableTimeout: 0x000000b4 (180)
        Pairable: no
        UUID: Broadcast Audio Scan      (0000184f-0000-1000-8000-00805f9b34fb)
        UUID: Generic Access Profile    (00001800-0000-1000-8000-00805f9b34fb)
        UUID: Generic Attribute Profile (00001801-0000-1000-8000-00805f9b34fb)
        UUID: Volume Control            (00001844-0000-1000-8000-00805f9b34fb)
        UUID: Audio Input Control       (00001843-0000-1000-8000-00805f9b34fb)
        UUID: Microphone Control        (0000184d-0000-1000-8000-00805f9b34fb)
        UUID: Volume Offset Control     (00001845-0000-1000-8000-00805f9b34fb)
        UUID: Device Information        (0000180a-0000-1000-8000-00805f9b34fb)
        Modalias: usb:v1D6Bp0246d0552
        Discovering: no
        Roles: central
        Roles: peripheral
Advertising Features:
        ActiveInstances: 0x00 (0)
        SupportedInstances: 0x05 (5)
        SupportedIncludes: tx-power
        SupportedIncludes: appearance
        SupportedIncludes: local-name
        SupportedCapabilities.MinTxPower: 0x0007 (7)
        SupportedCapabilities.MaxTxPower: 0x0000 (0)
        SupportedCapabilities.MaxAdvLen: 0x1f (31)
        SupportedCapabilities.MaxScnRspLen: 0x1f (31)
Advertisement Monitor Features:
        SupportedMonitorTypes: or_patterns
Unable to start discovery. status 0x0b (Rejected)
jlpoole@zerodev1:/usr/local/src/ble-reticulum $ sudo reboot
jlpoole@zerodev1:/usr/local/src/ble-reticulum $ Connection to zerodev1 closed by remote host.
Connection to zerodev1 closed.
jlpoole@jp /usr/local/src/ble-reticulum/examples $ ssh zerodev1
Linux zerodev1 6.12.75+rpt-rpi-v8 #1 SMP PREEMPT Debian 1:6.12.75-1+rpt1 (2026-03-11) aarch64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sun May 17 04:34:23 2026 from 192.168.1.2
jlpoole@zerodev1:~ $ date
pgrep -af 'ble_dual_node_echo|python|rnsd|bleak|bluezero'
bluetoothctl show
sudo btmgmt find
Sun May 17 14:10:15 PDT 2026
Controller B8:27:EB:82:B2:4C (public)
        Manufacturer: 0x000f (15)
        Version: 0x08 (8)
        Name: zerodev1
        Alias: zerodev1
        Class: 0x00000000 (0)
        Powered: yes
        PowerState: on
        Discoverable: no
        DiscoverableTimeout: 0x000000b4 (180)
        Pairable: no
        UUID: Broadcast Audio Scan      (0000184f-0000-1000-8000-00805f9b34fb)
        UUID: Generic Access Profile    (00001800-0000-1000-8000-00805f9b34fb)
        UUID: Generic Attribute Profile (00001801-0000-1000-8000-00805f9b34fb)
        UUID: Volume Control            (00001844-0000-1000-8000-00805f9b34fb)
        UUID: Audio Input Control       (00001843-0000-1000-8000-00805f9b34fb)
        UUID: Microphone Control        (0000184d-0000-1000-8000-00805f9b34fb)
        UUID: Volume Offset Control     (00001845-0000-1000-8000-00805f9b34fb)
        UUID: Device Information        (0000180a-0000-1000-8000-00805f9b34fb)
        Modalias: usb:v1D6Bp0246d0552
        Discovering: no
        Roles: central
        Roles: peripheral
Advertising Features:
        ActiveInstances: 0x00 (0)
        SupportedInstances: 0x05 (5)
        SupportedIncludes: tx-power
        SupportedIncludes: appearance
        SupportedIncludes: local-name
        SupportedCapabilities.MinTxPower: 0x0007 (7)
        SupportedCapabilities.MaxTxPower: 0x0000 (0)
        SupportedCapabilities.MaxAdvLen: 0x1f (31)
        SupportedCapabilities.MaxScnRspLen: 0x1f (31)
Advertisement Monitor Features:
        SupportedMonitorTypes: or_patterns
Unable to start discovery. status 0x0b (Rejected)
jlpoole@zerodev1:~ $ date
pgrep -af 'ble_dual_node_echo|python|rnsd|bleak|bluezero'
bluetoothctl show
journalctl -u bluetooth --since "5 minutes ago" --no-pager
Sun May 17 14:11:27 PDT 2026
Controller B8:27:EB:82:B2:4C (public)
        Manufacturer: 0x000f (15)
        Version: 0x08 (8)
        Name: zerodev1
        Alias: zerodev1
        Class: 0x00000000 (0)
        Powered: yes
        PowerState: on
        Discoverable: no
        DiscoverableTimeout: 0x000000b4 (180)
        Pairable: no
        UUID: Broadcast Audio Scan      (0000184f-0000-1000-8000-00805f9b34fb)
        UUID: Generic Access Profile    (00001800-0000-1000-8000-00805f9b34fb)
        UUID: Generic Attribute Profile (00001801-0000-1000-8000-00805f9b34fb)
        UUID: Volume Control            (00001844-0000-1000-8000-00805f9b34fb)
        UUID: Audio Input Control       (00001843-0000-1000-8000-00805f9b34fb)
        UUID: Microphone Control        (0000184d-0000-1000-8000-00805f9b34fb)
        UUID: Volume Offset Control     (00001845-0000-1000-8000-00805f9b34fb)
        UUID: Device Information        (0000180a-0000-1000-8000-00805f9b34fb)
        Modalias: usb:v1D6Bp0246d0552
        Discovering: no
        Roles: central
        Roles: peripheral
Advertising Features:
        ActiveInstances: 0x00 (0)
        SupportedInstances: 0x05 (5)
        SupportedIncludes: tx-power
        SupportedIncludes: appearance
        SupportedIncludes: local-name
        SupportedCapabilities.MinTxPower: 0x0007 (7)
        SupportedCapabilities.MaxTxPower: 0x0000 (0)
        SupportedCapabilities.MaxAdvLen: 0x1f (31)
        SupportedCapabilities.MaxScnRspLen: 0x1f (31)
Advertisement Monitor Features:
        SupportedMonitorTypes: or_patterns
May 17 14:10:16 zerodev1 bluetoothd[511]: Adv Monitor app :1.14 disconnected from D-Bus
May 17 14:11:27 zerodev1 bluetoothd[511]: Adv Monitor app :1.15 disconnected from D-Bus
jlpoole@zerodev1:~ $ /home/jlpoole/rnsenv/bin/python3 - <<'PY'
import asyncio
from bleak import BleakScanner

count = 0

def cb(device, advertisement_data):
    global count
    count += 1
    print(device.address, device.name, advertisement_data.local_name)

async def main():
    scanner = BleakScanner(cb)
    await scanner.start()
    await asyncio.sleep(10)
    await scanner.stop()
    print("callbacks:", count)

asyncio.run(main())
PY
-bash: /home/jlpoole/rnsenv/bin/python3: No such file or directory
jlpoole@zerodev1:~ $ python3 - <<'PY'
import asyncio
from bleak import BleakScanner

count = 0

def cb(device, advertisement_data):
    global count
    count += 1
    print(device.address, device.name, advertisement_data.local_name)

async def main():
    scanner = BleakScanner(cb)
    await scanner.start()
    await asyncio.sleep(10)
    await scanner.stop()
    print("callbacks:", count)

asyncio.run(main())
PY

callbacks: 0
jlpoole@zerodev1:~ $ 
jlpoole@zerodev1:~ $ date
Sun May 17 14:16:54 PDT 2026
jlpoole@zerodev1:~ $ python3 - <<'PY'
import asyncio
from bleak import BleakScanner

count = 0

def cb(device, advertisement_data):
    global count
    count += 1
    print(device.address, device.name, advertisement_data.local_name, advertisement_data.service_uuids)

async def main():
    scanner = BleakScanner(cb)
    await scanner.start()
    await asyncio.sleep(20)
    await scanner.stop()
    print("callbacks:", count)

asyncio.run(main())
PY
B8:27:EB:54:BF:0E zerodev2 zerodev2 ['37145b00-442d-4a94-917f-8f42c5da28e3']
callbacks: 1
jlpoole@zerodev1:~ $ 
