I guess now a misunderstanding has been introduced.
Let me try to describe what I mean with an example. It involves two repositories, A and B, where B is supposed to be the reverse variant of A. Each of these repositories contains only one file. I will describe the contents of this file using strings whose characters denote whole lines, so that, for example, the string XYZ
denotes three lines with contents X
, Y
, and Z
, respectively. The actual contents of the lines do not really matter, because, as you pointed out, operations like merging are content-agnostic. I’m rather using these letters to relate the contents of repository A to the contents of repository B: the line X
in A, for example, plays the same role as the line X
in B.
The initial contents of the file are XYZ
in repository A and ZYX
in repository B
. The internal representation is X
→ Y
→ Z
in A and Z
→ Y
→ X
in B
. Let’s call the state with the initial contents “state 1” for each of the repositories.
Now we insert a line U
between X
and Y
in both repositories to arrive at what I call “state 2a”. The contents become XUYZ
and ZYUX
, respectively. Internally, the paths X
→ U
→ Y
and Y
→ U
→ X
are added to the respective representations. Each of these paths has an edge before and an edge after U
, which stresses the fact that U
is inserted between X
and Y
as opposed to it being inserted after X
(or Y
) or before Y
(or X
). We see that the representation of file contents supports a direction-agnostic view of insertion (although edges still point in a certain direction, of course).
In parallel to making the change just described, we change state 1 in a different way. We delete Y
, which leads us to what I call “state 2b”. The contents become XZ
and ZX
, respectively. Internally, the edges X
→ Y
and Z
→ Y
are marked as “deleted”. The line Y
together with its immediate context is now represented by X
⤑ Y
→ Z
and Z
⤑ Y
→ X
, respectively. We see that the representation has a bias, as it favors the incoming edge over the outgoing edge for marking the deletion. As a result, the lines that are connected to Y
via the “deleted” edge are not the same in A and B (X
vs. Z
).
Finally, we merge states 2a and 2b to get into what I call “state 3”. I don’t know what kind of state the real Pijul would produce. However, it is at least conceivable to have a merging operation that treats repositories A and B differently at this point. The reason is that U
in state 2a sits between X
and Y
, which are connected by a “deleted” edge in repository A but by an ordinary edge in repository B. A merge operation might, for example, introduce a conflict in repository A but happily place U
before X
in repository B, leading to ZUX
.
Of course, I’m not claiming that this is indeed the way Pijul works. However, I’m wondering whether there are situations where Pijul shows such asymmetric behavior. That would be really unfortunate, in my opinion.
The representation of repository states has a bias for “deleted” markings, attaching them to incoming instead of outgoing edges. Since such a bias is not inherent to deletion as such, the current representation looks somehow wrong to me. That said, it might be perfectly okay to use it, but then it should be made sure, in my opinion, that the bias of the representation does not result in a bias of the observable behavior of Pijul.