Some example rules to clarify what I described as capabilities of the lower layers (syntax is not important yet). It also made clear to me that having relations with values would be useful.
This shows how a kind of template is used to make a bunch of units according to a template with some variation in the last case.
Code:
<class Name="UNITCLASS_EARLYRECON" Abstract="1">
<inherit>BASE_UNIT</inherit>
<helpname>Early Recon Units</helpname>
<property Name="Level" Type="float">0</property>
<property Name="Strength" Type="float">1 + 2*Level</property>
<relationentry Name="StrengthBonus" ApplyToAbstract="0">
<relvar Name="Source">this</relvar>
<relvar Name="Target">UNITCLASS_ANIMAL</relvar>
<relvar Name="Bonus" Type="float">1.5 + 0.5*Level</relvar>
<relationentry>
</class>
<class Name="UNIT_WANDERER" Abstract="0">
<inherit>UNITCLASS_EARLYRECON</inherit>
<helpname>Wanderer</helpname>
<property Name="Level">0</property>
</class>
<class Name="UNIT_SCOUT" Abstract="0">
<inherit>UNITCLASS_EARLYRECON</inherit>
<helpname>Scout</helpname>
<property Name="Level">2</property>
</class>
<class Name="UNIT_WARSCOUT" Abstract="0">
<inherit>UNITCLASS_EARLYRECON</inherit>
<helpname>War Scout</helpname>
<property Name="Level">2</property>
<property Name="Strength">super.Strength * 1.2</property>
<relationentry Name="StrengthBonus" ApplyToAbstract="0" Overwrite"1">
<relvar Name="Source">this</relvar>
<relvar Name="Target">UNITCLASS_ANIMAL</relvar>
<relvar Name="Bonus" Type="float">0.75 + 0.25*Level</relvar>
<relationentry>
</class>