Skip to content

Prompts API

Auto-generated API reference for MCP prompt functions. Prompts are organized into three modules: core prompts for everyday tasks, analysis prompts for data interpretation, and workflow guides for step-by-step processes.


Core Prompts

prompts

MCP Prompt templates for common YNAB workflows.

Provides guided workflow instructions that help LLMs perform multi-step YNAB tasks efficiently. Each prompt references the specific MCP resources to read and tools to call.

Templates are loaded from .md files in the templates/prompts/ subpackage via importlib.resources.

mcp module-attribute

mcp = FastMCP('YNAB', lifespan=lifespan)

_templates module-attribute

_templates = files('ynaa_mcp.templates.prompts')

REVIEW_SPENDING_TEMPLATE module-attribute

REVIEW_SPENDING_TEMPLATE = read_text(encoding='utf-8')

ENTER_TRANSACTIONS_TEMPLATE module-attribute

ENTER_TRANSACTIONS_TEMPLATE = read_text(encoding='utf-8')

BUDGET_HEALTH_TEMPLATE module-attribute

BUDGET_HEALTH_TEMPLATE = read_text(encoding='utf-8')

resolve_step

resolve_step() -> str

Return instruction to resolve budget via manage_budgets.

Returns:

  • str

    Step text instructing LLM to resolve the budget ID.

Source code in src/ynaa_mcp/prompts.py
def resolve_step() -> str:
    """Return instruction to resolve budget via manage_budgets.

    Returns:
        Step text instructing LLM to resolve the budget ID.
    """
    return '1. Use the `manage_budgets` tool with action="list" to find the budget ID.'

prepend_resolve_step

prepend_resolve_step(template: str) -> str

Prepend the budget resolution step and renumber existing steps.

When no budget_id is provided, the template needs a step 1 that instructs the LLM to resolve the budget ID first, with all existing steps renumbered starting from 2.

Parameters:

  • template (str) –

    The formatted template text (with {budget_id} still as a literal placeholder).

Returns:

  • str

    Template text with resolve step prepended and steps renumbered.

Source code in src/ynaa_mcp/prompts.py
def prepend_resolve_step(template: str) -> str:
    """Prepend the budget resolution step and renumber existing steps.

    When no budget_id is provided, the template needs a step 1 that
    instructs the LLM to resolve the budget ID first, with all
    existing steps renumbered starting from 2.

    Args:
        template: The formatted template text (with {budget_id} still
            as a literal placeholder).

    Returns:
        Template text with resolve step prepended and steps renumbered.
    """
    resolve = resolve_step()
    lines = template.split("\n")
    header = lines[0]
    steps: list[str] = []
    for line in lines[1:]:
        if line and line[0].isdigit():
            dot_idx = line.index(".")
            old_num = int(line[:dot_idx])
            steps.append(f"{old_num + 1}{line[dot_idx:]}")
        else:
            steps.append(line)
    return f"{header}\n\n{resolve}\n" + "\n".join(steps)

review_monthly_spending

review_monthly_spending(month: str, budget_id: str | None = None) -> str

Guide the LLM through reviewing a month's spending.

Produces a step-by-step workflow that reads budget context via MCP resources, then uses tools to analyze spending.

Parameters:

  • month (str) –

    The month to review (YYYY-MM format).

  • budget_id (str | None, default: None ) –

    Optional budget ID. If not provided, the LLM will be instructed to resolve it first.

Returns:

  • str

    Guided workflow text for monthly spending review.

Source code in src/ynaa_mcp/prompts.py
@mcp.prompt()
def review_monthly_spending(
    month: str,
    budget_id: str | None = None,
) -> str:
    """Guide the LLM through reviewing a month's spending.

    Produces a step-by-step workflow that reads budget context
    via MCP resources, then uses tools to analyze spending.

    Args:
        month: The month to review (YYYY-MM format).
        budget_id: Optional budget ID. If not provided, the LLM
            will be instructed to resolve it first.

    Returns:
        Guided workflow text for monthly spending review.
    """
    if budget_id:
        return REVIEW_SPENDING_TEMPLATE.format(budget_id=budget_id, month=month)
    return prepend_resolve_step(
        REVIEW_SPENDING_TEMPLATE.format(budget_id="{budget_id}", month=month),
    )

enter_transactions

enter_transactions(budget_id: str | None = None) -> str

Guide the LLM through entering transactions.

Produces a step-by-step workflow that reads account and category context, then walks through transaction entry.

Parameters:

  • budget_id (str | None, default: None ) –

    Optional budget ID. If not provided, the LLM will be instructed to resolve it first.

Returns:

  • str

    Guided workflow text for transaction entry.

Source code in src/ynaa_mcp/prompts.py
@mcp.prompt()
def enter_transactions(budget_id: str | None = None) -> str:
    """Guide the LLM through entering transactions.

    Produces a step-by-step workflow that reads account and category
    context, then walks through transaction entry.

    Args:
        budget_id: Optional budget ID. If not provided, the LLM
            will be instructed to resolve it first.

    Returns:
        Guided workflow text for transaction entry.
    """
    if budget_id:
        return ENTER_TRANSACTIONS_TEMPLATE.format(budget_id=budget_id)
    return prepend_resolve_step(
        ENTER_TRANSACTIONS_TEMPLATE.format(budget_id="{budget_id}"),
    )

budget_health_check

budget_health_check(budget_id: str | None = None) -> str

Guide the LLM through a budget health review.

Produces a step-by-step workflow that reads account and category data, then analyzes overall budget health.

Parameters:

  • budget_id (str | None, default: None ) –

    Optional budget ID. If not provided, the LLM will be instructed to resolve it first.

Returns:

  • str

    Guided workflow text for budget health review.

Source code in src/ynaa_mcp/prompts.py
@mcp.prompt()
def budget_health_check(budget_id: str | None = None) -> str:
    """Guide the LLM through a budget health review.

    Produces a step-by-step workflow that reads account and category
    data, then analyzes overall budget health.

    Args:
        budget_id: Optional budget ID. If not provided, the LLM
            will be instructed to resolve it first.

    Returns:
        Guided workflow text for budget health review.
    """
    if budget_id:
        return BUDGET_HEALTH_TEMPLATE.format(budget_id=budget_id)
    return prepend_resolve_step(
        BUDGET_HEALTH_TEMPLATE.format(budget_id="{budget_id}"),
    )

Analysis Prompts

analysis

MCP analysis prompt templates for YNAB budget analysis.

Provides 6 analysis prompts that guide LLMs through structured data interpretation workflows: budget health, spending trends, budget setup, debt payoff, savings goals, and income allocation.

Templates are loaded from .md files in the templates/analysis/ subpackage via importlib.resources.

mcp module-attribute

mcp = FastMCP('YNAB', lifespan=lifespan)

_templates module-attribute

_templates = files('ynaa_mcp.templates.analysis')

BUDGET_HEALTH_TEMPLATE module-attribute

BUDGET_HEALTH_TEMPLATE = read_text(encoding='utf-8')
SPENDING_TRENDS_TEMPLATE = read_text(encoding='utf-8')

BUDGET_SETUP_ADVISOR_TEMPLATE module-attribute

BUDGET_SETUP_ADVISOR_TEMPLATE = read_text(encoding='utf-8')

DEBT_PAYOFF_PLANNER_TEMPLATE module-attribute

DEBT_PAYOFF_PLANNER_TEMPLATE = read_text(encoding='utf-8')

SAVINGS_GOAL_TRACKER_TEMPLATE module-attribute

SAVINGS_GOAL_TRACKER_TEMPLATE = read_text(encoding='utf-8')

INCOME_ALLOCATION_TEMPLATE module-attribute

INCOME_ALLOCATION_TEMPLATE = read_text(encoding='utf-8')

prepend_resolve_step

prepend_resolve_step(template: str) -> str

Prepend the budget resolution step and renumber existing steps.

When no budget_id is provided, the template needs a step 1 that instructs the LLM to resolve the budget ID first, with all existing steps renumbered starting from 2.

Parameters:

  • template (str) –

    The formatted template text (with {budget_id} still as a literal placeholder).

Returns:

  • str

    Template text with resolve step prepended and steps renumbered.

Source code in src/ynaa_mcp/prompts.py
def prepend_resolve_step(template: str) -> str:
    """Prepend the budget resolution step and renumber existing steps.

    When no budget_id is provided, the template needs a step 1 that
    instructs the LLM to resolve the budget ID first, with all
    existing steps renumbered starting from 2.

    Args:
        template: The formatted template text (with {budget_id} still
            as a literal placeholder).

    Returns:
        Template text with resolve step prepended and steps renumbered.
    """
    resolve = resolve_step()
    lines = template.split("\n")
    header = lines[0]
    steps: list[str] = []
    for line in lines[1:]:
        if line and line[0].isdigit():
            dot_idx = line.index(".")
            old_num = int(line[:dot_idx])
            steps.append(f"{old_num + 1}{line[dot_idx:]}")
        else:
            steps.append(line)
    return f"{header}\n\n{resolve}\n" + "\n".join(steps)

budget_health_analysis

budget_health_analysis(budget_id: str | None = None) -> str

Comprehensive budget health assessment.

Guides the LLM through checking TBB state, identifying overspending (cash vs credit), reviewing underfunded goals, and producing actionable improvement recommendations.

Parameters:

  • budget_id (str | None, default: None ) –

    Optional budget ID. If not provided, the LLM will be instructed to resolve it first.

Returns:

  • str

    Guided workflow text for budget health analysis.

Source code in src/ynaa_mcp/analysis.py
@mcp.prompt()
def budget_health_analysis(budget_id: str | None = None) -> str:
    """Comprehensive budget health assessment.

    Guides the LLM through checking TBB state, identifying
    overspending (cash vs credit), reviewing underfunded goals,
    and producing actionable improvement recommendations.

    Args:
        budget_id: Optional budget ID. If not provided, the LLM
            will be instructed to resolve it first.

    Returns:
        Guided workflow text for budget health analysis.
    """
    if budget_id:
        return BUDGET_HEALTH_TEMPLATE.format(budget_id=budget_id)
    return prepend_resolve_step(
        BUDGET_HEALTH_TEMPLATE.format(budget_id="{budget_id}"),
    )
spending_trends(budget_id: str | None = None) -> str

Multi-month spending comparison and trend analysis.

Guides the LLM through fetching 3 months of transaction and category data, calculating month-over-month changes, and identifying categories with increasing or problematic trends.

Parameters:

  • budget_id (str | None, default: None ) –

    Optional budget ID. If not provided, the LLM will be instructed to resolve it first.

Returns:

  • str

    Guided workflow text for spending trend analysis.

Source code in src/ynaa_mcp/analysis.py
@mcp.prompt()
def spending_trends(budget_id: str | None = None) -> str:
    """Multi-month spending comparison and trend analysis.

    Guides the LLM through fetching 3 months of transaction and
    category data, calculating month-over-month changes, and
    identifying categories with increasing or problematic trends.

    Args:
        budget_id: Optional budget ID. If not provided, the LLM
            will be instructed to resolve it first.

    Returns:
        Guided workflow text for spending trend analysis.
    """
    if budget_id:
        return SPENDING_TRENDS_TEMPLATE.format(budget_id=budget_id)
    return prepend_resolve_step(
        SPENDING_TRENDS_TEMPLATE.format(budget_id="{budget_id}"),
    )

budget_setup_advisor

budget_setup_advisor(budget_id: str | None = None) -> str

First-time YNAB budget setup guidance.

Guides the LLM through creating accounts, organizing categories, performing initial budget allocation, and explaining the Four Rules in practical terms. Uses a supportive coaching tone.

Parameters:

  • budget_id (str | None, default: None ) –

    Optional budget ID. If not provided, the LLM will be instructed to resolve it first.

Returns:

  • str

    Guided workflow text for budget setup.

Source code in src/ynaa_mcp/analysis.py
@mcp.prompt()
def budget_setup_advisor(budget_id: str | None = None) -> str:
    """First-time YNAB budget setup guidance.

    Guides the LLM through creating accounts, organizing categories,
    performing initial budget allocation, and explaining the Four
    Rules in practical terms. Uses a supportive coaching tone.

    Args:
        budget_id: Optional budget ID. If not provided, the LLM
            will be instructed to resolve it first.

    Returns:
        Guided workflow text for budget setup.
    """
    if budget_id:
        return BUDGET_SETUP_ADVISOR_TEMPLATE.format(budget_id=budget_id)
    return prepend_resolve_step(
        BUDGET_SETUP_ADVISOR_TEMPLATE.format(budget_id="{budget_id}"),
    )

debt_payoff_planner

debt_payoff_planner(budget_id: str | None = None) -> str

Debt elimination strategy planner.

Guides the LLM through identifying all debt accounts, presenting avalanche and snowball payoff strategies with trade-offs, and helping the user choose and implement a plan.

Parameters:

  • budget_id (str | None, default: None ) –

    Optional budget ID. If not provided, the LLM will be instructed to resolve it first.

Returns:

  • str

    Guided workflow text for debt payoff planning.

Source code in src/ynaa_mcp/analysis.py
@mcp.prompt()
def debt_payoff_planner(budget_id: str | None = None) -> str:
    """Debt elimination strategy planner.

    Guides the LLM through identifying all debt accounts,
    presenting avalanche and snowball payoff strategies with
    trade-offs, and helping the user choose and implement a plan.

    Args:
        budget_id: Optional budget ID. If not provided, the LLM
            will be instructed to resolve it first.

    Returns:
        Guided workflow text for debt payoff planning.
    """
    if budget_id:
        return DEBT_PAYOFF_PLANNER_TEMPLATE.format(budget_id=budget_id)
    return prepend_resolve_step(
        DEBT_PAYOFF_PLANNER_TEMPLATE.format(budget_id="{budget_id}"),
    )

savings_goal_tracker

savings_goal_tracker(budget_id: str | None = None) -> str

Savings goal progress monitoring.

Guides the LLM through listing all goals, calculating progress percentages, identifying underfunded goals, and creating prioritized funding recommendations.

Parameters:

  • budget_id (str | None, default: None ) –

    Optional budget ID. If not provided, the LLM will be instructed to resolve it first.

Returns:

  • str

    Guided workflow text for savings goal tracking.

Source code in src/ynaa_mcp/analysis.py
@mcp.prompt()
def savings_goal_tracker(budget_id: str | None = None) -> str:
    """Savings goal progress monitoring.

    Guides the LLM through listing all goals, calculating progress
    percentages, identifying underfunded goals, and creating
    prioritized funding recommendations.

    Args:
        budget_id: Optional budget ID. If not provided, the LLM
            will be instructed to resolve it first.

    Returns:
        Guided workflow text for savings goal tracking.
    """
    if budget_id:
        return SAVINGS_GOAL_TRACKER_TEMPLATE.format(budget_id=budget_id)
    return prepend_resolve_step(
        SAVINGS_GOAL_TRACKER_TEMPLATE.format(budget_id="{budget_id}"),
    )

income_allocation

income_allocation(budget_id: str | None = None) -> str

YNAB priority-ordered income allocation guidance.

Guides the LLM through allocating new income following YNAB's recommended priority order: immediate obligations, true expenses, quality of life, and savings goals.

Parameters:

  • budget_id (str | None, default: None ) –

    Optional budget ID. If not provided, the LLM will be instructed to resolve it first.

Returns:

  • str

    Guided workflow text for income allocation.

Source code in src/ynaa_mcp/analysis.py
@mcp.prompt()
def income_allocation(budget_id: str | None = None) -> str:
    """YNAB priority-ordered income allocation guidance.

    Guides the LLM through allocating new income following YNAB's
    recommended priority order: immediate obligations, true expenses,
    quality of life, and savings goals.

    Args:
        budget_id: Optional budget ID. If not provided, the LLM
            will be instructed to resolve it first.

    Returns:
        Guided workflow text for income allocation.
    """
    if budget_id:
        return INCOME_ALLOCATION_TEMPLATE.format(budget_id=budget_id)
    return prepend_resolve_step(
        INCOME_ALLOCATION_TEMPLATE.format(budget_id="{budget_id}"),
    )

Workflow Guides

workflows

MCP Prompt templates for YNAB workflow guides.

Provides step-by-step workflow guides that help LLMs coach users through common YNAB scenarios. Each prompt references specific MCP resources to read and tools to call, with a supportive coaching tone.

Templates are loaded from .md files in the templates/workflows/ subpackage via importlib.resources.

mcp module-attribute

mcp = FastMCP('YNAB', lifespan=lifespan)

_templates module-attribute

_templates = files('ynaa_mcp.templates.workflows')

GETTING_STARTED_TEMPLATE module-attribute

GETTING_STARTED_TEMPLATE = read_text(encoding='utf-8')

GETTING_OUT_OF_DEBT_TEMPLATE module-attribute

GETTING_OUT_OF_DEBT_TEMPLATE = read_text(encoding='utf-8')

IRREGULAR_INCOME_TEMPLATE module-attribute

IRREGULAR_INCOME_TEMPLATE = read_text(encoding='utf-8')

COUPLES_BUDGETING_TEMPLATE module-attribute

COUPLES_BUDGETING_TEMPLATE = read_text(encoding='utf-8')

EMERGENCY_FUND_TEMPLATE module-attribute

EMERGENCY_FUND_TEMPLATE = read_text(encoding='utf-8')

BREAKING_PAYCHECK_TO_PAYCHECK_TEMPLATE module-attribute

BREAKING_PAYCHECK_TO_PAYCHECK_TEMPLATE = read_text(encoding='utf-8')

prepend_resolve_step

prepend_resolve_step(template: str) -> str

Prepend the budget resolution step and renumber existing steps.

When no budget_id is provided, the template needs a step 1 that instructs the LLM to resolve the budget ID first, with all existing steps renumbered starting from 2.

Parameters:

  • template (str) –

    The formatted template text (with {budget_id} still as a literal placeholder).

Returns:

  • str

    Template text with resolve step prepended and steps renumbered.

Source code in src/ynaa_mcp/prompts.py
def prepend_resolve_step(template: str) -> str:
    """Prepend the budget resolution step and renumber existing steps.

    When no budget_id is provided, the template needs a step 1 that
    instructs the LLM to resolve the budget ID first, with all
    existing steps renumbered starting from 2.

    Args:
        template: The formatted template text (with {budget_id} still
            as a literal placeholder).

    Returns:
        Template text with resolve step prepended and steps renumbered.
    """
    resolve = resolve_step()
    lines = template.split("\n")
    header = lines[0]
    steps: list[str] = []
    for line in lines[1:]:
        if line and line[0].isdigit():
            dot_idx = line.index(".")
            old_num = int(line[:dot_idx])
            steps.append(f"{old_num + 1}{line[dot_idx:]}")
        else:
            steps.append(line)
    return f"{header}\n\n{resolve}\n" + "\n".join(steps)

_format_with_resolve

_format_with_resolve(template: str, budget_id: str | None) -> str

Format a workflow template, inserting resolve step if needed.

Parameters:

  • template (str) –

    The template string with {budget_id} placeholders.

  • budget_id (str | None) –

    Optional budget ID. If None, a resolve step is prepended.

Returns:

  • str

    The formatted workflow guide text.

Source code in src/ynaa_mcp/workflows.py
def _format_with_resolve(template: str, budget_id: str | None) -> str:
    """Format a workflow template, inserting resolve step if needed.

    Args:
        template: The template string with {budget_id} placeholders.
        budget_id: Optional budget ID. If None, a resolve step is prepended.

    Returns:
        The formatted workflow guide text.
    """
    if budget_id:
        return template.format(budget_id=budget_id)
    return prepend_resolve_step(template.format(budget_id="{budget_id}"))

getting_started

getting_started(budget_id: str | None = None) -> str

Walk a new user through creating their first YNAB budget.

Guides through account setup, category creation, and initial budget allocation with a supportive coaching tone.

Parameters:

  • budget_id (str | None, default: None ) –

    Optional budget ID. If not provided, the LLM will be instructed to resolve it first.

Returns:

  • str

    Step-by-step first budget creation guide.

Source code in src/ynaa_mcp/workflows.py
@mcp.prompt()
def getting_started(budget_id: str | None = None) -> str:
    """Walk a new user through creating their first YNAB budget.

    Guides through account setup, category creation, and initial
    budget allocation with a supportive coaching tone.

    Args:
        budget_id: Optional budget ID. If not provided, the LLM
            will be instructed to resolve it first.

    Returns:
        Step-by-step first budget creation guide.
    """
    return _format_with_resolve(GETTING_STARTED_TEMPLATE, budget_id)

getting_out_of_debt

getting_out_of_debt(budget_id: str | None = None) -> str

Guide a user through building a debt payoff plan.

Covers debt inventory, avalanche vs snowball strategies, and setting up systematic payment workflows.

Parameters:

  • budget_id (str | None, default: None ) –

    Optional budget ID. If not provided, the LLM will be instructed to resolve it first.

Returns:

  • str

    Step-by-step debt payoff workflow guide.

Source code in src/ynaa_mcp/workflows.py
@mcp.prompt()
def getting_out_of_debt(budget_id: str | None = None) -> str:
    """Guide a user through building a debt payoff plan.

    Covers debt inventory, avalanche vs snowball strategies,
    and setting up systematic payment workflows.

    Args:
        budget_id: Optional budget ID. If not provided, the LLM
            will be instructed to resolve it first.

    Returns:
        Step-by-step debt payoff workflow guide.
    """
    return _format_with_resolve(GETTING_OUT_OF_DEBT_TEMPLATE, budget_id)

irregular_income

irregular_income(budget_id: str | None = None) -> str

Guide a freelancer or commission earner through income smoothing.

Covers the income buffer concept, monthly workflow for variable income, and handling feast/famine cycles.

Parameters:

  • budget_id (str | None, default: None ) –

    Optional budget ID. If not provided, the LLM will be instructed to resolve it first.

Returns:

  • str

    Step-by-step irregular income budgeting guide.

Source code in src/ynaa_mcp/workflows.py
@mcp.prompt()
def irregular_income(budget_id: str | None = None) -> str:
    """Guide a freelancer or commission earner through income smoothing.

    Covers the income buffer concept, monthly workflow for variable
    income, and handling feast/famine cycles.

    Args:
        budget_id: Optional budget ID. If not provided, the LLM
            will be instructed to resolve it first.

    Returns:
        Step-by-step irregular income budgeting guide.
    """
    return _format_with_resolve(IRREGULAR_INCOME_TEMPLATE, budget_id)

couples_budgeting

couples_budgeting(budget_id: str | None = None) -> str

Guide a couple through setting up shared finances in YNAB.

Covers budget structure options, account setup for partners, fun money categories, and the budget meeting workflow.

Parameters:

  • budget_id (str | None, default: None ) –

    Optional budget ID. If not provided, the LLM will be instructed to resolve it first.

Returns:

  • str

    Step-by-step couples budgeting guide.

Source code in src/ynaa_mcp/workflows.py
@mcp.prompt()
def couples_budgeting(budget_id: str | None = None) -> str:
    """Guide a couple through setting up shared finances in YNAB.

    Covers budget structure options, account setup for partners,
    fun money categories, and the budget meeting workflow.

    Args:
        budget_id: Optional budget ID. If not provided, the LLM
            will be instructed to resolve it first.

    Returns:
        Step-by-step couples budgeting guide.
    """
    return _format_with_resolve(COUPLES_BUDGETING_TEMPLATE, budget_id)

emergency_fund

emergency_fund(budget_id: str | None = None) -> str

Guide a user through building an emergency fund.

Covers target calculation, category and goal setup, funding strategy, and when to use vs replenish.

Parameters:

  • budget_id (str | None, default: None ) –

    Optional budget ID. If not provided, the LLM will be instructed to resolve it first.

Returns:

  • str

    Step-by-step emergency fund building guide.

Source code in src/ynaa_mcp/workflows.py
@mcp.prompt()
def emergency_fund(budget_id: str | None = None) -> str:
    """Guide a user through building an emergency fund.

    Covers target calculation, category and goal setup,
    funding strategy, and when to use vs replenish.

    Args:
        budget_id: Optional budget ID. If not provided, the LLM
            will be instructed to resolve it first.

    Returns:
        Step-by-step emergency fund building guide.
    """
    return _format_with_resolve(EMERGENCY_FUND_TEMPLATE, budget_id)

breaking_paycheck_to_paycheck

breaking_paycheck_to_paycheck(budget_id: str | None = None) -> str

Guide a user through aging their money past 30 days.

Covers the Age of Money concept, buffer building strategy, milestone tracking, and long-term maintenance.

Parameters:

  • budget_id (str | None, default: None ) –

    Optional budget ID. If not provided, the LLM will be instructed to resolve it first.

Returns:

  • str

    Step-by-step guide to breaking the paycheck-to-paycheck cycle.

Source code in src/ynaa_mcp/workflows.py
@mcp.prompt()
def breaking_paycheck_to_paycheck(budget_id: str | None = None) -> str:
    """Guide a user through aging their money past 30 days.

    Covers the Age of Money concept, buffer building strategy,
    milestone tracking, and long-term maintenance.

    Args:
        budget_id: Optional budget ID. If not provided, the LLM
            will be instructed to resolve it first.

    Returns:
        Step-by-step guide to breaking the paycheck-to-paycheck cycle.
    """
    return _format_with_resolve(BREAKING_PAYCHECK_TO_PAYCHECK_TEMPLATE, budget_id)