Incremental vs. Full Refresh Runs in Bruin

Learn how Bruin's interval start/end variables drive incremental runs, how --full-refresh changes the picture, how each behaves across SQL, Python, and ingestr assets, and how to protect critical tables with refresh_restricted.

Run modes

Three different things in Bruin are called start_date - distinguish them before reading the table:

start_dateWhere it livesRole
Pipeline defaultstart_date in pipeline.ymlEarliest point full-refresh will rewind to
Schedule-derived runtimeComputed by Bruin per scheduled runStart of the previous schedule interval, set automatically
Manual runtime--start-date CLI flagAd-hoc override for backfills

These three sources map directly to the three ways a run can be triggered:

CommandRuntime start_dateRuntime end_dateWhen to use
bruin run --full-refreshpipeline default start_datenowFirst run, or full rebuild
bruin runschedule-derived (start of previous interval)schedule-derived (start of current interval)Regular scheduled runs
bruin run --start-date X --end-date Ymanual (X)manual (Y)Manual backfills of a specific window

These rules are schedule-agnostic - they apply identically to @hourly, @daily, @weekly, @monthly, or any cron expression. The window simply tracks the schedule cadence one-for-one (hourly schedule → one-hour window, weekly → one-week, and so on).

The classic "load history once, then incrementals" pattern falls straight out of this: trigger the first run with --full-refresh to absorb history from the pipeline default start_date, then let the schedule take over.

Interval modifiers

To catch late-arriving events or add a lookback/lookahead on top of the runtime interval, use interval modifiers - they shift start_date and end_date by a fixed offset. Set them on the asset (overrides) or the pipeline (default):

# Asset-level: shift this asset's window back 2 hours
interval_modifiers:
  start: -2h
  end: 0h
# Pipeline-level: applies to every asset that doesn't override it
default:
  interval_modifiers:
    start: -1d
    end: 0h

Modifiers only kick in when the run is invoked with --apply-interval-modifiers, so it's an opt-in per run.


Sign up to our newsletter

Practical updates on open-source data pipelines, AI analysts, governance, and what we are shipping at Bruin.