state · git:20261008.46339a7 · 2026-10-08 · sha256 a8139495bef2e97f

state git:20261008.46339a7A

Immutable. This exact content never changes and is served at /api/v1/blob/a8139495bef2e97f.

---
name: state
description: Show project status
---

# /polisade:state — Статус проекта

Показать полный статус проекта для PM.

## Использование

```
/polisade:state    # Показать статус
```

## Алгоритм

1. Прочитай `.state/PROJECT_STATE.json`
2. Просканируй папки `docs/`, `backlog/`, `tasks/` на артефакты
3. Сверь статусы с PROJECT_STATE.json (синхронизируй если нужно)
4. Собери статистику по состояниям
5. Выведи в структурированном формате

## Формат вывода

```
═══════════════════════════════════════════
  СТАТУС ПРОЕКТА
═══════════════════════════════════════════

МОЖНО РЕАЛИЗОВАТЬ (N):
   • BUG-001: Кнопка не работает (P1)
   • TASK-001: Create API endpoint
   • TASK-002: Add UI component

МОЖНО СОЗДАТЬ ЗАДАЧИ (N):
   • FEAT-001 → /polisade:tasks FEAT-001
   • SPEC-001 → /polisade:tasks SPEC-001

НУЖНА ПРОРАБОТКА (N):
   • PRD-001 → /polisade:spec PRD-001
   • SPEC-002 → /polisade:design SPEC-002 (опц., создать doc-as-code пакет)

АРХИТЕКТУРА:
   Active ADRs: 4
   Design packages: 2 (DESIGN-001, DESIGN-002)

ПРИЁМКА:
   пар: 7; последний прогон: 6/7 зелёных; ⚠️ база разошлась: чеков 0, приборов 1

АРХИТЕКТУРНАЯ ДОКУМЕНТАЦИЯ (печатать ВСЕГДА — это состояние проекта):
   Режим: silo (живой корпус выключен) — /polisade:design SPEC-NNN
   Непереведённых силосов: 2 (DESIGN-001, DESIGN-002)

CORPUS-RUN (экспериментально — показывать только если есть ARCHRUN или corpus.mode=living):
   Corpus mode: living
   • ARCHRUN-001: ждёт PM — "synonym collision: Order vs PurchaseOrder"
       → /polisade:unblock, затем /polisade:design-corpus --resume=<runId>
   • ARCHRUN-002: ready (resume required) → /polisade:design-corpus --resume=<runId>

───────────────────────────────────────────

ЖДУТ PM (N):
   • TASK-003: "Какой лимит для rate limiting?"
     (с 2024-01-15)
   • FEAT-002: "Какой приоритет?"
     (с 2024-01-14)

ЗАБЛОКИРОВАНО (N):
   • TASK-008: Тесты падают после изменений в API

В РАБОТЕ (N):
   • TASK-005: Implementing auth module

───────────────────────────────────────────

БЭКЛОГ:
   Features: 3 (1 ready, 2 draft)
   Bugs: 3 (1 ready, 1 in_progress, 1 not_actual)
   Tech Debt: 5 (2 ready, 3 draft)

ЗАВЕРШЕНО ЗА СЕССИЮ:
   • TASK-004, BUG-002

ЗАКРЫТО БЕЗ РЕАЛИЗАЦИИ (N; отдельно от завершённых):
   • TASK-006: cancelled — <status_reason>
   • BUG-003: not_actual — <status_reason>

НЕПРИМЕНИМЫЕ ADR (N; не superseded):
   • ADR-004: not_applicable — <status_reason>

═══════════════════════════════════════════
РЕКОМЕНДАЦИЯ:
   → [Конкретное действие]
═══════════════════════════════════════════
```

## Логика рекомендаций

1. Если есть `waitingForPM`:
   → "Запусти /polisade:unblock чтобы ответить на N вопросов"

2. Если есть ready BUG:
   → "Есть баги для исправления. /polisade:continue или /polisade:implement BUG-XXX"

3. Если есть ready TASK:
   → "Запусти /polisade:continue для автономной работы"

4. Если есть ready FEAT/SPEC/PLAN без задач:
   → "Создай задачи: /polisade:tasks FEAT-XXX"

5. Если есть ready PRD без спеки:
   → "Создай спецификацию: /polisade:spec PRD-XXX"

5b. Если есть ready SPEC без DESIGN-PKG (опц. рекомендация):
   → "Можно создать дизайн-пакет: /polisade:design SPEC-XXX (C4/ERD/OpenAPI/ADR)"

6. Если всё `blocked`:
   → "Все задачи заблокированы. Детали выше."

7. Если все рабочие единицы `done`:
   → "Всё завершено! Добавь новую работу: /polisade:feature или /polisade:prd"

8. Если есть `cancelled`/`not_actual`, покажи их отдельно и причину из
   `artifactIndex.status_reason`; не включай в счётчик реализованных задач или
   исправленных багов. Для зависимых TASK с `depends_on:` на такие ID покажи
   «требуется решение PM», даже если все остальные задачи `done`.

9. ADR `not_applicable` показывай отдельно от `accepted`, `deprecated` и
   `superseded`; отсутствие заменяющего решения не превращай в superseded.

## Группировка артефактов

### По возможности действия

| Группа | Артефакты | Следующее действие |
|--------|-----------|-------------------|
| Можно реализовать | BUG, TASK, DEBT (ready) | /polisade:implement или /polisade:continue |
| Можно создать задачи | FEAT, SPEC, PLAN (ready) | /polisade:tasks |
| Нужна проработка | PRD (ready) | /polisade:spec |
| Можно спроектировать | SPEC (ready) без DESIGN-PKG | /polisade:design (опционально) |
| Архитектура | DESIGN-PKG, ADR | информационно — показывает количество в блоке "АРХИТЕКТУРА" |
| Corpus-run | ARCHRUN (waiting_pm / ready) | отдельная секция "CORPUS-RUN" — **НЕ** в "Можно реализовать"; resume через /polisade:design-corpus --resume, не implement |

### Источник строки блока "ПРИЁМКА"

Строка берётся ЦЕЛИКОМ из поля `summary` одной команды и не собирается
своими словами:

<!-- polisade:exec-denied CAPSULE BEGIN -->
> ⛔ **Если вызов скрипта на этом шаге ты СДЕЛАЛ, и он отклонён или не запустился** (`Command references protected path` / `Install directory is read-protected` / `Filesystem Guard` / `the tool's default permission is 'deny'`, отказ песочницы, ненулевой exit без вывода) — **STOP**. Вызова не было — отказа нет: сначала выполни команду; этот блок описывает её вывод и сам ответом не служит.
> Процитируй отказ дословно. НЕ пересказывай по исходнику, что скрипт «сделал бы»; НЕ собирай dry-run вручную; НЕ переходи к apply/push/pr-create.
> НЕ транскрибируй скрипт (прочитать → записать копию в `/tmp` или в проект → запустить копию): копия не байт-идентична — уезжают классы символов в regex, форма возврата функций, пропадают целые функции — и молча меняется набор применённых изменений.
> Отказ инструмента — это отказ, а не результат. Доложи PM дословный текст отказа и назови следствие: без рабочего вызова скрипта этот шаг выполнить нечем. Причину не придумывай — её называет только сам текст отказа.
<!-- polisade:exec-denied CAPSULE END -->

```bash
${POLISADE_PYTHON:-python3} {plugin_root}/scripts/polisade_acceptance.py status --json --root "${POLISADE_WORK_DIR:-.}"
```

Чеки она НЕ исполняет — состояние читается из файла приёмки, зафиксированной
базы и отчёта последнего прогона. Тот же расчёт читают `/polisade:doctor`,
`/polisade:review-pr` и раздел `## Приёмка` в описании PR: четыре собственных
разбора одного файла разошлись бы молча.

Блок печатается ВСЕГДА, включая «приёмка не заведена»: её отсутствие — факт
о проекте, а не пустое место. Пометки `stale` (отчёт снят на другом коде) и
«база разошлась» не глотать — это ровно те два способа, которыми зелёная
приёмка перестаёт что-либо означать.

⛔ **Три формы, и третья обязательна**. Блок печатается так:

| когда | что печатать |
|---|---|
| команда отработала | строку `summary` **ДОСЛОВНО** |
| команда ответила `state: absent` | `приёмка не заведена` |
| команда НЕ отработала | `не удалось определить` + **дословный** отказ |

«Приёмка не заведена» — это ОТВЕТ ИНСТРУМЕНТА, а не заполнитель пустоты.
Замерено на живом прогоне: скрипт не запускался вовсе (ноль вхождений в
логе), модель придумала отказ, привела несуществующую причину, процитировала
капсулу exec-denied как прикрытие — и напечатала «не заведена» на проекте,
где приёмка ЗАВЕДЕНА и где она сама её двумя строками выше увидела.
Отсутствие ответа, отрендеренное как отрицательный ответ, — тот самый класс
F1, ради которого блок и заводился.

Дословная строка `summary` в отчёте и есть свидетельство, что команда
отработала: пересказ своими словами такого свидетельства не даёт.


### Источники цифр для блока "АРХИТЕКТУРА"

- **Active ADRs** — количество ADR со статусом `accepted` в
  `artifactIndex`; `not_applicable` не входит ни в активные, ни в заменённые.
  Если `architecture.activeADRs` или `architecture.deprecatedADRs` всё ещё
  содержит такой ID, покажи предупреждение `adr_outcome_lists` от doctor и
  попроси исправить списки после сверки решения, не включай его в число.
- **Design packages** — количество артефактов с `type == "DESIGN-PKG"` в `artifacts`

### Источники для блока "АРХИТЕКТУРНАЯ ДОКУМЕНТАЦИЯ"

Блок печатается ВСЕГДА — каким путём проект ведёт архитектуру, это состояние
проекта, а не деталь реализации. Две строки, обе с диска и из состояния:

- **Режим** — `settings.experimental.designCorpus` (включён ли живой корпус)
  вместе с `architecture.corpus.mode` (`silo` / `living` — что уже построено).
  Три формы, и третья обязательна:

  | когда | что печатать |
  |---|---|
  | `designCorpus: false` | `silo (живой корпус выключен) — /polisade:design SPEC-NNN` |
  | `designCorpus: true`, а корпуса нет | `корпус включён, но НЕ построен — /polisade:design-corpus SPEC-NNN` |
  | корпус построен | `living (<каталог корпуса>/)` |

  Второе состояние — не «всё в порядке»: корпус не строится сам, и включённый
  режим без корпуса это недоделанный шаг, а не норма.

  ⛔ Каталог корпуса — `architecture.corpus.dir` (умолчание
  `docs/architecture`), а «корпус построен» — это `manifest.yaml` в нём с
  полем `id: ARCH-CORPUS`. Одного файла `manifest.yaml` мало: такой файл есть
  и у пакета `DESIGN-NNN-<slug>/`, и он несёт id пакета. Не читается или
  оказался ссылкой — это «не определено», а не «нет».

  Ту же тройку считает `/polisade:doctor` проверкой `corpus_mode`. **Если
  doctor в этом прогоне запускался, бери формулировку ИЗ НЕГО дословно** —
  два собственных ответа об одном проекте разойдутся, и разойдутся молча.

- **Непереведённые силосы** — каталоги `DESIGN-NNN-*` в каталоге корпуса **без
  маркера `MIGRATED.md`**. Маркер обязателен: перевод на корпус НИЧЕГО из
  силоса не удаляет, поэтому «каталог на месте» само по себе не значит «ещё не
  переведён», и счётчик без этой проверки не убывал бы никогда. При включённом
  корпусе назови число и предложи `/polisade:design-corpus --adopt`. Ноль — так
  и скажи: переводить нечего. Молчание здесь неотличимо от «не смотрели».

### Источники для блока "CORPUS-RUN" (experimental)

- **Corpus mode** — `architecture.corpus.mode` (`silo` / `living`). Блок
  показывается только если `mode == "living"` ИЛИ есть хотя бы один `ARCHRUN-*`.
- **ARCHRUN runs** — артефакты с префиксом `ARCHRUN-` (из `waitingForPM` и
  `readyToWork`). `ready` означает **«resume required»**, а не обычную задачу:
  всегда сопровождай ссылкой `/polisade:design-corpus --resume=<runId>`
  (runId — из `architecture.corpus.pendingRun`). **Никогда не показывай ARCHRUN
  в "Можно реализовать".**

### По статусу

- **ready** — готово к работе
- **in_progress** — в работе
- **waiting_pm** — ждёт ответа PM
- **blocked** — техническая проблема
- **done** — завершено
- **draft** — черновик (не показывать в основном списке)

## Синхронизация

При обнаружении расхождений между файлами и PROJECT_STATE.json:
- Добавь недостающие артефакты в state
- Обнови статусы из frontmatter файлов
- Сообщи о синхронизации: "Синхронизировано N артефактов"

## Важно

- Показывай самую важную информацию первой (баги, блокеры)
- Группируй по возможным действиям, не просто по типам
- Давай конкретные рекомендации с командами
- Не перегружай информацией — PM должен быстро понять что делать