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.zipInstalls 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.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
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
| Value | Effect |
|---|---|
StepOutcome.Continue | Move to next step |
StepOutcome.Success | Halt pipeline, result is success |
StepOutcome.Failure("reason") | Halt pipeline, result is failure |
StepOutcome.Skip | Skip 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.ProcessinginDirectory.Packages.props+.csproj - Each step implements
IPipelineStep<TContext>with a singleExecuteAsyncmethod -
StepOutcome.Continueused for intermediate steps,StepOutcome.Successfor terminal steps - Steps registered in DI matching their state characteristics (singleton/scoped/transient)
-
IPipelineMetricswired ifIOperationMonitoris 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
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.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| koreforge-processing (this skill) | 0 | 2mo | No flags | Intermediate |
| csharp-developer | 43 | 2mo | No flags | Advanced |
| csharp-pro | 9 | 3mo | No flags | Intermediate |
| dotnet-backend-patterns | 7 | 4mo | No flags | Advanced |
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.
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.
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.
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".
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
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".