I found the problem. Sorry for the false alarm — GET_POSITION is working correctly.

The issue was a typo in my real IB account ID in the Zorro account configuration.

Configured in Zorro:
U493470

Actual IB account:
U4934740

So TWS was correctly sending the positions, which is why I could see lines such as:

!U4934740 XBI-STK--0.00--ARCA/-XBI-USD

but Zorro was filtering them against the incorrectly configured account ID. This resulted in GET_POSITION returning 0 and GET_TRADES returning 0.

After correcting the account ID, the same diagnostic now gives:

GET_ACCOUNT = <U4934740>
GET_POSITION = 165
GET_AVGENTRY = 128.1209
GET_TRADES = 6

So there is no GET_POSITION / IB plugin problem.

Apologies for the confusion and for sending everyone down the wrong path. The diagnostics did exactly what they were supposed to do and eventually exposed my configuration mistake.

Thanks jcl for suggesting the paper-account test — that was what led me to isolate the real cause.