Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/examples/production-ready-integrations.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ Each `PatternKitExampleDescriptor` includes:
| `Patterns` | PatternKit primitives demonstrated by the example. |
| `ProductionChecks` | The behaviors that make the example production-shaped and regression-testable. |

The companion `IPatternKitPatternCatalog` records the canonical GoF pattern matrix. It links each pattern to its fluent runtime path, TinyBDD tests, real-world example, and source-generated path. Any missing generated path must point to a tracked issue; currently that is limited to the dedicated Interpreter generator and the dedicated Abstract Factory family generator.
The companion `IPatternKitPatternCatalog` records the broader pattern matrix: GoF patterns, enterprise integration patterns, messaging reliability patterns, and application architecture patterns. It links each pattern to its fluent/runtime path, TinyBDD tests, real-world example, and source-generated path. Any missing generated path must point to a tracked issue so planned work stays visible.

## Validate in a generic host

Expand Down
36 changes: 34 additions & 2 deletions docs/guides/pattern-coverage.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
# Pattern Coverage

PatternKit tracks the canonical Gang of Four patterns as production surfaces, not just API names. Each pattern should have:
PatternKit tracks design, integration, messaging, reliability, and architecture patterns as production surfaces, not just API names. The canonical Gang of Four patterns are one baseline, but the catalog is intentionally broader: Enterprise Integration Patterns, cloud architecture patterns, DDD-adjacent application patterns, and messaging reliability patterns can all be included when PatternKit has a credible runtime or generated integration story.

Each pattern should have:

- a fluent runtime path in `PatternKit.Core`
- TinyBDD coverage for the runtime path
Expand All @@ -10,7 +12,7 @@ PatternKit tracks the canonical Gang of Four patterns as production surfaces, no

The source of truth is `PatternKitPatternCatalog` in `src/PatternKit.Examples/ProductionReadiness`. The TinyBDD tests in `PatternKitPatternCatalogTests` validate the catalog against the repository so missing files, missing examples, or undocumented generator gaps fail in CI.

## Current GoF Coverage
## Current GoF Baseline

| Family | Pattern | Fluent path | Source-generated path |
| --- | --- | --- | --- |
Expand Down Expand Up @@ -38,6 +40,36 @@ The source of truth is `PatternKitPatternCatalog` in `src/PatternKit.Examples/Pr
| Behavioral | Template Method | `TemplateMethod<T>` and fluent templates | Template Method generator |
| Behavioral | Visitor | `Visitor<TBase, TResult>` and variants | Visitor generator |

## Enterprise And Architecture Coverage

| Family | Pattern | Fluent/runtime path | Source-generated path |
| --- | --- | --- | --- |
| Enterprise Integration | Message Envelope | `Message<TPayload>`, headers, context | Tracked in [#215](https://github.com/JerrettDavis/PatternKit/issues/215) |
| Enterprise Integration | Content-Based Router | `ContentRouter<TPayload, TResult>` | Messaging generator |
| Enterprise Integration | Recipient List | `RecipientList<TPayload>` | Tracked in [#210](https://github.com/JerrettDavis/PatternKit/issues/210) |
| Enterprise Integration | Splitter | `Splitter<TIn, TOut>` | Tracked in [#211](https://github.com/JerrettDavis/PatternKit/issues/211) |
| Enterprise Integration | Aggregator | `Aggregator<TKey, TIn, TOut>` | Tracked in [#211](https://github.com/JerrettDavis/PatternKit/issues/211) |
| Enterprise Integration | Routing Slip | `RoutingSlip<TPayload>` | Messaging generator |
| Enterprise Integration | Saga / Process Manager | `Saga<TState>` | Messaging generator |
| Enterprise Integration | Mailbox | `Mailbox<TPayload>` | Tracked in [#209](https://github.com/JerrettDavis/PatternKit/issues/209) |
| Messaging Reliability | Idempotent Receiver | `IdempotentReceiver<TPayload, TResult>` | Tracked in [#213](https://github.com/JerrettDavis/PatternKit/issues/213) |
| Messaging Reliability | Inbox | `InboxProcessor<TPayload, TResult>` | Tracked in [#213](https://github.com/JerrettDavis/PatternKit/issues/213) |
| Messaging Reliability | Outbox | `InMemoryOutbox<TPayload>` and dispatcher contracts | Tracked in [#213](https://github.com/JerrettDavis/PatternKit/issues/213) |
| Enterprise Integration | Request-Reply | Messaging backplane facade example | Tracked in [#214](https://github.com/JerrettDavis/PatternKit/issues/214) |
| Enterprise Integration | Publish-Subscribe | Messaging backplane facade example | Tracked in [#214](https://github.com/JerrettDavis/PatternKit/issues/214) |
| Application Architecture | CQRS | Mediator/dispatcher command-query split | First-class example tracked in [#212](https://github.com/JerrettDavis/PatternKit/issues/212) |

## Research Baselines

The catalog is allowed to grow beyond GoF when an external catalog describes a recurring enterprise pattern that PatternKit can make concrete:

- Enterprise Integration Patterns: message routing, splitter, aggregator, routing slip, idempotent receiver, and related messaging patterns.
- Patterns of Enterprise Application Architecture: application and data-access patterns such as Unit of Work, Identity Map, Repository, and Data Mapper.
- Cloud architecture patterns: retry, circuit breaker, CQRS, external configuration, competing consumers, and related distributed-system patterns.
- Domain-driven design tactical patterns: aggregate, domain event, specification, repository, bounded context, and process manager.

Entries should still be selective. A pattern belongs in the catalog only when PatternKit can demonstrate a runtime path, a source-generated path or tracked generator issue, documentation, TinyBDD coverage, and an importable example.

## Adding Or Extending A Pattern

1. Add or update the fluent runtime implementation and TinyBDD tests.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,17 @@
namespace PatternKit.Examples.ProductionReadiness;

/// <summary>
/// GoF pattern family used by the PatternKit pattern coverage catalog.
/// Pattern family used by the PatternKit pattern coverage catalog.
/// </summary>
public enum PatternFamily
{
Creational,
Structural,
Behavioral
Behavioral,
EnterpriseIntegration,
MessagingReliability,
CloudArchitecture,
ApplicationArchitecture
}

/// <summary>
Expand Down Expand Up @@ -37,7 +41,7 @@ public sealed record PatternImplementationPath(
}

/// <summary>
/// Describes one canonical GoF pattern and the PatternKit surfaces that support it.
/// Describes one design, integration, or architecture pattern and the PatternKit surfaces that support it.
/// </summary>
public sealed record PatternCoverageDescriptor(
string Name,
Expand All @@ -46,7 +50,7 @@ public sealed record PatternCoverageDescriptor(
IReadOnlyList<string> IntegrationNotes);

/// <summary>
/// Read-only catalog of PatternKit's coverage for the canonical GoF design patterns.
/// Read-only catalog of PatternKit's supported and tracked design, integration, and architecture patterns.
/// </summary>
public interface IPatternKitPatternCatalog
{
Expand Down Expand Up @@ -357,7 +361,189 @@ public sealed class PatternKitPatternCatalog : IPatternKitPatternCatalog
"docs/examples/document-processing-visitor.md",
"src/PatternKit.Examples/Generators/Visitors/DocumentProcessingDemo.cs",
"test/PatternKit.Examples.Tests/Generators/VisitorGeneratorExamplesTests.cs",
["fluent visitor", "generated visitor", "document processing example"])
["fluent visitor", "generated visitor", "document processing example"]),

Pattern("Message Envelope", PatternFamily.EnterpriseIntegration,
"docs/patterns/messaging/message-envelope.md",
"src/PatternKit.Core/Messaging/Message.cs",
"test/PatternKit.Tests/Messaging/MessageTests.cs",
null,
null,
null,
"https://github.com/JerrettDavis/PatternKit/issues/215",
"docs/examples/enterprise-messaging-workflows.md",
"src/PatternKit.Examples/Messaging/MessageEnvelopeExample.cs",
"test/PatternKit.Examples.Tests/Messaging/MessageEnvelopeExampleTests.cs",
["runtime envelope and headers", "generated contract path tracked", "enterprise workflow example"]),

Pattern("Content-Based Router", PatternFamily.EnterpriseIntegration,
"docs/patterns/messaging/message-routing.md",
"src/PatternKit.Core/Messaging/Routing/ContentRouter.cs",
"test/PatternKit.Tests/Messaging/Routing/ContentRouterTests.cs",
"docs/generators/messaging.md",
"src/PatternKit.Generators/Messaging/ContentRouterGenerator.cs",
"test/PatternKit.Generators.Tests/ContentRouterGeneratorTests.cs",
null,
"docs/examples/enterprise-messaging-workflows.md",
"src/PatternKit.Examples/Messaging/ContentRouterGeneratorExample.cs",
"test/PatternKit.Examples.Tests/Messaging/ContentRouterGeneratorExampleTests.cs",
["fluent content router", "generated content router", "message routing example"]),

Pattern("Recipient List", PatternFamily.EnterpriseIntegration,
"docs/patterns/messaging/message-routing.md",
"src/PatternKit.Core/Messaging/Routing/RecipientList.cs",
"test/PatternKit.Tests/Messaging/Routing/RecipientListTests.cs",
null,
null,
null,
"https://github.com/JerrettDavis/PatternKit/issues/210",
"docs/examples/enterprise-messaging-workflows.md",
"src/PatternKit.Examples/Messaging/MessageRoutingExample.cs",
"test/PatternKit.Examples.Tests/Messaging/MessageRoutingExampleTests.cs",
["fluent recipient list", "generated recipient list tracked", "fan-out routing example"]),

Pattern("Splitter", PatternFamily.EnterpriseIntegration,
"docs/patterns/messaging/message-routing.md",
"src/PatternKit.Core/Messaging/Routing/Splitter.cs",
"test/PatternKit.Tests/Messaging/Routing/SplitterTests.cs",
null,
null,
null,
"https://github.com/JerrettDavis/PatternKit/issues/211",
"docs/examples/enterprise-messaging-workflows.md",
"src/PatternKit.Examples/Messaging/MessageRoutingExample.cs",
"test/PatternKit.Examples.Tests/Messaging/MessageRoutingExampleTests.cs",
["fluent splitter", "generated splitter tracked", "line-item message example"]),

Pattern("Aggregator", PatternFamily.EnterpriseIntegration,
"docs/patterns/messaging/message-routing.md",
"src/PatternKit.Core/Messaging/Routing/Aggregator.cs",
"test/PatternKit.Tests/Messaging/Routing/AggregatorTests.cs",
null,
null,
null,
"https://github.com/JerrettDavis/PatternKit/issues/211",
"docs/examples/enterprise-messaging-workflows.md",
"src/PatternKit.Examples/Messaging/MessageRoutingExample.cs",
"test/PatternKit.Examples.Tests/Messaging/MessageRoutingExampleTests.cs",
["fluent aggregator", "generated aggregator tracked", "correlated total example"]),

Pattern("Routing Slip", PatternFamily.EnterpriseIntegration,
"docs/patterns/messaging/routing-slip.md",
"src/PatternKit.Core/Messaging/Routing/RoutingSlip.cs",
"test/PatternKit.Tests/Messaging/Routing/RoutingSlipTests.cs",
"docs/generators/messaging.md",
"src/PatternKit.Generators/Messaging/RoutingSlipGenerator.cs",
"test/PatternKit.Generators.Tests/RoutingSlipGeneratorTests.cs",
null,
"docs/examples/enterprise-messaging-workflows.md",
"src/PatternKit.Examples/Messaging/RoutingSlipExample.cs",
"test/PatternKit.Examples.Tests/Messaging/RoutingSlipExampleTests.cs",
["fluent routing slip", "generated routing slip", "fulfillment itinerary example"]),

Pattern("Saga / Process Manager", PatternFamily.EnterpriseIntegration,
"docs/patterns/messaging/saga.md",
"src/PatternKit.Core/Messaging/Sagas/Saga.cs",
"test/PatternKit.Tests/Messaging/Sagas/SagaTests.cs",
"docs/generators/messaging.md",
"src/PatternKit.Generators/Messaging/SagaGenerator.cs",
"test/PatternKit.Generators.Tests/SagaGeneratorTests.cs",
null,
"docs/examples/enterprise-messaging-workflows.md",
"src/PatternKit.Examples/Messaging/SagaExample.cs",
"test/PatternKit.Examples.Tests/Messaging/SagaExampleTests.cs",
["fluent saga", "generated process manager", "order lifecycle example"]),

Pattern("Mailbox", PatternFamily.EnterpriseIntegration,
"docs/patterns/messaging/mailbox.md",
"src/PatternKit.Core/Messaging/Mailboxes/Mailbox.cs",
"test/PatternKit.Tests/Messaging/Mailboxes/MailboxTests.cs",
null,
null,
null,
"https://github.com/JerrettDavis/PatternKit/issues/209",
"docs/examples/enterprise-messaging-workflows.md",
"src/PatternKit.Examples/Messaging/MailboxExample.cs",
"test/PatternKit.Examples.Tests/Messaging/MailboxExampleTests.cs",
["fluent serialized inbox", "generated mailbox tracked", "bounded worker example"]),

Pattern("Idempotent Receiver", PatternFamily.MessagingReliability,
"docs/patterns/messaging/reliability.md",
"src/PatternKit.Core/Messaging/Reliability/IdempotentReceiver.cs",
"test/PatternKit.Tests/Messaging/Reliability/IdempotentReceiverTests.cs",
null,
null,
null,
"https://github.com/JerrettDavis/PatternKit/issues/213",
"docs/examples/enterprise-messaging-workflows.md",
"src/PatternKit.Examples/Messaging/ReliabilityExample.cs",
"test/PatternKit.Examples.Tests/Messaging/ReliabilityExampleTests.cs",
["runtime duplicate suppression", "generated reliability path tracked", "at-least-once example"]),

Pattern("Inbox", PatternFamily.MessagingReliability,
"docs/patterns/messaging/reliability.md",
"src/PatternKit.Core/Messaging/Reliability/InboxProcessor.cs",
"test/PatternKit.Tests/Messaging/Reliability/IdempotentReceiverTests.cs",
null,
null,
null,
"https://github.com/JerrettDavis/PatternKit/issues/213",
"docs/examples/enterprise-messaging-workflows.md",
"src/PatternKit.Examples/Messaging/ReliabilityExample.cs",
"test/PatternKit.Examples.Tests/Messaging/ReliabilityExampleTests.cs",
["runtime inbox boundary", "generated inbox path tracked", "reliable handoff example"]),

Pattern("Outbox", PatternFamily.MessagingReliability,
"docs/patterns/messaging/reliability.md",
"src/PatternKit.Core/Messaging/Reliability/InMemoryOutbox.cs",
"test/PatternKit.Tests/Messaging/Reliability/OutboxTests.cs",
null,
null,
null,
"https://github.com/JerrettDavis/PatternKit/issues/213",
"docs/examples/enterprise-messaging-workflows.md",
"src/PatternKit.Examples/Messaging/ReliabilityExample.cs",
"test/PatternKit.Examples.Tests/Messaging/ReliabilityExampleTests.cs",
["runtime outbox", "generated outbox path tracked", "dispatch handoff example"]),

Pattern("Request-Reply", PatternFamily.EnterpriseIntegration,
"docs/examples/messaging-backplane-facade.md",
"src/PatternKit.Examples/Messaging/BackplaneFacadeDemo.cs",
"test/PatternKit.Examples.Tests/Messaging/BackplaneFacadeDemoTests.cs",
null,
null,
null,
"https://github.com/JerrettDavis/PatternKit/issues/214",
"docs/examples/messaging-backplane-facade.md",
"src/PatternKit.Examples/Messaging/BackplaneFacadeDemo.cs",
"test/PatternKit.Examples.Tests/Messaging/BackplaneFacadeDemoTests.cs",
["typed request/reply client", "generated backplane topology tracked", "hosted backplane example"]),

Pattern("Publish-Subscribe", PatternFamily.EnterpriseIntegration,
"docs/examples/messaging-backplane-facade.md",
"src/PatternKit.Examples/Messaging/BackplaneFacadeDemo.cs",
"test/PatternKit.Examples.Tests/Messaging/BackplaneFacadeDemoTests.cs",
null,
null,
null,
"https://github.com/JerrettDavis/PatternKit/issues/214",
"docs/examples/messaging-backplane-facade.md",
"src/PatternKit.Examples/Messaging/BackplaneFacadeDemo.cs",
"test/PatternKit.Examples.Tests/Messaging/BackplaneFacadeDemoTests.cs",
["typed publish/subscribe", "generated backplane topology tracked", "transport boundary example"]),

Pattern("CQRS", PatternFamily.ApplicationArchitecture,
"docs/generators/dispatcher.md",
"src/PatternKit.Core/Behavioral/Mediator/Mediator.cs",
"test/PatternKit.Tests/Behavioral/Mediator/MediatorTests.cs",
"docs/generators/dispatcher.md",
"src/PatternKit.Generators/Messaging/DispatcherGenerator.cs",
"test/PatternKit.Generators.Tests/DispatcherGeneratorTests.cs",
"https://github.com/JerrettDavis/PatternKit/issues/212",
"docs/generators/dispatcher.md",
"src/PatternKit.Examples/MediatorComprehensiveDemo/ComprehensiveDemo.cs",
"test/PatternKit.Examples.Tests/MediatorDemo/MediatorDemoTests.cs",
["dispatcher command/query separation", "generated dispatcher", "first-class CQRS example tracked"])
];

public IReadOnlyList<PatternCoverageDescriptor> Patterns => Items;
Expand Down
Loading
Loading