docs(governance): enforce OpenSpec workflow for all changes; openspec: enforce-openspec-workflow

This commit is contained in:
estorozhenko
2026-09-13 11:12:21 +00:00
parent 1cee142631
commit 568335a643
4 changed files with 132 additions and 0 deletions
+48
View File
@@ -0,0 +1,48 @@
# AGENTS.md — Правила для AI-агентов (Hermes)
## ЖЁСТКОЕ ТРЕБОВАНИЕ: все изменения — через OpenSpec
**ЛЮБОЕ изменение проекта** (код, docker-compose.yml, config, системные
юниты, документация, статусы) **ОБЯЗАНО** проходить через OpenSpec-воркфлоу:
1. `/openspec-propose <имя-изменения>` — создать change
(proposal.md → specs/ delta → design.md → tasks.md).
2. `/openspec-apply-change <имя>` — реализовать задачи из tasks.md
(с реальной верификацией каждой).
3. `/openspec-archive-change <имя>` — влить delta в main specs
(`openspec/specs/`), после `openspec validate`.
**Запрещено** (без исключений):
- ❌ Править docker-compose.yml / config.yaml / код / юниты напрямую
без openspec-change.
- ❌ Коммитить изменения без соответствующего openspec-change
(коммит = `feat/fix(...): ...; openspec: <change-name>`).
- ❌ «Мелкие правки» в обход openspec: статус-файлы, README, доки —
тоже изменения, оформляются так же (допускается `skip_specs: true`
для чисто документационных правок).
**Исключения**: только по явной команде пользователя
(«сделай в обход openspec» / подтверждение на прямой фикс).
## Рабочий процесс
- Прочитать перед действиями: `STATUS.md`, `PRD.md`, `README.md`,
`TODO.md`, `openspec/specs/**/spec.md`.
- Верификация каждой задачи — реальная команда (curl, docker ps,
systemctl status), не предположение.
- Секреты: в `.env`, в git не попадают.
- Рестарт сервисов — только извне (SSH sudo systemctl restart).
- Git: маленькие коммиты; источник истины gitverse.ru.
## Текущая спецификация
- `openspec/specs/gotosocial/` — trusted-proxies, webfinger-and-registration,
webclient-and-clean-footer, smtp-email.
## Справочник essentials
- Контейнер: `gotosocial` (image superseriousbusiness/gotosocial:0.22.1)
- Данные: `/opt/gotosocial/data/` (sqlite.db + storage/)
- Порт: 8080 внутри, Caddy vps02 → 10.8.0.2:8080
- SMTP: smtp.jino.ru:587, `GTS_SMTP_FROM`, `GTS_SMTP_USERNAME` (соц@dedinit.ru)
+15
View File
@@ -39,6 +39,21 @@ Internet ──► vps02 87.242.100.206 (Caddy 2, host net)
└── openspec/ # OpenSpec-воркфлоу (changes/deploy-gotosocial) └── openspec/ # OpenSpec-воркфлоу (changes/deploy-gotosocial)
``` ```
## Правила изменений (обязательно)
**Все изменения проекта** (код, docker-compose.yml, config.yaml, документы,
статусы) проводятся **только через OpenSpec-воркфлоу**:
1. `openspec new change '<имя>'` — proposal → specs (delta) → design → tasks
2. выполнение задач из `tasks.md` (каждая — с реальной верификацией)
3. `openspec archive '<имя>'` — влить delta в `openspec/specs/`, коммит
Прямое редактирование файлов или коммиты без openspec-change **запрещены**
(SMTP-фикс 13.09 — прецедент, оформлен постфактум как
`fix-smtp-from-address`). Исключение — только явная команда владельца.
Подробно: `AGENTS.md` (корень проекта).
## Команды ## Команды
```bash ```bash
+1
View File
@@ -12,6 +12,7 @@ context: |
Мониторинг: Prometheus на bigbox (127.0.0.1:9090, host net), Grafana :3001 (grafana.nixg.ru), Loki :3100 + promtail; метрики GtS: metrics-enabled + OTEL prometheus; логи: log-format json → promtail job. Мониторинг: Prometheus на bigbox (127.0.0.1:9090, host net), Grafana :3001 (grafana.nixg.ru), Loki :3100 + promtail; метрики GtS: metrics-enabled + OTEL prometheus; логи: log-format json → promtail job.
Git: источник истины gitverse.ru (kpa39l), gitea.nixg.ru — pull-mirror (8h). Коммиты — маленькие, по изменениям. Git: источник истины gitverse.ru (kpa39l), gitea.nixg.ru — pull-mirror (8h). Коммиты — маленькие, по изменениям.
Версии: последний стабильный релиз GtS, фиксированный тег в compose, обновление вручную. Версии: последний стабильный релиз GtS, фиксированный тег в compose, обновление вручную.
СЛУЖЕБНОЕ ПРАВИЛО: ЛЮБОЕ изменение проекта (код, конфиги, доки, статусы) проводится ТОЛЬКО через OpenSpec-воркфлоу (openspec new change → apply tasks → archive): прямое редактирование файлов или коммиты без openspec-change ЗАПРЕЩЕНЫ; исключение — только явная команда пользователя.
rules: rules:
proposal: proposal:
@@ -0,0 +1,68 @@
# gotosocial/project-governance Specification
## Purpose
Определить обязательный процесс управления изменениями проекта: любое
изменение (код, конфигурация, документация, статусы) проводится только через
OpenSpec-воркфлоу. Введено по явному распоряжению владельца 2026-09-13.
## Requirements
### Requirement: OpenSpec-воркфлоу обязателен для всех изменений
- **MUST**: Каждое изменение проекта оформляется как openspec-change
(`openspec new change '<name>'`) с артефактами proposal → specs (delta) →
design → tasks, в соответствии со schema `spec-driven`.
- **MUST**: Реализация выполняется по задачам из `tasks.md`; каждая задача —
с реальной верификацией (команда/тест/наблюдаемое поведение), подтверждение
«сделано» без проверки не принимается.
- **MUST**: После реализации change архивируется
(`openspec archive '<name>' --yes`), delta вливается в
`openspec/specs/<capability>/`; итог валиден (`openspec validate`).
- **MUST NOT**: Прямое редактирование файлов проекта (docker-compose.yml,
config.yaml, код, системные юниты, README/STATUS/TODO, openspec/specs)
без openspec-change.
#### Scenario: Прямая правка запрещена
- **GIVEN** владелец дал задачу на изменение (например, «добавь правило в файлы»)
- **WHEN** агент хочет править файл напрямую, без openspec-change
- **THEN** действие отклоняется: сначала создаётся openspec-change,
задачи применяются, change архивируется
#### Scenario: Изменение через воркфлоу допустимо
- **GIVEN** изменение проекта (код или конфиг)
- **WHEN** создан openspec-change, задачи выполнены и верифицированы,
change заархивирован, `openspec validate` проходит
- **THEN** изменение считается легитимным и коммитится
(`feat/fix(...): ...; openspec: <change-name>`)
### Requirement: Источники правила для агентов и людей
- **MUST**: Правило зафиксировано в `AGENTS.md` (корень проекта) — файл
авто-подхватывается агентами (Hermes/Claude) при работе в проекте.
- **MUST**: Правило включено в `openspec/config.yaml` (`context`) — оно
инжектится в каждый артефакт openspec.
- **SHOULD**: Правило продублировано в `README.md` (видно человеку при
первом знакомстве с проектом).
#### Scenario: Агент видит правило
- **GIVEN** агент работает в /opt/gotosocial
- **WHEN** он открывает сессию
- **THEN** в `AGENTS.md` он находит «ЖЁСТКОЕ ТРЕБОВАНИЕ: все изменения —
через OpenSpec» с запретами и исключениями
### Requirement: Исключение только по команде владельца
- **MAY**: Прямое изменение допускается только после явной команды
владельца («сделай в обход openspec», подтверждение на прямой фикс).
- **MUST**: Исключение фиксируется в коммит-сообщении (например,
`bypass-openspec: <причина>`), чтобы оставаться аудируемым.
#### Scenario: Явный обход
- **GIVEN** владелец сказал «сделай напрямую, без openspec»
- **WHEN** агент вносит изменение
- **THEN** изменение допустимо, но помечается в коммите
(`bypass-openspec: <причина>`)