budget_change
Compare NYC capital project budgets or spending for an agency or FMS line between two periods, returning signed per-line changes with role-aware scope.
Instructions
Δ budget/spend for an agency ('agency:DEP') or FMS line ('fms:ABC') between two periods.
For an agency target, agency_role ('auto'|'sponsor'|'managing') picks the lens; sponsor
scope uses the latest-period owner set (as-of caveat in the result label). An FMS id held
by several managing agencies is several distinct budget lines: the result then lists
per-line deltas (never a cross-agency sum); pass managing_agency to scope to one line.
Interpretation rules:
[grain] Schedule questions use PID; budget questions use the BUDGET LINE key (managing_agency, fms_id). The same FMS ID under different holders is distinct lines. Schedule history is PID x reporting_period; budget history is budget line x reporting_period; fiscal-year budgets also key on fiscal_year. The schedule source has no fms_id; budget sources have no pid. The combined source repeats rows across PID-budget links and location splits: deduplicate at the requested entity grain before counting or summing. Never compare budgets using fms_id alone.
[period_basis] Reporting-period basis: state the returned period for every count, total or ranking and both periods for comparisons. Period aggregates default to the latest complete snapshot, which may precede a partially published newer period. fms_location, fms_sponsor and lifetime_budget_variance are all-history dimensions without reporting_period: use them for enrichment or lifetime figures, never as a single period's inventory.
[agency_roles] Agency attribution is role-aware: an agency's projects mean its sponsor (owner) view, except DDC/DCAS/EDC default to managing (builder). State the returned agency_scope. managing_agency is the executor on schedules and the budget-holder on budgets; a budget-only holder is not a schedule executor. list_agencies exposes is_schedule_executor. For sponsor-scoped budget totals, use a semi-join to fms_sponsor; a value-bearing join can multiply lines. Co-owner totals can overlap and must not be added together.
[budget_baseline] budget_variance is change from the previous reporting period; cumulative_budget_change is latest minus original. State which basis is used. original_budget prefers the adopted first budget, with first_snapshot as fallback: disclose original_budget_source. Adoption months are calendar months from a separate first-budget system, not reporting snapshots.
[signed_values] Report neutral, SIGNED changes: "moved 45 days later" or "budget decreased $2M". Do not echo loaded terms in the answer. "slippage" means positive schedule change and "overrun" means positive budget growth; neither includes the decreasing side. Preserve the returned direction and metric basis.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| metric | No | total_budget | |
| target | Yes | ||
| to_period | Yes | ||
| agency_role | No | auto | |
| from_period | Yes | ||
| managing_agency | No |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| change | Yes | ||
| target | Yes | ||
| provenance | Yes | ||
| interpretation_rules | Yes |