Work-item Slack reminders accept undeliverable targets
Summary
Work-item reminder validation accepts Slack targets with an empty chat_id, even when no Slack webhook is configured.
This allows a reminder to be created successfully, but the scheduler later fails because there is no usable destination.
An explicit empty delivery_targets entry also prevents Slack default-channel resolution.
Reproduction
Create a Slack reminder without a chat ID or webhook:
opensre work add \
--title "Check deployment" \
--remind-at "2026-09-12T09:00" \
--channel-provider slackThe reminder is accepted. At execution time, Slack delivery fails because the target has no channel and no webhook destination.
Expected behavior
Slack should only be accepted without a chat_id when a webhook is actually configured.
If a Slack default channel is configured, the scheduler should resolve it before creating an explicit delivery target.
Affected files
- tools/system/work_items/delivery.py
- infrastructure/scheduling/scheduler/delivery_plan.py
- infrastructure/scheduling/scheduler/delivery.py
Acceptance criteria
- Empty Slack targets are rejected unless a webhook is configured.
- Configured Slack default channels are resolved correctly.
- Reminder creation reports an actionable validation error.
- Add tests for webhook-only, default-channel, and unconfigured Slack cases.
Source: Tracer-Cloud/opensre