@jason-green-lowe
If it ends in "xxx...Territories" that is where to look, and count equal to or greater than the number of territories listed to be true.
'direct...Territories', 'allies...Territories' and 'enemy...Territories' take their cues from the 'players' option or 'attachTo' if 'players' is missing (If you use 'players' it is best to add the 'attachTo' player to the list. Some conditions will add 'attachTo', some do not, and those that do clear it out so that there will not be any duplication.).
"unitPresence" is what "xxx...Territories" is looking for in each territory listed in "xxx...Territories" value list. The key word here is each, not the group as a whole. PoS2 states that units listed together separated by a colon means "OR", this is incorrect. Colon separated list means cumulative.
So in your example you have:
<option name="enemyPresenceTerritories" value="@SeaZones@" count="1"/>
But there is no "unitPresence" telling "enemyPresenceTerritories" what to look for.
PoS2 states: "If missing, then presence needs only 1 of any unit, and excluded needs to be completely devoid of units" Well... I treat "xxx...Territories" like I treat triggers, always have "conditions" and "when". It's not always necessary, but the TripleA engine is very old, and there have been may contributors to the code, that assumptions may not work as desired.
So add:
<option name="unitPresence" value="ANY" count="1"/>
<!-- If you want zero units add invert -->
<!-- <option name="invert" value="true"/> -->
Hope this helps.
Cheers...