Prune checkpoints for the given threads.
Custom implementations must be DeltaChannel-aware. DeltaChannel
stores only a sentinel in channel_values for non-snapshot steps;
reconstruction walks the parent chain via
get_delta_channel_history, accumulating rows from
checkpoint_writes until it reaches an ancestor whose
channel_values contains a _DeltaSnapshot blob (written every
snapshot_frequency updates).
A naive "keep_latest" that drops intermediate checkpoints and
their writes can sever that chain: the surviving "latest"
checkpoint is rarely a snapshot point itself, so its delta
channels would silently reconstruct as empty (no error raised —
get_delta_channel_history simply returns no seed). Safe
options when the graph uses DeltaChannel:
checkpoint_writes) up to the nearest one
whose channel_values already contains a _DeltaSnapshot for
every DeltaChannel-backed key.channel_values[k] = _DeltaSnapshot(value)
for each delta channel k (resolving value via the existing
ancestor walk first), then prune.DeltaChannel until one
of the above is implemented.The thread IDs to prune.
The pruning strategy. "keep_latest" retains only the most
recent checkpoint per namespace. "delete" removes all checkpoints.