_context_override_conflicts (dispatch_workflow.py:657-667) refuses any live run that overrides a key declared in engine_spec.context, when the plan contains an irreversible send.
The problem: engine_spec.context is the only thing that drives Studio's run-panel input fields (dispatch_workspace_reads.py:145-151 → programs.js:536-547). So a published workflow must either declare a key (→ gets a field, but any real value trips the gate) or omit it (→ no gate, but no field to type into). There's no third option — empty-string and null defaults still trip it, since the check is key-membership, not truthiness.
This affects shipped code, not just mine: examples/singleops_backlog_to_google_sheet.json declares spreadsheet_id: "REPLACE-WITH-YOUR-SHEET-ID" and dave/retainer-billing-run (v1.6.0) declares clients/billing_period with dummy defaults ahead of a Stripe charge node. Both trip the gate on first live run under v1.4.1.
Also: the "Review new blast radius & re-approve" button only renders when the error matches /CHANGED/i and carries plan_pin (programs.js:599-612). The context-override refusal has neither, so the user sees raw red error text with no recovery action.
Suggestion: treat a placeholder/sentinel default as unapproved rather than approved, or render the re-approve button for context_conflicts too.