# Task Assignment — Worker M3 Fix (Milestone 3 Iteration 2 Remediation)

Scope:
Address the 3 exact findings from Reviewer M3-1, Reviewer M3-2, and Challenger M3-1:

1. `server/world/wilderness_map_generator.py` line 65-75:
   In `for_zone()`, when `biome_id` is provided as a string, preserve `b_id = str(biome_id)` instead of mutating to `defn.biome_id` (so that `STY_02_HUYET_SAT_LAM` is preserved).
   Specifically:
   ```python
   if biome_id is not None:
       if isinstance(biome_id, int) or (isinstance(biome_id, str) and str(biome_id).isdigit()):
           defn = get_biome_by_code(int(biome_id))
           b_id = defn.biome_id if defn else "BLEACHED_BONE_CANYON"
       else:
           b_id = str(biome_id)
   ```
2. `client/webapp/js/engine/tile_map_renderer.js` line 294:
   In `_drawTile()`, use 9-argument `ctx.drawImage` to extract a single 64x64 cell from the 192x64 props sheet:
   ```javascript
   const frameIdx = Math.floor(rnd * 20) % 3;
   ctx.drawImage(propSprite, frameIdx * 64, 0, 64, 64, px - 8, py - 10, 16, 16);
   ```
3. `client/webapp/js/engine/biome_texture_manager.js`:
   Add `getPropDecal` alias:
   ```javascript
   getPropDecal(biomeCode, propId) {
       return this.getPropSprite(biomeCode, propId);
   }
   ```
4. Run tests:
   `pytest tests/e2e/test_30_biomes_generation_e2e.py tests/unit/test_wilderness_map_generator.py tests/unit/test_war_fog_and_procedural_map.py -v`
   `node tests/unit/test_biome_texture_manager.js`
   `python tools/lint/check_code_and_doc_hygiene.py --strict`

Report handoff in `c:\Projects\FreeExile\.agents\teamwork\worker_m3_fix\handoff.md`.
