#377

feat: implement graph diff, 3-way merge, and auto-merge (#348-PR2-8)

OpenTumCucTomwants to merge intofrom

Summary

Implement the complete #348 roadmap for node-level graph merging:

  • PR2: Node-level "what changed" diff

    • zero graph diff --base <a> <b> --json
    • Returns changeset with added/removed/modified entries
  • PR3: 3-way collision detection

    • zero graph merge --base <base> <ours> <theirs> --json
    • Reports conflicts with GMG### codes
  • PR4: Auto-combine non-overlapping edits

    • Same command with --out <file> to write merged result
    • Re-validates merged graph
  • PR5: Trivial convergences

    • Auto-resolve identical edits, delete/delete, add/add
    • Order-insensitive list handling
  • PR6: Field-level disjointness

    • Same node, different fields = no conflict
    • Only same field = GMG001 conflict
  • PR7: Move-aware resolution

    • Track node moves via symbol_id changes
    • Handle parent-moved/child-edited cases
    • Detect move/move cycles (GMG005, GMG006)
  • PR8: Semantic post-merge checks

    • Run validation and type-checking on merged graph
    • Report issues without auto-fixing

Acceptance Criteria

  • Diff: value edit shows as single modified entry
  • Merge: disjoint edits → successful merge
  • Merge: conflicts → reported with GMG codes
  • Auto-resolve trivial convergences
  • Field-level disjointness handled
  • Move-aware resolution implemented
  • Semantic validation on merged result