changedInput schema / properties / annual_income_increase / default
Previous value: -0New value: +2
changedInput schema / properties / annual_income_increase / description
Previous value: -"Annual contribution % increase"New value: +"Annual contribution % increase (default 2)"
addedInput schema / properties / current_age / default
Added value: +40
changedInput schema / properties / current_age / description
Previous value: -"Current age"New value: +"Current age (default 40)"
addedInput schema / properties / current_retirement_savings / default
Added value: +60000
changedInput schema / properties / current_retirement_savings / description
Previous value: -"Current total retirement savings in USD"New value: +"Current total retirement savings in USD (default 60000)"
changedInput schema / properties / inflation_rate / description
Previous value: -"Expected annual inflation rate %"New value: +"Expected annual inflation rate % (default 3)"
addedInput schema / properties / monthly_contribution / default
Added value: +1000
changedInput schema / properties / monthly_contribution / description
Previous value: -"Monthly retirement contribution in USD"New value: +"Monthly retirement contribution in USD (default 1000)"
changedInput schema / properties / monthly_paycheck / default
Previous value: -0New value: +4500
changedInput schema / properties / monthly_paycheck / description
Previous value: -"Desired monthly retirement paycheck (USD)"New value: +"Desired monthly retirement paycheck in USD (default 4500)"
changedInput schema / properties / other_retirement_income / default
Previous value: -0New value: +1600
changedInput schema / properties / other_retirement_income / description
Previous value: -"Other monthly retirement income (USD)"New value: +"Other monthly retirement income in USD (default 1600)"
changedInput schema / properties / percentage_in_savvly / description
Previous value: -"Percentage of retirement savings allocated to Savvly"New value: +"Percentage of the retirement portfolio allocated to Savvly (default 5)"
changedInput schema / properties / post_retirement_return / description
Previous value: -"Expected post-retirement annual return %"New value: +"Expected post-retirement annual return % (default 5)"
changedInput schema / properties / pre_retirement_return / description
Previous value: -"Expected pre-retirement annual return %"New value: +"Expected pre-retirement annual return % (default 6)"
addedInput schema / properties / retirement_age / default
Added value: +68
changedInput schema / properties / retirement_age / description
Previous value: -"Planned retirement age"New value: +"Planned retirement age (default 68)"
removedInput schema / required
Removed value: -[
- "current_age",
- "retirement_age",
- "monthly_contribution",
- "current_retirement_savings"
-]
changedOutput schema / properties / metadata / properties / display_hints / description
Previous value: -"Rendering guidance for the retirement projection chart. Tells AI clients to render `age_dependent_values` as a stacked area chart matching estimator.savvly.com — linear interpolation (no spline), no markers, so Savvly milestone payouts at ages 80/85/90/95 appear as sharp spikes with visible year-by-year depletion between them. KPI cards above and a narrative paragraph below the chart are encouraged."New value: +"Rendering guidance for the retirement projection chart. Tells AI clients to render `age_dependent_values` as a stacked area chart matching estimator.savvly.com — MILD smoothing (Chart.js tension 0.4), no markers, so Savvly milestone payouts at ages 80/85/90/95 still read as distinct spikes with visible year-by-year depletion between them. KPI cards above and a narrative paragraph below the chart are encouraged."
changedOutput schema / properties / metadata / properties / display_hints / properties / chart / additionalProperties
Previous value: -falseNew value: +true
removedOutput schema / properties / metadata / properties / display_hints / properties / chart / properties / interpolation / const
Removed value: -"linear"
addedOutput schema / properties / metadata / properties / display_hints / properties / chart / properties / tension
Added value: +{
+ "type": "number"
+}
changedOutput schema / properties / metadata / required
Previous value: -[
- "disclaimer",
- "field_descriptions",
- "display_hints"
-]New value: +[
+ "disclaimer",
+ "field_descriptions"
+]
addedOutput schema / properties / visualization
Added value: +{
+ "additionalProperties": true,
+ "description": "Recommended chart for this projection — a year-by-year area chart of `result.age_dependent_values` (savings with vs. without Savvly). Render it when the surface can display a graph. The richer `metadata.display_hints` block carries the same chart plus layout/tooltip detail.",
+ "properties": {
+ "chart": {
+ "additionalProperties": true,
+ "description": "Machine-readable chart spec: type, axes, series (with brand colors), and rendering notes.",
+ "properties": {
+ "reference": {
+ "description": "Canonical Savvly visualization this chart mirrors.",
+ "type": "string"
+ },
+ "rendering_notes": {
+ "description": "Plain-English rendering guidance for the client.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "series": {
+ "description": "One entry per plotted series — typically Savvly vs. the baseline / market-alone counterfactual.",
+ "items": {
+ "additionalProperties": true,
+ "properties": {
+ "color": {
+ "description": "Hex color for this series. The series representing Savvly is always #3478eb (the Savvly brand blue).",
+ "type": "string"
+ },
+ "field": {
+ "description": "Per-row field plotted by this series.",
+ "type": "string"
+ },
+ "label": {
+ "description": "Legend label for this series.",
+ "type": "string"
+ }
+ },
+ "required": [
+ "field",
+ "label",
+ "color"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "tooltip": {
+ "additionalProperties": {
+ "type": "string"
+ },
+ "description": "Optional `field -> human label` map for chart tooltips.",
+ "type": "object"
+ },
+ "type": {
+ "description": "Chart type the client should render.",
+ "enum": [
+ "area",
+ "line",
+ "bar"
+ ],
+ "type": "string"
+ },
+ "x_axis": {
+ "additionalProperties": true,
+ "description": "Per-row field mapped to the x-axis, plus its display label.",
+ "properties": {
+ "field": {
+ "type": "string"
+ },
+ "label": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "field",
+ "label"
+ ],
+ "type": "object"
+ },
+ "y_axis": {
+ "additionalProperties": true,
+ "description": "Y-axis label and value format (e.g. 'currency_usd').",
+ "properties": {
+ "format": {
+ "type": "string"
+ },
+ "label": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "label",
+ "format"
+ ],
+ "type": "object"
+ }
+ },
+ "required": [
+ "type",
+ "x_axis",
+ "y_axis",
+ "series",
+ "rendering_notes"
+ ],
+ "type": "object"
+ },
+ "instruction": {
+ "description": "Plain-English instruction telling the client to render `chart` from the per-row data in `result`, color the Savvly series #3478eb, and show the `disclosure` alongside the chart.",
+ "type": "string"
+ },
+ "recommended": {
+ "const": true,
+ "description": "Always true. Signals to the calling AI client that it SHOULD render `chart` whenever it can display a graph.",
+ "type": "boolean"
+ }
+ },
+ "required": [
+ "recommended",
+ "instruction",
+ "chart"
+ ],
+ "type": "object"
+}