template-kit/manifest-invalid
The template-kit/manifest-invalid authoring rule — what it enforces, why, and how to fix it.
manifest.jsonis the one file that says which sections make a page, and in what order. Every check on it lands under this id.
A template folder (templates/<key>/) must have a manifest.json at its root, and that
file must:
- exist — a template folder with none at all reports this once, naming the missing file;
- parse as JSON, and satisfy the manifest shape —
key,name,deliverable_type, and an orderedsectionsarray of section instances (section,instance_id,options,locked,required,reorderable); - agree with its own folder — the manifest’s
keymust match the template folder name it lives in; - reference real sections — every
sections[].sectionmust resolve to a section this workspace actually has; - override only what’s real and overridable — an instance’s
optionsmay only name an option the target section declares, only when that option is nottemplate_overridable: false, and only with a value that actually differs from the section’s own default; - satisfy the whole-composition nav contract — the cross-section rules that need the full, resolved section set rather than any one section in isolation.
Every violation collects into the same run; a manifest with several wrong references reports all of them together.
Reason
Section titled “Reason”A section’s own four files describe that section in isolation — they say nothing about
which page it appears on, in what order, or which of its options a specific template has
chosen to lock in. manifest.json is where that composition is declared, and it is the
only place a downstream consumer (the publisher, the fill pipeline, the editor) can go to
learn a template’s actual shape. A manifest that references a section that doesn’t exist,
or restates a default as if it were an override, is a template whose real composition
nobody can trust the manifest to describe.
Read the message: it names the template, the section instance, and what’s wrong. Missing entirely, add one. Otherwise, fix the field the message points at.
Before
Section titled “Before”templates/acme-modern/ manifest.json sections/ hero/{ "key": "acme-classic", "name": "Acme Classic", "deliverable_type": "single_property_website", "sections": [ { "section": "hero", "instance_id": "hero-1", "options": {}, "locked": [], "required": true, "reorderable": false } ], "reconcile": []}Template "acme-modern": manifest key "acme-classic" does not match the template folder name "acme-modern".{ "key": "acme-modern", "name": "Acme Modern", "deliverable_type": "single_property_website", "sections": [ { "section": "hero", "instance_id": "hero-1", "options": {}, "locked": [], "required": true, "reorderable": false } ], "reconcile": []}See also
Section titled “See also”- The schema system — what a manifest declares and the type it’s validated against.
schema-invalid— the same kind of cross-reference check, one level down, on a single section’s own contract files.no-templates— reported instead when the workspace has notemplates/<key>/folder to check at all.