V0.39.0
Name:v0.39.0Status:complete

v0.39.0 — Declarations, part two

v0.38.0 deleted what was provably inert and made two declarations reach the reader and the runtime. This milestone continues on the same line, one level up: the remaining places where a rune's behaviour is written as code but is really data, plus the one place where the two schema resolvers' disagreement already publishes wrong structured data.

These are also the self-contained foundations of the composed-runes work (SPEC-145, SPEC-153, SPEC-156). Each one is valuable on its own and does not depend on composition landing. Composition itself is deliberately not in this milestone.

Milestone burndown: 0 open work items remaining; peak 3, started Oct 70123Oct 7Oct 11
Open work items Ideal burndown
Progress 3/4 work items
Related 23

Work Items

Draft 1
WORK-617 main
character, realm and faction drop their transforms for the slot declaration
The second proving set for SPEC-143: the storytelling entity runes whose sections arrive as already-rendered child runes (emitTag). Together with WORK-616 this covers both sides of the emitTag split, which is what proves the mechanism rather than one shape of it.Same gate (D7): no drift in contracts or the SEO baseline, per rune.recipe is the standing proof that the escape hatch is still needed (D3). It is not migrated, and it is not bent to fit.
medium moderate
0/6 criteria
Done 3
WORK-609 main
Stop findChildren retyping author-nested runes of a colliding name
SPEC-146 Problem 1, the present-tense half. findChildren (packages/runes/src/lib/schema-table.ts) matches a schema children key against data-rune as well as data-name / data-field, descends the whole subtree and applies every match. So playlist's children: { track } retypes an author's own {% track %} nested in an unrelated container as one of the playlist's tracks, and because the child row is applied with the author's node as root, the row's own properties resolve inside it. The SPEC records the result in the JSON-LD graph, not only in RDFa: an unrelated recording published as a track.The colliding rows are a closed set: playlist's musicRow/spokenRow and breadcrumb's breadcrumb-item carry their own properties and reach the graph; recipe/howto (step), pricing (tier), timeline and accordion carry text/generated only and mis-stamp RDFa.
high moderate
9/9 criteria
WORK-614 main
Add the slot declaration and generate a rune's transform from it
SPEC-143's mechanism, without migrating any rune. That happens in WORK-616 and WORK-617.createContentModelSchema gains an emits declaration carrying the renderable's identity (rune, tag, property), its properties in SPEC-140's data form (fieldMetas, which already takes no function values), and its slots:
high complex
16/16 criteria
WORK-616 main
work, bug and decision drop their transforms for the slot declaration
The first proving set for SPEC-143: the plan entity runes whose sections arrive as resolved entries (no emitTag). After SPEC-081 they build no structure; what is left is properties, title → header, description → blurb (omitted when empty), sections → body. That is exactly what the slot declaration expresses.
medium moderate
5/5 criteria