mirror of
https://gitverse.ru/kpa39l/gotosocial.git
synced 2026-09-29 09:55:10 +00:00
docs(governance): enforce OpenSpec workflow for all changes; openspec: enforce-openspec-workflow
This commit is contained in:
@@ -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: <причина>`)
|
||||
Reference in New Issue
Block a user