Skip to content

Staleness

Staleness decides whether a model or a destination has work to do. It is computed when an attempt is about to run. Nothing stores a stale flag. A source is not gated this way: it runs whenever the run or its schedule reaches it, and the engine decides afterwards whether the result is new.

Terminal window
puppi assets
Reason Meaning
never_materialized The asset has no latest materialization.
input_newer An upstream latest is newer than the one this asset consumed.
input_unconsumed An upstream has a latest, and this asset consumed none of it.
definition_changed The asset’s code_version on the latest materialization differs from the active deployment.

A model or a destination whose verdict is current is skipped. The attempt stamps verified_at on the current latest and writes no new materialization. puppi run --force runs every planned asset anyway.

See Materializations for how a source decides that nothing new arrived.

Deploying new code writes no materialization by itself. The asset becomes stale because its code_version changed, and the next run rebuilds it. A one-line change in one asset’s run changes that asset’s version. Assets whose source did not change stay current.

A rollback moves latest to an older materialization. That older row is not newer, so staleness does not carry the rollback downstream. Rollback walks those assets and repoints or rebuilds them.

schedule: { every: "15m" }
schedule: { cron: "0 * * * *", timezone: "UTC" }

every is a clock-aligned cadence: 15m, 2h, or 1d. cron is five fields: minute, hour, day of month, month, day of week. A bad expression fails at puppi build. The engine checks timezone when it accepts the deployment.

The engine fires a due asset once a minute. A scheduler that was down fires once when it returns. It does not replay the missed window.

Terminal window
puppi env pause
puppi env resume

Pause stops schedules in that environment. puppi run still starts a manual run.