Render a caller-computed cash forecast
well_render_cash_forecastPut a cash forecast YOU computed onto the forecast card.
This tool measures nothing. It takes the settled month-end series, the anchor, the burn and the projection you computed, and returns them for rendering. Call it only after you have computed both halves yourself: the month-end totals under your cash scope, and the burn under your stated policy. Never call it to "get" a forecast.
The projection is WORST CASE: no revenue arrives, and cash declines by the burn each month until it reaches zero, where it stops. Take the anchor and the burn each to the cent, then each point is max(0, anchor − k × burn) for the k-th month after the anchor. The tool re-derives every point from the anchor and burn you state here, in cents.
The card draws the series, the anchor clause and the worst-case caveat. The cash scope, the burn policy and partial are REQUIRED and reach no pixel. All of it comes back in this tool's text result, which is what you write the prose from.
REQUIRED:
currency, andas_of: the full ISO time of the balances read the series came fromactuals: one{ month, amount }per month, oldest first, ending on the last month that has ended atas_of(UTC). A month no account covered isnull, never 0, and it stays in the list.anchor:{ month, amount, basis }.closed_month_endis the latest settled month-end inactuals.current_positionis today's cash when no month has a settled total. It sits on the grid at the last actual month.burn: the POSITIVE monthly magnitude, its currency,trailing_months, and thewindowit averaged (frominclusive andtoexclusive, eachYYYY-MM-01). The window ends with the last actual month.months_forward(at most 12), andprojection: one{ month, amount }per projected month. When the anchor sits before the last actual month, the months between are projected too, somonths_forwardmust reach past them.cash_scope: the counted account types, whether unknown ownership was counted,anchor_missing_accounts(counted accounts with no reading at a closed-month anchor; 0 undercurrent_position), and the four exclusion groupsburn_policy: the elected convention and its counts, the exclusions (internal_transfersis the sum'sexcluded_multi_leg,unreadable_rowsits malformed rows), andunplaceable_count(the sum'sexcluded_no_owned_leg)partial: the forecast's own floor, which is WIDER than a cash total'sis_floor. It is checked againstcash_scopeand must betrueexactly when an account was left out with no readable balance, no rate, OR no reading at the anchor month — that last one is the forecast's alone, and a caller that forwards its cash total'sis_floorunchanged is refused on it. It never means a cut-short read: a cut-short balances read or sum stops the run before this call.
REFUSED rather than rendered, each because your own figures disagree:
a projection point that is not
max(0, anchor − k × burn)within a centa projection that does not start the month after the anchor, skips a month, continues after a zero, or has the wrong length
a projection ending on a month that has already ended. The refusal names which of the three causes fired: the cash ran out (report that), the horizon was too narrow for the gap (widen it), or the gap exceeds every legal horizon (the feed is too far behind to project across)
a cash currency that differs from the burn's
a negative burn, a burn elected "magnitude",
signedelected from no negative rows, or one ofunplaceable_countandinternal_transfersnull without the othera
closed_month_endanchor that is not the latest settled actual, or whose amount differs from ita
current_positionanchor beside a settled actual, off the last actual month, or with an account missing at itactual months out of order, repeated, skipped, or ending on any month but the last one that has ended at
as_ofa burn window that disagrees with
trailing_months, or ends on a different month than the actualsa
partialthat disagrees with the floor your owncash_scopeimpliesan
as_ofin the future
This tool renders its own chart card. Do not re-plot the series with a charting tool.
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.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| burn | Yes | ||
| as_of | Yes | ||
| anchor | Yes | ||
| actuals | Yes | ||
| partial | Yes | ||
| currency | Yes | ||
| cash_scope | Yes | ||
| projection | Yes | ||
| burn_policy | Yes | ||
| workspace_id | No | Target workspace. Omit when the token authorizes one workspace. Required when it authorizes several: this read reports one workspace's own figures and will not choose which. | |
| months_forward | Yes | ||
| conversation_id | No | The conversation id returned by the previous Well result, in its meta under well/conversation_id, in its structuredContent, or in its JSON text block. Pass it back on every call in the same conversation, including a call a card makes, so the chosen workspace and the earlier answers still apply. It decides the conversation on its own: nothing the host states about the session replaces it. Omit it only on the first call of a conversation. |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| burn | Yes | ||
| as_of | Yes | ||
| anchor | Yes | ||
| entries | Yes | ||
| partial | Yes | ||
| success | Yes | ||
| currency | Yes | ||
| cash_scope | Yes | ||
| burn_policy | Yes | ||
| computed_by | Yes | ||
| months_forward | Yes | ||
| conversation_id | No | The conversation this result belongs to. Pass it back as the conversation_id argument on every later Well call in the same conversation. | |
| resolved_workspace | No | The workspace that answered, when the caller named none and the token authorizes several. | |
| conversation_id_note | No | Present only when the server opened a fresh lane, stating that no choice recorded earlier was read. | |
| conversation_id_source | No | Where the conversation id came from: the host's own request meta, the caller's argument, or a fresh lane the server opened. |