CampaignArticleNote join model (campaign_id, article_id, has_rich_text :notes). One note per campaign per article (unique constraint). DM of the campaign can create/update/destroy. Shown in the article right panel sidebar as a “Campaign Notes” section (DM-only, below Sessions). CRUD: new/create/edit/update/destroy nested under articles (/articles/:article_id/campaign_article_notes). MCP parity: create_campaign_article_note, get_campaign_article_note, update_campaign_article_note, destroy_campaign_article_note (140 tools total). Seeds updated (Marta Vance note). 19 new tests, 549 total green. ADR-0064.
BL-054
Shipped