KO

koreforge-processing

Utility for constructing typed data processing pipelines in KoreForge.

Install

mkdir -p .claude/skills/koreforge-processing && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/18010" && unzip -o skill.zip -d .claude/skills/koreforge-processing && rm skill.zip

Installs to .claude/skills/koreforge-processing

Activation

This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.

Use when building data transformation pipelines, batch processing, or step-based processing in a KoreForge application. Covers KoreForge.Processing: PipelineBuilder, BatchPipelineExecutor, IPipelineStep, IPipelineMetrics, pipeline configuration.
245 chars✓ has a “when” trigger
Intermediate

Key capabilities

  • Build a typed pipeline for processing items
  • Implement custom steps with `IPipelineStep<TContext>`
  • Handle step outcomes like `Continue`, `Success`, `Failure`, or `Skip`
  • Execute pipelines against a list of items in parallel using `BatchPipelineExecutor`
  • Define a context class to carry data between pipeline steps
  • Integrate with `IOperationMonitor` for pipeline lifecycle metrics

How it works

The skill uses `PipelineBuilder` to define a sequence of `IPipelineStep` implementations, which process a `ProcessingContext` object. Each step returns a `StepOutcome` to control pipeline flow.

Inputs & outputs

You give it
ProcessingContext object with initial data
You get back
StepOutcome indicating success, failure, or continuation

When to use koreforge-processing

  • Build data processing pipeline
  • Implement pipeline validation steps
  • Set up batch processing workflows

About this skill

KoreForge Processing Skill

Package

<PackageReference Include="KoreForge.Processing" />

Pipeline Building

// Build a typed pipeline for a single item
var pipeline = PipelineBuilder
    .Create<ProcessingContext>()
    .UseStep<ValidateStep>()
    .UseStep<EnrichStep>()
    .UseStep<PersistStep>()
    .Build();

// Execute for one item
var result = await pipeline.RunAsync(new ProcessingContext { ... }, cancellationToken);

Build() returns an IPipeline<T> — register it as a singleton if steps are stateless.

Implementing Steps

public sealed class ValidateStep : IPipelineStep<ProcessingContext>
{
    public async Task<StepOutcome> ExecuteAsync(ProcessingContext context, CancellationToken ct)
    {
        if (string.IsNullOrEmpty(context.Payload))
            return StepOutcome.Failure("Payload is required");

        return StepOutcome.Continue;  // proceed to next step
    }
}

public sealed class EnrichStep : IPipelineStep<ProcessingContext>
{
    private readonly ILookupService _lookup;

    public EnrichStep(ILookupService lookup) => _lookup = lookup;

    public async Task<StepOutcome> ExecuteAsync(ProcessingContext context, CancellationToken ct)
    {
        context.Metadata = await _lookup.GetAsync(context.EntityId, ct);
        return StepOutcome.Continue;
    }
}

StepOutcome Values

ValueEffect
StepOutcome.ContinueMove to next step
StepOutcome.SuccessHalt pipeline, result is success
StepOutcome.Failure("reason")Halt pipeline, result is failure
StepOutcome.SkipSkip this step (from conditional branch)

Batch Processing

BatchPipelineExecutor<TIn, TOut> runs a pipeline against a list of items in parallel, collecting results:

var executor = new BatchPipelineExecutor<ProcessingContext, ProcessedRecord>(
    pipeline,
    context => context.Result,         // selector — how to extract the output from context
    maxDegreeOfParallelism: 4);

var batch = items.Select(i => new ProcessingContext { Payload = i }).ToList();
var results = await executor.ExecuteAsync(batch, cancellationToken);

var succeeded = results.Where(r => r.IsSuccess).ToList();
var failed    = results.Where(r => !r.IsSuccess).ToList();

Registering Steps in DI

Steps are resolved per pipeline run via DI. Register them according to their state:

// Stateless steps — safe to share
builder.Services.AddSingleton<ValidateStep>();

// Stateful or DbContext-dependent steps — scoped
builder.Services.AddScoped<PersistStep>();
builder.Services.AddTransient<EnrichStep>();

When the pipeline is used inside a scoped context (e.g. HTTP request), steps resolve from that scope.

Pipeline Context

Define a context class that carries data between steps:

public sealed class ProcessingContext
{
    // Input — set before pipeline runs
    public string Payload { get; init; } = "";
    public Guid EntityId { get; init; }

    // Intermediate state — steps populate during execution
    public EntityMetadata? Metadata { get; set; }

    // Output — final step sets this
    public ProcessedRecord? Result { get; set; }
}

Metrics Integration

Implement IPipelineMetrics to hook into the pipeline lifecycle for IOperationMonitor:

public sealed class MonitoredPipelineMetrics : IPipelineMetrics
{
    private readonly IOperationMonitor _monitor;

    public MonitoredPipelineMetrics(IOperationMonitor monitor) => _monitor = monitor;

    public IDisposable BeginStep(string pipelineName, string stepName)
        => _monitor.Begin($"{pipelineName}.{stepName}");
}

// Register
builder.Services.AddSingleton<IPipelineMetrics, MonitoredPipelineMetrics>();

When IPipelineMetrics is registered in DI, PipelineBuilder picks it up automatically.

Pipeline Configuration via Options

var pipeline = PipelineBuilder
    .Create<ProcessingContext>()
    .Configure(options =>
    {
        options.ContinueOnStepFailure = false;   // default — abort on first failure
        options.ThrowOnFailure = false;           // default — return failure result, no exception
    })
    .UseStep<ValidateStep>()
    .UseStep<EnrichStep>()
    .Build();

Checklist

  • KoreForge.Processing in Directory.Packages.props + .csproj
  • Each step implements IPipelineStep<TContext> with a single ExecuteAsync method
  • StepOutcome.Continue used for intermediate steps, StepOutcome.Success for terminal steps
  • Steps registered in DI matching their state characteristics (singleton/scoped/transient)
  • IPipelineMetrics wired if IOperationMonitor is available
  • Pipeline built once and reused — do not rebuild per-request

When not to use it

  • When pipeline steps are not stateless and registered as singletons
  • When the pipeline is rebuilt per-request instead of being reused

Prerequisites

KoreForge.Processing package

Limitations

  • Steps must be registered in DI according to their state characteristics (singleton, scoped, transient)
  • The `IPipelineMetrics` interface is only picked up automatically if registered in DI

How it compares

This approach structures data processing into explicit, reusable steps with defined outcomes, unlike a manual sequence of function calls that might lack clear flow control and dependency injection.

Compared to similar skills

koreforge-processing side by side with the closest alternatives in the catalog.

SkillInstallsUpdatedSafetyDifficulty
koreforge-processing (this skill)02moNo flagsIntermediate
csharp-developer432moNo flagsAdvanced
csharp-pro93moNo flagsIntermediate
dotnet-backend-patterns74moNo flagsAdvanced

Try saying

Example prompts that trigger this skill in your AI assistant.

You might also like

csharp-developer

zenobi-us

Expert C# developer specializing in modern .NET development, ASP.NET Core, and cloud-native applications. Masters C# 12 features, Blazor, and cross-platform development with emphasis on performance and clean architecture.

43151

csharp-pro

sickn33

Write modern C# code with advanced features like records, pattern matching, and async/await. Optimizes .NET applications, implements enterprise patterns, and ensures comprehensive testing. Use PROACTIVELY for C# refactoring, performance optimization, or complex .NET solutions.

953

dotnet-backend-patterns

wshobson

Master C#/.NET backend development patterns for building robust APIs, MCP servers, and enterprise applications. Covers async/await, dependency injection, Entity Framework Core, Dapper, configuration, caching, and testing with xUnit. Use when developing .NET backends, reviewing C# code, or designing API architectures.

722

azure-servicebus-dotnet

microsoft

Azure Service Bus SDK for .NET. Enterprise messaging with queues, topics, subscriptions, and sessions. Use for reliable message delivery, pub/sub patterns, dead letter handling, and background processing. Triggers: "Service Bus", "ServiceBusClient", "ServiceBusSender", "ServiceBusReceiver", "ServiceBusProcessor", "message queue", "pub/sub .NET", "dead letter queue".

316

backend-testing

exceptionless

Backend testing with xUnit, Foundatio.Xunit, integration tests with AppWebHostFactory, FluentClient, ProxyTimeProvider for time manipulation, and test data builders. Keywords: xUnit, Fact, Theory, integration tests, AppWebHostFactory, FluentClient, ProxyTimeProvider, TimeProvider, Foundatio.Xunit, TestWithLoggingBase, test data builders

316

azure-identity-dotnet

microsoft

Azure Identity SDK for .NET. Authentication library for Azure SDK clients using Microsoft Entra ID. Use for DefaultAzureCredential, managed identity, service principals, and developer credentials. Triggers: "Azure Identity", "DefaultAzureCredential", "ManagedIdentityCredential", "ClientSecretCredential", "authentication .NET", "Azure auth", "credential chain".

13

Search skills

Search the agent skills registry