Acceptance Criteria
site/staged-runes/testimonial.md declares the attribution field with an item model and fills: { author: $name, role: $role }, and still declares author and role- Both forms render identically and publish the same
Review / Person / Rating graph, asserted against the plugin by the comparison tests - A comma attribution fills the role without the comma (BUG-019 fixed in the composition), and the comparison test records it as an explained difference
site/content and the two SEO fixtures return to the paragraph form, and seo:baseline:check passes without regeneratingrefrakt marketing migrate-testimonial, the marketing ./cli-plugin export and their changeset entries are removed; the plugin keeps author / role and parseAttribution- The testimonial reference page, the plugin snippet and the editor snippet teach the paragraph form, with
author / role documented as the alternative refrakt validate --site staging reports nothing that --site main does not
References
- SPEC-182: D6, D7.
- WORK-668, WORK-685: what is reversed.
- BUG-019: the comma attribution.
Resolution
Completed: 2026-10-30
Branch: claude/milestone-v0-44-0-ism7ni
What was done
site/staged-runes/testimonial.md: an attribution field with an item model and fills: { author: $name, role: $role }. The author/role attributes are kept.packages/content/test/composed-testimonial.test.ts:- both forms render identically and produce the baseline
Review graph; - the comma fix is asserted as the one explained difference (BUG-019);
- the
fill-overridden warning is asserted; - the codemod tests are replaced by a check that this repository's testimonials use the paragraph form.
- Reverted to the paragraph form:
site/content/index.md, site/content/runes/marketing/testimonial.md, and contracts/seo-baseline/fixtures/testimonial{,.comma}.md. seo:baseline:check passes unregenerated. - Removed:
plugins/marketing/src/migrate-testimonial.ts, cli-plugin.ts, the ./cli-plugin export, the codemod exports, the cli-overview row, and the changeset mentions. Added .changeset/paragraph-fills.md. - Snippets (plugin and VS Code) teach
**Name** — Role.
Notes
- The plugin keeps
author/role and parseAttribution. Its own byAttributes rule (either attribute disables the paragraph) differs slightly from the composition's per-attribute precedence; both forms written together is warned about.