questions · git:20260907.ad5db37 · 2026-09-07 · sha256 54b257a096a836a4

questions git:20260907.ad5db37A

Immutable. This exact content is served forever at /api/v1/blob/54b257a096a836a4.

---
name: questions
description: Show and manage open questions across all artifacts
---

# /polisade:questions — Открытые вопросы по артефактам

Показывает все открытые вопросы (OQ-*, Q-*) из PRD, SPEC, FEAT и DESIGN артефактов. Позволяет отслеживать и закрывать вопросы.

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

```
/polisade:questions                 # Все открытые вопросы
/polisade:questions PRD-001         # Вопросы конкретного артефакта
/polisade:questions close OQ-01     # Закрыть вопрос (обновить статус в файле)
```

## Алгоритм

### Просмотр вопросов

1. Запустить скрипт диагностики:

<!-- 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 дословный текст отказа и сошлись на #127 (доставка скриптов в проект).
<!-- polisade:exec-denied CAPSULE END -->

```bash
${POLISADE_PYTHON:-python3} {plugin_root}/scripts/polisade_doctor.py {project_root} --questions --format=json
```

2. Распарсить JSON.
3. Если указан конкретный артефакт — отфильтровать.
4. Вывести в box-формате.

### Закрытие вопроса (`close`)

1. Запустить скрипт с `--format=json`, найти вопрос по ID.
2. Открыть исходный файл артефакта.
3. Найти строку таблицы с данным ID.
4. Заменить статус на `closed` (или `Закрыт` если статусы на русском).
5. Сохранить файл.
6. Показать обновлённый список.

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

```
═══════════════════════════════════════════
OPEN QUESTIONS
═══════════════════════════════════════════

PRD-001 (PRD)
──────────────────────────────────────────
  OQ-01    open     J. Smith             2026-04-20
           Точный механизм подписки: pub/sub или polling?
  OQ-03    open     A. Johnson           2026-04-25
           Какие данные подпадают под 152-ФЗ?

SPEC-001 (SPEC)
──────────────────────────────────────────
  Q-001    open     Архитектор           2026-04-15
           Оптимальный формат хранения: JSON vs Protobuf?

══════════════════════════════════════════
Total: 5 questions, 3 open
══════════════════════════════════════════
```

### Integration Status (дополнительный блок)

Если в проекте есть SPEC с non-empty `external_systems`, после основного списка
вопросов добавь агрегированный блок:

```
──────────────────────────────────────────
INTEGRATION STATUS
──────────────────────────────────────────
External Systems: N total
  ✓ With contract: K
  ✗ Without contract: M
  ? Missing SLA/timeout in §7.0: L

Recommendation:
  → Закройте OQ/Q по контрактам перед /polisade:tasks
──────────────────────────────────────────
```

Чтобы получить эту информацию:
1. Прочитай SPEC файлы с non-empty `external_systems`
2. Для каждой external_system проверь:
   - `contract_ref` указан и файл существует → "With contract"
   - `contract_ref` пуст или файл не найден → "Without contract"
3. Проверь §7.0 Integration Matrix: если timeout или NFR ref пусты → "Missing SLA/timeout"

## Откуда берутся вопросы

Скрипт сканирует markdown-таблицы в артефактах и извлекает строки с ID-паттерном `Q-NNN` или `OQ-NNN`.

| Артефакт | Директория | ID-паттерн | Формат таблицы |
|---|---|---|---|
| PRD | `docs/prd/` | OQ-NN | ID, Вопрос, Ответственный, Срок, Статус |
| SPEC | `docs/specs/` | Q-NNN | ID, Question, Owner, Due, Status |
| FEAT | `backlog/features/` | OQ-NN | ID, Вопрос, Ответственный, Срок, Статус |
| DESIGN | `docs/architecture/DESIGN-*/` | Q-NNN | ID, Question, Owner, Due, Status |

<!-- polisade:silo-legacy POINTER — канон «Силос → корпус» живёт в /polisade:design -->
> **Силос ≠ корпус.** Источник правды по архитектуре — живой корпус
> `docs/architecture/`; пакет `DESIGN-NNN-<slug>/` — legacy-силос. Прочитал
> файл из силоса — скажи об этом вслух (переходное чтение). Полный канон —
> `/polisade:design`, блок «Силос → корпус»; перевод силоса на корпус —
> `${POLISADE_PYTHON:-python3} scripts/polisade_migrate_silo.py <пакет>` (dry-run по умолчанию).

### Integration Questions

Помимо явных OQ/Q из таблиц, `/polisade:questions` проактивно проверяет:
- SPEC с `external_systems` → есть ли §7.0 Integration Matrix?
- Каждая запись `external_systems` → есть ли `contract_ref`?
- §7.0 → каждая строка имеет timeout и NFR ref?

Эти проверки НЕ создают новые вопросы, а подсвечивают пробелы в блоке Integration Status.

## Статусы вопросов

| Статус | Значение |
|---|---|
| `open` / `Открыт` | Вопрос ожидает ответа |
| `in_progress` / `В работе` | Ответственный работает над ответом |
| `waiting_pm` | Ожидает решения PM |
| `blocked` | Заблокирован внешней зависимостью |
| `closed` / `Закрыт` / `resolved` / `Решён` | Вопрос закрыт |

## Важно

- **Источник правды — артефакты.** Вопросы живут в исходных файлах (PRD, SPEC и т.д.), не в отдельной базе
- Чтобы закрыть вопрос — обновляется статус в исходном файле
- Связано с `/polisade:doctor` (использует тот же скрипт)
- SPEC со статусом `waiting_pm` не может быть принят пока есть открытые вопросы