Index: subversion/libsvn_wc/conflicts.c
===================================================================
--- subversion/libsvn_wc/conflicts.c	(revision 1595523)
+++ subversion/libsvn_wc/conflicts.c	(working copy)
@@ -1342,6 +1342,18 @@ generate_propconflict(svn_boolean_t *conflict_rema
          whichever older-value happens to be defined, so that the
          conflict-callback can still attempt a 3-way merge. */
 
+      /* ### Why are we choosing "whichever value happens to exist"?
+         ### If Alice changes "cat" to "dog" and Bob adds "green", we'd pass "cat" as the common ancestor;
+         ### If Alice adds "dog" and Bob changes "red" to "green", we'd pass "red" as the common ancestor.
+         ### API consumers can't tell the difference between these two situations.
+         ###
+         ### Right now, we are arbitrarily/lossily coercing a 4-way conflict into a 3-way one.
+         ### Instead, we should either be passing all four versions to the API consumer and let them sort it out,
+         ### or clearly clarify whether it is WORKING_VAL or INCOMING_NEW_VAL that CDESC->BASE_ABSPATH is associated with.
+         ###
+         ### I vote for the former (with clear documentation about 4-way conflicts, to help API consumers get it right).
+       */
+
       const svn_string_t *conflict_base_val = base_val ? base_val
                                                        : incoming_old_val;
       const char *file_name;
@@ -1375,14 +1387,26 @@ generate_propconflict(svn_boolean_t *conflict_rema
              compare. */
 
           if (working_val && svn_string_compare(base_val, working_val))
+            /* ### Why the condition on working_val != NULL?
+               ### NULL is a legitimate value here; even if one of the four values
+               ### is NULL, that's no reason to prefer one of the other values over it. */
             conflict_base_val = incoming_old_val;
           else
+            /* ### Here, would be better to just set CONFLICT_BASE_VAL to INCOMING_OLD_VAL.
+               ### (which allows folding both this if/else and the if/else containing it
+               ### into the single line "conflict_base_val = incoming_old_val;"),
+               ### since BASE_VAL is already known to the user and already available
+               ### via the BASE tree. */
             conflict_base_val = base_val;
         }
       else
         {
           conflict_base_val = base_val;
         }
+#if 0
+      /* ### I suggest to replace the above if/else by: */
+      conflict_base_val = base_val;
+#endif
 
       SVN_ERR(svn_io_write_unique(&file_name, dirpath, conflict_base_val->data,
                                   conflict_base_val->len,
@@ -1406,7 +1430,9 @@ generate_propconflict(svn_boolean_t *conflict_rema
           SVN_ERR(svn_diff_mem_string_output_merge2(mergestream, diff,
                    conflict_base_val, working_val,
                    incoming_new_val, NULL, NULL, NULL, NULL,
-                   svn_diff_conflict_display_modified_latest, scratch_pool));
+                   /* ### The effect of this can't be seen from the command-line client,
+                      ### but prop_tests.py 36 triggers this codepath. */
+                   svn_diff_conflict_display_modified_original_latest, scratch_pool));
           SVN_ERR(svn_stream_close(mergestream));
         }
     }

