Acceptance Criteria
- The plugin
testimonial declares author and role attributes; when either is set it is used and the paragraph is not parsed, and when neither is set the paragraph is parsed as today - Its JSON-LD (
Review, Person author with jobTitle, Rating) and rendered byline are the same whether the attribution is written as attributes or as the paragraph, asserted by a test refrakt marketing migrate-testimonial --apply is run over site/content and the SEO fixtures, rewriting the 5 testimonials in 4 files that WORK-668 foundseo:baseline:check and contracts --check pass with the migrated fixtures, without regenerating the baseline- The testimonial reference page documents
author and role as the way to write the byline, and notes that the paragraph form still works for now - A changeset records the attributes and the codemod
References
- SPEC-181: D7, the rollout's gate 3.
- SPEC-161: D1.
- WORK-668: the composed testimonial and the codemod.
- BUG-019: the comma attribution; the codemod and the plugin read it the same way.
Resolution
Completed: 2026-10-30
Branch: claude/milestone-v0-44-0-ism7ni
What was done
plugins/marketing/src/tags/testimonial.ts: author and role attributes. When either is set it is used and the paragraph is not read; otherwise parseAttribution reads the paragraph as before.plugins/marketing/test/seo.test.ts: the Review / Person / Rating graph and the rendered tree are identical in both forms, and attributes win over a paragraph.refrakt marketing migrate-testimonial --apply run over site/content and contracts/seo-baseline/fixtures: 5 testimonials in 4 files.seo:baseline:check passes without regenerating; contracts are unchanged.- The testimonial reference page documents
author / role and the codemod, and notes the paragraph still works. The plugin snippet (and packages/vscode/snippets/runes.json) uses the attributes. - Changeset
testimonial-author-role.
Notes
testimonial.comma.md now pins the comma role as an attribute value (role=", CTO at Acme"), which is how the plugin's parser read it (BUG-019). Its parser probe now lives in the codemod's reading of the paragraph.packages/vscode/snippets/runes.json was edited by hand to match, since tsx was not available to run generate-snippets.