Merge Ecoregion + World into a /map page: real map at 2-3x from extracted data, biome hover-highlight, activity-hotspots overlay, fix 61% unclassified #82

Closed
opened 2026-07-06 05:11:17 +00:00 by coilysiren · 4 comments
Owner

The big one. Merges two pages and reworks the map. Touches App.tsx routes + Layout.tsx nav (shared - merge main).

  • Rename/rework "region" -> "map" and expand scope. Merge Ecoregion.tsx + World.tsx into one /map page.
  • Region is 61% unclassified - fix the biome classification (src/eco_mcp_app/ecoregion.py).
  • Include the actual map image. The native map PNG renders poorly - extract the underlying map data and render a 2x-3x larger, readable version (no manual zoom needed).
  • Biome hover-highlight: hovering a biome name highlights where it is on the map.
  • Move "Most-touched objects" and "Activity hotspots" here (currently in World.tsx) and overlay Activity hotspots onto the actual map.
  • "Most-touched objects" shows wrong numbers ("Dirt Ramp 19,516,641") - same harvest-biomass-vs-unit conflation as #70; fix the count.
  • Heavy page -> add a loading state (use the shared loading component from the gating ticket). With a loading state, some data-heavy sections can load more by default (nothing crazy).

Files: frontend/src/pages/Ecoregion.tsx + World.tsx -> new Map.tsx, App.tsx, Layout.tsx, src/eco_mcp_app/ecoregion.py, world.py.

The big one. Merges two pages and reworks the map. Touches `App.tsx` routes + `Layout.tsx` nav (shared - merge `main`). - **Rename/rework "region" -> "map"** and expand scope. **Merge `Ecoregion.tsx` + `World.tsx`** into one `/map` page. - **Region is 61% unclassified** - fix the biome classification (`src/eco_mcp_app/ecoregion.py`). - **Include the actual map image.** The native map PNG renders poorly - **extract the underlying map data and render a 2x-3x larger, readable version** (no manual zoom needed). - **Biome hover-highlight**: hovering a biome name highlights where it is on the map. - **Move "Most-touched objects" and "Activity hotspots" here** (currently in `World.tsx`) and **overlay Activity hotspots onto the actual map**. - **"Most-touched objects" shows wrong numbers** ("Dirt Ramp 19,516,641") - same harvest-biomass-vs-unit conflation as #70; fix the count. - **Heavy page -> add a loading state** (use the shared loading component from the gating ticket). With a loading state, some data-heavy sections can load more by default (nothing crazy). Files: `frontend/src/pages/Ecoregion.tsx` + `World.tsx` -> new `Map.tsx`, `App.tsx`, `Layout.tsx`, `src/eco_mcp_app/ecoregion.py`, `world.py`.
Member

🔒 Reserved by ward agent --driver claude — container engineer-claude-eco-app-82 on host KAI-DESKTOP-TOWER is carrying this issue (reserved 2026-07-06T05:16:26Z). Concurrent ward agent runs are blocked until it finishes or the reservation goes stale (2h0m0s TTL); --force overrides.

Do not comment on or edit this issue to steer the run while it is reserved. The engineer seeded the body once at launch and never re-reads it, so a comment or edit reaches only human readers, never the running engineer. A correction goes to a new issue, dispatched fresh — that is the only channel that reaches a run in flight. Where the forge supports it, ward locks this conversation to make that a road-block rather than a convention (ward#494).

run seed context — what this run is carrying (ward#609)
  • Resolved: coilyco-gaming/eco-app#82 · branch issue-82 · driver claude · workflow direct-main
  • Run: engineer-claude-eco-app-82 · ward v0.413.0 · dispatched 2026-07-06T05:16:26Z
  • Comment thread: 0 included in the pre-flight read, 0 stripped (ward's own automated comments).

Issue body as seeded:

The big one. Merges two pages and reworks the map. Touches `App.tsx` routes + `Layout.tsx` nav (shared - merge `main`).

- **Rename/rework "region" -> "map"** and expand scope. **Merge `Ecoregion.tsx` + `World.tsx`** into one `/map` page.
- **Region is 61% unclassified** - fix the biome classification (`src/eco_mcp_app/ecoregion.py`).
- **Include the actual map image.** The native map PNG renders poorly - **extract the underlying map data and render a 2x-3x larger, readable version** (no manual zoom needed).
- **Biome hover-highlight**: hovering a biome name highlights where it is on the map.
- **Move "Most-touched objects" and "Activity hotspots" here** (currently in `World.tsx`) and **overlay Activity hotspots onto the actual map**.
- **"Most-touched objects" shows wrong numbers** ("Dirt Ramp 19,516,641") - same harvest-biomass-vs-unit conflation as #70; fix the count.
- **Heavy page -> add a loading state** (use the shared loading component from the gating ticket). With a loading state, some data-heavy sections can load more by default (nothing crazy).

Files: `frontend/src/pages/Ecoregion.tsx` + `World.tsx` -> new `Map.tsx`, `App.tsx`, `Layout.tsx`, `src/eco_mcp_app/ecoregion.py`, `world.py`.

Static container doctrine and seed boilerplate are identical every run and omitted here (they ride ward v0.413.0).

— Claude (she/her), via ward agent

<!-- ward-agent-reservation --> 🔒 Reserved by `ward agent --driver claude` — container `engineer-claude-eco-app-82` on host `KAI-DESKTOP-TOWER` is carrying this issue (reserved 2026-07-06T05:16:26Z). Concurrent `ward agent` runs are blocked until it finishes or the reservation goes stale (2h0m0s TTL); `--force` overrides. **Do not comment on or edit this issue to steer the run while it is reserved.** The engineer seeded the body once at launch and never re-reads it, so a comment or edit reaches only human readers, never the running engineer. A correction goes to a **new issue, dispatched fresh** — that is the only channel that reaches a run in flight. Where the forge supports it, ward locks this conversation to make that a road-block rather than a convention (ward#494). <details><summary>run seed context — what this run is carrying (ward#609)</summary> - **Resolved:** `coilyco-gaming/eco-app#82` · branch `issue-82` · driver `claude` · workflow `direct-main` - **Run:** `engineer-claude-eco-app-82` · ward `v0.413.0` · dispatched `2026-07-06T05:16:26Z` - **Comment thread:** 0 included in the pre-flight read, 0 stripped (ward's own automated comments). **Issue body as seeded:** ``` The big one. Merges two pages and reworks the map. Touches `App.tsx` routes + `Layout.tsx` nav (shared - merge `main`). - **Rename/rework "region" -> "map"** and expand scope. **Merge `Ecoregion.tsx` + `World.tsx`** into one `/map` page. - **Region is 61% unclassified** - fix the biome classification (`src/eco_mcp_app/ecoregion.py`). - **Include the actual map image.** The native map PNG renders poorly - **extract the underlying map data and render a 2x-3x larger, readable version** (no manual zoom needed). - **Biome hover-highlight**: hovering a biome name highlights where it is on the map. - **Move "Most-touched objects" and "Activity hotspots" here** (currently in `World.tsx`) and **overlay Activity hotspots onto the actual map**. - **"Most-touched objects" shows wrong numbers** ("Dirt Ramp 19,516,641") - same harvest-biomass-vs-unit conflation as #70; fix the count. - **Heavy page -> add a loading state** (use the shared loading component from the gating ticket). With a loading state, some data-heavy sections can load more by default (nothing crazy). Files: `frontend/src/pages/Ecoregion.tsx` + `World.tsx` -> new `Map.tsx`, `App.tsx`, `Layout.tsx`, `src/eco_mcp_app/ecoregion.py`, `world.py`. ``` Static container doctrine and seed boilerplate are identical every run and omitted here (they ride ward v0.413.0). </details> <!-- ward-agent-signature --> — Claude (she/her), via `ward agent`
Author
Owner

🔓 Reservation released by ward container reap — container eco-app (--driver claude) exited at the auth pre-launch gate without launching the agent (ward#222/#264/#609), so the hold it took is retracted. A plain ward agent retry no longer needs --force.

Gate: auth smoke test (claude credentials)

Recovery: Refresh the host claude login (re-run claude on the host to re-auth), then re-dispatch.

error from the gate
auth smoke test: claude -p rejected the credentials (exit 1) - they are unusable in-container (ward#222). Refresh the host claude login (re-run 'claude' on the host) and relaunch; WARD_SMOKE_TEST_SKIP=1 bypasses.

— Claude (she/her), via ward agent

<!-- ward-agent-reservation-released --> 🔓 Reservation released by `ward container reap` — container `eco-app` (`--driver claude`) exited at the **auth** pre-launch gate without launching the agent (ward#222/#264/#609), so the hold it took is retracted. A plain `ward agent` retry no longer needs `--force`. **Gate:** auth smoke test (claude credentials) **Recovery:** Refresh the host claude login (re-run `claude` on the host to re-auth), then re-dispatch. <details><summary>error from the gate</summary> ``` auth smoke test: claude -p rejected the credentials (exit 1) - they are unusable in-container (ward#222). Refresh the host claude login (re-run 'claude' on the host) and relaunch; WARD_SMOKE_TEST_SKIP=1 bypasses. ``` </details> <!-- ward-agent-signature --> — Claude (she/her), via `ward agent`
Member

🔒 Reserved by ward agent --driver claude — container engineer-claude-eco-app-82 on host KAI-DESKTOP-TOWER is carrying this issue (reserved 2026-07-06T05:39:11Z). Concurrent ward agent runs are blocked until it finishes or the reservation goes stale (2h0m0s TTL); --force overrides.

Do not comment on or edit this issue to steer the run while it is reserved. The engineer seeded the body once at launch and never re-reads it, so a comment or edit reaches only human readers, never the running engineer. A correction goes to a new issue, dispatched fresh — that is the only channel that reaches a run in flight. Where the forge supports it, ward locks this conversation to make that a road-block rather than a convention (ward#494).

run seed context — what this run is carrying (ward#609)
  • Resolved: coilyco-gaming/eco-app#82 · branch issue-82 · driver claude · workflow direct-main
  • Run: engineer-claude-eco-app-82 · ward v0.413.0 · dispatched 2026-07-06T05:39:11Z
  • Comment thread: 1 included in the pre-flight read, 1 stripped (ward's own automated comments).

Issue body as seeded:

The big one. Merges two pages and reworks the map. Touches `App.tsx` routes + `Layout.tsx` nav (shared - merge `main`).

- **Rename/rework "region" -> "map"** and expand scope. **Merge `Ecoregion.tsx` + `World.tsx`** into one `/map` page.
- **Region is 61% unclassified** - fix the biome classification (`src/eco_mcp_app/ecoregion.py`).
- **Include the actual map image.** The native map PNG renders poorly - **extract the underlying map data and render a 2x-3x larger, readable version** (no manual zoom needed).
- **Biome hover-highlight**: hovering a biome name highlights where it is on the map.
- **Move "Most-touched objects" and "Activity hotspots" here** (currently in `World.tsx`) and **overlay Activity hotspots onto the actual map**.
- **"Most-touched objects" shows wrong numbers** ("Dirt Ramp 19,516,641") - same harvest-biomass-vs-unit conflation as #70; fix the count.
- **Heavy page -> add a loading state** (use the shared loading component from the gating ticket). With a loading state, some data-heavy sections can load more by default (nothing crazy).

Files: `frontend/src/pages/Ecoregion.tsx` + `World.tsx` -> new `Map.tsx`, `App.tsx`, `Layout.tsx`, `src/eco_mcp_app/ecoregion.py`, `world.py`.

Static container doctrine and seed boilerplate are identical every run and omitted here (they ride ward v0.413.0).

— Claude (she/her), via ward agent

<!-- ward-agent-reservation --> 🔒 Reserved by `ward agent --driver claude` — container `engineer-claude-eco-app-82` on host `KAI-DESKTOP-TOWER` is carrying this issue (reserved 2026-07-06T05:39:11Z). Concurrent `ward agent` runs are blocked until it finishes or the reservation goes stale (2h0m0s TTL); `--force` overrides. **Do not comment on or edit this issue to steer the run while it is reserved.** The engineer seeded the body once at launch and never re-reads it, so a comment or edit reaches only human readers, never the running engineer. A correction goes to a **new issue, dispatched fresh** — that is the only channel that reaches a run in flight. Where the forge supports it, ward locks this conversation to make that a road-block rather than a convention (ward#494). <details><summary>run seed context — what this run is carrying (ward#609)</summary> - **Resolved:** `coilyco-gaming/eco-app#82` · branch `issue-82` · driver `claude` · workflow `direct-main` - **Run:** `engineer-claude-eco-app-82` · ward `v0.413.0` · dispatched `2026-07-06T05:39:11Z` - **Comment thread:** 1 included in the pre-flight read, 1 stripped (ward's own automated comments). - included: @coilysiren (2026-07-06T05:16:52Z) - stripped: @coilyco-ops (2026-07-06T05:16:30Z) **Issue body as seeded:** ``` The big one. Merges two pages and reworks the map. Touches `App.tsx` routes + `Layout.tsx` nav (shared - merge `main`). - **Rename/rework "region" -> "map"** and expand scope. **Merge `Ecoregion.tsx` + `World.tsx`** into one `/map` page. - **Region is 61% unclassified** - fix the biome classification (`src/eco_mcp_app/ecoregion.py`). - **Include the actual map image.** The native map PNG renders poorly - **extract the underlying map data and render a 2x-3x larger, readable version** (no manual zoom needed). - **Biome hover-highlight**: hovering a biome name highlights where it is on the map. - **Move "Most-touched objects" and "Activity hotspots" here** (currently in `World.tsx`) and **overlay Activity hotspots onto the actual map**. - **"Most-touched objects" shows wrong numbers** ("Dirt Ramp 19,516,641") - same harvest-biomass-vs-unit conflation as #70; fix the count. - **Heavy page -> add a loading state** (use the shared loading component from the gating ticket). With a loading state, some data-heavy sections can load more by default (nothing crazy). Files: `frontend/src/pages/Ecoregion.tsx` + `World.tsx` -> new `Map.tsx`, `App.tsx`, `Layout.tsx`, `src/eco_mcp_app/ecoregion.py`, `world.py`. ``` Static container doctrine and seed boilerplate are identical every run and omitted here (they ride ward v0.413.0). </details> <!-- ward-agent-signature --> — Claude (she/her), via `ward agent`
Author
Owner

WARD-OUTCOME: done - merged /world + /ecoregion into one /map page; fixed the 61%-unclassified biome bug (now ~20%) and the runaway most-touched-object counts

Candid retro: this was the big one, and most of it went smoother than I feared once I stopped guessing and pulled the live server data. The "61% unclassified" mystery cracked open the moment I looked at the actual worldlayers response — the biome layers only tag deep ocean, so ~57% SaltWater and ~5% FreshWater were just sitting there unnamed in the World/Moisture categories. Reclassifying those into "coastal & shallow sea" + "fresh water" slices dropped unclassified from 61% to 20% on the live server on the first try, which felt great to verify end-to-end rather than hope.

What fought back: the game server is genuinely flaky right now — /api/v1/map/dimension and the layer rasters throw ConnectTimeouts intermittently (HTTP 000), so the biome hover-highlight leans hard on the best-effort/graceful-degrade path. It works, but on any given load you only get rasters for whichever biomes answered that request. That's inherent to the server, not the code, but it means the hover feature is less reliably complete than I'd like. The other friction was landing: two sibling containers pushed to main mid-run (Items, page-password/#73 — which turned out to own the shared Loading component the ticket referenced — and Users/#80), so I resolved three-way conflicts twice across App/Home/FEATURES.

Confidence: high on the backend (water classification + object-count fix are unit-tested and verified live; 486 backend + 104 frontend tests green). Medium on the map's visual polish — I validated the data and the React logic, but couldn't eyeball the rendered map in a browser from here. Follow-ups worth filing: (1) a short client-side retry/refresh for biome rasters so the highlight fills in over a few seconds, and (2) confirm the /map layout reads well at the new larger size on a real screen.

WARD-OUTCOME: done - merged /world + /ecoregion into one /map page; fixed the 61%-unclassified biome bug (now ~20%) and the runaway most-touched-object counts Candid retro: this was the big one, and most of it went smoother than I feared once I stopped guessing and pulled the live server data. The "61% unclassified" mystery cracked open the moment I looked at the actual worldlayers response — the biome layers only tag deep ocean, so ~57% SaltWater and ~5% FreshWater were just sitting there unnamed in the World/Moisture categories. Reclassifying those into "coastal & shallow sea" + "fresh water" slices dropped unclassified from 61% to 20% on the live server on the first try, which felt great to verify end-to-end rather than hope. What fought back: the game server is genuinely flaky right now — `/api/v1/map/dimension` and the layer rasters throw ConnectTimeouts intermittently (HTTP 000), so the biome hover-highlight leans hard on the best-effort/graceful-degrade path. It works, but on any given load you only get rasters for whichever biomes answered that request. That's inherent to the server, not the code, but it means the hover feature is less reliably complete than I'd like. The other friction was landing: two sibling containers pushed to main mid-run (Items, page-password/#73 — which turned out to own the shared Loading component the ticket referenced — and Users/#80), so I resolved three-way conflicts twice across App/Home/FEATURES. Confidence: high on the backend (water classification + object-count fix are unit-tested and verified live; 486 backend + 104 frontend tests green). Medium on the map's visual polish — I validated the data and the React logic, but couldn't eyeball the rendered map in a browser from here. Follow-ups worth filing: (1) a short client-side retry/refresh for biome rasters so the highlight fills in over a few seconds, and (2) confirm the `/map` layout reads well at the new larger size on a real screen.
Sign in to join this conversation.
No description provided.