---
slug: material-to-lecture
bok_id: s-expert-bok-authoring
title: 'Из материалов преподавателя — лекция с самопроверкой у его учеников'
description: |
  Собирает из материалов преподавателя (папка `sources/` курса) первую лекцию и самопроверку к ней,
  публикует в его собственную базу на платформе, заводит бесплатный поток и выдаёт ссылку для учеников.
  Потом по запросу показывает, кто из учеников открыл лекцию и прошёл самопроверку. Голос и формулировки —
  преподавателя: навык структурирует, а не переписывает. Работает в локальном агенте с доступом к файлам
  и MCP платформы. Use when: «собери лекцию», «выпусти лекцию ученикам», «кто открыл лекцию», «готово»
  после `teacher-workspace-init`.
kind: pipeline
protocol_version: '1.0'
protocol:
  surfaces:
  - local_agent
  steps:
  - number: 1
    title: Прочитать материалы и цель
    prompt_template: |
      Прочитай всё в `areas/courses/<слаг>/sources/`. Спроси одним вопросом: «Что ученик должен уметь или понимать
      после этой лекции?» — это цель, по ней строится самопроверка. Если материалов нет — попроси положить, не выдумывай.
    expected_output: Прочитанные материалы и цель лекции словами преподавателя
  - number: 2
    title: Собрать лекцию
    prompt_template: |
      Создай `lessons/<слаг-лекции>.md`:
      ```yaml
      ---
      slug: <слаг-лекции>
      title: "<название словами преподавателя>"
      node_type: lesson
      learning_objective: "<цель из шага 1>"
      estimated_minutes: <оценка>
      ---
      ```
      Тело — структура материала преподавателя: 3–7 смысловых блоков, его примеры и формулировки. Правило голоса:
      «сказал бы он это так?» Если звучит как гладкая AI-полировка — верни его версию. Не добавляй фактов, которых нет в материалах.
    expected_output: Файл урока
  - number: 3
    title: Собрать самопроверку
    prompt_template: |
      Создай `self_tests/<слаг-лекции>-check.yaml`: 3–5 вопросов **на цель лекции**, а не на запоминание деталей.
      ```yaml
      slug: <слаг-лекции>-check
      title: "Самопроверка: <название>"
      linked_lesson_slug: <слаг-лекции>
      version: 1
      questions:
        - id: q1
          text: "..."
          type: single_choice          # single_choice | multi_choice | text_short
          options: ["...", "...", "..."]
          correct_indices: [1]
          explanation: "почему так — одной-двумя фразами из материала"
      ```
    expected_output: Файл самопроверки
  - number: 4
    title: Манифест курса и подтверждение
    prompt_template: |
      Создай или обнови `courses/<слаг-курса>.yaml`:
      ```yaml
      slug: <слаг-курса>
      title: "<название курса>"
      is_published: true
      modules:
        - { position: 1, kind: lesson,    ref: <слаг-лекции>,        required: true }
        - { position: 2, kind: self_test, ref: <слаг-лекции>-check,  required: true }
      ```
      Покажи преподавателю лекцию и самопроверку целиком и спроси: «Публикуем так или правим?» Внеси правки.
      После «публикуем» — `git add` этих файлов и коммит «лекция <название>».
      **Инвариант:** при повторных публикациях не меняй `kind`, `ref` и `title` у уже опубликованных элементов —
      по этой тройке платформа узнаёт элемент, и прогресс учеников сохраняется.
    expected_output: Подтверждённые преподавателем файлы и коммит
  - number: 5
    title: Опубликовать в свою базу
    prompt_template: |
      1. `bok_list(scope="mine")`. Если своей базы со слагом из `manifest.yaml` нет — `bok_create(title, description, slug)` без `source`
         (черновик своей базы — бесплатно).
      2. Собери пакет: `git bundle create /tmp/<слаг>.bundle --all` в папке курса, закодируй base64.
      3. `course_publish(bok_id, git_bundle=<base64>, dry_run=true)` → `import_status(job_id)` → покажи план (что создастся).
      4. После согласия — тот же вызов без `dry_run` → `import_status` до `done`. Ошибку импорта покажи дословно и исправь файлы.
    expected_output: Курс с лекцией и самопроверкой опубликован в базе преподавателя
  - number: 6
    title: Поток и ссылка ученикам
    prompt_template: |
      `cohort_create(course_id, name, start_date, end_date)` — бесплатный поток (цену через этот путь не поставить, это по договору).
      `cohort_invite(cohort_id)` → ссылка. Дай преподавателю ссылку и короткий текст для учеников: «Запишитесь по ссылке и откройте
      первую лекцию; преподаватель потока видит, какие материалы вы открыли и прошли». Разослать ученикам — его канал (чат, почта).
    expected_output: Ссылка записи на поток и текст для учеников
  - number: 7
    title: Кто открыл
    prompt_template: |
      По запросу преподавателя — `cohort_progress(cohort_id)`. Покажи таблицу: ученик · открыл лекцию · прошёл самопроверку.
      «Не отслеживается» — ученик выключил наблюдение, это его право; «открыл» видно за последние 30 дней.
      Шаг считается сделанным, когда хотя бы один ученик открыл лекцию. Предложи следующее действие одной фразой
      (например, напомнить тем, кто не открыл), без списка советов.
    expected_output: Кто открыл и кто прошёл; одно следующее действие
created: 2026-09-26
status: draft-v0.1
display_id: EXP-S-Material-To-Lecture
node_type: skill
canonical_source: null
created_from_scratch: true
created_trigger: 'teacher-onboarding-mcp (think_do): org/teacher-activation-is-student-opened-first-lecture'
applied_at: []
related:
- teacher-workspace-init
- workshop-recap-orchestrator
access_tier: public
---
# Из материалов — лекция у учеников

**Результат** (`org/teacher-activation-is-student-opened-first-lecture`): хотя бы один ученик потока открыл лекцию,
и преподаватель видит это по каждому ученику.

**Границы:**
- навык не ставит цену и не публикует в общий каталог — это по договору эксперта;
- материалы и курс живут у преподавателя (git), платформа — место выдачи ученикам;
- голос преподавателя неприкосновенен: структура — да, переписывание — нет.
