## RULES


The numbered rules a recipe must follow: RULES\[7\] is rule 7, a Rule.


`RULES: dict[int, Rule] = _Rules(`\
`    (rule.number, rule)`\
`    for rule in (`\
`        Rule(`\
`            1,`\
`            `<span class="st">`"recipe.toml is complete",`\
`            ``"recipe.toml exists and can be read. It has a one-sentence description that does not start with TODO, and inputs and outputs, each a list of at least one path with no path listed twice."``,`\
`        ),`\
`        Rule(`\
`            2,`\
`            ``"Steps are numbered and described"``,`\
`            ``"The recipe has at least one step file named NN_name.py. Each starts with a # comment saying what it does, not starting with TODO, and no two steps share a number."``,`\
`        ),`\
`        Rule(`\
`            3,`\
`            ``"Steps are Python files"``,`\
`            ``"No file in the recipe folder is named like a step in another language (.R, .Rmd, .ipynb, .qmd, .jl, .do)."``,`\
`        ),`\
`        Rule(`\
`            4,`\
`            ``"Inputs exist and are allowed"``,`\
`            ``"Each input is a file under raw/ or directly inside useful-views/, written relative to the project root with forward slashes and no wildcards, with names that can exist on Windows, and exists with exactly that letter case. A raw input is not empty and can be read."``,`\
`        ),`\
`        Rule(`\
`            5,`\
`            ``"Input views come from a recipe that has run"``,`\
`            ``"An input inside useful-views/ is an output of another recipe, and that recipe has run successfully."``,`\
`        ),`\
`        Rule(`\
`            6,`\
`            ``"No cycles"``,`\
`            ``"The recipe does not read its own view, directly or through a chain of other recipes."``,`\
`        ),`\
`        Rule(`\
`            7,`\
`            ``"Outputs are allowed and unique"``,`\
`            ``"Each output is a .parquet file directly inside useful-views/, with a name that can exist on Windows, is not useful-views/README.md, and is not made by another recipe."``,`\
`        ),`\
`        Rule(`\
`            8,`\
`            ``"Resource names are unique"``,`\
`            ``"No two recorded files share a resource name: a view's file name, or a raw file's path below raw/, without the extension, lowercased, with '/' and other characters outside a-z, 0-9, '.', '_' and '-' turned into '-' (accented letters lose their accents; letters of other scripts become their Unicode code point)."``,`\
`        ),`\
`    )`\
`)`</span>
