This document describes the operational dependency path between the OTM Engine, the Task Database, and the Dashboard UI.
The Execution Path (OTM Engine → DB → WSServer → UI) is fully operational. The Visibility/Trigger Path (DB → SyncBridge → WSServer) is currently obstructed by the disabled Slack plugin, preventing the dashboard from receiving automated refresh triggers.
graph TD
subgraph "Local Execution Layer"
OTM[("OTM Engine /<br/>FAB Orchestrator")]
DB[("FAB Tasks DB<br/>(SQLite)")]
OTM -->|Read/Write| DB
end
subgraph "Visibility & Sync Layer"
SyncBridge[("Sync-Bridge<br/>(Slack Plugin)")]
FabSync[("fab_sync /<br/>Slack Client")]
DB -.->|Poll/Watch| SyncBridge
SyncBridge -->|API Push| FabSync
FabSync -->|Sync Updates| SlackAPI[("Slack API")]
end
subgraph "Dashboard Layer"
WSServer[("Dashboard WS Server")]
Dashboard[("Dashboard UI")]
DB -->|Direct Query| WSServer
WSServer -.->|WebSocket Push| Dashboard
%% Note: The broken link
SyncBridge -.->|Trigger Refresh| WSServer
end
%% Dependency Path
style FabSync stroke:#f00,stroke-width:2px
style SyncBridge stroke:#f00,stroke-width:2px
- Execution Path (Healthy): The OTM engine successfully writes to the SQLite database. The Dashboard WebSocket server reads this database directly to serve state to the UI.
- Trigger Path (Blocked): The Sync-Bridge depends on the Slack integration (
fab_sync). Because the Slack plugin is disabled inopenclaw.json, the Sync-Bridge crashes when attempting to check the Slack link, preventing it from sending "Refresh" signals to the WebSocket server. - Immediate Resolution: Bypass the Sync-Bridge refresh trigger; the dashboard server should poll the database directly or allow for a manual refresh trigger that does not depend on the Slack plugin.