Actually, you are both incorrect.
If you look at the code, Veteran militia doesn't have any exceptions (for the case it targets itself) implemented. Additionally, it isn't true that played card is no longer present in hand when played, because it is. Some card effects may ignore the card at the played card position (Moon shrine for example), but by default this card is present. For example when counting keywords, the played card is also counted.
Why doesn't the Veteran militia work in this case then? It's because the standard draw overrides the card effect. What really happens is that Veteran militia really draws an uncommon card, but then standard draw puts a new card in place of it.
Standard draw is manipulated via the $nextcard variable. Cards that effect the standard draw (like summoning cards, Scepter of summoning for example) pass the summoned card to this variable. Some cards disable the standard draw (Architectural improvement for example). This is done by assigning zero to $nextcard. ($nextcard = 0).
Summary (order of card actions):
1 - card effect
2 - keyword effect (will override card effect in case of conflict)
3 - standard draw (will override keyword effect or card effect in case of conflict while not disabled by $nextcard = 0), also when a non-zero value (valid card ID) is assigned to the $nextcard, this card will be selected as the nextcard (this is a method for card effects and keyword effects to control the standard draw).
This concludes card action tutorial :) I hope you understand the situation now ;-)