V0.46.0
Name:v0.46.0Status:complete

v0.46.0 — The theme contract

A theme renders a vocabulary and configures no rune (ADR-043); a plugin rune speaks the same vocabulary, and only its novel parts bring their own structure, in tokens (ADR-044). Both decisions were accepted on 2026-10-28. This milestone builds what makes them checkable.

Milestone burndown: 0 open work items remaining; peak 0, started Nov 201Nov 2Nov 4
Open work items Ideal burndown
Progress 4/4 work items
History 3
  1. d0c032a
    Created (complete)by github-actions[bot]
  2. 55b7111
    Content editedby Claude
    plan: v0.45.0 and v0.46.0 complete; SPEC-183 and SPEC-156 shipped in v0.
  3. 0ec343f
    Content editedby Claude
    plan: draft v0.45.0 and v0.46.0; WORK-660 joins v0.44.0

Work Items

Done 4
WORK-672 main
A theme vocabulary coverage check
A theme that configures no rune cannot promise each rune looks right. It needs to cover the vocabulary instead (ADR-043 decision 5). Lumina's coverage test (packages/lumina/test/css-coverage.test.ts) checks BEM selectors derived from rune configs; it does not check vocabulary values.
medium moderate
5/5 criteria
WORK-673 main
A vocabulary report per plugin rune and a token-only lint for plugin CSS
ADR-044 lets a plugin rune bring its own structure CSS only for genuinely novel parts, written only in theme tokens. Two checks make the tiers checkable rather than advice. Neither exists.
low moderate
5/5 criteria
WORK-674 main
A composition's narrative field is checked at definition load
ADR-047 lets a rune declare one narrative field that accepts only the editorial runes textblock and mediatext, and says the field is never published as structured data. As amended, the field is inferred from its match, and both rules are checked.
low simple
6/6 criteria
WORK-675 main
The content-boundaries guide documents the narrative field
The "Content boundaries" section of site/content/extend/rune-authoring/patterns.md puts "Story, editorial, famous quotes" outside recipe. ADR-047 adds a case: a rune may declare one narrative field that takes {% textblock %} and {% mediatext %}, so a template can place the story between the rune's parts. A site's own composed rune can declare one today.
low simple
5/5 criteria