Parse every Markdoc source with indentation allowed, through one shared function Indenting the content of a tag by a tab or four spaces breaks it today: the indented lines become a code block, with no error. Composition templates nest runes several levels deep, so this is the first thing an author of a definition runs into. Markdoc's allowIndentation tokenizer option fixes it, and SPEC-170 measured that it changes no existing parse.Markdoc.parse( is called directly in about 20 source files across packages and plugins. This item replaces them with one shared parse (SPEC-170 D1), so a page cannot render one way and validate, or preview, another.
high moderate
Compositions accept a delimited content model with fixed zones A composition's content.type must be sequence or sections (packages/runes/src/lib/composition.ts). Five runes split their content on --- and need to address a field inside a zone: hero, feature, step, recipe and playlist. None of them can be a composition until the parser accepts type: delimited. The DelimitedModel type already exists (packages/types/src/content-model.ts), so this is a parser and resolver change, not a new model (SPEC-169 D1).
high moderate
Compositions accept implicitSection on a sections model implicitSection exists on the sections model (packages/types/src/content-model.ts): when no section heading is found, all children become one section instead of preamble. The composition parser does not accept the key, so itinerary, whose conditional content model only exists to add it, cannot be expressed. Accepting it removes that rune's need for a conditional model (SPEC-169 D2, D3).
medium simple
each iterates the items of a list field Today each iterates a list only when the field has an itemModel with an emitTag. A list whose items need no extraction, where each item's content is placed as it is, has no way in. That blocks steps, which takes its steps from headings or from an ordered list (SPEC-169 D4).
medium simple
sequence takes a modifier source, and plot loses its postTransform RuneConfig.sequence takes a literal ('numbered' | 'connected' | 'plain'), while sequenceDirection beside it takes { fromModifier, default } (packages/transform/src/types.ts). plot needs its sequence style keyed on its structure modifier, so it uses a postTransform (plugins/storytelling/src/config.ts), one of four left in the codebase. Giving sequence the same form deletes it (SPEC-147 Finding 1, implementation note 1).
low simple
Indent nested runes in site content with refrakt format The documentation site is the largest body of refrakt content in the repository, and the first place a reader copies examples from. Once WORK-657 can apply SPEC-170 D5 mechanically, run it over the site, so nested runes read as nested and the examples teach the rule.
medium simple