<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.39 (Ruby 3.2.11) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-jurkovikj-json-three-way-merge-00" category="exp" submissionType="IETF" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.0 -->
  <front>
    <title abbrev="JSON Three-Way Merge">Deterministic Three-Way Merge for JSON Values</title>
    <seriesInfo name="Internet-Draft" value="draft-jurkovikj-json-three-way-merge-00"/>
    <author initials="A." surname="Jurkovikj" fullname="Antun Jurkovikj">
      <organization/>
      <address>
        <postal>
          <country>North Macedonia</country>
        </postal>
        <email>antunjurkovic@gmail.com</email>
      </address>
    </author>
    <date year="2026" month="August" day="04"/>
    <area>Applications and Real-Time</area>
    <keyword>JSON, merge, conflict, concurrency, reconciliation</keyword>
    <abstract>
      <?line 30?>

<t>For a fixed, disclosed resource policy, this document defines a deterministic
three-way merge operation for a restricted JSON value domain. Given a shared
base value and two independently derived values, called source and target, the
operation produces either one complete merged JSON value or an ordered set of
structured conflicts.</t>
      <t>The operation defines strict JSON input processing, finite binary64 number
normalization, scalar and object merge laws, explicit missing-member semantics,
RFC 6901 conflict paths, typed conflict kinds, a fail-closed result for arrays,
and bounded failure behavior. It is independent of HTTP and does not define
array merge semantics, application-specific semantic resolution, content
identity, or authorization policy.</t>
    </abstract>
  </front>
  <middle>
    <?line 45?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Systems commonly retain a JSON value, allow two parties to edit copies of that
value independently, and later need to reconcile both edits. Existing
standardized JSON patch formats describe a change to one target value, but do
not define how to reconcile two complete edited values derived from one shared
base.</t>
      <t>Without a common operation, implementations often use textual merge,
last-writer-wins replacement, or application-specific rules. Those approaches
can produce different outcomes across runtimes or silently discard one party's
change.</t>
      <t>This document defines an implementation-independent three-way merge operation:</t>
      <artwork><![CDATA[
Merge(base, source, target)
  -> merged value
   | ordered conflicts
   | typed input, unsupported-domain, or resource failure
]]></artwork>
      <t>The operation is deliberately conservative. It merges normalized scalar values
and recursively array-free objects. Arrays are outside the initial merge domain
and cause a typed fail-closed result even when all three arrays are equal. A
future specification can define array behavior under a separate semantic
identity and separate conformance vectors.</t>
      <section anchor="goals">
        <name>Goals</name>
        <t>This document provides:</t>
        <ul spacing="normal">
          <li>
            <t>deterministic normalized equality for JSON values in the merge domain;</t>
          </li>
          <li>
            <t>merge laws that preserve one-sided and agreed changes;</t>
          </li>
          <li>
            <t>recursive combination of independent object-member changes;</t>
          </li>
          <li>
            <t>explicit distinction between a missing member and a present JSON <tt>null</tt>;</t>
          </li>
          <li>
            <t>conflicts for divergent edits, incompatible type changes, divergent
additions, and edit-versus-delete cases;</t>
          </li>
          <li>
            <t>unambiguous RFC 6901 paths and deterministic conflict ordering; and</t>
          </li>
          <li>
            <t>bounded, complete outcomes without partial merged values or conflict
prefixes.</t>
          </li>
        </ul>
      </section>
      <section anchor="non-goals">
        <name>Non-Goals</name>
        <t>This document does not define:</t>
        <ul spacing="normal">
          <li>
            <t>array merge, sequence alignment, keyed collections, or reordering rules;</t>
          </li>
          <li>
            <t>a JSON diff or patch-generation algorithm;</t>
          </li>
          <li>
            <t>a CRDT, operational transformation, consensus, or replication protocol;</t>
          </li>
          <li>
            <t>application-specific semantic merge or automatic conflict resolution;</t>
          </li>
          <li>
            <t>provenance receipts, redaction formats, or migration between merge engines;</t>
          </li>
          <li>
            <t>JSON canonicalization or content identifiers as a merge prerequisite;</t>
          </li>
          <li>
            <t>an HTTP method, field, status code, Link relation, or media type;</t>
          </li>
          <li>
            <t>persistence, atomic commit, authentication, authorization, or licensing; or</t>
          </li>
          <li>
            <t>a determination that a structurally merged value is valid for an
application's schema or policy.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="relationship-to-existing-json-standards">
      <name>Relationship to Existing JSON Standards</name>
      <t>JSON Patch <xref target="RFC6902"/> expresses an ordered sequence of operations to apply to
one target document. JSON Merge Patch <xref target="RFC7396"/> expresses, by example, a
patch to apply to one target value. Both are useful mutation formats, but
neither takes a shared base and two independently edited complete values or
defines the conflicts specified here.</t>
      <t>JSON Pointer <xref target="RFC6901"/> defines the path syntax used by this document. JSON
<xref target="RFC8259"/> defines the underlying interchange syntax and data model, subject
to the additional input and number restrictions in this document.</t>
      <t>Internet JSON (I-JSON) <xref target="RFC7493"/> has related interoperability goals. Both
I-JSON and this document require UTF-8, reject duplicate decoded object names,
exclude lone surrogates, and account for binary64 interoperability. This
document is not an I-JSON profile, however: it recursively excludes arrays,
normatively converts admitted numbers to finite binary64 values, and does not
import every I-JSON restriction, including its prohibition on Unicode
noncharacters.</t>
      <t>The JSON Canonicalization Scheme (JCS) <xref target="RFC8785"/> defines deterministic JSON
serialization for hashing and signing. This merge operation is deterministic
at the normalized JSON-value and ordered-diagnostic levels and does not require
JCS, a digest, or a content identifier. An application that independently
needs deterministic bytes can apply a compatible canonicalization contract
after a successful merge. The unsigned UTF-16 comparator used here for one
decoded pointer token aligns with JCS property-name sorting, but this
document's ordering of complete pointer-token sequences is separate and does
not make JCS a merge prerequisite.</t>
    </section>
    <section anchor="conventions-and-terminology">
      <name>Conventions and Terminology</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

<dl>
        <dt><strong>Base</strong></dt>
        <dd>
          <t>The shared JSON value from which source and target were independently
derived.</t>
        </dd>
        <dt><strong>Source</strong></dt>
        <dd>
          <t>One edited JSON value derived from the base. The name does not grant this
side authority over target.</t>
        </dd>
        <dt><strong>Target</strong></dt>
        <dd>
          <t>The other edited JSON value derived from the base. The name does not grant
this side authority over source.</t>
        </dd>
        <dt><strong>Normalized value</strong></dt>
        <dd>
          <t>A value admitted by the <xref target="input-domain">input-domain rules</xref>, with every
number represented by its normalized finite binary64 value.</t>
        </dd>
        <dt><strong>Present</strong></dt>
        <dd>
          <t>An object member exists and has a JSON value, including JSON <tt>null</tt>.</t>
        </dd>
        <dt><strong>Missing</strong></dt>
        <dd>
          <t>An object member does not exist. Missing is an operation-internal state and
is not a seventh JSON value kind.</t>
        </dd>
      </dl>
      <t>The base, source, and target root values are always present. Missing can arise
only while processing an object member.</t>
      <dl>
        <dt><strong>Resource-policy identifier</strong></dt>
        <dd>
          <t>A stable identifier for one fixed set of resource ceilings, deterministic
measurement encodings, and any policy-defined limit precedence. The generic
JSON result form carries this identifier in <tt>error.budget</tt>.</t>
        </dd>
        <dt><strong>Merge processor</strong></dt>
        <dd>
          <t>An implementation of the operation defined by this document.</t>
        </dd>
      </dl>
      <t>In pseudocode, <tt>B</tt>, <tt>S</tt>, and <tt>T</tt> denote base, source, and target values.
<tt>M(B,S,T)</tt> denotes the merge operation. <tt>==</tt> denotes normalized equality as
defined in <xref target="normalized-equality">Normalized Equality and Kind</xref>, not textual
equality of input JSON.</t>
    </section>
    <section anchor="input-domain">
      <name>Input Domain and Normalization</name>
      <section anchor="one-complete-json-value">
        <name>One Complete JSON Value</name>
        <t>Each input is a UTF-8 sequence containing exactly one JSON value as defined by
<xref target="RFC8259"/>. Leading and trailing JSON whitespace are permitted. After the
value and trailing whitespace, any additional octet is invalid.</t>
        <t>A leading UTF-8 byte order mark (the octet sequence encoding U+FEFF) <bcp14>MUST</bcp14> be
rejected with code <tt>invalid_json</tt>. This profile does not use the permissive
RFC 8259 option to ignore a byte order mark while parsing.</t>
        <t>A merge processor <bcp14>MUST</bcp14> reject malformed JSON, invalid UTF-8, and escaped or
unescaped lone surrogate code points. It <bcp14>MUST</bcp14> preserve admitted Unicode scalar
values exactly and <bcp14>MUST NOT</bcp14> apply Unicode normalization.</t>
        <t>An object <bcp14>MUST NOT</bcp14> contain the same decoded member name more than once. Escape
spelling does not make names distinct; for example, <tt>"a"</tt> and <tt>"\u0061"</tt> are
duplicates in the same object and <bcp14>MUST</bcp14> be rejected before merge processing.</t>
        <t>Many general-purpose JSON parsers silently retain only the first or last
occurrence of a duplicate member name. A processor cannot satisfy the
requirement above by inspecting a post-parse object after such a collapse. It
<bcp14>MUST</bcp14> use a parser mode or input front end that exposes every decoded member-name
occurrence or rejects duplicates before collapsing them.</t>
      </section>
      <section anchor="binary64-number-model">
        <name>Binary64 Number Model</name>
        <t>Every JSON number token <bcp14>MUST</bcp14> be converted to the nearest IEEE 754 binary64
value <xref target="IEEE754"/> using round-to-nearest, ties-to-even. A token whose
conversion overflows to positive or negative infinity <bcp14>MUST</bcp14> be rejected. <tt>NaN</tt>
and infinity are not JSON number tokens and are invalid input.</t>
        <t>All finite binary64 values, including subnormal values, are admitted. Positive
and negative zero compare equal and are normalized to positive zero. Thus, the
input tokens <tt>-0</tt>, <tt>0</tt>, and <tt>0.0</tt> denote the same normalized number.</t>
        <t>Different decimal tokens that convert to the same binary64 value are equal.
For example, <tt>1</tt>, <tt>1.0</tt>, and <tt>1e0</tt> are equal. The token
<tt>9007199254740993</tt> converts to the binary64 value also denoted by
<tt>9007199254740992</tt>; those tokens therefore compare equal under this profile.
Applications that require exact integers beyond binary64 precision <bcp14>MUST</bcp14> encode
them under an application-defined representation, such as JSON strings, rather
than rely on this merge operation to preserve their decimal-token distinction.</t>
        <t>This document's acceptance and normalization of negative zero are explicit.
They do not impose the stricter negative-zero parser behavior discussed by
verified Erratum 7920 for <xref target="RFC8785"/>, because JCS conformance is not a merge
input requirement here.</t>
      </section>
      <section anchor="merge-value-kinds">
        <name>Merge Value Kinds</name>
        <t>The merge domain contains these normalized JSON value kinds:</t>
        <ul spacing="normal">
          <li>
            <t>null;</t>
          </li>
          <li>
            <t>boolean;</t>
          </li>
          <li>
            <t>number, represented by the <xref target="binary64-number-model">binary64 number model</xref>;</t>
          </li>
          <li>
            <t>string; and</t>
          </li>
          <li>
            <t>object whose values are recursively in this domain.</t>
          </li>
        </ul>
        <t>Arrays are recursively unsupported. An array at the root or below an object
member prevents that complete input from entering the merge engine.</t>
      </section>
      <section anchor="normalized-equality">
        <name>Normalized Equality and Kind</name>
        <t>Two normalized values are equal when:</t>
        <ul spacing="normal">
          <li>
            <t>both are null;</t>
          </li>
          <li>
            <t>both are the same boolean;</t>
          </li>
          <li>
            <t>both are the same normalized binary64 value;</t>
          </li>
          <li>
            <t>both are strings containing the same sequence of Unicode scalar values; or</t>
          </li>
          <li>
            <t>both are objects with the same decoded member-name set and recursively equal
values for every member.</t>
          </li>
        </ul>
        <t>Object member order in input JSON does not affect equality. No Unicode
normalization, case folding, locale comparison, or application-specific
coercion is performed.</t>
        <t>The five merge value kinds above are distinct. In particular, a number is not
equal to a string containing its decimal spelling, and null is not equal to a
missing object member.</t>
      </section>
    </section>
    <section anchor="validation-and-failure-precedence">
      <name>Validation and Failure Precedence</name>
      <section anchor="input-side-order">
        <name>Input-Side Order</name>
        <t>The merge processor <bcp14>MUST</bcp14> process complete inputs in this order:</t>
        <ol spacing="normal" type="1"><li>
            <t>base;</t>
          </li>
          <li>
            <t>source; and</t>
          </li>
          <li>
            <t>target.</t>
          </li>
        </ol>
        <t>It <bcp14>MUST</bcp14> stop at the first side that produces an invalid-input,
unsupported-domain, or resource-limit result. The semantic merge engine runs
only after all three inputs are valid, normalized, recursively array-free, and
admitted by the active resource policy.</t>
        <t>For example, an invalid base wins over an unsupported array in source, and an
unsupported array in source wins over an invalid target.</t>
      </section>
      <section anchor="within-one-input-side">
        <name>Within One Input Side</name>
        <t>Within one side, processing is bounded and left-to-right. The processor <bcp14>MUST</bcp14>
use this precedence at each parser event:</t>
        <ol spacing="normal" type="1"><li>
            <t>Check the raw input-octet ceiling before scanning.</t>
          </li>
          <li>
            <t>Before entering a recognized container, check nesting depth and node count.</t>
          </li>
          <li>
            <t>Before constructing a recognized scalar, check node count.</t>
          </li>
          <li>
            <t>When an object member begins, check member count before decoding and
retaining its name; check decoded name size while decoding it.</t>
          </li>
          <li>
            <t>Detect a duplicate decoded member name before parsing that member's value.</t>
          </li>
          <li>
            <t>Before parsing an array child, check any per-array element ceiling and the
document node ceiling.</t>
          </li>
          <li>
            <t>Check decoded string size and raw number-token size while scanning.</t>
          </li>
          <li>
            <t>Report syntax, Unicode, and numeric-domain failures at the first point they
become knowable.</t>
          </li>
          <li>
            <t>If the active policy defines a complete normalized-input byte ceiling,
compute it using the deterministic encoding named by that policy and check
it before admitting the side.</t>
          </li>
        </ol>
        <t>If malformed syntax becomes knowable before a resource boundary is crossed,
status <tt>invalid_input</tt> wins. If a bounded token reaches the first prohibited
octet before a defect in an unread suffix becomes knowable, status
<tt>resource_limit</tt> wins. Unsupported-array selection occurs only after the side
is otherwise completely valid and admitted.</t>
      </section>
      <section anchor="unsupported-arrays">
        <name>Unsupported Arrays</name>
        <t>For one side, the processor first completes bounded JSON and number validation.
If the valid side contains one or more arrays, it <bcp14>MUST</bcp14> return status
<tt>unsupported</tt> with:</t>
        <ul spacing="normal">
          <li>
            <t>code <tt>arrays_not_supported</tt>;</t>
          </li>
          <li>
            <t>side <tt>base</tt>, <tt>source</tt>, or <tt>target</tt>; and</t>
          </li>
          <li>
            <t>the RFC 6901 path of the least array under the
<xref target="path-ordering">path ordering</xref>.</t>
          </li>
        </ul>
        <t>The root array path is the empty string. Equal, unchanged, or empty arrays are
still unsupported. A processor <bcp14>MUST NOT</bcp14> apply an equality shortcut before
array-domain validation.</t>
        <t>The selected path is the least path under that ordering, not necessarily the
first array encountered in the raw JSON text. A processor <bcp14>MAY</bcp14> maintain a
running minimum during validation or compare retained candidate paths after
validation; it <bcp14>MUST NOT</bcp14> substitute raw encounter order for the required path
ordering.</t>
        <t>The least selected array cannot be reached through an array element. If an
array had an ancestor array, the ancestor's pointer-token sequence would be a
strict prefix and would sort first. Consequently, the selected array is either
the root or is reached only through object-member steps. Numeric-looking object
member names remain ordinary pointer tokens and are compared by the same token
rules.</t>
        <t>An implementation <bcp14>MAY</bcp14> validate unsupported array content without retaining the
complete array, but it <bcp14>MUST</bcp14> still detect malformed content, duplicate object
names, invalid numbers, and resource failures according to the rules above.</t>
      </section>
      <section anchor="invalid-input">
        <name>Invalid Input</name>
        <t>An invalid-input result uses one of these codes:</t>
        <ul spacing="normal">
          <li>
            <t><tt>invalid_json</tt> for malformed JSON, invalid UTF-8, trailing content, or an
invalid Unicode scalar sequence;</t>
          </li>
          <li>
            <t><tt>duplicate_object_name</tt> for a repeated decoded name in one object; or</t>
          </li>
          <li>
            <t><tt>number_out_of_binary64_range</tt> for a number that cannot be represented as a
finite binary64 value.</t>
          </li>
        </ul>
        <t>The result <bcp14>MUST</bcp14> identify the failing input side. It <bcp14>MUST</bcp14> contain an RFC 6901
path when the affected value or containing object is known. For
<tt>duplicate_object_name</tt>, the path <bcp14>MUST</bcp14> identify the containing object; the
duplicated name is not appended as a child token. For
<tt>number_out_of_binary64_range</tt>, the path <bcp14>MUST</bcp14> identify the offending number
value itself. A processor <bcp14>MAY</bcp14> include a zero-based UTF-8 byte offset and
derived line and column information. Such optional source-location details do
not alter the merge outcome.</t>
      </section>
      <section anchor="resource-policy">
        <name>Resource Policy</name>
        <t>Every merge execution <bcp14>MUST</bcp14> be subject to a finite resource policy. The policy
<bcp14>MUST</bcp14> bound, at minimum:</t>
        <ul spacing="normal">
          <li>
            <t>raw octets per input side;</t>
          </li>
          <li>
            <t>container nesting depth;</t>
          </li>
          <li>
            <t>total value nodes and object-member occurrences per input;</t>
          </li>
          <li>
            <t>array elements processed while validating an unsupported array;</t>
          </li>
          <li>
            <t>decoded member-name and string-value octets;</t>
          </li>
          <li>
            <t>number-token octets;</t>
          </li>
          <li>
            <t>retained conflicts; and</t>
          </li>
          <li>
            <t>any serialized result retained by the processor.</t>
          </li>
        </ul>
        <t>A policy <bcp14>MAY</bcp14> additionally bound the bytes in each complete normalized input.
Such a bound is distinct from raw-input, token, node, member, and serialized
result limits. The policy <bcp14>MUST</bcp14> identify the deterministic normalized-value
encoding used for that measurement and the corresponding limit code. This
document neither selects nor requires a JSON canonicalization scheme for that
purpose.</t>
        <t>A processor <bcp14>MUST</bcp14> associate its fixed ceilings with a stable resource-policy
identifier. If any ceiling changes, the identifier <bcp14>MUST</bcp14> also change. Limits
are implementation policy rather than universal ceilings defined by this
document, but they are an explicit input to reproducible operation behavior.
An invocation <bcp14>MUST NOT</bcp14> silently select an unbounded path or raise a ceiling
based on attacker-controlled input.</t>
        <t>A resource-limit result <bcp14>MUST</bcp14> identify the resource-policy identifier, limit
code, charged side, path, inclusive limit, and observed value. To permit early
failure without scanning or retaining a hostile suffix, <tt>observed</tt> <bcp14>SHOULD</bcp14> be
reported as the first prohibited value, <tt>limit + 1</tt>.</t>
        <t>A processor can define additional limit codes. The following code spellings
<bcp14>SHOULD</bcp14> be used when the corresponding resource is bounded:</t>
        <artwork><![CDATA[
input_bytes                 nesting_depth
total_nodes                 total_object_members
array_length                key_bytes
string_bytes                number_token_bytes
normalized_document_bytes   result_bytes
merge_response_bytes
conflict_count
]]></artwork>
        <t>When a policy uses one of those suggested codes, the resource-limit <tt>path</tt>
          <bcp14>MUST</bcp14> be selected as follows:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Code</th>
              <th align="left">Failure path</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>input_bytes</tt></td>
              <td align="left">Root, because the check occurs before input scanning.</td>
            </tr>
            <tr>
              <td align="left">
                <tt>nesting_depth</tt></td>
              <td align="left">The would-be container path.</td>
            </tr>
            <tr>
              <td align="left">
                <tt>total_nodes</tt></td>
              <td align="left">The would-be value path.</td>
            </tr>
            <tr>
              <td align="left">
                <tt>total_object_members</tt></td>
              <td align="left">The containing object path.</td>
            </tr>
            <tr>
              <td align="left">
                <tt>array_length</tt></td>
              <td align="left">The would-be element path, including its zero-based array index.</td>
            </tr>
            <tr>
              <td align="left">
                <tt>key_bytes</tt></td>
              <td align="left">The containing object path; the oversized name is not admitted.</td>
            </tr>
            <tr>
              <td align="left">
                <tt>string_bytes</tt></td>
              <td align="left">The string value path.</td>
            </tr>
            <tr>
              <td align="left">
                <tt>number_token_bytes</tt></td>
              <td align="left">The number value path.</td>
            </tr>
            <tr>
              <td align="left">
                <tt>normalized_document_bytes</tt></td>
              <td align="left">The first value or member, in the policy's deterministic normalized-value encoding order, whose byte contribution crosses the ceiling; container punctuation uses the containing-container path.</td>
            </tr>
            <tr>
              <td align="left">
                <tt>result_bytes</tt></td>
              <td align="left">The first value or member, in deterministic merge-result encoding order, whose byte contribution crosses the ceiling; container punctuation uses the containing-container path.</td>
            </tr>
            <tr>
              <td align="left">
                <tt>merge_response_bytes</tt></td>
              <td align="left">The first unadmitted conflict path; root if a fixed envelope or a non-conflict response component crosses the ceiling.</td>
            </tr>
            <tr>
              <td align="left">
                <tt>conflict_count</tt></td>
              <td align="left">The first unadmitted conflict path.</td>
            </tr>
          </tbody>
        </table>
        <t>The path-attribution rule for an additional limit code <bcp14>MUST</bcp14> be defined by the
resource policy. Encoding-derived measurements <bcp14>MUST</bcp14> attribute each measured
byte contribution in a deterministic order. Path-attribution rules are part
of the resource policy; changing one requires a new resource-policy
identifier.</t>
        <t><tt>result_bytes</tt> measures the deterministic policy-selected serialization of a
complete normalized merged value, excluding the generic result envelope. It
applies only after conflict discovery has established that the operation is
conflict-free. <tt>merge_response_bytes</tt> measures the deterministic
policy-selected serialization of the complete generic result form or of a
fixed adopting envelope, including status-specific conflicts or error detail.
A policy that uses either code <bcp14>MUST</bcp14> identify the exact encoding being measured
and, for <tt>merge_response_bytes</tt>, the exact envelope and included members. If
both codes apply to one successful operation, <tt>result_bytes</tt> <bcp14>MUST</bcp14> be checked
before <tt>merge_response_bytes</tt>. Output-side failures use side <tt>merge_result</tt>.</t>
        <t>Depth counts open object and array containers: a scalar root has depth zero, a
root container has depth one, and entering a child container increments depth.
Every JSON value, including the root and every unsupported array container,
counts as one node. Each syntactically started object-member occurrence counts
once, including a later-rejected duplicate. Name and string ceilings count
decoded UTF-8 octets; number-token ceilings count the raw token from an
optional minus sign through the final digit of the token, excluding
whitespace.</t>
        <t>Resource limits <bcp14>MUST</bcp14> be checked before the allocation, insertion, recursive
descent, clone, or output append that would exceed the active ceiling. Integer
accounting <bcp14>MUST</bcp14> detect overflow rather than wrap.</t>
        <t>A processor claiming conformance to this document <bcp14>MUST</bcp14> configure limits high
enough to execute every applicable <xref target="conformance-vectors">conformance vector</xref>.</t>
      </section>
    </section>
    <section anchor="merge-operation">
      <name>Deterministic Merge Operation</name>
      <section anchor="equality-shortcuts-and-merge-laws">
        <name>Equality Shortcuts and Merge Laws</name>
        <t>After all three inputs are admitted, each value merge applies these normalized
equality shortcuts in order:</t>
        <artwork><![CDATA[
if S == T: return S
if B == S: return T
if B == T: return S
]]></artwork>
        <t>Consequently, over the recursively array-free domain, the operation satisfies:</t>
        <artwork><![CDATA[
M(B, B, B) = B
M(B, S, B) = S
M(B, B, T) = T
M(B, X, X) = X
]]></artwork>
        <t>Swapping source and target preserves a successful merged value and every
conflict path. The two oriented edit-versus-delete conflict kinds swap as
described in <xref target="conflict-kinds">Conflict Kinds</xref>.</t>
      </section>
      <section anchor="scalar-and-type-merge">
        <name>Scalar and Type Merge</name>
        <t>If no equality shortcut applies and all three values are objects, the object
operation in <xref target="object-merge">Object Merge</xref> applies.</t>
        <t>Otherwise, the processor <bcp14>MUST</bcp14> emit one conflict at the current path:</t>
        <ul spacing="normal">
          <li>
            <t><tt>concurrent_value_change</tt> when all three values have the same merge value
kind and they are not all objects; or</t>
          </li>
          <li>
            <t><tt>concurrent_type_change</tt> when their merge value kinds are not all the same.</t>
          </li>
        </ul>
        <t>The processor <bcp14>MUST NOT</bcp14> choose source or target based on role name, textual
ordering, timestamp, input member order, or serialization length.</t>
      </section>
      <section anchor="object-merge">
        <name>Object Merge</name>
        <t>If all three values at a path are objects and no equality shortcut applies,
the processor considers the union of their decoded member names. It processes
those names in the unsigned UTF-16 order defined in
<xref target="path-ordering">Path and Conflict Ordering</xref> and applies the
<xref target="presence-matrix">presence matrix</xref> to each member.</t>
        <t>When all three member states are present, the processor recursively applies
the value merge at the child path. Independent changes under different member
names therefore combine into one object.</t>
        <t>The processor constructs a complete merged object only when no conflict exists
anywhere in the operation. If any conflict exists, non-conflicting provisional
work is discarded and the result contains only the complete ordered conflict
set.</t>
        <t>Conflict discovery and conflict-diagnostic limit checks <bcp14>MUST</bcp14> precede
construction or certification of a merged result. A processor <bcp14>MUST NOT</bcp14> return
a merged-result node, member, depth, encoding, or serialized-size limit while
a semantic conflict remains to be discovered. Those merged-result limits apply
only after the operation is known to be conflict-free. Conflict-count and
conflict-response limits can still produce a complete <tt>resource_limit</tt> result
during bounded conflict discovery.</t>
      </section>
      <section anchor="presence-matrix">
        <name>Object-Member Presence Matrix</name>
        <t>Presence equality compares both state and, for present states, normalized
value. The following matrix summarizes complete object-member behavior,
including outcomes selected by the same three equality shortcuts:</t>
        <t>In the table, <tt>present B</tt> in any column means present with a normalized value
equal to the base value denoted by <tt>B</tt>; it does not require identical input
spelling. <tt>S</tt>, <tt>T</tt>, and <tt>X</tt> likewise denote normalized values, and <tt>!=</tt> denotes
normalized inequality.</t>
        <table>
          <thead>
            <tr>
              <th align="left">Base</th>
              <th align="left">Source</th>
              <th align="left">Target</th>
              <th align="left">Outcome</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">present B</td>
              <td align="left">missing</td>
              <td align="left">present B</td>
              <td align="left">missing</td>
            </tr>
            <tr>
              <td align="left">present B</td>
              <td align="left">present B</td>
              <td align="left">missing</td>
              <td align="left">missing</td>
            </tr>
            <tr>
              <td align="left">present B</td>
              <td align="left">missing</td>
              <td align="left">present T, T != B</td>
              <td align="left">
                <tt>source_delete_target_edit</tt> conflict</td>
            </tr>
            <tr>
              <td align="left">present B</td>
              <td align="left">present S, S != B</td>
              <td align="left">missing</td>
              <td align="left">
                <tt>source_edit_target_delete</tt> conflict</td>
            </tr>
            <tr>
              <td align="left">present B</td>
              <td align="left">missing</td>
              <td align="left">missing</td>
              <td align="left">missing</td>
            </tr>
            <tr>
              <td align="left">missing</td>
              <td align="left">present S</td>
              <td align="left">missing</td>
              <td align="left">present S</td>
            </tr>
            <tr>
              <td align="left">missing</td>
              <td align="left">missing</td>
              <td align="left">present T</td>
              <td align="left">present T</td>
            </tr>
            <tr>
              <td align="left">missing</td>
              <td align="left">present X</td>
              <td align="left">present X</td>
              <td align="left">present X</td>
            </tr>
            <tr>
              <td align="left">missing</td>
              <td align="left">present S</td>
              <td align="left">present T, S != T</td>
              <td align="left">
                <tt>add_add</tt> conflict</td>
            </tr>
          </tbody>
        </table>
        <t>If all three states are present, the <xref target="merge-operation">merge operation</xref>
recursively merges their values.
If base is missing and source and target add different objects under the same
member name, the processor reports <tt>add_add</tt> at that member path. It <bcp14>MUST NOT</bcp14>
invent an empty base object and combine the divergent additions recursively.</t>
      </section>
      <section anchor="no-partial-result">
        <name>No Partial Result</name>
        <t>Every invocation produces exactly one complete status. A conflict result <bcp14>MUST
NOT</bcp14> contain a merged value. A merged result <bcp14>MUST NOT</bcp14> contain conflicts. An
invalid-input, unsupported, or resource-limit result <bcp14>MUST NOT</bcp14> contain a merged
value, a conflict prefix, parser output, or partially normalized value.</t>
        <t>If conflict accumulation or conflict-response measurement reaches a resource
ceiling during conflict discovery, the processor <bcp14>MUST</bcp14> discard the partial
collection and return one complete resource-limit result. If the operation is
conflict-free and merged-result construction or certification reaches a
resource ceiling, it <bcp14>MUST</bcp14> discard the provisional result and return one
complete resource-limit result.</t>
      </section>
    </section>
    <section anchor="conflicts-and-diagnostic-ordering">
      <name>Conflicts and Diagnostic Ordering</name>
      <section anchor="conflict-kinds">
        <name>Conflict Kinds</name>
        <t>The conflict kinds are:</t>
        <dl>
          <dt><strong><tt>concurrent_value_change</tt></strong></dt>
          <dd>
            <t>Base, source, and target are present with the same merge value kind, they are
not all objects, and both sides differ from base and from each other.</t>
          </dd>
          <dt><strong><tt>concurrent_type_change</tt></strong></dt>
          <dd>
            <t>Base, source, and target are present; no equality shortcut applies; and the
three merge value kinds are not all the same.</t>
          </dd>
          <dt><strong><tt>add_add</tt></strong></dt>
          <dd>
            <t>The member is missing from base and both sides add unequal normalized values.</t>
          </dd>
          <dt><strong><tt>source_delete_target_edit</tt></strong></dt>
          <dd>
            <t>The member is present in base, source deletes it, and target changes it to a
value unequal to base.</t>
          </dd>
          <dt><strong><tt>source_edit_target_delete</tt></strong></dt>
          <dd>
            <t>The member is present in base, source changes it to a value unequal to base,
and target deletes it.</t>
          </dd>
        </dl>
        <t>Every conflict contains one kind, one RFC 6901 path, and explicit base, source,
and target presence states. It <bcp14>MUST</bcp14> contain the complete normalized value for
each present state unless an adopting application defines a separate,
non-conforming redacted diagnostic view. A redacted view cannot be used as the
input to automatic conflict resolution without application-specific rules.</t>
      </section>
      <section anchor="presence-encoding">
        <name>Presence Encoding</name>
        <t>In the JSON result form, presence is encoded as:</t>
        <sourcecode type="json"><![CDATA[
{"state":"missing"}
]]></sourcecode>
        <t>or:</t>
        <artwork><![CDATA[
{"state":"present","value":<normalized-json-value>}
]]></artwork>
        <t>The <tt>value</tt> member <bcp14>MUST</bcp14> be absent when state is <tt>missing</tt> and <bcp14>MUST</bcp14> be present
when state is <tt>present</tt>. A present value can be JSON <tt>null</tt>.</t>
      </section>
      <section anchor="path-ordering">
        <name>Path and Conflict Ordering</name>
        <t>Paths are RFC 6901 JSON Pointers. The document root is the empty string. For a
member name, <tt>~</tt> is escaped as <tt>~0</tt> and <tt>/</tt> is escaped as <tt>~1</tt>.</t>
        <t>Ordering compares decoded pointer-token sequences, not rendered pointer
strings. Each token is compared lexicographically as a sequence of unsigned
UTF-16 code units. If all units in the shorter token are equal to the prefix of
the longer token, the shorter token sorts first. If all shared tokens are
equal, the pointer with fewer tokens sorts first.</t>
        <t>This comparison is locale-independent and does not apply Unicode
normalization. A supplementary Unicode scalar value is compared through its
UTF-16 surrogate pair. Lone surrogates cannot occur because they are rejected
during input processing.</t>
        <t>UTF-16 code-unit order deliberately differs from Unicode scalar-value order
for some comparisons between supplementary and Basic Multilingual Plane
characters. An implementation whose native string ordering uses scalar values
or UTF-8 bytes therefore <bcp14>MUST</bcp14> explicitly derive the UTF-16 code-unit order
rather than use its runtime's default string comparison.</t>
        <t>The operation defined by this document produces at most one conflict for one
logical path. The conflict array <bcp14>MUST</bcp14> be sorted by the path ordering above.
Object-member traversal and least-array selection <bcp14>MUST</bcp14> use the same ordering.</t>
      </section>
    </section>
    <section anchor="json-result-form">
      <name>JSON Result Form</name>
      <t>This section defines a generic JSON representation of an operation result. It
does not register a media type or require an application to transfer results
over a network. An adopting specification <bcp14>MAY</bcp14> wrap these members in a
versioned envelope, but <bcp14>MUST</bcp14> preserve their meanings. The ordering requirement
applies to entries in the <tt>conflicts</tt> array, not to JSON object members.</t>
      <t>JSON object member order and insignificant whitespace in this result form are
not significant. Every emitted number value <bcp14>MUST</bcp14> represent the corresponding
normalized binary64 value when parsed under the
<xref target="binary64-number-model">binary64 number model</xref>, and negative zero <bcp14>MUST NOT</bcp14> be
emitted. When serialized, this result form <bcp14>MUST</bcp14> use UTF-8 and <bcp14>MUST NOT</bcp14> begin
with a byte order mark.</t>
      <t>Every generic result <bcp14>MUST</bcp14> contain the string member <tt>status</tt> and exactly the
status-specific top-level member shown below. The other two status-specific
members in the table <bcp14>MUST</bcp14> be absent. Additional envelope or error-detail
members remain permitted as described below.</t>
      <table>
        <thead>
          <tr>
            <th align="left">status</th>
            <th align="left">Required top-level member</th>
            <th align="left">Forbidden top-level members</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">
              <tt>merged</tt></td>
            <td align="left">
              <tt>merged</tt></td>
            <td align="left">
              <tt>conflicts</tt>, <tt>error</tt></td>
          </tr>
          <tr>
            <td align="left">
              <tt>conflict</tt></td>
            <td align="left">
              <tt>conflicts</tt></td>
            <td align="left">
              <tt>merged</tt>, <tt>error</tt></td>
          </tr>
          <tr>
            <td align="left">
              <tt>unsupported</tt></td>
            <td align="left">
              <tt>error</tt></td>
            <td align="left">
              <tt>merged</tt>, <tt>conflicts</tt></td>
          </tr>
          <tr>
            <td align="left">
              <tt>invalid_input</tt></td>
            <td align="left">
              <tt>error</tt></td>
            <td align="left">
              <tt>merged</tt>, <tt>conflicts</tt></td>
          </tr>
          <tr>
            <td align="left">
              <tt>resource_limit</tt></td>
            <td align="left">
              <tt>error</tt></td>
            <td align="left">
              <tt>merged</tt>, <tt>conflicts</tt></td>
          </tr>
        </tbody>
      </table>
      <section anchor="merged">
        <name>Merged</name>
        <sourcecode type="json"><![CDATA[
{
  "status": "merged",
  "merged": {"name":"ready","owner":"B"}
}
]]></sourcecode>
        <t>The <tt>merged</tt> member <bcp14>MUST</bcp14> contain the complete normalized merged value.</t>
      </section>
      <section anchor="conflict">
        <name>Conflict</name>
        <sourcecode type="json"><![CDATA[
{
  "status": "conflict",
  "conflicts": [
    {
      "kind": "concurrent_value_change",
      "path": "/title",
      "base": {"state":"present","value":"Draft"},
      "source": {"state":"present","value":"Ready"},
      "target": {"state":"present","value":"Review"}
    }
  ]
}
]]></sourcecode>
        <t>The <tt>conflicts</tt> array <bcp14>MUST</bcp14> be non-empty and ordered as specified in
<xref target="path-ordering">Path and Conflict Ordering</xref>.</t>
      </section>
      <section anchor="unsupported">
        <name>Unsupported</name>
        <sourcecode type="json"><![CDATA[
{
  "status": "unsupported",
  "error": {
    "code": "arrays_not_supported",
    "side": "source",
    "path": "/items"
  }
}
]]></sourcecode>
      </section>
      <section anchor="invalid-input-1">
        <name>Invalid Input</name>
        <sourcecode type="json"><![CDATA[
{
  "status": "invalid_input",
  "error": {
    "code": "duplicate_object_name",
    "side": "base",
    "path": ""
  }
}
]]></sourcecode>
      </section>
      <section anchor="resource-limit">
        <name>Resource Limit</name>
        <sourcecode type="json"><![CDATA[
{
  "status": "resource_limit",
  "error": {
    "budget": "example-resource-budget-v1",
    "code": "nesting_depth",
    "side": "target",
    "path": "/configuration",
    "limit": 64,
    "observed": 65
  }
}
]]></sourcecode>
        <t>The required <tt>error</tt> members are:</t>
        <table>
          <thead>
            <tr>
              <th align="left">status</th>
              <th align="left">Required error members</th>
              <th align="left">Additional defined members</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>unsupported</tt></td>
              <td align="left">
                <tt>code</tt>, <tt>side</tt>, <tt>path</tt></td>
              <td align="left">none</td>
            </tr>
            <tr>
              <td align="left">
                <tt>invalid_input</tt></td>
              <td align="left">
                <tt>code</tt>, <tt>side</tt>; <tt>path</tt> when known</td>
              <td align="left">
                <tt>byte_offset</tt>, <tt>line</tt>, <tt>column</tt></td>
            </tr>
            <tr>
              <td align="left">
                <tt>resource_limit</tt></td>
              <td align="left">
                <tt>budget</tt>, <tt>code</tt>, <tt>side</tt>, <tt>path</tt>, <tt>limit</tt>, <tt>observed</tt></td>
              <td align="left">none</td>
            </tr>
          </tbody>
        </table>
        <t>For <tt>unsupported</tt> and <tt>invalid_input</tt>, <tt>side</tt> is <tt>base</tt>, <tt>source</tt>, or
<tt>target</tt>. For <tt>resource_limit</tt>, those values identify an input-side charge and
<tt>merge_result</tt> identifies conflict or result construction. In a
<tt>resource_limit</tt> error, <tt>budget</tt> is a string containing the
<xref target="resource-policy">resource-policy identifier</xref>. Both <tt>limit</tt> and <tt>observed</tt>
are non-negative integers. Status-specific codes and path rules are defined in
<xref target="validation-and-failure-precedence">Validation and Failure Precedence</xref>.</t>
        <t>An implementation can add envelope or error-detail members, but <bcp14>MUST NOT</bcp14> use a
defined status, conflict kind, or error code with a different meaning.</t>
      </section>
    </section>
    <section anchor="examples">
      <name>Examples</name>
      <section anchor="independent-object-changes">
        <name>Independent Object Changes</name>
        <t>Given:</t>
        <artwork><![CDATA[
base   = {"name":"draft","owner":"A"}
source = {"name":"ready","owner":"A"}
target = {"name":"draft","owner":"B"}
]]></artwork>
        <t>source changes <tt>name</tt>, target changes <tt>owner</tt>, and neither change overlaps.
The merged value is:</t>
        <sourcecode type="json"><![CDATA[
{"name":"ready","owner":"B"}
]]></sourcecode>
      </section>
      <section anchor="missing-is-not-null">
        <name>Missing Is Not Null</name>
        <t>Given an empty base, source adds a present null member and target remains
unchanged:</t>
        <artwork><![CDATA[
base   = {}
source = {"reviewed":null}
target = {}
]]></artwork>
        <t>The merged value is <tt>{"reviewed":null}</tt>. The member is not deleted because a
present JSON null is a value, not the missing state.</t>
      </section>
      <section anchor="delete-versus-edit">
        <name>Delete Versus Edit</name>
        <t>Given:</t>
        <artwork><![CDATA[
base   = {"title":"Draft"}
source = {}
target = {"title":"Ready"}
]]></artwork>
        <t>the result contains <tt>source_delete_target_edit</tt> at <tt>/title</tt>, with source
encoded as missing and the other two states encoded as present.</t>
      </section>
      <section anchor="divergent-additions-are-conservative">
        <name>Divergent Additions Are Conservative</name>
        <t>Given:</t>
        <artwork><![CDATA[
base   = {}
source = {"settings":{"left":true}}
target = {"settings":{"right":true}}
]]></artwork>
        <t>the result is <tt>add_add</tt> at <tt>/settings</tt>. Although the two added objects contain
different member names, they have no shared base object. This operation does
not invent one and silently combine both additions.</t>
      </section>
      <section anchor="binary64-equality">
        <name>Binary64 Equality</name>
        <t>Given:</t>
        <artwork><![CDATA[
base   = {"count":1}
source = {"count":1.0}
target = {"count":2}
]]></artwork>
        <t>base and source are equal after number normalization, so the merged value is
<tt>{"count":2}</tt>.</t>
      </section>
    </section>
    <section anchor="informative-http-reconciliation-example">
      <name>Informative HTTP Reconciliation Example</name>
      <t>This merge operation does not depend on HTTP. An HTTP application can use it
after a conditional state-changing request fails because the resource changed
<xref target="RFC9110"/>:</t>
      <ol spacing="normal" type="1"><li>
          <t>base is the representation state previously observed by the client;</t>
        </li>
        <li>
          <t>source is the client's complete proposed state derived from base;</t>
        </li>
        <li>
          <t>target is freshly obtained current state;</t>
        </li>
        <li>
          <t>the application runs this merge operation;</t>
        </li>
        <li>
          <t>conflicts are reviewed or resolved under application policy; and</t>
        </li>
        <li>
          <t>a successful candidate is validated and submitted using a precondition for
the newly observed current state.</t>
        </li>
      </ol>
      <t>A successful structural merge does not authorize a blind retry. The
application still needs current-state validation, authorization, schema and
policy checks, and an atomic commit mechanism. Agentic State Transfer
<xref target="I-D.jurkovikj-httpapi-agentic-state"/> is an example of an HTTP profile whose
application layer can perform reconciliation after a precondition failure; it
does not normatively depend on this document.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <section anchor="resource-exhaustion">
        <name>Resource Exhaustion</name>
        <t>JSON depth, width, token size, and conflict count are attacker-controlled.
Processors <bcp14>MUST</bcp14> enforce the <xref target="resource-policy">resource policy</xref> before
prohibited recursion or allocation. Rejecting arrays does not permit unbounded
parsing merely to discover that an array is unsupported.</t>
      </section>
      <section anchor="conflict-value-disclosure">
        <name>Conflict-Value Disclosure</name>
        <t>A conforming conflict contains values from base, source, and target. Those
values can include credentials, personal information, deleted content,
configuration secrets, or fields hidden from one participant. Conflict results
<bcp14>MUST</bcp14> be treated as sensitive application data. Authentication and
authorization checks <bcp14>MUST</bcp14> precede disclosure. Implementations <bcp14>MUST NOT</bcp14> log,
render, or transmit raw conflicts by default when doing so would expose data to
an unauthorized party. An authorized interface that presents conflict values
<bcp14>MUST</bcp14> encode them as untrusted structured data for the destination context and
<bcp14>MUST NOT</bcp14> interpret them as HTML, terminal controls, executable content, or
format strings.</t>
        <t>An application can create a redacted human-facing view, but that view is not a
conforming complete conflict and might omit information required for safe
resolution.</t>
      </section>
      <section anchor="merge-success-is-not-semantic-safety">
        <name>Merge Success Is Not Semantic Safety</name>
        <t>This operation detects structural overlap under its fixed rules. It does not
know application invariants. Independent edits can merge structurally while
violating a schema, cross-field constraint, business rule, authorization
condition, or safety policy. Applications <bcp14>MUST</bcp14> validate the complete candidate
under current policy before commit.</t>
        <t>Automated agents <bcp14>MUST NOT</bcp14> interpret status <tt>merged</tt> as approval or authority to
perform an external action.</t>
      </section>
      <section anchor="base-authenticity-and-current-state">
        <name>Base Authenticity and Current State</name>
        <t>An incorrect or attacker-selected base can make concurrent changes appear
one-sided. Applications need an authenticated way to associate base with the
states actually observed by both editors. In concurrent systems, current-state
validation and candidate commit need to be atomic or protected by an
appropriate compare-and-swap mechanism.</t>
      </section>
      <section anchor="binary64-rounding">
        <name>Binary64 Rounding</name>
        <t>Decimal tokens can collapse to one binary64 value, including large integers
outside the exactly representable range. Applications <bcp14>MUST NOT</bcp14> use this merge
number model for identifiers, account balances, counters, or other values that
require decimal or arbitrary-precision distinction unless their application
representation encodes that distinction explicitly.</t>
      </section>
      <section anchor="unicode-and-path-presentation">
        <name>Unicode and Path Presentation</name>
        <t>No Unicode normalization is performed. Visually similar member names can
remain distinct. Interfaces <bcp14>SHOULD</bcp14> display escaped paths and untrusted member
names in a form that prevents control-character injection, bidirectional-text
confusion, and HTML or terminal interpretation. Processors <bcp14>MUST</bcp14> compare decoded
logical pointer tokens, not presentation strings.</t>
      </section>
      <section anchor="unsupported-arrays-1">
        <name>Unsupported Arrays</name>
        <t>Treating an unsupported result as permission to fall back to
last-writer-wins, index-wise merge, or an older unversioned array algorithm can
silently discard data. Applications <bcp14>SHOULD</bcp14> preserve the last known good state
and require a separately identified array-aware profile or explicit review.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
    <section anchor="implementation-status">
      <name>Implementation Status</name>
      <t>This section follows the guidance in <xref target="RFC7942"/>. It records implementation
information as of 2026-08-04 and is expected to be removed before publication
as an RFC.</t>
      <t><tt>libdualnative</tt> provides a Rust implementation of the scalar/object operation,
typed conflicts, array rejection, and fixed resource failures specified here.
Its policy-specific boundary suite exercises exact and first-prohibited
ceilings, failure precedence, conflict atomicity, and no-partial-result
behavior.
Its WebAssembly package is a facade over the same Rust engine and is parity
evidence, not an independent implementation. The experimental
<tt>v0.1.0-alpha.1</tt> GitHub prerelease is available at
<eref target="https://github.com/DualNative/libdualnative-v1/releases/tag/v0.1.0-alpha.1">https://github.com/DualNative/libdualnative-v1/releases/tag/v0.1.0-alpha.1</eref>.
The release source commit is
<tt>d986f1ab9b851dea8dd8d4a99dac6ef92acd8f25</tt>.</t>
      <t>The implementation also exposes a separate RFC 8785 and SHA-256 content
identity operation. That operation is not required by this document and is not
evidence of an independent merge implementation.</t>
      <t>At the time of writing, no complete, independently maintained implementation
in another language is known. The machine-readable companion suite contains 41
vectors and has SHA-256 digest
<tt>13467e8bf70718bdf247da4b007730e4f0e560f538db6a86f92a88a457c35e62</tt>.
During draft preparation, the Rust reference implementation was run against
all 41 companion vectors. A temporary JavaScript cross-check independently
exercised the 33 successful-merge, conflict, and unsupported-array vectors. It
did not implement strict input-error or resource-limit processing and is not a
complete or maintained implementation. A complete independent implementation
and common-vector execution are desirable before seeking working-group
adoption.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="IEEE754" target="https://ieeexplore.ieee.org/document/8766229">
          <front>
            <title>IEEE Standard for Floating-Point Arithmetic</title>
            <author>
              <organization>IEEE</organization>
            </author>
            <date year="2019" month="July" day="18"/>
          </front>
          <seriesInfo name="IEEE" value="754-2019"/>
          <seriesInfo name="DOI" value="10.1109/IEEESTD.2019.8766229"/>
        </reference>
        <reference anchor="RFC6901">
          <front>
            <title>JavaScript Object Notation (JSON) Pointer</title>
            <author fullname="P. Bryan" initials="P." role="editor" surname="Bryan"/>
            <author fullname="K. Zyp" initials="K." surname="Zyp"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <date month="April" year="2013"/>
            <abstract>
              <t>JSON Pointer defines a string syntax for identifying a specific value within a JavaScript Object Notation (JSON) document.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6901"/>
          <seriesInfo name="DOI" value="10.17487/RFC6901"/>
        </reference>
        <reference anchor="RFC8259">
          <front>
            <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
            <author fullname="T. Bray" initials="T." role="editor" surname="Bray"/>
            <date month="December" year="2017"/>
            <abstract>
              <t>JavaScript Object Notation (JSON) is a lightweight, text-based, language-independent data interchange format. It was derived from the ECMAScript Programming Language Standard. JSON defines a small set of formatting rules for the portable representation of structured data.</t>
              <t>This document removes inconsistencies with other specifications of JSON, repairs specification errors, and offers experience-based interoperability guidance.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="90"/>
          <seriesInfo name="RFC" value="8259"/>
          <seriesInfo name="DOI" value="10.17487/RFC8259"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC6902">
          <front>
            <title>JavaScript Object Notation (JSON) Patch</title>
            <author fullname="P. Bryan" initials="P." role="editor" surname="Bryan"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <date month="April" year="2013"/>
            <abstract>
              <t>JSON Patch defines a JSON document structure for expressing a sequence of operations to apply to a JavaScript Object Notation (JSON) document; it is suitable for use with the HTTP PATCH method. The "application/json-patch+json" media type is used to identify such patch documents.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6902"/>
          <seriesInfo name="DOI" value="10.17487/RFC6902"/>
        </reference>
        <reference anchor="RFC7396">
          <front>
            <title>JSON Merge Patch</title>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
            <author fullname="J. Snell" initials="J." surname="Snell"/>
            <date month="October" year="2014"/>
            <abstract>
              <t>This specification defines the JSON merge patch format and processing rules. The merge patch format is primarily intended for use with the HTTP PATCH method as a means of describing a set of modifications to a target resource's content.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7396"/>
          <seriesInfo name="DOI" value="10.17487/RFC7396"/>
        </reference>
        <reference anchor="RFC7493">
          <front>
            <title>The I-JSON Message Format</title>
            <author fullname="T. Bray" initials="T." role="editor" surname="Bray"/>
            <date month="March" year="2015"/>
            <abstract>
              <t>I-JSON (short for "Internet JSON") is a restricted profile of JSON designed to maximize interoperability and increase confidence that software can process it successfully with predictable results.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7493"/>
          <seriesInfo name="DOI" value="10.17487/RFC7493"/>
        </reference>
        <reference anchor="RFC8785">
          <front>
            <title>JSON Canonicalization Scheme (JCS)</title>
            <author fullname="A. Rundgren" initials="A." surname="Rundgren"/>
            <author fullname="B. Jordan" initials="B." surname="Jordan"/>
            <author fullname="S. Erdtman" initials="S." surname="Erdtman"/>
            <date month="June" year="2020"/>
            <abstract>
              <t>Cryptographic operations like hashing and signing need the data to be expressed in an invariant format so that the operations are reliably repeatable. One way to address this is to create a canonical representation of the data. Canonicalization also permits data to be exchanged in its original form on the "wire" while cryptographic operations performed on the canonicalized counterpart of the data in the producer and consumer endpoints generate consistent results.</t>
              <t>This document describes the JSON Canonicalization Scheme (JCS). This specification defines how to create a canonical representation of JSON data by building on the strict serialization methods for JSON primitives defined by ECMAScript, constraining JSON data to the Internet JSON (I-JSON) subset, and by using deterministic property sorting.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8785"/>
          <seriesInfo name="DOI" value="10.17487/RFC8785"/>
        </reference>
        <reference anchor="RFC9110">
          <front>
            <title>HTTP Semantics</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document describes the overall architecture of HTTP, establishes common terminology, and defines aspects of the protocol that are shared by all versions. In this definition are core protocol elements, extensibility mechanisms, and the "http" and "https" Uniform Resource Identifier (URI) schemes.</t>
              <t>This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="97"/>
          <seriesInfo name="RFC" value="9110"/>
          <seriesInfo name="DOI" value="10.17487/RFC9110"/>
        </reference>
        <reference anchor="I-D.jurkovikj-httpapi-agentic-state">
          <front>
            <title>HTTP Profile for Conditional Updates to Shared Resource State (Agentic State Transfer)</title>
            <author fullname="Antun Jurkovikj" initials="A." surname="Jurkovikj">
         </author>
            <date day="27" month="July" year="2026"/>
            <abstract>
              <t>   HTTP applications frequently expose one logical object through
   several representations or resources.  Ordinary HTTP entity tags
   identify selected representations; they do not, by themselves,
   provide a conditional-update mechanism spanning different request
   targets.

   This document specifies Agentic State Transfer (AST), an HTTP profile
   for preventing lost updates to shared application state.  AST Core
   requires a client to mutate the State-Bearing Resource using the
   strong ETag of its State-Bearing Representation and the standard If-
   Match field.  AST Semantic uses Semantic-ETag and If-Semantic-Match
   when a protected mutation targets a different resource or
   representation in the same concurrency domain.  The profile also
   defines state discovery, atomic compare-and-commit behavior, conflict
   handling, deferred processing, caching constraints, and security
   requirements.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-jurkovikj-httpapi-agentic-state-02"/>
        </reference>
        <reference anchor="RFC7942">
          <front>
            <title>Improving Awareness of Running Code: The Implementation Status Section</title>
            <author fullname="Y. Sheffer" initials="Y." surname="Sheffer"/>
            <author fullname="A. Farrel" initials="A." surname="Farrel"/>
            <date month="July" year="2016"/>
            <abstract>
              <t>This document describes a simple process that allows authors of Internet-Drafts to record the status of known implementations by including an Implementation Status section. This will allow reviewers and working groups to assign due consideration to documents that have the benefit of running code, which may serve as evidence of valuable experimentation and feedback that have made the implemented protocols more mature.</t>
              <t>This process is not mandatory. Authors of Internet-Drafts are encouraged to consider using the process for their documents, and working groups are invited to think about applying the process to all of their protocol specifications. This document obsoletes RFC 6982, advancing it to a Best Current Practice.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="205"/>
          <seriesInfo name="RFC" value="7942"/>
          <seriesInfo name="DOI" value="10.17487/RFC7942"/>
        </reference>
      </references>
    </references>
    <?line 971?>

<section anchor="merge-pseudocode">
      <name>Merge Pseudocode</name>
      <t>The following pseudocode is explanatory. Normative behavior is defined in the
preceding sections.</t>
      <artwork><![CDATA[
MERGE-VALUE(B, S, T, path):
  if EQUAL(S, T): return VALUE(S)
  if EQUAL(B, S): return VALUE(T)
  if EQUAL(B, T): return VALUE(S)

  if OBJECT(B) and OBJECT(S) and OBJECT(T):
    return MERGE-OBJECT(B, S, T, path)

  if KIND(B) == KIND(S) and KIND(S) == KIND(T):
    return CONFLICT(concurrent_value_change, path,
                    PRESENT(B), PRESENT(S), PRESENT(T))

  return CONFLICT(concurrent_type_change, path,
                  PRESENT(B), PRESENT(S), PRESENT(T))

MERGE-MEMBER(b, s, t, path):
  if EQUAL-PRESENCE(s, t): return s
  if EQUAL-PRESENCE(b, s): return t
  if EQUAL-PRESENCE(b, t): return s

  match (b, s, t):
    (PRESENT(B), PRESENT(S), PRESENT(T)):
      return MERGE-VALUE(B, S, T, path)
    (MISSING, PRESENT(S), PRESENT(T)):
      return CONFLICT(add_add, path, MISSING,
                      PRESENT(S), PRESENT(T))
    (PRESENT(B), MISSING, PRESENT(T)):
      return CONFLICT(source_delete_target_edit, path,
                      PRESENT(B), MISSING, PRESENT(T))
    (PRESENT(B), PRESENT(S), MISSING):
      return CONFLICT(source_edit_target_delete, path,
                      PRESENT(B), PRESENT(S), MISSING)

MERGE-OBJECT(B, S, T, path):
  provisional = empty object
  conflicts = empty sequence
  for key in SORT-UTF16(UNION-OF-NAMES(B, S, T)):
    child = MERGE-MEMBER(PRESENCE(B, key),
                         PRESENCE(S, key),
                         PRESENCE(T, key),
                         APPEND-POINTER(path, key))
    if child is conflict collection:
      append child conflicts
    else if child is present:
      provisional[key] = child.value

  if conflicts is not empty:
    discard provisional
    return SORT-BY-POINTER(conflicts)
  return provisional
]]></artwork>
    </section>
    <section anchor="conformance-vectors">
      <name>Conformance Vectors</name>
      <t>The inputs in this appendix are JSON texts. Expected merged values and
conflict presence values are compared after normalization, so insignificant
whitespace, object member order, and equivalent binary64 number spelling do
not alter a vector result.</t>
      <t>A machine-readable companion suite maintained with the draft source is named
<tt>draft-jurkovikj-json-three-way-merge-00-vectors.json</tt> and uses schema
identifier <tt>draft-jurkovikj-json-three-way-merge-00-vectors-v1</tt>. Its <tt>base</tt>,
<tt>source</tt>, and <tt>target</tt> members are outer JSON strings whose decoded contents
are the exact UTF-8 input text supplied to the processor. This permits
malformed JSON text, a leading byte order mark, and an escaped lone surrogate
to remain expressible inside a valid suite file. A truly invalid UTF-8 octet
sequence requires a separate byte-oriented suite. Each <tt>expected</tt> object uses
the generic result-form names defined by this document; comparisons of merged
and conflict values occur after normalization.</t>
      <t>Concrete resource ceilings are implementation policy, so this appendix does
not assign one universal N/N+1 resource-limit vector. Policy-specific suites
can add boundary vectors bound to their resource-policy identifier and exact
ceilings.</t>
      <section anchor="successful-merge-vectors">
        <name>Successful Merge Vectors</name>
        <ul spacing="normal">
          <li>
            <t><tt>no-change</tt>: base <tt>{"x":1}</tt>; source <tt>{"x":1.0}</tt>; target
<tt>{"x":1e0}</tt>; merged <tt>{"x":1}</tt>.</t>
          </li>
          <li>
            <t><tt>source-only</tt>: base <tt>{"x":1}</tt>; source <tt>{"x":2}</tt>; target <tt>{"x":1}</tt>;
merged <tt>{"x":2}</tt>.</t>
          </li>
          <li>
            <t><tt>target-only</tt>: base <tt>{"x":1}</tt>; source <tt>{"x":1}</tt>; target <tt>{"x":2}</tt>;
merged <tt>{"x":2}</tt>.</t>
          </li>
          <li>
            <t><tt>agreement</tt>: base <tt>{"x":1}</tt>; source <tt>{"x":2}</tt>; target <tt>{"x":2.0}</tt>;
merged <tt>{"x":2}</tt>.</t>
          </li>
          <li>
            <t><tt>independent-members</tt>: base <tt>{"a":0,"b":0}</tt>; source
<tt>{"a":1,"b":0}</tt>; target <tt>{"a":0,"b":2}</tt>; merged <tt>{"a":1,"b":2}</tt>.</t>
          </li>
          <li>
            <t><tt>source-delete</tt>: base <tt>{"x":1}</tt>; source <tt>{}</tt>; target <tt>{"x":1}</tt>;
merged <tt>{}</tt>.</t>
          </li>
          <li>
            <t><tt>target-delete</tt>: base <tt>{"x":1}</tt>; source <tt>{"x":1}</tt>; target <tt>{}</tt>;
merged <tt>{}</tt>.</t>
          </li>
          <li>
            <t><tt>both-delete</tt>: base <tt>{"x":1}</tt>; source <tt>{}</tt>; target <tt>{}</tt>; merged <tt>{}</tt>.</t>
          </li>
          <li>
            <t><tt>one-sided-add-null</tt>: base <tt>{}</tt>; source <tt>{"x":null}</tt>; target <tt>{}</tt>;
merged <tt>{"x":null}</tt>.</t>
          </li>
          <li>
            <t><tt>target-only-add</tt>: base <tt>{}</tt>; source <tt>{}</tt>; target <tt>{"x":1}</tt>; merged
<tt>{"x":1}</tt>.</t>
          </li>
          <li>
            <t><tt>agreed-add</tt>: base <tt>{}</tt>; source <tt>{"x":1}</tt>; target <tt>{"x":1.0}</tt>; merged
<tt>{"x":1}</tt>.</t>
          </li>
          <li>
            <t><tt>agreed-type-change</tt>: base <tt>1</tt>; source <tt>{"x":2}</tt>; target <tt>{"x":2}</tt>;
merged <tt>{"x":2}</tt>.</t>
          </li>
          <li>
            <t><tt>one-sided-type-change</tt>: base <tt>1</tt>; source <tt>1.0</tt>; target <tt>{"x":2}</tt>;
merged <tt>{"x":2}</tt>.</t>
          </li>
          <li>
            <t><tt>large-integer-normalization</tt>: base <tt>9007199254740992</tt>; source
<tt>9007199254740993</tt>; target <tt>3</tt>; merged <tt>3</tt>.</t>
          </li>
          <li>
            <t><tt>negative-zero-normalization</tt>: base <tt>{"x":-0}</tt>; source <tt>{"x":0.0}</tt>;
target <tt>{"x":-0.0}</tt>; merged <tt>{"x":0}</tt>. A serialized merged result <bcp14>MUST
NOT</bcp14> contain negative zero.</t>
          </li>
          <li>
            <t><tt>subnormal-equality</tt>: base <tt>5e-324</tt>; source <tt>4.9e-324</tt>; target <tt>1</tt>;
merged <tt>1</tt> because the first two tokens convert to the same binary64 value.</t>
          </li>
        </ul>
      </section>
      <section anchor="conflict-vectors">
        <name>Conflict Vectors</name>
        <t>Each expected conflict below is the sole conflict unless an ordered path list
is shown.</t>
        <ul spacing="normal">
          <li>
            <t><tt>scalar-divergence</tt>: base <tt>1</tt>; source <tt>2</tt>; target <tt>3</tt>; kind
<tt>concurrent_value_change</tt>; path <tt>""</tt>.</t>
          </li>
          <li>
            <t><tt>type-divergence</tt>: base <tt>1</tt>; source <tt>"source"</tt>; target <tt>{"x":2}</tt>; kind
<tt>concurrent_type_change</tt>; path <tt>""</tt>.</t>
          </li>
          <li>
            <t><tt>add-add</tt>: base <tt>{}</tt>; source <tt>{"x":1}</tt>; target <tt>{"x":2}</tt>; kind
<tt>add_add</tt>; path <tt>/x</tt>.</t>
          </li>
          <li>
            <t><tt>delete-edit</tt>: base <tt>{"x":1}</tt>; source <tt>{}</tt>; target <tt>{"x":2}</tt>; kind
<tt>source_delete_target_edit</tt>; path <tt>/x</tt>.</t>
          </li>
          <li>
            <t><tt>edit-delete</tt>: base <tt>{"x":1}</tt>; source <tt>{"x":2}</tt>; target <tt>{}</tt>; kind
<tt>source_edit_target_delete</tt>; path <tt>/x</tt>.</t>
          </li>
          <li>
            <t><tt>divergent-added-objects</tt>: base <tt>{}</tt>; source <tt>{"x":{"a":1}}</tt>; target
<tt>{"x":{"b":2}}</tt>; kind <tt>add_add</tt>; path <tt>/x</tt>.</t>
          </li>
          <li>
            <t><tt>null-versus-delete</tt>: base <tt>{"x":1}</tt>; source <tt>{"x":null}</tt>; target <tt>{}</tt>;
kind <tt>source_edit_target_delete</tt>; path <tt>/x</tt>.</t>
          </li>
          <li>
            <t><tt>add-add-null</tt>: base <tt>{}</tt>; source <tt>{"x":null}</tt>; target <tt>{"x":1}</tt>; kind
<tt>add_add</tt>; path <tt>/x</tt>.</t>
          </li>
          <li>
            <t><tt>nested-type-conflict</tt>: base <tt>{"a":{"b":1}}</tt>; source
<tt>{"a":{"b":"source"}}</tt>; target <tt>{"a":{"b":true}}</tt>; kind
<tt>concurrent_type_change</tt>; path <tt>/a/b</tt>.</t>
          </li>
        </ul>
        <t>The <tt>decoded-token-sequence-order</tt> vector distinguishes decoded token-sequence
ordering from rendered-pointer-string ordering:</t>
        <sourcecode type="json"><![CDATA[
{
  "base":   {"a":{"b":0},"a!b":0},
  "source": {"a":{"b":1},"a!b":1},
  "target": {"a":{"b":2},"a!b":2},
  "expected_status": "conflict",
  "expected_paths": ["/a/b","/a!b"]
}
]]></sourcecode>
        <t>The first decoded token <tt>a</tt> is a prefix of <tt>a!b</tt>, so <tt>/a/b</tt> sorts first.
Comparing the rendered pointer strings would incorrectly put <tt>/a!b</tt> first
because <tt>!</tt> precedes <tt>/</tt>.</t>
        <t>The <tt>empty-member-name-order</tt> vector uses base <tt>{"":0,"a":0}</tt>, source
<tt>{"":1,"a":1}</tt>, and target <tt>{"":2,"a":2}</tt>. Its expected conflict paths
are <tt>["/","/a"]</tt>; the first pointer contains one empty decoded token.</t>
        <t>The <tt>escaped-path-order</tt> vector checks escaped paths and deterministic
ordering:</t>
        <sourcecode type="json"><![CDATA[
{
  "base":   {"z":0,"a/b":0,"m~n":0},
  "source": {"z":1,"a/b":1,"m~n":1},
  "target": {"z":2,"a/b":2,"m~n":2},
  "expected_status": "conflict",
  "expected_paths": ["/a~1b","/m~0n","/z"]
}
]]></sourcecode>
        <t>All three conflicts have kind <tt>concurrent_value_change</tt>.</t>
        <t>The <tt>utf16-path-order</tt> vector makes the UTF-16 ordering rule visible when a
supplementary character and a Basic Multilingual Plane character are compared:</t>
        <sourcecode type="json"><![CDATA[
{
  "base":   {"\ue000":0,"\ud83d\ude00":0},
  "source": {"\ue000":1,"\ud83d\ude00":1},
  "target": {"\ue000":2,"\ud83d\ude00":2},
  "expected_status": "conflict",
  "expected_paths": ["/\ud83d\ude00","/\ue000"]
}
]]></sourcecode>
        <t>The grinning-face character sorts first because its leading UTF-16 code unit
is <tt>0xD83D</tt>, which is less than <tt>0xE000</tt>.</t>
      </section>
      <section anchor="unsupported-array-vectors">
        <name>Unsupported-Array Vectors</name>
        <ul spacing="normal">
          <li>
            <t><tt>root-array</tt>: base <tt>[]</tt>; source <tt>{}</tt>; target <tt>{}</tt>; side <tt>base</tt>; path <tt>""</tt>.</t>
          </li>
          <li>
            <t><tt>nested-array</tt>: base <tt>{"items":null}</tt>; source <tt>{"items":[1]}</tt>; target
<tt>{"items":null}</tt>; side <tt>source</tt>; path <tt>/items</tt>.</t>
          </li>
          <li>
            <t><tt>equal-arrays</tt>: all three inputs are <tt>{"items":[1]}</tt>; side <tt>base</tt>; path
<tt>/items</tt>.</t>
          </li>
          <li>
            <t><tt>least-array-path</tt>: base <tt>{"z":[],"a":{"items":[]}}</tt>; source <tt>{}</tt>;
target <tt>{}</tt>; side <tt>base</tt>; path <tt>/a/items</tt>.</t>
          </li>
        </ul>
      </section>
      <section anchor="invalid-input-precedence-vectors">
        <name>Invalid-Input Precedence Vectors</name>
        <ul spacing="normal">
          <li>
            <t><tt>invalid-base-first</tt>: base <tt>{broken</tt>; source <tt>[]</tt>; target <tt>{}</tt>; status
<tt>invalid_input</tt>; side <tt>base</tt>; code <tt>invalid_json</tt>; path <tt>""</tt>.</t>
          </li>
          <li>
            <t><tt>source-array-before-target</tt>: base <tt>{}</tt>; source <tt>[]</tt>; target <tt>{broken</tt>;
status <tt>unsupported</tt>; side <tt>source</tt>; code <tt>arrays_not_supported</tt>.</t>
          </li>
          <li>
            <t><tt>decoded-duplicate</tt>: base <tt>{"a":1,"\u0061":2}</tt>; source <tt>{}</tt>; target
<tt>{}</tt>; status <tt>invalid_input</tt>; side <tt>base</tt>; code <tt>duplicate_object_name</tt>.</t>
          </li>
          <li>
            <t><tt>number-overflow</tt>: base <tt>{}</tt>; source <tt>1e309</tt>; target <tt>{}</tt>; status
<tt>invalid_input</tt>; side <tt>source</tt>; code <tt>number_out_of_binary64_range</tt>.</t>
          </li>
          <li>
            <t><tt>nested-decoded-duplicate-path</tt>: base
<tt>{"outer":{"a":1,"\u0061":2}}</tt>; source <tt>{}</tt>; target <tt>{}</tt>; status
<tt>invalid_input</tt>; side <tt>base</tt>; code <tt>duplicate_object_name</tt>; path <tt>/outer</tt>.</t>
          </li>
          <li>
            <t><tt>nested-number-overflow-path</tt>: base <tt>{}</tt>; source
<tt>{"outer":{"n":1e309}}</tt>; target <tt>{}</tt>; status <tt>invalid_input</tt>; side
<tt>source</tt>; code <tt>number_out_of_binary64_range</tt>; path <tt>/outer/n</tt>.</t>
          </li>
          <li>
            <t><tt>leading-bom</tt>: base is U+FEFF followed by <tt>{}</tt>; source <tt>{}</tt>; target <tt>{}</tt>;
status <tt>invalid_input</tt>; side <tt>base</tt>; code <tt>invalid_json</tt>; path <tt>""</tt>.</t>
          </li>
          <li>
            <t><tt>lone-surrogate-escape</tt>: base <tt>"\uD800"</tt>; source <tt>{}</tt>; target <tt>{}</tt>; status
<tt>invalid_input</tt>; side <tt>base</tt>; code <tt>invalid_json</tt>; path <tt>""</tt>.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="design-rationale">
      <name>Design Rationale</name>
      <section anchor="why-arrays-fail-closed">
        <name>Why Arrays Fail Closed</name>
        <t>An array can represent a sequence, set, keyed collection, priority list,
ordered log, tuple, or application-specific structure. A generic processor
cannot infer whether index identity, element identity, order, or movement is
semantically significant. Returning a typed unsupported result avoids
standardizing an unsafe guess and leaves room for separately identified array
profiles.</t>
      </section>
      <section anchor="why-divergent-additions-do-not-recurse">
        <name>Why Divergent Additions Do Not Recurse</name>
        <t>When a member is missing from base, there is no shared object at that path.
Recursively merging two divergent added objects against an invented empty base
would turn independent creation into implicit agreement. Reporting <tt>add_add</tt>
keeps that decision visible to application policy.</t>
      </section>
      <section anchor="why-merge-is-value-deterministic-rather-than-byte-canonical">
        <name>Why Merge Is Value-Deterministic Rather Than Byte-Canonical</name>
        <t>JSON permits insignificant whitespace, multiple number spellings, and
unordered object members. This document fixes normalized values and diagnostic
sequence order, which are the interoperability requirements for merge. It
leaves byte canonicalization and content identity to specifications designed
for those purposes.</t>
      </section>
      <section anchor="why-utf-16-code-unit-ordering">
        <name>Why UTF-16 Code-Unit Ordering</name>
        <t>The comparator for one decoded pointer token aligns with the property-name
comparator defined by JCS. It also maps directly to string representations in
ECMAScript, Java, and .NET. Runtimes that natively compare Unicode scalar
values or UTF-8 bytes need an explicit UTF-16 conversion or equivalent
code-unit iterator. This comparator alignment permits reuse of tested sorting
routines, but complete paths are ordered as token sequences by this document
and JCS remains unnecessary for merge processing.</t>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
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
KBeU2/2/N3t3cs/DAAA=

-->

</rfc>
