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` не может быть принят пока есть открытые вопросы