Files
fd0715a37a [AI] Show a goal progress ring beside underfunded category balances (#9297)
* [AI] Show goal funding status and an Assign action in balance menus

Use the existing Budget Automation engine to add a panel to category
balance menus with the month's recommendation, what is assigned so far,
what is still needed, and an Assign action that adds the money still
needed (undoable).

- budget/category-funding reads the dryRunCategoryTemplate projection
  without writing goal_def; categories without funding templates get
  null, and invalid automations fail closed.
- budget/fund-category recomputes on the server, assigns the full
  recommendation and goal in one batch, and is a no-op when already
  funded.
- Funding reads are gated by the goal templates flag, only run for
  categories with templates, and refresh after data changes and funding.
- Covers desktop and mobile envelope and tracking balance menus,
  including tracking income categories.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XJDNR72i3yEZttwMUuk4cq

* [AI] Fold goal funding into the existing goal status and never overbudget

Address review feedback on the category funding change:

- Replace the separate funding panel with the existing goal status. It
  now shows at the top of the desktop envelope and tracking balance
  menus (as it already did on mobile) with a thin progress bar, and the
  desktop hover tooltip is removed along with its tooltipDisabled
  workaround.
- Replace the Assign button with a "Fund goal from To Budget" balance
  menu item (envelope only, not for long-term goals) that uses the
  existing undoable transfer-available action, so it never moves more
  than To Budget and never lowers a budget. It is hidden when the goal
  is met or To Budget is empty.
- Drop the live dry-run endpoint, the fund-category endpoint, their
  client queries and refresh wiring, and the tracking income additions.
  Status, bar, colour and fund amount now all read the stored goal.
- Add transferAvailable tests and menu wiring tests, and update the
  budget automation docs for the moved goal status.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XJDNR72i3yEZttwMUuk4cq

* [AI] Show goal status as a colored pill on category balances

Draw the balance of a category with a goal as a pill with an icon:
yellow with a clock when underfunded, green with a check when funded
and red with an exclamation when overspent. Categories without a goal,
or with goal templates off, render as before.

- The pill, the balance colour and the goal status share one comparison
  (compareToGoal/getGoalFundingState), made on displayed amounts so they
  agree when decimals are hidden.
- Desktop envelope and tracking tables and the mobile budget table;
  narrow desktop columns drop the icon to keep the amount readable, and
  mobile amounts shrink to fit instead of being cut off.
- Status is announced to screen readers, not shown by colour alone.
- Pill colours get their own theme tokens so the funded pill keeps
  enough contrast in the midnight theme.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XJDNR72i3yEZttwMUuk4cq

* [AI] Move GoalStatus into its own file

GoalStatus isn't specific to BalanceWithCarryover, so give it a
type-strict module of its own alongside its row helper.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CpAtycTVCRhkLcuD6AJeTM

* [AI] Update goal status screenshots to show the balance menu

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CpAtycTVCRhkLcuD6AJeTM

* [AI] Clarify how funding a goal affects next month's To Budget

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CpAtycTVCRhkLcuD6AJeTM

* [AI] Update docs screenshots to show the goal status pill

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CpAtycTVCRhkLcuD6AJeTM

* [AI] Describe the underfunded goal status as yellow in the docs

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CpAtycTVCRhkLcuD6AJeTM

* [AI] Update mobile budget template VRT snapshots for the goal status pill

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CpAtycTVCRhkLcuD6AJeTM

* [AI] Replace the goal status pill with a goal progress ring

Keep category balances in their usual colours and draw a small ring
beside balances with a goal instead: a gold arc that fills as the goal
is funded, and a green check once it is met. Overspent balances stay red
like any other negative amount, without an extra marker.

The ring sits beside the amount in the balance cell on desktop, inside
the balance pill on mobile, and next to the heading of the goal status
in the balance menu, so one shape carries the status everywhere. The
pill-only theme tokens are removed, the docs text and screenshots and
the mobile VRT snapshots are updated, and the release note is replaced.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01B4sNu2G32qCLcAe2YznUCM

* [AI] Only mark goals that still need money, with a filling ring

Draw the goal ring only beside balances whose goal is not met yet, so a
fully funded budget looks like one without goals and the one mark in the
table points at rows that still need money. The ring is a single gold
pie: a hollow outline when nothing is funded yet, a wedge that grows
with the funded share and that never closes, since the ring disappears
the moment the goal is met. Funded rows carry no mark and overspent
rows stay red like any other negative amount.

The glyph shrinks to 10px to sit within the cap height of the figures
and draws in one theme token, so it keeps 3:1 contrast on every surface
in all three themes. The amount keeps its full width in narrow month
columns; the ring is what yields. The balance menu shows the same ring
only beside "Underfunded", as its legend. The three-way funding state
is replaced by one helper that returns the progress to draw or nothing.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01B4sNu2G32qCLcAe2YznUCM

* [AI] Keep the funded balance green, ring only while the goal is unmet

A category whose goal is met keeps the green balance the goal templates
feature already gives it, so a met goal still reads differently from no
goal. The ring stays the only mark on an unfunded goal; its amount keeps
the normal colour instead of upstream's gold text.

Docs text and screenshots, the release note and the mobile template VRT
snapshots follow.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01B4sNu2G32qCLcAe2YznUCM

* [AI] Keep funded balances green in the mobile balance sheet and the ring in view

- Add an explicit isIncome prop instead of reading isDisabled as "income",
  so the mobile balance sheet header (which is only disabled because it is
  not clickable) colours a funded balance green again, and mobile income
  balances keep their hover style
- Let a long amount shrink beside the ring on desktop so the ring is not
  pushed out of the column
- Describe the ring instead of yellow balances in the goal directive docs
- Drop a snapshot change that had no visible difference

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CpAtycTVCRhkLcuD6AJeTM

* [AI] Drop the ring from the goal status in the balance menu

The progress bar right below it already shows the same thing, so the menu
keeps its plain status line. Retake the balance menu screenshots in the
docs to match.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CpAtycTVCRhkLcuD6AJeTM

* [AI] Keep the balance yellow while its goal is unmet

Per review, an unmet goal keeps the yellow balance text it has on master and
gains the progress ring beside it, so every category with a goal is
coloured. The balance colour logic is back to master's; the docs and their
screenshots describe and show yellow text with the ring.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CpAtycTVCRhkLcuD6AJeTM

* [AI] Show income goals only in tracking budgets

Envelope budgets don't apply templates to income categories, so the
balance now ignores an income goal only when the budget is not
tracking, instead of on every income category. Tracking income pills
get their goal colour back and show the ring when underfunded. The
envelope income balance sheet no longer shows a goal status, and the
mobile income group menu no longer offers "Overwrite with templates"
in envelope budgets.

The isIncome props on the tracking budget table and balance menu are
removed, since those only ever render expense categories.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018MRjoaUi1WAUGsSNp3sb7p

* [AI] Keep goals from one budget type out of the other

Envelope and tracking budgets share spreadsheet cell names, so a goal
from one type could show up after switching to the other:

- Switching type (by sync, undo or redo) left the old type's cells in
  the saved spreadsheet cache, and goals came back from it on the next
  open. setType now clears the cache and waits for the budget values to
  reload.
- Changes to the inactive type's budget table were still applied to the
  sheet. Only the active table's rows are applied now.
- Applying templates to specific categories wrote amounts and goals for
  income categories in envelope budgets, and saving automations stored
  their goals. Envelope budgets now skip income categories in both.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018MRjoaUi1WAUGsSNp3sb7p

* [AI] Show income goals on the desktop tracking budget

Desktop tracking budgets have no balance column for income categories,
so their goals showed nowhere, while the mobile income pill already
showed them. An income category with a goal now shows the goal colour
on its received amount, with the ring while underfunded. Income
categories without a goal, and budgets with goal templates off, keep
the plain received amount.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018MRjoaUi1WAUGsSNp3sb7p

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: youngcw <calebyoung94@gmail.com>
2026-11-05 19:48:15 +00:00
..
2026-09-01 02:30:38 +00:00
2025-11-19 17:17:06 -07:00