agentsclimarketplace

Lesson close

Skill TserenTserenov/FMT-exocortex-template/.claude/skills/lesson-close

Закрыть занятие, открытое скиллом /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.From its SKILL.md

Install
npx -y skills add TserenTserenov/FMT-exocortex-template --skill lesson-close

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

SKILL.md

8.1 KB, ~1.8k tokens by cl100k_base, as published. Nobody here has run it

/lesson-close — закрыть занятие и замкнуть контур доставки

Алгоритм, не диалог. Шаги 1-5 последовательно. Без вопросов.

When to use

Закрыть занятие, открытое скиллом /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.

Контракт скилла

  • Вход: существующий lesson/YYYY-MM-DD.md в репо personal-guide со статусом status: in_progress (создан скиллом /lesson). Активный git remote с правом push.
  • Выход: 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.
  • Время: ≤2 мин (быстрая финализация после /lesson).
  • Не делает: не оценивает качество ответа (Оценщик R12 — отдельно, асинхронно); не генерирует assignment на завтра (Портной, ночной рендер).

Algorithm

Шаг 1. Вызов через Маршрутизатор

bash "$IWE_SCRIPTS/route-task.sh" --skill lesson-close --args "<YYYY-MM-DD> [--no-push]"

Скрипт lesson-close.sh выполняет:

  1. Находит lesson/YYYY-MM-DD.md
  2. Обновляет frontmatter (status: done, finished_at, duration_min)
  3. git add, git commit, git push

Если --no-push передан — push пропускается.

Если push fails — скрипт сообщает ошибку; контур замкнётся при ручном git push.

Шаг 2. Сообщить пилоту о замыкании контура

После успешного выполнения:

✅ Урок закрыт.
Статус: <status>
Длительность: <duration_min> мин
Коммит: <short_sha>

Контур замкнут:
  lesson/<date>.md → git push → GitHub webhook → Activity Hub → Neon (ЦД)
  Завтрашний assignment Портной отрендерит на свежих данных.

Не нужно ждать или проверять, что webhook реально сработал. Он асинхронный, факт push — единственное, что от тебя требуется. Если интересно: проверь логи [WorkbookWebhook] в Railway аист-боте.

Шаг 3. Граничные случаи

СитуацияДействие
Урок со статусом done уже (повторный close)Сообщи: «Урок уже закрыт. Если нужно переоткрыть — измени status: in_progress вручную или удали finished_at.»
Нет git remote / нет прав pushСообщи и предложи проверить git remote -v и gh auth status. Финальный коммит локально остаётся.
Merge-conflict при pushНЕ разрешать автоматически. Сообщи пилоту: «Кто-то ещё пушил в этот репо. Проверь: git pull --rebase и реши конфликт.»
Очень короткое занятие (<3 мин)Записать как обычно, не оценивать. Поле duration_min уйдёт в метрику.
Длинное занятие (>60 мин)То же. Метрика покажет реальное время.
Пилот хочет сменить тему текущего занятия задним числомНе редактируй theme или element_id — это нарушает соответствие assignment ↔ lesson. Если нужно — открой новый lesson вручную.

Связь с другими механизмами

  • /lesson — парный скилл, открывает занятие, создаёт lesson-скелет.
  • GitHub webhook — handler в бот-репозитории (oauth_server.py, роут POST /webhook/github/workbook). HMAC-секрет = GITHUB_WORKBOOK_WEBHOOK_SECRET в env. Регистрируется один раз в personal-guide репо: Settings → Webhooks.
  • Активность в Neon: webhook записывает событие в public.domain_event (source=iwe, event_type=lesson_closed) и триггерит sync_one_user_to_dt(user_id) → пишет в digital_twins.data['2_collected'].
  • Профайлер (асинхронно): отдельный сервис пересчитывает 3_derived на основе обновлённого 2_collected. Запускается отдельным cron.
  • Портной (следующий рендер): утром скилл /personal-guide-render (или ИИ-агент-носитель WP-149 Block D) читает свежий ЦД → новый daily/<завтра>.md.

Антипаттерны

  • ❌ Не делать commit без push, если --no-push не передан — контур не замкнётся
  • ❌ Не редактировать тело lesson-файла (только frontmatter) — ответы пилота неприкосновенны
  • ❌ Не пересоздавать lesson при повторном close — выйдет дубликат истории
  • ❌ Не разрешать merge-conflict автоматически — может затереть незакоммиченные ответы
  • ❌ Не «ждать ответ webhook» — он асинхронный, неблокирующий
<!-- USER-SPACE --> <!-- /USER-SPACE -->

What ships with it

Read from the repository

Just SKILL.md. No reference files, no scripts.

Keep looking

Skills are one crate of 325,949. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.