---
title: 'CHR0018: Constraint Define() must not contain imperative code'
---

## Rule Description

The `Define()` method of a class implementing `IConstraint` must not contain imperative statements such as `if`/`else`, loops, variable declarations, or assignments. Constraint definitions only declare rules; they do not execute.

## Severity

Error

## Example

### Violation

```csharp
using Cratis.Chronicle.Events.Constraints;

public class UniqueEmailConstraint : IConstraint
{
    public void Define(IConstraintBuilder builder)
    {
        if (someCondition)
        {
            builder.Unique<UserRegistered>();
        }
    }
}
```

### Fix

```csharp
using Cratis.Chronicle.Events.Constraints;

public class UniqueEmailConstraint : IConstraint
{
    public void Define(IConstraintBuilder builder) =>
        builder.Unique<UserRegistered>();
}
```

## Why This Rule Exists

The `Define()` method is called once at registration time to declare constraint rules. The resulting definition is serialized and sent to the server. Imperative code such as conditionals or loops creates non-determinism: different runs could produce different constraint definitions, breaking consistency.

## Related Rules

- [CHR0017](/chronicle/code-analysis/chr0017/): Constraint must not have side effects
- [CHR0016](/chronicle/code-analysis/chr0016/): Projection Define() must not contain imperative code
