Пример 4: полная цепочка PM → interview-me → brainstorming
Самый полный пример: новая фича «ручная закупка» проходит через все три скилла. Показывает как артефакты передаются от скилла к скиллу.
Задача
Добавить команду /manual в Telegram-бот: оператор вводит SKU и количество, система делает закупку у нужного поставщика — без привязки к eBay-заказу.
Масштаб: новый TG-хендлер + логика выбора поставщика + checkout вызов + сохранение в БД. → Нужна вся цепочка.
Шаг 1: /project-manager
Новая сессия.
/project-manager Хочу добавить ручную закупку в Telegram-бот через команду /manual.
Оператор вводит SKU и количество, бот делает заказ у нужного поставщика.
Без привязки к eBay-заказу.
Интервью (5 вопросов)
Q1: Кто использует /manual?
- ✓ Только оператор (я один) — никакой авторизации
- ○ Несколько операторов — нужен список Telegram ID
- ○ Любой пользователь бота
Ответ: Только я, авторизация не нужна.
Q2: Как оператор указывает поставщика?
- ○ Бот спрашивает у какого поставщика заказать
- ✓ Бот сам выбирает по цене и наличию
- ○ Оператор явно указывает поставщика в команде
- ○ Other: ________
Ответ: Автовыбор — как в авто-закупке.
Q3: Нужен ли CVV-аппрув перед оплатой?
- ✓ Да, как в авто-закупке: ✅/❌ в Telegram
- ○ Нет — ручная закупка и так подтверждена командой
- ○ Other: ________
Ответ: Да, CVV-аппрув обязателен.
Q4: Куда пишется результат?
- ✓ В Google Sheets + SQLite как обычный заказ, но без eBay order ID
- ○ Только в Telegram (не в БД)
- ○ В отдельный лист “ручные закупки”
- ○ Other: ________
Ответ: В обычный flow, поле ebay_order_id = NULL.
Q5: Что если поставщик вернул out-of-stock?
- ○ Попробовать следующего поставщика автоматически
- ✓ Сообщить в Telegram, не покупать
- ○ Other: ________
Ответ: Сообщить и остановиться.
Выход: requirements-manual.md
# /manual Command — Requirements
## User Stories
- Как оператор, хочу ввести /manual SKU QTY и получить закупку без eBay-заказа,
чтобы докупить нужный товар вне автоматики.
- Как оператор, хочу CVV-аппрув перед оплатой, чтобы контролировать списание.
## Must Have
- FR-01: /manual SKU QTY запускает закупку
- FR-02: Автовыбор поставщика по цене и наличию
- FR-03: CVV inline approval (✅/❌) как в авто-закупке
- FR-04: Результат в Google Sheets + SQLite, ebay_order_id = NULL
- FR-05: Out-of-stock → уведомление, отмена
## Out of Scope
- Мульти-поставщик fallback
- Отдельный лист для ручных закупок
- Авторизация (только один оператор)
Шаг 2: /interview-me
Новая сессия.
/interview-me requirements-manual.md
Pre-Analysis
Скилл читает:
scripts/telegram_ops_bot.py— хендлеры команд, CVV callback handlersscripts/auto_purchase_bot.py— главный цикл,unified_procure()scripts/unified_procure.py— логика выбора поставщикаscripts/lib/stock_lib.py— схема БД,purchase_ordersтаблица
Обнаружено: unified_procure() принимает ebay_order_id как обязательный параметр. Нужно рефакторить или добавить Optional.
Интервью (4 вопроса)
Q1: unified_procure() рефакторинг
Функция требует ebay_order_id. Для /manual:
- ✓ Сделать ebay_order_id Optional[str] = None
- ○ Создать отдельный
manual_procure()(дублирование) - ○ Передавать fake ID типа “MANUAL-12345”
Ответ: Optional — минимальный diff.
Q2: Telegram state machine
/manual требует диалога (спросить SKU, потом QTY, потом ждать CVV). Как?
- ✓ ConversationHandler (уже есть в боте для других диалогов)
- ○ Inline keyboard с шагами
- ○ Одна команда с аргументами: /manual SKU QTY
Ответ: Один вызов /manual SKU QTY — без диалога. Проще.
⚠️ SECURITY HARD-BLOCK
СТОП. Категория: Authorization.
Бот публичный? Если да — любой кто знает Telegram ID бота может отправить /manual.
Telegram ID бота не является секретом. Если бот не проверяет chat_id отправителя — любой может инициировать закупку.
- ✓ Добавить проверку chat_id в хендлере /manual
- ○ Оставить без проверки — бот в приватном чате
Ответ: Добавить chat_id whitelist из env-переменной TELEGRAM_ADMIN_CHAT_ID.
[interview-me]Записываю в Decisions Log: авторизация через TELEGRAM_ADMIN_CHAT_ID обязательна. Продолжаю.
Q4: БД schema
purchase_orders таблица — нужны изменения?
- ✓ ebay_order_id сделать nullable (уже nullable в SQLite)
- ○ Новая колонка
is_manual BOOLEAN - ○ Отдельная таблица manual_purchases
Ответ: ebay_order_id nullable — уже так в SQLite. Ничего не менять.
Выход: spec-manual.md
# /manual Command — Implementation Spec
## Decisions Log
| # | Вопрос | Решение |
|---|--------|---------|
| D-1 | unified_procure | ebay_order_id=Optional[str]=None |
| D-2 | TG flow | /manual SKU QTY без диалога |
| D-3 | Authorization | chat_id whitelist из TELEGRAM_ADMIN_CHAT_ID |
| D-4 | БД | ebay_order_id уже nullable, ничего не менять |
## Security
⚠️ TELEGRAM_ADMIN_CHAT_ID обязателен в .env — без него /manual отклоняет всех.
## Tasks
- [ ] unified_procure.py: ebay_order_id=None
- [ ] telegram_ops_bot.py: добавить /manual хендлер с chat_id check
- [ ] .env.example: добавить TELEGRAM_ADMIN_CHAT_ID
- [ ] Тест: dry-run с реальным SKU
Шаг 3: superpowers:brainstorming (опционально)
Нетривиальный вопрос: как красиво отображать прогресс закупки в Telegram (step-by-step сообщения vs одно финальное)?
Новая сессия, Plan Mode:
[Plan Mode]
Посмотри spec-manual.md. Один вопрос по UX: как показывать прогресс
/manual закупки в Telegram — обновлять одно сообщение или слать новые?
Brainstorming сравнивает два подхода:
| Edit message | New messages | |
|---|---|---|
| UX | Чисто, одно место | Видна история шагов |
| Telegram API | editMessageText |
sendMessage |
| На ошибке | Сообщение показывает последний шаг | Все шаги видны |
| Рекомендация | ✓ |
Вывод: Edit message — более чистый UX для статус-апдейтов.
Шаг 4: writing-plans + executing-plans
[Plan Mode]
На основе spec-manual.md напиши план реализации /manual команды.
→ Детальный план по файлам и шагам → executing-plans → код с checkpoints.
Итог: что дала цепочка
| Скилл | Что добавил |
|---|---|
| /project-manager | Убрал ненужный диалог (один вызов), определил что ebay_order_id=NULL |
| /interview-me | Нашёл security hole (авторизация), определил минимальный diff (Optional, не форк) |
| brainstorming | Выбрал UX-паттерн для Telegram (edit vs new) |
Без цепочки: реализовали бы диалог, забыли про авторизацию, выбрали бы UX наугад.
| ← Пример 3: brainstorming | ← Примеры |