[{"name":"Property.ReviewMerge","comment":" Three-way merge for independently edited offline property inspection notes.\nNo timestamps, last-writer-wins rule or automatic persistence are used.\n\n# Input\n@docs Row, Field, Issue, Snapshot, validate, toRows\n\n# Merge and deliberate resolution\n@docs Plan, Conflict, Choice, merge, conflicts, conflictKey, finalize\n","unions":[{"name":"Choice","comment":" Explicitly retain one of the three source values, including source deletion. ","args":[],"cases":[["KeepBase",[]],["KeepLeft",[]],["KeepRight",[]]]},{"name":"Conflict","comment":" A field conflict keeps absent values distinct from empty strings.\nA record conflict represents a delete/edit conflict or different concurrent additions.\n","args":[],"cases":[["FieldConflict",["{ recordId : String.String, field : String.String, base : Maybe.Maybe String.String, left : Maybe.Maybe String.String, right : Maybe.Maybe String.String }"]],["RecordConflict",["{ recordId : String.String, base : Maybe.Maybe Property.ReviewMerge.Row, left : Maybe.Maybe Property.ReviewMerge.Row, right : Maybe.Maybe Property.ReviewMerge.Row }"]]]},{"name":"Plan","comment":" Opaque merge plan. Export is possible only through `finalize`. ","args":[],"cases":[]},{"name":"Snapshot","comment":" Validated immutable snapshot. Construct it with `validate`. ","args":[],"cases":[]}],"aliases":[{"name":"Field","comment":" One exact, case-sensitive field key and its unnormalized text value. ","args":[],"type":"{ key : String.String, value : String.String }"},{"name":"Issue","comment":" Fixed validation code and 1-based row number; 0 means a snapshot-level issue. ","args":[],"type":"{ row : Basics.Int, code : String.String }"},{"name":"Row","comment":" A stable record ID with an explicitly authored list of fields. ","args":[],"type":"{ id : String.String, fields : List.List Property.ReviewMerge.Field }"}],"values":[{"name":"conflictKey","comment":" Collision-free length-prefixed key for associating a choice with a conflict.\nKeys include record IDs/field names and may be private; do not use them as telemetry.\n","type":"Property.ReviewMerge.Conflict -> String.String"},{"name":"conflicts","comment":" All unresolved source conflicts, in deterministic order. ","type":"Property.ReviewMerge.Plan -> List.List Property.ReviewMerge.Conflict"},{"name":"finalize","comment":" Resolve every conflict exactly once. Unknown, duplicate and missing keys fail\nthe whole finalization. Source snapshots and the original plan remain immutable.\nNo partial result is returned while any conflict remains unresolved.\n","type":"List.List ( String.String, Property.ReviewMerge.Choice ) -> Property.ReviewMerge.Plan -> Result.Result (List.List String.String) (List.List Property.ReviewMerge.Row)"},{"name":"merge","comment":" Compare base with two independently edited snapshots.\nIdentical edits and changes made by only one side merge automatically. Different\nedits to one field, delete/edit pairs and different concurrent additions require choices.\n","type":"Property.ReviewMerge.Snapshot -> Property.ReviewMerge.Snapshot -> Property.ReviewMerge.Snapshot -> Property.ReviewMerge.Plan"},{"name":"toRows","comment":" Deterministic record/key order; values and Unicode remain unchanged. ","type":"Property.ReviewMerge.Snapshot -> List.List Property.ReviewMerge.Row"},{"name":"validate","comment":" Validate at most 200 rows, 30 fields/row, 64-character keys and 2,000-character values.\nIDs are 1–64 ASCII letters/digits/dot/underscore/dash. Empty snapshots are valid.\nDuplicate record IDs or field keys are rejected before constructing dictionaries.\n","type":"List.List Property.ReviewMerge.Row -> Result.Result (List.List Property.ReviewMerge.Issue) Property.ReviewMerge.Snapshot"}],"binops":[]},{"name":"Property.ReviewMerge.Json","comment":" JSON boundary for note snapshots. Field lists preserve duplicate keys until\nvalidation; they are not parsed as dictionaries that silently discard duplicates.\n\n@docs decoder, encode\n","unions":[],"aliases":[],"values":[{"name":"decoder","comment":" Decode a list of rows, then validate before creating an opaque snapshot.\nErrors are fixed codes and row numbers rather than source values.\n","type":"Json.Decode.Decoder Property.ReviewMerge.Snapshot"},{"name":"encode","comment":" Encode explicitly finalized rows; strings are escaped by Elm's JSON encoder.\nCallers must obtain rows from `finalize` before treating them as a merge result.\n","type":"List.List Property.ReviewMerge.Row -> Json.Encode.Value"}],"binops":[]}]