# Implementation Plan ## Checklist 1. Capture a parity baseline before product-code edits. 2. Add `blender/osmassets/fountain.py` with the current fountain assembly logic. 3. Import the module in `blender/generate_scene.py`. 4. Remove inline `add_fountain()` from `generate_scene.py`. 5. Replace the call site with `fountain.assemble(...)`. 6. Run Python validation: - `python3 -m py_compile blender/osmassets/fountain.py` - `python3 -m py_compile blender/generate_scene.py` - `python3 -m unittest blender/tests/test_pure.py` 7. Capture parity after the refactor. 8. Compare before/after parity snapshots and inspect any non-ignored diff. 9. Update `.trellis/spec` or `docs/changelog.md` only if the work reveals a durable new constraint or user-visible change. 10. Commit, archive the task, and record the journal entry. ## Validation Commands ```bash node scripts/parity.js capture fountain-module-before --stages blender,cesium python3 -m py_compile blender/osmassets/fountain.py python3 -m py_compile blender/generate_scene.py python3 -m unittest blender/tests/test_pure.py node scripts/parity.js capture fountain-module-after --stages blender,cesium node scripts/parity.js compare fountain-module-before fountain-module-after ``` ## Risk Points - `link_object_to_collection()` must be used the same way as before so object collection membership stays unchanged. - The basin custom property must remain on the basin object only. - Droplet order and names must stay stable. - `math` usage may move with the function; remove the import from `generate_scene.py` only if no remaining code uses it. - Parity is mandatory because this is a pure refactor of bpy-layer scene generation.