ascn-operator
ASCN Operator
Operate ASCN workflows using MCP control.* tools with deterministic, auditable outcomes.
When To Use
Use this skill for:
- workflow lifecycle changes (
create|repair|patch|export|delete) - plugin publication (
publish_plugin) - operator diagnostics (
explain)
Do not use this skill to design brand-new handlers/triggers. Delegate that to ascn-integrations.
Required Inputs
The operator MUST collect:
intent(create|repair|patch|export|publish_plugin|delete|explain)
Intent-specific required inputs:
workflow_idforpatch|repair|export|deleteplugin_nameandhandlers[]forpublish_pluginpublish_pluginhandlers MUST be user-defined and matchUser.<Handler>
Recommended inputs:
- success criteria (expected tool name, run status, or plugin visibility)
blueprint_preference(linear|fanout|conditional|retryable_http|tool_export)- constraints (
latency_slo_ms,throughput_rps,idempotency_requirement)
If required inputs are missing, stop and return input_validation_error.
Dependency And Discovery Policy
At task start, the operator MUST run:
control.docs.get- tool discovery check for required surface:
control.registry.listcontrol.registry.detailscontrol.registry.resolve_optionscontrol.workflows.listcontrol.workflows.describecontrol.workflows.validatecontrol.workflows.createcontrol.workflows.patchcontrol.workflows.activatecontrol.workflows.deletecontrol.tools.list_exportscontrol.tools.ensure_exportcontrol.runs.listcontrol.runs.detailscontrol.plugins.create_plugincontrol.plugins.validate_definitioncontrol.plugins.update_plugincontrol.plugins.getcontrol.plugins.list
Connectivity defaults (use as hints, not hard requirements):
- transport:
streamable_http - dependency id:
workspace-mcp-gateway - URL hint:
https://nocode.ascn.ai/mcp - secret hint:
mcp_gateway_token - auth header:
Authorization: Bearer <token>(must match secret value) - token generation URL:
https://ascn.ai/no-code/mcp-list
If discovery fails, do not mutate. Return dependency_failure with missing tools and connection hints.
Capability Gap Policy
After dependency checks, classify capability in this order:
- inspect workflows/exports (
control.workflows.list,control.workflows.describe,control.tools.list_exports) - inspect handlers/triggers (
control.registry.list,control.registry.details) - classify as one of:
sufficientmissing_handlermissing_triggermissing_auth_capabilityschema_or_contract_gap
If not sufficient, the operator MUST NOT invent handler names. It MUST pause mutations and delegate to skills/ascn-integrations/SKILL.md.
Blueprint Selection
For create|patch|repair|export, choose exactly one:
linearfanoutconditionalretryable_httptool_export
Then enforce topology consistency with the selected blueprint.
Execution Flow
Common authoring pipeline:
- select blueprint
- schema-lock from
control.registry.details(required fields, defaults, secret-backed fields) - build minimal valid draft
- run reference safety gate:
- every
$node[...]has a reachable path - no raw
$...directive without={{ ... }} - no secret literals
- every
- validate (
control.workflows.validate)- payload MUST be wrapped as
{ "workflow": { ... } }
- payload MUST be wrapped as
- mutate (
createorpatch) - activate (
control.workflows.activate) - expand only when required by scope
Intent call order:
create
control.workflows.listcontrol.registry.listcontrol.registry.details- authoring pipeline with
create
patch|repair
control.workflows.listcontrol.workflows.describecontrol.registry.details- authoring pipeline with
patch
export
control.workflows.describecontrol.tools.list_exportswithexpose_mcp_only=falsecontrol.tools.ensure_export(must includeoutput_path)control.workflows.validate- payload MUST be wrapped as
{ "workflow": { ... } }
- payload MUST be wrapped as
control.workflows.activate- smoke invoke exported tool with minimal payload
control.runs.listcontrol.runs.detailson failure/unexpected status
publish_plugin
- validate every handler matches
User.<Handler>; reject system handlers (for exampleTelegram.*) control.registry.detailsfor each handler- collect existing plugin examples using
control.plugins.listwithinclude_definition=true(never query DB directly) - use
control.plugins.getfor deterministic single-definition reads when adefinition_idalready exists - for fields with
options_source, resolve viacontrol.registry.resolve_options - when editing
params_ui, apply conditional patterns and validation checklist fromskills/ascn-integrations/SKILL.md(Conditional UI Recipes,Conditional UI Validation Checklist) - preflight with
control.plugins.validate_definition control.plugins.create_plugin- optional
control.plugins.update_plugin control.plugins.listverify plugin is visible
delete
control.workflows.describe- summarize destructive impact
control.workflows.deletewithconfirm=true
Authoring Standards
- Activity IDs MUST be unique.
- Every
edges[].toMUST reference an existing activity. - Trigger entry edges SHOULD be explicit for clear starts.
$jsonMUST be used only for current node input.- Upstream reads MUST use
$node['id'].json.fieldwith graph reachability. - Dynamic expressions and secrets MUST use
={{ ... }}. - Credentials MUST NOT be hardcoded.
Retry And Stop Rules
- Operation key format:
{intent}:{workflow_id|workflow_name}:{payload_hash} - Retry only transient failures (
timeout,5xx, transport unavailable), max 3 attempts with exponential backoff. - Never auto-retry validation, schema, or export-conflict errors.
- Never delete without explicit
confirm=true. - Never mutate when dependency checks fail.
Output Contract
Every completion MUST return:
{
"intent": "create|repair|patch|export|publish_plugin|delete|explain",
"workflow_id": "uuid-or-null",
"selected_blueprint": "linear|fanout|conditional|retryable_http|tool_export|null",
"capability_status": "sufficient|missing_handler|missing_trigger|missing_auth_capability|schema_or_contract_gap",
"actions": [
{
"step": "string",
"tool": "control.*",
"status": "completed|skipped|failed"
}
],
"validation": {
"validated": true,
"activated": true
},
"verification": {
"smoke_tested": true,
"latest_run_status": "COMPLETED|FAILED|RUNNING|UNKNOWN",
"run_id": "string-or-null",
"trace_id": "string-or-null"
},
"plugin": {
"plugin_name": "string-or-null",
"visible_in_plugins_list": true
},
"failure": {
"class": "none|input_validation_error|dependency_failure|validation_failure|runtime_failure|capability_gap",
"message": "string"
},
"next_action": "string"
}