# Historical comparison

`pipewhy.compare.ArtifactObservations` validates flat captured observation columns.
`ComparisonContext.from_metadata` restores snapshot policy/source information and
requires explicit discovery completeness. `compare(before, after)` compares dataset
summaries by stable ID; its `resolution` argument selects retained record/value detail.
Results include immutable status/reason/flag arrays, both snapshot contexts and
observation links/timestamps. Incomplete reads/discovery remain visible as uncertainty.

`drill_down(before, after, artifact_id, resolution="record")` selects retained
historical descendants. Missing retained detail returns `Availability.UNAVAILABLE`
with a reason; it never substitutes a current source read. An available comparison
may still be unknown or incompatible. Labels do not determine identity; changed
profiles, algorithms or schemas are checked before comparing content.

See [blueprint/COMPARISON_CONTRACT.txt](../development/architecture.rst) for exact input/result columns, stable codes,
coverage precedence and consumer rules. `tests/fixtures/comparison_v1.json` supplies
manually specified truth cases; separate integration tests verify fixture reads,
fingerprints and saved snapshots together. These are reference Python operations;
native CPU fingerprints also have separate parity checks. Further lineage analysis
and CLI comparison commands remain in development.
