WORK-653
ID:WORK-653Status:done

The storytelling compositions place section instead of card

The composed character, realm and faction place {% card %}, because it was the only primitive with a media split. Once section has the split, they move to it (SPEC-160 D4). The expected differences are listed in D4: rf-section__* element classes, a real <header> for title and description, no surface, and the portrait regaining data-media="portrait".

Priority:mediumComplexity:moderateMilestone:v0.43.0Source:SPEC-160,SPEC-147
claude/v0-43-0-review-ny4nl1 View source

Criteria completion

Criteria completion: 7 of 7 (100%) checked; history from Oct 26 to Oct 260%25%50%75%100%Oct 26Oct 26
Branches 3
History 4
  1. 84783be
    • ☑ `character`, `realm` and `faction` place `{% section %}` with `media-position` passed through, and `character` passes `media="portrait"`
    • ☑ The composed `character` declares a `media-position` attribute with `default: top` (today it writes a bare `{% card %}` and declares none), so its output position matches the card default it had
    • ☑ The three compositions raise no slot-role warning ({% ref "WORK-659" /%}) on `section`, asserted in a test
    • ☑ The composed `character` renders its portrait with `data-media="portrait"` again
    • ☑ The JSON-LD, RDFa and registry comparisons against the plugin are re-run, not re-recorded, and any movement is explained in the resolution
    • ☑ The recorded rendered-tree differences in the composed-storytelling tests are updated, each change explained
    • ☑ `plugins/storytelling/` is unchanged and still passing its own tests (SPEC-147 D1)
    by bjornolofandersson
  2. 59a86fd
    Created (ready)by bjornolofandersson
  3. fa4981f
    Content editedby Claude
    plan: ADR-046 section's header grammar, WORK-659, and v0.43.0 refinement
  4. abc833f
    Content editedby Claude
    plan: v0.41.3, v0.42.0 and v0.43.0 milestones

Acceptance Criteria

  • character, realm and faction place {% section %} with media-position passed through, and character passes media="portrait"
  • The composed character declares a media-position attribute with default: top (today it writes a bare {% card %} and declares none), so its output position matches the card default it had
  • The three compositions raise no slot-role warning (WORK-659) on section, asserted in a test
  • The composed character renders its portrait with data-media="portrait" again
  • The JSON-LD, RDFa and registry comparisons against the plugin are re-run, not re-recorded, and any movement is explained in the resolution
  • The recorded rendered-tree differences in the composed-storytelling tests are updated, each change explained
  • plugins/storytelling/ is unchanged and still passing its own tests (SPEC-147 D1)

Blocked by

  • WORK-652
  • WORK-659: section's anchored header grammar, so the comparisons are taken against it
  • WORK-650: so the comparisons are re-run once, without the dead content-section difference

References

  • SPEC-160: D4.
  • SPEC-147: D1, D2.

Resolution

Completed: 2026-10-26

Branch: claude/v0-43-0-review-ny4nl1

What was done

  • packages/content/test/fixtures/composed-storytelling/runes/{character,realm,faction}.md place {% section %}.
    • realm and faction forward the split attributes they already declared.
    • character declares media-position (top | bottom | start | end, default top) and passes media="portrait".
  • composed-character.test.ts, composed-realm-faction.test.ts and the realm/faction snapshot are updated, each changed assertion commented.
  • packages/content/test/composed-section-roles.test.ts (new): no slot-header-role on any fixture of the three, plus a control without the metablock that gets the expected blurb finding.

Comparisons, re-run not re-recorded

  • JSON-LD against the SEO baseline at both harvest points, the mediatext comparison's graph, and the storytelling registry snapshot (registrations, name index, types, warnings, and the cross-links lost inside nested runes): all unchanged.

Rendered-tree differences, each as SPEC-160 D4 predicts

  • Element classes rf-card__* → rf-section__*.
  • The name is section's headline (<h1 data-name="headline">) in a real <header>, where inside card it was rf-card__title in the body. The metablock after it keeps the description out of the blurb role.
  • No card surface.
  • The composed character's portrait is data-media="portrait" again.

Notes

  • Two differences D4 did not list:
    • section's align default adds rf-section--start and data-align="start";
    • the composed character root now carries data-media-position="top", as realm and faction already did. Its new enum attribute becomes a modifier of the generated config (D2a).
  • plugins/storytelling/ is untouched.