@@ -193,7 +193,8 @@ More formally, a `mark` is a core with three [arms](/docs/glossary/arm/): `+grab
193193`+grow`, and `+grad`. In `+grab` is a series of functions to
194194convert from other `mark`s to the given `mark`. In `+grow` is a
195195series of functions to convert from the given `mark` to other
196−`mark`s. In `+grad` is `+diff`, `+pact`, `+join`, and `+mash`.
196+`mark`s. In `+grad` is `+diff`, `+pact`, `+join`, and `+mash`, and
197+`+form`.
197198
198199The types are as follows, in an informal pseudocode:
199200
@@ -207,6 +208,7 @@ The types are as follows, in an informal pseudocode:
207208 ++ txt: <mark-type> -> <txt>
208209 ...
209210 ++ grad
211+ ++ form: <mark-type>
210212 ++ diff: (<mark-type>, <mark-type>) -> <diff-type>
211213 ++ pact: (<mark-type>, <diff-type>) -> <mark-type>
212214 ++ join: (<diff-type>, <diff-type>) -> <diff-type> or NULL
@@ -220,12 +222,11 @@ in the general case.
220222In general, for a particular `mark`, the `+grab` and `+grow` entries
221223(if they exist) should be inverses of each other.
222224
223−In `+grad`, `+diff` takes two instances of a `mark` and produces
224−a diff of them. `+pact` takes an instance of a `mark` and patches
225−it with the given diff. `+join` takes two diffs and attempts to
226−merge them into a single diff. If there are conflicts, it
227−produces null. `+mash` takes two diffs and forces a merge,
228−annotating any conflicts.
225+In `+grad`, `+diff` takes two instances of a `mark` and produces a diff of them
226+whose `mark` is given by `+form`. `+pact` takes an instance of a `mark` and
227+patches it with the given diff. `+join` takes two diffs and attempts to merge
228+them into a single diff. If there are conflicts, it produces null. `+mash` takes
229+two diffs and forces a merge, annotating any conflicts.
229230
230231In general, if `+diff` called with A and B produces diff D, then
231232`+pact` called with A and D should produce B. Also, if `+join`