Role for AI agents
Role: Content and SEO
Write and move pages, fill in the SEO block, look after translations and old addresses. Shared rules are on the page Instructions for AI agents.
How a page works, in plain words, is in the guide Pages and content; what is generated on its own is in SEO.
In plain words
The content role is the writer and editor of the site. It works only with texts and pictures: it creates pages, fills the three search lines at the top, writes the sections, adds translations and moves texts from an old site. It does not touch the look of the site or its scripts.
Example. To add a service page, the content role copies an existing service file under a new name, changes title, h1, description and the text, adds the photo to media/ and runs the check. If a fact is missing — a price, a phone number — it does not invent it: it leaves the field empty and adds a question to the list for the owner.
You need this page when you give writing work to an agent, or do it yourself and want a checklist.
Input and output
Input: the site structure (keys, types, sections per type, languages) and the client's texts or facts. For an existing site, the folder itself.
Output: page files in content/ per language, images in media/, reference data in data/, redirect_from in the pages, a list of content debts and questions.
1. Create the file
$H page service roof my-site --folder services # → content/MAIN_LANG/services/roof.md
$H page service roof my-site --folder services --lang ru # translation
heron page writes the full SEO block and placeholders for all sections the theme declared for the type (types.TYPE.uses). Copying a ready file works too, with the same result. A filled-in sample page: templates/page.md.
The file name is the page key: Latin letters, digits, hyphen; the same in every language. A different address for a translation comes from the slug field.
2. The SEO block
Eight groups; their order and comments are kept; empty optional fields stay commented out.
| Group | What to fill in |
|---|---|
| 1. Main | title (up to 60 characters, for search results), h1 (for whoever opened the page; not a copy of title), description (up to 155 characters: what the reader gets). slug if the address differs from the file name. Do not touch canonical and robots |
| 2. Search queries | the main one and the extra ones. HERON does not read them; the rule is one intent, one page |
| 3–4. Open Graph, Twitter | only if different from title/description/the default image |
| 5. Schema.org | refinements of this page's markup; organisation data goes not here but to site.yaml |
| 6. Card | image + image_alt for the catalog; order; type if the section does not set it |
| 7. Service | date, updated, published, noindex |
| 8. Links | the theme's link fields (file names without .md) and redirect_from |
Every field and its default: the contract, page format (§4.2).
3. Text
- intro: before the first
##, no more than two paragraphs: the lead and the promise; - sections:
## Title {#anchor}, anchors from the type'suses. A typo in an anchor shows up as "the theme does not use" in the report; - the form of a section comes from its markup: a list,
1.steps,### Question?FAQ,key | valuefacts, a table,>a tip; the classes.alert,.timeline,.galleryin the anchor. The forms table: page format (§4.4); - no material, no section. Delete the placeholder from
heron pageinstead of filling it with general words.
4. Links and relations
- to your own pages: by the key from the root, without a language prefix: a link to the roofing page points to
/services/roof/, to the home page to/. HERON puts in the address of the right language; - "see also", "on the topic": link fields from
theme.yaml(related: [gutter]), not hand-written lists of links; - phone, address, hours, social links: not in the text but in
contact/organizationinsite.yaml.
5. Images
Files go into media/, with the path from the site root: media/services/roof.png. Illustrations as PNG/WebP with a transparent background, photos as JPEG; HERON makes all the sizes itself. Every image has alt (image_alt, the caption in ![…]).
6. Moving a site
- an old address whose content moved goes into
redirect_fromof the new page, in Cyrillic or as%D0%…; - two or three old pages about one thing become one new page, with all their addresses in its
redirect_from; - addresses that no longer exist go into
goneinsite.yaml, not into a page.
The order of a move: the guide SEO, part "Moving from an old site".
7. Languages
A translation is a file with the same name in the language folder, for example content/ru/. No translation: the page stays in the main language and the report has a warning. The main language cannot be empty in production (E021).
Checklist
- every page of the structure has a file; file names are the same in every language
title,h1,descriptionare filled in and differ; group 2 is filled in- not a single invented fact; anything unconfirmed goes to the questions
- no empty placeholder sections
- links by key; relations by theme fields
- images have
alt - old addresses are split between
redirect_fromandgone checkhas no errors; the "Not filled in" summary is in the report
Source
This page mirrors docs/agents/content.md from the prod branch. The repository is updated first: content.md on GitHub. The original is written in Russian.