close_lesson_loop
Close a lesson's teaching loop: mark it as completed after all submissions are graded and cognitive updates are recorded, with optional changelog receipt.
Instructions
把一节课的教学闭环收口: 写回执 (§5, 逐条列出本轮动了哪里) + 把这节课的 lesson_progress 置为 closed (§6 "已回课"终态, 由批改完成+回执送达触发, 不可逆——已 closed 的课再调用本工具会报错)。一次判决原则: 关课不产生新判决——判决齐不齐由 closure_progress 核对。receipt 现在是可选的 (2026-07-26): 它曾是"给学习者的 changelog", 但学习者侧的回执渲染卡已于 2026-07-22 退役 (行项退役案 — 行项是记账动词, 对学习者零价值; 已回课由课页的 已回课 徽标传达), 这份 changelog 现在没有读者, 不再强制老师写。想留档就照旧传, 每条 description 指认"动了哪里", 不重新评讲、不复述判决内容; 传了就仍然按老规矩验 (ref_id 悬空照拒)。注意: 本课若有已完成的 Live 课, 闸门 ④ 仍然要求一条引用其 snapshot/场评 的回执 —— 那种课上不传 receipt 是关不掉的。receipt 的每条 kind 必须落在封闭枚举内 (七种, 没有第八种): exercise_feedback(指认某份提交已批改, ref_id 指 submission——评语和分数的判决本体在 grade_exercise 记录上, 此处不复述评语、不重新打分) / forward_revision(前方课修订) / teacher_note(学习中的课的老师注) / erratum(已学完的课的勘误补丁) / flashcard_change(闪卡增删) / hypothesis_update(假设修订) / journal_entry(journal条目)。枚举外的 kind 一律打回——这是"不许发明新黑箱"的机器化, 不要绕过。 空转防护: 关课服务端强制四检——① 本课有已提交未批改的作业则拒关(先 grade_exercise 还债); ② 关课须带认知更新(post_lesson_evaluation 或指向真实假设的 hypothesis_update 回执), 皆无则须传 no_cognitive_update_reason; ③ 每条 ref_id 必须指向真实记录(悬空 ref 拒关); ④ 本课有已完成 Live 课则 回执须有一条 kind=journal_entry 引用其 snapshot。回执自带闭环进度——不用另查状态机。
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| receipt | No | 可选 (2026-07-26 起; 渲染面已退役, 见工具说明), 每条 {kind, description, ref_id?}。省略或传空数组都算"本次不留 changelog"; 传了的每条仍走全套校验。 | |
| lesson_id | Yes | 必须是已存在的 lesson id(server 会查存在性) | |
| idempotency_key | No | 可选。幂等键 (建议 uuid) —— 同一 key 重放此调用返回首次结果, 不重复写入. 网络重试/断线重连时带上同一个 key, 而不是猜"上次到底写没写". | |
| no_cognitive_update_reason | No | 可选逃生舱 (空转防护 check ②): 本课确无认知更新时, 显式声明原因。仅在既无 post_lesson_evaluation 也无 hypothesis_update 回执时需要; 提供后写入关课记录 (lesson_progress)。 |