Every SheetMill diagnostic code, what it means, how to fix it, and how to check sheets in CI.
Every message has the form path:line:column: CODE: message on stderr. Errors
stop the command with exit status 1 (invalid source) or 2 (usage or IO);
warnings end with (warning) and do not change the exit status unless you use --strict with smill check or smill build navi.
category or description is not a string, or tags is not an array of non-empty strings.
VAL003
cheatsheet is not a mapping, cheatsheet.schema is not 1, cheatsheet.tool is empty, or navigation is not a mapping with only a non-blank string group and an integer order from 0 to 1000000.
VAL004
cheatsheet.updated is not a real YYYY-MM-DD calendar date (years 1970 to 9999), or cheatsheet.tool_version is not one line of 1 to 64 characters without surrounding whitespace, control or invisible format characters, or either is not a quoted YAML string (an unquoted 3.81 is a number).
Unsupported, malformed or misplaced token, for example {.unknown}, {.col-span-0} or {.cols-2} on a card. See the attribute table.
ATTR002
The same setting is given twice, for example two .col-span- values.
ATTR003
An attribute group outside a root ## or ### heading, such as a {.marker-none} line after a list. Remove it, or escape the brace (\{) to show it as text.
The renderer met content it cannot represent, or the project could not be assembled. Report it with the input.
REN002
A link uses an unsafe or unsupported URL. Use relative, http, https or mailto links.
REN003
Two inputs produce the same page route or basename, a route is reserved (assets, brand, tags; also studio in smill serve), --theme or --palette names an unknown value, no sheet is selected, or a base path, site URL, header link or GitHub base URL is invalid.
Raw HTML is shown as inert text. Use Markdown instead.
REN102
An image is kept as a link and never fetched.
REN103
An internal link names no selected sheet, or its fragment matches no section or card ID. Fix the link, add an explicit {#id}, or pass --source-base-url for links to repository files.
smill build navi --strict found warnings and wrote nothing. Fix them or drop --strict.
NAV001
Unsupported --shell profile. Use bash, zsh, fish or nu.
NAV006
Invalid or unknown cheatsheet.navi metadata, a reference to a missing/unmarked card or generated ID, a wrong shell, conflicting complete old/new parameter declarations, or an unusable tag.
NAV008
Two exported entries share a pinned navi identity hash; navi would silently drop one.
NAV101–NAV106
Warnings: a marked card was skipped (shape, command text, placeholder, declarations), the license is unstated, or a sheet exported nothing. NAV007 is retired (parameters are card-local); NAV107 is retired (frontmatter is preserved in the .navi.json companion). See navi export.
Reference import adds IMP001–IMP003 (errors) and IMP101–IMP112
(warnings about archived or mapped legacy syntax). See
Reference import for the full list.
A minimal job that builds smill from a pinned SheetMill revision and checks the
sheets in your repository. Replace the revision with the commit you trust.
A .command card lacks an explicit ID, or shared metadata refers to a missing, unmarked or automatically identified card.
Source diagnostics point to the key/card; direct IR without key positions falls
back to document start. Legacy-only selection/metadata keeps existing NAV behavior.
Conflicting old/new complete declarations use NAV006; NAV008 collision behavior
and pinned hashes are unchanged. See command cards and migration.
Studio preview diagnostics
Code
Meaning
STU001
smill serve diagnoses selected input that is unavailable, unstable or oversized in the UI; see the CLI reference.