Production-test of orbit_compose_stripo_email on a multi-module welcome email surfaced four issues; this release fixes all of them. Multi-email briefs now build one at a time with an explicit gate between each. Push responses always make it back through Anthropic's 1 MB tool-result cap, so you can verify what landed instead of guessing. Copy and image overrides no longer silently disappear when push:true is set — the tool now refuses with a clear message rather than pushing the wrong content. And the master-template setup instructions now tell you to zero out the wrapping Structure's padding so pushed modules render flush with the canvas.
What shipped
•Behaviour fix — multi-email briefs (welcome series, winback flows, anything covering more than one email) now compose one email at a time. Orbit builds email 1, renders the preview, and stops. It then asks whether to push, change, move to email 2, or stop. Stops a wrong header on email 1 from compounding into the same wrong header on emails 2–5. Opt out by saying 'build all of them, I'll review at the end' — the gate is the default, not a policy.
•Bug fix — copy_overrides and image_overrides used to be silently discarded when pushing to Stripo. The push payload sends module UIDs and Stripo regenerates server-side from its own copy of each module, so client-side substitutions never reached the rendered email. The tool now hard-fails with `overrides_not_pushable` when push:true is combined with non-empty overrides, and the error message tells you the two paths forward: compose with push:false to receive the override-applied HTML for paste-in, or push without overrides and apply edits in Stripo's editor. Per-slot overrides via Stripo's canonical-JSON `values` field are roadmap once Stripo's findmodules API exposes slot keys.
•Bug fix — the compose tool used to embed the assembled HTML inside its response payload, which on emails with several inlined images blew Anthropic's 1 MB tool-result cap. The push fired against Stripo, the email landed in your workspace, but the chat saw an error and you couldn't confirm what was created. Now the assembled HTML always gets written to disk at `~/Orbit/outputs/stripo-compose/<timestamp>.html` and the response carries `html_path` + `html_byte_count` instead of the raw HTML. Pushed responses drop the HTML entirely (you're past preview at that point); preview-mode responses keep the artifact-render directive so the layout still shows inline.
•Behaviour change — the image-cache prototype shipped in 0.18.12 has been withdrawn. Downloading every Stripo CDN image at sync time and inlining as base64 data: URIs solved the artifact-preview broken-image problem, but the resulting payload regularly cleared the 1 MB tool-result cap on real-world emails. Trade-off accepted: artifact previews now render with broken-image icons (Claude's iframe CSP blocks external img-src), and the directive surfaces the saved file path so you can open the HTML in a browser to see it with images. orbit_sync_stripo_modules no longer downloads images; the local image cache is gone.
•Setup fix — orbit_setup_stripo Step 3 instructions now include zeroing out the wrapping Structure's padding before placing the generation-area Container. Skipping this step is what causes pushed full-bleed modules to render with ~24 px of dead space on the left and right inside Stripo. The Structure is just a wrapper; padding belongs on individual modules, not on the gen-area's parent. Troubleshooting block also updated for users hitting it post-setup. An automated probe that walks the master template's HTML and warns on non-zero Structure padding is on the to-do list — for now the docs cover it and a 30-second manual check in Stripo's editor confirms.