From b61109bc90e20169740ba2377849c953808b641f Mon Sep 17 00:00:00 2001 From: Lilleman auf Larv Date: Mon, 24 Aug 2026 14:21:40 +0200 Subject: [PATCH 1/2] Corpus 1d3: the inline-node pairs, the content slot and the whitespace spelling --- .../round-trip/inline-nodes/content-slot.json | 53 +++++++++++ .../round-trip/inline-nodes/content-slot.md | 5 + corpus/round-trip/inline-nodes/date.json | 36 +++++++ corpus/round-trip/inline-nodes/date.md | 1 + corpus/round-trip/inline-nodes/emoji.json | 28 ++++++ corpus/round-trip/inline-nodes/emoji.md | 1 + .../round-trip/inline-nodes/inline-card.json | 41 ++++++++ corpus/round-trip/inline-nodes/inline-card.md | 3 + .../inline-nodes/mark-content-slot.json | 27 ++++++ .../inline-nodes/mark-content-slot.md | 1 + .../round-trip/inline-nodes/mark-nesting.json | 48 ++++++++++ .../round-trip/inline-nodes/mark-nesting.md | 3 + corpus/round-trip/inline-nodes/marks.json | 93 +++++++++++++++++++ corpus/round-trip/inline-nodes/marks.md | 3 + .../round-trip/inline-nodes/media-inline.json | 55 +++++++++++ .../round-trip/inline-nodes/media-inline.md | 3 + corpus/round-trip/inline-nodes/mention.json | 29 ++++++ corpus/round-trip/inline-nodes/mention.md | 1 + corpus/round-trip/inline-nodes/status.json | 28 ++++++ corpus/round-trip/inline-nodes/status.md | 1 + .../inline-nodes/text-whitespace.json | 55 +++++++++++ .../inline-nodes/text-whitespace.md | 7 ++ 22 files changed, 522 insertions(+) create mode 100644 corpus/round-trip/inline-nodes/content-slot.json create mode 100644 corpus/round-trip/inline-nodes/content-slot.md create mode 100644 corpus/round-trip/inline-nodes/date.json create mode 100644 corpus/round-trip/inline-nodes/date.md create mode 100644 corpus/round-trip/inline-nodes/emoji.json create mode 100644 corpus/round-trip/inline-nodes/emoji.md create mode 100644 corpus/round-trip/inline-nodes/inline-card.json create mode 100644 corpus/round-trip/inline-nodes/inline-card.md create mode 100644 corpus/round-trip/inline-nodes/mark-content-slot.json create mode 100644 corpus/round-trip/inline-nodes/mark-content-slot.md create mode 100644 corpus/round-trip/inline-nodes/mark-nesting.json create mode 100644 corpus/round-trip/inline-nodes/mark-nesting.md create mode 100644 corpus/round-trip/inline-nodes/marks.json create mode 100644 corpus/round-trip/inline-nodes/marks.md create mode 100644 corpus/round-trip/inline-nodes/media-inline.json create mode 100644 corpus/round-trip/inline-nodes/media-inline.md create mode 100644 corpus/round-trip/inline-nodes/mention.json create mode 100644 corpus/round-trip/inline-nodes/mention.md create mode 100644 corpus/round-trip/inline-nodes/status.json create mode 100644 corpus/round-trip/inline-nodes/status.md create mode 100644 corpus/round-trip/inline-nodes/text-whitespace.json create mode 100644 corpus/round-trip/inline-nodes/text-whitespace.md diff --git a/corpus/round-trip/inline-nodes/content-slot.json b/corpus/round-trip/inline-nodes/content-slot.json new file mode 100644 index 0000000..0f0148e --- /dev/null +++ b/corpus/round-trip/inline-nodes/content-slot.json @@ -0,0 +1,53 @@ +{ + "content": [ + { + "content": [ + { + "attrs": { + "color": "yellow", + "text": "In review" + }, + "type": "status" + }, + { + "text": " carries the text in the slot.", + "type": "text" + } + ], + "type": "paragraph" + }, + { + "content": [ + { + "attrs": { + "color": "neutral" + }, + "type": "status" + }, + { + "text": " carries no text attribute.", + "type": "text" + } + ], + "type": "paragraph" + }, + { + "content": [ + { + "attrs": { + "color": "neutral", + "text": "" + }, + "type": "status" + }, + { + "text": " carries the empty string.", + "type": "text" + } + ], + "type": "paragraph" + } + ], + "type": "doc", + "version": 1 +} diff --git a/corpus/round-trip/inline-nodes/content-slot.md b/corpus/round-trip/inline-nodes/content-slot.md new file mode 100644 index 0000000..2d247db --- /dev/null +++ b/corpus/round-trip/inline-nodes/content-slot.md @@ -0,0 +1,5 @@ +:status[In review]{color=yellow} carries the text in the slot. + +:status{color=neutral} carries no text attribute. + +:status[]{color=neutral} carries the empty string. diff --git a/corpus/round-trip/inline-nodes/date.json b/corpus/round-trip/inline-nodes/date.json new file mode 100644 index 0000000..32f135a --- /dev/null +++ b/corpus/round-trip/inline-nodes/date.json @@ -0,0 +1,36 @@ +{ + "content": [ + { + "content": [ + { + "text": "Due ", + "type": "text" + }, + { + "attrs": { + "timestamp": "1756080000000" + }, + "type": "date" + }, + { + "text": ", reviewed ", + "type": "text" + }, + { + "attrs": { + "localId": "01a033ab-781c-7f79-9c8a-fb63356c1cad", + "timestamp": "1735689600000" + }, + "type": "date" + }, + { + "text": ".", + "type": "text" + } + ], + "type": "paragraph" + } + ], + "type": "doc", + "version": 1 +} diff --git a/corpus/round-trip/inline-nodes/date.md b/corpus/round-trip/inline-nodes/date.md new file mode 100644 index 0000000..ef5707d --- /dev/null +++ b/corpus/round-trip/inline-nodes/date.md @@ -0,0 +1 @@ +Due :date{timestamp=1756080000000}, reviewed :date{localId=01a033ab-781c-7f79-9c8a-fb63356c1cad timestamp=1735689600000}. diff --git a/corpus/round-trip/inline-nodes/emoji.json b/corpus/round-trip/inline-nodes/emoji.json new file mode 100644 index 0000000..941e5ae --- /dev/null +++ b/corpus/round-trip/inline-nodes/emoji.json @@ -0,0 +1,28 @@ +{ + "content": [ + { + "content": [ + { + "text": "Shipped ", + "type": "text" + }, + { + "attrs": { + "id": "1f389", + "localId": "01a033ad-f00e-7acb-a009-37ddd25d7949", + "shortName": ":tada:", + "text": "πŸŽ‰" + }, + "type": "emoji" + }, + { + "text": " on Friday.", + "type": "text" + } + ], + "type": "paragraph" + } + ], + "type": "doc", + "version": 1 +} diff --git a/corpus/round-trip/inline-nodes/emoji.md b/corpus/round-trip/inline-nodes/emoji.md new file mode 100644 index 0000000..d3f6533 --- /dev/null +++ b/corpus/round-trip/inline-nodes/emoji.md @@ -0,0 +1 @@ +Shipped :emoji[πŸŽ‰]{id=1f389 localId=01a033ad-f00e-7acb-a009-37ddd25d7949 shortName=":tada:"} on Friday. diff --git a/corpus/round-trip/inline-nodes/inline-card.json b/corpus/round-trip/inline-nodes/inline-card.json new file mode 100644 index 0000000..c3fa2b9 --- /dev/null +++ b/corpus/round-trip/inline-nodes/inline-card.json @@ -0,0 +1,41 @@ +{ + "content": [ + { + "content": [ + { + "text": "Tracking ", + "type": "text" + }, + { + "attrs": { + "url": "https://example.com/browse/ABC-123" + }, + "type": "inlineCard" + }, + { + "text": " this week.", + "type": "text" + } + ], + "type": "paragraph" + }, + { + "content": [ + { + "attrs": { + "data": { + "@type": "Link", + "name": "Torque spec", + "url": "https://example.com/torque" + }, + "localId": "01a033ad-1fa5-76fa-aad0-2e56a17d76aa" + }, + "type": "inlineCard" + } + ], + "type": "paragraph" + } + ], + "type": "doc", + "version": 1 +} diff --git a/corpus/round-trip/inline-nodes/inline-card.md b/corpus/round-trip/inline-nodes/inline-card.md new file mode 100644 index 0000000..2ef9f06 --- /dev/null +++ b/corpus/round-trip/inline-nodes/inline-card.md @@ -0,0 +1,3 @@ +Tracking :inlineCard{url="https://example.com/browse/ABC-123"} this week. + +:inlineCard{data="{\"@type\":\"Link\",\"name\":\"Torque spec\",\"url\":\"https://example.com/torque\"}" localId=01a033ad-1fa5-76fa-aad0-2e56a17d76aa} diff --git a/corpus/round-trip/inline-nodes/mark-content-slot.json b/corpus/round-trip/inline-nodes/mark-content-slot.json new file mode 100644 index 0000000..736b08a --- /dev/null +++ b/corpus/round-trip/inline-nodes/mark-content-slot.json @@ -0,0 +1,27 @@ +{ + "content": [ + { + "content": [ + { + "attrs": { + "id": "01a032c3-7a7c-775f-a730-2d79351338b4", + "text": "@Mikael" + }, + "marks": [ + { + "type": "strong" + } + ], + "type": "mention" + }, + { + "text": " owns the rebuild.", + "type": "text" + } + ], + "type": "paragraph" + } + ], + "type": "doc", + "version": 1 +} diff --git a/corpus/round-trip/inline-nodes/mark-content-slot.md b/corpus/round-trip/inline-nodes/mark-content-slot.md new file mode 100644 index 0000000..83ee860 --- /dev/null +++ b/corpus/round-trip/inline-nodes/mark-content-slot.md @@ -0,0 +1 @@ +**:mention[@Mikael]{id=01a032c3-7a7c-775f-a730-2d79351338b4}** owns the rebuild. diff --git a/corpus/round-trip/inline-nodes/mark-nesting.json b/corpus/round-trip/inline-nodes/mark-nesting.json new file mode 100644 index 0000000..07f6cf8 --- /dev/null +++ b/corpus/round-trip/inline-nodes/mark-nesting.json @@ -0,0 +1,48 @@ +{ + "content": [ + { + "content": [ + { + "marks": [ + { + "type": "em" + }, + { + "type": "underline" + } + ], + "text": "Rewired", + "type": "text" + }, + { + "text": " at the mains.", + "type": "text" + } + ], + "type": "paragraph" + }, + { + "content": [ + { + "marks": [ + { + "type": "underline" + }, + { + "type": "em" + } + ], + "text": "Rewound", + "type": "text" + }, + { + "text": " by hand.", + "type": "text" + } + ], + "type": "paragraph" + } + ], + "type": "doc", + "version": 1 +} diff --git a/corpus/round-trip/inline-nodes/mark-nesting.md b/corpus/round-trip/inline-nodes/mark-nesting.md new file mode 100644 index 0000000..e0a2959 --- /dev/null +++ b/corpus/round-trip/inline-nodes/mark-nesting.md @@ -0,0 +1,3 @@ +_:underline[Rewired]_ at the mains. + +:underline[_Rewound_] by hand. diff --git a/corpus/round-trip/inline-nodes/marks.json b/corpus/round-trip/inline-nodes/marks.json new file mode 100644 index 0000000..a07f097 --- /dev/null +++ b/corpus/round-trip/inline-nodes/marks.json @@ -0,0 +1,93 @@ +{ + "content": [ + { + "content": [ + { + "marks": [ + { + "attrs": { + "color": "#ae2e24" + }, + "type": "textColor" + } + ], + "text": "Overdue", + "type": "text" + }, + { + "text": " since the H", + "type": "text" + }, + { + "marks": [ + { + "attrs": { + "type": "sub" + }, + "type": "subsup" + } + ], + "text": "2", + "type": "text" + }, + { + "text": "O test, ", + "type": "text" + }, + { + "marks": [ + { + "type": "underline" + } + ], + "text": "signed", + "type": "text" + }, + { + "text": " on the 2", + "type": "text" + }, + { + "marks": [ + { + "attrs": { + "type": "sup" + }, + "type": "subsup" + } + ], + "text": "nd", + "type": "text" + }, + { + "text": " of May.", + "type": "text" + } + ], + "type": "paragraph" + }, + { + "content": [ + { + "attrs": { + "collection": "contentId-98237", + "id": "01a032c3-7a90-70c9-88f6-c60f710eda07" + }, + "marks": [ + { + "attrs": { + "color": "#091e42", + "size": 2 + }, + "type": "border" + } + ], + "type": "mediaInline" + } + ], + "type": "paragraph" + } + ], + "type": "doc", + "version": 1 +} diff --git a/corpus/round-trip/inline-nodes/marks.md b/corpus/round-trip/inline-nodes/marks.md new file mode 100644 index 0000000..f563cf0 --- /dev/null +++ b/corpus/round-trip/inline-nodes/marks.md @@ -0,0 +1,3 @@ +:textColor[Overdue]{color="#ae2e24"} since the H:subsup[2]{type=sub}O test, :underline[signed] on the 2:subsup[nd]{type=sup} of May. + +:border[:mediaInline{collection=contentId-98237 id=01a032c3-7a90-70c9-88f6-c60f710eda07}]{color="#091e42" size=2} diff --git a/corpus/round-trip/inline-nodes/media-inline.json b/corpus/round-trip/inline-nodes/media-inline.json new file mode 100644 index 0000000..387a602 --- /dev/null +++ b/corpus/round-trip/inline-nodes/media-inline.json @@ -0,0 +1,55 @@ +{ + "content": [ + { + "content": [ + { + "text": "See ", + "type": "text" + }, + { + "attrs": { + "alt": "Torque chart", + "collection": "contentId-98237", + "height": 24, + "id": "01a033ae-69a3-7411-b388-a37f9d103ded", + "type": "file", + "width": 24 + }, + "type": "mediaInline" + }, + { + "text": " mid-sentence.", + "type": "text" + } + ], + "type": "paragraph" + }, + { + "content": [ + { + "text": "Or ", + "type": "text" + }, + { + "attrs": { + "data": { + "fileName": "budget.pdf", + "fileSize": 18432 + }, + "localId": "01a033b1-b5a0-7a98-9e9c-48192bd30ac0", + "occurrenceKey": "01a033ab-bab8-74b0-9ec8-b3419b000189", + "type": "image" + }, + "type": "mediaInline" + }, + { + "text": " beside the text.", + "type": "text" + } + ], + "type": "paragraph" + } + ], + "type": "doc", + "version": 1 +} diff --git a/corpus/round-trip/inline-nodes/media-inline.md b/corpus/round-trip/inline-nodes/media-inline.md new file mode 100644 index 0000000..64cd79b --- /dev/null +++ b/corpus/round-trip/inline-nodes/media-inline.md @@ -0,0 +1,3 @@ +See :mediaInline{alt="Torque chart" collection=contentId-98237 height=24 id=01a033ae-69a3-7411-b388-a37f9d103ded type=file width=24} mid-sentence. + +Or :mediaInline{data="{\"fileName\":\"budget.pdf\",\"fileSize\":18432}" localId=01a033b1-b5a0-7a98-9e9c-48192bd30ac0 occurrenceKey=01a033ab-bab8-74b0-9ec8-b3419b000189 type=image} beside the text. diff --git a/corpus/round-trip/inline-nodes/mention.json b/corpus/round-trip/inline-nodes/mention.json new file mode 100644 index 0000000..6d46c36 --- /dev/null +++ b/corpus/round-trip/inline-nodes/mention.json @@ -0,0 +1,29 @@ +{ + "content": [ + { + "content": [ + { + "text": "Ping ", + "type": "text" + }, + { + "attrs": { + "accessLevel": "CONTAINER", + "id": "01a032c3-7a7c-775f-a730-2d79351338b4", + "localId": "01a033ad-ecb7-7530-aa1c-ff25031e96e2", + "text": "@Mikael", + "userType": "DEFAULT" + }, + "type": "mention" + }, + { + "text": " before merging.", + "type": "text" + } + ], + "type": "paragraph" + } + ], + "type": "doc", + "version": 1 +} diff --git a/corpus/round-trip/inline-nodes/mention.md b/corpus/round-trip/inline-nodes/mention.md new file mode 100644 index 0000000..a39976c --- /dev/null +++ b/corpus/round-trip/inline-nodes/mention.md @@ -0,0 +1 @@ +Ping :mention[@Mikael]{accessLevel=CONTAINER id=01a032c3-7a7c-775f-a730-2d79351338b4 localId=01a033ad-ecb7-7530-aa1c-ff25031e96e2 userType=DEFAULT} before merging. diff --git a/corpus/round-trip/inline-nodes/status.json b/corpus/round-trip/inline-nodes/status.json new file mode 100644 index 0000000..f456b90 --- /dev/null +++ b/corpus/round-trip/inline-nodes/status.json @@ -0,0 +1,28 @@ +{ + "content": [ + { + "content": [ + { + "text": "The rebuild is ", + "type": "text" + }, + { + "attrs": { + "color": "yellow", + "localId": "01a033a7-d68a-71a9-a58a-edf5757ad176", + "style": "bold", + "text": "In review" + }, + "type": "status" + }, + { + "text": " until Friday.", + "type": "text" + } + ], + "type": "paragraph" + } + ], + "type": "doc", + "version": 1 +} diff --git a/corpus/round-trip/inline-nodes/status.md b/corpus/round-trip/inline-nodes/status.md new file mode 100644 index 0000000..ed01471 --- /dev/null +++ b/corpus/round-trip/inline-nodes/status.md @@ -0,0 +1 @@ +The rebuild is :status[In review]{color=yellow localId=01a033a7-d68a-71a9-a58a-edf5757ad176 style=bold} until Friday. diff --git a/corpus/round-trip/inline-nodes/text-whitespace.json b/corpus/round-trip/inline-nodes/text-whitespace.json new file mode 100644 index 0000000..081a230 --- /dev/null +++ b/corpus/round-trip/inline-nodes/text-whitespace.json @@ -0,0 +1,55 @@ +{ + "content": [ + { + "content": [ + { + "text": " Two leading spaces held, and one text node split\nover two lines.", + "type": "text" + } + ], + "type": "paragraph" + }, + { + "content": [ + { + "text": "Trailing space held ", + "type": "text" + } + ], + "type": "paragraph" + }, + { + "content": [ + { + "text": "\tTabbed at the block edge.", + "type": "text" + } + ], + "type": "paragraph" + }, + { + "content": [ + { + "text": "Kept ", + "type": "text" + }, + { + "marks": [ + { + "type": "em" + } + ], + "text": " inside ", + "type": "text" + }, + { + "text": ", exactly.", + "type": "text" + } + ], + "type": "paragraph" + } + ], + "type": "doc", + "version": 1 +} diff --git a/corpus/round-trip/inline-nodes/text-whitespace.md b/corpus/round-trip/inline-nodes/text-whitespace.md new file mode 100644 index 0000000..35408a1 --- /dev/null +++ b/corpus/round-trip/inline-nodes/text-whitespace.md @@ -0,0 +1,7 @@ +:text{text=" "}Two leading spaces held, and one text node split:text{text="\n"}over two lines. + +Trailing space held:text{text=" "} + +:text{text="\t"}Tabbed at the block edge. + +Kept _:text{text=" "}inside:text{text=" "}_, exactly. From 2fbe913101bbd9908bece094d243a62fa13d0f5d Mon Sep 17 00:00:00 2001 From: Lilleman auf Larv Date: Mon, 24 Aug 2026 14:39:18 +0200 Subject: [PATCH 2/2] Pin the mark run and a line break's whitespace edges --- corpus/round-trip/inline-nodes/marks.json | 28 ++++++++++++++-- corpus/round-trip/inline-nodes/marks.md | 2 +- .../inline-nodes/text-whitespace.json | 32 +++++++++++++++++++ .../inline-nodes/text-whitespace.md | 6 ++++ todo.md | 12 ++++--- 5 files changed, 72 insertions(+), 8 deletions(-) diff --git a/corpus/round-trip/inline-nodes/marks.json b/corpus/round-trip/inline-nodes/marks.json index a07f097..fb563d3 100644 --- a/corpus/round-trip/inline-nodes/marks.json +++ b/corpus/round-trip/inline-nodes/marks.json @@ -11,7 +11,19 @@ "type": "textColor" } ], - "text": "Overdue", + "text": "Over", + "type": "text" + }, + { + "marks": [ + { + "attrs": { + "color": "#a54800" + }, + "type": "textColor" + } + ], + "text": "due", "type": "text" }, { @@ -40,9 +52,21 @@ "type": "underline" } ], - "text": "signed", + "text": "signed by ", "type": "text" }, + { + "attrs": { + "id": "01a032c3-7a7c-775f-a730-2d79351338b4", + "text": "@Mikael" + }, + "marks": [ + { + "type": "underline" + } + ], + "type": "mention" + }, { "text": " on the 2", "type": "text" diff --git a/corpus/round-trip/inline-nodes/marks.md b/corpus/round-trip/inline-nodes/marks.md index f563cf0..c69b440 100644 --- a/corpus/round-trip/inline-nodes/marks.md +++ b/corpus/round-trip/inline-nodes/marks.md @@ -1,3 +1,3 @@ -:textColor[Overdue]{color="#ae2e24"} since the H:subsup[2]{type=sub}O test, :underline[signed] on the 2:subsup[nd]{type=sup} of May. +:textColor[Over]{color="#ae2e24"}:textColor[due]{color="#a54800"} since the H:subsup[2]{type=sub}O test, :underline[signed by :mention[@Mikael]{id=01a032c3-7a7c-775f-a730-2d79351338b4}] on the 2:subsup[nd]{type=sup} of May. :border[:mediaInline{collection=contentId-98237 id=01a032c3-7a90-70c9-88f6-c60f710eda07}]{color="#091e42" size=2} diff --git a/corpus/round-trip/inline-nodes/text-whitespace.json b/corpus/round-trip/inline-nodes/text-whitespace.json index 081a230..f6d9a67 100644 --- a/corpus/round-trip/inline-nodes/text-whitespace.json +++ b/corpus/round-trip/inline-nodes/text-whitespace.json @@ -27,6 +27,38 @@ ], "type": "paragraph" }, + { + "content": [ + { + "text": "Space before the break ", + "type": "text" + }, + { + "type": "hardBreak" + }, + { + "text": "survives.", + "type": "text" + } + ], + "type": "paragraph" + }, + { + "content": [ + { + "text": "Space after the break", + "type": "text" + }, + { + "type": "hardBreak" + }, + { + "text": " survives too.", + "type": "text" + } + ], + "type": "paragraph" + }, { "content": [ { diff --git a/corpus/round-trip/inline-nodes/text-whitespace.md b/corpus/round-trip/inline-nodes/text-whitespace.md index 35408a1..b6d0163 100644 --- a/corpus/round-trip/inline-nodes/text-whitespace.md +++ b/corpus/round-trip/inline-nodes/text-whitespace.md @@ -4,4 +4,10 @@ Trailing space held:text{text=" "} :text{text="\t"}Tabbed at the block edge. +Space before the break:text{text=" "}\ +survives. + +Space after the break\ +:text{text=" "}survives too. + Kept _:text{text=" "}inside:text{text=" "}_, exactly. diff --git a/todo.md b/todo.md index 6999e9a..b3a4132 100644 --- a/todo.md +++ b/todo.md @@ -45,7 +45,7 @@ detail is settled at its own milestone. pick here. - [x] **1d1 β€” The CommonMark subset**: blockquote, bulletList, codeBlock, heading, orderedList, paragraph, rule, listItem, hardBreak, text, code spans, and the `code`, `em`, `link`, - `strike` and `strong` marks β€” one mark per text node; nesting is 1d5's. + `strike` and `strong` marks β€” one mark per text node; nesting is 1d3's. - [x] **1d2 β€” Block nodes**: panel, expand/nestedExpand, the media family and the CommonMark image shape, both table forms, task and decision lists, layout, extensions, syncBlock β€” with the reserved `marks` attribute and the fence lengths nesting forces. @@ -54,10 +54,12 @@ detail is settled at its own milestone. `:text{text="…"}` whitespace spelling. - [ ] **1d4 β€” Opaque carry** (Β§3): an unknown node in both positions, the reserved `adf` info string, and the `codeBlock` whose language is `adf`. - - [ ] **1d5 β€” Carve-outs and combinations**: the three carve-outs and their escapes, mark - nesting order and the runs a carry breaks, attribute canonicalization, documents - combining nodes rather than isolating one, and a paragraph line inside a container body - shaped like a closing fence (`:::`, `::: x`). + - [ ] **1d5 β€” Carve-outs and combinations**: the three carve-outs and their escapes, mark runs β€” + the longest-run rule, attributes included β€” and the runs a carry breaks, a mark spelling + that cannot open where it sits (`un**-real**istic`; the spec owes the carry a trigger), + attribute canonicalization, a pipe cell's whitespace edges and `\u007c` for a `|` inside a + quoted attribute value, documents combining nodes rather than isolating one, and a paragraph + line inside a container body shaped like a closing fence (`:::`, `::: x`). - [ ] **1d6 β€” Input normalization**: one-way markdownβ†’ADF fixtures, not pairs β€” setext headings, indented code, loose lists, `*`/`+` bullets, entity references, soft wraps. - [ ] **1d7 β€” Error input**: also one-way, a markdown input per named error, asserting only