Detects edits between a base tree and one modified version, by combining TreeMatcher's matching with a per-node attribute diff. Structural changes (insertions/deletions, at whatever depth they occur) fall out of TreeMatcher's own whole-tree walk for free; this only adds content-level change detection for the nodes that do still correspond.
Deliberately narrow: only a matched node's own attributes are compared, not its children's order (a "move" among already-matched siblings, or a reparenting) - PcsEditDetector/PcsMerger handle that instead; ThreeWayMerger combines the two.
attribute names to leave out of the per-node diff entirely - see defaultIgnoredAttributes. A node whose only difference is one of these is reported as unchanged, not as an Updated edit - the attribute's own (unchanged) value is still there either way, since an unchanged node just keeps whatever base already had.
modified
one modified version of it.
Attributes
Returns
every insertion, deletion, and content update found - omitting anything unchanged.
Attribute names known to change on every export regardless of any real edit - InDesign re-stamps a Link's LinkImportTime unconditionally, so two independently re-exported copies with no real editorial overlap at all can otherwise still come back with a false conflict on it (found 2026-09-20, wiring ThreeWayMerger up against the real HelloWorld2A/B/C trio - see MERGE.md). StyleUniqueId (on built-in styles like CharacterStyle/$ID/[No character style]) is the same phenomenon - a UUID InDesign regenerates on every export, confirmed to differ across base/HelloWorld2A/HelloWorld2B simultaneously (found 2026-09-20, testing IdmlMergeDriver against a real whole package for the first time, not just one Spread). detectEdits's default; pass Set.empty (or your own set) to opt out.
Attribute names known to change on every export regardless of any real edit - InDesign re-stamps a Link's LinkImportTime unconditionally, so two independently re-exported copies with no real editorial overlap at all can otherwise still come back with a false conflict on it (found 2026-09-20, wiring ThreeWayMerger up against the real HelloWorld2A/B/C trio - see MERGE.md). StyleUniqueId (on built-in styles like CharacterStyle/$ID/[No character style]) is the same phenomenon - a UUID InDesign regenerates on every export, confirmed to differ across base/HelloWorld2A/HelloWorld2B simultaneously (found 2026-09-20, testing IdmlMergeDriver against a real whole package for the first time, not just one Spread). detectEdits's default; pass Set.empty (or your own set) to opt out.