5b3: merge the code list's duplicate causes, spell the list separator, claim the bare pipe table

This commit is contained in:
2026-09-03 19:05:23 +02:00
parent 3e4f596eb1
commit d2ed9c8219
21 changed files with 384 additions and 81 deletions
+25 -6
View File
@@ -143,20 +143,39 @@ The numbering is the order the work was planned in, not the order it ships.
- [ ] **5b — The consumer's error surface (`0.1.0`).** A product-owner read of the public surface
found the error result legible to the library and opaque to the consumer holding it, and the
README documenting no part of it. The sub-items are that read's answers, and they land before
5 because §8 freezes the code list at `0.1.0` and 5b3's table is what reads the list before
5 because §8 freezes the code list at `0.1.0` and 5b4's table is what reads the list before
the freeze closes it.
- [x] **5b1 — The error's source position.**
- [x] **5b2 — The error messages.**
- [ ] **5b3 — The README's consumer surface.** §8 invites an exhaustive switch on `code` and no
- [ ] **5b3 — The code list and the flavour's gaps.** A second read of the surface, this one on
the fifteen names §8 freezes at `0.1.0`: two pairs of them are one cause each, and one
names a state the flavour leaves no way out of. `unspellable-character` and the text half
of `unspellable-whitespace` are one refusal — a character CommonMark rewrites, the message
naming it — and merge, `unspellable-whitespace` keeping the code for its other cause, the
content slot no inline directive spans. `unspellable-link-destination` and
`unspellable-link-title` become `unspellable-link`, the message naming the attribute.
`unspellable-adjacent-lists` goes entirely: two adjacent `bulletList` nodes are valid ADF a
site writes, and refusing them leaves the viewer persona a document it cannot render at
all, so the flavour gains the separator that spells the pair apart, both directions,
`spec/flavour.md` and fixtures. Thirteen codes stand — `unspellable-whitespace` keeps its own.
The bare pipe table — `a | b` over `--- | ---`, GFM's shape without the leading pipes — is
the one input that loses structure silently, reading back as a paragraph of prose; it
becomes a `malformed-pipe-table` naming the form a row takes. That code keeps its name for
the alignment colon: the flavour's own delimiter row is `-` runs, so the grammar is what
refuses, and §8 records it rather than answering it again each review. The ninth
`adfDocumentFault` branch names no node and carries the document's own path, the one branch
the other eight outshine; §8 records why the guard stays a boolean.
- [ ] **5b4 — The README's consumer surface.** §8 invites an exhaustive switch on `code` and no
code name appears in the README, so it gains a table — code, when it fires, what the
consumer does — grouped by direction; drafting it is the audit that reads the fifteen names
before 5 freezes them. Four things a reader who has not opened the code cannot know: raw
consumer does — grouped by direction, over the thirteen names 5b3 settled. Four things a
reader who has not opened the code cannot know: raw
HTML is core CommonMark and every construct in input is an error until `0.3.0`, which the
guarantees' "three carve-outs and one gap" denies and which is the bot and LLM personas'
most common failure; `adfToHtml`, `htmlToAdf`, `markdownToHtml` and `htmlToMarkdown` sit
unmarked in the code block people copy from, as do the two HTML guarantee bullets, and take
a `0.3.0` mark or leave the block; `adfToMarkdown` is partial on valid ADF — two adjacent
`bulletList` nodes are an error result — which the viewer persona needs told along with
a `0.3.0` mark or leave the block; `adfToMarkdown` is partial on valid ADF — a text node
holding a carriage return, a link destination no canonical escape spells — which the viewer
persona needs told along with
what to do about it; and GFM past tables and strikethrough is literal text, task lists
taking `:::taskList`. One sentence for the LLM persona: `code` is stable across minors,
`message` is free text. The type-level surface freezes at the same moment and gets the same