Give properties and refs a stated rule State the rule that decides which map a node belongs in, and correct the authoring docs to describe what the catalog actually emits. Documentation and a lint, not a migration — none of SPEC-133's ~97 node moves happen here.This is in this milestone for one reason: WORK-561 has to choose a map for roughly ten nodes, and without a stated rule those choices get made ad hoc and re-made later.
medium simple
Make every schema.org source addressable Roughly ten schema sources are in neither properties nor refs, so they are reachable by neither route the applier has: not in the field bag, and carrying no data-name. Give each one a name or a bag entry before its rune migrates.Purely additive, no schema knowledge required, and it can land in parallel with WORK-565. It is a prerequisite for the runes that carry these sources, not for the mechanism itself.
high simple
Baseline the JSON-LD every rune emits today Commit a snapshot of today's structured data for all 30 emitting runes, before a single call site changes. Every later item in this milestone is then reviewed as a diff against it.This goes first, and nothing in the milestone starts before it.
high simple
Harvest SEO after the pipeline, and assert both harvest points agree Recompute seo from enrichedPages once runPipeline returns, and add the two-point invariant that keeps the RDFa and the JSON-LD from drifting apart.Independent of the schema table — it fixes a live hole on its own and builds the net every later item lands into.
high moderate
Move Lumina off the schema.org channel Six Lumina rules select on RDFa property= attributes. Four of them already match nothing. Move all six to the BEM element classes that exist for the same nodes, and add the assertion that keeps presentation off this channel.Half of this is a bug fix (BUG-015) regardless of whether anything else in the milestone ships. The other half is removing a tripwire that WORK-565 onward would otherwise be walking across.
medium simple
The schema table and its applier The mechanism: a declarative schema table declared on the rune, an applier that realises it at transform time, and the three entry kinds (SPEC-130's entities, text and index) that let it express what the 30 emitters do imperatively today.No rune migrates here. This item builds the thing and proves it on the two runes the spec already prototyped; WORK-567 through WORK-571 are the migration.
high complex
Group A — seven runes that assert a type and describe nothing gallery, data-table, budget, itinerary, map, symbol and blog declare a schemaOrgType and no property mapping at all. Each either gains a real mapping or stops emitting a type.Apply D4: a row that resolves to a bare @type emits nothing.
medium moderate
Group B — fourteen flat mappings, and the type that does not exist figure, embed, cast-member, character, realm, faction, plot, lore, organization, pricing, tier, timeline-entry, track and breadcrumb-item convert to declarative tables. These are the clean case: the transform already computes the values, and the table only names their schema roles.Mechanical, with one exception that is not.
medium moderate
Retype and wrap — accordion, recipe and how-to accordion, accordion-item, recipe and how-to set typeof on nodes they did not create and hand-write a <div property="text"> wrapper to supply the value. Replace both with a declaration.The HTML must not change. That is the whole difficulty.
medium moderate
Synthesised entities and index-derived values The last two Group C shapes. testimonial and event build entity spans by hand from text pulled out of other tags; breadcrumb and timeline emit positions from a loop index. Both become declarations.Closes Group C, and with it the migration.
medium moderate