Two robustness fixes in the alert/report execution command:
1. Missing executor user: when the configured executor cannot be resolved
(security_manager.find_user returns None), the content-generation sites
(_get_screenshots / _get_csv_data / _get_embedded_data) now raise a
dedicated ReportScheduleExecutorNotFoundError instead of failing later
with an opaque NoneType error. The guard lives at the content sites so
it raises inside the state machine's error envelope, preserving the
ERROR execution-log row and the owner error notification. The run()
boundary continues to delegate to the state machine (a missing user is
tolerated there, matching prior behavior) so visibility is unchanged.
2. Slack v2 migration revert: update_report_schedule_slack_v2 now snapshots
every recipient it mutates and reverts all of them on failure, instead
of only the loop variable, and no longer raises UnboundLocalError when
the failure occurs before the loop binds a recipient.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>