arazzo: 1.0.1
info:
  title: Schedula APIs Workflows
  summary: Backend feature-flag workflows.
  description: 'This Arazzo document covers a backend feature-flag API that toggles
    runtime maintenance state with contract-local effects only.

    '
  version: 1.0.0
x-docs:
- title: Shared effect reference
  url: https://api.formulas.dev/docs/effects.md
sourceDescriptions:
- name: apisApi
  url: https://api.formulas.dev/docs/apis/openapi.yaml
  type: openapi
- name: adminApi
  url: https://api.formulas.dev/docs/apis/admin/openapi.yaml
  type: openapi
- name: securityApi
  url: https://api.formulas.dev/docs/security/openapi.yaml
  type: openapi
- name: csrfApi
  url: https://api.formulas.dev/docs/csrf/openapi.yaml
  type: openapi
x-agentic-prerequisites:
- Establish an authenticated admin session before running workflows that start from
  `get_user_me`.
- Use the security and CSRF workflows first when no session or token is already available.
workflows:
- workflowId: runBackendFeatureFlagPipeline
  summary: Toggle a maintenance flag on and off
  description: 'Create a feature-flag template, enable maintenance mode, verify the
    response, then disable it again.

    '
  steps:
  - stepId: getMe
    summary: Load auth token
    description: Authenticate the admin user and capture the bearer token.
    operationId: $sourceDescriptions.securityApi.get_user_me
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      token: $response.body.token
  - stepId: getCsrf
    summary: Refresh CSRF token
    description: Read a fresh CSRF token before creating or mutating templates.
    operationId: $sourceDescriptions.csrfApi.get_csrf
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      token: $response.headers.N-CSRF-Token
  - stepId: createTemplate
    summary: Create backend template
    description: Persist a new template that will later become a runtime API.
    operationId: $sourceDescriptions.adminApi.post_admin_api_templates
    parameters:
    - name: Authentication-Token
      in: header
      value: $steps.getMe.outputs.token
    - name: X-CSRFToken
      in: header
      value: $steps.getCsrf.outputs.token
    requestBody:
      contentType: application/json
      payload:
        name: backend-feature-flags
        description: Toggle maintenance flags.
        definition:
          id: backend-feature-flags
          version: '1.0'
          events:
            EnableMaintenanceMode:
              trigger:
              - type: api
                path: enable-maintenance-mode
                method: POST
                payload_schema:
                  type: object
                  required:
                  - flag_name
                  properties:
                    flag_name:
                      type: string
                  additionalProperties: false
                response:
                  ok: true
              effects:
              - title: Enable Flag
                type: update.contract
                update:
                  $set:
                    local.enabled: true
                    local.flag_name: $$ctx.payload.flag_name
            DisableMaintenanceMode:
              trigger:
              - type: api
                path: disable-maintenance-mode
                method: POST
                payload_schema:
                  type: object
                  required:
                  - flag_name
                  properties:
                    flag_name:
                      type: string
                  additionalProperties: false
                response:
                  ok: false
              effects:
              - title: Disable Flag
                type: update.contract
                update:
                  $set:
                    local.disabled: true
                    local.flag_name: $$ctx.payload.flag_name
    successCriteria:
    - condition: $statusCode == 201
    outputs:
      templateId: $response.body.id
  - stepId: fetchTemplate
    summary: Fetch created template
    description: Verify the template persisted before invoking the runtime API.
    operationId: $sourceDescriptions.adminApi.get_admin_api_templates_by_template_id
    parameters:
    - name: Authentication-Token
      in: header
      value: $steps.getMe.outputs.token
    - name: template_id
      in: path
      value: $steps.createTemplate.outputs.templateId
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      template: $response.body
  - stepId: invokeRuntimeApi
    summary: Invoke runtime API
    description: Call the generated API route for the created template.
    operationId: $sourceDescriptions.apisApi.post_apis_by_template_id_by_dyn_path
    parameters:
    - name: Authentication-Token
      in: header
      value: $steps.getMe.outputs.token
    - name: X-CSRFToken
      in: header
      value: $steps.getCsrf.outputs.token
    - name: template_id
      in: path
      value: $steps.createTemplate.outputs.templateId
    - name: dyn_path
      in: path
      value: enable-maintenance-mode
    requestBody:
      contentType: application/json
      payload:
        flag_name: maintenance_mode
    successCriteria:
    - condition: $statusCode == 200
  - stepId: enableMaintenance
    summary: Enable maintenance mode
    description: Call the runtime endpoint created by the template.
    operationId: $sourceDescriptions.apisApi.post_apis_by_template_id_by_dyn_path
    parameters:
    - name: Authentication-Token
      in: header
      value: $steps.getMe.outputs.token
    - name: X-CSRFToken
      in: header
      value: $steps.getCsrf.outputs.token
    - name: template_id
      in: path
      value: $steps.createTemplate.outputs.templateId
    - name: dyn_path
      in: path
      value: enable-maintenance-mode
    requestBody:
      contentType: application/json
      payload:
        flag_name: maintenance_mode
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      enable: $response.body
  - stepId: disableMaintenance
    summary: Disable maintenance mode
    description: Call the same runtime endpoint a second time to show the toggle cycle.
    operationId: $sourceDescriptions.apisApi.post_apis_by_template_id_by_dyn_path
    parameters:
    - name: Authentication-Token
      in: header
      value: $steps.getMe.outputs.token
    - name: X-CSRFToken
      in: header
      value: $steps.getCsrf.outputs.token
    - name: template_id
      in: path
      value: $steps.createTemplate.outputs.templateId
    - name: dyn_path
      in: path
      value: disable-maintenance-mode
    requestBody:
      contentType: application/json
      payload:
        flag_name: maintenance_mode
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      disable: $response.body
  outputs:
    templateId: $steps.createTemplate.outputs.templateId
- workflowId: runBackendRemoteSnapshotPipeline
  summary: Compare two remote timestamps and return one result
  description: 'Create a sync template, fetch two timestamps from public JSON services,
    compare them, and return the selected snapshot through the trigger response.

    '
  steps:
  - stepId: getMe
    operationId: $sourceDescriptions.securityApi.get_user_me
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      token: $response.body.token
  - stepId: getCsrf
    operationId: $sourceDescriptions.csrfApi.get_csrf
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      token: $response.headers.N-CSRF-Token
  - stepId: createTemplate
    operationId: $sourceDescriptions.adminApi.post_admin_api_templates
    parameters:
    - name: Authentication-Token
      in: header
      value: $steps.getMe.outputs.token
    - name: X-CSRFToken
      in: header
      value: $steps.getCsrf.outputs.token
    requestBody:
      contentType: application/json
      payload:
        name: backend-remote-snapshot
        description: Compare two UTC snapshots and return one selected summary.
        definition:
          id: backend-remote-snapshot
          version: '1.0'
          events:
            FetchRemoteSnapshot:
              trigger:
              - type: api
                path: fetch-remote-snapshot
                method: GET
                payload_schema:
                  type: object
                  properties: {}
                  additionalProperties: false
                response:
                  selected_service: $$ctx.local.selected_service
                  timezone: $$ctx.local.selected_snapshot.timezone
                  datetime: $$ctx.local.selected_snapshot.datetime
                  unixtime: $$ctx.local.selected_snapshot.unixtime
              effects:
              - title: Request UTC Timestamp
                type: http.request
                key: remote_timestamp_utc
                request:
                  method: GET
                  url: https://worldtimeapi.org/api/timezone/Etc/UTC
              - title: Request Rome Timestamp
                type: http.request
                key: remote_timestamp_rome
                request:
                  method: GET
                  url: https://worldtimeapi.org/api/timezone/Europe/Rome
              - title: Select Timestamp Snapshot
                type: if.else
                condition:
                  $ctx: local.remote_timestamp_utc
                then_effects:
                - title: Save UTC Snapshot Item
                  type: create.item
                  item:
                    category: note
                    data:
                      title: Remote snapshot
                      timezone: $$ctx.local.remote_timestamp_utc.timezone
                      datetime: $$ctx.local.remote_timestamp_utc.datetime
                      unixtime: $$ctx.local.remote_timestamp_utc.unixtime
                      source: utc
                  key: saved_item_id
                - title: Restore UTC Snapshot Fields
                  type: update.contract
                  update:
                    $set:
                      local.selected_service: utc
                      local.selected_snapshot:
                        $ctx: local.remote_timestamp_utc
                else_effects:
                - title: Keep Rome Snapshot
                  type: update.contract
                  update:
                    $set:
                      local.selected_service: rome
                      local.selected_snapshot:
                        $ctx: local.remote_timestamp_rome
    successCriteria:
    - condition: $statusCode == 201
    outputs:
      templateId: $response.body.id
  - stepId: fetchTemplate
    operationId: $sourceDescriptions.adminApi.get_admin_api_templates_by_template_id
    parameters:
    - name: Authentication-Token
      in: header
      value: $steps.getMe.outputs.token
    - name: template_id
      in: path
      value: $steps.createTemplate.outputs.templateId
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      template: $response.body
  - stepId: invokeRuntimeApi
    summary: Invoke runtime API
    description: Call the generated API route for the created template.
    operationId: $sourceDescriptions.apisApi.get_apis_by_template_id_by_dyn_path
    parameters:
    - name: Authentication-Token
      in: header
      value: $steps.getMe.outputs.token
    - name: X-CSRFToken
      in: header
      value: $steps.getCsrf.outputs.token
    - name: template_id
      in: path
      value: $steps.createTemplate.outputs.templateId
    - name: dyn_path
      in: path
      value: fetch-remote-snapshot
    requestBody:
      contentType: application/json
      payload: {}
    successCriteria:
    - condition: $statusCode == 200
  - stepId: fetchRemoteSnapshot
    operationId: $sourceDescriptions.apisApi.get_apis_by_template_id_by_dyn_path
    parameters:
    - name: Authentication-Token
      in: header
      value: $steps.getMe.outputs.token
    - name: X-CSRFToken
      in: header
      value: $steps.getCsrf.outputs.token
    - name: template_id
      in: path
      value: $steps.createTemplate.outputs.templateId
    - name: dyn_path
      in: path
      value: fetch-remote-snapshot
    requestBody:
      contentType: application/json
      payload: {}
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      response: $response.body
  outputs:
    templateId: $steps.createTemplate.outputs.templateId
    template: $steps.fetchTemplate.outputs.template
    response: $steps.fetchRemoteSnapshot.outputs.response
- workflowId: runIncidentLifecycleTemplate
  summary: Create an incident lifecycle template
  steps:
  - stepId: getMe
    operationId: $sourceDescriptions.securityApi.get_user_me
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      token: $response.body.token
  - stepId: getCsrf
    operationId: $sourceDescriptions.csrfApi.get_csrf
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      token: $response.headers.N-CSRF-Token
  - stepId: createTemplate
    operationId: $sourceDescriptions.adminApi.post_admin_api_templates
    parameters:
    - name: Authentication-Token
      in: header
      value: $steps.getMe.outputs.token
    - name: X-CSRFToken
      in: header
      value: $steps.getCsrf.outputs.token
    requestBody:
      contentType: application/json
      payload:
        name: backend-incident-lifecycle
        description: Track incident open and resolve actions.
        definition:
          id: backend-incident-lifecycle
          version: '1.0'
          events:
            OpenIncident:
              trigger:
              - type: api
                path: open-incident
                method: POST
                payload_schema:
                  type: object
                  required:
                  - item_id
                  properties:
                    item_id:
                      type: string
                  additionalProperties: false
                response:
                  ok: true
              effects:
              - title: Open Flag
                type: update.contract
                update:
                  $set:
                    local.open_ok: true
            CloseIncident:
              trigger:
              - type: api
                path: close-incident
                method: POST
                payload_schema:
                  type: object
                  required:
                  - item_id
                  properties:
                    item_id:
                      type: string
                  additionalProperties: false
                response:
                  ok: true
              effects:
              - title: Close Flag
                type: update.contract
                update:
                  $set:
                    local.close_ok: true
    successCriteria:
    - condition: $statusCode == 201
    outputs:
      templateId: $response.body.id
  - stepId: fetchTemplate
    operationId: $sourceDescriptions.adminApi.get_admin_api_templates_by_template_id
    parameters:
    - name: Authentication-Token
      in: header
      value: $steps.getMe.outputs.token
    - name: template_id
      in: path
      value: $steps.createTemplate.outputs.templateId
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      template: $response.body
  - stepId: invokeRuntimeApi
    summary: Invoke runtime API
    description: Call the generated API route for the created template.
    operationId: $sourceDescriptions.apisApi.post_apis_by_template_id_by_dyn_path
    parameters:
    - name: Authentication-Token
      in: header
      value: $steps.getMe.outputs.token
    - name: X-CSRFToken
      in: header
      value: $steps.getCsrf.outputs.token
    - name: template_id
      in: path
      value: $steps.createTemplate.outputs.templateId
    - name: dyn_path
      in: path
      value: open-incident
    requestBody:
      contentType: application/json
      payload:
        item_id: incident-1
    successCriteria:
    - condition: $statusCode == 200
  outputs:
    templateId: $steps.createTemplate.outputs.templateId
    template: $steps.fetchTemplate.outputs.template
- workflowId: runSeedItemTemplate
  summary: Create and delete seed items
  steps:
  - stepId: getMe
    operationId: $sourceDescriptions.securityApi.get_user_me
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      token: $response.body.token
  - stepId: getCsrf
    operationId: $sourceDescriptions.csrfApi.get_csrf
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      token: $response.headers.N-CSRF-Token
  - stepId: createTemplate
    operationId: $sourceDescriptions.adminApi.post_admin_api_templates
    parameters:
    - name: Authentication-Token
      in: header
      value: $steps.getMe.outputs.token
    - name: X-CSRFToken
      in: header
      value: $steps.getCsrf.outputs.token
    requestBody:
      contentType: application/json
      payload:
        name: backend-seed-items
        description: Seed and cleanup data items.
        definition:
          id: backend-seed-items
          version: '1.0'
          events:
            SeedData:
              trigger:
              - type: api
                path: seed-data
                method: POST
                payload_schema:
                  type: object
                  properties: {}
                  additionalProperties: true
                response:
                  ok: true
              effects:
              - title: Create Seed Item
                type: create.item
                item:
                  category: backend-seed
                  data:
                    title: Seed record
                    value: 1
                key: seed_item
              - title: Delete Seed Item
                type: delete.item
                item_id: $$ctx.local.seed_item
    successCriteria:
    - condition: $statusCode == 201
    outputs:
      templateId: $response.body.id
  - stepId: fetchTemplate
    operationId: $sourceDescriptions.adminApi.get_admin_api_templates_by_template_id
    parameters:
    - name: Authentication-Token
      in: header
      value: $steps.getMe.outputs.token
    - name: template_id
      in: path
      value: $steps.createTemplate.outputs.templateId
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      template: $response.body
  - stepId: invokeRuntimeApi
    summary: Invoke runtime API
    description: Call the generated API route for the created template.
    operationId: $sourceDescriptions.apisApi.post_apis_by_template_id_by_dyn_path
    parameters:
    - name: Authentication-Token
      in: header
      value: $steps.getMe.outputs.token
    - name: X-CSRFToken
      in: header
      value: $steps.getCsrf.outputs.token
    - name: template_id
      in: path
      value: $steps.createTemplate.outputs.templateId
    - name: dyn_path
      in: path
      value: seed-data
    requestBody:
      contentType: application/json
      payload: {}
    successCriteria:
    - condition: $statusCode == 200
  outputs:
    templateId: $steps.createTemplate.outputs.templateId
    template: $steps.fetchTemplate.outputs.template
- workflowId: runEventDispatchTemplate
  summary: Dispatch a follow-up event
  steps:
  - stepId: getMe
    operationId: $sourceDescriptions.securityApi.get_user_me
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      token: $response.body.token
  - stepId: getCsrf
    operationId: $sourceDescriptions.csrfApi.get_csrf
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      token: $response.headers.N-CSRF-Token
  - stepId: createTemplate
    operationId: $sourceDescriptions.adminApi.post_admin_api_templates
    parameters:
    - name: Authentication-Token
      in: header
      value: $steps.getMe.outputs.token
    - name: X-CSRFToken
      in: header
      value: $steps.getCsrf.outputs.token
    requestBody:
      contentType: application/json
      payload:
        name: backend-event-dispatch
        description: Dispatch a follow-up contract event.
        definition:
          id: backend-event-dispatch
          version: '1.0'
          events:
            DispatchFollowup:
              trigger:
              - type: api
                path: dispatch-followup
                method: POST
                payload_schema:
                  type: object
                  properties: {}
                  additionalProperties: true
                response:
                  ok: true
              effects:
              - title: Dispatch Nested Event
                type: execute.event
                event_name: FollowupIncident
            FollowupIncident:
              trigger:
              - type: api
                path: followup-incident
                method: POST
                payload_schema:
                  type: object
                  properties: {}
                  additionalProperties: true
                response:
                  ok: true
              effects:
              - title: Mark Followup Complete
                type: update.contract
                update:
                  $set:
                    local.followup_complete: true
    successCriteria:
    - condition: $statusCode == 201
    outputs:
      templateId: $response.body.id
  - stepId: fetchTemplate
    operationId: $sourceDescriptions.adminApi.get_admin_api_templates_by_template_id
    parameters:
    - name: Authentication-Token
      in: header
      value: $steps.getMe.outputs.token
    - name: template_id
      in: path
      value: $steps.createTemplate.outputs.templateId
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      template: $response.body
  - stepId: invokeRuntimeApi
    summary: Invoke runtime API
    description: Call the generated API route for the created template.
    operationId: $sourceDescriptions.apisApi.post_apis_by_template_id_by_dyn_path
    parameters:
    - name: Authentication-Token
      in: header
      value: $steps.getMe.outputs.token
    - name: X-CSRFToken
      in: header
      value: $steps.getCsrf.outputs.token
    - name: template_id
      in: path
      value: $steps.createTemplate.outputs.templateId
    - name: dyn_path
      in: path
      value: dispatch-followup
    requestBody:
      contentType: application/json
      payload: {}
    successCriteria:
    - condition: $statusCode == 200
  outputs:
    templateId: $steps.createTemplate.outputs.templateId
    template: $steps.fetchTemplate.outputs.template
- workflowId: runBatchIterationTemplate
  summary: Iterate a batch of effects
  steps:
  - stepId: getMe
    operationId: $sourceDescriptions.securityApi.get_user_me
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      token: $response.body.token
  - stepId: getCsrf
    operationId: $sourceDescriptions.csrfApi.get_csrf
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      token: $response.headers.N-CSRF-Token
  - stepId: createTemplate
    operationId: $sourceDescriptions.adminApi.post_admin_api_templates
    parameters:
    - name: Authentication-Token
      in: header
      value: $steps.getMe.outputs.token
    - name: X-CSRFToken
      in: header
      value: $steps.getCsrf.outputs.token
    requestBody:
      contentType: application/json
      payload:
        name: backend-batch-iteration
        description: Process a batch of payloads through nested effects.
        definition:
          id: backend-batch-iteration
          version: '1.0'
          events:
            ProcessBatch:
              trigger:
              - type: api
                path: process-batch
                method: POST
                payload_schema:
                  type: object
                  properties:
                    items:
                      type: array
                      items:
                        type: object
                  additionalProperties: true
                response:
                  ok: true
              effects:
              - title: Iterate Batch
                type: iter.effects
                iter:
                - payload:
                    line: alpha
                - payload:
                    line: beta
                effects:
                - title: Normalize Line
                  type: custom.function
                  func: backend.incident.normalize_line
                  key: normalized_line
                  args:
                  - $$ctx.payload.line
                  kwargs:
                    prefix: incident
                - title: Mark Last Line
                  type: update.contract
                  update:
                    $set:
                      local.last_batch_line: $$ctx.payload.line
    successCriteria:
    - condition: $statusCode == 201
    outputs:
      templateId: $response.body.id
  - stepId: fetchTemplate
    operationId: $sourceDescriptions.adminApi.get_admin_api_templates_by_template_id
    parameters:
    - name: Authentication-Token
      in: header
      value: $steps.getMe.outputs.token
    - name: template_id
      in: path
      value: $steps.createTemplate.outputs.templateId
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      template: $response.body
  - stepId: invokeRuntimeApi
    summary: Invoke runtime API
    description: Call the generated API route for the created template.
    operationId: $sourceDescriptions.apisApi.post_apis_by_template_id_by_dyn_path
    parameters:
    - name: Authentication-Token
      in: header
      value: $steps.getMe.outputs.token
    - name: X-CSRFToken
      in: header
      value: $steps.getCsrf.outputs.token
    - name: template_id
      in: path
      value: $steps.createTemplate.outputs.templateId
    - name: dyn_path
      in: path
      value: process-batch
    requestBody:
      contentType: application/json
      payload:
        items:
        - line: alpha
        - line: beta
    successCriteria:
    - condition: $statusCode == 200
  outputs:
    templateId: $steps.createTemplate.outputs.templateId
    template: $steps.fetchTemplate.outputs.template
- workflowId: runFunctionHookTemplate
  summary: Call a custom backend function
  steps:
  - stepId: getMe
    operationId: $sourceDescriptions.securityApi.get_user_me
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      token: $response.body.token
  - stepId: getCsrf
    operationId: $sourceDescriptions.csrfApi.get_csrf
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      token: $response.headers.N-CSRF-Token
  - stepId: createTemplate
    operationId: $sourceDescriptions.adminApi.post_admin_api_templates
    parameters:
    - name: Authentication-Token
      in: header
      value: $steps.getMe.outputs.token
    - name: X-CSRFToken
      in: header
      value: $steps.getCsrf.outputs.token
    requestBody:
      contentType: application/json
      payload:
        name: backend-function-hook
        description: Call a registered backend helper function.
        definition:
          id: backend-function-hook
          version: '1.0'
          events:
            BuildSummary:
              trigger:
              - type: api
                path: build-summary
                method: POST
                payload_schema:
                  type: object
                  properties: {}
                  additionalProperties: true
                response:
                  ok: true
              effects:
              - title: Normalize Summary
                type: custom.function
                func: backend.incident.build_summary
                key: summary
                args:
                - $$ctx.payload
                kwargs:
                  include_links: true
                  uppercase: false
    successCriteria:
    - condition: $statusCode == 201
    outputs:
      templateId: $response.body.id
  - stepId: fetchTemplate
    operationId: $sourceDescriptions.adminApi.get_admin_api_templates_by_template_id
    parameters:
    - name: Authentication-Token
      in: header
      value: $steps.getMe.outputs.token
    - name: template_id
      in: path
      value: $steps.createTemplate.outputs.templateId
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      template: $response.body
  - stepId: invokeRuntimeApi
    summary: Invoke runtime API
    description: Call the generated API route for the created template.
    operationId: $sourceDescriptions.apisApi.post_apis_by_template_id_by_dyn_path
    parameters:
    - name: Authentication-Token
      in: header
      value: $steps.getMe.outputs.token
    - name: X-CSRFToken
      in: header
      value: $steps.getCsrf.outputs.token
    - name: template_id
      in: path
      value: $steps.createTemplate.outputs.templateId
    - name: dyn_path
      in: path
      value: build-summary
    requestBody:
      contentType: application/json
      payload:
        title: summary
    successCriteria:
    - condition: $statusCode == 200
  outputs:
    templateId: $steps.createTemplate.outputs.templateId
    template: $steps.fetchTemplate.outputs.template
- workflowId: runGroupLifecycleTemplate
  summary: Create and update groups
  steps:
  - stepId: getMe
    operationId: $sourceDescriptions.securityApi.get_user_me
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      token: $response.body.token
  - stepId: getCsrf
    operationId: $sourceDescriptions.csrfApi.get_csrf
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      token: $response.headers.N-CSRF-Token
  - stepId: createTemplate
    operationId: $sourceDescriptions.adminApi.post_admin_api_templates
    parameters:
    - name: Authentication-Token
      in: header
      value: $steps.getMe.outputs.token
    - name: X-CSRFToken
      in: header
      value: $steps.getCsrf.outputs.token
    requestBody:
      contentType: application/json
      payload:
        name: backend-group-lifecycle
        description: Create and update responder groups.
        definition:
          id: backend-group-lifecycle
          version: '1.0'
          events:
            CreateResponderGroup:
              trigger:
              - type: api
                path: create-responder-group
                method: POST
                payload_schema:
                  type: object
                  properties: {}
                  additionalProperties: true
                response:
                  ok: true
              effects:
              - title: Create Group
                type: create.group
                name: incident-responders
                key: group_id
                group_type: workspace
                sub: u:1
              - title: Update Group
                type: update.group
                group_id: $$ctx.local.group_id
                name: incident-response-team
                edit_members:
                  add_members:
                  - u:1
                  promote_admins:
                  - u:1
    successCriteria:
    - condition: $statusCode == 201
    outputs:
      templateId: $response.body.id
  - stepId: fetchTemplate
    operationId: $sourceDescriptions.adminApi.get_admin_api_templates_by_template_id
    parameters:
    - name: Authentication-Token
      in: header
      value: $steps.getMe.outputs.token
    - name: template_id
      in: path
      value: $steps.createTemplate.outputs.templateId
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      template: $response.body
  - stepId: invokeRuntimeApi
    summary: Invoke runtime API
    description: Call the generated API route for the created template.
    operationId: $sourceDescriptions.apisApi.post_apis_by_template_id_by_dyn_path
    parameters:
    - name: Authentication-Token
      in: header
      value: $steps.getMe.outputs.token
    - name: X-CSRFToken
      in: header
      value: $steps.getCsrf.outputs.token
    - name: template_id
      in: path
      value: $steps.createTemplate.outputs.templateId
    - name: dyn_path
      in: path
      value: create-responder-group
    requestBody:
      contentType: application/json
      payload: {}
    successCriteria:
    - condition: $statusCode == 200
  outputs:
    templateId: $steps.createTemplate.outputs.templateId
    template: $steps.fetchTemplate.outputs.template
- workflowId: runCreditOperationsTemplate
  summary: Spend, charge, and transfer credits
  steps:
  - stepId: getMe
    operationId: $sourceDescriptions.securityApi.get_user_me
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      token: $response.body.token
  - stepId: getCsrf
    operationId: $sourceDescriptions.csrfApi.get_csrf
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      token: $response.headers.N-CSRF-Token
  - stepId: createTemplate
    operationId: $sourceDescriptions.adminApi.post_admin_api_templates
    parameters:
    - name: Authentication-Token
      in: header
      value: $steps.getMe.outputs.token
    - name: X-CSRFToken
      in: header
      value: $steps.getCsrf.outputs.token
    requestBody:
      contentType: application/json
      payload:
        name: backend-credit-operations
        description: Track wallet balances and transfers.
        definition:
          id: backend-credit-operations
          version: '1.0'
          events:
            ReconcileWallet:
              trigger:
              - type: api
                path: reconcile-wallet
                method: POST
                payload_schema:
                  type: object
                  properties: {}
                  additionalProperties: true
                response:
                  ok: true
              effects:
              - title: Inspect Balance
                type: balance.credits
                key: balances_before
                credits:
                  primary:
                    wallet_id: 1
                    product: incident-ops
              - title: Charge Credit
                type: charge.credits
                credit:
                  wallet_id: 1
                  product: incident-ops
                  amount: 2
              - title: Spend Credit
                type: use.credits
                credit:
                  wallet_id: 1
                  product: incident-ops
                  amount: 1
              - title: Transfer Credit
                type: transfers.credits
                credit:
                  wallet_id: 1
                  product: incident-ops
                  amount: 1
                  to_wallet_id: 2
    successCriteria:
    - condition: $statusCode == 201
    outputs:
      templateId: $response.body.id
  - stepId: fetchTemplate
    operationId: $sourceDescriptions.adminApi.get_admin_api_templates_by_template_id
    parameters:
    - name: Authentication-Token
      in: header
      value: $steps.getMe.outputs.token
    - name: template_id
      in: path
      value: $steps.createTemplate.outputs.templateId
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      template: $response.body
  - stepId: invokeRuntimeApi
    summary: Invoke runtime API
    description: Call the generated API route for the created template.
    operationId: $sourceDescriptions.apisApi.post_apis_by_template_id_by_dyn_path
    parameters:
    - name: Authentication-Token
      in: header
      value: $steps.getMe.outputs.token
    - name: X-CSRFToken
      in: header
      value: $steps.getCsrf.outputs.token
    - name: template_id
      in: path
      value: $steps.createTemplate.outputs.templateId
    - name: dyn_path
      in: path
      value: reconcile-wallet
    requestBody:
      contentType: application/json
      payload: {}
    successCriteria:
    - condition: $statusCode == 200
  outputs:
    templateId: $steps.createTemplate.outputs.templateId
    template: $steps.fetchTemplate.outputs.template
- workflowId: runSchedulerTemplate
  summary: Schedule and unschedule backend tasks
  steps:
  - stepId: getMe
    operationId: $sourceDescriptions.securityApi.get_user_me
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      token: $response.body.token
  - stepId: getCsrf
    operationId: $sourceDescriptions.csrfApi.get_csrf
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      token: $response.headers.N-CSRF-Token
  - stepId: createTemplate
    operationId: $sourceDescriptions.adminApi.post_admin_api_templates
    parameters:
    - name: Authentication-Token
      in: header
      value: $steps.getMe.outputs.token
    - name: X-CSRFToken
      in: header
      value: $steps.getCsrf.outputs.token
    requestBody:
      contentType: application/json
      payload:
        name: backend-scheduler
        description: Schedule and cancel follow-ups.
        definition:
          id: backend-scheduler
          version: '1.0'
          events:
            ScheduleReminder:
              trigger:
              - type: api
                path: schedule-reminder
                method: POST
                payload_schema:
                  type: object
                  properties: {}
                  additionalProperties: true
                response:
                  ok: true
              effects:
              - title: Schedule Event
                type: schedule.event
                key: reminder_job
                event:
                  at: '2026-12-31T09:00:00'
                  event_name: SendIncidentReminder
                  payload:
                    incident_id: incident-1
              - title: Unschedule Event
                type: unschedule.event
                event_id: job-incident-reminder
    successCriteria:
    - condition: $statusCode == 201
    outputs:
      templateId: $response.body.id
  - stepId: fetchTemplate
    operationId: $sourceDescriptions.adminApi.get_admin_api_templates_by_template_id
    parameters:
    - name: Authentication-Token
      in: header
      value: $steps.getMe.outputs.token
    - name: template_id
      in: path
      value: $steps.createTemplate.outputs.templateId
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      template: $response.body
  - stepId: invokeRuntimeApi
    summary: Invoke runtime API
    description: Call the generated API route for the created template.
    operationId: $sourceDescriptions.apisApi.post_apis_by_template_id_by_dyn_path
    parameters:
    - name: Authentication-Token
      in: header
      value: $steps.getMe.outputs.token
    - name: X-CSRFToken
      in: header
      value: $steps.getCsrf.outputs.token
    - name: template_id
      in: path
      value: $steps.createTemplate.outputs.templateId
    - name: dyn_path
      in: path
      value: schedule-reminder
    requestBody:
      contentType: application/json
      payload:
        event_name: SendIncidentReminder
    successCriteria:
    - condition: $statusCode == 200
  outputs:
    templateId: $steps.createTemplate.outputs.templateId
    template: $steps.fetchTemplate.outputs.template
- workflowId: runIntegrationTemplate
  summary: Call external health checks and notify users
  steps:
  - stepId: getMe
    operationId: $sourceDescriptions.securityApi.get_user_me
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      token: $response.body.token
  - stepId: getCsrf
    operationId: $sourceDescriptions.csrfApi.get_csrf
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      token: $response.headers.N-CSRF-Token
  - stepId: createTemplate
    operationId: $sourceDescriptions.adminApi.post_admin_api_templates
    parameters:
    - name: Authentication-Token
      in: header
      value: $steps.getMe.outputs.token
    - name: X-CSRFToken
      in: header
      value: $steps.getCsrf.outputs.token
    requestBody:
      contentType: application/json
      payload:
        name: backend-integration
        description: Ping an external health endpoint and notify responders.
        definition:
          id: backend-integration
          version: '1.0'
          events:
            SyncExternalStatus:
              trigger:
              - type: api
                path: sync-external-status
                method: POST
                payload_schema:
                  type: object
                  properties: {}
                  additionalProperties: true
                response:
                  ok: true
              effects:
              - title: Ping Service
                type: http.request
                key: ping_backend
                request:
                  method: GET
                  url: https://example.com/health
              - title: Notify Responders
                type: notify
                notify:
                  event: backend.external.synced
                  targets:
                    u:1:
                    - in_app
                  payload:
                    source: backend
                    status: ok
    successCriteria:
    - condition: $statusCode == 201
    outputs:
      templateId: $response.body.id
  - stepId: invokeRuntimeApi
    summary: Invoke runtime API
    description: Call the generated API route for the created template.
    operationId: $sourceDescriptions.apisApi.post_apis_by_template_id_by_dyn_path
    parameters:
    - name: Authentication-Token
      in: header
      value: $steps.getMe.outputs.token
    - name: X-CSRFToken
      in: header
      value: $steps.getCsrf.outputs.token
    - name: template_id
      in: path
      value: $steps.createTemplate.outputs.templateId
    - name: dyn_path
      in: path
      value: sync-external-status
    requestBody:
      contentType: application/json
      payload: {}
    successCriteria:
    - condition: $statusCode == 200
  outputs:
    templateId: $steps.createTemplate.outputs.templateId
