# Rule Numbering

## IO Rules (metadata-only, not filterable)

| Range | Group | Rules |
|-------|-------|-------|
| IO00xx | File I/O validation | IO0001 read failed, IO0002 not object, IO0010 empty file |

## ND Rules

| Range | Group | Rules |
|-------|-------|-------|
| ND01xx | Filter operations | ND0101 invalid ops, ND0102 common mistakes |
| ND02xx | Node structure/keys | ND0201 unknown keys, ND0202 key value types, ND0203 zero-property params |
| ND03xx | Parameter validation | ND0301 deep param keys, ND0302 param value types |
| ND04xx | Expression syntax | ND0401 broken brackets, ND0402 suspect prefix |
| ND05xx | Credential validation | ND0501 missing creds, ND0502 empty ID, ND0503 placeholder ID, ND0504 leaking cred |
| ND06xx | Connection validation | ND0601 input not connected, ND0602 dangling connection ref, ND0603 invalid connection target |
| ND07xx | Error handling | ND0701 no errorWorkflow, ND0702 external node without error handling |
| ND08xx | Naming & documentation | ND0801 default node name, ND0802 complex node missing notes, ND0803 no workflow description |

New rules: pick next number in the appropriate group.

If a new rule does not fit into one of the existing groups, put it into the ND00xx range.

## Strict Designation

- ND01xx–ND04xx: `strict=True` (default in `register()`)
- ND05xx–ND08xx: `strict=False` (must be set explicitly in `register()`)
- IO rules: `strict=None` (not applicable, do not participate in strict filtering)

