Settle the last four picks milestone 3 was holding
CI / gate (push) Successful in 6s

This commit is contained in:
2026-08-27 20:31:39 +02:00
parent 24d0b99ad7
commit 27a1b4e8e6
+30 -15
View File
@@ -215,9 +215,12 @@ detail is settled at its own milestone.
of continuing the paragraph CommonMark would fold it into. Claiming at block level is of continuing the paragraph CommonMark would fold it into. Claiming at block level is
already absolute, and this binds input alone — 2e1's `closing-fence-line` orders the already absolute, and this binds input alone — 2e1's `closing-fence-line` orders the
emitter's blockquote away from the edge either way — so `spec/flavour.md`'s claiming emitter's blockquote away from the edge either way — so `spec/flavour.md`'s claiming
paragraph gains the case here. 2b's tight-versus-blank separation lands here too, the one paragraph gains the case here. And 2b's tight-versus-blank, one answer for both
`nested-list-tight` waits on: how the parser reads a nested list after a block is the directions: the tight spelling stays wherever it parses back, a blank line going in only
spelling the emitter owes, one answer for both. where the nested list would be swallowed — `interruptsParagraph` inverted from a refusal
into the separation it names, and `spec/flavour.md`'s "none between a nested list and a
CommonMark block above it" gaining that exception. Every fixture spelled tight today keeps
its bytes, and `nested-list-tight` becomes a round-trip pair.
- [ ] **3d — Inline text.** The inline scanner over a block's content: backslash escapes, - [ ] **3d — Inline text.** The inline scanner over a block's content: backslash escapes,
entity references decoding to their characters, code spans and the literal they hold — entity references decoding to their characters, code spans and the literal they hold —
directive syntax and `~~` included — CommonMark's own hard breaks, a trailing backslash directive syntax and `~~` included — CommonMark's own hard breaks, a trailing backslash
@@ -229,17 +232,22 @@ detail is settled at its own milestone.
autolinks, and the image gap's named errors — a titled image, and one amid other text. autolinks, and the image gap's named errors — a titled image, and one amid other text.
`spec/flavour.md` does not yet pin `~`'s `can_open`/`can_close`, which is transcription `spec/flavour.md` does not yet pin `~`'s `can_open`/`can_close`, which is transcription
rather than a decision: `delimiterFlags` already gives it CommonMark flanking, as for `*`, rather than a decision: `delimiterFlags` already gives it CommonMark flanking, as for `*`,
and §8 fixed that the moment the emitter shipped. The decision here is 1d's deferred pair, and §8 fixed that the moment the emitter shipped.
which no other chunk forces and milestone 5 assumes landed — the spelling for a link **Settled** (the maintainer, 2026-08-27): 1d's deferred pair takes the backslash inside
destination holding an unbalanced `)` and for a title holding `"`, both refused today in the delimiters it already has — `[a](https://example.com/a\)b)` and
`corpus/unspellable/`. `[a](/url "He said \"hi\"")`. `<…>` stays reserved for the destination holding a space,
where nothing else works, so each construct keeps one spelling and a destination holding
both composes. `link-destination-parenthesis` and `link-title-quote` become round-trip
pairs.
- [ ] **3f — The directive grammar.** The three forms — inline `:name[content]{attrs}`, - [ ] **3f — The directive grammar.** The three forms — inline `:name[content]{attrs}`,
container `:::name arg {attrs}`, leaf `::name arg {attrs}` — the attribute grammar with container `:::name arg {attrs}`, leaf `::name arg {attrs}` — the attribute grammar with
its quoting and escapes, the fence-length and nesting rules, and the malformed list its quoting and escapes, the fence-length and nesting rules, and the malformed list
`spec/flavour.md` spells, each a named error. Precedence in input between a directive and `spec/flavour.md` spells, each a named error.
a code span, an entity or raw HTML written raw inside its attributes is unpinned — 2e3's **Settled** (the maintainer, 2026-08-27): the code span, the entity and raw HTML bind
escape keeps emitted output clear of that collision, so the pick binds input alone — and first in input, as 2e3 already assumed of the emitted side — a raw `` ` ``, `&`, `<` or
it lands here. `|` inside `{attrs}` breaks the directive and is a named error, the author writing the
`\u0060` the emitter writes. One precedence covers both directions, and CommonMark's own
ordering stays untouched.
- [ ] **3g — The node tables read backwards.** `commonmark-subset/` reads back, the first - [ ] **3g — The node tables read backwards.** `commonmark-subset/` reads back, the first
directory to. A parsed directive becomes its node: the name to the type and an unknown one directory to. A parsed directive becomes its node: the name to the type and an unknown one
to a named error, the arg to the attribute it names, each value to the type its section to a named error, the arg to the attribute it names, each value to the type its section
@@ -249,10 +257,17 @@ detail is settled at its own milestone.
settles, read from the other side; the `codeBlock` directive's fenced body and the settles, read from the other side; the `codeBlock` directive's fenced body and the
`language` attribute a bare fence leaves it; the media family's composition and the `language` attribute a bare fence leaves it; the media family's composition and the
CommonMark image shape; both table forms, the pipe table's cell split and its named CommonMark image shape; both table forms, the pipe table's cell split and its named
errors; and the one paragraph an inline body takes. 1d's last deferred pick lands here, errors; and the one paragraph an inline body takes.
the one `container-block-separation` holds: how a container body separates a CommonMark **Settled** (the maintainer, 2026-08-27): 1d's last pick, the one
block from a directive block is what the parser must read, so it is the answer the emitter `container-block-separation` holds — a CommonMark block and a directive block sit adjacent
owes as well. in a container body with no blank line between them. That reduces the three cases to one
rule, separation only where its absence would merge the blocks: the `:::` fence is
separation already, and 3c's claim ends the lazy continuation that would otherwise swallow
it. The fixture becomes a round-trip pair, and with `nested-list-tight` and 3e's pair that
empties `corpus/unspellable/`: this chunk settles the directory's own guard in
`corpus.test.ts` too, and `unspelled-block-separation`, which loses its only cause here.
The emitter's other refusals survive on causes no fixture in that directory covers, so
3k's one-list pass is where they get fixtures or the directory goes.
- [ ] **3i — The inline nodes and the marks.** `inline-nodes/` reads back: the content slot's - [ ] **3i — The inline nodes and the marks.** `inline-nodes/` reads back: the content slot's
`text` attribute and the error a slot holding anything but one unmarked text node is; the `text` attribute and the error a slot holding anything but one unmarked text node is; the
`:text{text="…"}` whitespace spelling; the four directive marks and their nesting order, `:text{text="…"}` whitespace spelling; the four directive marks and their nesting order,