Content Plan + Writing — контент-план и тексты
Модуль seo-cycle v2 · Фазы: 5–6 · запуск отдельно или стадией конвейера.
Контракт модуля
- Входы:
04-entity-maps/*,page-outline-v3брифы (copywriter-ready/*.md), RAG-контекст - Конвейер:
_state.jsonцикла (scripts/cycle-state.py) — предыдущая фазаdone; standalone: state нет →seo-cycle cycle init --topic "<тема>", работай по этому файлу, state обнови на выходе. - Выходы:
05-content-plan.md;06-drafts/*.publish.md(+fact_check_logfrontmatter) - Gate:
seo-cycle loop draft <draft.md> --outline <outline.json>— exit 0; стоп-слова, fact-check, alt/caption — блокеры - Делегаты:
delegate.content_strategy(defaultseo-content-strategist),delegate.content_writer(defaultseo-content-writer) - Общие правила:
../_shared/policy-intake.md(политики/бюджеты проекта — прочитать до платных действий),../_shared/scorecard.md(самооценка после задачи),../_shared/rag-usage.md(переиспользуй накопленное).
Phase 5 — Content Plan
Цель: roadmap публикаций с приоритетами.
Делегировать: delegate.content_strategy (по умолчанию seo-content-strategist).
Структура плана:
- Что: тип страницы (hub/spoke), URL, главный ключ
- Когда: дата, статус (TODO/Drafting/QA/Published)
- Зависимости: какие entity-maps готовы, какие источники собраны
- KPI: целевые impressions / clicks через 90 дней
- Bandwidth: блог N статей/неделю, категории M/месяц
Выход: 05-content-plan.md.
Phase 6 — Writing
Цель: написать тексты под Entity Map'ы.
Делегировать: delegate.content_writer (по умолчанию seo-content-writer).
Перед написанием: запроси накопленный контекст из локального RAG — seo-cycle rag query "<primary keyword>" --top-k 5 --source-type source_pack --source-type distillate (цитаты и факты из проверенных source packs; --global для пересечений с другими проектами). Брифы с подмешанными пассажами: page-outline-v3.py --rag.
Универсальные правила (config-driven):
- Tone of voice — из
tone.*config - Stop-words check — если
quality_gates.stop_words_check.enabled - AEO абзац в первые 400 символов — если
content_rules.aeo.enabled - Stock-first — если
content_rules.stock_first.enabled - Brand name discipline (user-facing vs technical) —
project.brand_name_* - Локальные сигналы ≥
content_rules.local_signals.min_per_page
QA после написания (обязательная последовательность):
- Stop-words check (
scripts/check-stop-words.py) - Fact-check — обязательно через Perplexity prompts (режим Deep Research) + Antigravity CLI cross-check для фактов, сущностей, интентов и спорных формулировок. Результаты записывай в
fact_check_logfrontmatter (claim/source/url/verdict/checked/tool). Если один из инструментов недоступен, не публикуй без записи blocker/exception в лог. - Image visual + alt/caption check — изображения создаются config-driven из
images.*. Для фото-подготовки используйscripts/wp-photo-image.py: локальное фото/URL → crop поimages.aspect_ratios.*→ WebP поimages.output.*→ WordPress upload через SSH/WP-CLI при необходимости. Inline images должны быть чистыми тематическими фото/визуалами вimages.visual_style. Не добавляй видимый текст на изображение, еслиimages.allow_visible_text=false(SEO/AEO/GEO, схемы, подписи, описания товаров, дисклеймеры каталога) и не используй товарные карточки/коллажи как основной визуал, если пользователь явно не попросил. У каждого недекоративного изображения должен быть естественныйalt; inline caption обязателен, еслиimages.captions.inline_required=true: featured, inline, OG/schema, product/category visuals. Alt и caption описывают изображение и сущность, без переспама ключами и без служебных объяснений. Изображение без alt или inline image без обязательного caption = публикационный blocker. - Stock-first проверка (если ecommerce)
- NW evaluate (если
sources.neuronwriter.enabled) — targetquality_gates.neuronwriter_score.min_score
E-E-A-T trust-блок (если есть fact_check_log): сгенерируй видимый блок «Источники» в конец статьи —
seo-cycle run script eeat-render 06-drafts/<name>.publish.md
Рендерятся только источники с verdict достоверно/частично; спорные — править формулировку в тексте, а не «подтверждать». Это прямой Trust-сигнал.
После черновика: валидация через автоцикл, не разовым гейтом: seo-cycle loop draft <draft.md> --outline <page-outlines-v3/slug.json> (exit 3 = переработай по instructions и --resume; лимит попыток не превышать).
Публикация только после прохождения всех гейтов.
Выход: 06-drafts/ — *.publish.md.