Stripo push is wired end-to-end, plus an audit + fix tool for saved modules
The Stripo integration's push half is now live — orbit_compose_stripo_email with push:true creates a real email in your Stripo workspace from your synced module library, every time. Two new tools land alongside it: orbit_audit_stripo_modules catches a class of structural issues that emerge when you reuse modules across contexts (the lopsided-block bug being the most visible one), and orbit_fix_stripo_module returns the corrected HTML for paste-back into Stripo's module editor. Stripo's REST API is read-only for modules, so the fix is necessarily manual — but the audit catches everything programmatically, including a surprise gotcha around how Stripo's API references modules.
What shipped
•orbit_compose_stripo_email push:true now creates real emails in your Stripo workspace via the canonical-JSON /emailgeneration/v1/email endpoint. Master template stays untouched (a hard programmatic guard in the HTTP client refuses any non-GET request to /template paths — defence-in-depth). Push response includes the new email's ID, the editor URL deeplink (so you can click straight to it), and the public preview URL.
•Discovered the hard way that Stripo's dataSources[].value[].id field references the module UID (the short positional string like 'STRIPE1' / 'STRUCTURE7'), NOT the numeric module ID. Posting numeric IDs produces silent empty emails — Stripo accepts the request, strips the gen-area marker, and fills with nothing. Now uses UIDs throughout. Failing loud with a clear error if a synced module is missing its UID metadata (means an older sync ran against an API surface that didn't return the field — re-sync to fix).
•Discovered emailName cannot contain square brackets — Stripo rejects with a generic 'Can not save generated email' 400. Other ASCII punctuation (parens, slashes, ampersands, middots), Unicode arrows, and ISO timestamps all save fine. Generated names now use 'Orbit · subject · timestamp' format.
•New orbit_audit_stripo_modules tool. Runs six structural checks against every synced module: orphaned es-right/es-left floats (the lopsided-block bug — module captured a multi-column row, renders with a visual gap on one side when used standalone), STRIPE-with-nested-columns anti-pattern (proactive flag for the same root cause), sub-600px hardcoded widths (module designed for a narrower context), missing image alt text, footer modules without unsubscribe Liquid variables, and (optionally, on demand) broken image URLs via HEAD-check. Generates a markdown audit report at ~/Orbit/outputs/stripo-audit/.
•New orbit_fix_stripo_module tool. For auto-fixable findings (orphaned_float and sub_600_width), returns the corrected HTML with step-by-step paste-back instructions for Stripo's module editor. Manual paste required because Stripo's REST API has no module-edit endpoint (POST/PUT/PATCH on /modules return 405 / 500 — confirmed via probe). Fix is permanent at source; audit + sync confirms it after.
•Updated orbit_setup_stripo with a new 'Module design best practices' section. The most common anti-pattern that bites: capturing an entire multi-column STRIPE row from your original template as a single saved module, then dropping it into a different layout context. The internal column-positioning markup (es-right / es-left floats) gets baked into the module and renders lopsided. Best practice: save modules as standalone single-column blocks, aim for 600px-wide top-level content tables, bake unsubscribe Liquid variables into footers, add alt text to every image.
•Onboarding troubleshooting now flags a Stripo-side gotcha: Liquid variables in your composed emails (e.g. {{content_blocks.${footer-year}}}) appear as literal text in the rendered preview. Expected behaviour — Stripo's generateemail does NOT process Liquid at generation time. Your ESP substitutes them at send time, OR you wire up Stripo's content_blocks data-source mechanism. Not an Orbit bug, just non-obvious.
•Sharper extension settings descriptions for Stripo Master Template ID and Default Folder ID — they now tell you exactly where in Stripo's URL to find the IDs, and which tools require which credential.
•Specific error code 'stripo_no_gen_area' for the most common setup gap (master template exists but has no generation-area marker). Returns an actionable hint pointing at Stripo's editor instead of a generic error.