Technical docs

Skills

Overview

Support reference for the skills library and shared builder pages.

Routes and access

  • Library route: `/skills`
  • Shared detail route: `/skills/[skill_id]`
  • Runs route: `/skills/[skill_id]/runs`
  • Run detail route: `/skills/[skill_id]/runs/[run_id]`
  • Sidebar/menu label: `Flows`
  • Library page heading: `Workflows and Skills`
  • The `/skills` library page is org-admin gated in the frontend.
  • The shared detail and runs pages are reused from other entry points and do not add the same frontend org-admin gate.

Library behavior

  • Header description: `Create, manage, and monitor skills and workflows`.
  • Primary action: `Add`
  • `/skills` lists only `agent` and `structured` workflows. The default employee workflow type is not part of this library view.
  • Current filters on `/skills`:
  • `Type`: `Agent`, `Flow`
  • `Member`
  • `Added`
  • `Updated`
  • Columns:
  • `ID`
  • `Member`
  • `Name`
  • `Description`
  • `Type`
  • `Added`
  • `Updated`
  • Row actions:
  • `Logs`
  • `Delete`
  • Bulk action:
  • `Delete`

Create dialog

  • Dialog title: `New Skill`
  • Current fields:
  • skill name
  • AI teammate selector
  • optional description
  • The current dialog does not expose a type picker.
  • It always creates a `structured` workflow.
  • If opened from an AI teammate page, the teammate is preselected and the selector is hidden.

Detail page

  • Shared with org workflows; the back link changes based on `?from=`.
  • Top actions:
  • `Back` or `Back to Workflows`
  • `View Runs`
  • `Edit`
  • while editing: `Reset Draft`, `Publish`, close button
  • The page opens read-only first.
  • Name is inline-editable from the header.
  • While editing, draft autosave runs after about 1 second of inactivity.
  • Publish sends:
  • `flow`
  • `starting_step_id`
  • `payload_format`
  • `state_definition`
  • `mode`
  • `debounce_seconds`
  • `debounce_key`

Builder behavior

  • Entry node label: `Starting Step`
  • Starting Step editor currently exposes:
  • payload schema editor
  • state schema editor labeled `State Definition`
  • `Execution Mode`
  • `Debounce (seconds)`
  • `Debounce Key`
  • Debounce validation:
  • minimum `5`
  • maximum `90`
  • Debounce key validation:
  • optional
  • max length `255`
  • State-definition field names use the same frontend validation rules as payload fields:
  • must start with a letter or underscore
  • only letters, numbers, underscores, and dots are allowed
  • trailing dots and consecutive dots are rejected
  • Starting Step actions:
  • `Start`
  • `API` when the workflow has an API URL
  • The `Start Skill` dialog always includes a payload JSON textarea.
  • If the starting step declares a state definition, the dialog also shows `Initial State (JSON)`.
  • The manual-start dialog describes these state values as available through `{{state.key}}` in later steps.
  • The manual-start dialog persists the last payload/state JSON locally per skill in the browser.
  • `Run Skill` node:
  • label defaults to `Run Skill`
  • targets another skill
  • filters to skills assigned to the same AI teammate when the current workflow has one
  • can store payload values and save-to-state mappings
  • requires the selected skill to have both a flow and a starting step
  • `Assign AI` node:
  • backend step type is `run_employee`
  • label defaults to `Assign AI`
  • selects an AI Teammate from the active AI staff list
  • stores an assignment, optional attachments JSON, AI response schema with descriptions, and save-to-state mappings
  • `Alloy AI` nodes use the full organization tool catalog in the editor, but published validation still enforces workflow-type guardrails:
  • `agent` workflows may contain only `Alloy AI`
  • `structured` workflows cannot publish `Alloy AI`

Runs

  • List entry from the library is labeled `Logs`, but the detail page action is `View Runs`.
  • Runs page supports:
  • server pagination
  • conversation ID filtering via URL/query state
  • open run details
  • Run detail page heading for logs: `Execution Logs`

API and realtime

  • List/create:
  • `GET /api/organizations/{orgId}/workflows`
  • `POST /api/organizations/{orgId}/workflows`
  • Bulk actions:
  • `POST /api/organizations/{orgId}/workflows/bulk-delete/`
  • `POST /api/organizations/{orgId}/workflows/bulk-restore/`
  • All items:
  • `GET /api/organizations/{orgId}/workflows/all/`
  • Detail/update/delete:
  • `GET /api/organizations/{orgId}/workflows/{workflow_id}/`
  • `PUT /api/organizations/{orgId}/workflows/{workflow_id}/`
  • `DELETE /api/organizations/{orgId}/workflows/{workflow_id}/`
  • Draft/publish:
  • `PUT /api/organizations/{orgId}/workflows/{workflow_id}/draft`
  • `POST /api/organizations/{orgId}/workflows/{workflow_id}/publish`
  • Runs:
  • `GET /api/organizations/{orgId}/workflows/{workflow_id}/runs/`
  • `POST /api/organizations/{orgId}/workflows/{workflow_id}/runs/`
  • `GET /api/organizations/{orgId}/workflows/{workflow_id}/runs/{run_id}/`
  • manual run creation can send both `payload` and `state`
  • org-wide logs feed: `GET /api/organizations/{orgId}/workflows/runs/`
  • Public API trigger:
  • `POST /api/public/trigger/{public_api_key}/{workflow_id}`
  • if `debounce_seconds` and an extractable `debounce_key` are configured, the request is queued in the debouncer and returns `{ debounced: true }`
  • if `mode = restart` and the same debounce key already has an active run, the older run is aborted before the new run starts
  • Manual run validation:
  • payload must include every key declared in `payload_format` with the expected primitive type
  • state is optional; when provided, only declared keys are type-checked against `state_definition`
  • Current run filters confirmed in code:
  • `status`
  • `run_id`
  • `conversation_id`
  • `channel`
  • `model`
  • `workflow_id`
  • `ai_employee_id`
  • `trigger_id`
  • `started`
  • `ended`
  • `duration`
  • `tokens`
  • `exclude`
  • WebSocket events used by the library:
  • `skill.created`
  • `skill.updated`
  • `skill.deleted`

Important current limits

  • The current create dialogs only create `structured` workflows, even though the list still displays both `Agent` and `Flow` entries.
  • The old skill chat/messages endpoints are not part of the current skills UI.
  • The workflow detail response currently exposes the workflow object and `api_url`. The shared detail page still does not expose trigger management here.

Start building your AI team