[quote:mpbnd39w]Have I missed some crucial piece of Construct logic?[/quote:mpbnd39w]
Yes. You used 'Compare values' in the system object to compare the 'ID' private variable of a piece, instead of using the Piece sprite's own 'Compare private variable' condition.
'Compare private variable' will check every piece and pick the ones that meet the condition for the event. 'Compare values' does not: it simply works out the first value, the second value, and does a simple comparison without caring about which objects were used to calculate the first and second values. It doesn't do any object picking.
So you should prefer using the conditions in the object rather than Compare Values, at all times. However, another solution is to add a 'For Each Piece' condition above the Compare Values, which explicitly forces the event to check every Piece instance - however, this is the long way of writing a simple 'Compare private variable' condition!