Three-way merge for independently edited offline property inspection notes. No timestamps, last-writer-wins rule or automatic persistence are used.
One exact, case-sensitive field key and its unnormalized text value.
Fixed validation code and 1-based row number; 0 means a snapshot-level issue.
Validated immutable snapshot. Construct it with validate.
Validate at most 200 rows, 30 fields/row, 64-character keys and 2,000-character values. IDs are 1–64 ASCII letters/digits/dot/underscore/dash. Empty snapshots are valid. Duplicate record IDs or field keys are rejected before constructing dictionaries.
Opaque merge plan. Export is possible only through finalize.
A field conflict keeps absent values distinct from empty strings. A record conflict represents a delete/edit conflict or different concurrent additions.
Explicitly retain one of the three source values, including source deletion.
Compare base with two independently edited snapshots. Identical edits and changes made by only one side merge automatically. Different edits to one field, delete/edit pairs and different concurrent additions require choices.
Collision-free length-prefixed key for associating a choice with a conflict. Keys include record IDs/field names and may be private; do not use them as telemetry.
Resolve every conflict exactly once. Unknown, duplicate and missing keys fail the whole finalization. Source snapshots and the original plan remain immutable. No partial result is returned while any conflict remains unresolved.
A stable record ID with an explicitly authored list of fields.