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.