openspec: архив changes series-taxonomy-and-header, archive-by-year-month, deploy-sftp-incremental (2026-09-25)
deploy-dedinit / Build & SFTP Deploy (push) Successful in 7m13s
deploy-dedinit / Build & SFTP Deploy (push) Successful in 7m13s
This commit is contained in:
+1
-1
@@ -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 после деплоя)
|
||||
- [x] Прогнать openspec-archive-change (архивировать change после деплоя) — архив 2026-09-25
|
||||
+3
-3
@@ -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.
|
||||
|
||||
## Блокеры
|
||||
|
||||
@@ -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/ (как и раньше)
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user