diff --git a/AGENTS.md b/AGENTS.md index 30c1d22..037ec50 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -59,7 +59,7 @@ In `docs/decisions.md`: - Posts announcing a release wait for its publish, and their drafts wait for the finished release - A chunk ruled worse merges where a plan item of its release already restores that code's reading, and that item takes the ruling's places - A chunk ruled worse that restructures the places takes a paired ruling after each restructure, against the same base, and merges once one is not worse -- Writers and carry readers refuse an inline card a link marks +- The first step checks the schema, and no converter does - The gate runs on Deno and Bun - The gate installs the tarball - Firefox reads the build diff --git a/docs/decisions.md b/docs/decisions.md index 354b845..884336e 100644 --- a/docs/decisions.md +++ b/docs/decisions.md @@ -297,7 +297,7 @@ besides hard breaks but no node that takes a link: the panel refused to have breaks alone still reads as its destination, then the breaks (§An image reads as an image only alone in its paragraph). `adfToLosslessMarkdown` writes a node holding a mark its type does not take as `!adf:carry`, so the round-trip holds, except an inline card a link marks, which is refused -(§Writers and carry readers refuse an inline card a link marks). +(§The first step checks the schema, and no converter does). ## A linked image is written `[](href)`, a captioned image as its directive @@ -442,7 +442,7 @@ it joins the second panel's `` to that portable spelling. HTML nests no `` in an ``, so no element can hold both a card's URL and the target of a link marking it. Every writer refuses such a card, and a carry element holding one, as the maintainer -chose on 2026-11-04 over a new spelling (§Writers and carry readers refuse an inline card a link marks). +chose on 2026-11-04 over a new spelling (§The first step checks the schema, and no converter does). A fifth panel (2026-11-04, three readers in the same roles, then four more for what the first three split on) was asked how to write a mention, emoji, status, date and inline card, which until then @@ -749,27 +749,31 @@ stays on `insideRun` alone, since it answers the parted line. A refactor that me so the chunk's later rulings read against that merge, the commit `larv-review ruling-base` prints. A restructure past a pass's round cap still goes unreviewed, so the PR summary names it. -## Writers and carry readers refuse an inline card a link marks +## The first step checks the schema, and no converter does -2026-11-04, replacing §No schema validation of 2026-08-23 (its mark refusal 2026-08-25), the -maintainer. Goal 1. Valid while Atlassian's schema gives a card no link mark. +2026-11-04, the maintainer. Goal 1 and code health. Valid while Atlassian's schema forbids shapes +a converter would otherwise meet. -Every writer refuses a document holding an `inlineCard` with a `link` mark, as -`unsupported-node-shape` at the card's path, wherever the card stands: in a node a writer carries, -or under a type the library does not know. Every carry reader, `losslessMarkdownToAdf` and -`htmlToAdf`, refuses a carried node holding one, so no reader builds a document a writer refuses. -The schema gives a card the `annotation` mark alone (§The node tables answer to Atlassian's -schema), and spelling the pair would take a new spelling in each format; HTML nests no `` in an -``. Another shape joins this entry only at the maintainer's word, once the schema forbids it and every format would -need a spelling for it. A node type, mark or attribute the schema does not name still rides the -carry. There is no full schema validation and no exported validator: `isAdfDocument` checks the -document's shape alone. A refusal that keeps the round-trip is no schema check and stays: a spelled -node carrying the same mark type twice is refused on its own terms, and input nesting a spelling -inside its own kind (`*(*a*)*`) names that mark once. +An Atlassian-schema rule the library applies is checked once, in the first step every call opens +with: `writableContent` for the writers, `carriedNode` for the carry readers `losslessMarkdownToAdf` +and `htmlToAdf`. A converter checks none, so a document one call refuses every call refuses, at +the same path, and what a converter holds is valid ADF. An `inlineCard` with a `link` mark is +refused there today, as `unsupported-node-shape` at the card's path, wherever it stands, since the +schema gives a card the `annotation` mark alone (§The node tables answer to Atlassian's schema) +and HTML nests no `` in an ``. `todo.md` item 167 moves the other refusals a writer makes on a schema +rule: a node holding a mark type twice, a node holding `text`, or `content` where it takes none, +and an inline node holding neither. -The earlier entry premised that the site a document is saved to validates it. A hand-built -document has not reached the site yet, and the viewer/editor persona relies on a refusal arriving -before the save. +A rule joins the first step as a refusal only where no format can spell the node whole. A node type, +mark or attribute the schema does not name, a known node where no section spells it +(§Unknown nodes ride the carry), and a mark a node cannot hold (§A mark skips a node that cannot +hold it) ride the carry, which keeps the round-trip. A limit of the engine or the flavour is no +schema rule and stays where it is met: nesting depth, output length and what a portable line can +spell. A reader refusing markdown or HTML it cannot read is no check of ADF and stays in the reader. + +The earlier entry kept the card refusal alone, premising that the site a document is saved to +validates the rest. A hand-built document has not reached the site yet, and the viewer/editor +persona relies on a refusal arriving before the save. ## The gate runs on Deno and Bun diff --git a/src/adf/document.ts b/src/adf/document.ts index 73e8a89..1299769 100644 --- a/src/adf/document.ts +++ b/src/adf/document.ts @@ -147,7 +147,7 @@ export function nodeMarks(node: { marks?: AdfMark[] }): readonly AdfMark[] { return node.marks ?? [] } -// Walks every node, carried or of an unknown type, so a link-marked card is refused wherever it stands (docs/decisions.md §Writers and carry readers refuse an inline card a link marks). +// Walks every node, carried or of an unknown type, so a link-marked card is refused wherever it stands (docs/decisions.md §The first step checks the schema, and no converter does). export function refusedShape(content: readonly AdfNode[]): ConvertError | undefined { type Step = { index: number; node: AdfNode; parent: Step | undefined } const pending: Step[] = content.map((node, index) => ({ index, node, parent: undefined })).reverse() diff --git a/todo.md b/todo.md index 0387610..f7260d9 100644 --- a/todo.md +++ b/todo.md @@ -6,7 +6,7 @@ `Bar = 0.1` -`Next ID = 167` +`Next ID = 168` ## Items @@ -17,6 +17,7 @@ | 165 | 0.3.0 | 164 | | **Have a reader panel seated from `## Audience` judge each feature-table row reasonable or not, and file an item for each row it rejects.** | 2 | 2 | 1 | 3 | 3 | 6 by 5 | 7.5 | | 132 | 0.3.0 | | | **Write tables as `