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.md
Migration plan: .ai/adr-004-migration-plan.md
Phase 1: Make Things More Alike (internal, no API changes)
Phase 2: Separate Annotation from Reporting
Phase 3: Namespace Migration (needs major version)
Constraints
Each PR keeps tests green and public API unchanged (until Phase 3)
No big-bang rewrite — Flocking Rules: make things more alike, then unify
Do NOT delete Reporters::Default — it generates annotation images the HTML reporter needs
Do NOT drop features: screenshot_section/group, median_filter, shift_distance_limit, LFS, delayed validation
Expected Outcome
Metric
Current
After Phase 1-2
After Phase 3
Files
25+
~18
~16
Lines
~2,000
~1,600
~1,400
Namespaces
2
2 (with aliases)
1 (SnapDiff)
Classes to understand pipeline
7
4
3
Config points
24 mattr_accessor
8 in Config + delegates
8 in Config
References
ADR-004 vision: .ai/adr-004-snap-diff-v2-vision.md
ADR-004 migration plan: .ai/adr-004-migration-plan.md
ADR-001 (driver protocol): resolved — BaseDriver sufficient
ADR-002 (HTML reporter): implemented in PR feat: add HTML reporter for visual diff dashboard #164
ADR-003 (ComparisonResult): superseded by this issue
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