Module-bindings inspector now catches the silent-no-op variable, plus a hardened binding skill and a probe-email recipe in the guide
0.19.6 made per-send substitution on Stripo modules work end-to-end. 0.19.7 is the follow-up that closes the loop on verification. A registered Smart Property can point at a CSS class hook that doesn't exist anywhere in the module's HTML: the variable accepts values at compose time, the API returns success, and substitution silently never fires. You only notice when the defaults ship in production. orbit_inspect_stripo_module_bindings now flags exactly this case per-variable, with the fix path inline. The stripo-module-bindings skill has been hardened around what the inspector still can't catch on its own: a pre-flight checklist before treating a binding as done, the end-to-end probe-email recipe that's the only honest way to confirm substitution actually fires, the canonical p_* naming table, and worked examples of three common silent-no-op patterns. The Stripo Modular MCP integration guide has been extended with the same probe-email procedure so anyone working from the docs can verify their bindings without loading the skill first.
What shipped
•Bug fix: orbit_inspect_stripo_module_bindings now detects registered Smart Properties bound to a CSS class hook that doesn't exist in the module's HTML. Before, a variable registered against .esd-gen-headline on a module whose Design tab never created an esd-gen-headline class anywhere would pass inspection clean: the variable was structurally valid, just bound to nothing. Compose calls accepted values for it and Stripo silently dropped them on substitution. The inspector now cross-references every registered variable's blockMapping[].selector against the actual class hooks in the module HTML and emits a per-variable warning in the notes array when the target class is missing, with the exact fix path: either add the class in Stripo's Design tab or remove the dead registration.
•Skill update: stripo-module-bindings hardened with the four things the inspector alone can't catch. A pre-flight verification checklist that runs before any binding work is treated as done. The end-to-end probe-email recipe (push a real email with sentinel values, fetch the rendered HTML, confirm the sentinels landed), which is the only honest way to verify substitution actually fires given that structural inspection can't catch every silent-no-op pattern. A canonical naming-conventions table for p_* Smart Property variables (p_title / p_description / p_cta_text / p_cta_href / p_image_src / p_image_alt) so workspaces don't drift across modules. And worked examples of three common silent-no-op patterns: selector-without-target (the case the new inspector check covers), class-on-wrapper (where the class lives on a parent element that doesn't carry the bindable attribute), and the Smart Element wizard's top-level link-field dead-end (the editor binding that's invisible to the API).
•Guide update: Stripo Modular MCP integration guide gains the probe-email recipe inline. The new section, 'Verifying that bindings actually substitute: the probe-email recipe,' walks through Stripo's preview-API endpoint (/cabinet/stripeapi/v2/preview/web/<uuid>), the four common substitution failure modes (missing class hook, class on wrong element, wizard-bound CTA, Smart Container slot misregistration), and the five-step probe procedure: push with sentinel values, fetch the previewed HTML, search for sentinels, diagnose the failure mode if any are missing, fix and re-probe. Existing sections sharpened to acknowledge that orbit_inspect_stripo_module_bindings catches structural gaps but not substitution failures: the probe is the only way to close that gap. Reading time bumps from 9 to 13 minutes.