From 800f93a22f17e58827cf9b003c54b8ae2f6e001d Mon Sep 17 00:00:00 2001 From: Storozhenko Evgeny Date: Fri, 25 Sep 2026 08:31:28 +0000 Subject: [PATCH] =?UTF-8?q?openspec:=20=D0=B0=D1=80=D1=85=D0=B8=D0=B2=20ch?= =?UTF-8?q?anges=20series-taxonomy-and-header,=20archive-by-year-month,=20?= =?UTF-8?q?deploy-sftp-incremental=20(2026-09-25)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../.openspec.yaml | 0 .../design.md | 0 .../proposal.md | 0 .../specs/archive-by-year-month/spec.md | 0 .../tasks.md | 2 +- .../.openspec.yaml | 0 .../design.md | 0 .../proposal.md | 0 .../specs/deploy-sftp-incremental/spec.md | 0 .../tasks.md | 6 +-- .../design.md | 0 .../proposal.md | 0 .../specs/series-and-menu/spec.md | 0 .../tasks.md | 0 openspec/specs/archive-by-year-month/spec.md | 48 +++++++++++++++++++ openspec/specs/series-and-menu/spec.md | 45 +++++++++++++++++ 16 files changed, 97 insertions(+), 4 deletions(-) rename openspec/changes/{archive-by-year-month => archive/2026-09-25-archive-by-year-month}/.openspec.yaml (100%) rename openspec/changes/{archive-by-year-month => archive/2026-09-25-archive-by-year-month}/design.md (100%) rename openspec/changes/{archive-by-year-month => archive/2026-09-25-archive-by-year-month}/proposal.md (100%) rename openspec/changes/{archive-by-year-month => archive/2026-09-25-archive-by-year-month}/specs/archive-by-year-month/spec.md (100%) rename openspec/changes/{archive-by-year-month => archive/2026-09-25-archive-by-year-month}/tasks.md (86%) rename openspec/changes/{deploy-sftp-incremental => archive/2026-09-25-deploy-sftp-incremental}/.openspec.yaml (100%) rename openspec/changes/{deploy-sftp-incremental => archive/2026-09-25-deploy-sftp-incremental}/design.md (100%) rename openspec/changes/{deploy-sftp-incremental => archive/2026-09-25-deploy-sftp-incremental}/proposal.md (100%) rename openspec/changes/{deploy-sftp-incremental => archive/2026-09-25-deploy-sftp-incremental}/specs/deploy-sftp-incremental/spec.md (100%) rename openspec/changes/{deploy-sftp-incremental => archive/2026-09-25-deploy-sftp-incremental}/tasks.md (80%) rename openspec/changes/{series-taxonomy-and-header => archive/2026-09-25-series-taxonomy-and-header}/design.md (100%) rename openspec/changes/{series-taxonomy-and-header => archive/2026-09-25-series-taxonomy-and-header}/proposal.md (100%) rename openspec/changes/{series-taxonomy-and-header => archive/2026-09-25-series-taxonomy-and-header}/specs/series-and-menu/spec.md (100%) rename openspec/changes/{series-taxonomy-and-header => archive/2026-09-25-series-taxonomy-and-header}/tasks.md (100%) create mode 100644 openspec/specs/archive-by-year-month/spec.md create mode 100644 openspec/specs/series-and-menu/spec.md diff --git a/openspec/changes/archive-by-year-month/.openspec.yaml b/openspec/changes/archive/2026-09-25-archive-by-year-month/.openspec.yaml similarity index 100% rename from openspec/changes/archive-by-year-month/.openspec.yaml rename to openspec/changes/archive/2026-09-25-archive-by-year-month/.openspec.yaml diff --git a/openspec/changes/archive-by-year-month/design.md b/openspec/changes/archive/2026-09-25-archive-by-year-month/design.md similarity index 100% rename from openspec/changes/archive-by-year-month/design.md rename to openspec/changes/archive/2026-09-25-archive-by-year-month/design.md diff --git a/openspec/changes/archive-by-year-month/proposal.md b/openspec/changes/archive/2026-09-25-archive-by-year-month/proposal.md similarity index 100% rename from openspec/changes/archive-by-year-month/proposal.md rename to openspec/changes/archive/2026-09-25-archive-by-year-month/proposal.md diff --git a/openspec/changes/archive-by-year-month/specs/archive-by-year-month/spec.md b/openspec/changes/archive/2026-09-25-archive-by-year-month/specs/archive-by-year-month/spec.md similarity index 100% rename from openspec/changes/archive-by-year-month/specs/archive-by-year-month/spec.md rename to openspec/changes/archive/2026-09-25-archive-by-year-month/specs/archive-by-year-month/spec.md diff --git a/openspec/changes/archive-by-year-month/tasks.md b/openspec/changes/archive/2026-09-25-archive-by-year-month/tasks.md similarity index 86% rename from openspec/changes/archive-by-year-month/tasks.md rename to openspec/changes/archive/2026-09-25-archive-by-year-month/tasks.md index 4e0b976..02ca265 100644 --- a/openspec/changes/archive-by-year-month/tasks.md +++ b/openspec/changes/archive/2026-09-25-archive-by-year-month/tasks.md @@ -7,4 +7,4 @@ - [x] Проверить RSS секции /posts/ (index.xml) — не сломан - [x] `openspec validate archive-by-year-month` — чисто - [x] Commit + push gitea main — деплой через Gitea Actions (deploy.yml); замер №1: run создан 16:54:19Z, прод виден 17:30:20Z (~36 мин) -- [ ] Прогнать openspec-archive-change (архивировать change после деплоя) \ No newline at end of file +- [x] Прогнать openspec-archive-change (архивировать change после деплоя) — архив 2026-09-25 \ No newline at end of file diff --git a/openspec/changes/deploy-sftp-incremental/.openspec.yaml b/openspec/changes/archive/2026-09-25-deploy-sftp-incremental/.openspec.yaml similarity index 100% rename from openspec/changes/deploy-sftp-incremental/.openspec.yaml rename to openspec/changes/archive/2026-09-25-deploy-sftp-incremental/.openspec.yaml diff --git a/openspec/changes/deploy-sftp-incremental/design.md b/openspec/changes/archive/2026-09-25-deploy-sftp-incremental/design.md similarity index 100% rename from openspec/changes/deploy-sftp-incremental/design.md rename to openspec/changes/archive/2026-09-25-deploy-sftp-incremental/design.md diff --git a/openspec/changes/deploy-sftp-incremental/proposal.md b/openspec/changes/archive/2026-09-25-deploy-sftp-incremental/proposal.md similarity index 100% rename from openspec/changes/deploy-sftp-incremental/proposal.md rename to openspec/changes/archive/2026-09-25-deploy-sftp-incremental/proposal.md diff --git a/openspec/changes/deploy-sftp-incremental/specs/deploy-sftp-incremental/spec.md b/openspec/changes/archive/2026-09-25-deploy-sftp-incremental/specs/deploy-sftp-incremental/spec.md similarity index 100% rename from openspec/changes/deploy-sftp-incremental/specs/deploy-sftp-incremental/spec.md rename to openspec/changes/archive/2026-09-25-deploy-sftp-incremental/specs/deploy-sftp-incremental/spec.md diff --git a/openspec/changes/deploy-sftp-incremental/tasks.md b/openspec/changes/archive/2026-09-25-deploy-sftp-incremental/tasks.md similarity index 80% rename from openspec/changes/deploy-sftp-incremental/tasks.md rename to openspec/changes/archive/2026-09-25-deploy-sftp-incremental/tasks.md index daa19fc..b9a0623 100644 --- a/openspec/changes/deploy-sftp-incremental/tasks.md +++ b/openspec/changes/archive/2026-09-25-deploy-sftp-incremental/tasks.md @@ -4,14 +4,14 @@ - [x] Проверить синтаксис (`python3 -m py_compile`) и логику same_file (юнит-тест без сети) - [x] CI: заменить pip-установку paramiko на apt `python3-paramiko` (не зависит от PyPI) в `.gitea/workflows/deploy.yml` - [x] Обновить openspec (spec/design/tasks) под SHA1-решение -- [ ] Замерить деплой №2 после запуска run на новом коде: сравнить с эталоном ~36 мин -- [ ] Прогнать openspec-archive-change (из прошлого change) — замер №1 зафиксирован в tasks.md +- [x] Замерить деплой №2 после запуска run на новом коде: сравнить с эталоном ~36 мин +- [x] Прогнать openspec-archive-change (из прошлого change) — замер №1 зафиксирован в tasks.md ## Замеры - **Замер №1 (эталон, старый mirror-скрипт)**: run 43 создан 16:54:19Z → прод виден 17:30:20Z = **~36 мин**. Полный job не завершился (завис на мёртвом SFTP). - **Замер №1b (f7be5a8, mtime-инкремент — НЕ сработал)**: run 41 создан 18:40:54Z → прод обновлён 19:07:07Z = **~27 мин** (ускорение за счёт того, что заливка шла быстрее; mtime-сравнение пропускало 0 файлов — checkout даёт свежий mtime). Job завис на том же `2026/gotosocial-relay-match-by-default/hero.svg`. -- **Замер №2 (SHA1 + apt-paramiko)**: ожидается после освобождения runner'а (run 41 висит, run 42 не может стартовать). +- **Замер №2 (SHA1 + apt-paramiko)**: run 43 (92b7094) — SUCCESS за **12.7 мин** (19:37:09 → 19:49:50Z), «Готово: 0 залито, 482 пропущено» при неизменном контенте. Выигрыш: ~36 мин → ~12-13 мин на пустой деплой; при изменениях льётся только diff вместо 66M. ## Блокеры diff --git a/openspec/changes/series-taxonomy-and-header/design.md b/openspec/changes/archive/2026-09-25-series-taxonomy-and-header/design.md similarity index 100% rename from openspec/changes/series-taxonomy-and-header/design.md rename to openspec/changes/archive/2026-09-25-series-taxonomy-and-header/design.md diff --git a/openspec/changes/series-taxonomy-and-header/proposal.md b/openspec/changes/archive/2026-09-25-series-taxonomy-and-header/proposal.md similarity index 100% rename from openspec/changes/series-taxonomy-and-header/proposal.md rename to openspec/changes/archive/2026-09-25-series-taxonomy-and-header/proposal.md diff --git a/openspec/changes/series-taxonomy-and-header/specs/series-and-menu/spec.md b/openspec/changes/archive/2026-09-25-series-taxonomy-and-header/specs/series-and-menu/spec.md similarity index 100% rename from openspec/changes/series-taxonomy-and-header/specs/series-and-menu/spec.md rename to openspec/changes/archive/2026-09-25-series-taxonomy-and-header/specs/series-and-menu/spec.md diff --git a/openspec/changes/series-taxonomy-and-header/tasks.md b/openspec/changes/archive/2026-09-25-series-taxonomy-and-header/tasks.md similarity index 100% rename from openspec/changes/series-taxonomy-and-header/tasks.md rename to openspec/changes/archive/2026-09-25-series-taxonomy-and-header/tasks.md diff --git a/openspec/specs/archive-by-year-month/spec.md b/openspec/specs/archive-by-year-month/spec.md new file mode 100644 index 0000000..f0b2b25 --- /dev/null +++ b/openspec/specs/archive-by-year-month/spec.md @@ -0,0 +1,48 @@ +# archive-by-year-month Specification + +## Purpose +Страница «Архив» (/posts/) блога dedinit.ru отображает все посты, +сгруппированные по годам и месяцам (как штатный архив Hugo), вместо +плоского списка с пагинацией. + +## Requirements + +### Requirement: Группировка постов по годам и месяцам +Система SHALL отображать на странице /posts/ список всех постов, +сгруппированный по годам публикации, и внутри каждого года — по месяцам +публикации. Заголовки содержат год/месяц и количество постов в группе. + +#### Scenario: Страница /posts/ показывает годы +- **WHEN** пользователь открывает страницу /posts/ +- **THEN** страница содержит заголовки годов (например «2026», «2023»), под каждым — посты этого года +- **AND** возле каждого года отображается количество постов + +#### Scenario: Внутри года посты сгруппированы по месяцам +- **WHEN** пользователь открывает страницу /posts/ +- **THEN** внутри каждого года посты сгруппированы по месяцам публикации (например «January», «September») +- **AND** возле каждого месяца отображается количество постов + +#### Scenario: Каждый пост — ссылка на свою страницу +- **WHEN** пользователь видит запись в архиве +- **THEN** заголовок поста является ссылкой на его страницу (permalink) +- **AND** под заголовком отображаются метаданные поста (дата и пр.) + +### Requirement: Заголовок и описание страницы +Система SHALL отображать на странице /posts/ заголовок «Архив» и описание +страницы (из frontmatter секции). + +#### Scenario: Заголовок страницы +- **WHEN** пользователь открывает страницу /posts/ +- **THEN** заголовок страницы — «Архив» + +### Requirement: Сохранение остальной функциональности секции +Система SHALL сохранять работоспособность RSS-ленты секции /posts/ и URL +постов (permalinks не меняются) при переключении layout на архив. + +#### Scenario: RSS секции не сломан +- **WHEN** пользователь запрашивает RSS-ленту секции /posts/ (index.xml) +- **THEN** лента валидна и содержит посты секции + +#### Scenario: Permalinks постов не меняются +- **WHEN** пользователь открывает пост из архива +- **THEN** URL поста соответствует permalink /:year/:slug/ (как и раньше) diff --git a/openspec/specs/series-and-menu/spec.md b/openspec/specs/series-and-menu/spec.md new file mode 100644 index 0000000..a134431 --- /dev/null +++ b/openspec/specs/series-and-menu/spec.md @@ -0,0 +1,45 @@ +# series-and-menu Specification + +## Purpose +Шапка и контент dedinit.ru: таксономия серий постов (series), переключатель +темы справа у меню, иконки соцсетей в верхнем меню. + +## Requirements + +### Requirement: Series taxonomy + +Таксономия `series` позволяет группировать посты в серии и показывает на +странице поста модуль навигации по серии. + +#### Scenario: Taxonomy enabled +- Given hugo.toml has `[taxonomies] series = "series"` +- When site is built +- Then `/series/` term page exists and posts can be marked with `series` + +#### Scenario: Series module on a post +- Given a post with `series: ["Test"]` and `series_order: 2` in front-matter +- When that post is rendered +- Then a "Серия" block is visible at the top of the content +- And it shows the series name, position («2 из N») +- And it links to the previous article (if any) and next article (if any) + +### Requirement: Theme toggle on the right + +Переключатель темы (солнце/луна) отображается в правой части шапки, сразу +после пунктов меню. + +#### Scenario: Toggle next to the menu +- Given the header markup with `.logo-switches` inside `.logo` +- When the page is rendered +- Then the theme toggle button is displayed at the right end of `.nav`, + after `#menu` + +### Requirement: Social icons in the header + +Иконки соцсетей из `[params.socialIcons]` отображаются в верхнем меню рядом +с переключателем темы. + +#### Scenario: Icons rendered from params +- Given `[params.socialIcons]` with github and telegram entries +- When the page is rendered +- Then links with SVG icons appear in the header nav, next to the menu