$37
OctoMesh pipelines are YAML-defined ETL data flows executed by adapters. Each pipeline has triggers that start execution and transformations (an ordered list of nodes) that process data through a shared DataContext — a mutable JSON document accessed via JSONPath.
An Adapter (System.Communication/Adapter) is a unified runtime that executes pipelines. Different adapter implementations exist (Mesh Adapter, Zenon Adapter, Simulation Adapter, etc.) but they all share the same CK type and pipeline execution model. Each adapter registers the pipeline nodes it supports — SDK-shared nodes plus adapter-specific ones.
Pipelines handle: entity CRUD, cross-adapter data synchronization, data import/export, notifications, report generation, AI queries, anomaly detection, and more.
NEVER guess how a pipeline node behaves. When you are unsure about a node's properties, behavior, defaults, or edge cases, you MUST read the actual C# source code before answering or generating YAML. The reference docs in this skill are summaries — the source code is the ground truth.
You MUST read source code when:
Pipeline nodes are split across two repositories in the monorepo. All paths below are relative to the monorepo root (the parent directory containing octo-sdk, octo-mesh-adapter, etc.):
SDK nodes (ForEach, If, Switch, SetPrimitiveValue, For, SelectByPath, etc.):
octo-sdk/src/Sdk.Common/EtlDataPipeline/Nodes/
├── Control/ (ForEach, If, Switch, For, SelectByPath)
├── Extracts/ (SetPrimitiveValue, SetArrayOfPrimitiveValues, WriteJson)
├── Transforms/ (Concat, FormatString, TransformString, Hash, Math, etc.)
├── Triggers/ (FromPolling, FromPipelineDataEvent)
├── Loads/ (ToPipelineDataEvent, ToWebhook)
└── Buffering/ (BufferData, BufferRetrievalNode)
Mesh Adapter nodes (GetRtEntitiesByType, CreateUpdateInfo, ApplyChanges, etc.):
octo-mesh-adapter/src/MeshNodes.Sdk/
├── Extract/ (GetRtEntitiesByType, GetRtEntitiesById, GetOrCreate, etc.)
├── Transform/ (CreateUpdateInfo, CreateAssociationUpdate, CheckDuplicate, etc.)
├── Load/ (ApplyChanges, SaveInTimeSeries, SendEMail, SftpUpload, etc.)
└── Trigger/ (FromWatchRtEntity, FromHttpRequest, FromEmail, etc.)
octo-mesh-adapter/src/MeshAdapter.Sdk/Nodes/
├── Extract/
├── Transform/
├── Load/
└── Trigger/
Finding the monorepo root: The monorepo root is the parent directory of this plugin's repository. Use ../ relative to the plugin working directory, or search upward for a directory containing both octo-sdk/ and octo-mesh-adapter/.
| What | Pattern | Example |
|---|---|---|
| Config class | [NodeName]NodeConfiguration.cs | CheckDuplicateNodeConfiguration.cs |
| Config class (versioned) | [NodeName]NodeConfiguration[N].cs | ApplyChangesNodeConfiguration2.cs |
| Handler class | [NodeName]Node.cs | CheckDuplicateNode.cs |
| Handler class (versioned) | [NodeName]Node[N].cs | ApplyChangesNode2.cs |
| SDK nodes | Config + handler in same file | ForEachNode.cs |
| Config attribute | [NodeName("DisplayName", Version)] | [NodeName("CheckDuplicate", 1)] |
| Handler attribute | [NodeConfiguration(typeof(ConfigClass))] | [NodeConfiguration(typeof(CheckDuplicateNodeConfiguration))] |
Step 1 — Find the source file (use Grep and Glob from the monorepo root):
# Search by node name (e.g., "CheckDuplicate")
Grep for: NodeName\("CheckDuplicate"
in: octo-mesh-adapter/src/ (mesh adapter nodes)
or: octo-sdk/src/ (SDK nodes)
# Or find the file by naming convention
Glob for: **/CheckDuplicate*Configuration*.cs
in: octo-mesh-adapter/src/MeshNodes.Sdk/
Step 2 — Read the configuration class to learn:
Step 3 — Read the handler class to learn:
All paths below are relative to the monorepo root:
# Find where a specific node is defined
Grep pattern: NodeName\("CreateUpdateInfo"
Path: octo-mesh-adapter/src/
# If not found in mesh-adapter, search the SDK
Grep pattern: NodeName\("CreateUpdateInfo"
Path: octo-sdk/src/
# Find all available nodes for a category
Glob pattern: **/*NodeConfiguration*.cs
Path: octo-mesh-adapter/src/MeshNodes.Sdk/Transform/
# Find the handler to understand runtime behavior
Glob pattern: **/CheckDuplicateNode.cs
Path: octo-mesh-adapter/src/MeshAdapter.Sdk/
A DataFlow (System.Communication/DataFlow) is a logical grouping of related pipelines that work together as part of a single data processing workflow. It serves as the parent container for Pipeline and PipelineTrigger instances.
Migration note: CK migration
3.1.0→3.1.1unified the oldEdgeAdapter/MeshAdapterinto a singleAdaptertype, andEdgePipeline/MeshPipelineinto a singlePipelinetype. Earlier migrations renamedDataPipeline→DataFlowandDataPipelineTrigger→PipelineTrigger. These are handled automatically byChangeCkTypetransforms.
Key concepts:
System/ParentChild associationToPipelineDataEvent@1 (with targetPipelineRtId) and FromPipelineDataEvent@1A PipelineTrigger (System.Communication/PipelineTrigger) is a child of a DataFlow that triggers pipeline execution on a cron schedule via the Bot Service:
Enabled and CronExpression attributesTriggers association linking to one or more Pipeline entitiesFromPipelineTriggerEvent@1 as their trigger nodeminute hour dayOfMonth month dayOfWeek year (6 fields)Entity relationships:
DataFlow
├── Pipeline (child, via ParentChild) ── executes on ── Adapter
└── PipelineTrigger (child, via ParentChild) ── triggers ── Pipeline(s)