Movement & collision:
- stepSeparation (TALogic) replaces the hard "snap unit to nearest clear
tile centre" correction with a circle-vs-blocked-tile push proportional
to overlap, damped by separationStiffness — no more teleport-yank,
corner-bouncing, or stalling in exact-width corridors (caught as an
AI-vs-AI win-rate regression in testing).
- servicePathQueue now routes at a unit's exact required clearance instead
of padding +1, so traffic spreads across all passable tiles rather than
funneling into a few wide chokepoint corridors.
- TAArt's structure painter falls back to a generic spinning glyph for
topperFrame buildings.
Upgrades (new rule: upgradesFrom):
- A building may be placed directly on top of a friendly building it
names at the same tile/footprint, consuming it for a 50% refund of the
replaced building's OWN cost (not a price discount) — implemented via
TALogic.findUpgradeTarget and an army-aware canPlaceAt.
- New definitions: nuclearplant (upgrades energygen, frame 22) and
advancedmassgen (upgrades massgen, frame 24).
- compileRules (TARules) validates upgradesFrom references and topperFrame;
sprites.md documents the semantics.
- New map m06 "Annihilation" (medium, snowfields, Klaxon skill 5, seed
90123 — pre-vetted from the original sweep for early-economy balance).
Tests (tools/verifyTotalAnnihilation.js):
- Section 4d: pathfinding routes around obstacles and a unit threads a
corridor exactly its own width.
- Section 5b: obstacle push is a bounded per-tick nudge (not a
teleport), settles clear without oscillation, a unit ordered past an
obstacle arrives, and no stuck-give-up flagging.
- Upgrade suite: exact 50% refund credited in place, fresh-ground builds
still work, enemy-owned and mismatched-type targets rejected, reverse
nuclearplant/energygen pairing, and canPlaceAt without an army never
grants upgrade placements.