<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Cutdown Specification releases</title>
  <id>https://cutdownspec.org/</id>
  <link rel="alternate" href="https://cutdownspec.org/"/>
  <link rel="self" href="https://cutdownspec.org/feed.xml"/>
  <updated>2026-09-12T00:00:00Z</updated>
  <entry>
    <title>Cutdown 0.10.0</title>
    <id>https://cutdownspec.org/v0.10.0/</id>
    <link rel="alternate" href="https://cutdownspec.org/v0.10.0/"/>
    <updated>2026-09-12T00:00:00Z</updated>
    <summary>Span was a leaf with no closer and empty children. Mark takes a closer and real children, with ::name:: retained as the empty form.</summary>
    <content type="html">&lt;h1 id="v0-10-0"&gt;&lt;span class="num"&gt;&lt;a href="/v0.10.0/" rel="noindex nofollow"&gt;0.10.0&lt;/a&gt;&lt;/span&gt;&lt;span class="lt"&gt;&lt;/span&gt;&lt;/h1&gt;
&lt;h2 id="breaking-span-renamed-to-mark"&gt;&lt;span class="num"&gt;&lt;/span&gt;&lt;span class="lt"&gt;[BREAKING] &lt;code&gt;Span&lt;/code&gt; renamed to &lt;code&gt;Mark&lt;/code&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;Before:  ::a    →  Span { name: "a", … }
After:   ::a::  →  Mark { name: "a", … }&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="breaking-mark-takes-inline-content-and-nests"&gt;&lt;span class="num"&gt;&lt;/span&gt;&lt;span class="lt"&gt;[BREAKING] &lt;code&gt;Mark&lt;/code&gt; takes inline content and nests&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;Span&lt;/code&gt; was a leaf with no closer and empty &lt;code&gt;children&lt;/code&gt;. &lt;code&gt;Mark&lt;/code&gt; takes a closer and real children, with &lt;code&gt;::name::&lt;/code&gt; retained as the empty form.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Before:  ::a b::   →  Span { name: "a", children: [] } + Text(" b::")
After:   ::a b::   →  Mark { name: "a", children: [Text("b")] }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;Mark&lt;/code&gt; is the only inline construct permitting same-type nesting, including of the same name — it matches by counting rather than by first closer.&lt;/p&gt;
&lt;h2 id="breaking-multiline-tables-removed-tablekind-removed"&gt;&lt;span class="num"&gt;&lt;/span&gt;&lt;span class="lt"&gt;[BREAKING] Multiline tables removed; &lt;code&gt;Table.kind&lt;/code&gt; removed&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;Tables are pipe-only; &lt;code&gt;Cell.children&lt;/code&gt; is &lt;code&gt;Inline[]&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Before:  +----------+  →  Table { kind: "multiline", … }
After:   +----------+  →  Paragraph([Text("+----------+")])&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="breaking-is-no-longer-a-special-character"&gt;&lt;span class="num"&gt;&lt;/span&gt;&lt;span class="lt"&gt;[BREAKING] &lt;code&gt;+&lt;/code&gt; is no longer a special character&lt;/span&gt;&lt;/h2&gt;
&lt;h2 id="breaking-textbreak-renamed-to-linebreak"&gt;&lt;span class="num"&gt;&lt;/span&gt;&lt;span class="lt"&gt;[BREAKING] &lt;code&gt;TextBreak&lt;/code&gt; renamed to &lt;code&gt;LineBreak&lt;/code&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;Before:  word\&amp;#x3C;EOL&gt;  →  TextBreak
After:   word\&amp;#x3C;EOL&gt;  →  LineBreak&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="breaking-quoteblockattribution-renamed-to-caption"&gt;&lt;span class="num"&gt;&lt;/span&gt;&lt;span class="lt"&gt;[BREAKING] &lt;code&gt;QuoteBlock.attribution&lt;/code&gt; renamed to &lt;code&gt;caption&lt;/code&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;Before:  &gt; quoted / ^ Source  →  QuoteBlock { attribution: [...] }
After:   &gt; quoted / ^ Source  →  QuoteBlock { caption: [...] }&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="breaking-quoteblock-supports-lazy-continuation"&gt;&lt;span class="num"&gt;&lt;/span&gt;&lt;span class="lt"&gt;[BREAKING] &lt;code&gt;QuoteBlock&lt;/code&gt; supports lazy continuation&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;A line without &lt;code&gt;&gt;&lt;/code&gt; continues the quote and follows its current child block's continuation rules. The quote ends at a blank line, container end, or end of input.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Before:  &gt; First line   →  QuoteBlock { Paragraph("First line") }
&lt;span class="ws"&gt;         &lt;/span&gt;Continued         Paragraph("Continued")
After:   &gt; First line   →  QuoteBlock { Paragraph("First lineContinued") }
&lt;span class="ws"&gt;         &lt;/span&gt;Continued&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The QuoteBlock classification pattern changes from &lt;code&gt;^&gt; &lt;/code&gt; to &lt;code&gt;^&gt;&lt;/code&gt;, admitting &lt;code&gt;&gt;text&lt;/code&gt; and &lt;code&gt;&gt;&gt;nested&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="breaking-meta-pagination-is-slot-based-not-positional"&gt;&lt;span class="num"&gt;&lt;/span&gt;&lt;span class="lt"&gt;[BREAKING] &lt;code&gt;Meta&lt;/code&gt; pagination is slot-based, not positional&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;A &lt;code&gt;Meta&lt;/code&gt; fills the current Page's &lt;code&gt;meta&lt;/code&gt; slot when empty, and opens a new Page only when it is already set. Content before frontmatter no longer creates a Page.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Before:  Para / --- / ~~~meta~~~  →  Page, GhostPage, Page{meta}
After:                            →  Page, Page{meta}

Before:  Para / ~~~meta~~~        →  Page{Para}, Page{meta}
After:                            →  Page{meta, Para}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="breaking-pagebreak-renamed-to-pagebreaker"&gt;&lt;span class="num"&gt;&lt;/span&gt;&lt;span class="lt"&gt;[BREAKING] &lt;code&gt;PageBreak&lt;/code&gt; renamed to &lt;code&gt;PageBreaker&lt;/code&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;Terminology only — the construct produces no AST node, so no type, field, or diagnostic code changes.&lt;/p&gt;
&lt;h2 id="breaking-default-column-alignment-is-start-not-left"&gt;&lt;span class="num"&gt;&lt;/span&gt;&lt;span class="lt"&gt;[BREAKING] Default column alignment is &lt;code&gt;"start"&lt;/code&gt;, not &lt;code&gt;"left"&lt;/code&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;Column.align&lt;/code&gt; gains &lt;code&gt;"start"&lt;/code&gt; and defaults to it. &lt;code&gt;----&lt;/code&gt; and a missing separator cell yield &lt;code&gt;"start"&lt;/code&gt;, which follows the text direction; &lt;code&gt;:---&lt;/code&gt; keeps &lt;code&gt;"left"&lt;/code&gt;, an explicit left edge in either direction.&lt;/p&gt;
&lt;h2 id="breaking-is-no-longer-a-task-marker"&gt;&lt;span class="num"&gt;&lt;/span&gt;&lt;span class="lt"&gt;[BREAKING] &lt;code&gt;- []&lt;/code&gt; is no longer a task marker&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;The unchecked marker is &lt;code&gt;[ ]&lt;/code&gt;. &lt;code&gt;- [] text&lt;/code&gt; is an ordinary &lt;code&gt;ListItem&lt;/code&gt; whose content begins &lt;code&gt;[]&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="breaking-closes-like-every-other-fence"&gt;&lt;span class="num"&gt;&lt;/span&gt;&lt;span class="lt"&gt;[BREAKING] &lt;code&gt;###&lt;/code&gt; closes like every other fence&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;CommentBlock&lt;/code&gt; closer no longer has to match the opener's column; any line whose stripped content is &lt;code&gt;###&lt;/code&gt; closes the block. Escape a &lt;code&gt;###&lt;/code&gt; line to keep it inside the body.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Before:  ###  /  note  /    ###   →  CommentBlock still open
After:                            →  CommentBlock { text: "note\n" }&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="additive-cdn-0031-mark-nesting-depth-exceeded"&gt;&lt;span class="num"&gt;&lt;/span&gt;&lt;span class="lt"&gt;[ADDITIVE] CDN-0031 — &lt;code&gt;Mark&lt;/code&gt; nesting depth exceeded&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;Maximum &lt;code&gt;Mark&lt;/code&gt; depth is 8. An opener at depth 9 emits CDN-0031 (warning).&lt;/p&gt;
&lt;h2 id="additive-17-canonical-form"&gt;&lt;span class="num"&gt;&lt;/span&gt;&lt;span class="lt"&gt;[ADDITIVE] &lt;a href="/latest/#s-17"&gt;§17&lt;/a&gt; Canonical Form&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;A closed registry of the eleven points where the grammar accepts more than one spelling, and the one a writer emits for each. Binds writers only; every listed alias remains valid input. Replaces &lt;code&gt;policies/canonical-source-policy.md&lt;/code&gt;, which is deleted. New fixture directory &lt;code&gt;tests/017-canonical-form/&lt;/code&gt; asserts &lt;code&gt;canonical&lt;/code&gt; in place of &lt;code&gt;ast&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="clarify-a-fixture-asserted-refdefinitionid"&gt;&lt;span class="num"&gt;&lt;/span&gt;&lt;span class="lt"&gt;[CLARIFY] A fixture asserted &lt;code&gt;RefDefinition.id&lt;/code&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;The field is &lt;code&gt;ref&lt;/code&gt;; &lt;code&gt;ref-definition-basic&lt;/code&gt; asserted &lt;code&gt;id&lt;/code&gt; and no other fixture covered it.&lt;/p&gt;
&lt;h2 id="clarify-heading-content-takes-paragraph-continuation-lines"&gt;&lt;span class="num"&gt;&lt;/span&gt;&lt;span class="lt"&gt;[CLARIFY] Heading content takes paragraph continuation lines&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;The rule was unwritten: the lines following a heading continue its inline content until a blank line, an attribute line, a standalone &lt;code&gt;##&lt;/code&gt;, or a caption line.&lt;/p&gt;
&lt;h2 id="clarify-inline-union-was-missing-spoiler-and-variable"&gt;&lt;span class="num"&gt;&lt;/span&gt;&lt;span class="lt"&gt;[CLARIFY] &lt;code&gt;Inline&lt;/code&gt; union was missing &lt;code&gt;Spoiler&lt;/code&gt; and &lt;code&gt;Variable&lt;/code&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h2 id="clarify-the-inline-context-table-was-missing-spoiler"&gt;&lt;span class="num"&gt;&lt;/span&gt;&lt;span class="lt"&gt;[CLARIFY] The inline-context table was missing &lt;code&gt;Spoiler&lt;/code&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h2 id="clarify-two-conformance-fixtures-did-not-satisfy-the-corpus-contract"&gt;&lt;span class="num"&gt;&lt;/span&gt;&lt;span class="lt"&gt;[CLARIFY] Two conformance fixtures did not satisfy the corpus contract&lt;/span&gt;&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fixture&lt;/th&gt;
&lt;th&gt;Was&lt;/th&gt;
&lt;th&gt;Now&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;empty-document.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;id: document-empty&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;id: empty-document&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;comment-inline-in-meta-literal.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;both &lt;code&gt;ast: []&lt;/code&gt; and &lt;code&gt;pages:&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pages:&lt;/code&gt; only&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="clarify-no-block-opens-inside-a-paragraph"&gt;&lt;span class="num"&gt;&lt;/span&gt;&lt;span class="lt"&gt;[CLARIFY] No block opens inside a paragraph&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;A fence opener inside a paragraph run is paragraph content, not a &lt;code&gt;CodeBlock&lt;/code&gt;, with no diagnostic; caption (&lt;code&gt;^ &lt;/code&gt;) and attribute-continuation (&lt;code&gt;{…}&lt;/code&gt;) lines are not block openers and still attach to the preceding block.&lt;/p&gt;
&lt;h2 id="clarify-caption-binding-takes-three-conditions"&gt;&lt;span class="num"&gt;&lt;/span&gt;&lt;span class="lt"&gt;[CLARIFY] Caption binding takes three conditions&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;The preceding block must be captionable, its caption slot empty, and no blank line between; any number of &lt;code&gt;{attrs}&lt;/code&gt; and &lt;code&gt;## comment&lt;/code&gt; lines may intervene. Anything else orphans to a &lt;code&gt;Paragraph&lt;/code&gt; with CDN-0008.&lt;/p&gt;
&lt;h2 id="clarify-a-run-of-non-blank-lines-may-produce-several-blocks"&gt;&lt;span class="num"&gt;&lt;/span&gt;&lt;span class="lt"&gt;[CLARIFY] A run of non-blank lines may produce several blocks&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;A single-line block consumes only its own line and returns the remainder to classification, so &lt;code&gt;= Title&lt;/code&gt; followed directly by &lt;code&gt;content&lt;/code&gt; yields a &lt;code&gt;Section&lt;/code&gt; and a &lt;code&gt;Paragraph&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="clarify-trailing-spaces-drop-at-the-end-of-a-single-line-block"&gt;&lt;span class="num"&gt;&lt;/span&gt;&lt;span class="lt"&gt;[CLARIFY] Trailing spaces drop at the end of a single-line block&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;Heading lines, table cells, and caption lines are block boundaries for the trailing-space rule.&lt;/p&gt;
&lt;h2 id="clarify-a-cell-chain-needs-an-attr-bearing-inline"&gt;&lt;span class="num"&gt;&lt;/span&gt;&lt;span class="lt"&gt;[CLARIFY] A cell chain needs an attr-bearing inline&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;| AA | CC {.a} |&lt;/code&gt; drops &lt;code&gt;{.a}&lt;/code&gt; with CDN-0011 — &lt;code&gt;Cell&lt;/code&gt; bears no attributes and plain text offers no slot.&lt;/p&gt;
&lt;h2 id="clarify-ast-field-and-enumeration-drift"&gt;&lt;span class="num"&gt;&lt;/span&gt;&lt;span class="lt"&gt;[CLARIFY] AST field and enumeration drift&lt;/span&gt;&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Node&lt;/th&gt;
&lt;th&gt;Was&lt;/th&gt;
&lt;th&gt;Now&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Page&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;meta: Meta | {}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;meta: Meta | null&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;List&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;carried &lt;code&gt;caption&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;field removed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;FileRef&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;no &lt;code&gt;caption&lt;/code&gt; field&lt;/td&gt;
&lt;td&gt;&lt;code&gt;caption: Inline[] | null&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CommentBlock&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;no &lt;code&gt;reflection&lt;/code&gt; field&lt;/td&gt;
&lt;td&gt;&lt;code&gt;reflection: Reflection[] | null&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;all nodes&lt;/td&gt;
&lt;td&gt;&lt;code&gt;attributes: Attribute[] | null&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;attributes: Attribute[]&lt;/code&gt;, empty when absent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Block&lt;/code&gt; union&lt;/td&gt;
&lt;td&gt;omitted &lt;code&gt;SpoilerBlock&lt;/code&gt;, &lt;code&gt;CommentBlock&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;both added; &lt;code&gt;RefDefinition&lt;/code&gt; confirmed a &lt;code&gt;Block&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="clarify-editorial-pass-over-prose-and-references"&gt;&lt;span class="num"&gt;&lt;/span&gt;&lt;span class="lt"&gt;[CLARIFY] Editorial pass over prose and references&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;Duplicate definitions reduced to pointers (PageBreaker, the pagination and sectionization folds, &lt;code&gt;Mark&lt;/code&gt; matching, the fence list, whitespace handling). Character-naming convention restated with one canonical form. &lt;code&gt;Block Scope&lt;/code&gt; defined. Broken and imprecise cross-references corrected.&lt;/p&gt;
&lt;h2 id="clarify-syntaxmd-and-readmemd-corrections"&gt;&lt;span class="num"&gt;&lt;/span&gt;&lt;span class="lt"&gt;[CLARIFY] &lt;code&gt;SYNTAX.md&lt;/code&gt; and &lt;code&gt;README.md&lt;/code&gt; corrections&lt;/span&gt;&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Was&lt;/th&gt;
&lt;th&gt;Now&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;+&lt;/code&gt; listed as a special character&lt;/td&gt;
&lt;td&gt;removed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Same-type nesting not allowed"&lt;/td&gt;
&lt;td&gt;scoped to doubled delimiters; &lt;code&gt;Mark&lt;/code&gt; nests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"&lt;code&gt;::&lt;/code&gt; has no closer"&lt;/td&gt;
&lt;td&gt;stale &lt;code&gt;Span&lt;/code&gt;-era text, corrected&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"GFM pipe tables parse unchanged"&lt;/td&gt;
&lt;td&gt;replaced with the three actual differences&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;node &lt;code&gt;FileRefBlock&lt;/code&gt;; &lt;code&gt;Page.children: (Section | Block)[]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;FileRef&lt;/code&gt;; &lt;code&gt;Block[]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;degradation described as one rule&lt;/td&gt;
&lt;td&gt;both classes described&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"A single character is always plain text — no exceptions"&lt;/td&gt;
&lt;td&gt;scoped to inline position&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"A Meta block is legal anywhere"&lt;/td&gt;
&lt;td&gt;page scope only&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</content>
  </entry>
  <entry>
    <title>Cutdown 0.9.0</title>
    <id>https://cutdownspec.org/v0.9.0/</id>
    <link rel="alternate" href="https://cutdownspec.org/v0.9.0/"/>
    <updated>2026-09-02T00:00:00Z</updated>
    <summary>spec/012-whitespace-rules.md said trailing spaces are "Ignored, except: a single trailing space immediately before a soft break is preserved", while §5.13's line-ending summary said "word \n — Trailing space collapsed to single space — Text("word ") emitted". Two or more trailing spaces could not be both ignored and collapsed.</summary>
    <content type="html">&lt;h1 id="v0-9-0"&gt;&lt;span class="num"&gt;&lt;a href="/v0.9.0/" rel="noindex nofollow"&gt;0.9.0&lt;/a&gt;&lt;/span&gt;&lt;span class="lt"&gt;&lt;/span&gt;&lt;/h1&gt;
&lt;h2 id="breaking-trailing-whitespace-collapses-instead-of-being-discarded"&gt;&lt;span class="num"&gt;&lt;/span&gt;&lt;span class="lt"&gt;[BREAKING] Trailing whitespace collapses instead of being discarded&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;spec/012-whitespace-rules.md&lt;/code&gt; said trailing spaces are &lt;em&gt;"Ignored, except: a
&lt;strong&gt;single&lt;/strong&gt; trailing space immediately before a soft break is preserved"&lt;/em&gt;, while
&lt;a href="/latest/#s-5-13"&gt;§5.13&lt;/a&gt;'s line-ending summary said &lt;em&gt;"&lt;code&gt;word  \n&lt;/code&gt; — Trailing space &lt;strong&gt;collapsed to
single space&lt;/strong&gt; — &lt;code&gt;Text("word ")&lt;/code&gt; emitted"&lt;/em&gt;. Two or more trailing spaces could
not be both ignored and collapsed.&lt;/p&gt;
&lt;p&gt;Resolved in favour of collapse. Trailing spaces collapse to a single space,
preserved before a soft break and dropped at a block boundary.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Before:  "a  \nb\n"  →  Paragraph([Text("ab")])     (per §12: two spaces ignored)
After:   "a  \nb\n"  →  Paragraph([Text("a b")])&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A parser that followed &lt;a href="/latest/#s-5-13"&gt;§5.13&lt;/a&gt; already behaved the new way; a parser that followed
&lt;a href="/latest/#s-12"&gt;§12&lt;/a&gt; did not.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;##&lt;/code&gt; comment payload is opaque, so trailing whitespace inside the payload is
preserved verbatim and this rule does not reach inside it — previously
unspecified.&lt;/p&gt;
&lt;h2 id="breaking-imageblock-falls-back-to-paragraph-when-it-is-not-the-only-segment-on-its-line"&gt;&lt;span class="num"&gt;&lt;/span&gt;&lt;span class="lt"&gt;[BREAKING] &lt;code&gt;ImageBlock&lt;/code&gt; falls back to &lt;code&gt;Paragraph&lt;/code&gt; when it is not the only segment on its line&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href="/latest/#s-9-3"&gt;§9.3&lt;/a&gt; classified a line matching &lt;code&gt;^!\[&lt;/code&gt; as an &lt;code&gt;ImageBlock&lt;/code&gt;; &lt;a href="/latest/#s-4-9"&gt;§4.9&lt;/a&gt; required an
&lt;code&gt;ImageBlock&lt;/code&gt; to be &lt;em&gt;"the only one segment on the line"&lt;/em&gt;. What happened when both
applied was unspecified.&lt;/p&gt;
&lt;p&gt;Phase 3 classification is now provisional. A line carrying content after the
image falls back to a &lt;code&gt;Paragraph&lt;/code&gt; containing an &lt;code&gt;ImageInline&lt;/code&gt; followed by the
remaining inline content. No content is dropped.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Before:  "![a](b) trailing text"  →  unspecified (parsers may have emitted ImageBlock)
After:   "![a](b) trailing text"  →  Paragraph([ImageInline(...), Text(" trailing text")])&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;Paragraph&lt;/code&gt; is not captionable, so a &lt;code&gt;^ &lt;/code&gt; line following the fallback is
orphaned: it becomes a &lt;code&gt;Paragraph&lt;/code&gt; of its own and emits &lt;strong&gt;CDN-0008&lt;/strong&gt;. One stray
word after an image demotes the image &lt;em&gt;and&lt;/em&gt; converts its caption to prose.&lt;/p&gt;
&lt;h2 id="breaking-table-attr-chains-reach-the-last-cells-inline"&gt;&lt;span class="num"&gt;&lt;/span&gt;&lt;span class="lt"&gt;[BREAKING] Table attr chains reach the last cell's inline&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href="/latest/#s-6"&gt;§6&lt;/a&gt;'s scope-chain rule (Rule B) runs a trailing &lt;code&gt;{}&lt;/code&gt; sequence down the
containment hierarchy, ending at the last attr-bearing inline. &lt;a href="/latest/#s-6"&gt;§6&lt;/a&gt;'s slot table
truncated the two table contexts short of that inline slot, and &lt;a href="/latest/#s-4-8"&gt;§4.8&lt;/a&gt; restated
the truncated version a third time.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Cell&lt;/code&gt; bears no attributes, so the chain now walks past it into the cell.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Before:  "| AA | **BB** {.a}{.b}{.c}"  →  Table({.c}, Row({.b}, ...))   {.a}, {.b} dropped
After:   "| AA | **BB** {.a}{.b}{.c}"  →  Table({.c}, Row({.b}, Cell(...), Cell(Strong({.a}, "BB"))))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The trailing &lt;code&gt;|&lt;/code&gt; selects the chain depth. Omitted, the last cell's inline
context is open and the inline slot exists; written, the cell is sealed and the
chain stops at &lt;code&gt;Row&lt;/code&gt;. The slot searches the last cell only — it never scans
sideways into an earlier cell.&lt;/p&gt;
&lt;p&gt;Multiline tables are unchanged and stop at &lt;code&gt;Row&lt;/code&gt;: a multiline cell holds
&lt;code&gt;Block[]&lt;/code&gt;, so there is no inline context to bind to.&lt;/p&gt;
&lt;h2 id="breaking-cdn-0011-fires-on-orphaned-scope-chain-attributes"&gt;&lt;span class="num"&gt;&lt;/span&gt;&lt;span class="lt"&gt;[BREAKING] CDN-0011 fires on orphaned scope-chain attributes&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href="/latest/#s-6-1-3"&gt;§6.1.3&lt;/a&gt; said an excess &lt;code&gt;{}&lt;/code&gt; at the front of a full chain is &lt;em&gt;"silently dropped
(no AST output)"&lt;/em&gt;. &lt;code&gt;CDN-0011 — Orphaned scope-chain attributes&lt;/code&gt; defines a
warning for exactly that event. The code was therefore dead: no input could
emit it, and &lt;code&gt;cdn-0011-orphaned-scope-chain.yaml&lt;/code&gt; asserted so in its own
description — &lt;em&gt;"no warning (CDN-0011 should not emitted)"&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Resolved in favour of the registry. The drop is unchanged; it is now reported.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Before:  "- text {.a}{.b}{.c}"  →  diagnostics: []
After:   "- text {.a}{.b}{.c}"  →  diagnostics: [CDN-0011]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;One diagnostic per chain, however many blocks are orphaned. An empty &lt;code&gt;{}&lt;/code&gt; still
claims its slot, so it is never an orphan.&lt;/p&gt;
&lt;h2 id="breaking-attributes-written-before-a-table-rows-closer-bind-inside-the-cell"&gt;&lt;span class="num"&gt;&lt;/span&gt;&lt;span class="lt"&gt;[BREAKING] Attributes written before a table row's closer bind inside the cell&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;| AA | **BB** {.a} |&lt;/code&gt; lost &lt;code&gt;{.a}&lt;/code&gt; entirely and silently. The chain was
extracted at line level, which sees the &lt;code&gt;|&lt;/code&gt; at the end and finds nothing; the
groups were then re-parsed inside the cell and discarded. The same loss applied
to any non-final cell — &lt;code&gt;| **AA** {.x} | BB |&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Every cell is an inline context, so Rule B (&lt;a href="/latest/#s-6"&gt;§6&lt;/a&gt;) now applies inside it. &lt;code&gt;Cell&lt;/code&gt;
bears no attributes, so the cell chain has exactly one slot: that cell's last
attr-bearing inline.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Before:  "| AA | **BB** {.a} |"  →  Cell(Strong("BB"))                 {.a} lost
After:   "| AA | **BB** {.a} |"  →  Cell(Strong({.a}, "BB"))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The closer now has a consistent meaning in both directions: it sets how deep the
row chain reaches, and a chain's position relative to it selects which chain
applies. The three spellings stay distinct —&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;| AA | **BB** {.a}      →  Table({.a})    row chain, 3 slots, last {} → Table
| AA | **BB** | {.a}    →  Table({.a})    row chain, 2 slots
| AA | **BB** {.a} |    →  Strong({.a})   cell chain, 1 slot&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A second group on a cell chain orphans and emits CDN-0011.&lt;/p&gt;
&lt;h2 id="breaking-table-column-count-is-fixed-by-the-first-content-row"&gt;&lt;span class="num"&gt;&lt;/span&gt;&lt;span class="lt"&gt;[BREAKING] Table column count is fixed by the first content row&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;spec/004-block-segments.md&lt;/code&gt; set the multiline column count to &lt;em&gt;"max() of cell
count across all logical rows"&lt;/em&gt; with &lt;em&gt;"no diagnostic ... for row/column count
mismatches"&lt;/em&gt;. The pipe section stated no rule at all, yet behaved the same way,
so &lt;code&gt;max()&lt;/code&gt; was normative for one kind and silent folklore for the other.&lt;/p&gt;
&lt;p&gt;Both kinds now take the column count from the first content row.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Before:  "| A | B |\n| C | D | E |"  →  Table(columns: 3), rows of 2 and 3 cells
After:   "| A | B |\n| C | D | E |"  →  Table(columns: 2), "E" dropped + CDN-0018

Before:  "| A | B |\n| C |"          →  Table(columns: 2), rows of 2 and 1 cells
After:   "| A | B |\n| C |"          →  Table(columns: 2), row 2 padded to 2 cells&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Short rows are padded with empty cells and emit nothing — nothing is lost. Wide
rows drop their surplus and emit &lt;strong&gt;CDN-0018&lt;/strong&gt;, on the CDN-0016 precedent that
dropping author content is diagnosable, not silent. A header separator is never
a content row, so it never defines the count; wider, it drops surplus with the
same diagnostic; narrower, its uncovered columns default to &lt;code&gt;"left"&lt;/code&gt; as before.&lt;/p&gt;
&lt;p&gt;Padded cells carry no &lt;code&gt;loc&lt;/code&gt;. &lt;a href="/latest/#s-14"&gt;§14&lt;/a&gt;'s synthetic-&lt;code&gt;loc&lt;/code&gt; sentence, which named only
&lt;code&gt;Fragment&lt;/code&gt;, now covers both cases. A padded &lt;code&gt;Cell&lt;/code&gt; is an ordinary empty &lt;code&gt;Cell&lt;/code&gt;,
not a new node type.&lt;/p&gt;
&lt;p&gt;In multiline tables &lt;code&gt;+&lt;/code&gt; rows no longer count columns or position boundaries —
the first content row's &lt;code&gt;|&lt;/code&gt; positions supply both. A &lt;code&gt;+---+---+&lt;/code&gt; drawn wider or
narrower than its first content row is inert decoration and emits nothing.&lt;/p&gt;
&lt;p&gt;All 16 existing table fixtures are unaffected: every one is rectangular, and
every multiline &lt;code&gt;+&lt;/code&gt; row already agrees with its first content row.&lt;/p&gt;
&lt;h2 id="additive-trailing-is-optional-on-table-rows"&gt;&lt;span class="num"&gt;&lt;/span&gt;&lt;span class="lt"&gt;[ADDITIVE] Trailing &lt;code&gt;|&lt;/code&gt; is optional on table rows&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href="/latest/#s-4-8"&gt;§4.8&lt;/a&gt; required leading &lt;em&gt;and&lt;/em&gt; trailing &lt;code&gt;|&lt;/code&gt; on every pipe row while saying the
trailing &lt;code&gt;|&lt;/code&gt; was optional for multiline rows — the two kinds disagreed with no
reason given. Resolved toward the multiline reading: the last &lt;code&gt;|&lt;/code&gt; on a line is
always the closer, never a cell separator.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;| A | B |      →  2 cells   (unchanged)
| A | B        →  2 cells   (newly legal)
| A | B | |    →  3 cells, the third empty, then the closer&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The leading &lt;code&gt;|&lt;/code&gt; stays required — &lt;a href="/latest/#s-9-3"&gt;§9.3&lt;/a&gt; classifies a pipe table by &lt;code&gt;^\|&lt;/code&gt;, so it is
the detection anchor.&lt;/p&gt;
&lt;p&gt;The reference parser (&lt;code&gt;cutdown-parser&lt;/code&gt; 0.8.0, &lt;code&gt;splitCells&lt;/code&gt;) already accepted the
omitted closer and already produced these counts; the required-trailing-&lt;code&gt;|&lt;/code&gt;
sentence was simply wrong. No existing parse changes.&lt;/p&gt;
&lt;h2 id="additive-streaming-conformance-profile-16"&gt;&lt;span class="num"&gt;&lt;/span&gt;&lt;span class="lt"&gt;[ADDITIVE] Streaming Conformance Profile (&lt;a href="/latest/#s-16"&gt;§16&lt;/a&gt;)&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;Every Unicode-scalar prefix of a document is itself an ordinary Cutdown document
and must parse to the same AST and diagnostics as parsing that prefix afresh.
Adds no syntax and changes no existing parse; a parser that passed 0.8.0 may not
pass this release.&lt;/p&gt;
&lt;h2 id="additive-bidi-neutral-taskitem-marker"&gt;&lt;span class="num"&gt;&lt;/span&gt;&lt;span class="lt"&gt;[ADDITIVE] Bidi-neutral &lt;code&gt;TaskItem&lt;/code&gt; marker &lt;code&gt;- [+]&lt;/code&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;- [+]&lt;/code&gt; joins &lt;code&gt;- [x]&lt;/code&gt; as a checked task marker.&lt;/p&gt;
&lt;h2 id="clarify-two-worked-examples-corrected-against-the-corpus"&gt;&lt;span class="num"&gt;&lt;/span&gt;&lt;span class="lt"&gt;[CLARIFY] Two worked examples corrected against the corpus&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;Six delimiters leave exactly one leftover — opener (2) + literal (1) + closer (2).&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Location&lt;/th&gt;
&lt;th&gt;Was&lt;/th&gt;
&lt;th&gt;Now&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/latest/#s-5-12"&gt;§5.12&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;^^^x^^^ → Spoiler([Text("^x")]) + Text("^^")&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;+ Text("^")&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/latest/#s-5-6"&gt;§5.6&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt; ```text``` → CodeInline { value: "&lt;/code&gt;text" }`&lt;/td&gt;
&lt;td&gt;&lt;code&gt;+ Text("&lt;/code&gt;")`&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="clarify-6-renumbered-to-segment-attribution"&gt;&lt;span class="num"&gt;&lt;/span&gt;&lt;span class="lt"&gt;[CLARIFY] &lt;a href="/latest/#s-6"&gt;§6&lt;/a&gt; renumbered to &lt;em&gt;Segment Attribution&lt;/em&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Was&lt;/th&gt;
&lt;th&gt;Now&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/latest/#s-6"&gt;§6&lt;/a&gt; Universal Attributes and Captions&lt;/td&gt;
&lt;td&gt;&lt;a href="/latest/#s-6"&gt;§6&lt;/a&gt; Segment Attribution (Universal Attributes and Caption)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/latest/#s-6-1"&gt;§6.1&lt;/a&gt; Syntax&lt;/td&gt;
&lt;td&gt;&lt;a href="/latest/#s-6-1-1"&gt;§6.1.1&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/latest/#s-6-2"&gt;§6.2&lt;/a&gt; Placement&lt;/td&gt;
&lt;td&gt;&lt;a href="/latest/#s-6-1-2"&gt;§6.1.2&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;§6.3 Orphan Attributes&lt;/td&gt;
&lt;td&gt;&lt;a href="/latest/#s-6-1-3"&gt;§6.1.3&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;§6.4 Attribute Inside Link Text&lt;/td&gt;
&lt;td&gt;&lt;a href="/latest/#s-6-1-4"&gt;§6.1.4&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;§6.5 Caption Line&lt;/td&gt;
&lt;td&gt;&lt;a href="/latest/#s-6-2"&gt;§6.2&lt;/a&gt; Caption&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;External references to &lt;a href="/latest/#s-6-2"&gt;§6.2&lt;/a&gt; (Placement) now resolve to Caption.&lt;/p&gt;
&lt;h2 id="clarify-loc-is-defined-once-in-14"&gt;&lt;span class="num"&gt;&lt;/span&gt;&lt;span class="lt"&gt;[CLARIFY] &lt;code&gt;Loc&lt;/code&gt; is defined once, in &lt;a href="/latest/#s-14"&gt;§14&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;It was declared in &lt;a href="/latest/#s-2-2"&gt;§2.2&lt;/a&gt; and re-declared anonymously in &lt;a href="/latest/#s-14"&gt;§14&lt;/a&gt;, which used the bare
name it never defined. &lt;a href="/latest/#s-14"&gt;§14&lt;/a&gt; now declares &lt;code&gt;interface Loc&lt;/code&gt;; &lt;a href="/latest/#s-2-2"&gt;§2.2&lt;/a&gt;'s copy is deleted.&lt;/p&gt;
&lt;h2 id="clarify-left-to-right-replaced-with-source-order"&gt;&lt;span class="num"&gt;&lt;/span&gt;&lt;span class="lt"&gt;[CLARIFY] "Left-to-right" replaced with source order&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;Nine occurrences. Every one described source order, not visual order — in an RTL
document these diverge. &lt;code&gt;009:109&lt;/code&gt;, which walks a list of blocks, reads "document
order".&lt;/p&gt;
&lt;h2 id="clarify-textbreak-had-three-names"&gt;&lt;span class="num"&gt;&lt;/span&gt;&lt;span class="lt"&gt;[CLARIFY] &lt;code&gt;TextBreak&lt;/code&gt; had three names&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href="/latest/#s-5-13"&gt;§5.13&lt;/a&gt; said &lt;code&gt;TextBreak&lt;/code&gt;, &lt;a href="/latest/#s-12"&gt;§12&lt;/a&gt; said "Hard break", &lt;a href="/latest/#s-13"&gt;§13&lt;/a&gt; said "hard break". All now
use the AST type name.&lt;/p&gt;
&lt;h2 id="clarify-characters-are-named"&gt;&lt;span class="num"&gt;&lt;/span&gt;&lt;span class="lt"&gt;[CLARIFY] Characters are named&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href="/latest/#s-13"&gt;§13&lt;/a&gt; gained a &lt;strong&gt;Name&lt;/strong&gt; column for all 24 characters. &lt;a href="/latest/#s-1"&gt;§1&lt;/a&gt; states the convention and
defines &lt;code&gt;→&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="clarify-105-list-examples-use-kind"&gt;&lt;span class="num"&gt;&lt;/span&gt;&lt;span class="lt"&gt;[CLARIFY] &lt;a href="/latest/#s-10-5"&gt;§10.5&lt;/a&gt; list examples use &lt;code&gt;kind&lt;/code&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;Three AST examples still wrote &lt;code&gt;List { ordered: false }&lt;/code&gt;, a field renamed to
&lt;code&gt;kind&lt;/code&gt; in 0.3.6. &lt;a href="/latest/#s-14"&gt;§14&lt;/a&gt; and the corpus have carried &lt;code&gt;kind&lt;/code&gt; throughout.&lt;/p&gt;
&lt;h2 id="clarify-policiesambiguity-matrixmd-dropped"&gt;&lt;span class="num"&gt;&lt;/span&gt;&lt;span class="lt"&gt;[CLARIFY] &lt;code&gt;policies/ambiguity-matrix.md&lt;/code&gt; dropped&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;A prose checklist of inline-precedence cases, written before the conformance
corpus existed and never updated after it did. It still described &lt;code&gt;**&lt;/code&gt; as the
&lt;code&gt;Emphasis&lt;/code&gt; delimiter, inverted since 0.8.0, and referenced a mention parser that
lives in the extensions list rather than the language.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;conformance-policy.md&lt;/code&gt; and &lt;code&gt;changes-gate.md&lt;/code&gt; kept their obligation to cover
conflict, escape, malformed, and neighbouring-precedence cases for every new
inline token — they now point at &lt;code&gt;tests/&lt;/code&gt;, which is executable and versioned
with the spec. Normative sources drop from 21 policies to 20.&lt;/p&gt;
&lt;h2 id="clarify-added-changelog"&gt;&lt;span class="num"&gt;&lt;/span&gt;&lt;span class="lt"&gt;[CLARIFY] Added Changelog&lt;/span&gt;&lt;/h2&gt;</content>
  </entry>
  <entry>
    <title>Cutdown 0.8.0</title>
    <id>https://cutdownspec.org/v0.8.0/</id>
    <link rel="alternate" href="https://cutdownspec.org/v0.8.0/"/>
    <updated>2026-09-02T00:00:00Z</updated>
    <summary>** now marks Strong and __ marks Emphasis, following the dominant Markdown-family convention. Every document using either delimiter parses to a different node type.</summary>
    <content type="html">&lt;h1 id="v0-8-0"&gt;&lt;span class="num"&gt;&lt;a href="/v0.8.0/" rel="noindex nofollow"&gt;0.8.0&lt;/a&gt;&lt;/span&gt;&lt;span class="lt"&gt;&lt;/span&gt;&lt;/h1&gt;
&lt;h2 id="breaking-and-__-swapped"&gt;&lt;span class="num"&gt;&lt;/span&gt;&lt;span class="lt"&gt;[BREAKING] &lt;code&gt;**&lt;/code&gt; and &lt;code&gt;__&lt;/code&gt; swapped&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;**&lt;/code&gt; now marks &lt;code&gt;Strong&lt;/code&gt; and &lt;code&gt;__&lt;/code&gt; marks &lt;code&gt;Emphasis&lt;/code&gt;, following the dominant
Markdown-family convention. Every document using either delimiter parses to a
different node type.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Before:  "**text**"  →  Emphasis([Text("text")])
After:   "**text**"  →  Strong([Text("text")])&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="breaking-thematicbreak-segment-removed"&gt;&lt;span class="num"&gt;&lt;/span&gt;&lt;span class="lt"&gt;[BREAKING] &lt;code&gt;ThematicBreak&lt;/code&gt; segment removed&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;---&lt;/code&gt; at top level still closes the current &lt;code&gt;Page&lt;/code&gt; and opens a new one, but emits
no segment. Inside a block container it no longer emits a segment either, and now
emits &lt;strong&gt;CDN-0017&lt;/strong&gt;. &lt;strong&gt;CDN-0010&lt;/strong&gt; is retired, superseded by &lt;strong&gt;CDN-0016&lt;/strong&gt;
(PageBreak tail dropped).&lt;/p&gt;
&lt;h2 id="breaking-table-header-separators-moved-from-rows-to-rows"&gt;&lt;span class="num"&gt;&lt;/span&gt;&lt;span class="lt"&gt;[BREAKING] Table header separators moved from &lt;code&gt;+&lt;/code&gt; rows to &lt;code&gt;|&lt;/code&gt; rows&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;A header separator is now a &lt;code&gt;|&lt;/code&gt; row whose every cell is an alignment pattern.
&lt;code&gt;+&lt;/code&gt; rows never mark headers, and colons inside them are inert.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Before:  "+:---+:---+"  →  header separator
After:   "+----+----+"  →  inert (multiline: row delimiter; pipe: ignored)
&lt;span class="ws"&gt;         &lt;/span&gt;"|:---|:---|"  →  header separator&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In a multiline table a header separator also closes the logical row and defines
column boundaries.&lt;/p&gt;
&lt;h2 id="breaking-tablekind-value-gfm-renamed-to-pipe"&gt;&lt;span class="num"&gt;&lt;/span&gt;&lt;span class="lt"&gt;[BREAKING] &lt;code&gt;Table.kind&lt;/code&gt; value &lt;code&gt;"gfm"&lt;/code&gt; renamed to &lt;code&gt;"pipe"&lt;/code&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;Syntax is unchanged — GFM pipe tables still parse as before — but the AST value
differs.&lt;/p&gt;
&lt;h2 id="additive-loc"&gt;&lt;span class="num"&gt;&lt;/span&gt;&lt;span class="lt"&gt;[ADDITIVE] &lt;code&gt;Loc&lt;/code&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;Segments carry a source location. Adds no syntax.&lt;/p&gt;</content>
  </entry>
</feed>
