V0.42.0
Name:v0.42.0Status:complete

v0.42.0 — What a composition can express

Since v0.41.0, anyone can write a composed rune. This milestone widens what a definition can say. Templates may be indented, and refrakt format indents nested runes for you. Content may be split on --- into named zones, a sections model may treat content with no headings as one section, and each can walk the items of a plain list. An itemModel declared in YAML now extracts its fields instead of leaving every one empty (SPEC-169, SPEC-170).

Milestone burndown: 0 open work items remaining; peak 9, started Oct 1502468Oct 15Oct 28
Open work items Ideal burndown
Progress 8/8 work items
Related 17
History 4
  1. 05b4df0
    statusplanning→complete
    by bjornolofandersson
  2. a0cdd51
    Created (planning)by bjornolofandersson
  3. f7f9792
    Content editedby Claude
    plan: SPEC-170 D5 indentation rule, WORK-657 refrakt format, WORK-658 si
  4. abc833f
    Content editedby Claude
    plan: v0.41.3, v0.42.0 and v0.43.0 milestones

Work Items

Done 8
WORK-640 main
Upgrade Markdoc from 0.4.0 to 0.5.10
Every package pins "@markdoc/markdoc": "0.4.0" exactly: packages/runes, transform, content, svelte, editor, cli, language-server, plugins/places, site and plan-site. 0.4.0 was released in December 2023; 0.5.10 in September 2026, eleven releases later. Nothing in the plan or the git history records why the version is pinned. SPEC-123 and WORK-556 only call it "the pinned 0.4.0".The 0.4.0 → 0.5.10 source was read, not run. The changes that matter here:Worth having:
medium moderate
8/8 criteria
WORK-645 main
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
7/7 criteria
WORK-646 main
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
6/6 criteria
WORK-647 main
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
4/4 criteria
WORK-648 main
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
4/4 criteria
WORK-649 main
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
4/4 criteria
WORK-657 main
refrakt format re-indents nested block tags, with a check mode and editor formatting
Once WORK-645 allows indentation, SPEC-170 D5 sets the rule for when to indent: a block tag's content is indented only when it contains another block tag. A rule nobody can apply mechanically drifts, and no existing tool applies this one:
high moderate
9/10 criteria
WORK-658 main
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
5/5 criteria