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.
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-0in its place. becausegives the reason, andhelpshows a rewrite. Some messages carry both.rslc --json checkreturns each message withcode,message,severity,spanandlocation.
Calculations that can fail
These messages protect the promise that an accepted request always gets a premium. What rslc 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 explains the promises behind these messages.