[Test] composites: functional test for dynamic UCL composites map
Exercises load -> reload-with-update -> reload-with-stub:
1. INITIAL MAP - DYN_ONE FIRES: load composites from map.1, scan a
message, confirm DYN_ONE and DYN_TWO fire with their declared
scores. Static composite STATIC_COMP also fires alongside.
2. RELOAD - UPDATED SCORES AND NEW NAME: swap to map.2 (DYN_ONE
score updated, DYN_TWO removed, DYN_THREE introduced), wait for
the map watcher, scan, confirm new scores + new composite +
DYN_TWO gone (stubbed).
3. RELOAD - REMOVED COMPOSITE BECOMES STUB: swap back to map.1.
DYN_ONE/DYN_TWO are back with original scores, DYN_THREE was in
the previous generation but is now absent -> verifies the stub
path keeps the name out of scan results.
Lua plugin registers DYN_BASE_A/B/C as always-firing atomic symbols
so the composite expressions resolve deterministically. Config sets
map_watch_interval = 0.5s for tight reload turnaround.