# Worklog One line per item, newest at the top of each section. What was done, what worked, what did not. Keep it terse; the reasoning lives in the specs, this is the memory. ## Done - 2026-09-16 — Off the ladder, at the user's request: `L_World`, a world-partitioned ~200 km² landscape from a seeded heightmap. `Scripts/Authoring/generate_heightmap.py` (numpy, in `Scripts/Authoring/.pylib` via `bootstrap-pylib.sh`) writes 16-bit height and 8-bit weight PNGs to `Content/World/Heightmaps/`; `create_world.py` rebuilds the level from them through `ULandscapeAuthoringLibrary` in the new `SaltyEditor` module, because the engine exposes no landscape creation to Python. Elite_RockyMeadows' landscape material and three layer infos. Swap the terrain by replacing the PNGs and rerunning. Nothing in gameplay references it. - 2026-09-16 — Step 2: `ITelemetrySink` with null, log and JSON Lines sinks; `FTelemetryEvent`, the envelope and `Telemetry::ToJsonLine`; `TelemetryEvents` with the four session names; `UTelemetrySubsystem`; `ASaltyGameMode` minting the session id into `ASaltyGameState`; `bs.TelemetryTest`; the git hash in the build string (D-42); four Core tests. Proved standalone, and with a headless `-server` plus `-game` client sharing one session id. - 2026-09-16 — The editor's MCP: the engine's experimental plugin only listens when `bAutoStartServer` is set, so `.mcp.json` refused until `DefaultEditorPerProjectUserSettings.ini` set it (D-43). Enabled the Editor, AutomationTest, GameplayTags, ConfigSettings and LiveCoding toolsets; before that the only toolset was skills. Reconnect with `/mcp` after the editor is up. Live Coding must be closed before a shell build. - 2026-09-16 — Step 1: `Salty.uproject` (UE 5.8) at the root from the Third Person template, renamed from `ProjectSomething` with class redirects; `SaltyCore` and `Salty` modules; `SaltyServer.Target.cs` (unbuildable on the launcher, OD-04); `USaltyAssetManager` calling `InitGlobalData`; `Config/Tags/` with 23 root namespaces; Gameplay Abilities, CommonUI and Python enabled; `Scripts/run-tests.sh`, `build.sh`, `Authoring/create_gym.py`; Git LFS attributes; the placeholder test. Template variants kept as reference (D-41). Four Fab packs in `Content/`, none used yet (D-39). - 2026-09-15 — `Spec/Stats.md`: one stat block on every body, every outside influence an effect, counters on the receiver (D-37, D-38). Replaced the movement component's own speed-multiplier map, which was the first strand of the spaghetti this exists to prevent; enemies and kits now carry `FStatBlockDefaults`; step 5 builds it. - 2026-09-15 — The documentation set written for Unreal from the two earlier projects' docs: `Design.md`, `Steps.md` (fifteen rungs, the first six in full), `Ideas.md`, `Decisions.md` (D-01 to D-36, OD-01 to OD-08), and the eight specs under `Spec/`. No code, no project yet; step 1 is next and waits on OD-01 and OD-02. ## Worked - (nothing built yet) ## Did not work - (nothing built yet) ## Open - Step 1's last proof is a person's: Play In Editor in `L_Gym`, two players, "Run Dedicated Server" on, two pawns in the gym. Until it is ticked the step is `◐`. - The default camera mode (OD-03) is deliberately undecided until step 8. - The numbers in every spec are the earlier projects' guesses in centimetres and seconds. None has been played.