From 4ec03cddd589c08efa9811c319a924653eed771d Mon Sep 17 00:00:00 2001 From: Storozhenko Evgeny Date: Tue, 8 Sep 2026 20:08:28 +0000 Subject: [PATCH] =?UTF-8?q?docs(openspec):=20archive=20rss-full-feed=20?= =?UTF-8?q?=E2=80=94=20=D1=81=D0=BF=D0=B5=D0=BA=D0=B0=20site-rss=20=D0=B2?= =?UTF-8?q?=20main=20specs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2026-09-08-rss-full-feed}/.openspec.yaml | 0 .../2026-09-08-rss-full-feed}/design.md | 0 .../2026-09-08-rss-full-feed}/proposal.md | 0 .../specs/site-rss/spec.md | 0 .../2026-09-08-rss-full-feed}/tasks.md | 0 openspec/specs/site-rss/spec.md | 76 +++++++++++++++++++ 6 files changed, 76 insertions(+) rename openspec/changes/{rss-full-feed => archive/2026-09-08-rss-full-feed}/.openspec.yaml (100%) rename openspec/changes/{rss-full-feed => archive/2026-09-08-rss-full-feed}/design.md (100%) rename openspec/changes/{rss-full-feed => archive/2026-09-08-rss-full-feed}/proposal.md (100%) rename openspec/changes/{rss-full-feed => archive/2026-09-08-rss-full-feed}/specs/site-rss/spec.md (100%) rename openspec/changes/{rss-full-feed => archive/2026-09-08-rss-full-feed}/tasks.md (100%) create mode 100644 openspec/specs/site-rss/spec.md 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">`, контент начинается с текста поста.