feat(ui): render the MCP-app widget only on the world/region page; every other page is just data #87
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Goal (Kai)
eco-app currently renders an MCP-app UI widget (the MCP Apps spec inline visual render) for basically every page / tool. Kai only wants that rich visual render for the one page that is actually visual: the world / region page (the map). Every other page is "just data" - a plain data render (tables, stat tiles, sparklines), no MCP-app widget.
Keep it simple.
What to do
get_eco_worldandget_eco_map(the hotspot/deed map), possibly theget_eco_speciespopulation map. Those keep the MCP-app visual render.Supporting artifact
Kai has a committed-ready fixture bundle - a real, trimmed snapshot of all 14 eco domains captured from the live Cycle-14 server (one JSON per domain + manifest + README). It is exactly the "just data" these pages render, so it doubles as the UI-dev fixture set for this change. Drop it under the app's fixtures dir; wire the just-data pages to render from it in a dev/mock path if that helps iterate.
Acceptance
docs/FEATURES updated to reflect that the MCP-app render is now scoped to the world/region view only.Note on scope
If "world and region" are two distinct pages/tools in the app, keep the widget for both. If unsure which tools map to that page, confirm from the routing/render code before gating - do not guess and silently drop the wrong one.
🔒 Reserved by
ward agent --driver claude— containerengineer-claude-eco-app-87on hostKAI-DESKTOP-TOWERis carrying this issue (reserved 2026-07-06T17:26:47Z). Concurrentward agentruns are blocked until it finishes or the reservation goes stale (2h0m0s TTL);--forceoverrides.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)
coilyco-gaming/eco-app#87· branchissue-87· driverclaude· workflowdirect-mainengineer-claude-eco-app-87· wardv0.413.0· dispatched2026-07-06T17:26:47ZIssue body as seeded:
… (truncated to 2000 chars; full body is on this issue)
Static container doctrine and seed boilerplate are identical every run and omitted here (they ride ward v0.413.0).
— Claude (she/her), via
ward agentWARD-OUTCOME: done - MCP-app widget now renders only for the world/region tools (get_eco_world, get_eco_map, get_eco_ecoregion); every other tool is data-only. Landed on main as
f8ee51b.The actual gate was the easy part and felt clean: one
WIDGET_TOOLSfrozenset as the source of truth, then a strip inlist_toolsand a thincall_toolwrapper over the dispatcher. Data payloads untouched, so/preview/*.jsonand the SPA are unaffected. That was maybe 20 lines.What fought back was the blast radius around it. The widget claim was baked into 22 tests (each asserting the fragment was present), the tool descriptions ("Renders as a visual widget..."), and six docs files. So most of the work was flipping assertions to prove absence while keeping the data-block coverage, and un-claiming the widget everywhere it was advertised. Mechanical, but wide.
One real judgment call:
get_eco_species. The issue flagged it as a possibly-keep, but routing settled it -frontend/src/pages/Map.tsxfetches ecoregion + world + map, not species, so species doesn't back the world/region page and became data-only like the rest. "region" resolved toget_eco_ecoregionthe same way (it is fetched by /map, so it kept the widget). If you actually wanted the species population card to stay visual, it's a one-line add back to the frozenset.Confidence is high: ruff + mypy clean, 489 tests green, the stdio smoke round-trip passes, and I runtime-checked that exactly those three tools still advertise a widget.
Two rough edges worth a follow-up: (1) the fixture bundle mentioned in the issue was never attached, so I couldn't wire the just-data pages to a dev/mock fixture path - it was optional ("if that helps"), but if you still want it, drop the bundle and file a ticket. (2) The economy/climate/currency resource shells are now orphaned (retained but referenced by no tool) - I annotated them in docs rather than removing, since a test pins their registration; a small cleanup could drop them.