WORK-685
ID:WORK-685Status:done

The plugin testimonial accepts author and role attributes, and the codemod is applied to this repository

The composed testimonial (WORK-668) takes author and role attributes and reports a **Name** — Role paragraph as content-unmatched. The plugin testimonial takes no author attribute. So WORK-668 built refrakt marketing migrate-testimonial but did not apply it: the rewritten content would not have rendered through the plugin.

The staging site renders the same content as main (SPEC-181 D7). The plugin testimonial therefore learns the attributes first, and the codemod is then applied.

Priority:highComplexity:simpleMilestone:v0.44.0Source:SPEC-181,SPEC-161
claude/milestone-v0-44-0-ism7ni View source

Criteria completion

Criteria completion: 6 of 6 (100%) checked; history from Oct 30 to Oct 300%25%50%75%100%Oct 30Oct 30
Branches 2
claude/milestone-v0-44-0-ism7ni current done
main doneclaude/rune-compositions-staging-f9ouim ready
History 3
  1. 4563e37
    • ☑ 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 found
    • ☑ `seo: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
    by bjornolofandersson
  2. 989c350
    Created (in-progress)by bjornolofandersson
  3. d68f00e
    Content editedby Claude
    plan: stage testimonial; plugin runes accept the composed form first

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 found
  • seo: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

Blocks

  • WORK-681

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.