RelOps
--
Releases
-
active pipelines
Open Bugs
-
blocking releases
Bot Status
-
Test Runs (7d)
-
Integrations
-
services connected
Tickets by Platform
Integration Health
Release Phases
Release Pipeline
TagPlatformPhaseBugs
Activity Feed
Waiting for activity...
Release Management
TagPlatformPhaseBugsStatusTargetActualFeaturesActions
OpenClaw Bot
Quick Actions
Command
Bot Log
Test Results
IDRunnerPlatformStatusPass/FailDurationWhen
ClickUp Tickets
Tickets by Platform
Status Breakdown
PlatformTitleStatusPriorityAssigneesUpdatedLink
Integrations
Core Services
Testing & Monitoring
Mobile Build Sources
System Architecture
System Diagram
Ecco RelOps Architecture
Platform Overview
graph TB
  subgraph CLIENT["Dashboard and Clients"]
    UI["Web Dashboard\nHTML + Canvas Charts"]
    WS["WebSocket Client\nReal-time Updates"]
    UPLD["Upload Portal\nTokenized Sideload"]
  end

  subgraph SERVER["Express Server"]
    API["API Routes\n9 Route Modules"]
    AUTH["Auth Middleware\nSession / bcrypt / Tokens"]
    RL["Rate Limiter\n120 req/min"]
    WSS["WebSocket Server"]
    EVENTS["Event Bus\nPub/Sub Broadcasts"]
  end

  subgraph BOTENG["OpenClaw Bot Engine"]
    ENGINE["Chat Engine\nOpenAI GPT Tool Calling"]
    SCHED["Job Scheduler\nQueue + Cron + Triggers"]
    TOOLS["Tool Executor"]
    DECISIONS["Decision Engine\nTriage, Routing, Paging"]
  end

  subgraph INTEG["External Integrations"]
    CU["ClickUp\nTicket Management"]
    GH["GitHub\nPRs, Deploys, CI"]
    SLACK["Slack / Discord\nNotifications"]
    DD["DataDog\nMonitoring"]
    TR["TestRail\nTest Case Tracking"]
    GD["Google Drive\nReport Storage"]
    OAI["OpenAI API\nGPT Chat + Tools"]
    PD["PagerDuty\nCritical Paging"]
    BS["BrowserStack\nDevice Cloud"]
    PC["Play Console\nAndroid Builds"]
    ASC["App Store Connect\niOS / tvOS Builds"]
    MBI["Mobile Builds\nUnified Ingest"]
    SLD["Sideload Dropzone\nAppleTV / FireTV"]
  end

  subgraph RUNR["QA Test Runners"]
    PW["Playwright\nWeb + Cucumber"]
    APPR["Appium\niOS / Android / TV\nBrowserStack"]
    K6R["k6\nLoad + API Tests"]
    VISREG["Visual Regression\nPlaywright Screenshots"]
  end

  subgraph DATALAYER["Data Layer"]
    PG["PostgreSQL 16\n13 Migrations"]
    PM2R["PM2\nProcess Manager"]
  end

  UI -->|"HTTP + Session"| API
  UI -->|"Real-time"| WS
  UPLD -->|"Tokenized POST"| API
  WS --- WSS
  API --> AUTH
  AUTH --> RL
  API --> ENGINE
  API --> CU
  ENGINE --> TOOLS
  SCHED --> ENGINE
  TOOLS --> CU
  TOOLS --> GH
  TOOLS --> PW
  TOOLS --> APPR
  DECISIONS --> PD
  MBI --> PC
  MBI --> ASC
  MBI --> SLD
  EVENTS --> WSS
  ENGINE --> EVENTS
  SCHED --> PG
  SCHED --> MBI
  PW --> PG
  APPR --> PG
  APPR --> BS
  API --> PG
  AUTH --> PG

  classDef client fill:#1a1a2e,stroke:#e91e8c,stroke-width:2px,color:#e8e8f0
  classDef server fill:#15151e,stroke:#448aff,stroke-width:2px,color:#e8e8f0
  classDef bot fill:#15151e,stroke:#e91e8c,stroke-width:2px,color:#e8e8f0
  classDef integration fill:#15151e,stroke:#00e676,stroke-width:2px,color:#e8e8f0
  classDef runner fill:#15151e,stroke:#b388ff,stroke-width:2px,color:#e8e8f0
  classDef data fill:#15151e,stroke:#ffd740,stroke-width:2px,color:#e8e8f0

  class UI,WS,UPLD client
  class API,AUTH,RL,WSS,EVENTS server
  class ENGINE,SCHED,TOOLS,DECISIONS bot
  class CU,GH,SLACK,DD,TR,GD,OAI,PD,BS,PC,ASC,MBI,SLD integration
  class PW,APPR,K6R,VISREG runner
  class PG,PM2R data
        
API Route Map
graph LR
  subgraph ROUTES["Express API Routes"]
    direction TB
    R1["auth\nLogin, Logout, Users, Tokens"]
    R2["releases\nCRUD + Phase + Lifecycle"]
    R3["bot\nStart, Stop, Actions"]
    R4["integrations\nConfig + Test Connection"]
    R5["clickup\nMulti-List Tasks + Sync"]
    R6["test-runs\nResults + Triage + Suggestions"]
    R7["webhooks\nGitHub, ClickUp Events"]
    R8["sideload\nTokenized Build Upload"]
    R9["system\nHealth + Uptime"]
  end

  classDef route fill:#15151e,stroke:#448aff,stroke-width:1px,color:#e8e8f0
  class R1,R2,R3,R4,R5,R6,R7,R8,R9 route
          
Bot Tool Calling Flow
sequenceDiagram
  participant U as User
  participant API as Bot API
  participant E as OpenAI Engine
  participant T as Tool Executor
  participant I as Integrations
  participant DB as PostgreSQL

  U->>API: POST action
  API->>E: processMessage
  loop Tool Calling max 10
    E->>E: Chat Completion
    E->>T: Execute tools
    T->>I: Integration action
    I-->>T: Results
    T-->>E: Tool outputs
  end
  E->>DB: Log results
  E-->>API: Reply
  API-->>U: JSON response
          
Scheduler Architecture
graph TB
  subgraph SCHEDULER["Three-Tier Execution"]
    direction TB
    Q["Job Queue\nPolls bot_jobs every 5s"]
    C["Cron Tasks\nClickUp sync: 15m\nDataDog check: 10m"]
    W["Webhook Triggers\nGitHub PR, ClickUp events"]
  end

  Q --> ENG2["Bot Engine\nprocessMessage"]
  C --> ENG2
  W --> ENG2

  ENG2 --> DB2["PostgreSQL\nbot_jobs table"]
  ENG2 --> EVT["Event Bus\nWebSocket broadcast"]

  classDef sched fill:#15151e,stroke:#e91e8c,stroke-width:2px,color:#e8e8f0
  classDef engine fill:#15151e,stroke:#ffd740,stroke-width:2px,color:#e8e8f0
  classDef store fill:#15151e,stroke:#00e676,stroke-width:2px,color:#e8e8f0

  class Q,C,W sched
  class ENG2 engine
  class DB2,EVT store
          
Database Schema
erDiagram
  users ||--o{ sessions : has
  users ||--o{ upload_tokens : issues
  releases ||--o{ test_runs : tracks
  releases ||--o{ mobile_builds : receives
  releases ||--o{ release_approvals : gates
  test_runs ||--o{ test_failures : contains
  test_failures ||--o{ bug_suggestions : proposes
  bot_jobs }o--|| releases : belongs-to
  upload_audit }o--|| upload_tokens : logs

  users {
    int id PK
    varchar email
    varchar name
    varchar role
    timestamp created_at
  }
  releases {
    int id PK
    varchar tag
    varchar app
    varchar phase
    int bugs
    varchar status
    jsonb features
    date deployed_at
  }
  test_runs {
    int id PK
    varchar runner
    varchar platform
    varchar status
    int passed
    int failed
  }
  test_failures {
    int id PK
    int test_run_id FK
    varchar severity
    varchar kanban_status
    varchar pagerduty_dedup_key
    int suggestion_id FK
  }
  bug_suggestions {
    int id PK
    int failure_id FK
    varchar status
    text title
    text body
  }
  integrations {
    varchar service PK
    varchar status
    jsonb config
  }
  bot_jobs {
    int id PK
    varchar job_type
    varchar status
    jsonb input
    jsonb output
  }
  browserstack_apps {
    int id PK
    varchar platform
    varchar app_url
    varchar version
  }
  mobile_builds {
    int id PK
    int release_id FK
    varchar source
    varchar version
    jsonb metadata
  }
  release_approvals {
    int id PK
    int release_id FK
    varchar stakeholder
    varchar decision
  }
  upload_tokens {
    uuid token PK
    int user_id FK
    varchar scope
    timestamp expires_at
  }
  upload_audit {
    int id PK
    uuid token FK
    varchar filename
    bigint size_bytes
    varchar ip
  }
          
Test Runner Dispatch
graph LR
  subgraph PLATFORMS["Platform to Runner Mapping"]
    direction TB
    WEB["Web"] --> PWR["Playwright + Cucumber"]
    WEB --> VISREGR["Visual Regression"]
    IOS["iOS"] --> APPR2["Appium + BrowserStack"]
    AND["Android"] --> APPR2
    TVP["TV"] --> APPR2
    APIP["API"] --> K6R2["k6 Load Tests"]
  end

  PWR --> DBR[("test_runs")]
  VISREGR --> DBR
  APPR2 --> DBR
  K6R2 --> DBR

  classDef platform fill:#15151e,stroke:#e91e8c,stroke-width:2px,color:#e8e8f0
  classDef runner fill:#15151e,stroke:#b388ff,stroke-width:2px,color:#e8e8f0
  classDef db fill:#15151e,stroke:#ffd740,stroke-width:2px,color:#e8e8f0

  class WEB,IOS,AND,TVP,APIP platform
  class PWR,VISREGR,APPR2,K6R2 runner
  class DBR db
          
Integration Data Flow
graph TB
  subgraph INBOUND["Inbound Events"]
    GHW["GitHub Webhook"]
    CUW["ClickUp Webhook"]
    PCW["Play Console\nPoll / Callback"]
    ASCW["App Store Connect\nPoll"]
    SLDW["Sideload Upload\nTokenized"]
  end

  subgraph CORE["Core Platform"]
    WHR["Webhook Router"]
    BOT["OpenClaw Bot"]
    REL["Release Manager"]
    MB["Mobile Builds\nIngest"]
  end

  subgraph OUTBOUND["Outbound Actions"]
    CUA["ClickUp API
Tasks + Priority Map"] GHA["GitHub API
PR Status, Deploys"] SLA["Slack / Discord
Notifications"] DDA["DataDog API
Alert Queries"] TRA["TestRail API
Result Sync"] GDA["Google Drive
Report Upload"] PDA["PagerDuty
Critical Paging"] BSA["BrowserStack
App Upload + Sessions"] end GHW --> WHR CUW --> WHR PCW --> MB ASCW --> MB SLDW --> MB WHR --> BOT MB --> REL BOT --> REL BOT --> CUA BOT --> GHA BOT --> SLA BOT --> DDA BOT --> TRA BOT --> GDA BOT --> PDA BOT --> BSA classDef inbound fill:#15151e,stroke:#ffd740,stroke-width:2px,color:#e8e8f0 classDef core fill:#15151e,stroke:#e91e8c,stroke-width:2px,color:#e8e8f0 classDef outbound fill:#15151e,stroke:#00e676,stroke-width:2px,color:#e8e8f0 class GHW,CUW,PCW,ASCW,SLDW inbound class WHR,BOT,REL,MB core class CUA,GHA,SLA,DDA,TRA,GDA,PDA,BSA outbound
Technical Documentation
Stack
RuntimeNode.js 22 + TypeScript 6 FrameworkExpress 5 + WebSocket (ws) DatabasePostgreSQL 16 (13 migrations) AI EngineOpenAI GPT via ChatGPT OAuth ProcessPM2 (fork mode) HostingContabo VPS, Ubuntu 24.04 SSLCloudflare (server runs HTTP) AuthSession-based, bcrypt hashing, 24h TTL
API Endpoints
RouteMethodsPurpose
/api/authPOST, GETLogin, logout, session check, user CRUD
/api/releasesGET, POST, PUT, DELETERelease pipeline management
/api/botGET, POSTBot status, start/stop, send actions
/api/integrationsGET, PUT, POSTService config, connection testing
/api/clickupGET, POSTMulti-list task fetch, bug count sync
/api/test-runsGET, POSTTest execution results and stats
/api/webhooksPOSTInbound events from GitHub, ClickUp, Play Console, App Store Connect
/api/sideloadGET, POSTTokenized build uploads from Fatima (AppleTV/FireTV)
/api/systemGETHealth check, uptime, memory
Bot Engine
The OpenClaw bot uses OpenAI's tool-calling API to orchestrate release operations. It processes natural language commands and executes integration actions through a structured tool loop (max 10 iterations per request).
Job Queue: Polls bot_jobs every 5 seconds using FOR UPDATE SKIP LOCKED for concurrency safety.
Cron: ClickUp sync every 15 minutes, DataDog alert check every 10 minutes.
Triggers: GitHub PRs auto-queue QA test runs. ClickUp status changes trigger release bug syncs. Deploy events push Slack notifications. Play Console / App Store Connect builds ingest into mobile_builds and attach to releases.
Bug Suggestion Review: Test failures flagged with severity and kanban_status are converted into bug_suggestions, routed through a human review step, then pushed to ClickUp with severity→priority mapping (critical→1, high→2, medium→3, low→4).
Stakeholder Approval: Releases entering Stage or Production require recorded approvals in release_approvals (owner, QA lead, product) before the phase transition commits.
PagerDuty Paging: Critical severity failures in Stage / Production phases trigger a PagerDuty incident via dedup_key (one page per failure fingerprint), bypassing standard Slack notification.
Test Runners
RunnerPlatformTechnologyOutput
PlaywrightWebPlaywright + CucumberJSON report, screenshots
AppiumiOS, Android, TVAppium + WebdriverIO on BrowserStackSession results
k6APIk6 load testingThreshold checks
VisualVisualPlaywright toHaveScreenshotLocal diff images
Integrations
ServiceDirectionUse Case
ClickUpInbound + OutboundTicket management, bug tracking, release sync across 5 QA lists
GitHubInbound + OutboundPR status, deploy triggers, CI workflows, multi-repo support
Slack / DiscordOutboundNotifications for deploys, test failures, alerts
DataDogInboundProduction monitoring, alert queries, incident detection
TestRailOutboundTest case sync, result reporting
Google DriveOutboundRelease report storage, document uploads
OpenAIOutboundBot engine via ChatGPT OAuth consumer account
PagerDutyOutboundCritical paging for late-phase severity=critical test failures
BrowserStackOutboundDevice cloud for Appium sessions + mobile app uploads
Play ConsoleInboundAndroid / AndroidTV build ingestion across 5 package IDs
App Store ConnectInboundiOS / tvOS TestFlight build polling across 4 bundle IDs
Mobile BuildsInternalUnified build registry aggregating Play Console, ASC, Sideload
Sideload DropzoneInboundTokenized AppleTV / FireTV uploads from Fatima
Database Tables
TableMigrationPurpose
releases001Release tags, platform, phase, bug counts
bot_log001Audit trail of all bot actions
bot_state001Singleton bot status and last run
integrations001Service configs as JSONB
users002Team members with bcrypt passwords
sessions002Auth sessions with 24h TTL
test_runs003Execution results per runner/platform
test_failures003Individual failure details + screenshots
webhooks004Inbound event log
bot_jobs005Job queue with status tracking
validation_results007Search validation outputs
browserstack_apps008Uploaded BrowserStack app_url handles per platform
mobile_builds009Unified build registry (Play Console, ASC, Sideload)
release_approvals010Stakeholder sign-offs for Stage / Prod transitions
releases.features, deployed_at010Release feature list (jsonb) + deployment date
upload_tokens011One-time tokens issued to sideload uploaders
upload_audit011Audit trail of every tokenized upload
bug_suggestions012Queued AI bug proposals pending human review
test_failures.severity, kanban_status, suggestion_id012Triage columns + FK to bug_suggestions
test_failures.pagerduty_dedup_key013Idempotency key for PagerDuty incidents
File Structure
qa-ecco-app/
├── public/
│   ├── index.html             # Dashboard UI (HTML + inline JS)
│   └── upload.html            # Tokenized sideload upload portal
├── src/
│   ├── index.ts               # Express server, routes, WebSocket
│   ├── db.ts                  # PostgreSQL pool + migration runner
│   ├── auth.ts                # Session auth, bcrypt, middleware, upload tokens
│   ├── events.ts              # Pub/sub event bus → WebSocket
│   ├── routes/
│   │   ├── auth.ts            # Login, logout, user CRUD
│   │   ├── releases.ts        # Release pipeline, features, approvals
│   │   ├── bot.ts             # Bot control + action dispatch
│   │   ├── integrations.ts    # Service config + test connection
│   │   ├── clickup.ts         # Multi-list tasks + sync
│   │   ├── test-runs.ts       # Test results, triage, bug suggestions
│   │   ├── webhooks.ts        # Inbound GitHub / ClickUp / Play / ASC
│   │   ├── sideload.ts        # Tokenized build uploads (AppleTV / FireTV)
│   │   └── system.ts          # Health, uptime, memory
│   ├── bot/
│   │   ├── engine.ts          # OpenAI chat loop + tool calling
│   │   ├── openai.ts          # OpenAI client wrapper
│   │   ├── tools.ts           # Tool definitions + executors
│   │   ├── decisions.ts       # Triage + PagerDuty routing
│   │   └── scheduler.ts       # Job queue + cron + triggers
│   ├── integrations/
│   │   ├── base.ts            # Abstract integration class
│   │   ├── clickup.ts         # ClickUp API client
│   │   ├── clickup-sync.ts    # Release ↔ ClickUp sync + severity map
│   │   ├── github.ts          # GitHub PRs, deploys, CI
│   │   ├── slack.ts           # Slack / Discord notifications
│   │   ├── datadog.ts         # Monitoring + alerts
│   │   ├── testrail.ts        # Test case management
│   │   ├── gdrive.ts          # Google Drive uploads
│   │   ├── pagerduty.ts       # Critical paging via Events v2 API
│   │   ├── browserstack.ts    # BrowserStack app upload + sessions
│   │   ├── play-console.ts    # Android / AndroidTV build polling
│   │   ├── app-store-connect.ts # iOS / tvOS TestFlight polling
│   │   ├── mobile-builds.ts   # Unified build registry ingest
│   │   ├── sideload-dropzone.ts # Fatima tokenized upload handler
│   │   ├── notifications.ts   # Rules-based notification engine
│   │   └── search-validator.ts
│   ├── runners/
│   │   ├── base.ts            # Abstract test runner
│   │   ├── index.ts           # Runner registry + dispatcher
│   │   ├── playwright.ts      # Web (Cucumber + JSON)
│   │   ├── appium.ts          # iOS / Android / TV (BrowserStack)
│   │   ├── k6.ts              # Load / API testing
│   │   └── visual.ts          # Visual regression (Playwright screenshots)
│   └── migrations/
│       ├── 001_initial.sql              # Core tables
│       ├── 002_auth.sql                 # Users + sessions
│       ├── 003_test_runs.sql            # Test results + failures
│       ├── 004_webhooks.sql             # Webhook events
│       ├── 005_bot_jobs.sql             # Job queue
│       ├── 006_rename_jira_ticket.sql
│       ├── 007_validation_results.sql
│       ├── 008_browserstack_apps.sql    # BrowserStack app_url cache
│       ├── 009_mobile_build_integrations.sql # mobile_builds registry
│       ├── 010_release_lifecycle.sql    # features, deployed_at, approvals
│       ├── 011_upload_audit.sql         # Tokens + audit for sideload
│       ├── 012_bug_suggestions.sql      # Human-review bug queue
│       └── 013_pagerduty.sql            # dedup_key for critical incidents
├── scripts/
│   ├── verify-asc.ts          # App Store Connect credential check
│   ├── create-uploader.ts     # Issue sideload upload tokens
│   └── run-ios-smoke.ts       # Local iOS smoke harness
└── tests/                     # Unit + integration + e2e scaffolding