Put a cost breakdown YOU computed onto the cost-structure card.
**This tool measures nothing.** It takes the slices and the method behind them as input and returns them for rendering. Call it only after you have computed the breakdown yourself and can state every field below from your own work, never to "get" a cost structure.
The server derives no breakdown of its own. The chart draws the slices you state here, which is why every field below is required: the policy behind a grouping is the only thing that makes it checkable.
**The card draws the ring, the legend and the month.** Everything else you state below is REQUIRED and reaches no pixel. All of it comes back to you in this tool's text result, which is what you write the prose from. The chart is the measure; the explanation is yours.
REQUIRED, because a breakdown whose method is not stated cannot be checked:
- `entries`: the slices, largest first, each a POSITIVE magnitude in `currency`. Send NO share: this tool derives every share from the amounts and returns them, and an entry carrying `pct` is refused as an unknown field. At most 4 named slices plus one rolled-up `Other`, because the card performs no rollup of its own
- `period_start` and `period_end`: the INCLUSIVE bounds of the single calendar month covered. Never a quarter, never a span, never a month still running
- `rung`: which grouping produced these categories. State it in prose too, so the reader knows whether they are looking at their own ledger's categories or Well's
- `label_provenance`: whether a person owns those labels. A chart of accounts synced from an accounting tool is `machine`, not `curated`: the names came from the provider, not from anyone at the company
- `coverage`: the outflow rows the elected grouping could label, against every outflow row the month held. This is the evidence the rung was elected on, and your prose states it
- `convention` and `convention_counts`: which sign means money leaving, and the row counts you elected it from
- `excluded`: what fell out, in four named groups. `no_asset_movement` is where CARD SPEND lands, because the transfer rule drops a row with no owned asset leg and a card charge moves a liability. It contains `no_owned_leg`, so never add them. Send an unmeasured LEG count as `null` rather than `0`, because zero says the rule removed nothing, and one cancelled leg count nulls all three. `unreadable_rows` is always measured and takes a number
REFUSED rather than rendered:
- an entry carrying `pct`, or any other field this schema does not name. The shares are DERIVED here from the amounts, so a share you send is a second opinion the card has no way to reconcile
- entries out of descending-amount order, more than 4 named slices, or an `Other` slice that is not last
- a negative `amount`: a breakdown is made of magnitudes
- a `period_start`/`period_end` pair that is not exactly one whole calendar month, or that names a month which has not ended
- `category_key` on any rung but `category_key`, or on the rolled-up `Other` slice, which is many categories and is therefore not one of them
- any `label_provenance` but `unlabelled` on a rung that carries no category: `curated`, `machine` and `mixed` each claim that someone or something chose labels the chart never shows. The converse is NOT refused, because a rung elects over the month's rows while the provenance describes the ones that survived into the slices, so a labelled rung whose labelled rows all dropped is legitimately `unlabelled`
- `rung: "uncategorised"` sent beside named category slices, which is a breakdown claiming to be the absence of one
- `convention: "magnitude"`: that feed keeps direction in a field no grouping reaches, so no outflow was measured. `signed` elected from ZERO negative rows is the same finding, demonstrated rather than declared
- coverage wider than the month it covers, or a labelled rung that could label no rows at all
- one of `excluded.internal_transfers`, `excluded.no_owned_leg` and `excluded.no_asset_movement` `null` while the others are measured: one cancelled count nulls all three, and the refusal is filed against `excluded.no_asset_movement`
- a `currency` outside ISO-4217: the code is checked against the catalog, not its shape
An EMPTY `entries` array is accepted, and it means nothing is categorized for that month. Say that, rather than reporting zero spend: a month with no outflow at all is a different answer and the card says so differently.
When the token authorizes one workspace, call this directly — no other tool call is needed first. When it authorizes several, this read will not guess which one you mean: pass `workspace_id` on the call.