Well, after lots of experimenting and fiddling here is what I found: I don't know if is it bug or not, but this was happening due to type differences between "linking" fields.
Tagret.targetId is int primitive. Item.targetId is long primitive.
rewriting rule this way solved the problem:
rule "testcase"
salience 300
when
$item : Item(itemTypeId in (Item.ITEM_TYPE_A, Item.ITEM_TYPE_B), targetId < 0)
not Tegret(targetId == ((long)$item.targetId))
then
retract ($item);
end
re-read documentation to find any hints about field "compatibility" restriction. no result