> For the complete documentation index, see [llms.txt](https://ascribed-dev.com/docs/llms.txt). This documentation describes Ascribe 0.4.4. Anything marked in main, not yet released isn't in that release yet.

# Diagnostics: the content model

> Reference · The diagnostics about ascribe.toml's file, project, sources, content types, and names, and how to fix each.

The problems Ascribe reports in `ascribe.toml`. One that's an error stops everything else: every other check depends on the [content model](https://ascribed-dev.com/docs/glossary.md#content-model). This page has the file through its names; `[releases]`, phrases, widgets, the consumer, builds, the editor, `[permalinks]`, `[crawlers]`, `[listing]`, and `[checks]` are on [Diagnostics: the content model's builds and site](https://ascribed-dev.com/docs/checks/diagnostics/content-model-builds.md). Part of the [diagnostics reference](https://ascribed-dev.com/docs/checks/diagnostics.md), which says what an entry's severity, level, and next step mean, and has an index of every diagnostic.

## The file

### ASC060 `model-toml-syntax`

[Error](https://ascribed-dev.com/docs/checks/diagnostics.md#severity) · [file level](https://ascribed-dev.com/docs/checks/diagnostics.md#file-level-and-page-level) · next step: [write](https://ascribed-dev.com/docs/checks/diagnostics.md#what-to-do-next) · [SPEC §7.1](https://github.com/ascribed-dev/ascribe/blob/main/SPEC.md#71-role)

**When:** `ascribe.toml` isn't valid TOML.

**Message:** ascribe.toml isn't valid TOML: {detail}

**Fix:** Fix the TOML syntax at the place the message names.

**Read more:** [The file](https://ascribed-dev.com/docs/content-model.md#11-the-file) in the `ascribe.toml` reference.

### ASC061 `model-unknown-key`

[Error](https://ascribed-dev.com/docs/checks/diagnostics.md#severity) · [file level](https://ascribed-dev.com/docs/checks/diagnostics.md#file-level-and-page-level) · next step: [choose](https://ascribed-dev.com/docs/checks/diagnostics.md#what-to-do-next) · [SPEC §7.1](https://github.com/ascribed-dev/ascribe/blob/main/SPEC.md#71-role)

**When:** A table of `ascribe.toml` has a key this version of Ascribe doesn't know.

**Message:** unknown key `{key}` in `[{table}]`; this is ascribe {version}, and the project may need a newer one

**Fix:** Fix the key's spelling, or remove it. A key added in a later version of Ascribe is unknown to an older one: when the project was written for a newer Ascribe, install it. A content type has no `files` or `default`: each page names its type in its frontmatter, as `type: how-to`, so remove them and add `type:` to the type's pages. The glossary has no `terms`: write each term as a heading marked `@term` on a glossary page, with its definition as the paragraph under it, and list the page in `[glossary] pages`. `[[intended]]` has no `term`: acknowledge a term's problem with `@intended` under its heading. `[consumer]` has no `headers`: write `host = "netlify"`, which writes Netlify's `_headers` as `headers` did, and `_redirects` beside it. `ascribe.toml` has no `[permalinks]`: `ascribe addresses init` moves its retired [permalinks](https://ascribed-dev.com/docs/glossary.md#permalink) and aliases into `ascribe.addresses`, as `go:<name>` keys of `[retired]` and `[moved]`.

**Read more:** [The file](https://ascribed-dev.com/docs/content-model.md#11-the-file) in the `ascribe.toml` reference.

### ASC062 `model-missing-key`

[Error](https://ascribed-dev.com/docs/checks/diagnostics.md#severity) · [file level](https://ascribed-dev.com/docs/checks/diagnostics.md#file-level-and-page-level) · next step: [write](https://ascribed-dev.com/docs/checks/diagnostics.md#what-to-do-next) · [SPEC §7.1](https://github.com/ascribed-dev/ascribe/blob/main/SPEC.md#71-role)

**When:** A table of `ascribe.toml` is missing a key it requires.

**Message:** `[{table}]` is missing the required key `{key}`

**Fix:** Add the key.

**Read more:** [The file](https://ascribed-dev.com/docs/content-model.md#11-the-file) in the `ascribe.toml` reference.

### ASC063 `model-wrong-type`

[Error](https://ascribed-dev.com/docs/checks/diagnostics.md#severity) · [file level](https://ascribed-dev.com/docs/checks/diagnostics.md#file-level-and-page-level) · next step: [write](https://ascribed-dev.com/docs/checks/diagnostics.md#what-to-do-next) · [SPEC §7.1](https://github.com/ascribed-dev/ascribe/blob/main/SPEC.md#71-role)

**When:** A key's value is of the wrong type, such as a number where a string is required.

**Message:** `{key}` must be {expected}, but it's {found}

**Fix:** Give the key a value of the expected type. Strings are always quoted in TOML.

**Read more:** [The file](https://ascribed-dev.com/docs/content-model.md#11-the-file) in the `ascribe.toml` reference.

### ASC064 `model-invalid-value`

[Error](https://ascribed-dev.com/docs/checks/diagnostics.md#severity) · [file level](https://ascribed-dev.com/docs/checks/diagnostics.md#file-level-and-page-level) · next step: [choose](https://ascribed-dev.com/docs/checks/diagnostics.md#what-to-do-next) · [SPEC §7.1](https://github.com/ascribed-dev/ascribe/blob/main/SPEC.md#71-role)

**When:** A key's value isn't one of the values the key allows.

**Message:** `{key}` can't be "{value}"; use one of: {values}

**Fix:** Use one of the values the message lists.

**Read more:** [The file](https://ascribed-dev.com/docs/content-model.md#11-the-file) in the `ascribe.toml` reference.

### ASC065 `model-spec-unsupported`

[Error](https://ascribed-dev.com/docs/checks/diagnostics.md#severity) · [file level](https://ascribed-dev.com/docs/checks/diagnostics.md#file-level-and-page-level) · next step: [choose](https://ascribed-dev.com/docs/checks/diagnostics.md#what-to-do-next) · [SPEC §11](https://github.com/ascribed-dev/ascribe/blob/main/SPEC.md#11-versioning)

**When:** `spec` names a specification version this version of Ascribe doesn't implement.

**Message:** ascribe.toml targets spec version "{spec}", but this processor implements {supported}

**Fix:** Set `spec = "0.1"`, the specification version this release implements, or update Ascribe.

**Read more:** [Top level: `spec`](https://ascribed-dev.com/docs/content-model.md#2-top-level-spec) in the `ascribe.toml` reference.

### ASC066 `model-invalid-name`

[Error](https://ascribed-dev.com/docs/checks/diagnostics.md#severity) · [file level](https://ascribed-dev.com/docs/checks/diagnostics.md#file-level-and-page-level) · next step: [write](https://ascribed-dev.com/docs/checks/diagnostics.md#what-to-do-next) · [SPEC §7.2](https://github.com/ascribed-dev/ascribe/blob/main/SPEC.md#72-declarations)

**When:** A name the content model declares, such as a [dimension](https://ascribed-dev.com/docs/glossary.md#dimension), a value, or a content type, breaks the rules for that kind of name.

**Message:** `{name}` isn't a valid {role} name: {rule}

**Fix:** Rename it following the rule the message gives.

**Read more:** [Names](https://ascribed-dev.com/docs/content-model.md#12-names) in the `ascribe.toml` reference.

### ASC067 `model-empty-text`

[Error](https://ascribed-dev.com/docs/checks/diagnostics.md#severity) · [file level](https://ascribed-dev.com/docs/checks/diagnostics.md#file-level-and-page-level) · next step: [write](https://ascribed-dev.com/docs/checks/diagnostics.md#what-to-do-next) · [SPEC §7.2](https://github.com/ascribed-dev/ascribe/blob/main/SPEC.md#72-declarations)

**When:** A key that holds text is empty.

**Message:** `{key}` can't be empty

**Fix:** Give the key a value, or remove it.

**Read more:** [The file](https://ascribed-dev.com/docs/content-model.md#11-the-file) in the `ascribe.toml` reference.

### ASC246 `model-from-file`

[Error](https://ascribed-dev.com/docs/checks/diagnostics.md#severity) · [file level](https://ascribed-dev.com/docs/checks/diagnostics.md#file-level-and-page-level) · next step: [write](https://ascribed-dev.com/docs/checks/diagnostics.md#what-to-do-next) · [SPEC §7.9](https://github.com/ascribed-dev/ascribe/blob/main/SPEC.md#79-taking-from-another-project)

**When:** The file `[from]` takes from doesn't exist, can't be read, or is outside the project's repository or the folder that was opened.

**Message:** `{path}`, the file `[from]` takes from, doesn't exist

**Fix:** Fix the path after `from`, which is relative to the folder ascribe.toml is in, so it names the other project's `ascribe.toml`, inside the project's repository. With no repository, the editor and `ascribe mcp` read the file only inside the folder they were opened on: open the folder that contains it.

**Read more:** [Taking from another project](https://ascribed-dev.com/docs/content-model.md#21-taking-from-another-project) in the `ascribe.toml` reference.

### ASC247 `model-from-take`

[Error](https://ascribed-dev.com/docs/checks/diagnostics.md#severity) · [file level](https://ascribed-dev.com/docs/checks/diagnostics.md#file-level-and-page-level) · next step: [write](https://ascribed-dev.com/docs/checks/diagnostics.md#what-to-do-next) · [SPEC §7.9](https://github.com/ascribed-dev/ascribe/blob/main/SPEC.md#79-taking-from-another-project)

**When:** `take` names a key the other file doesn't have, one of this project's own, one taken twice, or something that isn't a dotted path of keys.

**Message:** `{file}` has no `{key}` to take

**Fix:** Name a table or a key the other file has, as a dotted path of keys: `releases` takes the whole table, `consumer.site` one key. Take each once, and not a table and a key in it. `spec`, `[project]`, and `[from]` are each project's own, so write them in this file.

**Read more:** [Taking from another project](https://ascribed-dev.com/docs/content-model.md#21-taking-from-another-project) in the `ascribe.toml` reference.

### ASC248 `model-from-written`

[Error](https://ascribed-dev.com/docs/checks/diagnostics.md#severity) · [file level](https://ascribed-dev.com/docs/checks/diagnostics.md#file-level-and-page-level) · next step: [write](https://ascribed-dev.com/docs/checks/diagnostics.md#what-to-do-next) · [SPEC §7.9](https://github.com/ascribed-dev/ascribe/blob/main/SPEC.md#79-taking-from-another-project)

**When:** A key is taken with `[from]` and written in `ascribe.toml` too.

**Message:** `{key}` is taken from `{file}` and written here too; a key has one home

**Fix:** Delete the key here, to use the other file's, or remove it from `take`, to keep this one. A table that's taken can't have a key of its own here: take the keys it shares instead, one by one.

**Read more:** [Taking from another project](https://ascribed-dev.com/docs/content-model.md#21-taking-from-another-project) in the `ascribe.toml` reference.

## `[project]`

### ASC068 `model-path-absolute`

[Error](https://ascribed-dev.com/docs/checks/diagnostics.md#severity) · [file level](https://ascribed-dev.com/docs/checks/diagnostics.md#file-level-and-page-level) · next step: [write](https://ascribed-dev.com/docs/checks/diagnostics.md#what-to-do-next) · [SPEC §2.2](https://github.com/ascribed-dev/ascribe/blob/main/SPEC.md#22-pages-and-fragments)

**When:** A path in `ascribe.toml` is absolute, where it must be relative to `ascribe.toml`.

**Message:** `{key}` must be a path relative to ascribe.toml, not an absolute path

**Fix:** Write the path relative to the directory of `ascribe.toml`.

**Read more:** [Paths and patterns](https://ascribed-dev.com/docs/content-model.md#13-paths-and-patterns) in the `ascribe.toml` reference.

### ASC069 `model-content-root-missing`

[Error](https://ascribed-dev.com/docs/checks/diagnostics.md#severity) · [file level](https://ascribed-dev.com/docs/checks/diagnostics.md#file-level-and-page-level) · next step: [write](https://ascribed-dev.com/docs/checks/diagnostics.md#what-to-do-next) · [SPEC §2.2](https://github.com/ascribed-dev/ascribe/blob/main/SPEC.md#22-pages-and-fragments)

**When:** The content root doesn't exist, or isn't a directory.

**Message:** content root `{path}` doesn't exist

**Fix:** Create the directory, or correct `[project] content-root`.

**Read more:** [`[project]`](https://ascribed-dev.com/docs/content-model.md#3-project) in the `ascribe.toml` reference.

### ASC070 `model-output-overlaps-content`

[Error](https://ascribed-dev.com/docs/checks/diagnostics.md#severity) · [file level](https://ascribed-dev.com/docs/checks/diagnostics.md#file-level-and-page-level) · next step: [write](https://ascribed-dev.com/docs/checks/diagnostics.md#what-to-do-next) · [SPEC §9.4](https://github.com/ascribed-dev/ascribe/blob/main/SPEC.md#94-outputs)

**When:** The output directory and the content root are the same, or one is inside the other.

**Message:** output directory `{output}` is inside content root `{content}`; move it outside, or builds will read their own output as source

**Fix:** Keep the output directory and the content root apart: neither inside the other, and not the same. The default output directory, `.ascribe/build`, is outside the default content root, `docs`.

**Read more:** [`[project]`](https://ascribed-dev.com/docs/content-model.md#3-project) in the `ascribe.toml` reference.

## `[sources]`

### ASC133 `model-source-path-missing`

[Error](https://ascribed-dev.com/docs/checks/diagnostics.md#severity) · [file level](https://ascribed-dev.com/docs/checks/diagnostics.md#file-level-and-page-level) · next step: [write](https://ascribed-dev.com/docs/checks/diagnostics.md#what-to-do-next) · [SPEC §7.3](https://github.com/ascribed-dev/ascribe/blob/main/SPEC.md#73-sources)

**When:** A source's `path` doesn't exist, or isn't a folder.

**Message:** the folder of source `{source}`, `{path}`, doesn't exist

**Fix:** Fix `path`, which is relative to the folder ascribe.toml is in, or create the folder.

**Read more:** [`[sources.<name>]`](https://ascribed-dev.com/docs/content-model/sources.md#20-sourcesname) in the `ascribe.toml` reference.

### ASC134 `model-source-outside-repository`

[Error](https://ascribed-dev.com/docs/checks/diagnostics.md#severity) · [file level](https://ascribed-dev.com/docs/checks/diagnostics.md#file-level-and-page-level) · next step: [write](https://ascribed-dev.com/docs/checks/diagnostics.md#what-to-do-next) · [SPEC §7.3](https://github.com/ascribed-dev/ascribe/blob/main/SPEC.md#73-sources)

**When:** A source's folder is outside the project's repository, or, with no repository, outside the folder that was opened.

**Message:** the folder of source `{source}`, `{path}`, is outside the git repository the project is in

**Fix:** Give the source a `path` inside the project's repository, or, for code in another repository, give it `git` instead. With no repository, the editor and `ascribe mcp` read a source only inside the folder they were opened on: open the folder that contains the source.

**Read more:** [`[sources.<name>]`](https://ascribed-dev.com/docs/content-model/sources.md#20-sourcesname) in the `ascribe.toml` reference.

### ASC135 `model-source-remote`

[Error](https://ascribed-dev.com/docs/checks/diagnostics.md#severity) · [file level](https://ascribed-dev.com/docs/checks/diagnostics.md#file-level-and-page-level) · next step: [write](https://ascribed-dev.com/docs/checks/diagnostics.md#what-to-do-next) · [SPEC §7.4](https://github.com/ascribed-dev/ascribe/blob/main/SPEC.md#74-sources-in-another-repository)

**When:** A source has both `path` and `git`, or neither, a `branch` without `git`, a URL or a branch `git` can't take, or copies that would go inside the content root.

**Message:** source `{source}` has both `path` and `git`: a source is a folder in this repository or another repository, not both

**Fix:** Give each source either `path`, a folder in this repository, or `git`, the URL of another repository, with `branch` only beside `git`. A source with `git` keeps its copies in `sources/<name>/`, which must be outside the content root.

**Read more:** [A source in another repository](https://ascribed-dev.com/docs/content-model/sources.md#a-source-in-another-repository) in the `ascribe.toml` reference.

## Content types, fields, and attributes

### ASC074 `model-field-reserved`

[Error](https://ascribed-dev.com/docs/checks/diagnostics.md#severity) · [file level](https://ascribed-dev.com/docs/checks/diagnostics.md#file-level-and-page-level) · next step: [write](https://ascribed-dev.com/docs/checks/diagnostics.md#what-to-do-next) · [SPEC §2.1](https://github.com/ascribed-dev/ascribe/blob/main/SPEC.md#21-files)

**When:** A content type, or the [fragments](https://ascribed-dev.com/docs/glossary.md#fragment)' frontmatter, declares a field the specification or an output reserves.

**Message:** `{field}` is reserved by the Ascribe spec and every page accepts it; remove it from `[{table}]`

**Fix:** Remove the field from the type. Every page accepts it already, with the meaning the specification gives it. Every page type has `title` as a required string: declare it only to set `inline` or `phrases`.

**Read more:** [Page types](https://ascribed-dev.com/docs/content-model.md#41-page-types) in the `ascribe.toml` reference.

### ASC075 `model-type-syntax`

[Error](https://ascribed-dev.com/docs/checks/diagnostics.md#severity) · [file level](https://ascribed-dev.com/docs/checks/diagnostics.md#file-level-and-page-level) · next step: [write](https://ascribed-dev.com/docs/checks/diagnostics.md#what-to-do-next) · [SPEC §7.2](https://github.com/ascribed-dev/ascribe/blob/main/SPEC.md#72-declarations)

**When:** A field's or an attribute's type isn't one Ascribe knows, or isn't written correctly.

**Message:** "{type}" isn't a valid {kind} type: {detail}

**Fix:** Fix the type. The types are `string`, `number`, `boolean`, `date`, `enum(a, b)`, `list(T)`, and, for attributes, `set(T)`; a `?` at the end makes one optional.

**Read more:** [Short form](https://ascribed-dev.com/docs/content-model.md#51-short-form) in the `ascribe.toml` reference.

### ASC076 `model-type-fields`

[Error](https://ascribed-dev.com/docs/checks/diagnostics.md#severity) · [file level](https://ascribed-dev.com/docs/checks/diagnostics.md#file-level-and-page-level) · next step: [write](https://ascribed-dev.com/docs/checks/diagnostics.md#what-to-do-next) · [SPEC §7.2](https://github.com/ascribed-dev/ascribe/blob/main/SPEC.md#72-declarations)

**When:** An `object` field has no `fields`, or a field that isn't an object has them.

**Message:** field `{field}` is an object, so it needs `fields`

**Fix:** Give an `object` field its `fields`, or remove `fields` from a field that isn't an object.

**Read more:** [Table form](https://ascribed-dev.com/docs/content-model.md#52-table-form) in the `ascribe.toml` reference.

### ASC077 `model-enum-values`

[Error](https://ascribed-dev.com/docs/checks/diagnostics.md#severity) · [file level](https://ascribed-dev.com/docs/checks/diagnostics.md#file-level-and-page-level) · next step: [write](https://ascribed-dev.com/docs/checks/diagnostics.md#what-to-do-next) · [SPEC §7.2](https://github.com/ascribed-dev/ascribe/blob/main/SPEC.md#72-declarations)

**When:** An enumeration is empty, lists a value twice, gives its values in both places, or gives none.

**Message:** `{field}` has an empty enumeration

**Fix:** List the enumeration's values once each, in `enum(a, b)` or in `values`, not both.

**Read more:** [Short form](https://ascribed-dev.com/docs/content-model.md#51-short-form) in the `ascribe.toml` reference.

### ASC078 `model-set-token`

[Error](https://ascribed-dev.com/docs/checks/diagnostics.md#severity) · [file level](https://ascribed-dev.com/docs/checks/diagnostics.md#file-level-and-page-level) · next step: [write](https://ascribed-dev.com/docs/checks/diagnostics.md#what-to-do-next) · [SPEC §3.3](https://github.com/ascribed-dev/ascribe/blob/main/SPEC.md#33-attributes)

**When:** A value of a set-valued attribute has a space or a reserved character.

**Message:** "{value}" can't be in a value set: members can't contain spaces or any of , | { } = "

**Fix:** Remove spaces and the characters `,` `|` `{` `}` `=` `"` from the value, or make the attribute a single value instead of a set.

**Read more:** [Short form](https://ascribed-dev.com/docs/content-model.md#51-short-form) in the `ascribe.toml` reference.

### ASC079 `model-default-type`

[Error](https://ascribed-dev.com/docs/checks/diagnostics.md#severity) · [file level](https://ascribed-dev.com/docs/checks/diagnostics.md#file-level-and-page-level) · next step: [write](https://ascribed-dev.com/docs/checks/diagnostics.md#what-to-do-next) · [SPEC §7.2](https://github.com/ascribed-dev/ascribe/blob/main/SPEC.md#72-declarations)

**When:** A field's default isn't of the field's type, or isn't one of its values.

**Message:** default for `{field}` must be {type}, but it's {found}

**Fix:** Give a default of the field's type.

**Read more:** [Table form](https://ascribed-dev.com/docs/content-model.md#52-table-form) in the `ascribe.toml` reference.

### ASC080 `model-phrases-field-type`

[Error](https://ascribed-dev.com/docs/checks/diagnostics.md#severity) · [file level](https://ascribed-dev.com/docs/checks/diagnostics.md#file-level-and-page-level) · next step: [write](https://ascribed-dev.com/docs/checks/diagnostics.md#what-to-do-next) · [SPEC §5.1](https://github.com/ascribed-dev/ascribe/blob/main/SPEC.md#51-phrases)

**When:** `phrases = true` is on a field that isn't a `string` or a `list(string)`.

**Message:** phrases = true only works on string and list(string) fields, and `{field}` is "{type}"

**Fix:** Remove `phrases = true`, or make the field a `string` or `list(string)`.

**Read more:** [`[phrases]`](https://ascribed-dev.com/docs/content-model/content.md#7-phrases) in the `ascribe.toml` reference.

### ASC081 `model-pattern-syntax`

[Error](https://ascribed-dev.com/docs/checks/diagnostics.md#severity) · [file level](https://ascribed-dev.com/docs/checks/diagnostics.md#file-level-and-page-level) · next step: [write](https://ascribed-dev.com/docs/checks/diagnostics.md#what-to-do-next) · [SPEC §2.2](https://github.com/ascribed-dev/ascribe/blob/main/SPEC.md#22-pages-and-fragments)

**When:** A pattern isn't valid, starts with `/`, or has a `..` segment.

**Message:** "{pattern}" isn't a valid pattern: {detail}

**Fix:** Fix the pattern. Patterns are relative to the content root, with no leading `/` and no `..` segment.

**Read more:** [Paths and patterns](https://ascribed-dev.com/docs/content-model.md#13-paths-and-patterns) in the `ascribe.toml` reference.

### ASC119 `model-attribute-reserved`

[Error](https://ascribed-dev.com/docs/checks/diagnostics.md#severity) · [file level](https://ascribed-dev.com/docs/checks/diagnostics.md#file-level-and-page-level) · next step: [write](https://ascribed-dev.com/docs/checks/diagnostics.md#what-to-do-next) · [SPEC §7.2](https://github.com/ascribed-dev/ascribe/blob/main/SPEC.md#72-declarations)

**When:** An image's or a widget's attribute has a name that HTML or the site output already uses on its element.

**Message:** `{key}` can't be an image attribute: HTML already uses it on the \<img> element

**Fix:** Rename the attribute.

**Read more:** [`[images]`](https://ascribed-dev.com/docs/content-model/content.md#9-images) in the `ascribe.toml` reference.

### ASC141 `model-inline-field`

[Error](https://ascribed-dev.com/docs/checks/diagnostics.md#severity) · [file level](https://ascribed-dev.com/docs/checks/diagnostics.md#file-level-and-page-level) · next step: [write](https://ascribed-dev.com/docs/checks/diagnostics.md#what-to-do-next) · [SPEC §7.2](https://github.com/ascribed-dev/ascribe/blob/main/SPEC.md#72-declarations)

**When:** `inline` is on a field that isn't a page type's top-level string field, or isn't `"code"`.

**Message:** inline = "code" only works on string fields, and `{field}` is "{type}"

**Fix:** Remove `inline`, or set it to "code" on a string field of a content type's `frontmatter`.

**Read more:** [Code in a field](https://ascribed-dev.com/docs/content-model.md#53-code-in-a-field) in the `ascribe.toml` reference.

### ASC148 `model-field-role`

[Error](https://ascribed-dev.com/docs/checks/diagnostics.md#severity) · [file level](https://ascribed-dev.com/docs/checks/diagnostics.md#file-level-and-page-level) · next step: [write](https://ascribed-dev.com/docs/checks/diagnostics.md#what-to-do-next) · [SPEC §7.2](https://github.com/ascribed-dev/ascribe/blob/main/SPEC.md#72-declarations)

**When:** A field's `role` isn't one Ascribe knows, is on a field of the wrong type or below a page type's top level, or is on two fields of one type.

**Message:** role = "{role}" only works on a {expected} field, and `{field}` is "{type}"

**Fix:** Give `role = "description"` to one string field of a content type's `frontmatter`, `role = "recheck-date"` to one date field, and `role = "owner"` to one string or enum field, or remove `role`. A type has at most one field with each role, and only a page type's top-level fields have roles.

**Read more:** [Field roles](https://ascribed-dev.com/docs/content-model.md#54-field-roles) in the `ascribe.toml` reference.

### ASC193 `model-type-file`

[Error](https://ascribed-dev.com/docs/checks/diagnostics.md#severity) · [file level](https://ascribed-dev.com/docs/checks/diagnostics.md#file-level-and-page-level) · next step: [write](https://ascribed-dev.com/docs/checks/diagnostics.md#what-to-do-next) · [SPEC §7.2](https://github.com/ascribed-dev/ascribe/blob/main/SPEC.md#72-declarations)

**When:** A content type's `template` or `guide` doesn't exist, or is inside the content root or the output directory, or outside the project's folder.

**Message:** `{path}`, the {key} of content type `{type}`, doesn't exist

**Fix:** Name a file by its path from the folder ascribe.toml is in, with its name's case as it is on disk, outside the content root and the output directory: `template = "templates/how-to.md"`. A type's template and guide are read by people and tools starting a page, and aren't pages themselves.

**Read more:** [Page types](https://ascribed-dev.com/docs/content-model.md#41-page-types) in the `ascribe.toml` reference.

### ASC194 `model-type-template`

[Error](https://ascribed-dev.com/docs/checks/diagnostics.md#severity) · [file level](https://ascribed-dev.com/docs/checks/diagnostics.md#file-level-and-page-level) · next step: [write](https://ascribed-dev.com/docs/checks/diagnostics.md#what-to-do-next) · Ascribe's own, not in SPEC

**When:** A content type's template can't be read, or isn't a page Ascribe can read.

**Message:** can't read `{path}`, the template of content type `{type}`: {reason}

**Fix:** Fix the template so it reads as a page: valid YAML between its `---` lines, and no error in its Ascribe syntax. A template is read when the content model loads, so a problem in it is reported once, here, and not on every page made from it. A type that names no `template` and no `guide` takes them from `templates/templates.lock`, which `ascribe templates eject` writes: put back a file it gives (`ascribe templates status` says what's changed), or name the type's own `template` and `guide`.

**Read more:** [Page types](https://ascribed-dev.com/docs/content-model.md#41-page-types) in the `ascribe.toml` reference.

## Dimensions, names, lifecycle states, notes, and features

### ASC082 `model-name-multiple-roles`

[Error](https://ascribed-dev.com/docs/checks/diagnostics.md#severity) · [file level](https://ascribed-dev.com/docs/checks/diagnostics.md#file-level-and-page-level) · next step: [write](https://ascribed-dev.com/docs/checks/diagnostics.md#what-to-do-next) · [SPEC §7.2](https://github.com/ascribed-dev/ascribe/blob/main/SPEC.md#72-declarations)

**When:** A name used in more than one role (dimension name, dimension value, lifecycle state, or feature key), or a dimension value in more than one dimension.

**Message:** `{name}` is used as both {role-a} and {role-b}; a name can have only one role, so [availability](https://ascribed-dev.com/docs/glossary.md#availability) specs stay unambiguous

**Fix:** Rename one of them, so that each name has one role.

**Read more:** [Names](https://ascribed-dev.com/docs/content-model.md#12-names) in the `ascribe.toml` reference.

### ASC083 `model-name-case`

[Warning](https://ascribed-dev.com/docs/checks/diagnostics.md#severity) · [file level](https://ascribed-dev.com/docs/checks/diagnostics.md#file-level-and-page-level) · next step: [write](https://ascribed-dev.com/docs/checks/diagnostics.md#what-to-do-next) · [SPEC §7.2](https://github.com/ascribed-dev/ascribe/blob/main/SPEC.md#72-declarations)

**When:** Two names the content model declares differ only in case.

**Message:** `{a}` and `{b}` differ only in case; names are case-sensitive, so they're easy to confuse

**Fix:** Rename one of them, so they differ by more than case.

**Read more:** [Names](https://ascribed-dev.com/docs/content-model.md#12-names) in the `ascribe.toml` reference.

### ASC084 `model-dimension-empty`

[Error](https://ascribed-dev.com/docs/checks/diagnostics.md#severity) · [file level](https://ascribed-dev.com/docs/checks/diagnostics.md#file-level-and-page-level) · next step: [write](https://ascribed-dev.com/docs/checks/diagnostics.md#what-to-do-next) · [SPEC §7.2](https://github.com/ascribed-dev/ascribe/blob/main/SPEC.md#72-declarations)

**When:** A dimension has no values.

**Message:** dimension `{dimension}` has no values

**Fix:** Add the dimension's values, or remove the dimension.

**Read more:** [`[dimensions.<name>]`](https://ascribed-dev.com/docs/content-model/variation.md#11-dimensionsname) in the `ascribe.toml` reference.

### ASC085 `model-dimension-value-duplicate`

[Error](https://ascribed-dev.com/docs/checks/diagnostics.md#severity) · [file level](https://ascribed-dev.com/docs/checks/diagnostics.md#file-level-and-page-level) · next step: [write](https://ascribed-dev.com/docs/checks/diagnostics.md#what-to-do-next) · [SPEC §7.2](https://github.com/ascribed-dev/ascribe/blob/main/SPEC.md#72-declarations)

**When:** A dimension lists a value twice.

**Message:** `{value}` appears twice in dimensions.{dimension}.values

**Fix:** Remove the repeated value.

**Read more:** [`[dimensions.<name>]`](https://ascribed-dev.com/docs/content-model/variation.md#11-dimensionsname) in the `ascribe.toml` reference.

### ASC086 `model-dimension-value-shared`

[Error](https://ascribed-dev.com/docs/checks/diagnostics.md#severity) · [file level](https://ascribed-dev.com/docs/checks/diagnostics.md#file-level-and-page-level) · next step: [write](https://ascribed-dev.com/docs/checks/diagnostics.md#what-to-do-next) · [SPEC §7.2](https://github.com/ascribed-dev/ascribe/blob/main/SPEC.md#72-declarations)

**When:** A value is in more than one dimension.

**Message:** `{value}` is a value of both `{a}` and `{b}`; a value can belong to only one dimension

**Fix:** Rename the value in one of the dimensions.

**Read more:** [`[dimensions.<name>]`](https://ascribed-dev.com/docs/content-model/variation.md#11-dimensionsname) in the `ascribe.toml` reference.

### ASC087 `model-label-undeclared`

[Error](https://ascribed-dev.com/docs/checks/diagnostics.md#severity) · [file level](https://ascribed-dev.com/docs/checks/diagnostics.md#file-level-and-page-level) · next step: [choose](https://ascribed-dev.com/docs/checks/diagnostics.md#what-to-do-next) · [SPEC §7.2](https://github.com/ascribed-dev/ascribe/blob/main/SPEC.md#72-declarations)

**When:** A dimension's `labels` gives a label for a value the dimension doesn't have.

**Message:** dimensions.{dimension}.labels has a label for `{value}`, which isn't one of its values: {values}

**Fix:** Correct the label's key, or add the value to the dimension's `values`.

**Read more:** [`[dimensions.<name>]`](https://ascribed-dev.com/docs/content-model/variation.md#11-dimensionsname) in the `ascribe.toml` reference.

### ASC088 `model-versionless-undeclared`

[Error](https://ascribed-dev.com/docs/checks/diagnostics.md#severity) · [file level](https://ascribed-dev.com/docs/checks/diagnostics.md#file-level-and-page-level) · next step: [choose](https://ascribed-dev.com/docs/checks/diagnostics.md#what-to-do-next) · [SPEC §7.2](https://github.com/ascribed-dev/ascribe/blob/main/SPEC.md#72-declarations)

**When:** A dimension's `versionless` lists a value the dimension doesn't have.

**Message:** dimensions.{dimension}.versionless lists `{value}`, which isn't one of its values: {values}

**Fix:** Correct the entry, or add the value to the dimension's `values`.

**Read more:** [`[dimensions.<name>]`](https://ascribed-dev.com/docs/content-model/variation.md#11-dimensionsname) in the `ascribe.toml` reference.

### ASC089 `model-lifecycle-available-required`

[Error](https://ascribed-dev.com/docs/checks/diagnostics.md#severity) · [file level](https://ascribed-dev.com/docs/checks/diagnostics.md#file-level-and-page-level) · next step: [choose](https://ascribed-dev.com/docs/checks/diagnostics.md#what-to-do-next) · [SPEC §7.2](https://github.com/ascribed-dev/ascribe/blob/main/SPEC.md#72-declarations)

**When:** A lifecycle state the project adds doesn't say whether it counts as available.

**Message:** new lifecycle state `{state}` must set available = true or available = false

**Fix:** Add `available = true` or `available = false` to the state.

**Read more:** [`[lifecycle.<state>]`](https://ascribed-dev.com/docs/content-model/variation.md#13-lifecyclestate) in the `ascribe.toml` reference.

### ASC090 `model-lifecycle-ga-unavailable`

[Error](https://ascribed-dev.com/docs/checks/diagnostics.md#severity) · [file level](https://ascribed-dev.com/docs/checks/diagnostics.md#file-level-and-page-level) · next step: [write](https://ascribed-dev.com/docs/checks/diagnostics.md#what-to-do-next) · [SPEC §7.2](https://github.com/ascribed-dev/ascribe/blob/main/SPEC.md#72-declarations)

**When:** `[lifecycle.ga]` doesn't count as available.

**Message:** `ga` must count as available: content with no lifecycle state is ga

**Fix:** Remove `available = false` from `[lifecycle.ga]`.

**Read more:** [`[lifecycle.<state>]`](https://ascribed-dev.com/docs/content-model/variation.md#13-lifecyclestate) in the `ascribe.toml` reference.

### ASC091 `model-note-label-required`

[Error](https://ascribed-dev.com/docs/checks/diagnostics.md#severity) · [file level](https://ascribed-dev.com/docs/checks/diagnostics.md#file-level-and-page-level) · next step: [write](https://ascribed-dev.com/docs/checks/diagnostics.md#what-to-do-next) · [SPEC §4.5](https://github.com/ascribed-dev/ascribe/blob/main/SPEC.md#45-note)

**When:** A note type the project adds has no `label`.

**Message:** new note type `{type}` needs a label, such as label = "{Type}"

**Fix:** Give the note type a `label`.

**Read more:** [`[notes.<type>]`](https://ascribed-dev.com/docs/content-model/content.md#6-notestype) in the `ascribe.toml` reference.

### ASC092 `model-availability-syntax`

[Error](https://ascribed-dev.com/docs/checks/diagnostics.md#severity) · [file level](https://ascribed-dev.com/docs/checks/diagnostics.md#file-level-and-page-level) · next step: [write](https://ascribed-dev.com/docs/checks/diagnostics.md#what-to-do-next) · [SPEC §4.4](https://github.com/ascribed-dev/ascribe/blob/main/SPEC.md#44-available)

**When:** A feature's `available` isn't a valid availability spec.

**Message:** feature `{key}`: "{spec}" isn't a valid availability spec: {detail}

**Fix:** Fix the feature's `available` spec. Its syntax is in the [directive reference](https://ascribed-dev.com/docs/writing/directives.md#availability-specs).

**Read more:** [`[features.<key>]`](https://ascribed-dev.com/docs/content-model/variation.md#14-featureskey) in the `ascribe.toml` reference.

### ASC093 `model-availability-unknown-name`

[Error](https://ascribed-dev.com/docs/checks/diagnostics.md#severity) · [file level](https://ascribed-dev.com/docs/checks/diagnostics.md#file-level-and-page-level) · next step: [choose](https://ascribed-dev.com/docs/checks/diagnostics.md#what-to-do-next) · [SPEC §4.4](https://github.com/ascribed-dev/ascribe/blob/main/SPEC.md#44-available)

**When:** A feature's `available` names a target or a state the content model doesn't declare.

**Message:** feature `{key}`: `{name}` isn't a declared dimension value or dimension name

**Fix:** Use a declared dimension value, dimension, or lifecycle state, or declare the name.

**Read more:** [`[features.<key>]`](https://ascribed-dev.com/docs/content-model/variation.md#14-featureskey) in the `ascribe.toml` reference.

### ASC094 `model-availability-versionless`

[Error](https://ascribed-dev.com/docs/checks/diagnostics.md#severity) · [file level](https://ascribed-dev.com/docs/checks/diagnostics.md#file-level-and-page-level) · next step: [write](https://ascribed-dev.com/docs/checks/diagnostics.md#what-to-do-next) · [SPEC §4.4](https://github.com/ascribed-dev/ascribe/blob/main/SPEC.md#44-available)

**When:** A feature's `available` gives a version to a versionless target or a dimension name.

**Message:** feature `{key}`: `{target}` is versionless, so it takes a state but no version

**Fix:** Remove the version. A versionless target, or a dimension name, takes a state but no version.

**Read more:** [`[features.<key>]`](https://ascribed-dev.com/docs/content-model/variation.md#14-featureskey) in the `ascribe.toml` reference.

### ASC095 `model-availability-history-order`

[Error](https://ascribed-dev.com/docs/checks/diagnostics.md#severity) · [file level](https://ascribed-dev.com/docs/checks/diagnostics.md#file-level-and-page-level) · next step: [write](https://ascribed-dev.com/docs/checks/diagnostics.md#what-to-do-next) · [SPEC §4.4](https://github.com/ascribed-dev/ascribe/blob/main/SPEC.md#44-available)

**When:** A feature's history for a target isn't in chronological order.

**Message:** feature `{key}`: the history for `{target}` must be in chronological order, but {later} comes before {earlier}

**Fix:** List the target's states oldest first.

**Read more:** [`[features.<key>]`](https://ascribed-dev.com/docs/content-model/variation.md#14-featureskey) in the `ascribe.toml` reference.

### ASC096 `model-feature-nested`

[Error](https://ascribed-dev.com/docs/checks/diagnostics.md#severity) · [file level](https://ascribed-dev.com/docs/checks/diagnostics.md#file-level-and-page-level) · next step: [write](https://ascribed-dev.com/docs/checks/diagnostics.md#what-to-do-next) · [SPEC §4.4](https://github.com/ascribed-dev/ascribe/blob/main/SPEC.md#44-available)

**When:** A feature's `available` names another feature.

**Message:** feature `{key}`: available must be an availability spec, not another feature (`{other}`)

**Fix:** Write the feature's availability out in full. One feature can't refer to another.

**Read more:** [`[features.<key>]`](https://ascribed-dev.com/docs/content-model/variation.md#14-featureskey) in the `ascribe.toml` reference.
