diff --git a/openspec/changes/rss-full-feed/.openspec.yaml b/openspec/changes/archive/2026-09-08-rss-full-feed/.openspec.yaml similarity index 100% rename from openspec/changes/rss-full-feed/.openspec.yaml rename to openspec/changes/archive/2026-09-08-rss-full-feed/.openspec.yaml diff --git a/openspec/changes/rss-full-feed/design.md b/openspec/changes/archive/2026-09-08-rss-full-feed/design.md similarity index 100% rename from openspec/changes/rss-full-feed/design.md rename to openspec/changes/archive/2026-09-08-rss-full-feed/design.md diff --git a/openspec/changes/rss-full-feed/proposal.md b/openspec/changes/archive/2026-09-08-rss-full-feed/proposal.md similarity index 100% rename from openspec/changes/rss-full-feed/proposal.md rename to openspec/changes/archive/2026-09-08-rss-full-feed/proposal.md diff --git a/openspec/changes/rss-full-feed/specs/site-rss/spec.md b/openspec/changes/archive/2026-09-08-rss-full-feed/specs/site-rss/spec.md similarity index 100% rename from openspec/changes/rss-full-feed/specs/site-rss/spec.md rename to openspec/changes/archive/2026-09-08-rss-full-feed/specs/site-rss/spec.md diff --git a/openspec/changes/rss-full-feed/tasks.md b/openspec/changes/archive/2026-09-08-rss-full-feed/tasks.md similarity index 100% rename from openspec/changes/rss-full-feed/tasks.md rename to openspec/changes/archive/2026-09-08-rss-full-feed/tasks.md diff --git a/openspec/specs/site-rss/spec.md b/openspec/specs/site-rss/spec.md new file mode 100644 index 0000000..8c0d77c --- /dev/null +++ b/openspec/specs/site-rss/spec.md @@ -0,0 +1,76 @@ +# site-rss Specification + +## Purpose +TBD - created by archiving change rss-full-feed. Update Purpose after archive. + +## Requirements + +### Requirement: R1 — Лимит постов в RSS-ленте + +Главная RSS-лента (`/index.xml`) MUST содержать не более 5 последних постов +(по `publishDate`), отсортированных по дате публикации по убыванию. + +#### Scenario: Сборка сайта даёт ровно 5 элементов item + +GIVEN сайт собран командой `hugo --minify` +WHEN запрашивается `https://dedinit.ru/index.xml` (файл `public/index.xml`) +THEN число элементов `` в `` равно 5 (или меньше, если постов < 5), +и это 5 самых свежих постов по дате. + +### Requirement: R2 — Полный текст поста в RSS + +Каждый `` главной RSS-ленты MUST содержать `` с полным +HTML-контентом поста (поле `.Content` темы Hugo), обёрнутым в CDATA, включая +разметку, блоки кода и абсолютные ссылки на медиафайлы поста. + +#### Scenario: content:encoded присутствует и содержит медиа-URL + +GIVEN сайт собран командой `hugo --minify` +WHEN в `public/index.xml` смотреть элемент `` любого из 5 последних постов +THEN присутствует непустой ``, содержащий HTML поста и ссылки +вида `https://dedinit.ru/<год>//hero.svg` (или аналогичные абсолютные URL +медиа). + +### Requirement: R3 — Описание поста в RSS + +`` каждого `` MUST быть непустым: используется frontmatter +`description` если задан, иначе авто-summary `.Summary`. + +#### Scenario: description непустое + +GIVEN сайт собран командой `hugo --minify` +WHEN в `public/index.xml` смотреть `` каждого `` +THEN оно непустое и не содержит обрезанных HTML-тегов. + +### Requirement: R4 — Метаданные элемента RSS + +Каждый `` MUST содержать корректные ``, `<link>`, `<pubDate>`, +`<guid>` (permalink), согласно текущему шаблону темы +`themes/rDedInit/layouts/_default/rss.xml`. + +#### Scenario: Обязательные поля элемента + +GIVEN сайт собран командой `hugo --minify` +WHEN парсить `public/index.xml` как XML +THEN каждый `<item>` содержит все 4 обязательных поля, `<link>` и `<guid>` +равны полному URL поста (`https://dedinit.ru/<год>/<slug>/`). + +### Requirement: R5 — Медиа-обложка в RSS + +Каждый `<item>` MUST включать в `<content:encoded>` обложку поста +(`cover.image`, hero.svg) как `<figure class="entry-cover"><img ...></figure>` +перед полным текстом, со ссылкой на абсолютный URL медиафайла +(`https://dedinit.ru/<год>/<slug>/hero.svg`), если `cover.image` задан. + +#### Scenario: Обложка в content:encoded + +GIVEN сайт собран командой `hugo --minify` +WHEN в `public/index.xml` смотреть `<content:encoded>` поста с cover.image +THEN он начинается с `<figure class="entry-cover">` и содержит +`<img src="https://dedinit.ru/<год>/<slug>/hero.svg"`. + +#### Scenario: Нет cover — нет figure + +GIVEN сайт собран командой `hugo --minify` +WHEN в `<content:encoded>` поста без cover.image +THEN отсутствует `<figure class="entry-cover">`, контент начинается с текста поста.