CTA overrides on orbit_compose_stripo_email — vary text and href per send without touching Stripo
Stripo's write APIs for existing emails are a dead end. PUT and PATCH on /emails/<id> return 405, and the inline-html dataSources field that looks like it should let you override copy gets silently regenerated from the master template on every gen pass. So Orbit stops trying to write back. orbit_compose_stripo_email now accepts an html_overrides argument that fetches the Stripo-rendered email after push, Cheerio-patches the CTA text and href on every a.es-button element, and writes the patched HTML to disk for Braze sync. Stripo stays the source of structure; the per-send CTA variation happens client-side, after Stripo has done its job.
What shipped
•html_overrides on orbit_compose_stripo_email. Two optional fields — cta_text (≤200 chars) and cta_href (≤2000 chars). After Stripo generates the email server-side, Orbit fetches the rendered HTML, applies the patches to every a.es-button via Cheerio, and writes the result to ~/Orbit/outputs/stripo-compose/<timestamp>-patched.html. The patched file is what your Braze sync should pull from — Stripo's copy is left structurally correct but contains the unpatched master-template CTA.
•Requires push:true. The override is meaningless on preview-only compose because there's no Stripo email yet to fetch back and patch. Returned on the tool response under html_overrides_result, carrying status (patched / no_buttons_found / fetch_failed / html_not_extractable), the patched file path, the count of buttons matched, and the list of individual patches applied.
•Why client-side. The Stripo write surface for existing emails was probed exhaustively in 0.18.x: PUT /emails/<id> returns 405, PATCH returns 405, and the dataSources inline-html field that the docs imply is editable gets overwritten by Stripo's own renderer on the next gen pass. The only working write path is replacing the canonical content[] payload, which loses per-send specificity and re-runs every module. html_overrides treats Stripo as source-of-structure only and does per-send variation downstream.