Trade & store logistics: currency & money-supply surface (meets Currency/Currencies) #53

Closed
opened 2026-07-05 01:22:35 +00:00 by coilysiren · 4 comments
Owner

Context

Currency and money-supply surface under the DiscordLink-replacement epic (#37). DiscordLink ships Currency <name> (one currency: top holders, backing, trade count) and Currencies (top currencies, split minted/backed vs personal/credit), plus a Currency Display module. Owning this on the website is squarely in the epic's read-only-info-belongs-on-the-site thesis.

No-reset spine

Build from what the server already exposes. /info carries EconomyDesc (trade and contract counts) and the currency listing, and /datasets carries TradesInLast7Days and the commerce series. Honesty note: per-account balances and top-holder lists may not be in the current export surface. The agent's first task is a 20-minute probe (per the dataset how-to in docs/datasets/README.md) to confirm what currency and holder data is exportable without a new mod. Build every part that is reachable now. Anything that genuinely needs live in-game balances gets split into a follow-up issue linked to the reset-gated stores/economy exporter, never a silent skip (AGENTS.md pull-everything rule).

Scope

The agent builds a currency and money-supply MCP surface:

  • Currency list - each currency with its type (minted/backed vs personal/credit where derivable), trade volume, and circulation signal, matching Currencies.
  • Per-currency report - trade count and any reachable backing and holder data, matching Currency <name>. Top holders only if the probe confirms they are exportable.
  • Surfaces - MCP tool (get_eco_currency) with text + JSON + _meta.ui card, and /preview/currency.json for the SPA.

Meets Currency and Currencies for everything exportable today. The holder-list piece is meet-if-reachable, defer-if-not, with the gap filed rather than hidden.

Acceptance

  • Probe findings written into the issue thread or docs/datasets/ before the tool is finalized, so the reachable-vs-deferred line is documented.
  • MCP tool registered, ward exec smoke passes.
  • respx-mocked unit tests for the parsing and classification.
  • ward exec test / ward exec lint green. docs/FEATURES.md updated. Any deferred holder data has a linked follow-up issue.

Dependencies

Parent: #37. Related survey: #7. Surfaced in the /trade SPA route (sibling).

## Context Currency and money-supply surface under the DiscordLink-replacement epic ([#37](https://forgejo.coilysiren.me/coilyco-gaming/eco-app/issues/37)). DiscordLink ships `Currency <name>` (one currency: top holders, backing, trade count) and `Currencies` (top currencies, split minted/backed vs personal/credit), plus a Currency Display module. Owning this on the website is squarely in the epic's read-only-info-belongs-on-the-site thesis. ## No-reset spine Build from what the server **already exposes**. `/info` carries `EconomyDesc` (trade and contract counts) and the currency listing, and `/datasets` carries `TradesInLast7Days` and the commerce series. **Honesty note:** per-account balances and top-holder lists may not be in the current export surface. The agent's first task is a 20-minute probe (per the dataset how-to in `docs/datasets/README.md`) to confirm what currency and holder data is exportable **without a new mod**. Build every part that is reachable now. Anything that genuinely needs live in-game balances gets **split into a follow-up issue** linked to the reset-gated stores/economy exporter, never a silent skip (AGENTS.md pull-everything rule). ## Scope The agent builds a **currency and money-supply** MCP surface: * **Currency list** - each currency with its type (minted/backed vs personal/credit where derivable), trade volume, and circulation signal, matching `Currencies`. * **Per-currency report** - trade count and any reachable backing and holder data, matching `Currency <name>`. Top holders only if the probe confirms they are exportable. * **Surfaces** - MCP tool (`get_eco_currency`) with text + JSON + `_meta.ui` card, and `/preview/currency.json` for the SPA. ## DiscordLink parity **Meets** `Currency` and `Currencies` for everything exportable today. The holder-list piece is meet-if-reachable, defer-if-not, with the gap filed rather than hidden. ## Acceptance * Probe findings written into the issue thread or `docs/datasets/` before the tool is finalized, so the reachable-vs-deferred line is documented. * MCP tool registered, `ward exec smoke` passes. * `respx`-mocked unit tests for the parsing and classification. * `ward exec test` / `ward exec lint` green. `docs/FEATURES.md` updated. Any deferred holder data has a linked follow-up issue. ## Dependencies Parent: [#37](https://forgejo.coilysiren.me/coilyco-gaming/eco-app/issues/37). Related survey: [#7](https://forgejo.coilysiren.me/coilyco-gaming/eco-app/issues/7). Surfaced in the `/trade` SPA route (sibling).
Member

🔒 Reserved by ward agent --driver claude — container engineer-claude-eco-app-53 on host KAI-DESKTOP-TOWER is carrying this issue (reserved 2026-07-05T01:40: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).

— Claude (she/her), via ward agent

<!-- ward-agent-reservation --> 🔒 Reserved by `ward agent --driver claude` — container `engineer-claude-eco-app-53` on host `KAI-DESKTOP-TOWER` is carrying this issue (reserved 2026-07-05T01:40: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). <!-- ward-agent-signature --> — Claude (she/her), via `ward agent`
Author
Owner

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

— Claude (she/her), via ward agent

<!-- ward-agent-reservation-released --> 🔓 Reservation released by `ward container reap` — container `eco-app` (`--driver claude`) exited without launching the agent (smoke-test death, ward#222/#264), so the hold it took is retracted. A plain `ward agent` retry no longer needs `--force`. <!-- ward-agent-signature --> — Claude (she/her), via `ward agent`
Member

🔒 Reserved by ward agent --driver claude — container engineer-claude-eco-app-53 on host KAI-DESKTOP-TOWER is carrying this issue (reserved 2026-07-05T02:54:18Z). 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).

— Claude (she/her), via ward agent

<!-- ward-agent-reservation --> 🔒 Reserved by `ward agent --driver claude` — container `engineer-claude-eco-app-53` on host `KAI-DESKTOP-TOWER` is carrying this issue (reserved 2026-07-05T02:54:18Z). 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). <!-- ward-agent-signature --> — Claude (she/her), via `ward agent`
Author
Owner

WARD-OUTCOME: done - get_eco_currency (roster/money-supply + per-currency report), /preview/currency.json, probe doc, tests; deferred top-holders to #58; merged sibling trades/stores work and pushed to main.

The probe rewrote the plan on contact: the issue assumed /info carries a currency listing, but on 0.13.0.4 it only has EconomyDesc. The real surface turned out to be /datasets/flatlist (pleasantly, public) plus the admin exporter, which named nine currency datasets cleanly split into money-supply series and the CreateCurrency/MintCurrency/CurrencyTrade actions. That flatlist was the whole ballgame - once I had it, the minted-vs-personal classification (a currency is backed iff it mints) fell out naturally and matched what Currencies shows.

What fought back: no admin token in this container, so I couldn't see a single real CurrencyTrade row - the exporter 401s. I leaned on the established codebase pattern (defensive header-keyed column candidates + graceful degradation, exactly like climate.py/crafting.py) and respx fixtures built from the documented shapes. Confidence is high on the reachable series and the classification logic (fully tested, and I verified the degraded public path live against the server). It's medium on the exact CurrencyTrade/MintCurrency CSV column names - if the live exporter spells the currency or amount column differently than my candidate list, the per-currency trade/mint attribution will come up empty until the names are added, though the money-supply headline and roster still render. Worth a 5-minute re-probe with the token once deployed.

Rough edges / follow-ups: top-holders is genuinely not in any export surface, filed as #58 (the new mods/stores exporter from #50 that landed on main mid-merge is store shelves, not per-account balances, so the gap stands). The /trade SPA page (sibling) can now consume /preview/currency.json. Merge with the concurrent trades/stores feature was clean - the tool-list test combined both additions without a conflict.

WARD-OUTCOME: done - get_eco_currency (roster/money-supply + per-currency report), /preview/currency.json, probe doc, tests; deferred top-holders to #58; merged sibling trades/stores work and pushed to main. The probe rewrote the plan on contact: the issue assumed `/info` carries a currency listing, but on 0.13.0.4 it only has `EconomyDesc`. The real surface turned out to be `/datasets/flatlist` (pleasantly, public) plus the admin exporter, which named nine currency datasets cleanly split into money-supply series and the CreateCurrency/MintCurrency/CurrencyTrade actions. That flatlist was the whole ballgame - once I had it, the minted-vs-personal classification (a currency is backed iff it mints) fell out naturally and matched what `Currencies` shows. What fought back: no admin token in this container, so I couldn't see a single real CurrencyTrade row - the exporter 401s. I leaned on the established codebase pattern (defensive header-keyed column candidates + graceful degradation, exactly like climate.py/crafting.py) and respx fixtures built from the documented shapes. Confidence is high on the reachable series and the classification logic (fully tested, and I verified the degraded public path live against the server). It's medium on the exact CurrencyTrade/MintCurrency CSV column names - if the live exporter spells the currency or amount column differently than my candidate list, the per-currency trade/mint attribution will come up empty until the names are added, though the money-supply headline and roster still render. Worth a 5-minute re-probe with the token once deployed. Rough edges / follow-ups: top-holders is genuinely not in any export surface, filed as #58 (the new mods/stores exporter from #50 that landed on main mid-merge is store shelves, not per-account balances, so the gap stands). The /trade SPA page (sibling) can now consume /preview/currency.json. Merge with the concurrent trades/stores feature was clean - the tool-list test combined both additions without a conflict.
Sign in to join this conversation.
No description provided.