Запуск работы над одной фичей (WIP=1). Авто-запускает test-researcher + user-perspective-critic (dual critique), читает domain-rules.yaml, error-journal, выбирает light/heavy path по размеру. Триггеры — "/feature <id>", "берём feat-X", "поехали по feat-Y".
Scanned 9/6/2026
Install to Claude Code
npx -y skills add andrewcigan/vibe-dev-plugin --skill feature --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Feature?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/andrewcigan-feature)More formats (shields.io, HTML) on the badges page.
---
name: feature
description: Запуск работы над одной фичей (WIP=1). Авто-запускает test-researcher + user-perspective-critic (dual critique), читает domain-rules.yaml, error-journal, выбирает light/heavy path по размеру. Триггеры — "/feature <id>", "берём feat-X", "поехали по feat-Y".
when_to_use: Когда пользователь начинает работу над конкретной фичей из feature_list.json. Это основной рабочий цикл FAST и FULL pipeline.
---
# /feature <feature-id>
Запуск одной фичи. WIP=1 enforced — другую фичу взять нельзя пока эта не passing.
## Pre-flight checks
### Check 0: Enforcement жив? (v6.2 F2; discipline-слой, несущий канал — pre-commit backstop)
```bash
P="$(cat .harness/profile 2>/dev/null)"; HB=.harness/hooks-heartbeat
case "$P" in pending-*) echo "❌ профиль $P не подтверждён живым хуком — enforcement НЕ активен"; esac
[ -f "$HB" ] && [ $(( $(date +%s) - $(awk '{print $1;exit}' "$HB") )) -le 1800 ] \
|| echo "❌ heartbeat несвежий/отсутствует — хуки в этой сессии НЕ работают"
ls .harness/hook-crashes/ 2>/dev/null && echo "⚠️ сторожа падали — см. /doctor"
```
Любая строка с ❌ → **STOP**: запусти `/doctor`, почини активацию, потом возвращайся к фиче.
Работать над фичей при мёртвых сторожах = «харнес не поднялся» (главный провал аудита 06-10).
### Check 1: WIP=1
```bash
# В feature_list.json должна быть ровно одна active или ноль
python3 -c "
import json
d = json.load(open('feature_list.json'))
active = d.get('active')
if active is not None and active != '<this-feature-id>':
print(f'❌ WIP=1 violated: feat \"{active}\" already active. Закрой её через /verify до passing или /handoff с paused.')
exit(1)
"
```
Если нарушено — STOP, скажи пользователю.
### Check 2: Feature существует в captured/up_next
Если фича в `done` — спроси пользователя зачем заново.
Если фича в `superseded`/`rejected` — STOP.
### Check 3: Зависимости
```python
# Если feat.dependencies = ["feat-001", "feat-002"] — все должны быть в done
```
Если нет — предложить взять зависимости сначала.
## Размер и ПОВЕРХНОСТЬ фичи → light/heavy path
Из feature_list.json смотрим `size_estimate` И `surface` (v6.2 F5 — урок П2 аудита:
«зелёные тесты лгут» именно на интерфейсных фичах, которые по размеру проскакивали мимо критика):
- **S (<1 час, ~30 строк, 1 файл)** → **light path** (syntax + scope check, без dual critique)
- **M (1-4 часа, 30-200 строк)** → **medium path** (single critic + verify)
- **L (1+ день, >200 строк)** → **heavy path** (dual critique + 4-layer verify)
**Поверхность ПЕРЕБИВАЕТ размер (монотонно — только ужесточение):**
- `surface: ui` (или интерфейсные файлы в affected_files) → **user-perspective-critic ОБЯЗАТЕЛЕН
при любом размере** + evidence «нажми и подтверди» (layer_4/5) до passing. UI-фича размера S
не существует с точки зрения проверки: кнопку видит пользователь, не линтер.
- `surface: api|job|service|cli` → evidence реального вызова по lane-таблице
([rules/verification-lanes.md](../../rules/verification-lanes.md)) до passing.
- Поле surface заполняй при создании фичи; hook проверит монотонность (заявить `lib`
при .tsx в diff нельзя — файловая эвристика остаётся полом).
## Main flow (heavy path — для L)
> ⚠️ **Порядок enforced хуком, а не дисциплиной.** `hooks/checks/state-transition.sh` БЛОКИРУЕТ
> перевод M/L-фичи в `active`, пока нет `docs/test-strategy.md` с её id. Поэтому критика идёт
> ПЕРВОЙ (фича остаётся в `up_next`), перевод в `active` — последним. Это test-first: стратегия
> проверки рождается до реализации. Закрывает H7 (раньше критику просили «по-доброму» — и пропускали).
### Шаг 1: Параллельный dual critique (фича ещё в up_next)
Запусти 2 subagent **параллельно** через Task tool (детерминированный вариант через Workflow — Шаг 3-bis):
**Agent 1: test-researcher (engineering critique)**
- Читает: feature description, CLAUDE.md, ARCHITECTURE.md, существующий код в affected_files
- Делает: параллельный GitHub-ресёрч «как тестируют похожие фичи»
- Возвращает: 3-7 тестов с verification_commands (1 happy + 2-3 edge + 1-2 error + 1 e2e)
**Agent 2: user-perspective-critic (top-down user perspective)**
- Читает: PRODUCT.md, domain-rules.yaml (особенно invariants, disambiguation_triggers, anti_patterns, target_markets)
- Делает: смотрит на фичу глазами реального пользователя
- Возвращает:
- Какие сценарии test-researcher НЕ покрыл (но пользователь bы делал)
- Какие domain-rules invariants не отражены в тестах
- Top-down вопросы: «оптимизируем по правильной метрике?», «фиксим продукт или тест?», «работает ли при голосовом вводе по-русски?»
### Шаг 2: Synthesizer merge → docs/test-strategy.md (артефакт-gate)
Третий subagent (synthesizer) читает оба выхода и пишет `docs/test-strategy.md`:
- объединённый список тестов; конфликты (engineering X vs user Y) — в пользу user perspective
- **ОБЯЗАТЕЛЬНО упомянуть id фичи** в файле (хук проверяет наличие id — без него active заблокируется)
- final verification_commands → записать в feature_list.json
### Шаг 2-bis: data-model-reviewer (если фича трогает БД-схему)
Если `affected_files` содержит `*/schema/*`, `*/migrations/*`, `prisma/`, `drizzle/`, `supabase/migrations/` ИЛИ `category=data` — **ОБЯЗАТЕЛЬНО** запусти агента `data-model-reviewer` (Opus, fresh context) ПЕРЕД реализацией. Он пишет `docs/data-model-review.md` (недостающие/лишние сущности, упущенные поля, спорные решения, UX-фичи которые врут о связях). Утверждение пользователя по вердикту — gate для старта. Это глобальное правило `~/CLAUDE.md` (модель данных застывает — переделка дороже ревью).
### Шаг 2-ter: Стадия детализации (v8 L2-F2/F3 — обязательна на M/L)
Для **M/L-фичи** (и любой с `detail_required: true`) разложи детальный план в `docs/changes/<feat-id>/` по образцу OpenSpec (шаблон — `templates/change-proposal.md`):
- `proposal.md` — что/зачем + **User Stories с приоритетом P1..Pn**, каждая independently testable, с Acceptance в **Given/When/Then** (это основа `verification_command`). **Минимум одна P1-US с G/W/T** — иначе хук заблокирует переход в active (L2-F3).
- `tasks.md` — чек-лист задач (`- [ ]`); незакрытые блокируют архивацию при `/ship` (L3-F6).
Крупную фичу нельзя протаскивать без разложенного плана (c2). **S-фича** освобождена (light path) — детализация не форсится, пока не помечена `detail_required: true`. Backlog-фичи детали НЕ несут — она ленивая, рождается здесь при взятии в работу (L2-F4).
### Шаг 3: Перевести feature в active (хук теперь пропустит)
```python
# feature_list.json
d['active'] = '<feature-id>'
d['features'][f]['state'] = 'active'
d['features'][f]['started_at'] = today
```
Хук пропустит запись, т.к. для M/L существуют И `docs/test-strategy.md` (Шаг 2), И `docs/changes/<id>/proposal.md` с P1-US (Шаг 2-ter). Если хук заблокировал — не пройдена критика (Шаг 1) ИЛИ детализация (Шаг 2-ter); вернись и доделай.
### Шаг 3-bis (опционально): Workflow-оркестрация критиков
Если в среде доступен **Workflow-инструмент** — критику лучше запускать детерминированным скриптом, а не вручную: `parallel([test-researcher, user-perspective-critic]) → synthesizer пишет docs/test-strategy.md`. Преимущество: скрипт спавнит критиков САМ (не «агент решит и пропустит»), barrier на артефакт. ⚠️ Контракт Workflow-инструмента внутри скилла проверить на первом реальном `/feature` (first-use, как Bash-хук). Гарантия H7 в любом случае — хук active-gate (Шаг 3), Workflow лишь усиливает оркестрацию.
### Шаг 4: Pre-launch checklist (если намечается bulk API)
Если в тестах будут массовые API-вызовы:
- Заполнить `.harness/pre-launch-checklist.yaml` (см. templates)
- Без passing checklist — implementation не стартует
### Шаг 5: Negative-verification gate
Для каждой verification_command — test-researcher специально вводит ошибку в код и проверяет что команда падает. Только потом — её записываем как валидную в feature_list.json. Иначе verification — театр.
### Шаг 6: Test-First (Карпати)
Сначала пишем тесты (red), потом implementation (green), потом refactor. Не наоборот.
### Шаг 7: Implementation в worktree (для L размера)
```bash
git worktree add ../worktrees/<feature-id> -b <feature-id>
cd ../worktrees/<feature-id>
# implementer работает здесь
```
Pre-commit hook проверяет: `diff ⊆ feature.affected_files`. Нарушение = block.
### Шаг 8: Periodic updates
Каждые 10 минут или ключевое событие → запись в SESSION.md секцию «Today». Не молчать.
### Шаг 9: /verify (4-layer)
Когда implementation готова — `/verify`. Прохождение всех 4 уровней = можно ставить state=passing.
## Medium / Light path
**Light (S)**:
- Без dual critique
- Тесты: 1 happy + 1 error (минимум)
- Skip negative-verification gate
- Verify: только layer 1 (syntax) + layer 2 (runtime)
- Без worktree, прямо в main
**Medium (M)**:
- Только test-researcher (без user-perspective-critic в параллель — но quick sanity read domain-rules.yaml)
- 3-5 тестов
- Negative-verification gate включен
- Verify: layers 1+2+3
## Stuck protection (защита от залипания)
Background watcher в init.sh запускается. Считает:
- Время без commit
- Время без test pass
Триггеры:
- 30 мин без progress → prompt в SESSION.md
- 45 мин без progress → auto /stuck
- 2 одинаковых fail подряд → auto параллельный subagent на диагностику (без ожидания /stuck)
## Anti-patterns
- ❌ Брать вторую фичу пока эта не passing (WIP=1 enforced)
- ❌ Скипнуть test-researcher для «маленькой» фичи если она L
- ❌ Помечать passing вручную без verification_command
- ❌ Молчать >10 мин в длинной задаче
- ❌ Расширять scope мимоходом («заодно поправлю смежный файл») — pre-commit hook блокирует
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!