Skip to content

[Hackathon] Render Incident Command Center with SuperPlane#5093

Open
metonym wants to merge 7 commits into
superplanehq:mainfrom
metonym:metonym/render-integration-more-api
Open

[Hackathon] Render Incident Command Center with SuperPlane#5093
metonym wants to merge 7 commits into
superplanehq:mainfrom
metonym:metonym/render-integration-more-api

Conversation

@metonym
Copy link
Copy Markdown

@metonym metonym commented May 30, 2026

This is a Hackathon submission for https://luma.com/3yx41qr9?tk=19uZD7

Background

This project demonstrates an incident response workflow for a multi-service application running on Render. The demo uses SuperPlane as an operational command center that can inspect Render services, collect runtime metrics, check application health, evaluate incident conditions, and run remediation actions from a single canvas.

The Render demo stack includes a web API, background worker, Key Value cache/queue, and Postgres database.

Screenshot 2026-05-30 at 4 31 53 PM

Changes

This adds new functionality to the existing Render integration to achieve this demo.

Flow

The SuperPlane canvas starts with an Open Incident trigger and fans out into service inspection, deploy lookup, CPU and memory metric collection, Render log inspection, API health checks, DB health checks, and queue health checks. After merging those signals, it branches into two practical paths:

  1. A capacity path that scales the API and worker only when CPU or memory is near threshold, or when an operator explicitly forces scaling.
  2. A remediation path that purges cache, redeploys API and worker services, and can roll back to the latest successful deploy if remediation fails.

The canvas also writes incident snapshots and decisions to render-incidents memory so a Console can show incident status, service state, threshold decisions, failed redeploys, and manual operator actions like freeze deploys, thaw deploys, purge cache, redeploy, rollback, scale up, and scale down.


Triage flow (no remediation)

  1. Run Open Incident.
  2. Expected result:
    • Render service inspection succeeds.
    • API, DB, and queue health checks succeed.
    • Metrics are collected.
    • Scale branch records no scale required.
    • Console shows the incident snapshot.
Screenshot 2026-05-30 at 4 36 22 PM

Triage flow (remediation triggered)

  1. Trigger a simulated queue/cache condition from the app:
    curl -X POST https://render-incident-api.onrender.com/simulate/cache-stale
  2. Run Open Incident.
  3. Expected result:
    • Queue health reports pendingJobs: 250.
    • Needs Remediation? returns TRUE.
    • Reset App Cache State runs.
    • Redeploy API starts a new deploy.
    • Redeploy Worker starts a new deploy.
  4. Trigger recovery (reset):
    curl -X POST https://render-incident-api.onrender.com/simulate/recovered
  5. Run Open Incident again to show clean health checks and a false remediation branch.

In this flow, the remediation triggered, and services were scaled.

To reliably simulate this, the Trigger modal has a forceScale toggle (demo purposes).

Screenshot 2026-05-30 at 4 45 13 PM
Final canvas.yaml (service IDs are not sensitive)
apiVersion: "v1"
kind: "Canvas"
metadata:
  id: "f5d86cc5-d963-4895-884f-e6047b1d4f6e"
  name: "render-incident-command-center"
  description: ""
  isTemplate: false
spec:
  nodes:
    - id: "manual-redeploy-api"
      name: "Manual Redeploy API"
      type: "TYPE_ACTION"
      component: "render.deploy"
      configuration:
        clearCache: false
        service: "{{ $[\"Run Redeploy API\"].data.apiServiceId }}"
      position:
        x: 620
        "y": 1640
      isCollapsed: true
      integration:
        id: "c5e5f723-6e9f-46a4-b801-a79326afecdd"
      paused: false
    - id: "manual-purge-cache-start"
      name: "Run Purge Cache"
      type: "TYPE_TRIGGER"
      component: "start"
      configuration:
        templates:
          - name: "Purge Cache"
            payload:
              apiServiceId: "srv-d8dmi1sm0tmc73e45ft0"
              incidentId: "inc-render-demo"
      position:
        x: 100
        "y": 360
      isCollapsed: true
      paused: false
    - id: "record-incident"
      name: "Record Incident Snapshot"
      type: "TYPE_ACTION"
      component: "upsertMemory"
      configuration:
        matchList:
          - name: "incidentId"
            value: "{{ $[\"Open Incident\"].data.incidentId }}"
        namespace: "render-incidents"
        valueList:
          - name: "incidentId"
            value: "{{ $[\"Open Incident\"].data.incidentId }}"
          - name: "severity"
            value: "{{ $[\"Open Incident\"].data.severity }}"
          - name: "status"
            value: "investigating"
          - name: "symptom"
            value: "{{ $[\"Open Incident\"].data.symptom }}"
          - name: "apiServiceId"
            value: "{{ $[\"Open Incident\"].data.apiServiceId }}"
          - name: "workerServiceId"
            value: "{{ $[\"Open Incident\"].data.workerServiceId }}"
          - name: "cpuMax"
            value: "{{ $[\"Collect Render Metrics\"].data.summaries.cpu.max }}"
          - name: "memoryMax"
            value: "{{ $[\"Collect Render Metrics\"].data.summaries.memory.max }}"
          - name: "errorCount"
            value: "{{ $[\"Collect Error Logs\"].data.errorCount }}"
          - name: "latestSuccessfulDeployId"
            value: "{{ $[\"Find Rollback Target\"].data.latestSuccessful.deployId }}"
          - name: "updatedAt"
            value: "{{ now().Format('2006-01-02T15:04:05Z07:00') }}"
      position:
        x: 1680
        "y": 560
      isCollapsed: false
      paused: false
    - id: "list-error-logs"
      name: "Collect Error Logs"
      type: "TYPE_ACTION"
      component: "render.listLogs"
      configuration:
        direction: "backward"
        levels:
          - "error"
        limit: 50
        resources:
          - "{{ $[\"Open Incident\"].data.apiServiceId }}"
          - "{{ $[\"Open Incident\"].data.workerServiceId }}"
      position:
        x: 620
        "y": 840
      isCollapsed: false
      integration:
        id: "c5e5f723-6e9f-46a4-b801-a79326afecdd"
      paused: false
    - id: "freeze-worker"
      name: "Freeze Worker Deploys"
      type: "TYPE_ACTION"
      component: "render.updateService"
      configuration:
        autoDeploy: "no"
        service: "{{ $[\"Freeze Deploys\"].data.workerServiceId }}"
      position:
        x: 1170
        "y": 80
      isCollapsed: false
      integration:
        id: "c5e5f723-6e9f-46a4-b801-a79326afecdd"
      paused: false
    - id: "redeploy-api"
      name: "Redeploy API"
      type: "TYPE_ACTION"
      component: "render.deploy"
      configuration:
        clearCache: false
        service: "{{ $[\"Open Incident\"].data.apiServiceId }}"
      position:
        x: 2760
        "y": 960
      isCollapsed: false
      integration:
        id: "c5e5f723-6e9f-46a4-b801-a79326afecdd"
      paused: false
    - id: "queue-health"
      name: "Queue Health Check"
      type: "TYPE_ACTION"
      component: "http"
      configuration:
        method: "GET"
        successCodes: "2xx,3xx,4xx,5xx"
        url: "{{ $[\"Open Incident\"].data.apiBaseUrl }}/queue/health"
      position:
        x: 620
        "y": 1290
      isCollapsed: false
      paused: false
    - id: "get-runtime-metrics"
      name: "Collect Render Metrics"
      type: "TYPE_ACTION"
      component: "render.getMetrics"
      configuration:
        aggregationMethod: "MAX"
        metricTypes:
          - "cpu"
          - "memory"
        resolutionSeconds: 60
        resources:
          - "{{ $[\"Open Incident\"].data.apiServiceId }}"
          - "{{ $[\"Open Incident\"].data.workerServiceId }}"
      position:
        x: 620
        "y": 690
      isCollapsed: false
      integration:
        id: "c5e5f723-6e9f-46a4-b801-a79326afecdd"
      paused: false
    - id: "manual-scale-worker"
      name: "Manual Scale Worker"
      type: "TYPE_ACTION"
      component: "render.scaleService"
      configuration:
        numInstances: 2
        service: "{{ $[\"Run Scale Up\"].data.workerServiceId }}"
      position:
        x: 1680
        "y": 1500
      isCollapsed: true
      integration:
        id: "c5e5f723-6e9f-46a4-b801-a79326afecdd"
      paused: false
    - id: "manual-scale-up-start"
      name: "Run Scale Up"
      type: "TYPE_TRIGGER"
      component: "start"
      configuration:
        templates:
          - name: "Scale Up"
            payload:
              apiServiceId: "srv-d8dmi1sm0tmc73e45ft0"
              incidentId: "inc-render-demo"
              workerServiceId: "srv-d8dmi1sm0tmc73e45fsg"
      position:
        x: 100
        "y": 920
      isCollapsed: true
      paused: false
    - id: "manual-scale-api"
      name: "Manual Scale API"
      type: "TYPE_ACTION"
      component: "render.scaleService"
      configuration:
        numInstances: 3
        service: "{{ $[\"Run Scale Up\"].data.apiServiceId }}"
      position:
        x: 1170
        "y": 1500
      isCollapsed: true
      integration:
        id: "c5e5f723-6e9f-46a4-b801-a79326afecdd"
      paused: false
    - id: "freeze-api"
      name: "Freeze API Deploys"
      type: "TYPE_ACTION"
      component: "render.updateService"
      configuration:
        autoDeploy: "no"
        service: "{{ $[\"Freeze Deploys\"].data.apiServiceId }}"
      position:
        x: 620
        "y": 80
      isCollapsed: false
      integration:
        id: "c5e5f723-6e9f-46a4-b801-a79326afecdd"
      paused: false
    - id: "scale-api"
      name: "Scale API to 3"
      type: "TYPE_ACTION"
      component: "render.scaleService"
      configuration:
        numInstances: 3
        service: "{{ $[\"Open Incident\"].data.apiServiceId }}"
      position:
        x: 2220
        "y": 650
      isCollapsed: false
      integration:
        id: "c5e5f723-6e9f-46a4-b801-a79326afecdd"
      paused: false
    - id: "redeploy-worker"
      name: "Redeploy Worker"
      type: "TYPE_ACTION"
      component: "render.deploy"
      configuration:
        clearCache: false
        service: "{{ $[\"Open Incident\"].data.workerServiceId }}"
      position:
        x: 2760
        "y": 1120
      isCollapsed: false
      integration:
        id: "c5e5f723-6e9f-46a4-b801-a79326afecdd"
      paused: false
    - id: "get-worker-service"
      name: "Inspect Worker Service"
      type: "TYPE_ACTION"
      component: "render.getService"
      configuration:
        service: "{{ $[\"Open Incident\"].data.workerServiceId }}"
      position:
        x: 620
        "y": 390
      isCollapsed: false
      integration:
        id: "c5e5f723-6e9f-46a4-b801-a79326afecdd"
      paused: false
    - id: "list-api-deploys"
      name: "Find Rollback Target"
      type: "TYPE_ACTION"
      component: "render.listDeploys"
      configuration:
        limit: 5
        service: "{{ $[\"Open Incident\"].data.apiServiceId }}"
        statuses:
          - "live"
      position:
        x: 620
        "y": 540
      isCollapsed: false
      integration:
        id: "c5e5f723-6e9f-46a4-b801-a79326afecdd"
      paused: false
    - id: "manual-scale-down-api"
      name: "Manual Scale API Down"
      type: "TYPE_ACTION"
      component: "render.scaleService"
      configuration:
        numInstances: 1
        service: "{{ $[\"Run Scale Down\"].data.apiServiceId }}"
      position:
        x: 1170
        "y": 1640
      isCollapsed: true
      integration:
        id: "c5e5f723-6e9f-46a4-b801-a79326afecdd"
      paused: false
    - id: "open-incident"
      name: "Open Incident"
      type: "TYPE_TRIGGER"
      component: "start"
      configuration:
        templates:
          - name: "Open Incident"
            parameters:
              - defaultString: "inc-render-demo"
                name: "incidentId"
                title: "Incident ID"
                type: "string"
              - defaultString: "P1"
                name: "severity"
                options:
                  - label: "P1"
                    value: "P1"
                  - label: "P2"
                    value: "P2"
                title: "Severity"
                type: "select"
              - defaultString: "Elevated latency and queue backlog"
                name: "symptom"
                title: "Symptom"
                type: "string"
              - defaultBoolean: false
                name: "forceScale"
                title: "Force scale"
                type: "boolean"
            payload:
              apiBaseUrl: "https://render-incident-api.onrender.com"
              apiServiceId: "srv-d8dmi1sm0tmc73e45ft0"
              cacheServiceId: "red-d8dmhncm0tmc73e45970"
              forceScale: false
              incidentId: "inc-render-demo"
              postgresId: "dpg-d8dmhnkm0tmc73e45990-a"
              severity: "P1"
              symptom: "Elevated latency and queue backlog"
              workerServiceId: "srv-d8dmi1sm0tmc73e45fsg"
      position:
        x: 100
        "y": 520
      isCollapsed: false
      paused: false
    - id: "should-remediate"
      name: "Needs Remediation?"
      type: "TYPE_ACTION"
      component: "if"
      configuration:
        expression: "$[\"Collect Error Logs\"].data.errorCount > 0 || $[\"API Health Check\"].data.status >= 500 || $[\"DB Health Check\"].data.status >= 500 || $[\"Queue Health Check\"].data.body.pendingJobs > 100"
      position:
        x: 1680
        "y": 980
      isCollapsed: false
      paused: false
    - id: "scale-worker"
      name: "Scale Worker to 2"
      type: "TYPE_ACTION"
      component: "render.scaleService"
      configuration:
        numInstances: 2
        service: "{{ $[\"Open Incident\"].data.workerServiceId }}"
      position:
        x: 2760
        "y": 650
      isCollapsed: false
      integration:
        id: "c5e5f723-6e9f-46a4-b801-a79326afecdd"
      paused: false
    - id: "manual-redeploy-worker-start"
      name: "Run Redeploy Worker"
      type: "TYPE_TRIGGER"
      component: "start"
      configuration:
        templates:
          - name: "Redeploy Worker"
            payload:
              incidentId: "inc-render-demo"
              workerServiceId: "srv-d8dmi1sm0tmc73e45fsg"
      position:
        x: 100
        "y": 640
      isCollapsed: true
      paused: false
    - id: "thaw-worker"
      name: "Thaw Worker Deploys"
      type: "TYPE_ACTION"
      component: "render.updateService"
      configuration:
        autoDeploy: "yes"
        service: "{{ $[\"Thaw Deploys\"].data.workerServiceId }}"
      position:
        x: 1170
        "y": 220
      isCollapsed: false
      integration:
        id: "c5e5f723-6e9f-46a4-b801-a79326afecdd"
      paused: false
    - id: "merge-inspection"
      name: "Merge Inspection"
      type: "TYPE_ACTION"
      component: "merge"
      configuration:
        enableStopIf: false
        enableTimeout: true
        executionTimeout:
          unit: "minutes"
          value: 3
      position:
        x: 1170
        "y": 760
      isCollapsed: false
      paused: false
    - id: "freeze-deploys"
      name: "Freeze Deploys"
      type: "TYPE_TRIGGER"
      component: "start"
      configuration:
        templates:
          - name: "Freeze Deploys"
            payload:
              apiServiceId: "srv-d8dmi1sm0tmc73e45ft0"
              incidentId: "inc-render-demo"
              workerServiceId: "srv-d8dmi1sm0tmc73e45fsg"
      position:
        x: 100
        "y": 80
      isCollapsed: true
      paused: false
    - id: "manual-scale-down-start"
      name: "Run Scale Down"
      type: "TYPE_TRIGGER"
      component: "start"
      configuration:
        templates:
          - name: "Scale Down"
            payload:
              apiServiceId: "srv-d8dmi1sm0tmc73e45ft0"
              incidentId: "inc-render-demo"
              workerServiceId: "srv-d8dmi1sm0tmc73e45fsg"
      position:
        x: 100
        "y": 1060
      isCollapsed: true
      paused: false
    - id: "purge-api-cache"
      name: "Reset App Cache State"
      type: "TYPE_ACTION"
      component: "http"
      configuration:
        method: "POST"
        successCodes: "2xx"
        url: "{{ $[\"Open Incident\"].data.apiBaseUrl }}/simulate/recovered"
      position:
        x: 2220
        "y": 1010
      isCollapsed: false
      paused: false
    - id: "manual-rollback-api"
      name: "Manual Rollback API"
      type: "TYPE_ACTION"
      component: "render.rollbackDeploy"
      configuration:
        deployId: "{{ $[\"Run Rollback API\"].data.deployId }}"
        service: "{{ $[\"Run Rollback API\"].data.apiServiceId }}"
      position:
        x: 620
        "y": 1920
      isCollapsed: true
      integration:
        id: "c5e5f723-6e9f-46a4-b801-a79326afecdd"
      paused: false
    - id: "should-scale"
      name: "Needs Capacity?"
      type: "TYPE_ACTION"
      component: "if"
      configuration:
        expression: "$[\"Open Incident\"].data.forceScale == true || $[\"Collect Render Metrics\"].data.summaries.cpu.max >= 80 || $[\"Collect Render Metrics\"].data.summaries.memory.max >= 80"
      position:
        x: 1680
        "y": 760
      isCollapsed: false
      paused: false
    - id: "manual-scale-down-worker"
      name: "Manual Scale Worker Down"
      type: "TYPE_ACTION"
      component: "render.scaleService"
      configuration:
        numInstances: 1
        service: "{{ $[\"Run Scale Down\"].data.workerServiceId }}"
      position:
        x: 1680
        "y": 1640
      isCollapsed: true
      integration:
        id: "c5e5f723-6e9f-46a4-b801-a79326afecdd"
      paused: false
    - id: "api-health"
      name: "API Health Check"
      type: "TYPE_ACTION"
      component: "http"
      configuration:
        method: "GET"
        successCodes: "2xx,3xx,4xx,5xx"
        url: "{{ $[\"Open Incident\"].data.apiBaseUrl }}/healthz"
      position:
        x: 620
        "y": 990
      isCollapsed: false
      paused: false
    - id: "db-health"
      name: "DB Health Check"
      type: "TYPE_ACTION"
      component: "http"
      configuration:
        method: "GET"
        successCodes: "2xx,3xx,4xx,5xx"
        url: "{{ $[\"Open Incident\"].data.apiBaseUrl }}/db/health"
      position:
        x: 620
        "y": 1140
      isCollapsed: false
      paused: false
    - id: "manual-redeploy-worker"
      name: "Manual Redeploy Worker"
      type: "TYPE_ACTION"
      component: "render.deploy"
      configuration:
        clearCache: false
        service: "{{ $[\"Run Redeploy Worker\"].data.workerServiceId }}"
      position:
        x: 620
        "y": 1780
      isCollapsed: true
      integration:
        id: "c5e5f723-6e9f-46a4-b801-a79326afecdd"
      paused: false
    - id: "thaw-api"
      name: "Thaw API Deploys"
      type: "TYPE_ACTION"
      component: "render.updateService"
      configuration:
        autoDeploy: "yes"
        service: "{{ $[\"Thaw Deploys\"].data.apiServiceId }}"
      position:
        x: 620
        "y": 220
      isCollapsed: false
      integration:
        id: "c5e5f723-6e9f-46a4-b801-a79326afecdd"
      paused: false
    - id: "get-api-service"
      name: "Inspect API Service"
      type: "TYPE_ACTION"
      component: "render.getService"
      configuration:
        service: "{{ $[\"Open Incident\"].data.apiServiceId }}"
      position:
        x: 620
        "y": 240
      isCollapsed: false
      integration:
        id: "c5e5f723-6e9f-46a4-b801-a79326afecdd"
      paused: false
    - id: "rollback-api"
      name: "Rollback API"
      type: "TYPE_ACTION"
      component: "render.rollbackDeploy"
      configuration:
        deployId: "{{ $[\"Find Rollback Target\"].data.latestSuccessful.deployId }}"
        service: "{{ $[\"Open Incident\"].data.apiServiceId }}"
      position:
        x: 3310
        "y": 1040
      isCollapsed: false
      integration:
        id: "c5e5f723-6e9f-46a4-b801-a79326afecdd"
      paused: false
    - id: "manual-redeploy-api-start"
      name: "Run Redeploy API"
      type: "TYPE_TRIGGER"
      component: "start"
      configuration:
        templates:
          - name: "Redeploy API"
            payload:
              apiServiceId: "srv-d8dmi1sm0tmc73e45ft0"
              incidentId: "inc-render-demo"
      position:
        x: 100
        "y": 500
      isCollapsed: true
      paused: false
    - id: "record-no-scale"
      name: "Record No Scale Needed"
      type: "TYPE_ACTION"
      component: "upsertMemory"
      configuration:
        matchList:
          - name: "incidentId"
            value: "{{ $[\"Open Incident\"].data.incidentId }}"
        namespace: "render-incidents"
        valueList:
          - name: "scaleDecision"
            value: "\"no scale required\""
          - name: "updatedAt"
            value: "{{ now().Format('2006-01-02T15:04:05Z07:00') }}"
      position:
        x: 2220
        "y": 850
      isCollapsed: true
      paused: false
    - id: "manual-rollback-api-start"
      name: "Run Rollback API"
      type: "TYPE_TRIGGER"
      component: "start"
      configuration:
        templates:
          - name: "Rollback API"
            payload:
              apiServiceId: "srv-d8dmi1sm0tmc73e45ft0"
              deployId: "dep-d8dmjlpo3t8c73en52eg"
              incidentId: "inc-render-demo"
      position:
        x: 100
        "y": 780
      isCollapsed: true
      paused: false
    - id: "record-remediated"
      name: "Record Remediation"
      type: "TYPE_ACTION"
      component: "upsertMemory"
      configuration:
        matchList:
          - name: "incidentId"
            value: "{{ $[\"Open Incident\"].data.incidentId }}"
        namespace: "render-incidents"
        valueList:
          - name: "status"
            value: "remediated"
          - name: "scaleDecision"
            value: "\"conditional capacity applied\""
          - name: "updatedAt"
            value: "{{ now().Format('2006-01-02T15:04:05Z07:00') }}"
      position:
        x: 3310
        "y": 850
      isCollapsed: true
      paused: false
    - id: "thaw-deploys"
      name: "Thaw Deploys"
      type: "TYPE_TRIGGER"
      component: "start"
      configuration:
        templates:
          - name: "Thaw Deploys"
            payload:
              apiServiceId: "srv-d8dmi1sm0tmc73e45ft0"
              incidentId: "inc-render-demo"
              workerServiceId: "srv-d8dmi1sm0tmc73e45fsg"
      position:
        x: 100
        "y": 220
      isCollapsed: true
      paused: false
    - id: "manual-purge-cache"
      name: "Manual Purge Cache"
      type: "TYPE_ACTION"
      component: "render.purgeCache"
      configuration:
        service: "{{ $[\"Run Purge Cache\"].data.apiServiceId }}"
      position:
        x: 620
        "y": 1500
      isCollapsed: true
      integration:
        id: "c5e5f723-6e9f-46a4-b801-a79326afecdd"
      paused: false
  edges:
    - sourceId: "open-incident"
      targetId: "get-api-service"
      channel: "default"
    - sourceId: "open-incident"
      targetId: "get-worker-service"
      channel: "default"
    - sourceId: "open-incident"
      targetId: "list-api-deploys"
      channel: "default"
    - sourceId: "open-incident"
      targetId: "get-runtime-metrics"
      channel: "default"
    - sourceId: "open-incident"
      targetId: "list-error-logs"
      channel: "default"
    - sourceId: "open-incident"
      targetId: "api-health"
      channel: "default"
    - sourceId: "open-incident"
      targetId: "db-health"
      channel: "default"
    - sourceId: "open-incident"
      targetId: "queue-health"
      channel: "default"
    - sourceId: "get-api-service"
      targetId: "merge-inspection"
      channel: "default"
    - sourceId: "get-worker-service"
      targetId: "merge-inspection"
      channel: "default"
    - sourceId: "list-api-deploys"
      targetId: "merge-inspection"
      channel: "default"
    - sourceId: "get-runtime-metrics"
      targetId: "merge-inspection"
      channel: "default"
    - sourceId: "list-error-logs"
      targetId: "merge-inspection"
      channel: "default"
    - sourceId: "api-health"
      targetId: "merge-inspection"
      channel: "success"
    - sourceId: "db-health"
      targetId: "merge-inspection"
      channel: "success"
    - sourceId: "queue-health"
      targetId: "merge-inspection"
      channel: "success"
    - sourceId: "merge-inspection"
      targetId: "record-incident"
      channel: "success"
    - sourceId: "merge-inspection"
      targetId: "should-scale"
      channel: "success"
    - sourceId: "should-scale"
      targetId: "scale-api"
      channel: "true"
    - sourceId: "scale-api"
      targetId: "scale-worker"
      channel: "default"
    - sourceId: "scale-worker"
      targetId: "record-remediated"
      channel: "default"
    - sourceId: "should-scale"
      targetId: "record-no-scale"
      channel: "false"
    - sourceId: "merge-inspection"
      targetId: "should-remediate"
      channel: "success"
    - sourceId: "should-remediate"
      targetId: "purge-api-cache"
      channel: "true"
    - sourceId: "purge-api-cache"
      targetId: "redeploy-api"
      channel: "success"
    - sourceId: "purge-api-cache"
      targetId: "redeploy-worker"
      channel: "success"
    - sourceId: "redeploy-api"
      targetId: "record-remediated"
      channel: "success"
    - sourceId: "redeploy-worker"
      targetId: "record-remediated"
      channel: "success"
    - sourceId: "redeploy-api"
      targetId: "rollback-api"
      channel: "failed"
    - sourceId: "freeze-deploys"
      targetId: "freeze-api"
      channel: "default"
    - sourceId: "freeze-api"
      targetId: "freeze-worker"
      channel: "default"
    - sourceId: "thaw-deploys"
      targetId: "thaw-api"
      channel: "default"
    - sourceId: "thaw-api"
      targetId: "thaw-worker"
      channel: "default"
    - sourceId: "manual-purge-cache-start"
      targetId: "manual-purge-cache"
      channel: "default"
    - sourceId: "manual-redeploy-api-start"
      targetId: "manual-redeploy-api"
      channel: "default"
    - sourceId: "manual-redeploy-worker-start"
      targetId: "manual-redeploy-worker"
      channel: "default"
    - sourceId: "manual-rollback-api-start"
      targetId: "manual-rollback-api"
      channel: "default"
    - sourceId: "manual-scale-up-start"
      targetId: "manual-scale-api"
      channel: "default"
    - sourceId: "manual-scale-api"
      targetId: "manual-scale-worker"
      channel: "default"
    - sourceId: "manual-scale-down-start"
      targetId: "manual-scale-down-api"
      channel: "default"
    - sourceId: "manual-scale-down-api"
      targetId: "manual-scale-down-worker"
      channel: "default"

metonym added 7 commits May 30, 2026 16:26
List recent deploys for a Render service to support rollback and
incident workflows. Adds the shared render operation mapper and action
configuration helpers used by the new incident-response actions.
Fetch Render CPU, memory, request, and connection metrics and emit
normalized summaries (latest, avg, max, count, unit) alongside the raw
series for monitoring and incident-response workflows.
Query recent Render logs across one or more resources in the configured
workspace, with level, type, text, and path filters. Emits log entries
plus a count and error count for incident triage.
Update Render service settings, currently autoDeploy, so workflows can
freeze deploys during an incident and thaw them after recovery. Emits
serviceId, autoDeploy, and status.
Update Render autoscaling settings (enabled, min/max instances, and CPU
and memory targets) for a web service. Emits the requested bounds,
targets, status, and Render response.
Create a Render one-off job from an existing service and retrieve its
status, enabling health checks, queue drains, repair tasks, and
operational runbooks.
@superplanehq-integration
Copy link
Copy Markdown

👋 Commands for maintainers:

  • /sp start - Start an ephemeral machine (takes ~30s)
  • /sp stop - Stop a running machine (auto-executed on pr close)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant