# Todo ## 0.2.0 - **36 — Move every decision into `docs/decisions.md`, indexed from `AGENTS.md`.** Each entry states the decision, its date, who made it, the README goal it serves and the premise it is valid while; one no goal serves is proposed as a goal and asked. Sources: `AGENTS.md`'s body, the settled text in this file's items, and `todo-history.md`, deleted with the bare `(28)` citations into it once nothing cites it. Split by `AGENTS.md` section where one chunk is too big. - **36b — Move §8, §9 and §14's decisions.** The code list's rules, release automation and the non-goals. - **36c — Move §10 and §11's decisions.** The engine legs, floors, size ratchet, bounds, spellings and layout; the style rules stay working rules. - **36d — Move the settled text in `todo.md`'s items and §15's dated rules, and point §15's "the rule that closes it, landing here" at `docs/decisions.md`.** `AGENTS.md`'s sections are renumbered once only working rules remain, their citations with them. - **36e — Move `todo-history.md`'s decisions, re-point its citations and delete it.** - **35 — Read and write plain markdown as a flavour of the markdown grammar.** Per Goal 2 and `docs/decisions.md` §Plain markdown is a flavour of the grammar, `plainMarkdownToAdf` is `markdownToAdf`'s parser and `adfToPlainMarkdown` `adfToMarkdown`'s writer, each with the plain flavour set; 10's rows are read and written there, and the lift goes (the maintainer, 2026-09-27). The exports, their refusals and 10's rows stay as they are. - **35a — Read the plain flavour in the parser and delete the lift.** 10's rows are read while parsing, and `plain-lift.ts` is deleted, its tests reading through `plainMarkdownToAdf`. `> [!faq]- Why?` with the body on the next `>` line reads to an expand titled `Why?` whose body keeps the next lines' link targets and marks, and `> [!tip] Title` then `> body` to a panel whose paragraphs are `Title` and `body`: the rest of the marker's line is the title (an expand) or the first body paragraph (a panel). A CommonMark backslash keeps a marker literal — `\==x==`, `> \[!NOTE]`, `- \[x]`. - **35b — Spell the plain flavour in the writer.** Panels, expands, task lists and highlights are written by the writer, which escapes text that would read back as one, so `plainMarkdownToAdf(adfToPlainMarkdown(doc))` keeps a literal `==x==`, a quote opening `[!NOTE]` and a list whose items all open `[x] ` as text. A highlighted `=` (today `=====`) and `a==b` (today `==a==b==`, highlighting `a` alone) come back highlighted whole, or lose the highlight where no spelling holds them; 10c's byte-for-byte property misses both, since the wrong document re-spells to the same bytes. The reduction keeps only degrading what the flavour cannot spell. - **10f — Give task nodes read from plain markdown position ids.** `plainMarkdownToAdf` gives each `taskList`, `taskItem` and `blockTaskItem` a deterministic `localId` from its position in document order, so a site that rejects a missing `localId` takes the document and the same markdown reads to the same ids every run; README §Plain markdown's `localId` bullet says so (the maintainer, 2026-09-26). The id spelling — unique within the document, no host API — is part of the chunk. - **6 — Specify the HTML dialect.** Element-by-element mapping, the `data-*` fidelity scheme, the opaque-carry form, and the documented foreign-element set `htmlToAdf` accepts — the set `markdownToAdf` shares (`spec/flavour.md` §Raw HTML in input; 29). **Settled** (the maintainer, 2026-09-20), the four answers that shape the set: - A container ADF has no node for unwraps to its children, its own attributes dropped, so `
text
` keeps `text` and loses the box and the alignment ADF cannot hold. - `
Title…
` is an `expand`, the summary its `title`; one inside another is a `nestedExpand`, as 10 already spells for the lossy pair. An empty `
` is still refused — `expand` requires content, so there is nothing to build. - A comment stays an error result. Neither schema holds a comment node: across 84 and 98 definitions the only "comment" in either file is `annotationType: "inlineComment"` on the `annotation` mark, which carries an `id` and no text, the words living behind an Atlassian API. `placeholder` is the editor's own visible hint, and `extension` demands an `extensionKey` naming a vendor app. Nothing can hold the words, so nothing accepts them. - `