$npx -y skills add TserenTserenov/FMT-exocortex-template --skill lesson-closeЗакрыть занятие, открытое скиллом /lesson. Финализирует lesson/YYYY-MM-DD.md (frontmatter status, метаданные времени, длительность), делает commit + push в репо personal-guide. Триггерит замкнутый контур доставки — после push → GitHub webhook → bot oauth_server.py:/webhook/github
| 1 | # /lesson-close — закрыть занятие и замкнуть контур доставки |
| 2 | |
| 3 | > ⚡ **Алгоритм, не диалог.** Шаги 1-5 последовательно. Без вопросов. |
| 4 | |
| 5 | ## When to use |
| 6 | |
| 7 | Закрыть занятие, открытое скиллом /lesson. Финализирует lesson/YYYY-MM-DD.md (frontmatter status, метаданные времени, длительность), делает commit + push в репо personal-guide. Триггерит замкнутый контур доставки — после push → GitHub webhook → bot oauth_server.py:/webhook/github/workbook → sync_one_user_to_dt → ЦД обновляется в Neon. Используй когда пилот говорит «закрываем», «всё», «закончили», «закрой урок» — или после явного завершения задания в /lesson. |
| 8 | |
| 9 | ## Контракт скилла |
| 10 | |
| 11 | - **Вход:** существующий `lesson/YYYY-MM-DD.md` в репо `personal-guide` со статусом `status: in_progress` (создан скиллом `/lesson`). Активный git remote с правом push. |
| 12 | - **Выход:** lesson-файл с финализированным frontmatter (`status: done|partial|skipped`, `finished_at`, `duration_min`) + git commit + git push. На сервере: webhook triggered → `sync_one_user_to_dt(user_id)` → Neon `digital_twins.data['2_collected']` обновлён + событие в `public.domain_event`. |
| 13 | - **Время:** ≤2 мин (быстрая финализация после `/lesson`). |
| 14 | - **Не делает:** не оценивает качество ответа (Оценщик R12 — отдельно, асинхронно); не генерирует assignment на завтра (Портной, ночной рендер). |
| 15 | |
| 16 | ## Algorithm |
| 17 | |
| 18 | ## Шаг 1. Вызов через Маршрутизатор |
| 19 | |
| 20 | ```bash |
| 21 | bash "$IWE_SCRIPTS/route-task.sh" --skill lesson-close --args "<YYYY-MM-DD> [--no-push]" |
| 22 | ``` |
| 23 | |
| 24 | Скрипт `lesson-close.sh` выполняет: |
| 25 | 1. Находит lesson/YYYY-MM-DD.md |
| 26 | 2. Обновляет frontmatter (`status: done`, `finished_at`, `duration_min`) |
| 27 | 3. `git add`, `git commit`, `git push` |
| 28 | |
| 29 | **Если `--no-push` передан** — push пропускается. |
| 30 | |
| 31 | **Если push fails** — скрипт сообщает ошибку; контур замкнётся при ручном `git push`. |
| 32 | |
| 33 | ## Шаг 2. Сообщить пилоту о замыкании контура |
| 34 | |
| 35 | После успешного выполнения: |
| 36 | |
| 37 | ``` |
| 38 | ✅ Урок закрыт. |
| 39 | Статус: <status> |
| 40 | Длительность: <duration_min> мин |
| 41 | Коммит: <short_sha> |
| 42 | |
| 43 | Контур замкнут: |
| 44 | lesson/<date>.md → git push → GitHub webhook → Activity Hub → Neon (ЦД) |
| 45 | Завтрашний assignment Портной отрендерит на свежих данных. |
| 46 | ``` |
| 47 | |
| 48 | Не нужно ждать или проверять, что webhook реально сработал. Он асинхронный, факт push — единственное, что от тебя требуется. Если интересно: проверь логи `[WorkbookWebhook]` в Railway аист-боте. |
| 49 | |
| 50 | ## Шаг 3. Граничные случаи |
| 51 | |
| 52 | | Ситуация | Действие | |
| 53 | |---|---| |
| 54 | | Урок со статусом `done` уже (повторный close) | Сообщи: «Урок уже закрыт. Если нужно переоткрыть — измени status: in_progress вручную или удали finished_at.» | |
| 55 | | Нет git remote / нет прав push | Сообщи и предложи проверить `git remote -v` и `gh auth status`. Финальный коммит локально остаётся. | |
| 56 | | Merge-conflict при push | НЕ разрешать автоматически. Сообщи пилоту: «Кто-то ещё пушил в этот репо. Проверь: `git pull --rebase` и реши конфликт.» | |
| 57 | | Очень короткое занятие (<3 мин) | Записать как обычно, не оценивать. Поле `duration_min` уйдёт в метрику. | |
| 58 | | Длинное занятие (>60 мин) | То же. Метрика покажет реальное время. | |
| 59 | | Пилот хочет сменить тему текущего занятия задним числом | Не редактируй `theme` или `element_id` — это нарушает соответствие assignment ↔ lesson. Если нужно — открой новый lesson вручную. | |
| 60 | |
| 61 | ## Связь с другими механизмами |
| 62 | |
| 63 | - **`/lesson`** — парный скилл, открывает занятие, создаёт lesson-скелет. |
| 64 | - **GitHub webhook** — handler в бот-репозитории (`oauth_server.py`, роут `POST /webhook/github/workbook`). HMAC-секрет = `GITHUB_WORKBOOK_WEBHOOK_SECRET` в env. Регистрируется один раз в `personal-guide` репо: Settings → Webhooks. |
| 65 | - **Активность в Neon:** webhook записывает событие в `public.domain_event` (source=`iwe`, event_type=`lesson_closed`) и триггерит `sync_one_user_to_dt(user_id)` → пишет в `digital_twins.data['2_collected']`. |
| 66 | - **Профайлер (асинхронно):** отдельный сервис пер |