ARCCHR0005: Chronicle is used but not wired up
Running Arc without Chronicle is a valid, supported setup — AddCratisArc on its own backs commands and queries with MongoDB or EF Core and never needs an event store. So a missing WithChronicle() is only a problem when the project actually uses Chronicle. This rule fires when a project calls AddCratisArc (without WithChronicle() or AddCratis()) yet does one of the following in the same project:
- declares an aggregate root;
- declares a reactor or a reducer;
- declares a projection — fluent (
IProjectionFor<>) or model-bound (a read model with[FromEvent<T>],[SetFrom<T>],[SetValue<T>], or any otherCratis.Chronicle.Projectionsattribute); - declares an
[EventType]event; - injects a Chronicle service such as
IEventLogorIEventStore(appending events, returning events from a command handler, reading the event store).
Detection is by namespace: implementing any interface, or applying any attribute (on the type or its properties), from the Cratis.Chronicle namespace counts as Chronicle usage — so new Chronicle features are covered automatically.
In any of those cases the event store is required, so a command, query, reactor, or reducer that touches Chronicle fails to resolve at runtime.
The rule only reports when the setup call and the Chronicle usage live in the same project. When Arc is set up in a separate host project, it stays silent — and when the project genuinely doesn’t use Chronicle, it never fires.
Severity
Section titled “Severity”Warning
Example
Section titled “Example”Violation
Section titled “Violation”using Cratis.Chronicle.Events;
[EventType]public record AuthorRegistered(string Name);
var builder = WebApplication.CreateBuilder(args);
// ARCCHR0005: Chronicle artifacts exist, but Chronicle is never wired upbuilder.AddCratisArc();
var app = builder.Build();app.UseCratisArc();app.Run();Add the event store with WithChronicle() on the Arc builder:
builder.AddCratisArc(configureBuilder: arc => arc.WithChronicle());
var app = builder.Build();app.UseCratisArc();app.UseCratisChronicle();app.Run();Or use the all-in-one AddCratis(), which wires Arc, the Chronicle client, and identity together:
builder.AddCratis();
var app = builder.Build();app.UseCratis();app.Run();Why This Rule Exists
Section titled “Why This Rule Exists”AddCratisArc deliberately supports running Arc without an event store, backed by MongoDB or EF Core. That flexibility means the framework cannot assume Chronicle is wanted — so forgetting WithChronicle() is a silent mistake that only surfaces the first time an event is appended or read. This rule catches it at compile time, before the application runs.
Related Rules
Section titled “Related Rules”- None