Problem
Two parallel outbound delivery SPIs exist with overlapping Slack and Teams implementations:
casehub-connectors — Connector SPI (id() + send(ConnectorMessage)):
- Implementations: Slack, Teams, Twilio SMS, WhatsApp, Email
- Consumers: none yet (no code in any repo calls
Connector.send())
- Trigger: not wired to any event
quarkus-work-notifications — NotificationChannel SPI (channelType() + send(NotificationPayload)):
- Implementations: Slack, Teams, HTTP webhook
- Consumer:
NotificationDispatcher (wired to WorkItemLifecycleEvent)
- Trigger: WorkItem lifecycle events only
Slack and Teams are implemented twice. As features grow — case fault notifications, stalled commitment alerts, escalation notifications — a third and fourth parallel implementation becomes likely.
Proposed resolution
casehub-connectors is the canonical outbound delivery primitive. It is lower-level (no WorkItem coupling), more complete (adds SMS, WhatsApp, Email), and correctly named.
quarkus-work-notifications's NotificationChannel implementations for Slack and Teams should be removed. NotificationDispatcher should delegate to a Connector instance (found via CDI @Any Instance<Connector>).
The NotificationChannel SPI can remain as the quarkus-work-level abstraction for rule matching and dispatch — but its implementations must delegate to Connector rather than calling outbound APIs directly.
This also unblocks: stalled Qhorus commitment alerts, case fault notifications, and escalation notifications — all of which need outbound delivery but currently have no wired path.
Affected repos
casehub-connectors — authoritative SPI (no changes needed)
quarkus-work-notifications — SlackNotificationChannel, TeamsNotificationChannel replaced with Connector-delegating wrappers
quarkus-qhorus — future WatchdogAlertSink SPI implementation would use Connector
casehub-engine — future case fault/timeout notifications would use Connector
Part of
#4 (platform coherence audit — finding #7)
Problem
Two parallel outbound delivery SPIs exist with overlapping Slack and Teams implementations:
casehub-connectors—ConnectorSPI (id()+send(ConnectorMessage)):Connector.send())quarkus-work-notifications—NotificationChannelSPI (channelType()+send(NotificationPayload)):NotificationDispatcher(wired toWorkItemLifecycleEvent)Slack and Teams are implemented twice. As features grow — case fault notifications, stalled commitment alerts, escalation notifications — a third and fourth parallel implementation becomes likely.
Proposed resolution
casehub-connectorsis the canonical outbound delivery primitive. It is lower-level (no WorkItem coupling), more complete (adds SMS, WhatsApp, Email), and correctly named.quarkus-work-notifications'sNotificationChannelimplementations for Slack and Teams should be removed.NotificationDispatchershould delegate to aConnectorinstance (found via CDI@Any Instance<Connector>).The
NotificationChannelSPI can remain as the quarkus-work-level abstraction for rule matching and dispatch — but its implementations must delegate toConnectorrather than calling outbound APIs directly.This also unblocks: stalled Qhorus commitment alerts, case fault notifications, and escalation notifications — all of which need outbound delivery but currently have no wired path.
Affected repos
casehub-connectors— authoritative SPI (no changes needed)quarkus-work-notifications—SlackNotificationChannel,TeamsNotificationChannelreplaced withConnector-delegating wrappersquarkus-qhorus— futureWatchdogAlertSinkSPI implementation would useConnectorcasehub-engine— future case fault/timeout notifications would useConnectorPart of
#4 (platform coherence audit — finding #7)