Lineage
Each materialization stores the ids of the upstream materializations it read, one id per upstream asset. That list is the lineage. It names a specific result, such as the demo/customers materialization this core/customer was built from, rather than the asset key alone.
Print the tree
Section titled “Print the tree”puppi lineage core/customerThe command starts at the asset’s latest materialization and prints the upstream tree: asset key, materialization id, row count, and time. --json prints the flat list of upstream ids from GET /api/v1/materializations/<id>/upstream.
If the asset has no materialization yet, the command says so and exits 0.
A model that calls ctx.input("demo/customers") records the materialization that call resolved to. Two successful runs of the same model can have different lineage when the upstream has moved. ctx.query() does not record a read. ctx.input() does.
There is no separate lineage table. puppi lineage walks the inputs stored on materializations.