You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Status 2026-08-24 — superseded by ADR-010, kept as the vision record
This issue's Phase 1–3 checklist has been overtaken by events. The consolidation
happened, but through ADR-008 → ADR-010 rather than these PR steps. Read .ai/adr-010-everything-in-2.0.md first; this issue is now the historical
record of where the idea started.
What actually shipped
The SnapDiff namespace exists, the config surface was inverted to a single
object, the test suite was split so rake test:canonical proves the
post-deletion state, and the comparison pipeline lost its driver indirection on
the 2.1 branch. The measured spike (.ai/endstate-spike-rewrite.md) found a
from-scratch rewrite only 23% smaller with 70% file reuse — "a rewrite that keeps
70% is consolidation wearing a rewrite costume" — so the vision was delivered by
consolidation, not by the rewrite this issue implies.
2.1 — every deletion: legacy namespaces, the 27 v1 config accessors,
chunky_png, the driver abstraction, shift_distance_limit. ruby-vips
becomes a hard runtime dependency.
What the original adopter question here was gating
This issue was the adopter-feedback gate on shipping 2.0. That feedback now
exists and was decisive — two customer personas ran the real product and both
got a green bar on a page they had deliberately broken, inside ten minutes.
See .ai/experience-map.md for both journeys and .ai/adr-009-* for the full
research record.
Remaining, live
Ship 2.0.0 final — also the fix for gem "snap_diff-capybara" resolving to
the empty 0.0.1 name reservation
HUMAN: branch/tag protection (the 2.1 PR changes CI check names, 2
dimensions → 1)
Status 2026-08-24 — superseded by ADR-010, kept as the vision record
This issue's Phase 1–3 checklist has been overtaken by events. The consolidation
happened, but through ADR-008 → ADR-010 rather than these PR steps. Read
.ai/adr-010-everything-in-2.0.mdfirst; this issue is now the historicalrecord of where the idea started.
What actually shipped
The
SnapDiffnamespace exists, the config surface was inverted to a singleobject, the test suite was split so
rake test:canonicalproves thepost-deletion state, and the comparison pipeline lost its driver indirection on
the 2.1 branch. The measured spike (
.ai/endstate-spike-rewrite.md) found afrom-scratch rewrite only 23% smaller with 70% file reuse — "a rewrite that keeps
70% is consolidation wearing a rewrite costume" — so the vision was delivered by
consolidation, not by the rewrite this issue implies.
The release plan that replaced it
workflow, capture-before-raise (The new-screenshot error prints a path that will never exist in CI #260), explicit-config-over-env,
zero-setup fork-parallel reports (Fork-parallel reports should need zero developer setup #258). Everything destined for removal
warns, naming 2.1. 2.0 deletes nothing.
chunky_png, the driver abstraction,
shift_distance_limit.ruby-vipsbecomes a hard runtime dependency.
What the original adopter question here was gating
This issue was the adopter-feedback gate on shipping 2.0. That feedback now
exists and was decisive — two customer personas ran the real product and both
got a green bar on a page they had deliberately broken, inside ten minutes.
See
.ai/experience-map.mdfor both journeys and.ai/adr-009-*for the fullresearch record.
Remaining, live
gem "snap_diff-capybara"resolving tothe empty
0.0.1name reservationdimensions → 1)
Original vision and phased plan (2026, superseded)
Vision
Consolidate the comparison pipeline from 25+ files / ~2,000 lines to 16 files / ~1,400 lines with 3 core objects:
Comparison,Driver,Reporter.Full ADR:
.ai/adr-004-snap-diff-v2-vision.mdMigration plan:
.ai/adr-004-migration-plan.mdPhase 1: Make Things More Alike (internal, no API changes)
baseline_path,current_path,Driver#load,Driver#mask)DifferenceFinderintoImageCompare(delete 1 file)quick_equal?anddifferent?into lazy evaluationStableScreenshoterintoScreenshoter(delete 1 file)skip_areamasking from comparison-time to capture-timemattr_accessorintoConfigobject (keep old API as delegates)Phase 2: Separate Annotation from Reporting
AnnotationServiceReporters::Defaulttherecord/finalizeinterfacePhase 3: Namespace Migration (needs major version)
SnapDiffnamespace aliases (additive, non-breaking)SnapDiffcanonical, old namespace becomes shimsConstraints
Reporters::Default— it generates annotation images the HTML reporter needsscreenshot_section/group,median_filter,shift_distance_limit, LFS, delayed validationExpected Outcome
SnapDiff)mattr_accessorReferences
.ai/adr-004-snap-diff-v2-vision.md.ai/adr-004-migration-plan.md