Program tier
Checks that need only the Python standard library. They run on every push. A finding is an error when it is certain, a warning when it comes from a heuristic, and a judgment question when no program can decide.
| Check | What it verifies | Guarantee |
|---|---|---|
| bibliography_keys.py | Bibliography keys: a key names one work, and a work carries one key, in the bibliography and across its family | Exact for a key held twice, in one file or across the family, when the rows' links name their works; one work at two addresses reads as two, so a clash is cleared by giving both rows one link. Heuristic for one work under two keys: a work cited by a DOI in one row and by its preprint in another is seen as one only when a row names both. |
| changelog_pin.py | Changelog pin: the newest pin line of an extension's changelog names the release its workflows check out | Exact for a pin line written as the form gives it. |
| citations.py | Citations: every work cited in the text has one entry in the bibliography, and every entry is cited | Heuristic: a capitalised word before a year can be a false citation ("Colon Classification 1933"); config lists words that never start one. |
| co_change.py | Co-change: files that keep changing together should sit together | Coupling in history is evidence, not proof, so every finding is judgment. |
| cross_file_terms.py | Short reference distance across files: a term defined in one file is linked where another uses it | Heuristic. |
| decision_records.py | Decision records: every record in decisions/ follows the four rules of the decision-record shape | Exact, except rule 3. |
| defined_before_use.py | Define before use: a term is not used in a file before the line that defines it | Heuristic: bold is also used for emphasis, and a term can be defined in another file. |
| duplication.py | Duplication: the same run of words held in two files means one fact kept in two places | Exact for the copy; whether the copy is a fact or a quotation is judgment. |
| judgment_quotes.py | Judgment quotes: every answer in the answers file quotes the file it answers for, and every quote is really there | Exact for the presence of each quote; whether the quote supports the answer is judgment. |
| links.py | Links: every relative link in a markdown file resolves to a file or folder that exists | Exact for file links. |
| logical_lines.py | File size: a trigger on logical lines and a ceiling on physical lines, each asking a question | The sentence count is a heuristic (abbreviations split badly). |
| long_sentences.py | Long sentences: a sentence past max_words words is the cheap sign of packed information |
Heuristic. |
| name_matches_title.py | Names predict content: the words of a file's name appear in its title or opening | Heuristic. |
| outline_depth.py | Outline depth: a document's headings stay within three levels | The count is exact; the limit of three is a convention, so a deeper heading warns. |
| overview_first.py | Overview first: a long document opens with what it is and how it is organised, not with a heading | Heuristic (the opening may be there and still not be an overview). |
| paragraph_length.py | Signal the structure: no wall of prose, and no long run without a heading | Heuristic. |
| portable_paths.py | Portable paths: every path must check out on filesystems other than the one it was made on | Exact. |
| principle_coverage.py | Principle coverage: every principle names at least one check that exists, so CI tests every rule | Exact. |
| provisional_tags.py | PROVISIONAL tags: a value marked as a guess is measured, or kept knowingly, before it ages | Exact for the date. |
| readable_measure.py | Readable measure: the site's stylesheet sets body text inside the measured ranges | Exact for the declared values; the rendered line still depends on the face. |
| references.py | References: every DOI, arXiv id, GitHub repository and web link cited resolves | Exact offline. Online depends on remote servers (a timeout is reported as a warning, never hidden). |
| release_version.py | Release version: the citation file names the release the changelog ends on, with its date | Exact for a heading written as Keep a Changelog writes it. |
| shape_conformance.py | Shape conformance: a document declared to be of a shape holds the parts that shape requires | Exact. |
| shape_example.py | Shape example: a shape links at least one filled example of itself, and the example links back to the shape | What a run with no warning guarantees: every declared shape points to at least one document that declares it follows that shape. What it does not: that the example is good, complete, or written with real content rather than placeholders (judgment). |
| standard_card.py | The repository's generated indexes: the principle table in standard.md, llms.txt, and the check tables | Exact. |
| standard_links.py | Standard links: every link from the text into the standard names the commit the workflows pin | Exact for links written [text](target). |
| standard_pin.py | Standard pin: every workflow checks out the standard at one commit, so one bump moves the checks and the site together | Exact for a checkout step written on separate lines, as the template writes it; a step in flow style (with: {repository: ...}) is not read. |
| sufficient_contrast.py | Sufficient contrast: every text colour reaches a WCAG ratio of 4.5:1 on the background it sits on | Exact for colours declared in the same rule; heuristic for inherited backgrounds. A colour is read as hex, or as white or black; any other form is skipped. The rendered page is not measured. |
| tree_shape.py | Tree shape: folders stay browsable, and dependencies between folders never form a cycle | Exact for breadth, depth and static imports; dynamic imports are invisible. |
| type_buckets.py | Type buckets: no folder is named for a kind of file instead of what its files serve | Exact. |