> ## Documentation Index
> Fetch the complete documentation index at: https://docs.effectiveai.app/llms.txt
> Use this file to discover all available pages before exploring further.

# Check messages

> Each message that rslc check prints, grouped by topic, with what it means and the usual fix.

`rslc check` prints one message for each problem it finds. A rater passes only when the check
finds zero problems. Each message starts with a stable code, such as `E-DIV-ZERO`.

```text theme={null}
error: E-PROVENANCE rater.rsl:31:5: table `BaseRate` has no citation
  = because: every filed number cites the filing region that states it; a number no filing states says why in `[reason: "…"]`
  = help: cite the region that prints it: `BaseRate [cite: manual:p12] : table dims (…)`
  = applicability: manual
```

* The place is the file, line and column. A message about the whole rater shows `@0-0` in its place.
* `because` gives the reason, and `help` shows a rewrite. Some messages carry both.
* `rslc --json check` returns each message with `code`, `message`, `severity`, `span` and `location`.

[Use the rslc commands](/relativities/rsl/commands) shows the full output of a check.

## Calculations that can fail

These messages protect the promise that an accepted request always gets a premium.
[What rslc checks and guarantees](/relativities/rsl/explanation/checks-and-guarantees) shows the main ones in
full.

| Code | Meaning | Fix |
| - | - | - |
| `E-DIV-ZERO` | A divisor can be zero | Narrow the input, or guard the division with `if` |
| `E-EMPTY-FOLD` | `min`, `max` or `avg` reads a list that can be empty | Require one element with `len(self)`, or guard with `if` |
| `E-KEY-RANGE` | A lookup key can fall outside the table's bands | Narrow the input, clamp the key, or add `otherwise` |
| `E-KEY-HOLE` | A calculated band key can fall between two bands | Round the key to the band steps |
| `E-LOOKUP-GAP` | A lookup can reach a key that lacks a filed row | Narrow the input, use `Key(T)`, or add a cited `otherwise` |
| `E-INTERP-RANGE` | An `interpolate!` key can leave the filed points | Narrow the input, or clamp with `max` and `min` |
| `E-MAP-DOMAIN` | A map read can name a member outside the map | Narrow the key with `if k in Sub` or `match` |
| `E-MATCH` | A `match` misses a possible value | Add the missing arms |
| `E-OPTION-MATCH` | A `match` on an `Option` misses `None` or `Some` | Add the missing arm |
| `E-TOPN-LIMIT` | A `topn` limit can be negative or fractional | Prove the limit is a whole number of 0 or more |
| `E-ROOT` | An even root can read a value below 0 | Clamp the value with `max` |
| `E-POW-EXPONENT` | An exponent is fractional, huge or unsafe | Use a whole exponent, or `pow(x, e, places, mode)` |
| `E-CYCLE` | A calculation needs its own value | Compute the shared part in its own calculation |
| `E-QUADRATIC` | A calculation on each element walks the whole list | Compute the walk once, on the parent record |

## Numbers and rounding

| Code | Meaning | Fix |
| - | - | - |
| `E-COMPUTED-RANGE` | A calculation's precision or range is unproven | Round or clamp the formula, or use a plain `Num` |
| `E-ROUND` | A `round` has the wrong form | Write `round(x, places, mode)` |
| `E-QUANTUM` | One type name has two different precisions | Give each precision its own type name |
| `E-FOLD-KEY` | A `by` key or `round_each` is misplaced | Pair `by x.key` with `round_each` on `sum` or `product` |

## Inputs and rules

| Code | Meaning | Fix |
| - | - | - |
| `E-INPUT-DOMAIN` | A number input lacks a precision or a range | Add `{precision: p}` and `where self in [a, b]` |
| `E-RANGE` | A range has the wrong form | Use literal bounds on the precision, with one finite side |
| `E-REFINEMENT` | A rule has the wrong form | Use one range or set per input |
| `E-REFINE-CANONICAL` | A bound is written as a comparison, such as `self >= 1` | Write `self in [1, _]` |
| `E-REFINE-UPWARD` | A rule reads a calculation or a record above it | Move the rule up to the record that holds the data |
| `E-ANNOTATION` | A `code`, `message` or `cite` is misplaced or malformed | Put them after a `where` rule; write the code in capitals |
| `E-DEFAULT` | An input has a default value | Use `Option(T)` and `match` |
| `E-DERIVABLE-INPUT` | An input always equals a formula of other inputs | Calculate it |
| `E-ENUM-NARROW` | A narrowed enum names unknown members | Name members of the full enum |
| `E-ENUM-BACKING` | An enum's CSV file is missing or malformed | Fix the file in `enums/` |
| `E-ENUM-NUMERIC` | An ordered enum lists plain numbers | Use a number input or a value type |
| `E-CODE-PATTERN` | A `Code` pattern is invalid, or a value fails it | Fix the pattern or the value |

## Tables

| Code | Meaning | Fix |
| - | - | - |
| `E-TABLE-COL` | The CSV headers or cells differ from the declaration | Match the CSV to the declaration |
| `E-TABLE-WILDCARD` | A key cell holds `_` | List each key, or use `otherwise` |
| `E-DIMENSION` | A band, value or code type is malformed or misused | Fix the declaration |
| `E-BAND-SENTINEL` | A band ends at a stand-in number such as `999999` | Use an open band, such as `100..` |
| `E-BAND-DEGENERATE` | A band is empty, or a band edge repeats | Remove the repeated edge |
| `E-DECIMAL-SCALE` | A bound or cell has more decimal places than declared | Write it at the declared places |
| `E-LOOKUP-OVERLAP` | Two CSV rows match one key | Fix the table rows |
| `E-LOOKUP-SYNTAX` | A lookup lacks its `!` | Write `lookup!` or `interpolate!` |
| `E-OTHERWISE-DEAD` | The rows cover every key, so `otherwise` is unused | Delete the `otherwise` row |
| `E-INTERP-KEY` | An `interpolate!` reads an unsuitable table | End the keys with a value type; drop `otherwise` |
| `E-KEY-TYPE` | A `Key(T)` names an unsuitable table, or types a calculation | Use `Key(T)` on inputs, for one code or enum key |
| `E-MAP-DATA-SIZED` | A map or fold runs over an enum from a CSV file | Use a table keyed by that enum |

## Names, types and records

| Code | Meaning | Fix |
| - | - | - |
| `E-UNRESOLVED` | A name is unknown, or the file fails to parse | Fix the name or the syntax at that place |
| `E-TYPE` | Two types disagree | Make the types agree |
| `E-PATTERN` | A `match` arm has an illegal pattern | List each arm |
| `E-DATE` | A date is invalid, such as `2026-02-30` | Write a real date as `YYYY-MM-DD` |
| `E-RECORD-ROOT` | The rater has more or fewer than one top record | Put every record under one top record |
| `E-RECORD-POSITION` | One record type sits in two places | Declare a record type for each place |
| `E-RECORD-RECURSIVE` | A record type contains itself | Break the loop |
| `E-ANCESTOR-READ` | `A.x` names the record that reads it, or a record outside its parents | Read `self.x`, or read through a `Ref` |
| `E-REF-SCOPE` | A `Ref(R)` sits outside the record that owns the list of `R` | Key the list, under a shared parent record |
| `E-UNION` | A choice between record kinds is malformed | Put inputs and rules on each kind's own record |
| `E-UNION-USE` | A choice between record kinds is read outside `match` | Read it with `match` |
| `E-SELECT-TIE` | A pick from a list lacks a key or a tie rule | Key the list; write `then [cite: …]: priority` |
| `E-DATA-AS-CODE` | Large data sits in the source, such as a huge enum | Move the data to a CSV file |
| `E-INTERNAL` | `rslc` hit an internal error | Report it with the source |

## The rater's header and outcome

| Code | Meaning | Fix |
| - | - | - |
| `E-RATER-METADATA` | `spec` lacks `carrier`, `state`, `product` or `effective_date` | Add the field |
| `E-RATER-METADATA-INVALID` | `spec` has a `name` field | Delete `name` |
| `E-RSL-VERSION-MISSING` | `spec` lacks the language version line | Add the line, as the tutorial shows |
| `E-RSL-VERSION-INVALID` | The language version line is malformed or repeated | Write the line once, as a quoted string |
| `E-RSL-VERSION-NEWER` | The language version line is newer than this `rslc` | Update `rslc` |
| `E-RATING-OUTCOME` | `RatingOutcomes` is missing or empty, or lacks a premium | Name at least one `Premium` calculation |
| `E-OUTCOME-ROUND` | A returned number skips `round`, or its round lacks a citation | Round it, and cite the rounding calculation |

## Citations

| Code | Meaning | Fix |
| - | - | - |
| `E-PROVENANCE` | A table, constant or rounding calculation lacks a citation | Add `[cite: source:place]` or `[reason: "…"]` |
| `E-SOURCE-SCHEMA` | A `Sources` entry has the wrong fields | Write `artifact: artifact("…")` and `kind` |
| `E-CITATION` | A citation names an unknown source, or has the wrong form | Use a declared source and the form for its kind |
| `E-PROVENANCE-RUNTIME` | A source or citation is used as a value in a calculation | Move it into a citation |
| `E-PROVENANCE-COMMENT` | A comment starts with `source:`, `sources:` or `readiness:` | Move the evidence into a citation |

## Tidy raters

These messages keep a rater short and close to the filing.

| Code | Meaning | Fix |
| - | - | - |
| `E-ORPHAN-COMPUTED` | A calculation feeds zero outcomes | Delete it, or use it where the filing does |
| `E-HOIST` | A calculation on a child record reads only its parent's data | Move it to the parent |
| `E-TABLE-UNUSED` | A table or column is read by zero lookups | Delete it, or read it |
| `E-TABLE-UNUSED-DIM` | A key column leaves every output the same | Delete the key column |
| `E-TABLE-SINGLE-MEMBER-KEY` | A key column ranges over a one-member enum | Delete the key column |
| `E-TABLE-DUPLICATE` | An output column repeats another table's column | Read the other table |
| `E-TABLE-CONSTANT-COLUMN` | An output column holds one value on every row | Use a cited constant |
| `E-TABLE-FORMULA` | An output column is a straight line over 32 or more keys | Write the formula, with its citation |
| `E-IF-AS-TABLE` | A chain of 8 or more `if` arms sorts one number into bands | Use a filed table with bands |

## Request generation

| Code | Meaning | Fix |
| - | - | - |
| `E-INPUT-GENERATE` | `rslc inputs sample` fails to build requests that pass the rules | Check that the rules accept at least one request |

## Older raters and placeholders

These messages appear when a rater uses a form the language has replaced, or holds a placeholder.
Each message names the replacement.

| Code | Meaning | Usual fix |
| - | - | - |
| Any code that ends in `-REMOVED` | The rater uses a replaced form, such as `reject`, `requires`, `checked` or `range:` | Write the form that the message names |
| `E-RSL-VERSION-OLD`, `E-RSL-SYNTAX` | The rater declares an older language version, or uses its spelling | Run `rslc fmt --migrate` on the rater folder |
| `E-AXIS-INDEX`, `E-AXIS-SUBSET`, `E-ENTITY-REL`, `E-REJECT`, `E-REQUIRES`, `E-ROUND-INC`, `E-LOOKUP-TOTAL`, `E-BAND-COVERAGE`, `E-TABLE-MODE`, `E-MERGE-FIDELITY` | A form from an older rater that the current form replaces | Run `rslc fmt --migrate`, then fix what it reports |
| `E-HOLE` | A value depends on an `nl` placeholder that holds plain text in place of a formula | Write the formula |
| `E-INVARIANT` | A domain rule fails, shown with its rule ID | Fix the value the message names |

## Related

* [What rslc checks and guarantees](/relativities/rsl/explanation/checks-and-guarantees) explains the promises behind these messages.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.