Skip to content

Built-in taxonomy schemas

manni meta ships three taxonomy schemas. Each names a published set of values for a classification field. They exist because google:okf:0.1 requires a type but accepts any non-empty string for it. It cannot stop a docs set from drifting into how-to, howto, and guide all meaning the same thing.

IdKeyKey required?FrameworkJSON
diataxis:diataxis:1.0typeYesDiátaxisdiataxis/1.0.json
tgdp:templates:1.1typeYesThe Good Docs Projecttgdp/1.1.json
passo-uno:seven-action:1.0actionNoSeven-Action Documentation Modelseven-action/1.0.json

All three use Draft 2020-12, allow additional properties, and are built-in references.

Each JSON link is the schema itself, at a permanent, version-pinned URL. That is useful for reading the exact vocabulary, or for $ref-ing one from a schema of your own. Inside manni meta the URL and the id are interchangeable, and neither makes a network call.

The two keyed on type are alternatives to each other. See Which ones compose. For every other schema manni meta ships, including the Docusaurus front matter contracts, see the built-in schema registry.

The two content-type schemas do both jobs. They require their key as well as constraining it, so neither needs a partner to get presence-checking. Adopting a named set of document types is a claim that every page is one of them. That makes an untyped page a gap rather than an abstention:

✗ docs/overview.md
(root) must have required property 'type' (line 1) [diataxis:diataxis:1.0]
diataxis:diataxis:1.0 type: Which of the four Diataxis forms this page is.
Guide: https://hawkeyexl.github.io/manni/meta/reference/schemas/diataxis/

Pair either with google:okf:0.1 for the other OKF fields, not for type:

Terminal window
manni meta validate docs/ -s diataxis:diataxis:1.0 -s google:okf:0.1

passo-uno:seven-action:1.0 is the exception. It checks action only if one is present. That is what makes it safe to layer onto an existing setup, and safe to carry in the default set.

Each schema has a page of its own, with its full value list, an example page, and the finding a common mistake produces.

Diátaxis and TGDP both classify what a page is, so both claim type. Seven-Action classifies what a reader is doing, which is independent, so it claims action and composes with either:

---
type: how-to
action: practice
title: Rotate an API key
---
CombinationResult
Diátaxis + Seven-ActionComposes
TGDP + Seven-ActionComposes
Diátaxis + TGDPPick one

Stacking Diátaxis with a closed TGDP check runs without error, and it validates against the intersection of their vocabularies, which is narrower than either. The closed check is tgdp:templates:1.1 with its strict overlay, or tgdp:templates:1.0. explanation is Diátaxis-only and installation-guide is TGDP-only, so each rules out values the other exists to allow, leaving only tutorial, how-to, and reference. Choose the vocabulary your docs set actually uses.

The Seven-Action model publishes a mapping to Diátaxis. It is not one-to-one: explore lands on Tutorial, and Diátaxis’s single how-to form splits across three actions.

actionDiátaxis type
appraiseno direct equivalent (closest: explanation)
understandexplanation
exploretutorial
practicehow-to
rememberreference
develophow-to
troubleshoothow-to (problem-oriented)

Use it to sanity-check a pairing, not as a rule manni meta enforces. The two schemas validate independently; no combination of a valid type and a valid action is rejected.

The enums are strict and carry no aliases, so howto and How-To Guide both fail. That is the point of a vocabulary check, but it means a docs set with its own conventions needs its own schema. Copy the shape into a local file and edit the enum:

schemas/types.schema.json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"additionalProperties": true,
"required": ["type"],
"properties": {
"type": {
"type": "string",
"enum": ["tutorial", "how-to", "howto", "reference", "explanation"]
}
}
}

Drop the required line if you want a vocabulary check without a presence check. A document with no type then passes.

Then reference it by path instead of the built-in id. See Author a schema for the full authoring guide.