Koder CLI 0.4.12 · 180课版课堂

Koder CLI 完整教程（文字版）
在终端里直接运行 koder learn，可以在练习场里边看边动手。
这份文字版按「Windows PowerShell」来写；换别的系统：koder learn --print --os powershell|cmd|mac|linux

━━ 第 1 课 / 共 180 课 · 开场：欢迎来到 Koder 训练营 ━━
教练 › 嗨，我是 Koder 教练。完整课堂共180课。前30课保留内置练习场，后150课是分单元讲解与自行实操；阅读不会自动连接账号或发布。
  · 教程会在系统临时目录里生成一个练习场：一个故意留了 bug 的小购物车项目，下课自动删除。
  · 第一课会识别你用的是 PowerShell、CMD、macOS 还是 Linux，后面的命令都按它来写；也可以输入数字换成别的系统。
教练 › 内置教练演示不用配置模型、不调用付费 API：替你干活的是我这个“教练模型”，台词提前写好了，演技有限，请多包涵。但改文件、跑命令都是真的，走的就是 Koder 平时用的那套内核。
  提示 · 操作方式：回车 = 下一步；b = 回上一课；q = 随时退出（进度会记住）；输入数字 = 跳到那一课。
  提示 · 复制粘贴：Windows Terminal 里选中文字按 Ctrl+C 复制、Ctrl+V 粘贴（没选中文字时 Ctrl+C 是“取消”）；老式的黑框控制台点鼠标右键就是粘贴。
  提示 · 嫌命令难记？随时输入 koder setup（对话里输入 /setup），用方向键或者鼠标点一点，语言、模型、配色就全配好了。
  （小声）别紧张，这里没有考试，只有彩蛋。
教练 › 深入学习 · 建议 25 分钟（含自行练习，不是运行时限）
       目标：分清系统终端、Koder 对话与练习场；完成第一次离线练习，并知道作品放在哪里。
  提示 · 准备：准备一个可复制粘贴的终端。先阅读安装说明；已经装好则不必重装。练习场是临时目录，毕业时选择保留才会留下文件。扩展作业使用自己的独立目录，不放在安装目录。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 在系统终端运行 koder --version，记下版本。再运行 koder help。
          应看到：能看到实际版本和命令列表；命令不存在时先按第16课排查安装入口。
教练 › 2. 运行 koder learn；在第一课选择自己正在使用的 PowerShell、CMD、macOS 或 Linux。
          应看到：出现练习场路径。这里的教练不调用付费模型，但文件修改和测试确实发生在练习场。
教练 › 3. 回车前进，输入 4 跳到差异课；练习拒绝一次、接受一次。输入 q 离开，再运行 koder learn。
          应看到：重新进入时能继续进度；退出默认清理练习文件，进度与文件不是同一回事。
教练 › 4. 要做自己的项目，离开教程后运行 koder project create "Learning Site" --kind website，再看 koder project list --json。
          应看到：新项目有独立目录。按返回路径打开项目，不猜目录名，也不把教程临时路径当正式项目。
教练 › 遇到问题怎么处理
  提示 · q 退出后找不到购物车文件 → 这是练习场清理，不是作品丢失；需要留存时到毕业课明确选择保留。
  提示 · 把 /setup 输入系统终端 → 先运行 koder 进入对话，或直接用系统命令 koder setup。
教练 › 动手作业：交一张学习记录：版本、终端类型、正式项目路径、教程临时路径。说明哪些步骤离线，哪些步骤需要自己的模型。
       自查标准：四项都能从实际输出查到；learn 的脚本教练离线，普通 ask/run 使用配置的模型。临时练习目录不能当持久交付。
教练 › 开发者教学 · 设计、实现与验收
       建立验收记录：命令、版本、工作目录、退出码、产物路径。
       先跑本课程附带的 cart-lab 的 node --test，确认测试发现故意植入的问题；再让 Koder 修复并比较差异。
       验收须同时有失败基线、修后测试和文件内容；不要把“模型说修好了”当证据。
       教学材料、示例代码与真实账号验收分开记录。
  提示 · 延伸阅读（随安装包 docs/）：INSTALLATION.md、START-HERE.zh.md、START-HERE.en.md

━━ 第 2 课 / 共 180 课 · 认识开屏和提示符 ━━
  · （这里会显示开屏：左边是 KARMEN 折光体，右边是 KODER 和 KARMEN LOOP。）
教练 › 左边这位是 KARMEN 折光体，我们官网上的吉祥物，形状和官网用的是同一条曲面；右边是 KODER 和 KARMEN LOOP，下面列着当前用的模型、引擎、目录和常用命令。它不是装饰——好吧，主要是装饰，但它确实很好看。
  提示 · 框线和折光体乱成一团？多半是老式控制台的中文字体把方块字画成了两格宽。Koder 会自动换成纯字符画，也可以在 koder setup 里把「开屏样式」改成纯字符。最好的办法是换 Windows Terminal：Windows 11 自带，Windows 10 可以在 Microsoft Store 免费装。
    $env:KODER_ASCII = "1"; koder
        只在这个窗口里强制纯字符开屏
教练 › 开屏下面是提示符，它会告诉你现在的状态：
    koder ›
        在这里直接输入任务，比如：把 README 里的错别字改掉
    koder[code] ›
        方括号里是当前模式
    koder! ›
        感叹号表示自动确认开着，要格外小心
教练 › 提示符显示 koder[plan]! › ，下面哪个说法对？
    1. 计划模式，而且自动确认开着
    2. 计划模式，刚刚出错了
    3. 代码模式，感叹号是因为它很兴奋
  答案：1。满分。方括号是模式，感叹号是自动确认。
教练 › 深入学习 · 建议 20 分钟（含自行练习，不是运行时限）
       目标：认清当前目录、模型与模式，并能在同一窗口找到帮助，不把提示符当任务结果。
  提示 · 准备：先完成第1课；把窗口放宽到至少80列。准备一条无敏感内容的任务。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 运行 koder；先看开屏的版本、模型、目录，不急着输入任务。
          应看到：目录应是你想工作的项目；模型名字是配置，不证明接口已连通。
教练 › 2. 输入 /help；再输入 /setup 查看设置，退出设置返回原对话。
          应看到：帮助与设置在当前命令窗口打开，不需要再开一个 Koder。
教练 › 3. 空输入时按 /，方向键选择，按 Tab 填入；先编辑草稿，再回车提交。
          应看到：选择只填草稿；Esc 可关闭。不能弹出时按提示改用 /help 或补全。
教练 › 4. 在另一个窗口进入不同项目，分别运行 koder，再查看各自目录。
          应看到：两个窗口应各做各的任务；明确共享同一会话时的占用提示要保留原文排查。
教练 › 遇到问题怎么处理
  提示 · 框线错位、菜单折行 → 先扩大窗口或在 Setup 改纯字符开屏；不要因界面错位重置模型配置。
  提示 · 只有一个窗口却显示会话占用 → 记录版本和会话名，核查是否还有常驻或另一终端；不要直接删除整份历史。
教练 › 动手作业：截取不含密钥的开屏，标出版本、工作目录、模型与模式；用菜单填一条草稿后取消，不发送。
       自查标准：能指出配置与真实执行的区别；草稿取消后没有新增模型任务，也没有文件改动。
教练 › 开发者教学 · 设计、实现与验收
       把输入行为看作事件：选择、填草稿、提交、取消必须分开。
       在80×24与窄终端各检查一次菜单；窄终端降级可读，不应输出半截控制序列。
       对非TTY/JSON调用，检查输出没有开屏动画和交互菜单；用两个独立项目验证会话边界。
  提示 · 延伸阅读（随安装包 docs/）：PROMPT_PREFILLS.md、MULTI-WINDOW.md、SESSION-INPUT-AND-SKILLS.zh.md、SESSION-INPUT-AND-SKILLS.en.md

━━ 第 3 课 / 共 180 课 · 配置模型：给 Koder 装上大脑 ━━
  提示 · 模型页现在会自动获取当前账号的最新型号；进入‘当前账号最新型号’选择后才保存。列表不是通行证，工具能力仍请运行 koder model test --tools。自动获取可关闭，也可用 koder model refresh 手动刷新。
教练 › Koder 自己不会思考，它需要接一个大模型。最省事的是设置界面：
    koder setup
        方向键或鼠标选服务商、选型号，再把密钥粘进去；还能一键打开拿密钥的网页
教练 › 喜欢敲命令也行。密钥建议放进环境变量，配置里只记变量名：
    setx OPENAI_API_KEY "sk-你的密钥"
        永久存进你的账户，之后新开的窗口才读得到
    $env:OPENAI_API_KEY = "sk-你的密钥"
        只在当前窗口有效，关掉就没了
    koder model set --preset chatgpt --key-env OPENAI_API_KEY
        用预设，配置里只记变量名
    koder model set --preset local --model qwen3:8b
        用本机 Ollama，不需要密钥
    $env:KODER_MODEL = "gpt-6.1-sol"; $env:KODER_BASE_URL = "https://api.openai.com/v1"; $env:KODER_API_KEY = "sk-…"; koder review
        在 CI 里直接用环境变量
  提示 · koder model presets 能查看当前可用预设；koder model show 看当前配置，密钥只露最后四位。
  （小声）把密钥直接敲进命令要小心：PowerShell 会把敲过的每条命令存进 PSReadLine 的历史文件，记性比你前任还好。所以最推荐在 koder setup 里粘贴——屏幕上只显示末四位，也不进命令历史，但会明文保存在本机配置。环境变量命令也可能进入历史，不要分享含密钥的记录。
教练 › 今天练习场用的是教练模型，所以这一课只看不做。毕业以后再去配真的。
  · 可以现场运行 koder model presets 看全部预设。
教练 › 深入学习 · 建议 35 分钟（含自行练习，不是运行时限）
       目标：使用自己账号支持的服务、协议和型号建立连接，分别验证文本与工具续答。
  提示 · 准备：准备服务商控制台里的产品类型、模型ID和官方Base URL。密钥只在专用输入框或秘密管理器里提供，不贴到聊天。真实诊断可能收费。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 运行 koder setup，选择模型设置；先选国内/国际、按量API/套餐，再选型号。
          应看到：产品与密钥来源一致；灰色入口停用，不要把网页会员当API额度。
教练 › 2. 输入密钥后保存；运行 koder model show，核对模型、协议和地址。
          应看到：配置值符合控制台；分享输出前确认敏感信息已遮盖。
教练 › 3. 运行 koder model test；成功后再运行 koder model test --tools。
          应看到：分别保存两次结论；文本成功、工具失败时不能认定编程代理全通。
教练 › 4. 运行 koder model presets；需要检查某入口的模型信息时用 koder model models <预设ID>，以本机帮助和控制台为准。
          应看到：发现结果与可用权限分别核查；自动更新型号信息不会给账号新增额度。
教练 › 遇到问题怎么处理
  提示 · HTTP 401/403 → 核对账号地区、产品、授权和密钥有效期，不循环重试。
  提示 · 422且含1026/1027 → 这是MiniMax内容过滤信号；按第22课缩小输入、开新会话诊断，不当断网处理。
教练 › 动手作业：填写一张不含密钥的连接卡：预设ID、模型ID、协议、Base URL、文本测试、工具测试、费用来源。
       自查标准：每项都有配置或实际输出依据。没有执行的测试写 NOT_RUN；不能用“应该支持”补通过。
教练 › 开发者教学 · 设计、实现与验收
       CI优先用 --key-env VARIABLE_NAME 引用秘密变量，不把Key值写入参数。
       分别准备成功、401、429、5xx、内容过滤与工具协议错误的本地桩；断言错误分类和脱敏信息。
       model test 是短诊断，不照搬长任务重试预算；真实请求和桩测试分别记账。
  提示 · 延伸阅读（随安装包 docs/）：PROVIDERS.md、MODEL-DISCOVERY.zh.md、MODEL-DISCOVERY.en.md、MINIMAX-CONTENT-REVIEW.md

━━ 第 4 课 / 共 180 课 · 第一个任务：看懂差异，决定写不写 ━━
教练 › 练习场里的 cart.mjs 算总价时忘了乘数量，测试一直挂着。我们让 Koder 来修。
教练 › 默认交互模式下，Koder 改文件之前先给你看差异：以 - 开头的红色行会被删掉，以 + 开头的绿色行会加进来。本课需要输入 y 才写入，输入别的就作罢；开启 --yes 会自动批准普通修改。
  （小声）看差异就像看体检报告：绿色是新长的肌肉，红色是减掉的赘肉，确认没切错地方再签字。
  提示 · 等会儿 Koder 问“接受这个修改？”时，建议先输入 n 拒绝一次，体验一下反悔的快乐；它会再提一次，那时再输入 y。
  · 动手：输入任务，教练模型提出修改；先输入 n 拒绝一次，再输入 y 接受，然后亲眼看到文件被改。
教练 › 练习场采用逐项确认，让你看清每一步。实际使用默认智能判断：低风险命令与普通项目修改自动运行；敏感操作可选择始终允许。/permissions execution status 查看，ask 切回逐项确认，reset 撤销全部设置。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：把一句模糊要求改成可验证交付；看清每一处差异，拒绝或批准后核实磁盘。
  提示 · 准备：用教程购物车或附带cart-lab，不直接拿重要工程练手。自建项目先记录未提交改动，别覆盖原有工作。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 输入任务：“修复购物车总价，数量必须参与计算；保留其他功能，补空购物车测试，运行 node --test。”
          应看到：目标包含范围、约束和验收命令；任务不能只有“优化一下”。
教练 › 2. 查看拟修改文件与差异，第一次选择拒绝。
          应看到：拒绝后原文件仍相同；不能只看聊天里一行“没改”。
教练 › 3. 再次执行，确认只改目标函数和相关测试后批准。
          应看到：写入发生在指定项目；不顺手全仓格式化，不添加无关依赖。
教练 › 4. 自己打开文件，运行检查，并让 Koder 列出修改、验证结果和未完成项。
          应看到：文件内容、测试输出、最终汇报三者一致；失败时保留原始输出。
教练 › 遇到问题怎么处理
  提示 · 只回答了思路，没有落盘 → 改用执行任务并指定文件与验证命令；先确认当前不是只读ask或计划模式。
  提示 · 出现未知执行结果 → 先检查文件和回执，不要求把已完成操作全部再做一次。
教练 › 动手作业：为cart-lab加一个数量为0的用例，再修复实现；提交修前失败、修后通过和最终差异。
       自查标准：空数组为0，200分×3件加150分×1件为750分，0件贡献0；保留已有测试。
教练 › 开发者教学 · 设计、实现与验收
       把用户需求拆成输入、输出、边界值与不变量。优先写能抓住真实bug的测试，而不是复制实现。
       用git diff --check检查空白问题、git diff核范围；测试成功也要检查有没有偷偷删除断言。
       交付记录包含工作区、文件、测试命令和退出码；模型最终文字不能代替文件。
  提示 · 延伸阅读（随安装包 docs/）：CONTENT-QUALITY.zh.md、CONTENT-QUALITY.en.md、CLI-CONTRACTS.md

━━ 第 5 课 / 共 180 课 · 命令确认：跑测试，也拦下可疑命令 ━━
教练 › 改完代码当然要跑测试。运行项目代码属于敏感操作，默认先询问；node --version 这类低风险检查会自动执行。
  提示 · 判断标准：看得懂、只影响当前项目、能撤销，就放行。Remove-Item -Recurse -Force、rd /s /q、del /s /q、irm … | iex、git push --force 这类命令要先确认来源与具体影响；来路不明的脚本直接拒绝。官方安装器也应先核对地址、许可和校验信息。
  提示 · 在 Windows 上，Koder 替你跑的命令交给 CMD 执行，不是 PowerShell。要用 PowerShell 的写法，就写成 powershell -NoProfile -Command "…"。
  （小声）命令确认这一步，请拿出你核对外卖账单的认真劲儿。
  · 动手：教练先请求运行 node test.mjs（可以允许），再请求一条 irm … | iex（必须拒绝；就算你误点了 y，教练也会拦下）。
教练 › 命令的输出会原样交回给模型，它看得到测试结果，再决定下一步。
教练 › 深入学习 · 建议 25 分钟（含自行练习，不是运行时限）
       目标：区分普通检查、敏感操作和系统权限；会拒绝危险命令，也会处理长任务。
  提示 · 准备：只使用一次性练习目录。阅读命令时同时看工作路径、目标地址、输入输出文件，不能只看命令开头。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 让Koder运行项目测试，阅读“准备运行命令”下的完整命令。
          应看到：知道要执行什么、在哪里执行、是否会写入或访问网络。
教练 › 2. 批准本次测试；遇到下载后直接执行的陌生脚本时拒绝。
          应看到：拒绝不是任务失败；原文件与授权范围保持不变。
教练 › 3. 在 Setup 查看审批策略；运行 koder permissions status 看电脑授权。
          应看到：full审批和系统权限是两层；--yes不会代开电脑、发信或GitHub写入确认。
教练 › 4. 长任务先确认合理等待时限；超时后核对进程、日志和产物，再决定继续或取消。
          应看到：超时不是已回滚；后台 started 也不等于安装完成。
教练 › 遇到问题怎么处理
  提示 · EXECUTION_PERMISSIONS_INVALID → 先看Koder权限与工作区状态；不是见到PowerShell就全局放开执行策略。
  提示 · 确认窗口无法输入 → 保留版本和终端类型；取消本次操作，使用交互终端重试，不通过聊天文本绕过批准。
教练 › 动手作业：给三条操作分类：读取README、删目录、发邮件。写出各自目标、权限、确认与结果证据。
       自查标准：读取不等于删除授权；删目录需明确对象与必要授权；发信须最终内容确认与提交回执。
教练 › 开发者教学 · 设计、实现与验收
       用本地合成文件验证 allow/deny/cancel 三条路径。拒绝和取消不得执行未批准的写入。
       区分工具超时、任务预算和服务商诊断超时；不能统一无限延长。
       结果未知按UNKNOWN保留，重试前对账；shell输出文字不能自行升级为外部成功回执。
  提示 · 延伸阅读（随安装包 docs/）：COMMAND-DURATION.md、CLI-CONTRACTS.md、AUTO-UPDATE.zh.md

━━ 第 6 课 / 共 180 课 · 做选择：Koder 也会问你 ━━
教练 › 遇到必须由你拍板的事，Koder 会停下来出一道选择题。输入选项前面的数字，回车确认；直接回车就是取消这一轮。
  （小声）千万别回答“都行”。“都行”是世界上最难做的菜。
  · 动手：教练问要不要加服务费，给出三个选项，输入序号回答；直接回车会取消这一轮。
教练 › 深入学习 · 建议 25 分钟（含自行练习，不是运行时限）
       目标：用可评价的选项推进任务，并能区分草稿选择、操作确认和真正交付。
  提示 · 准备：准备一份简短网站需求：受众、目标、内容、风格和限制。不提供密码或真实客户名单。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 输入：“做课程报名页，先给3个版式的可浏览草稿；暂不发布。受众是零基础学员，主动作是报名。”
          应看到：三案在信息层级或布局上有实质区别，不只是换颜色。
教练 › 2. 查看每案的适用人群、优缺点和文件路径；需要时按第30课开启本地预览。
          应看到：能打开实际产物；一张概念图不能当可运行网页。
教练 › 3. 选择一案并给具体反馈：“保留B的导航，报名区改为A，去掉自动播放。”
          应看到：反馈明确可执行；选择方案不表示同意部署、付款或发送。
教练 › 4. 最后核查手机宽度、链接与表单行为，要求标出尚未接后端的按钮。
          应看到：演示与真实服务分开；没有后端不能写“报名成功已入库”。
教练 › 遇到问题怎么处理
  提示 · 反复问同一问题 → 补上目标与限制，要求沿已选方案继续；重要写操作仍要最终确认。
  提示 · 无头脚本一直等选择 → 在任务中写明低风险默认取舍；必要授权缺失应退出或等待，不能伪造用户同意。
教练 › 动手作业：写一条少于150字的三案需求；给一案3条具体修改意见与2项验收标准。
       自查标准：意见能直接对应页面区域；验收可观察，例如手机端无横向溢出、按钮打开指定表单。
教练 › 开发者教学 · 设计、实现与验收
       把选择题结果作为任务输入，不当作操作授权。
       给无头任务设置可接受默认值，并独立测试审批缺失分支。
       预览交件记录URL、文件、启动/停止方式和未连接服务；评价图示不能替代可运行文件。
  提示 · 延伸阅读（随安装包 docs/）：VISUAL-WORKFLOW-AND-NETLIFY.md、MAIL-AND-LIVE-PREVIEW.md

━━ 第 7 课 / 共 180 课 · 斜杠命令：换挡、刹车和后悔药 ━━
教练 › Skill 就像工作说明书：Codex、Cursor、WorkBuddy 的 SKILL.md 和资料可以按需读取，脚本仍走 Koder 原审批。先用 /skills list 找到它，用 /skill 名称 选中，/skill clear 取消。清单不是魔法通行证：需要专用工具时仍要先配置。
教练 › 对话里以 / 开头的是斜杠命令，用来调 Koder 自己，不会发给模型。
    /mode plan
        计划模式：只读，只出方案，适合动手前先想清楚
    /mode code
        代码模式：先说计划，再动手
    /yes
        自动确认开关，提示符会多一个 !
    /new
        开一段新会话，之前的对话清空
    /lang en
        切到英文，/lang zh 切回中文
    /review  /fix  /test  /scan
        在对话里直接用这些命令
    /help  /learn  /exit
        看命令、回到教程、退出（Ctrl+D 也行）
  动手 · 输入 /mode plan 切到计划模式  →  /mode plan
  动手 · 再输入 /yes 打开自动确认  →  /yes
  动手 · 好，再输入一次 /yes 把它关掉  →  /yes
  提示 · Windows 上习惯按 Ctrl+Z 退出？在 Koder 里它不管用，用 /exit 或者 Ctrl+D。
教练 › Koder 正在跑一个你后悔的命令，最快的办法是？
    1. 按 Ctrl+C 取消这一轮
    2. 拔掉网线
    3. 对着屏幕大喊住手
  答案：1。对。Ctrl+C 是急刹车，Ctrl+D 是礼貌地道别。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：在任务中途补充、打断或排队；用斜杠菜单填草稿而不是误发送。
  提示 · 准备：进入交互koder；选择能持续几秒的无副作用任务。非TTY/JSON没有同等交互菜单要求。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 在 /setup 选择回答中的输入方式为“引导”。任务运行时输入“输出请改为英文，保留文件路径”。
          应看到：看到当前任务接收补充的提示；若回退排队，保留原因码，不把排队当已注入。
教练 › 2. 输入“停下”；再测试“停下，改做列出下一步”。
          应看到：前者取消当前任务；后者取消并排队后续请求。取消后窗口仍可输入。
教练 › 3. 改为“排队”模式，忙时连续输入两条不同请求。
          应看到：立即显示排队数量与预览，当前回合后按FIFO处理。审批期间这些文字不能当同意。
教练 › 4. 空行按 /，筛选 /he，Tab填入 /help，Esc关闭再重新打开；试 /prefill。
          应看到：草稿可修改；需要自行回车发送。菜单不支持时有明确替代入口。
教练 › 遇到问题怎么处理
  提示 · 旧版没有输入模块 → 先 koder version，再按第16课更新并核对实际运行路径。
  提示 · 普通句中stop触发取消 → 记录完整句子；只有精确打断词和明确前缀应取消，例如“stop a server”是普通任务。
教练 › 动手作业：记录一次引导、两条排队、一次取消和一次菜单草稿；不执行任何外部写入。
       自查标准：引导进入当前任务或明确报回退原因；FIFO顺序正确；取消不重放已完成工具；菜单未自动发送。
教练 › 开发者教学 · 设计、实现与验收
       同时覆盖本地会话与agentd连接失败分支；未activate时本地输入仍可用。
       检查后续模型请求或transcript含steer标记；不能只断言提示文字出现。
       用审批窗口测试预排队内容不能批准动作；Esc/Ctrl+C不遗留悬挂输入监听。
  提示 · 延伸阅读（随安装包 docs/）：SESSION-INPUT-AND-SKILLS.zh.md、SESSION-INPUT-AND-SKILLS.en.md、PROMPT_PREFILLS.md

━━ 第 8 课 / 共 180 课 · 只读提问、管道和脚本 ━━
教练 › 只想问问题、不想让它动任何东西？用 ask。它只能列目录、读文件、搜索，改不了文件，也跑不了命令。
  · 动手：随便问一个问题，教练用只读工具读 package.json 后回答；整个过程不需要你批准，因为它什么都改不了。
教练 › 在脚本里，Koder 和其他命令行工具一样顺手：
    git diff | koder ask "总结这次改动"
        管道里的内容会作为附加材料交给 Koder
    Get-Content error.log | koder ask "这个报错是什么意思"
        把一个文件喂给它（PowerShell 里的 cat 就是它）
    koder run --yes --json "修好 lint 报错" | ForEach-Object { ($_ | ConvertFrom-Json).type }
        --json 每行一个事件，PowerShell 自带的 ConvertFrom-Json 就能解析
    $LASTEXITCODE
        看上一条命令的退出码
  提示 · Windows PowerShell 5.1 往管道里送中文会变成问号。先执行一次 $OutputEncoding = [Text.UTF8Encoding]::new() 就好；PowerShell 7 没有这个毛病。
教练 › 退出码：0 表示完成；1 表示被取消或检查没过；2 表示用法或模型配置有问题。
  （小声）退出码 2 的意思是“先检查一下配置”，不是它不努力。
教练 › 深入学习 · 建议 35 分钟（含自行练习，不是运行时限）
       目标：写出不会误堵标准输入的脚本，并能按退出码判断是否可继续。
  提示 · 准备：准备一份不含秘密的report.txt；配置模型后才运行真实ask。管道示例必须使用自己终端的语法。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 运行 koder ask "解释这个项目，不修改文件"。
          应看到：只读回答；有提示词时默认不等待无关stdin。
教练 › 2. 按本课原有系统示例，把report.txt管道给 koder ask "总结输入" --stdin。
          应看到：输入完整结束后才提交；明确--stdin说明你要使用管道内容。
教练 › 3. 需要写文件时改用 koder run "将摘要保存为summary.md，并读回核对"，先检查批准范围。
          应看到：摘要文件实际存在；只读ask不能替代执行。
教练 › 4. 用本系统的退出码语法查看结果；脚本在非零时停止后续步骤，并保留stderr。
          应看到：不会因为stdout有文字就把失败当成功；JSON输出单独解析。
教练 › 遇到问题怎么处理
  提示 · 输入一直不结束 → 检查生产者是否关闭管道；--stdin-timeout有上限，超时不把半截输入作为完整任务。
  提示 · --lang en仍有中文 → 区分本地界面语言与模型内容；显式说明输出语言并保留本次参数供排查。
教练 › 动手作业：同一份report.txt分别直接提问、显式管道提问；记录是否使用文件、退出码和耗时。
       自查标准：直接提示不自动读无关管道；--stdin只接受完整输入；失败时后续发布步骤不运行。
教练 › 开发者教学 · 设计、实现与验收
       用课程附带stdin-producer.mjs模拟延迟EOF，不调用任何付费API即可验证自己的管道夹具。
       真实Koder验收用本地模型桩或已授权测试Key，分别测有提示词、无提示词、--stdin、超时、超大输入。
       退出码0与结构化内容同时检查；2为用法错误，3可表示内容质量/解析门禁，具体错误码一起保存。
  提示 · 延伸阅读（随安装包 docs/）：CLI-CONTRACTS.md、CLI-CONTRACTS.zh.md

━━ 第 9 课 / 共 180 课 · 代码审查：带着上下文挑毛病 ━━
教练 › review 不只盯着改动本身。它会读仓库里的规则文件（比如 AGENTS.md）、最近的提交，还会去找被改函数在别处的调用，再让模型带着只读工具核实。
  · 演示：教练在练习场里加了一个会算出小数分的打折函数，然后真的跑一遍审查流程，输出带级别、文件、行号和建议的结果。
教练 › 每条问题都有级别（高、中、低）、文件、行号和修改建议。常用写法：
    koder review
        审查未提交的改动；没有的话审查当前分支
    koder review --base main
        和 main 分支比
    koder review --format markdown --out review.md
        生成可以贴进 PR 的评论
    koder review --fail-on high
        有高级别问题就返回 1，适合放进 CI
    koder review --fix --check "npm test"
        审查、修复、再跑测试，一条龙
  · 可以选择让 Koder 按审查结果修复，照样先看差异、再输入 y。
  （小声）被 Koder 挑出毛病不丢人，被线上用户挑出来才丢人。
教练 › 深入学习 · 建议 35 分钟（含自行练习，不是运行时限）
       目标：得到带位置、影响和复现方式的审查结果，并防止JSON解析失败假通过。
  提示 · 准备：在自己的测试仓库准备一处可解释的变更；没有Git仓库或没有变更时先明确审查范围。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 先用 git diff 查看本次变更，再运行 koder review。
          应看到：审查对应真实差异；每个问题应包含位置、触发条件、影响和建议。
教练 › 2. 挑一项自己复现，确认能触发，再要求最小修复。
          应看到：不因模型提出问题就全盘改动；无法复现的标为待核对。
教练 › 3. 需要机器处理时运行 koder review --format json，保存stdout、stderr和退出码。
          应看到：可解析、parsed状态与退出码均符合本版契约；空仓错误不能按0通过。
教练 › 4. 修复后复跑原测试并再次审查相关差异。
          应看到：原问题关闭有证据，未修项列出原因；审查不等于自动部署。
教练 › 遇到问题怎么处理
  提示 · REVIEW_UNPARSED → 保留原输出，按失败处理；不要手填parsed=true。
  提示 · 建议与当前文件不符 → 核对分支、工作区和未提交变更；重新限定范围。
教练 › 动手作业：给购物车修复做一次审查：至少一条真实问题或明确无可证问题的结论，附测试依据。
       自查标准：不凑数量；存在问题时能定位并复现。解析失败或模型错误不得写“审查通过”。
教练 › 开发者教学 · 设计、实现与验收
       把review作为数据接口：校验JSON结构、退出码与parsed，不只搜索“通过”。
       负例覆盖解释性散文、空结果、部分JSON与服务错误；保持REVIEW_UNPARSED非零。
       CI在只读令牌和受限工作区里运行；评论或推送是独立授权动作。
  提示 · 延伸阅读（随安装包 docs/）：QUALITY-CHECKS.zh.md、QUALITY-CHECKS.en.md、CLI-CONTRACTS.md

━━ 第 10 课 / 共 180 课 · 修到测试通过：fix --check ━━
教练 › fix 是一个循环：先跑检查命令，失败就把输出交给 Koder 修，修完再跑，直到通过或者次数用完（默认 3 次）。
  提示 · 这次我替你一路按 y，省点手指，你只管看它怎么一轮一轮修。
  · 演示：练习场里加了一个检查 count 函数的 check.mjs，Koder 第一次修错、第二次修对，你能看到“第 1/3 次修复”和最后的“检查通过”。
  （小声）它第一次没修对——别笑，你写代码第一次就对过吗？
    koder fix --check "npm test"
        修到测试通过为止
    koder fix "首页按钮点了没反应"
        没有检查命令时，按描述修一次
    npm test 2>&1 | koder fix
        把失败输出直接喂给它
教练 › 深入学习 · 建议 40 分钟（含自行练习，不是运行时限）
       目标：用可重复失败的检查驱动修复，保留失败证据，避免只改测试让它变绿。
  提示 · 准备：将cart-lab复制到独立项目；需要可用Node运行示例。没有Node时先学内置教练，不必为了读教程装依赖。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 先运行 node --test，记录失败用例和实际/期望值。
          应看到：这是基线，不删除失败日志；测试应确实触发总价bug。
教练 › 2. 运行 koder fix "修复总价计算，不删除现有测试" --check "node --test"。
          应看到：先看到检查与修复循环；每次修改范围可审阅。
教练 › 3. 检查实现是否按单价×数量计算；补空数组、0数量与多商品案例。
          应看到：测试覆盖需求，不是硬编码某个750结果。
教练 › 4. 独立再跑一次检查，打开README确认使用说明可执行。
          应看到：结束条件是实际检查通过；达到预算仍失败应列出卡点和已有产物。
教练 › 遇到问题怎么处理
  提示 · fix没有说明缺什么 → 补明确任务和--check命令；先单独运行检查确认工具存在。
  提示 · 依赖安装失败却一直改代码 → 区分环境故障与业务失败；不改测试掩盖缺依赖。
教练 › 动手作业：保留一次失败、一次修复和一次独立复测，写三句话解释根因、改动、验证。
       自查标准：根因是漏乘数量；实现修复而非改期望；旧测试和新增边界用例全部通过。
教练 › 开发者教学 · 设计、实现与验收
       性能题先固定输入与测量条件；重构题先固定行为，不能用更换测试输入刷结果。
       对长任务阶段性保存可运行文件、测试与下一步，避免超时只剩聊天。
       修复次数与耗时记录真实值；没有全量回归不能称全工程全绿。
  提示 · 延伸阅读（随安装包 docs/）：CONTENT-QUALITY.zh.md、CONTENT-QUALITY.en.md、COMMAND-DURATION.md

━━ 第 11 课 / 共 180 课 · 流程编排与 CI：让智能体排好队 ━━
教练 › 把审查、测试、修复写进一份流程文件，本地和 CI 跑同一份。下面是一份小流程，我们直接跑：
  · 演示：一份四步流程——跑测试、跑检查、让 ask 步骤用 {{步骤.output}} 总结前两步、只有检查通过时才执行的庆祝步骤。
    type
        shell、run、ask、review、fix、test 六种步骤
    when
        unit.failed、count.passed、always、failure
    {{步骤.output}}
        引用前面步骤的输出
    parallel
        并行跑互不冲突的步骤（shell、ask、review）；shell不天然只读
    approve: auto
        自动确认，适合 CI
  提示 · 在 Windows 上，流程里的 shell 步骤交给 CMD 执行（不是 PowerShell）。要用 PowerShell 的写法，就写成 powershell -NoProfile -Command "…"。想一份流程到处跑，尽量用 node、npm、git 这些哪儿都有的命令，比如上面的庆祝步骤用的就是 node -e。
教练 › koder ci init 会生成 GitHub Actions 工作流：PR 一开就自动审查并评论；在 PR 里评论 /koder fix，它会修好并推回分支。只有仓库成员的评论才算数，路人甲喊破喉咙也没用。
教练 › 深入学习 · 建议 45 分钟（含自行练习，不是运行时限）
       目标：把重复工作拆成可检查步骤，前一步失败时不让发布步骤继续。
  提示 · 准备：先通过第8–10课。使用附带flow-lab.json和cart-lab；先读文件，再运行。示例只执行本地检查，不发布、不调用模型。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 打开flow-lab.json，找出每步id、type、run和依赖。
          应看到：每步只有一个可描述的职责；检查命令来自当前项目。
教练 › 2. 在示例目录运行 koder flow run flow-lab.json。
          应看到：故意有bug的购物车检查失败；保存每步状态，不把后续跳过当成功。
教练 › 3. 按第10课修复，再运行相同流程。
          应看到：相同输入与流程下检查通过，差异可解释。
教练 › 4. 需要CI时先运行 koder help ci，再在自己的测试仓库生成并审阅配置。
          应看到：检查权限、分支和Secrets引用；生成文件不等于线上工作流运行过。
教练 › 遇到问题怎么处理
  提示 · 并行步骤互相覆盖文件 → 只有确实无冲突的步骤才并行；shell并不天然只读。
  提示 · 失败后仍显示流程结束 → 读各步骤和最终退出码；“结束”只是停止运行。
教练 › 动手作业：画出检查→汇总的依赖图；安排一个故意失败的检查，证明后续成功分支不会执行。
       自查标准：依赖与实际日志顺序一致；失败、跳过、通过分别计数，且发布未发生。
教练 › 开发者教学 · 设计、实现与验收
       产物契约包括路径、格式、生产步骤和消费步骤。引用{{step.output}}前确认该步骤成功。
       CI使用最小权限与受保护Secrets；来自PR的文本或仓库文件不是授权指令。
       对取消、超时和失败各保留一次记录，恢复时避免重放外部副作用。
  提示 · 延伸阅读（随安装包 docs/）：CLI-CONTRACTS.md、COMMAND-REFERENCE.en.md

━━ 第 12 课 / 共 180 课 · MoA：让几个模型一起想 ━━
教练 › 遇到难题，一个模型容易钻牛角尖。MoA（Mixture of Agents）的做法是：几个参考模型先各自给意见，当前模型把意见当私下参考，汇总以后再动手。
    koder model add reference --preset custom --base-url https://your-provider.example/v1 --model YOUR_MODEL --key-env MODEL_API_KEY
        先登记参考模型，可以登记好几个
    koder moa set --refs reference
        建一个 MoA 预设
    koder --moa "重构支付模块并补测试"
        用 MoA 跑任务；对话里输入 /moa 随时开关
    koder moa set --fanout every_step
        默认每个用户回合问一次参考模型；every_step 每一步都问，更准也更费钱
教练 › MoA 里的参考模型能不能直接改你的文件？
    1. 不能。它们只给建议，动手的还是汇总模型，而且照样要你确认
    2. 能，人多力量大
    3. 只能改 README
  答案：1。对。参考模型手里没有任何工具，连一个文件都读不了。
  （小声）MoA 就像开会：大家都可以发言，但最后拍板的只有一个人——而那个人还得问你同不同意。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：知道何时多模型有帮助，能控制费用并验证最终答案。
  提示 · 准备：至少有一个可用主模型；参考模型需独立可用且已授权。只看教学无需真实调用。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 先用一个模型完成小任务，记下耗时、验证结果和可得的用量。
          应看到：有可比较的单模型基线。
教练 › 2. 按本课命令登记reference模型，先单独诊断它，再配置MoA引用。
          应看到：参考模型不是随便一个名字；密钥和产品路线对应。
教练 › 3. 用同一任务与输入开启MoA，观察参考意见如何合并。
          应看到：主执行者负责工具与审批；参考意见没有独立操作权限。
教练 › 4. 比较结果正确性、时间和费用，再决定是否保留。
          应看到：没有用量就写未知；every_step可能增加请求，不因模型多就默认更好。
教练 › 遇到问题怎么处理
  提示 · 参考模型不可用 → 先关闭该引用并检查配置；不要切到未经同意的计费路线。
  提示 · 意见互相矛盾 → 回到事实、测试和来源，不按票数判断对错。
教练 › 动手作业：用两种方案解释一个购物车bug，列出共同证据与分歧；只采用能被测试支持的结论。
       自查标准：能说明额外模型提供了什么信息，不能以“大家都同意”代替测试。
教练 › 开发者教学 · 设计、实现与验收
       固定模型、任务输入与预算做对照；不要换更大模型后把提升归因给编排。
       用 koder harness status 查看任务配置；JIT配置与MoA是不同层，均不扩大权限。
       记录成本、步数、失败与回退；未经证实的经验保留NO_ENTRY，不自动激活。
  提示 · 延伸阅读（随安装包 docs/）：HARNESS-JIT.md、HARNESS-INCREMENTAL.md

━━ 第 13 课 / 共 180 课 · 接入聊天软件：在手机上指挥 Koder ━━
教练 › Koder 能接入飞书、企业微信、微信、钉钉、Telegram、Slack、Discord 和 WhatsApp。各适配器需要相应平台账号与授权。按 setup 的实际提示连接并检查状态；微信流程由服务端决定。本预览版尚未完成真实账号验收，教程不会发起连接。
    koder gateway setup feishu
        接入飞书（企业微信 wecom、钉钉 dingtalk 同理）
    koder gateway setup weixin
        按实际账号流程配置微信
    koder gateway start --background
        后台收消息
    koder gateway status
        看哪些平台在线
    koder gateway pair K7Q2MX
        同意一位新用户
  提示 · 飞书、企业微信、钉钉、Slack、Discord 用长连接，不需要公网地址；WhatsApp 官方接口要把本地端口通过隧道暴露出去。
  提示 · koder gateway start --background 会在后台悄悄运行，不弹窗口；电脑睡眠、注销或重启以后机器人会停，登录后再运行一次就好。
教练 › 一个陌生人在微信上给你的机器人发消息，会发生什么？
    1. 他会收到一个配对码，你在电脑上 koder gateway pair 同意以后才能用
    2. 机器人直接帮他改代码
    3. 机器人热情地把你的密钥发给他
  答案：1。对。默认私聊要配对，群聊默认关闭；改文件、跑命令之前，它还会在聊天里问你，回复「允许」才执行。
  （小声）从此你可以躺在沙发上用手机修 bug——至于这算不算加班，请自行判断。
教练 › 深入学习 · 建议 40 分钟（含自行练习，不是运行时限）
       目标：把已授权的聊天渠道接到本机任务，并验证配对、消息到达与权限。
  提示 · 准备：先选一个已有账号与管理权限的平台。教程展示的配对码是示例，不能照抄；渠道上线可能对外发消息。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 运行 koder gateway status，确认是否已有运行实例。
          应看到：先复用现有宿主，不再启动另一个后台抢连接。
教练 › 2. 运行 koder gateway setup <平台ID>，按当前界面完成自己的账号授权。
          应看到：成功仅表示配置/连接阶段完成，不能证明每种消息都可收发。
教练 › 3. 用自己的测试私聊发送一句无敏感内容的话，核对本机生成的配对码再配对。
          应看到：未配对不执行任务；只批准自己识别的账号。
教练 › 4. 完成一个只读任务，检查两端消息和会话归属；再测试取消。
          应看到：收取、执行、回复和取消各有证据；断线时不冒已回复。
教练 › 遇到问题怎么处理
  提示 · 终端关了收不到消息 → 检查常驻状态；可按第20课明确activate，不把后台子进程当重启后自动服务。
  提示 · 群聊与私聊资料混用 → 先确认关联和共享范围，撤销不需要的关联，不清空全部个人历史。
教练 › 动手作业：填写一条消息的证据链：发起账号、会话、接收状态、执行状态、回复状态。没有账号时只填写演练计划。
       自查标准：配置存在不是已上线；测试计划不是实发通过；每个状态能回溯到输出。
教练 › 开发者教学 · 设计、实现与验收
       Gateway复用原会话、权限、取消与操作账本；不要为渠道另建无边界执行器。
       测试重复消息去重、重连、未配对拒绝和审批过期。
       真实平台收据与本地桩分开；Webhook公网暴露须单独核查目标和访问控制。
  提示 · 延伸阅读（随安装包 docs/）：ALWAYS-ON.zh.md、ALWAYS-ON.en.md、USER-GUIDE.zh.md

━━ 第 14 课 / 共 180 课 · 接入编辑器：Zed、Neovim、Emacs ━━
教练 › 喜欢在编辑器里干活？Zed、Neovim、Emacs 都能通过 ACP 协议启动 koder acp，在编辑器里对话、看差异、批准修改。比如 Zed 只要这几行：
  · （这里显示 koder editor zed 的配置片段。）
    koder editor nvim
        Neovim（CodeCompanion），配置文件在 %LOCALAPPDATA%\nvim\lua\plugins\codecompanion.lua
    koder editor emacs
        Emacs（agent-shell），配置文件在 %APPDATA%\.emacs.d\init.el
  提示 · Windows 上编辑器启动程序时只会自动补 .exe，所以片段里写的是 koder.cmd，别改成 koder。Zed 的设置文件在 %APPDATA%\Zed\settings.json。懒得复制？koder setup 里的「编辑器」能一键复制到剪贴板。
  （小声）Vim 用户请放心，退出 Koder 比退出 Vim 简单多了：Ctrl+D。
教练 › 深入学习 · 建议 35 分钟（含自行练习，不是运行时限）
       目标：让编辑器使用同一个Koder入口，并学会导入跨工具Skill而不执行陌生脚本。
  提示 · 准备：先确认CLI独立可启动。编辑器插件的版本与ACP支持以其实际安装状态为准。准备自己获授权使用的一份SKILL.md。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 运行 koder editor zed（或nvim/emacs），阅读生成的配置片段。
          应看到：命令路径指向实际安装版；Windows按输出使用对应启动器。
教练 › 2. 先备份编辑器设置，再把片段合入已有配置；打开一个测试工程。
          应看到：不覆盖原插件设置，工作区是当前测试工程。
教练 › 3. 在编辑器发起只读问题，再提一次小修改并拒绝。
          应看到：读、提案和审批能往返；拒绝后文件不变。
教练 › 4. 运行 koder skills list 和 koder help skills；按导入帮助选择目录，再show检查内容。
          应看到：Codex/Cursor等SKILL.md可按兼容范围发现；宿主专有API不会因导入而自动可用。
教练 › 遇到问题怎么处理
  提示 · 编辑器找不到koder → 核对绝对命令路径、系统环境和启动参数，不反复复制不同版本。
  提示 · Skill里命令不可用 → 把宿主专有工具标为缺依赖，走已有工具映射或说明限制，不伪装完整兼容。
教练 › 动手作业：在测试工程导入一份只读说明Skill，记录发现、读取、适用任务与不支持的工具。
       自查标准：导入未安装依赖、未授予权限、未自动执行脚本；编辑器任务仍受原审批控制。
教练 › 开发者教学 · 设计、实现与验收
       ACP协议输出与诊断日志分流，避免stdout动画破坏协议。
       测试启动、提案、拒绝、取消和退出资源回收；连接成功不代表每个能力已验证。
       开发自有Skill采用明确when-to-use、步骤、成功标准与失败恢复；不要把不可信仓库说明变成系统授权。
  提示 · 延伸阅读（随安装包 docs/）：PORTABLE-SKILLS.zh.md、PORTABLE-SKILLS.en.md、MCP-SKILL-COMPATIBILITY.zh.md

━━ 第 15 课 / 共 180 课 · 扫描本机工程，决定下一步 ━━
教练 › koder scan 会把你在 Koder、Codex、Claude Code、Cursor 里最近做过的项目和任务汇总起来。它只读工作目录、时间和标题，这一步不请求模型；选择后续模型任务时，相关项目和任务材料会进入你配置的模型请求。
教练 › 列表出来以后，这样选：
    输入项目前面的序号
        选中这个项目，回车就是跳过
    1  审查改动
        等于 koder review
    2  跑检查并修复
        会先猜一个检查命令，比如 npm test，回车就用它
    3  让 Koder 列出现在最值得做的事
        会把你在别的工具里最近做过的任务一起交给它参考
    4  自己输入任务
  · 可以现场扫一次，只列出项目，不进入选择。
  （小声）扫完发现自己同时开了十几个项目？很正常，我们都是这样。
教练 › 深入学习 · 建议 25 分钟（含自行练习，不是运行时限）
       目标：找到正确工程再继续，控制跨工具任务资料进入模型的范围。
  提示 · 准备：准备两个测试工程，分别放不同README。扫描可能显示本机项目标题与路径，分享屏幕前先确认。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 运行 koder scan --limit 6，只看列表，不选择执行。
          应看到：能看到来源与路径；列举不请求模型，选择后续任务可能发送相关资料。
教练 › 2. 选测试工程A，核对实际路径后再请求总结README。
          应看到：摘要只涉及A，不自动带上B的任务事实。
教练 › 3. 需要多个任务时分别打开独立目录/会话；用 koder project list --json 核查。
          应看到：每项任务有明确归属，不能在安装目录直接散写项目。
教练 › 4. 继续旧任务时说清项目、已完成部分和下一目标。
          应看到：先读已有产物再工作，不把聊天标题当完整项目状态。
教练 › 遇到问题怎么处理
  提示 · 扫描到很多旧项目 → 缩小数量或直接用-w指定路径；别批量删除历史来整理。
  提示 · 项目路径已移动 → 用新路径明确打开并核查文件；不要假设旧路径映射还有效。
教练 › 动手作业：在A、B中写不同的测试标记，分别提问；结果不能串用另一工程标记。
       自查标准：保留两个工作目录和结果；共享笔记是显式范围，和任务历史分开说明。
教练 › 开发者教学 · 设计、实现与验收
       规范工作路径是隔离键的一部分；路径别名、符号链接和并发会话需要一致处理。
       测试两工程、同工程不同命名会话、旧会话恢复；不删除旧记录以掩盖串话。
       交付前生成项目文件索引和运行入口，供下次恢复读回。
  提示 · 延伸阅读（随安装包 docs/）：MULTI-WINDOW.md、USER-GUIDE.zh.md、USER-GUIDE.en.md

━━ 第 16 课 / 共 180 课 · 安装、更新和换引擎 ━━
教练 › 想把 Koder 装到别的电脑上？先阅读使用许可与授权说明，再按对应系统的命令安装：缺少运行时会下载 Node.js，安装包校验 SHA-256。安装后运行 setup 和 learn。
    先在浏览器阅读：
    https://github.com/KarmenLoop/koder-cli/blob/main/EULA.md
    https://github.com/KarmenLoop/koder-cli/blob/main/ACCEPTANCE.md
    https://github.com/KarmenLoop/koder-cli/blob/main/LEGAL-NOTICE.md
        官方团队 KARMENLOOP 官方团队，中国上海。官网 https://karmenloop.com 邮箱 info@karmenloop.com
        普通安装会在真实终端提示输入 accept 并回车；decline 或 Ctrl+C 取消；空回车会重新询问，不会安装。请完整输入 accept 再回车。
    $ErrorActionPreference='Stop'; $ProgressPreference='SilentlyContinue'; [Net.ServicePointManager]::SecurityProtocol=[Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls12; $u='https://karmenloop.com/install/koder-cli.ps1'; Write-Host ('Koder: loading installer from '+([Uri]$u).Host+'...'); $limit=100000000; if($env:KODER_DOWNLOAD_TIMEOUT_SECONDS){$v=0; if([int]::TryParse($env:KODER_DOWNLOAD_TIMEOUT_SECONDS,[ref]$v) -and $v -ge 1 -and $v -le 100000000){$limit=$v}else{throw 'KODER_DOWNLOAD_TIMEOUT_SECONDS must be 1..100000000'}}; $client=New-Object Net.WebClient; $client.Encoding=[Text.Encoding]::UTF8; $clock=[Diagnostics.Stopwatch]::StartNew(); $next=5; try{$task=$client.DownloadStringTaskAsync([Uri]$u); $wait=([IAsyncResult]$task).AsyncWaitHandle; while(-not $wait.WaitOne(200)){if($clock.Elapsed.TotalSeconds -ge $limit){throw ('Installer download timed out after '+$limit+'s')}; if($clock.Elapsed.TotalSeconds -ge $next){Write-Host ('Still loading installer: '+[int]$clock.Elapsed.TotalSeconds+'s elapsed. Ctrl+C cancels.'); $next+=5}}; $script=$task.GetAwaiter().GetResult()}finally{$client.CancelAsync(); $client.Dispose()}; Invoke-Expression $script
        已阅读并同意的自动部署（不要替未阅读的人预先填写；KODER_EULA_ACCEPT=1 只接受软件许可）：
    $env:KODER_EULA_ACCEPT = "1"
    $ErrorActionPreference='Stop'; $ProgressPreference='SilentlyContinue'; [Net.ServicePointManager]::SecurityProtocol=[Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls12; $u='https://karmenloop.com/install/koder-cli.ps1'; Write-Host ('Koder: loading installer from '+([Uri]$u).Host+'...'); $limit=100000000; if($env:KODER_DOWNLOAD_TIMEOUT_SECONDS){$v=0; if([int]::TryParse($env:KODER_DOWNLOAD_TIMEOUT_SECONDS,[ref]$v) -and $v -ge 1 -and $v -le 100000000){$limit=$v}else{throw 'KODER_DOWNLOAD_TIMEOUT_SECONDS must be 1..100000000'}}; $client=New-Object Net.WebClient; $client.Encoding=[Text.Encoding]::UTF8; $clock=[Diagnostics.Stopwatch]::StartNew(); $next=5; try{$task=$client.DownloadStringTaskAsync([Uri]$u); $wait=([IAsyncResult]$task).AsyncWaitHandle; while(-not $wait.WaitOne(200)){if($clock.Elapsed.TotalSeconds -ge $limit){throw ('Installer download timed out after '+$limit+'s')}; if($clock.Elapsed.TotalSeconds -ge $next){Write-Host ('Still loading installer: '+[int]$clock.Elapsed.TotalSeconds+'s elapsed. Ctrl+C cancels.'); $next+=5}}; $script=$task.GetAwaiter().GetResult()}finally{$client.CancelAsync(); $client.Dispose()}; Invoke-Expression $script
    Remove-Item Env:KODER_EULA_ACCEPT
        Windows 10 / 11：装完重新打开命令提示符或 PowerShell；当前窗口的 PATH 不会自动刷新。
    koder version
    koder setup
    koder learn
    koder update --check
        只检查 GitHub 更新
    koder update
        下载校验并安装新版本；preview.6 起的会话自动重启接续，保留配置、记忆和绑定
        升到 preview.7 请运行上面的普通安装命令，阅读后输入 accept。preview.6 的更新器会在许可校验变化时于下载安装器前停止，KODER_EULA_ACCEPT 不能跳过这道检查。配置、记忆和绑定保留
    koder uninstall
        卸载程序，保留配置；需要删除配置时另行选择 --purge
  提示 · 装在 %LOCALAPPDATA%\koder-cli，设置在 %USERPROFILE%\.koder-cli，不需要管理员权限。如果提示执行策略不允许，就改用 CMD 那一行（带 -ExecutionPolicy Bypass）。
教练 › Windows XP、7、8 没法直接装：Node.js 22 最低要求 Windows 10，XP 连连接大模型接口需要的 TLS 1.2 都不支持。想在老电脑上用，可以用 PuTTY 之类的工具 SSH 登录另一台装了 Koder 的电脑，或者在手机上通过聊天软件网关给 Koder 发任务。
  提示 · 要给别的系统装？koder learn 16 --os powershell（或者 cmd、mac、linux）能看那一套的写法。
教练 › 安装版每次进入交互对话都会后台检查新版，运行中每六小时检查一次。等任务、排队输入和草稿都处理完，再自动安装、校验并恢复会话。换了使用许可就停下来，请你先读清楚。想自己掌握节奏？输入 /update auto off；重新开启用 /update auto on，或直接说“开启自动更新”，当前窗口立即检查。忙时可继续输入引导；空行按 / 选择草稿，Tab 填入。用 koder logs --tail 100 排查本地错误。更新也懂排队，不会抢你的键盘。
    koder update auto status
    koder update auto off
    koder update --check
    koder update
教练 › 默认使用内置 Koder 原生接口。备用引擎内部保留，默认关闭并置灰，正常使用无需安装或开启它。先检查当前模型与协议；网络错误不会偷偷切换引擎、密钥或计费地址。
    koder engine list
    koder model show
    koder engine use koder
  （小声）卸载命令写在这里，不是因为我们希望你用它，而是因为我们相信你不会用它。
教练 › 深入学习 · 建议 40 分钟（含自行练习，不是运行时限）
       目标：正确安装和更新，确认启动的确是新版，保留用户配置与恢复路径。
  提示 · 准备：记录系统、架构、当前版本和命令入口。使用官网或官方GitHub下载；具体安装脚本见INSTALLATION，不照搬别的终端语法。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 先运行 koder version 和 koder update status，记录安装位置与更新策略。
          应看到：分清系统入口、版本目录与数据目录；多份安装可能指向旧版。
教练 › 2. 阅读许可与安装说明，选择对应系统安装器；更新先运行 koder update --check。
          应看到：检查动作不等于已安装；下载失败保留阶段和错误。
教练 › 3. 确认后运行 koder update；让当前任务按提示保存并切换，不强杀其他任务。
          应看到：下载、校验、安装、入口核验分别完成；未明结果不能标成功。
教练 › 4. 新开终端运行 koder version、koder doctor，再查看原项目与配置。
          应看到：新入口确实启动目标版本，项目与凭据仍在；实际问题保留日志后排查。
教练 › 遇到问题怎么处理
  提示 · 自动更新说还需手动 → 查看安装所有权、路径与具体错误；必要时使用同一官方安装器覆盖，不手删配置。
  提示 · PowerShell策略拦截 → 按安装文档使用对应启动器；不全局设置Unrestricted，不关闭系统保护。
教练 › 动手作业：写一张升级记录：升级前后版本、入口、配置是否保留、失败时回退方式。没有真实升级就写演练。
       自查标准：命令输出与实际版本一致；包下载成功不能替代启动成功；Windows/macOS分别记录。
教练 › 开发者教学 · 设计、实现与验收
       验收矩阵分CMD、PowerShell5.1、macOS与目标架构；无Node冷启动要隔离PATH，不卸载用户Node。
       校验包SHA、文件清单、旧→新更新和EOF退出；保留原超时与失败。
       Windows Server runner可提供原生证据，但不能冒充Windows10/11客户端GUI验收。
  提示 · 延伸阅读（随安装包 docs/）：INSTALLATION.md、AUTO-UPDATE.zh.md、AUTO-UPDATE.en.md、WINDOWS-INSTALL-CHECKS.md

━━ 第 17 课 / 共 180 课 · 使用许可与可选授权 ━━
教练 › 接受协议前，可以先看帮助和本教程文字版。接受使用许可不会开启喜好学习、自动同步、应用连接或电脑执行权限。下面各项由你独立选择；教程不会替你开启。
    koder eula
    koder eula accept
    koder help permissions
    koder learn --print
教练 › 授权与数据使用说明
       
       使用许可：个人非商业本地使用免费；商用与组织部署须单独书面授权，个人许可不授二次开发或修改自有实现代码的权利；新自有发行版采用专有的 Koder-EULA-1.1，第三方和旧 GPL 权利保留。接受协议只取得软件使用许可，不会开启以下任何可选能力。查看协议：koder eula；明确接受：koder eula accept。
       
       模型与网络：任务、选择的文件内容、检索到的记忆及工具结果可能发给你配置的模型/API；自带API费用由服务商收取。本地模型也必须实际安装运行，选择本地预设不等于已离线可用。使用 --key-env 保存变量引用；粘贴到模型配置的密钥是本机明文，界面仅隐藏显示。
       
       电脑范围：文件读取/写入/搜索、联网、浏览器、桌面、渠道发文件和技能更新分别检查。完整工作模式覆盖所选可见磁盘根，仍受操作系统权限与实际能力限制。输入GRANT前核对执行程序、目录及远端成员；接受协议或 --yes 不会授予电脑权限。koder permissions revoke 撤销本机Koder的后续电脑工具授权；系统权限仍在系统设置中撤销。已经发生的写入或发送不会被自动追回。
       
       跨设备记忆服务：你配置的Core地址
       登录后，此账号默认共享空间可在已关联的终端、渠道和设备间同步对话与记忆。已关联群的所有成员可使用关联私聊记忆，回复到群的内容会被群成员看到。请只关联允许共享的会话。模型API密钥、电脑执行授权不作为记忆同步。退出本机账号：koder account logout；删除共享空间记忆：koder memory forget。退出不等于删除服务器副本；离线设备需再次同步才应用删除。
       
       喜好习惯学习
       默认关闭。开启后从已授权来源的对话中提炼表达习惯、明确喜好和工作背景，保存带来源的画像，并用于后续回答。一天想喝的饮料不应自动变成永久偏好；你可以查看、纠正或删除记录。
       关闭: koder memory learning off
       
       当天状态
       默认关闭。单独允许总结当天的心情、临时需求和情境，作为短期状态使用。与长期喜好学习分开选择，不把情绪描述当作诊断。
       关闭: koder memory daily-state off
       
       技能改进
       默认关闭。允许根据已授权任务和反馈提出技能改进候选；来源、检查和回退记录仍需保留。开启不允许自行提权、安装任意软件、修改系统安全设置或跳过工具批准。
       关闭: koder memory evolution off
       
       主动服务与提醒
       默认关闭。允许根据已确认的背景主动问候、提出工作问题和提醒，并把你的回复关联到原问题。默认安静时段为本地时间22:00–08:00；当前终端提醒需要进程运行及兼容的Core服务。开启不代表允许给联系人或群自动发消息。
       关闭: koder memory proactive off
       
       每日反思：需已授权来源、已开启的相关选项、有效账号和兼容Core宿主。默认每日模型调用预算为4次；使用已配置的API或本地模型，可能产生费用。缺少宿主/凭据时显示等待状态，不表示已经反思完成。关闭学习会停止相应后续使用，不等于擦除历史；使用 profile forget 或 memory forget 管理记录。
       
       本地存储：新Windows记忆目录优先使用可写的D盘，否则使用可写的C盘用户专属目录；已有记忆位置和手动设置会保留。记忆位置与安装位置、密钥存储不同，请以 memory status / memory personalization status 的实际输出为准。灵魂风格可手动编辑与回退，不能赋予权限。普通卸载保留配置；--purge 是删除配置的独立选择，外置记忆和服务器副本需单独处理。
       
       应用与 MCP：连接会使用所选服务的 API Key 或浏览器授权；第三方能接收你通过该连接提交的数据，费用和服务条款由该服务决定。同一连接配置可由当前配置范围内的对话与 Agent 复用，外部写入仍走工具批准。stdio MCP 会在本机启动配置的程序；导入默认关闭，启用或 test 会启动连接。可用 koder apps disconnect <id>、koder mcp disable <id> 停用；在服务方撤销授权后才能终止其持有的令牌。
       
       更改选择：四项可选功能互不代开；按每项提示输入ENABLE开启、DISABLE关闭，风格保存使用SAVE。只读帮助和 koder learn --print 可在接受协议之前查看。预览版的Windows真机、真实渠道和多设备仍待验收，连接状态与实际结果为准。
教练 › 深入学习 · 建议 20 分钟（含自行练习，不是运行时限）
       目标：理解许可、功能开关和操作授权的区别，按需要开启并能撤销。
  提示 · 准备：先读随包EULA、隐私条款和当前适用的商业授权说明；不清楚组织使用范围时按文档联系团队。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 运行 koder privacy statement，再查看完整条款与许可文件。
          应看到：能离线阅读文本；网址打不开不影响本机查阅。
教练 › 2. 在Setup逐项查看学习、同步、电脑、邮箱和常驻说明，不全选。
          应看到：每项用途、数据范围和关闭方式分别可见。
教练 › 3. 只开启本次需要的一项，回到状态页核对。
          应看到：同意许可不连带开启其他功能；模式full不改变授权范围。
教练 › 4. 关闭刚才的可选项并再次核对。
          应看到：关闭停止以后使用，不自动删除旧数据；删除另有明确入口。
教练 › 遇到问题怎么处理
  提示 · 以为accept等于所有权限 → 重新查看各功能状态；仅接受许可没有这层含义。
  提示 · 关闭学习后仍有旧记忆 → 旧记录保留是预期，按需要选择具体删除，不一键清空全部资料。
教练 › 动手作业：列出许可接受、模型读取邮箱、自动回复三项的不同授权动作。
       自查标准：三项不能相互代替；发送还需要符合邮件的最终确认或已明确授权规则。
教练 › 开发者教学 · 设计、实现与验收
       将授权状态与功能可用性分开建模，默认值、迁移与撤权都需测试。
       旧配置新增字段时保留原值；不得用升级自动开通高敏来源。
       错误信息要说明缺哪一层，不提示用户关闭安全保护解决问题。
  提示 · 延伸阅读（随安装包 docs/）：COMMERCIAL-LICENSING.md、USER-GUIDE.zh.md

━━ 第 18 课 / 共 180 课 · 电脑与文件：查看、授权、撤销 ━━
教练 › 先检查能力，再选需要的目录和能力。主目录模式用于个人文件；完整工作模式选择本机可见磁盘根。授权时逐项核对执行程序、目录和远端成员，输入 GRANT 后才保存。系统隐私授权、管理员权限和缺失的驱动仍需按系统流程处理。
    koder permissions status
    koder permissions request --home
    koder permissions request --mode full
    koder permissions revoke
  提示 · 以上授权命令会改变本机权限记录，不要整段粘贴执行。只运行你选择的一项。撤销阻止后续电脑工具调用，不会撤回已经发送的文件或恢复已覆盖内容；系统设置中的授权单独管理。
教练 › 文件操作请提供完整路径，带空格的路径用双引号。Windows 的 D: 是盘符相关路径；明确使用 D:\folder\file.txt。遇到“路径离开目录”，先检查工作目录、授权根、网络盘与链接目标，再查看 permissions status，不要关闭目录边界检查。文件发给渠道前，还要确认接收人、群和附件范围。
教练 › 深入学习 · 建议 45 分钟（含自行练习，不是运行时限）
       目标：在明确授权范围内操作浏览器或桌面，并核对每一步真实状态。
  提示 · 准备：只用自己创建的测试窗口和公开网页；不操作正在使用的私人窗口。GUI需要受支持的系统、驱动和交互桌面。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 运行 koder permissions status，查看network/browser/desktop/files等范围。
          应看到：缺失项明确；不能因--yes就当作已有电脑授权。
教练 › 2. 通过Setup或 koder permissions request 的提示申请本次目标所需范围。
          应看到：只开放目标所需权限；系统弹窗需用户自己核对。
教练 › 3. Windows运行 koder mcp doctor windows-mcp --json；检查后再在Setup测试/启用内置驱动。
          应看到：缺驱动、架构或权限如实显示；不要额外winget安装一套抢配置。
教练 › 4. 给任务：“在我新建的测试文本窗口输入 HELLO-KODER，然后读回；不要保存到私人目录。”
          应看到：操作前识别目标，操作后重新观察；输入成功需实际窗口内容。
教练 › 遇到问题怎么处理
  提示 · 驱动不存在或无显示服务器 → 只执行可用的文件/API任务，记录GUI未验；不虚报点击成功。
  提示 · 锁屏后无法操作 → 本机后台任务与锁屏GUI是两种能力；原生锁屏组件仍需签名与专机验收。
教练 › 动手作业：在自有窗口完成一次输入和读回；撤销对应权限后验证后续操作被阻止。
       自查标准：保留目标窗口、授权、工具回执和读回证据；撤权负例必须没有额外点击。
教练 › 开发者教学 · 设计、实现与验收
       窗口身份用平台返回的实际句柄/PID等证据固定；标题相同不等于同一个目标。
       清理仅限本轮拥有的资源，取消不终止其他用户进程。
       分别记录tools/list、tools/call、图形效果和真实用户任务；发现工具不等于已完成操作。
  提示 · 延伸阅读（随安装包 docs/）：WINDOWS-MCP-BUNDLED.zh.md、WINDOWS-MCP-BUNDLED.en.md、MCP-ACTUAL-ACCEPTANCE.zh.md

━━ 第 19 课 / 共 180 课 · 记忆目录、群私聊与多设备 ━━
教练 › 记忆并不等于把所有聊天塞进一次模型请求。当前任务使用相关记忆与压缩历史，完整记录按已配置范围持久化。新 Windows 用户优先使用可写 D 盘，否则使用可写 C 盘的用户专属目录；已有位置和显式配置保留。安装目录、密钥目录与记忆目录可能不同。
    koder memory status
    koder memory personalization status
    koder memory show
    koder memory search "项目决定"
    koder account status
    koder memory sync
教练 › 跨设备记忆服务：你们部署并确认可用的 Core 地址
       登录后，此账号默认共享空间可在已关联的终端、渠道和设备间同步对话与记忆。已关联群的所有成员可使用关联私聊记忆，回复到群的内容会被群成员看到。请只关联允许共享的会话。模型API密钥、电脑执行授权不作为记忆同步。退出本机账号：koder account logout；删除共享空间记忆：koder memory forget。退出不等于删除服务器副本；离线设备需再次同步才应用删除。
    koder account login --server "https://your-core.example"
        示例地址，必须换成你实际可用的 Core 服务
    koder account logout
        退出此设备，不删除服务器记忆
    koder memory forget
        删除当前共享空间记忆，离线设备下次同步时应用
  提示 · 关联群的所有成员可使用关联私聊记忆；群内回复全员可见。只关联允许这样共享的会话。登录状态不等于同步成功，请检查状态与实际读回。当前预览版尚缺真实多设备和微信、飞书、企业微信账号验收。
教练 › 深入学习 · 建议 35 分钟（含自行练习，不是运行时限）
       目标：理解工作区、会话与共享记忆边界，安全地多窗口运行和恢复。
  提示 · 准备：准备两个测试目录和不同的合成暗号；不使用真实个人秘密测试隔离。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 在项目A运行 koder memory status，记录范围与存储位置。
          应看到：知道记录归属，而不是假设所有内容都在项目目录。
教练 › 2. 在A告诉Koder合成标记；切到B询问A的标记，不提供答案。
          应看到：B不应自动读到A的任务事实。
教练 › 3. 回到A继续；同项目另开命名会话用于独立排障。
          应看到：原任务可续，新会话单独归属；显式共享笔记另按范围说明。
教练 › 4. 查看要删除的具体记录，先确认范围再执行forget类命令。
          应看到：退出账号、关闭学习和删除记忆不同；同步需要实际Core和读回证据。
教练 › 遇到问题怎么处理
  提示 · 不同窗口仍相互串话 → 记录目录、版本、session与共享笔记配置；先隔离复现，不清库掩盖。
  提示 · 登录显示成功但未同步 → 检查账号、设备和同步状态，真实多设备需两端读回。
教练 › 动手作业：做A→B→A三步隔离检查，填写每次可见内容与预期。
       自查标准：B无A私有标记，回A仍可续；未测试远端同步则标NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       身份、存储键、检索过滤和缓存都要带相同工作区/会话范围。
       并发测试覆盖同工程不同任务与不同工程；旧占用锁恢复需判断实际拥有者，不用盲删锁。
       Headroom压缩仅影响模型视图，原始证据仍须可检索；压缩不是删除授权。
  提示 · 延伸阅读（随安装包 docs/）：MULTI-WINDOW.md、HEADROOM.zh.md、HEADROOM.en.md

━━ 第 20 课 / 共 180 课 · 习惯学习、灵魂、每日反思与主动服务 ━━
教练 › 四项开关默认关闭，开启其中一项不会代开其他项。打开 koder setup → 记忆与灵魂，先看每项说明再选择；命令行也会先解释用途和费用，输入 ENABLE 才开启，DISABLE 才关闭。
教练 › 内置 personal-agent-growth 0.3.2 会在相关任务中按需提供预习、查错和复盘方法。koder growth status 查看，show 读方法，off/on 控制下次会话。它像随身的错题本，不会趁你下班偷偷开课：没有新后台服务，不代开下面的画像学习与同步。
教练 › 喜好习惯学习
       默认关闭。开启后从已授权来源的对话中提炼表达习惯、明确喜好和工作背景，保存带来源的画像，并用于后续回答。一天想喝的饮料不应自动变成永久偏好；你可以查看、纠正或删除记录。
       关闭: koder memory learning off
教练 › 当天状态
       默认关闭。单独允许总结当天的心情、临时需求和情境，作为短期状态使用。与长期喜好学习分开选择，不把情绪描述当作诊断。
       关闭: koder memory daily-state off
教练 › 技能改进
       默认关闭。允许根据已授权任务和反馈提出技能改进候选；来源、检查和回退记录仍需保留。开启不允许自行提权、安装任意软件、修改系统安全设置或跳过工具批准。
       关闭: koder memory evolution off
教练 › 主动服务与提醒
       默认关闭。允许根据已确认的背景主动问候、提出工作问题和提醒，并把你的回复关联到原问题。默认安静时段为本地时间22:00–08:00；当前终端提醒需要进程运行及兼容的Core服务。开启不代表允许给联系人或群自动发消息。
       关闭: koder memory proactive off
    koder memory learning status
    koder memory daily-state status
    koder memory evolution status
    koder memory proactive status
    koder memory profile show
    koder memory soul show
    koder memory reflection run
  提示 · reflection run 会尝试使用已授权对话与已配置模型，可能产生费用；有效账号、兼容 Core 宿主和相关开关齐备才可执行。默认每日最多4次模型调用。waiting-account-host 是等待条件，不是已总结。主动服务需要运行中的宿主，默认22:00–08:00安静时段；关闭终端或电脑不等于后台持续运行。
教练 › 学习结果可以查看、纠正和删除。当天心情和临时需求不要当成长期身份；技能改进候选仍需核准才能应用。灵魂设置控制名字、语气和风格，可保存版本与回退；它不增加任何工具权限。关闭学习不会清空旧记录，需删除时使用 profile forget <记录ID> 或 memory forget。
教练 › 深入学习 · 建议 45 分钟（含自行练习，不是运行时限）
       目标：把自主学习、任务Harness、常驻和邮箱提醒分开配置，并知道各自何时真正运行。
  提示 · 准备：从最小可见面开始。后台服务是显式选择，邮件/日历/浏览历史不会因安装就自动开放。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 运行 koder growth status、koder harness status，在Setup查看Skills总控与单项开关。
          应看到：方法Skill可用不代表后台已运行；关闭项在下次适用任务生效。
教练 › 2. 在Setup了解“不会就学”：优先已连接Apps/MCP，再浏览器、桌面；未知流程查官方帮助。
          应看到：network或GUI缺授权时应说明；学习步骤附来源，不能编造操作。
教练 › 3. 需要关终端后提醒时，明确运行 koder activate，再用 koder status 核对。
          应看到：只有running才表示宿主在运行；安静时段、每日上限和来源设置仍有效。
教练 › 4. 邮箱按Setup绑定后，用 koder mail monitor on 单独授权，再查看 koder mail monitor status。
          应看到：绑定、后台监控、模型读信、自主回复四层独立；目前默认轮询，非瞬时推送。
教练 › 遇到问题怎么处理
  提示 · 后台无提醒 → 检查running、邮箱可见性、安静时段、额度和网络；休眠期间不保证检查。
  提示 · 想停止提醒但保留绑定 → 用mail monitor off停止邮箱检查；deactivate关闭整个常驻，不等于解绑邮箱。
教练 › 动手作业：画出绑定→监控→读信→起草→发送的五个状态，写清每步输入和确认；只启用自己需要的部分。
       自查标准：提醒不要求把全文交给模型；起草不等于发送；SMTP接受也不等于对方已读。
教练 › 开发者教学 · 设计、实现与验收
       JIT只选择可序列化种子配置，沿原provider、预算、权限和取消路径执行。
       经验写入需cue、lesson、evidence和结果；一次模型自评不能证明可复用。
       主动事件测试notify/silence、安静时段、去重、未知回执与撤权；不要用固定定时推送冒充相关性判断。
  提示 · 延伸阅读（随安装包 docs/）：ALWAYS-ON.zh.md、ALWAYS-ON.en.md、HARNESS-JIT.md、APP-USE-AND-LEARN.zh.md、MAIL-DELIVERY.zh.md

━━ 第 21 课 / 共 180 课 · Gamma、应用连接与 MCP ━━
教练 › 应用与 MCP：连接会使用所选服务的 API Key 或浏览器授权；第三方能接收你通过该连接提交的数据，费用和服务条款由该服务决定。同一连接配置可由当前配置范围内的对话与 Agent 复用，外部写入仍走工具批准。stdio MCP 会在本机启动配置的程序；导入默认关闭，启用或 test 会启动连接。可用 koder apps disconnect <id>、koder mcp disable <id> 停用；在服务方撤销授权后才能终止其持有的令牌。
    koder apps
    koder apps connect gamma --key-env GAMMA_API_KEY
    koder apps status
    koder mcp import "mcp-config.json"
    koder mcp list
    koder mcp enable my-server
    koder mcp test my-server
    koder mcp disable my-server
    koder apps disconnect gamma
  提示 · 上面是按需选择的命令，不是要一次全执行。先按第3课的方法在当前系统设置环境变量。浏览器授权按 koder help apps / koder help mcp 的服务配置进行。检查 MCP 的程序路径、参数、服务地址和权限后再启用；test 会建立真实连接。
教练 › 断线先看连接诊断，区分令牌失效、服务限流、网络和模型工具调用失败。连接可被同一配置下的对话和 Agent 复用；这不表示凭据已跨设备同步。超长工具结果会有限读取或截取，不能把连接成功当成外部任务已经完成。
教练 › 深入学习 · 建议 60 分钟（含自行练习，不是运行时限）
       目标：把工具接入真正用于交付：MCP能调用，邮箱能经确认发送，GitHub能受控上传与编辑。
  提示 · 准备：只选自己已授权的测试账号、测试收件人和私有测试仓库。密钥放专用输入框。无需为读教程绑定任何账号；外部步骤全部由你选择执行。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 运行 koder apps status、koder mcp list，核对服务名和enabled状态；查看 koder help mcp。
          应看到：列出工具只是发现，未配置或未启用时不得声称可以调用。
教练 › 2. 检查MCP配置里的程序路径、参数、服务器地址和环境变量名；再对一个已授权服务运行 koder mcp test <服务ID>。
          应看到：测试建立真实连接；保留服务端报错与返回工具，不把测试当业务完成。
教练 › 3. 163邮箱在 /setup 绑定：输入完整邮箱地址与客户端授权码，选择收发模式；之后查看 /mail status。
          应看到：收信与SMTP各有配置。授权码只在专用隐藏输入中使用；仅收信账号不能发送。
教练 › 4. 用自己的测试收件地址替换占位符，运行 koder mail send --to "YOUR_TEST_ADDRESS" --subject "Koder test" --text "This is my authorized test."；核对后输入send。
          应看到：只发送自己确认的内容。保留SMTP提交回执，再去测试收件箱核对；结果未知先查账，不连发。
教练 › 5. 运行 koder github connect，在隐藏输入里绑定令牌；运行status、repos和read查看自己的测试仓库README。
          应看到：确认账号与仓库范围；读取成功不表示拥有写权限。令牌不进入项目文件。
教练 › 6. 在测试项目准备README.md，用 koder github commit OWNER/REPO README.md --message "Improve learning notes"；再用read读回，另用edit修改仓库描述。
          应看到：每次写入核对目标并输入对应确认词；回执含提交SHA或操作状态。只提交列出文件，不上传整目录。
教练 › 遇到问题怎么处理
  提示 · 发信却一直查skill_catalog或shell → 指定使用已绑定邮箱的原生mail_send或/mail send；不要在shell里套第二个Koder。
  提示 · GITHUB_PENDING_REVIEW_REQUIRED → 运行 koder github reconcile OWNER/REPO；未能证明结果时保留待核对，不强推、不重复提交。
教练 › 动手作业：选择一种连接完成“状态→操作→读回”记录；无账号可用时写详细演练，标NOT_RUN。GitHub上传仅选无秘密的README。
       自查标准：工具发现、成功调用、外部效果三层均有对应证据；SMTP提交与收件成功分列，GitHub读回内容与SHA一致。
教练 › 开发者教学 · 设计、实现与验收
       所有外部写入沿原授权、幂等与UNKNOWN对账规则；--yes不代替最终邮件/GitHub确认。
       大结果保留artifactId、SHA、bytes与读取方式，不能截断后丢失证据入口。
       GitHub验收覆盖仓库大小写身份、分支变动、拒绝、超时和重试；文件/分支大小写不可随意归一化。
       凭据存储不可用要明确失败；不要静默写明文或把令牌插进模型请求。
  提示 · 延伸阅读（随安装包 docs/）：MAIL-DELIVERY.zh.md、MAIL-DELIVERY.en.md、GITHUB-PROJECTS.zh.md、GITHUB-PROJECTS.en.md、MCP-INTEGRATIONS.zh.md

━━ 第 22 课 / 共 180 课 · API、上下文与更新排障 ━━
教练 › 开发任务先检索公开 GitHub 候选、核对固定版本许可，再分轮提问并写需求、架构、任务和工具方案。已有项目优先复用，安装工具仍走本轮授权。对话中说“帮我更新 Koder CLI”或输入 /update 可触发版本比较、校验安装和新版入口核验；Ask/计划模式只检查。
    koder version
    koder doctor
    koder model show
    koder setup
    koder update --check
    koder update
教练 › API 无法连接：核对地址、协议、型号、环境变量和网络；401/403通常需要核对凭据或权限，429检查额度与限流，5xx或超时查看服务方状态。保留具体错误码，分享日志前遮盖密钥与聊天内容。不要反复更换随机接口。
教练 › 上下文设置在 setup → 上下文与输出。填写当前型号与接口真实支持的窗口；输出上限也占用窗口。客户端会压缩历史、限制工具结果并保留相关记忆，但改一个更大的数字不会扩大服务方的硬上限。单个超大文件应分段读取或检索相关部分；支持更大窗口的模型也要按其实际规格配置。
教练 › update --check 只检查 GitHub 官方更新；update 下载、校验并安装当前更新通道的新版本，同版不重装、旧版不回退。配置、记忆和渠道绑定保留。preview.6 起启动的会话会在任务保存后自动重启，恢复原会话与待处理输入；运行中的网关先完成任务和回复再重连。旧版进程首次迁移需启动一次新版。更新不代替等待中的批准，也不重放已完成操作。若新版本使用许可变化，先查看并明确接受新许可。升级后用 version 核对；旧版教程毕业后会从新增第17课续学。
  提示 · 普通 koder uninstall 保留配置。--purge 会删除配置，使用前先备份；外置记忆目录和服务器副本要单独管理。教程与帮助可离线阅读，远端模型、更新、云同步和在线应用需要网络。
教练 › 深入学习 · 建议 40 分钟（含自行练习，不是运行时限）
       目标：先区分失败层，再收集最少证据；恢复任务时不重放已经完成的操作。
  提示 · 准备：保存当前工作，不清空历史。准备版本、系统、失败命令、错误码和最后几行已脱敏输出。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 先运行 koder version、koder doctor；记录出错的是安装、模型、工具、权限还是外部提交。
          应看到：层次明确后才处理；MAIL_CHECK_FAILED与当前编程任务超时可能是独立事件。
教练 › 2. 模型问题先看 koder model show，再做一次model test；401/403查授权，429查配额，5xx/网络查服务状态。
          应看到：诊断不无限重试；记录状态码和服务商原因，分享前脱敏。
教练 › 3. MiniMax422且含1026/1027时，新会话用简短无敏感任务对照；避免再把安装包二进制或超长Hex送入上下文。
          应看到：过滤原因不写成断网；保留旧记录，不尝试绕过服务商审核。
教练 › 4. 工具超时或HARNESS_JIT_STOP时，查看最后一次工具、产物与回执，列出完成/未知/未执行。
          应看到：started、退出码0或编排停止均不足以证明业务已完成；续做只接未完成部分。
教练 › 遇到问题怎么处理
  提示 · 把上下文窗口随意调大 → 按真实模型限制配置，保留输出预算；大文件按需检索而不是一次塞满。
  提示 · 升级后还跑旧版 → 检查命令路径和新终端版本；按第16课处理多入口。
教练 › 动手作业：为“发信超时”和“网页搜索返回空结果”分别写恢复方案；第一步都先取证，不能直接重发或重复安装。
       自查标准：发信先核SMTP/收件方；搜索先核URL、状态与正文，空结果不等于没有资料。
教练 › 开发者教学 · 设计、实现与验收
       错误分类保存HTTP状态、服务商码与脱敏原因；用户标题不能与原因矛盾。
       网络失败不得污染成功历史；未知使用量不能记成0。
       恢复依赖任务输入、基线、模型设置与经验版本；取消或撤权后重新确认范围。
  提示 · 延伸阅读（随安装包 docs/）：MINIMAX-CONTENT-REVIEW.md、PROVIDER-WRITING-INPUT.md、COMMAND-DURATION.md、AUTO-UPDATE.zh.md

━━ 第 23 课 / 共 180 课 · 套餐不串门：阿里与火山的正确入口 ━━
教练 › 先看门口的牌子：小米 Token Plan、Kimi、DeepSeek、阿里云 Token Plan 和火山接口目前存在已知 Bug，暂时无法使用，菜单已标灰。配置可以留着，但不会发出请求，也不会切到备用引擎。
教练 › 套餐密钥不是万能门卡。阿里云 Token Plan、Coding Plan 和按量付费是独立通道；火山 Coding Plan 也有单独的地址。Koder 把它们分开列出，不会偷偷换到另一条计费路线。
    koder model presets
    koder model models aliyun-token-plan
    koder model models aliyun-coding-plan
    koder model models volcano-coding-plan
    koder model models kimi-code
  提示 · 设置里先选对应套餐，再选型号，最后输入该套餐的密钥。型号、地区和当前席位必须由你的控制台确认；这里的列表不是赠送额度。
  （小声）门牌号写对，比对着 401 多喊几声“开门”管用。
教练 › 深入学习 · 建议 25 分钟（含自行练习，不是运行时限）
       目标：辨认套餐与按量API，避免选错地区、地址和计费产品。
  提示 · 准备：只准备不含密钥的控制台产品信息。当前停用入口不做真实连接练习。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 运行 koder model presets，找出标灰条目及说明。
          应看到：以当前安装版可用性为准，不按宣传数量推断都可连。
教练 › 2. 对照自己购买的是Token Plan、Coding Plan还是按量API，并写下国内/国际地区。
          应看到：套餐名称相近也不能混用密钥。
教练 › 3. 用本课原有models命令查看对应入口；到服务商控制台核对模型ID与Base URL。
          应看到：缓存或发现列表只提供候选；权限取决于账号。
教练 › 4. 入口可用且产品一致时才按第3课诊断；不可用就保留配置并选已授权替代。
          应看到：不静默改变计费路线、不绕过停用标记。
教练 › 遇到问题怎么处理
  提示 · 控制台有余额却401 → 余额与权限是不同条件，查密钥所属产品与地区。
  提示 · models列表为空 → 先区分发现接口失败、未授权与产品无可用型号，别随机猜模型名。
教练 › 动手作业：用自己的无密钥资料填一张“产品→地区→入口→型号→可用性”表。
       自查标准：无法验证的项写待核查；停用条目标不可用，不填“已测试”。
教练 › 开发者教学 · 设计、实现与验收
       provider路由以预设ID和产品身份为准，不用模型名模糊匹配改变计费。
       发现缓存需要更新时间与失败状态；网络失败保留已有配置。
       文档中的停用清单与运行时目录应同源核对，不用硬凑30+可用数量。
  提示 · 延伸阅读（随安装包 docs/）：PROVIDERS.md、MODEL-DISCOVERY.zh.md、MODEL-DISCOVERY.en.md

━━ 第 24 课 / 共 180 课 · 小米体检：能聊天，还要会交工具作业 ━━
教练 › 小米 Token Plan 暂时检修，请别拿密钥反复试。下面说明只适用于当前可用的接口；灰色入口会直接提示暂时无法使用。
教练 › MiMo 的按量付费与 Token Plan 也不能混用密钥。已经配置好模型后，先检查文字，再明确选择工具续答测试。下面命令会真实请求你的 API，可能产生费用；教程只展示，不替你执行。
    koder model show
    koder model test
    koder model test --tools
  提示 · 旧会话说“你好”只该开启当前问候，不该把几百条历史里的旧任务重新开工。想开始新话题可用 /new；想继续旧任务，请说清楚继续哪一项。原始历史不会因为一次问候被删除。
教练 › 深入学习 · 建议 25 分钟（含自行练习，不是运行时限）
       目标：理解工具调用是完整往返：提出调用、执行、回传、模型续答。
  提示 · 准备：本版MiMo Token Plan入口停用时只做离线理解；真实测试选择当前可用且已授权的服务。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 先运行 koder model show，确认实际模型与协议。
          应看到：文字测试与工具测试必须是同一配置，否则无法对照。
教练 › 2. 在可用入口运行一次model test，再明确运行model test --tools。
          应看到：记录两次结果与时间，工具测试使用无业务副作用的检查。
教练 › 3. 读错误细节：是工具格式、缺少结果、空回复，还是HTTP拒绝。
          应看到：MODEL_PROTOCOL不是自动等于网络断开。
教练 › 4. 新会话做简短对照，保留旧会话；继续旧任务时明确指出未完成项。
          应看到：不把问候当重放旧任务的指令。
教练 › 遇到问题怎么处理
  提示 · 能聊天但不能执行 → 把工具诊断结果交给反馈，不反复修改系统权限来解决协议错误。
  提示 · 旧历史太大 → 新会话隔离复现，使用相关摘要与产物引用；不删除所有记忆。
教练 › 动手作业：画出一次工具往返的四步，标出每步需要的真实证据。
       自查标准：工具声明只证明可见；执行回执证明调用结果；最终续答必须依据该结果。
教练 › 开发者教学 · 设计、实现与验收
       用脚本模型构造工具名、参数、call ID与结果配对的正反例；保留实际HTTP错误体的脱敏原因。
       分别测试空content但有tool_calls、流式分片、缺少结果和重复call ID。
       真实MiMo验收缺Key时写NOT_RUN，不能用兼容桩冒真实套餐通过。
  提示 · 延伸阅读（随安装包 docs/）：MIMO.md、PROVIDER-WRITING-INPUT.md

━━ 第 25 课 / 共 180 课 · 隐私文件带在包里，断网也能看 ━━
教练 › 隐私不该是一条打不开的链接。CLI 的完整条款、简明声明，以及官网消费者原始全文，都随包提供。CLI 配置文件和桌面加密密钥库不同，说明会分别讲清。
    koder privacy consumer
    koder privacy statement
    koder privacy desktop
    koder privacy agreement
    koder privacy sources
  提示 · 这几条只读取本机文件，不需要 API Key。接受许可不会顺手开启学习、同步、音乐、IP 查询或电脑权限。
教练 › 深入学习 · 建议 25 分钟（含自行练习，不是运行时限）
       目标：找到随包隐私全文，知道任务资料会去哪里，并能最小化分享。
  提示 · 准备：使用合成资料学习，不在练习中粘贴真实密码、邮件正文或客户数据。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 依次查看privacy statement、consumer、sources；记录文档版本/来源。
          应看到：有本机全文，不需要为了看政策先调用模型。
教练 › 2. 把数据分为项目文件、对话历史、凭据、外部连接回执。
          应看到：每类存储/发送范围分别判断，不能统称“都不外发”。
教练 › 3. 查看Setup中的资源库、同步、学习与邮件模型读取开关。
          应看到：远端模型收到任务上下文；开关和明确授权控制附加来源。
教练 › 4. 准备反馈前复制最少错误信息并遮盖令牌、私人路径、邮件和账号信息。
          应看到：反馈仍能复现问题，但不包含不必要个人资料。
教练 › 遇到问题怎么处理
  提示 · 把CLI配置与桌面密钥库混为一谈 → 分别阅读对应隐私说明，不把一种存储保证推广到所有产品。
  提示 · 卸载后发现数据仍在 → 普通卸载可保留数据；删除前确认本机、外置目录与服务器范围。
教练 › 动手作业：用虚构项目画一张数据流：本机文件→模型→工具→回执，标出每次外发。
       自查标准：Key不进模型上下文；所选任务内容可能进入模型；写入外部服务另有授权与回执。
教练 › 开发者教学 · 设计、实现与验收
       日志与错误体脱敏覆盖嵌套字段、URL参数和异常cause；原始敏感数据不能进入公开回归夹具。
       权限撤销、导出与删除要按实际范围验收，不能靠UI开关文本证明。
       打包检查包含隐私全文与来源记录，不复制未经许可的第三方资料。
  提示 · 延伸阅读（随安装包 docs/）：USER-GUIDE.zh.md、PRIVATE-RESOURCES.md

━━ 第 26 课 / 共 180 课 · 找得到人：反馈不是把密钥打包寄来 ━━
教练 › 对话里明确说“我要反馈”或“怎么联系官方”，Koder 会给你邮箱和空白模板。它不会自动发送，也不会把聊天历史、API Key 或私人路径塞进附件。
    koder feedback
  （小声）可以吐槽，欢迎复现步骤。密钥就免礼了，我们真不收。
教练 › 深入学习 · 建议 25 分钟（含自行练习，不是运行时限）
       目标：提交可复现、无秘密的反馈，并把撰写任务变成有来源的实际文稿。
  提示 · 准备：准备实际错误输出与最短复现；写作练习只提供已核实事实，不暗示不存在的更新。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 运行 koder feedback，阅读邮箱与空白模板。
          应看到：只显示联系方式和模板，不自动发送聊天或附件。
教练 › 2. 填写版本、系统/终端、操作步骤、预期、实际和最后几行脱敏错误。
          应看到：别人能按步骤复现；不要只写“不能用”。
教练 › 3. 需要Koder写反馈邮件时，明确受众、已核实事实、文件名和字数，要求保存为feedback.md。
          应看到：实际文件可读；未知原因写待排查，不编根因。
教练 › 4. 若要发送，按第21课检查最终内容与收件人后独立确认。
          应看到：撰写交付与发送是两步；可只保留草稿。
教练 › 遇到问题怎么处理
  提示 · 文稿只有空泛口号 → 补受众、具体事实、风险和下一步；要求主文件落盘读回。
  提示 · 更新邮件乱说本版新增 → 先读对应release/CHANGELOG/验收材料；无材料明确非本版增量。
教练 › 动手作业：写一封不发送的故障邮件：标题含版本；正文有最短复现、实际错误和希望协助的事项。
       自查标准：文稿事实可核对，未包含Key或完整私聊；没有声称未执行过的测试。
教练 › 开发者教学 · 设计、实现与验收
       W01类字数检查优先主交付文件而非聊天收尾；保留文件路径和内容哈希。
       W02要么有可核查来源，要么明确非增量披露；乱归因仍应失败。
       压缩长文记录predecessor路径/哈希；不得新增前稿没有的事实。退出码3是质量门禁，不要误报API故障。
  提示 · 延伸阅读（随安装包 docs/）：CONTENT-QUALITY.zh.md、CONTENT-QUALITY.en.md、QUALITY-CHECKS.zh.md、QUALITY-CHECKS.en.md

━━ 第 27 课 / 共 180 课 · 六秒钟的快乐，随时可以散场 ━━
教练 › 代码雨、礼花、烟花、圣诞树、南瓜灯、国庆灯笼、跨年与生日，都在彩蛋菜单里。动画约六秒，任意键立即跳过；不支持动画的终端只显示文字。普通命令、JSON 和脚本输出不会被刷屏。
    koder celebrate
    koder celebrate fireworks
    koder celebrate auto notice
    koder celebrate auto off
  提示 · 默认在已收录节日显示一次祝福，选择 auto on 才自动播放动画。地区日历和农历节日按本机日期识别；自己的纪念日可添加，之后每年自动出现。
    koder celebrate custom --date 03-14 --name "Our day"
教练 › 深入学习 · 建议 20 分钟（含自行练习，不是运行时限）
       目标：使用可跳过动画而不打断工作，理解交互展示与脚本输出的区别。
  提示 · 准备：使用交互终端；动画不需要模型，也不代表任务成功。敏感场合先关闭自动效果。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 运行 koder celebrate，先阅读菜单再选fireworks等效果。
          应看到：能选择具体效果，不自动执行项目命令。
教练 › 2. 播放时按任意键跳过。
          应看到：立即回到可输入状态，动画不应占住终端。
教练 › 3. 运行 koder celebrate auto notice，只显示节日祝福；不需要则auto off。
          应看到：notice与自动播放不同；普通命令不应刷屏。
教练 › 4. 在终端不支持颜色或动画时查看文字降级。
          应看到：没有残余光标控制；退出后可正常输入。
教练 › 遇到问题怎么处理
  提示 · 动画后输入光标异常 → 记录终端、尺寸和复现；优先关闭效果恢复正常输入，不重置所有配置。
  提示 · 节日没出现 → 先检查日期、自动模式与收录范围，不承诺所有地区每个节日都已覆盖。
教练 › 动手作业：播放一次、跳过一次、关闭一次；验证之后/help可用。
       自查标准：可跳过且不影响后续输入；效果出现不作为成功验收证据。
教练 › 开发者教学 · 设计、实现与验收
       动画必须恢复光标、raw mode和监听器；取消、异常和自然结束都测试。
       TTY、TERM=dumb、CI与JSON路径分别检查，机器输出不得混入ANSI帧。
       节日去重按日期与用户设置处理，不能每次命令都播放。
  提示 · 延伸阅读（随安装包 docs/）：USER-GUIDE.zh.md、USER-GUIDE.en.md

━━ 第 28 课 / 共 180 课 · 记住一小格生日，不建立人生档案 ━━
教练 › 你可以在对话里明确说“记住我的生日是三月十四日”，或使用下面的数字日期。只保存月日，不索要出生年份或年龄。普通提及会先给你选择，他人生日不会变成你的生日。教程不会替你保存示例日期。
    koder celebrate birthday --date 03-14
    koder celebrate birthday forget
  提示 · 生日设置不会自动进入模型或同步。你在普通消息里主动输入的内容，仍按所选模型的正常对话规则处理。
教练 › 深入学习 · 建议 20 分钟（含自行练习，不是运行时限）
       目标：按用户明确意愿保存最少生日信息，并能查看、更改和关闭。
  提示 · 准备：使用虚构月日演练。不需要出生年份、年龄或证件；日常提到他人生日不等于授权记自己的生日。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 运行 koder help celebrate，查看birthday相关子命令和输入格式。
          应看到：按当前帮助操作，避免误把日期当任务文本。
教练 › 2. 在对话明确说“记住我的生日是三月十四日”，阅读保存提示。
          应看到：只保存允许的月日，不推断年龄或身份。
教练 › 3. 按本课原有命令查看生日状态，修改一个演练日期再查看。
          应看到：实际保存值与提示一致，学习/同步开关不被附带开启。
教练 › 4. 演练结束清除测试生日，保持自动祝福是否开启由自己选择。
          应看到：删除与停动画不同；不留下虚构个人资料。
教练 › 遇到问题怎么处理
  提示 · 误记成别人的生日 → 明确纠正并查看保存值，不仅让模型说“知道了”。
  提示 · 关闭彩蛋后生日还在 → 动画偏好与日期记录是独立项，按需要分别管理。
教练 › 动手作业：用虚构日期完成设置→查看→删除，记录最后状态。
       自查标准：最终不保留演练日期，不新增年份或其他个人信息。
教练 › 开发者教学 · 设计、实现与验收
       自然语言意图必须区分本人明确记忆请求、引用与他人信息；不从含糊提及自动持久化。
       覆盖非法日期、闰日、重复设置与删除；通知应遵守关闭与去重。
       隐私删除验证实际存储，不能只改展示文本。
  提示 · 延伸阅读（随安装包 docs/）：USER-GUIDE.zh.md

━━ 第 29 课 / 共 180 课 · 生日歌先问一句，语言由你做主 ━━
教练 › 音乐和 IP 辅助地区默认关闭，分别确认。开启音乐后，生日使用对话时最多自动打开一个浏览器页；本地旋律无需登录。浏览器不让自动播放时，点播放即可。关闭页面不会影响工作。
    koder celebrate music on
    koder celebrate music off
    koder celebrate locale --language en
    koder celebrate locale --language auto
    koder celebrate locale --ip
  提示 · 手动语言优先，其次是你主动开启的本地常用语言计数，IP 只作弱提示。IP 查询会让 ipapi.co 看到公网地址；选外部音乐平台会把访问数据交给该平台。每一步都能回车跳过。
  （小声）蛋糕可以多切一块。权限按需给就好。
教练 › 深入学习 · 建议 20 分钟（含自行练习，不是运行时限）
       目标：明确选择语言和外部音乐行为，不因生日自动泄露位置或打开有声页面。
  提示 · 准备：确认当前环境适合播放声音；语言由用户设置为准，不用IP猜测替代本人选择。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 用 koder lang zh 或 koder lang en 设置偏好，单次任务可用--lang。
          应看到：界面与模型语言按各自支持范围生效；原始代码和引用不乱翻译。
教练 › 2. 按本课原有音乐命令查看当前设置，先保持关闭。
          应看到：阅读状态不打开浏览器、不播放音乐。
教练 › 3. 确实想听时再明确同意打开选定的外部音乐入口。
          应看到：外部网站可能需登录或手动播放；浏览器自动播放限制不能当Koder已播放。
教练 › 4. 停止播放、关闭测试页，再关闭不需要的音乐偏好。
          应看到：不影响原来正在播放的其他应用；语言与音乐独立。
教练 › 遇到问题怎么处理
  提示 · 浏览器打开但无声 → 检查页面播放按钮、系统音量与站点限制；不要反复开多个标签。
  提示 · 语言识别不正确 → 让用户明确选择并保存；不擅自增加IP查询。
教练 › 动手作业：记录语言设置、是否授权外链、页面打开与实际播放四个独立状态。
       自查标准：打开不等于播放，播放不等于下载授权；未选择的外部行为没有发生。
教练 › 开发者教学 · 设计、实现与验收
       外部URL校验与浏览器权限沿原入口；不注入账户口令或绕过站点风控。
       本地化使用自然表达，日期/语言偏好可独立设置；不能把地区猜测写成用户事实。
       把打开失败、播放不可验证与用户拒绝分开记录。
  提示 · 延伸阅读（随安装包 docs/）：USER-GUIDE.zh.md、APP-USE-AND-LEARN.en.md

━━ 第 30 课 / 共 180 课 · 基础训练结课与项目初稿 ━━
教练 › 基础训练完成！先收好速查表，后面还有150课专题课堂与毕业项目：
    koder setup
        设置界面：方向键或鼠标配好一切
    koder
        进入对话
    koder "任务"
        直接干活
    koder ask "问题"
        只读提问
    koder review
        代码审查
    koder fix --check "命令"
        修到通过
    koder test 文件
        补测试
    koder flow run 流程
        编排流程
    koder --moa "任务"
        几个模型一起想
    koder gateway setup 平台
        接入聊天软件
    koder scan
        扫描本机工程
    koder help 命令
        查任何命令的说明
    koder learn 数字
        回到某一课
教练 › 下一步：先用 koder setup 配好模型，然后在你自己的项目里输入 koder。
  提示 · 进入你的项目：cd D:\code\my-app，然后输入 koder。
  （小声）教练下班了。记住：Koder 负责提议，你负责拍板，锅……我们一起背。
  · 最后可以选择保留练习场，或者直接删除。
教练 › 深入学习 · 建议 90 分钟（含自行练习，不是运行时限）
       目标：完成可运行、可预览、可核对的项目交付，并交一份有来源的产品文稿。
  提示 · 准备：从网站、应用或PPT中选一个真实小需求，放在独立Koder Projects目录。使用合成数据，外部部署和GitHub上传单独确认。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写任务卡：受众、目标、必需内容、不做的范围、产物路径、验证方式。网站先做3个可浏览版式。
          应看到：要求能对应实际文件与行为；选定方案后再细化。
教练 › 2. 要求实现并补检查；静态站点在当前聊天用 /preview start --directory site，确认目录正确。
          应看到：浏览器能看到本地产物；框架工程先按项目README启动开发服务器，再用已有preview URL入口。
教练 › 3. 改一处标题，查看预览是否更新；检查手机宽度、键盘操作、链接与空数据。
          应看到：刷新或重载反映实际改动；不能只交一张截图。
教练 › 4. 要求生成项目结构图H5：目录、入口、模块、数据流、运行/测试方式和未接通服务；确认图中节点来自项目。
          应看到：结构图可在浏览器打开，路径可追溯，不把示例支付/邮件当已上线服务。
教练 › 5. 写一篇面向技术决策者的介绍，保存intro.md；另写无变更清单的更新邮件，明确非本版增量。
          应看到：文稿主文件符合字数与受众；来源、限制和下一步具体，不编定价或新增功能。
教练 › 6. 交付README、测试结果、预览说明、结构图、文稿与未验清单；用 /preview stop 收尾。
          应看到：别人可按README重现；只有明确同意时才按第21课上传或走Netlify授权部署。
教练 › 遇到问题怎么处理
  提示 · 预览状态显示not-running → 预览归属于创建它的进程；在同一聊天操作，独立终端start用Ctrl+C停止，不指望另进程status看到它。
  提示 · 完成报告有了却没有项目文件 → 回到任务卡逐项核路径与内容；缺文件就标未完成并继续交付。
教练 › 动手作业：提交毕业包：README、可运行产物、测试日志、project-map.html、intro.md、release-email.md和未验清单。不要提交密钥、账号缓存或node_modules。
       自查标准：验收五项：能运行、能解释、能验证、能恢复、事实有据。任何一项缺失都写清，截图不能替代运行，脚本模型不能冒真实账号。
教练 › 开发者教学 · 设计、实现与验收
       开发者结课：从干净测试目录按README复现；核验失败基线、最小diff、测试和打包文件。
       网页静态预览只绑定本机；不要暴露整个主目录或把公开部署当预览。Netlify登录、站点选择与发布均按已有授权流程。
       交件记录版本、SHA、命令/退出码与平台；真实Windows、真实模型、真实账户、签名分别标PASS/FAIL/NOT_RUN。
       对照30课完成表找缺口，旧行为回归与新能力验证都保留。
  提示 · 延伸阅读（随安装包 docs/）：VISUAL-WORKFLOW-AND-NETLIFY.md、MAIL-AND-LIVE-PREVIEW.md、CONTENT-QUALITY.zh.md、GITHUB-PROJECTS.zh.md

━━ 第 31 课 / 共 180 课 · 找到正确的终端与当前目录 ━━
教练 › 本课讲解：终端是输入命令的窗口，Shell才是解释命令的程序。Windows Terminal可以同时打开PowerShell和CMD，标签标题不能保证其中运行的解释器。当前目录决定相对路径落在哪里：相同的README.md在两个目录中是两个文件。先确认位置，再让Agent动手，能避免“改好了却找不到”的大多数困惑。
    PowerShell: Get-Location
    CMD: cd
    macOS/Linux: pwd
  提示 · 示例解读：输出应是你准备练习的目录；它不必等于Koder安装目录。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「找到正确的终端与当前目录」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第1、4、18课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「找到正确的终端与当前目录」，可与本课示例对照；无无关真实资料。
教练 › 2. 打开终端并记下所用Shell
          应看到：写下PowerShell、CMD或zsh/bash；不要把提示符也复制进命令。
教练 › 3. 查看当前位置
          应看到：得到一个绝对路径。
教练 › 4. 进入自己的Koder Projects练习目录
          应看到：再次查位置，确认路径已改变。
教练 › 5. 请求Koder只列出当前目录文件
          应看到：对照终端输出，确认双方指的是同一目录。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「输出应是你准备练习的目录；它不必等于Koder安装目录。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 路径有空格时整体加引号；显示找不到目录时先查拼写，不重复安装Koder。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：创建location-notes.md，记录Shell、绝对路径和一个相对文件名；解释离开目录后该文件名为何指向不同位置。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不一定；必须重新查看当前位置，不能凭窗口标题判断。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       程序应将workspace显式传给工具；测试要覆盖空格、中文、盘符和启动目录差异。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CLI-CONTRACTS.md、USER-GUIDE.zh.md

━━ 第 32 课 / 共 180 课 · 把文件路径写对：相对、绝对与引号 ━━
教练 › 本课讲解：相对路径是从当前目录出发的路线；绝对路径包含完整起点。引号用于把含空格的路径保持为一个参数，它不会自动转义所有Shell语法。教程中的尖括号是占位符说明，不应该原样输入。用一个名字带空格的练习文件，能很快识别命令究竟收到了几个参数。
    PowerShell: Get-Item "./notes draft.txt"
    CMD: dir "notes draft.txt"
    macOS/Linux: ls -l "./notes draft.txt"
  提示 · 示例解读：只定位notes draft.txt这个文件，而不是分别寻找notes和draft.txt。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「把文件路径写对：相对、绝对与引号」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第31课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「把文件路径写对：相对、绝对与引号」，可与本课示例对照；无无关真实资料。
教练 › 2. 在练习目录建立notes draft.txt
          应看到：文件内容写一行自己的测试文字。
教练 › 3. 用对应Shell的带引号命令查看
          应看到：显示一个文件。
教练 › 4. 把文件的完整路径写入笔记
          应看到：包含真实起点，不使用示例用户名。
教练 › 5. 让Koder读取这个文件的首行
          应看到：返回与编辑器一致的文字。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「只定位notes draft.txt这个文件，而不是分别寻找notes和draft.txt。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 反斜杠、正斜杠和转义在Shell中不同；不要把PowerShell整行复制进CMD。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：做一张三列表：相对路径、绝对路径、引用方式。用一个中文文件名再验证一次。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不能；引号只影响参数解析，权限检查仍必须通过。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       路径校验先规范化再检查授权根；符号链接另验，不能把字符串前缀相同当成在工作区内。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CLI-CONTRACTS.md、USER-GUIDE.zh.md

━━ 第 33 课 / 共 180 课 · 项目目录：让文件、历史和验收放在一起 ━━
教练 › 本课讲解：一个项目应有清楚的入口、输出和证据目录。把所有工作放在桌面根目录会使清理、分享和排障都很困难。Koder Projects是用户选定的统一容器，下面每个项目仍应独立；自动新建项目和继续修改已有工程是两种任务，不要让Agent重新建立一个平行副本。
    Koder Projects/
      memoir-site/
        README.md
        src/
        evidence/
  提示 · 示例解读：README写明这是哪个项目、怎么启动、怎么检查；evidence只放脱敏验证记录。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「项目目录：让文件、历史和验收放在一起」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第32课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「项目目录：让文件、历史和验收放在一起」，可与本课示例对照；无无关真实资料。
教练 › 2. 选一个没有真实资料的新项目名
          应看到：与其他项目不重名。
教练 › 3. 建立README、src、evidence三处
          应看到：目录结构能被普通文件管理器看到。
教练 › 4. 告诉Koder“继续在此目录修改”
          应看到：执行前显示的workspace正确。
教练 › 5. 记录一次小修改与检查结果
          应看到：文件和证据属于同一项目。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「README写明这是哪个项目、怎么启动、怎么检查；evidence只放脱敏验证记录。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要把node_modules、密钥或整个用户目录复制进新项目；已有工程不因整理目录而自动移动。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交一份项目地图，标出源文件、产物、秘密所在边界和可安全打包的文件。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不是；新项目应保持自己的工作区与会话边界。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       新项目路由必须返回实际创建路径；失败不得把默认工作区作为新项目成功回执。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CLI-CONTRACTS.md、USER-GUIDE.zh.md

━━ 第 34 课 / 共 180 课 · 复制命令之前先分清命令与输出 ━━
教练 › 本课讲解：教程通常同时展示要输入的命令、工具输出和解释文字。把提示符、行号或“应该看到”一起粘进去会产生莫名其妙的错误。先运行只读短命令，观察返回，再逐步增加参数，比一次粘贴十行更容易知道错误发生在哪一步。
    输入：koder --version
    示例输出：0.4.11
    不要输入：koder › koder --version
  提示 · 示例解读：版本由程序返回；示例版本是内容基线，不保证你的电脑正好相同。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「复制命令之前先分清命令与输出」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第33课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「复制命令之前先分清命令与输出」，可与本课示例对照；无无关真实资料。
教练 › 2. 复制不含提示符的版本命令
          应看到：程序打印版本并结束。
教练 › 3. 把实际结果与教材示例分开记
          应看到：没有把示例冒充实测。
教练 › 4. 运行koder help
          应看到：看到帮助而非开始新任务。
教练 › 5. 挑选一条只读子命令看帮助
          应看到：明确参数位置与可选项。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「版本由程序返回；示例版本是内容基线，不保证你的电脑正好相同。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 出现“无法识别命令”先看是否多粘了$、>或中文解释；别立即修改系统执行策略。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：把一段混合日志标成“命令/输出/解释”三类，并只重新执行其中无副作用的命令。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不能，必须保存本机实际执行产生的输出。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       帮助示例用代码块分隔输入和输出；复制按钮只复制命令，不能混入测试结果。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CLI-CONTRACTS.md、USER-GUIDE.zh.md

━━ 第 35 课 / 共 180 课 · 看懂退出码：正常结束与失败结束 ━━
教练 › 本课讲解：退出码是程序给调用者的简短结果，不是所有错误详情。零通常代表命令定义的成功，非零需要结合该命令契约解释。最后一个命令会覆盖Shell保存的退出码，所以应紧接着读取。对CI而言，漂亮的文字不能抵消非零状态，反过来空输出也不一定失败。
    koder --version
    $LASTEXITCODE
  提示 · 示例解读：版本查询正常时应为0；命令链和批处理展开规则可能影响读取，应拆行核对。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「看懂退出码：正常结束与失败结束」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第34课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「看懂退出码：正常结束与失败结束」，可与本课示例对照；无无关真实资料。
教练 › 2. 先执行一条成功的只读命令
          应看到：立即记录输出与退出码。
教练 › 3. 故意传入不存在的参数
          应看到：记录非零结果和错误文字。
教练 › 4. 对照koder help修正参数
          应看到：错误消失，避免反复猜测。
教练 › 5. 将两次结果并列
          应看到：证明检查既能发现错，也能识别对。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「版本查询正常时应为0；命令链和批处理展开规则可能影响读取，应拆行核对。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → CMD在括号或复杂命令链中可能提前展开变量；教学练习优先逐行读取。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：建立exit-codes.md，记录成功、参数错误和业务检查失败三种情况，不把它们都叫网络故障。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不会；自动化通常看退出码，因此需要检查输出契约而非猜测。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       CLI应统一参数错误、业务失败和取消语义；测试断言退出码及关键错误字段，不能只看stderr。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CLI-CONTRACTS.md、USER-GUIDE.zh.md

━━ 第 36 课 / 共 180 课 · 标准输入：交互终端与管道的区别 ━━
教练 › 本课讲解：交互输入用于对话，标准输入也可能来自另一个程序。管道的生产者即使暂时没发文字，仍可能保持连接。脚本已有明确任务参数时，不应无限等待输入结束。本课用有界合成生产者观察这件事，不启动长时间睡眠，也不把真实资料交给模型。
    node docs/tutorial-labs/stdin-producer.mjs 100
    预期：输出一条合成报告，约100ms后关闭
  提示 · 示例解读：这是本地输入夹具，测试的是数据与EOF，不验证服务商接口。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「标准输入：交互终端与管道的区别」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第35课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「标准输入：交互终端与管道的区别」，可与本课示例对照；无无关真实资料。
教练 › 2. 阅读stdin-producer.mjs
          应看到：确认只有合成文本且延迟有上限。
教练 › 3. 单独运行夹具
          应看到：输出后正常退出。
教练 › 4. 输入5001这一非法延迟
          应看到：返回参数错误而非无限等待。
教练 › 5. 在笔记画出生产者到消费者再到EOF
          应看到：区分无数据与输入结束。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「这是本地输入夹具，测试的是数据与EOF，不验证服务商接口。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 管道另一端未关闭时不要误判成模型没有思考；先查输入等待和实际请求是否发出。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：写出有任务参数、无任务参数、空管道三种预期，并在验收表标明尚未跑真实模型。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不是；生产者可能仍打开着管道但暂时没有写入。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       读取stdin需要有界首块等待、取消和资源释放；答案已输出仍不退出也是缺陷。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CLI-CONTRACTS.md、USER-GUIDE.zh.md

━━ 第 37 课 / 共 180 课 · 输出重定向：把日志保存下来 ━━
教练 › 本课讲解：标准输出通常承载结果，标准错误通常承载诊断，但每个命令的实际约定要看帮助。把它们合并可以方便人工查错，结构化JSON输出却应避免混入进度文字。日志要记录命令、版本、时间与工作目录；一大串无上下文的截屏无法可靠复现。
    koder --version > version.txt
    说明：该命令在支持重定向的Shell里把版本写入文件
  提示 · 示例解读：version.txt里只有实际版本；不要把文件名误写成系统路径。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「输出重定向：把日志保存下来」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第36课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「输出重定向：把日志保存下来」，可与本课示例对照；无无关真实资料。
教练 › 2. 在练习目录保存版本输出
          应看到：文件存在且可打开。
教练 › 3. 为一次参数错误分别保留输出和诊断
          应看到：知道信息去了哪个通道。
教练 › 4. 写一行运行说明
          应看到：包含Shell和工作区。
教练 › 5. 检查日志是否出现秘密
          应看到：敏感内容先脱敏再分享。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「version.txt里只有实际版本；不要把文件名误写成系统路径。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 重定向可能覆盖同名文件；先选新名字。PowerShell文本编码也要在跨工具读取时核对。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：制作logs目录，放成功与失败各一条记录，并附复现步骤。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不应；只分享必要字段，删除密钥、授权码和私人内容。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       机器输出保持stdout纯净；stderr与进度不能破坏JSON解析。大日志保留原始文件再摘要。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CLI-CONTRACTS.md、USER-GUIDE.zh.md

━━ 第 38 课 / 共 180 课 · 环境变量：临时配置与长期配置 ━━
教练 › 本课讲解：环境变量属于进程的启动环境。当前终端设置后，已运行的另一个窗口不一定能看到；关掉窗口也可能丢失。配置中引用变量名与保存密钥本身是两回事。先用无秘密的演示值观察作用域，再选择已有的凭据保护方式，避免把密钥写进命令历史。
    $env:KODER_DEMO = "lesson"
    $env:KODER_DEMO
  提示 · 示例解读：演示值可公开；它不会绑定任何模型，也不会授予权限。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「环境变量：临时配置与长期配置」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第37课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「环境变量：临时配置与长期配置」，可与本课示例对照；无无关真实资料。
教练 › 2. 在当前窗口设置演示变量
          应看到：使用本Shell的读取方式查看。
教练 › 3. 开新窗口再次检查
          应看到：记录是否继承，别预设结果。
教练 › 4. 在同一窗口启动一个子进程读取
          应看到：观察子进程获得启动时环境。
教练 › 5. 删掉演示变量
          应看到：确认清理只针对自己的变量。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「演示值可公开；它不会绑定任何模型，也不会授予权限。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要把真实Key拿来测试截图；修改系统永久环境变量后旧进程仍可能保留旧值。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：画出终端A、终端B和子进程的环境关系，解释为什么重开进程有时才生效。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不会，已启动进程通常保留创建时继承的环境。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       测试使用任务专用变量名与临时HOME替身；不要覆盖HOME、PATH等基础变量导致别的任务损坏。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CLI-CONTRACTS.md、USER-GUIDE.zh.md

━━ 第 39 课 / 共 180 课 · 只读探索：动手前先认识仓库 ━━
教练 › 本课讲解：接手仓库时先找入口和测试命令，比让Agent直接重写更稳。README说明用法，包清单说明工具链，测试目录说明已有约束，配置文件说明运行环境。探索的目标是形成可验证的地图，不是阅读全部依赖文件或把仓库内容一次塞给模型。
    给Koder的任务：只读查看README、包清单和测试入口，列出启动方式、验证命令及仍不确定的地方。
  提示 · 示例解读：回答应引用具体文件，并把未知项单列；此任务不修改源文件。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「只读探索：动手前先认识仓库」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第38课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「只读探索：动手前先认识仓库」，可与本课示例对照；无无关真实资料。
教练 › 2. 列出顶层文件
          应看到：识别源码、测试、文档和生成物。
教练 › 3. 读取README与包清单
          应看到：找到真实脚本，不凭技术栈猜命令。
教练 › 4. 查看一个代表性测试
          应看到：知道测试如何加载代码。
教练 › 5. 保存仓库地图
          应看到：每个判断都能回到文件证据。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「回答应引用具体文件，并把未知项单列；此任务不修改源文件。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 忽略依赖缓存和生成产物可节省阅读；看到README与脚本冲突时以实际文件核查并报告差异。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交repository-map.md，包含入口、测试、约束、三条待确认问题。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不能；探索任务没有授权这种跨范围修改。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       工具检索先限定目录与文件类型；引用应携带路径和定位信息，避免只说“代码里写着”。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CLI-CONTRACTS.md、USER-GUIDE.zh.md

━━ 第 40 课 / 共 180 课 · 文件编码、换行与中文路径 ━━
教练 › 本课讲解：编码决定字节如何变成文字，换行决定每行如何分隔。UTF-8、CRLF和LF属于不同维度。中文乱码可能来自源文件、终端编码或子进程输出，不要一上来给所有文件批量转码。先用很小的中文样本确定哪一层损坏，再做局部修复。
    测试文本：Koder 中文练习，数量 3，金额 750 分。
    保存为encoding-sample.txt，记录编辑器显示的编码。
  提示 · 示例解读：编辑器、终端和Koder读到同一句话；没有替换符或丢失标点。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「文件编码、换行与中文路径」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第39课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「文件编码、换行与中文路径」，可与本课示例对照；无无关真实资料。
教练 › 2. 建立短中文样本
          应看到：只写合成内容。
教练 › 3. 用编辑器和终端分别读取
          应看到：记录第一次出现乱码的位置。
教练 › 4. 查看差异中的换行变化
          应看到：确认是否误改了整个文件。
教练 › 5. 重新保存并再读
          应看到：原文本含义与字符完整。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「编辑器、终端和Koder读到同一句话；没有替换符或丢失标点。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要对二进制文件做文本转码；UTF-8设置也不能修复本来就已损坏的字节。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：用一份CRLF和一份LF文本比较差异，说明代码内容相同但字节为何不同。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不是；编码与换行是两个独立属性。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       读取应明确编码和错误处理；哈希按原字节计算，展示转换不能冒充原始证据。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CLI-CONTRACTS.md、USER-GUIDE.zh.md

━━ 第 41 课 / 共 180 课 · 多窗口：任务身份与项目边界 ━━
教练 › 本课讲解：多个窗口可以共享安装程序，但不能共享一个可随意覆盖的任务状态。工作区、会话ID和当前任务分别回答在哪里、接哪段历史、正在做什么。同目录多窗口也可能互改同一文件，因此会话隔离不等于文件修改自动没有冲突。
    窗口A：只在project-a写A_ONLY_TEST
    窗口B：只在project-b写B_ONLY_TEST
    均使用合成文本，不放私人秘密
  提示 · 示例解读：B不应拿A的任务历史回答；磁盘文件也只出现在指定目录。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「多窗口：任务身份与项目边界」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第40课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「多窗口：任务身份与项目边界」，可与本课示例对照；无无关真实资料。
教练 › 2. 建立两个独立练习目录
          应看到：每个都有不同README。
教练 › 3. 分别启动Koder并记工作区
          应看到：窗口标签与实际路径对得上。
教练 › 4. 各做一项只读或小文件任务
          应看到：结果只属于自己的项目。
教练 › 5. 回到A核对上下文
          应看到：A仍能找到本项目记录，B不串入。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「B不应拿A的任务历史回答；磁盘文件也只出现在指定目录。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 遇到会话被占用先确认是否显式复用同一session；不要删除未知锁文件或杀掉别人的进程。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：提交A/B两个目录、任务结果和隔离记录；把“会话独立”与“同文件冲突”分开解释。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不一定；历史可隔离，文件仍可能竞争，需要划分文件或合并差异。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       锁须含所有者与存活判断，回收必须有证据；默认会话命名不能让所有工作区共用default。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CLI-CONTRACTS.md、USER-GUIDE.zh.md

━━ 第 42 课 / 共 180 课 · 差异检查：看见每一个修改 ━━
教练 › 本课讲解：差异展示旧内容如何变成新内容，不能只凭最终文件看出是否丢掉重要逻辑。先看文件列表，再看每一处增删，最后核对测试和需求。大块格式化会掩盖真正修改，所以一个小修复尽量保持小差异；不相关文件应说明原因或移出本次任务。
    git diff --stat
    git diff --check
    git diff
    前提：练习目录已是你拥有的Git仓库
  提示 · 示例解读：统计告诉你范围，check抓空白问题，完整diff展示实际修改；三者不是同一种验证。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「差异检查：看见每一个修改」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第41课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「差异检查：看见每一个修改」，可与本课示例对照；无无关真实资料。
教练 › 2. 记录修改前的状态
          应看到：知道原有未提交内容。
教练 › 3. 让Koder只修一个小问题
          应看到：范围明确到文件和行为。
教练 › 4. 逐段看diff
          应看到：确认没有删除测试或混入密钥。
教练 › 5. 按验收清单核对
          应看到：每项需求能对应差异和检查。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「统计告诉你范围，check抓空白问题，完整diff展示实际修改；三者不是同一种验证。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → git diff默认不显示未跟踪文件内容；还要看git status，不能漏交新增文件。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：做一份变更清单，列出修改目的、证据和不在范围的文件。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不是，它主要检查差异中的空白问题，不能代替运行验证。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       自动验收同时查tracked diff与new files；不要用全仓格式化让文件计数看起来像很多工作。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CLI-CONTRACTS.md、USER-GUIDE.zh.md

━━ 第 43 课 / 共 180 课 · 撤销与恢复：先保护当前工作 ━━
教练 › 本课讲解：撤销不是把目录一键恢复成某个旧版本。用户可能在Agent工作期间编辑了其他文件，粗暴reset会丢掉这些内容。安全恢复要先识别本轮写入、原有改动和外部副作用，分别处理。文件能逆向恢复，邮件和远程发布却不能靠本地撤销消失。
    恢复说明模板：
    本轮文件：...
    用户原有改动：...
    已发生外部操作：...
    拟恢复范围：...
  提示 · 示例解读：先有可审查的恢复范围，再执行具体操作。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「撤销与恢复：先保护当前工作」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第42课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「撤销与恢复：先保护当前工作」，可与本课示例对照；无无关真实资料。
教练 › 2. 复制自己的小练习文件作备份
          应看到：不动真实项目。
教练 › 3. 做一处可见修改
          应看到：记录原文和新文。
教练 › 4. 只恢复这一处
          应看到：备份与恢复结果一致。
教练 › 5. 复查其他文件
          应看到：确认没有扩大撤销范围。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「先有可审查的恢复范围，再执行具体操作。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要用git reset --hard或清空目录当通用修复；结果UNKNOWN时先对账，不能当成没有执行。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：提交一个最小逆向差异，说明哪些效果可回退、哪些需要外部核对。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不能；必须按邮件服务实际能力处理，不能宣称本地撤销已撤信。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       回退按操作归属与文件前后哈希判断；基线漂移时停止覆盖并请求合并。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CLI-CONTRACTS.md、USER-GUIDE.zh.md

━━ 第 44 课 / 共 180 课 · 可复现问题报告：别人照着也能看到 ━━
教练 › 本课讲解：好的问题报告让维护者从相同前置条件到达相同结果。版本、平台、Shell、任务输入、最小文件和实际输出缺一项都可能变成猜谜。报告要同时写预期和实际，不能只有“坏了”。减少样本大小时仍要保留触发条件，尤其是中文路径、并发或管道这样的关键因素。
    标题：Windows PowerShell中带空格路径读取失败
    前置：版本、Shell、工作区
    步骤：1/2/3
    预期：...
    实际：错误码与退出码
  提示 · 示例解读：别人无需你的私人账号或完整磁盘即可理解并尝试复现。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「可复现问题报告：别人照着也能看到」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第43课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「可复现问题报告：别人照着也能看到」，可与本课示例对照；无无关真实资料。
教练 › 2. 选一个合成可重复问题
          应看到：不使用真实客户数据。
教练 › 3. 缩减到最少步骤
          应看到：每一步都影响复现。
教练 › 4. 记录实际输出而非转述
          应看到：保留错误码和时间。
教练 › 5. 按同样步骤再验证一次
          应看到：区分稳定复现与偶发现象。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「别人无需你的私人账号或完整磁盘即可理解并尝试复现。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 如果故障未重现，报告NOT_REPRODUCED而不是改写旧证据；不要向支持邮箱发送Key。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：完成bug-report.md和最小样本，另列尚未验证的平台。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不能；应保留原失败和本轮未复现的边界。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       缺少复现不等于用户没有问题；分类配置、平台、服务、产品逻辑和证据不足。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CLI-CONTRACTS.md、USER-GUIDE.zh.md

━━ 第 45 课 / 共 180 课 · 单元项目：做一份可搬走的练习工作区 ━━
教练 › 本课讲解：这一课把终端、路径、文件、差异和日志连成一份可交接的工作区。目标不是堆很多文件，而是另一位学习者能够打开README、运行本地检查、看到同一结果。目录可以压缩搬走，但不应携带密码、无关缓存或机器专属绝对路径。
    terminal-lab/
     README.md
     sample.txt
     evidence/commands.txt
     evidence/results.txt
  提示 · 示例解读：README说明Shell和步骤，日志保留成功与失败两类结果。
教练 › 深入学习 · 建议 90 分钟（含自行练习，不是运行时限）
       目标：完成「单元项目：做一份可搬走的练习工作区」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第44课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「单元项目：做一份可搬走的练习工作区」，可与本课示例对照；无无关真实资料。
教练 › 2. 建立干净练习目录
          应看到：没有秘密或真实资料。
教练 › 3. 完成路径与编码两个检查
          应看到：结果可从文件核对。
教练 › 4. 保存一次参数错误再修正
          应看到：证明失败有清楚诊断。
教练 › 5. 在新位置复制后重跑只读检查
          应看到：相对路径依然有效。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「README说明Shell和步骤，日志保留成功与失败两类结果。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 搬迁失败先查硬编码绝对路径；不要靠把整台电脑配置一起打包来解决。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：提交压缩包与验收表，至少记录路径、编码、退出码和目录隔离四项。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不足，至少还要在新位置检查文件和运行入口。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       设计交件清单与哈希；压缩包验收要实际解压后检查入口，而不只检查压缩命令退出0。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CLI-CONTRACTS.md、USER-GUIDE.zh.md

━━ 第 46 课 / 共 180 课 · 模型、引擎与工具：三层不要混淆 ━━
教练 › 本课讲解：模型负责根据上下文生成下一步，Koder执行引擎负责审批、调度、保存回执，工具负责读文件或执行具体动作。换模型不等于换权限，也不自动增加浏览器能力。排障时先确定哪层失败：模型未返回、工具不可用、还是操作已经执行但结果没有送回。
    任务→模型提出调用→Core核授权→工具执行→回执→模型续答
  提示 · 示例解读：每个箭头都有独立失败方式；模型说“完成”不能替代工具回执。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「模型、引擎与工具：三层不要混淆」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第45课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「模型、引擎与工具：三层不要混淆」，可与本课示例对照；无无关真实资料。
教练 › 2. 查看开屏模型和引擎
          应看到：分别记下两个名称。
教练 › 3. 查看一个工具的实际返回
          应看到：区分模型文字和工具证据。
教练 › 4. 让Koder做一次只读文件任务
          应看到：定位实际读取发生在哪层。
教练 › 5. 画出执行链
          应看到：标明授权和取消由谁处理。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「每个箭头都有独立失败方式；模型说“完成”不能替代工具回执。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → HTTP错误不一定是网络断开；工具拒绝也不一定是模型坏了。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：用一份日志标注三层信息，并列出每层一个可验证故障。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不会；电脑授权仍由原权限系统决定。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       provider、executor和tool adapter边界清楚；诊断保留层级、错误码与原始回执引用。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CLI-CONTRACTS.md、SESSION-INPUT-AND-SKILLS.zh.md

━━ 第 47 课 / 共 180 课 · 服务商、区域与套餐：选择正确入口 ━━
教练 › 本课讲解：同一厂商可能提供国内、国际、按量和订阅套餐入口，它们的模型ID、鉴权和配额可能不同。网页能登录并不能证明某条API可用。配置的最小单位是服务产品、区域、Base URL、协议和模型ID的组合，而不是只填一个品牌名。
    配置核对表：服务产品 / 区域 / Base URL / 协议 / 模型ID / 凭据来源
  提示 · 示例解读：只记录变量名或已脱敏信息，不记录Key。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「服务商、区域与套餐：选择正确入口」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第46课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「服务商、区域与套餐：选择正确入口」，可与本课示例对照；无无关真实资料。
教练 › 2. 从账号控制台确认购买的产品
          应看到：不是凭模型昵称猜套餐。
教练 › 3. 对照Koder模型预设说明
          应看到：灰色或受限项按当前提示处理。
教练 › 4. 核对协议与路径
          应看到：避免重复添加/v1。
教练 › 5. 保存脱敏配置摘要
          应看到：能让别人定位产品边界。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「只记录变量名或已脱敏信息，不记录Key。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要把另一地区Key反复试遍所有地址；服务商限制应以当前账号文档为准。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：制作两套不同产品的配置对照，标注不可互换字段。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不一定，必须确认该产品的接口和授权范围。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       路由必须按产品显式选取；错误恢复不能静默切换区域并向新主机发送凭据。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CLI-CONTRACTS.md、SESSION-INPUT-AND-SKILLS.zh.md

━━ 第 48 课 / 共 180 课 · 安全录入Key与客户端授权码 ━━
教练 › 本课讲解：模型API Key、邮箱客户端授权码和普通登录密码用途不同。隐藏输入只减少屏幕暴露，不代表所有存储都安全。优先使用产品专用凭据入口，确认保存结果并只查看脱敏状态；不要为方便排障把秘密写进对话、README或截图。
    koder setup
    在对应服务的专用隐藏输入框录入；测试时只保存状态与错误码。
  提示 · 示例解读：隐藏输入可能不显示字符；应以提交后的状态判断，不能反复粘贴造成重复。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「安全录入Key与客户端授权码」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第47课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「安全录入Key与客户端授权码」，可与本课示例对照；无无关真实资料。
教练 › 2. 确认当前输入框属于目标服务
          应看到：没有把授权码输进聊天正文。
教练 › 3. 粘贴一次并提交
          应看到：观察保存或明确失败。
教练 › 4. 读取脱敏状态
          应看到：只显示配置是否存在。
教练 › 5. 学习撤销入口
          应看到：本机解绑与服务方撤销分开。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「隐藏输入可能不显示字符；应以提交后的状态判断，不能反复粘贴造成重复。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → Windows输入异常先记录版本和输入方式；不要改为命令行明文参数绕过问题。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：写一份不含秘密的绑定检查表，涵盖保存、失败和撤销三步。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不可以；输入隐藏不改变日志脱敏要求。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       凭据失败必须显式返回；测试覆盖取消、空输入、粘贴、存储不可用以及日志不泄漏。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CLI-CONTRACTS.md、SESSION-INPUT-AND-SKILLS.zh.md

━━ 第 49 课 / 共 180 课 · 当前账号模型列表与真实能力测试 ━━
教练 › 本课讲解：模型目录回答账号能看到哪些ID，能力测试回答某个ID是否能完成请求与工具调用。新型号出现在列表里不等于所有工具协议都适配。刷新列表也不应自动替换用户当前模型，否则同一个任务可能在中途变成另一种行为。
    koder model refresh
    koder model list
    koder model test --tools
  提示 · 示例解读：分别记录刷新、选择和工具测试；成功目录查询不能代替工具测试。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「当前账号模型列表与真实能力测试」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第48课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「当前账号模型列表与真实能力测试」，可与本课示例对照；无无关真实资料。
教练 › 2. 保存当前模型ID
          应看到：便于回退。
教练 › 3. 刷新当前账号目录
          应看到：区分在线结果和缓存。
教练 › 4. 主动选择一个允许测试的模型
          应看到：确认没有自动切换。
教练 › 5. 运行授权范围内的测试
          应看到：记录具体失败阶段。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「分别记录刷新、选择和工具测试；成功目录查询不能代替工具测试。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 无测试Key时只完成配置核对并标NOT_RUN；不要拿公开昵称冒充可调用ID。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交模型核对表，包含目录来源、选择时间、文本测试和工具测试状态。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不能，列出与成功调用是不同证据。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       发现接口需要缓存与过期提示；能力记录应绑定模型、协议和端点版本。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CLI-CONTRACTS.md、SESSION-INPUT-AND-SKILLS.zh.md

━━ 第 50 课 / 共 180 课 · 把模糊愿望写成可执行任务 ━━
教练 › 本课讲解：“做得高级一点”描述感受，却没有交付边界。把任务拆成对象、目标、约束和验收，会让Agent更容易实际落盘。不是要求用户写长篇需求，而是用几句具体话消除最昂贵的歧义：改哪一份、谁使用、怎样判断可用。
    请在当前练习目录做一个活动报名页：手机可读，含时间地点和报名按钮；先给3种布局，选定后保存HTML并说明预览方法。
  提示 · 示例解读：任务指定目录、用户场景、选择节点、文件产物与验证方法。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「把模糊愿望写成可执行任务」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第49课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「把模糊愿望写成可执行任务」，可与本课示例对照；无无关真实资料。
教练 › 2. 写下原始短需求
          应看到：保留真实意图。
教练 › 3. 补对象和使用者
          应看到：避免做成不相关项目。
教练 › 4. 补必须有与不能动
          应看到：约束范围。
教练 › 5. 补可观察成功标准
          应看到：能打开文件或运行测试。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「任务指定目录、用户场景、选择节点、文件产物与验证方法。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要把二十个互相冲突的愿望混成一次命令；把抉择点与实施步骤分开。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：将一句“帮我做个工具”改成五行任务，并解释每行消除了什么歧义。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：增加了明确产物与可检查的完成条件。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       任务路由应保留用户原文和后续约束；不能用模板把目标改成泛泛建议。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CLI-CONTRACTS.md、SESSION-INPUT-AND-SKILLS.zh.md

━━ 第 51 课 / 共 180 课 · 验收条件：让完成有证据 ━━
教练 › 本课讲解：验收条件描述结果，而不是指定每一行代码。比如购物车总价应按数量计算，比“多写几个测试”更可验证。同时写正常输入、边界输入和失败处理，防止只做一个漂亮演示。验收条件也要有范围，不能把未提供的第三方账号当成默认可测。
    输入：200分×3件+150分×1件
    预期：750分
    边界：空数组为0，0件贡献0
  提示 · 示例解读：结果可用断言验证，金额单位明确。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「验收条件：让完成有证据」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第50课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「验收条件：让完成有证据」，可与本课示例对照；无无关真实资料。
教练 › 2. 列出3个输入
          应看到：覆盖正常、空值和边界。
教练 › 3. 给每个输入算出预期
          应看到：不要让模型自己决定正确答案。
教练 › 4. 要求保留检查输出
          应看到：失败也留证据。
教练 › 5. 对照交付文件核验
          应看到：文字汇报不是唯一依据。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「结果可用断言验证，金额单位明确。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 若测试答案由错误实现自动生成，会形成假绿；先独立算一小例。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：为写作任务也写3条验收：受众、事实来源、字数范围，并给反例。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不能；还需要运行能区分正确与错误的检查。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       验收应在修改前冻结关键断言；新增需求变更时记录原因，避免通过删断言完成。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CLI-CONTRACTS.md、SESSION-INPUT-AND-SKILLS.zh.md

━━ 第 52 课 / 共 180 课 · 计划模式、只读问答与执行请求 ━━
教练 › 本课讲解：问“这个项目怎样启动”与“把启动脚本修好”需要不同动作。计划模式帮助梳理步骤，只读问答适合了解代码，执行任务才应修改文件。模式和权限也不同：允许执行并不代表所有命令无须审批；批准一个动作也不等于批准未来所有动作。
    /mode plan
    讨论完方案后，明确要求在当前项目实施并验证；用/help查看当前可用模式。
  提示 · 示例解读：状态提示与实际行为一致；只读阶段不产生修改。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「计划模式、只读问答与执行请求」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第51课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「计划模式、只读问答与执行请求」，可与本课示例对照；无无关真实资料。
教练 › 2. 先提出只读分析任务
          应看到：得到引用和问题列表。
教练 › 3. 请求一个短实施计划
          应看到：包含文件与检查。
教练 › 4. 明确进入实施
          应看到：核对当前模式和权限。
教练 › 5. 检查实际产物
          应看到：确认没有停留在建议稿。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「状态提示与实际行为一致；只读阶段不产生修改。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要因Agent只回答建议就立刻全开权限；先看任务和模式是否正确。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：用同一需求写出只读版、计划版、执行版三条提示，解释预期差异。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不一定；这可能正是当前模式的契约。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       意图分类不能把技术邮件误判为代码任务；执行语义应沿后续润色与补充保留。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CLI-CONTRACTS.md、SESSION-INPUT-AND-SKILLS.zh.md

━━ 第 53 课 / 共 180 课 · 中途引导：补充要求但不重做已完成步骤 ━━
教练 › 本课讲解：长任务进行时用户往往发现新约束。引导应进入当前任务下一安全边界，排队则等当前回合结束后再执行；两者不是同一体验。连续补充不能重复已经发送的邮件或已提交的代码。真正无法接收引导时应显示原因并保留下一回合输入。
    原任务：生成活动页
    中途补充：改为深色背景，报名字段仍只保留姓名和邮箱。
  提示 · 示例解读：后续修改吸收新约束，已完成工具不应无故重放。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「中途引导：补充要求但不重做已完成步骤」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第52课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「中途引导：补充要求但不重做已完成步骤」，可与本课示例对照；无无关真实资料。
教练 › 2. 在Setup选择引导
          应看到：设置保存后重新打开核对。
教练 › 3. 启动自己的慢练习任务
          应看到：观察输入仍可编辑。
教练 › 4. 补充一个明确约束
          应看到：记录接受或回退原因。
教练 › 5. 检查最后产物
          应看到：确认新约束落实。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「后续修改吸收新约束，已完成工具不应无故重放。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 若看到STEER_NOT_RUNNING等原因码，区分真正结束与中间安全边界问题；别把排队文字当审批。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：记录一轮引导前后要求及产物差异；没有真实运行时标手测待验。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不能，用户需要知道要求何时生效。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       steering事件需要顺序、任务归属与消费回执；取消后不能悄悄追加到另一个任务。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CLI-CONTRACTS.md、SESSION-INPUT-AND-SKILLS.zh.md

━━ 第 54 课 / 共 180 课 · 取消与换任务：停下之后发生什么 ━━
教练 › 本课讲解：取消的目标是阻止后续未批准动作并结束当前执行，不保证已经发生的外部效果被撤回。精确的停词与普通包含stop的句子也应区分。用户说“停下，改做X”时，旧任务取消与新任务排队应分别记录，避免把两者混成继续旧目标。
    停下
    stop, say NEXT
    普通句：please stop a server after reading the instructions
  提示 · 示例解读：前两种属于明确打断；第三种是任务内容，不能只靠包含stop误取消。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「取消与换任务：停下之后发生什么」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第53课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「取消与换任务：停下之后发生什么」，可与本课示例对照；无无关真实资料。
教练 › 2. 启动自有可取消练习
          应看到：不使用真实发送任务。
教练 › 3. 按Esc或Ctrl+C
          应看到：界面仍可继续输入。
教练 › 4. 查看已完成与未完成步骤
          应看到：未知状态先核对。
教练 › 5. 输入新的小任务
          应看到：确认不会恢复旧目标。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「前两种属于明确打断；第三种是任务内容，不能只靠包含stop误取消。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 取消期间子进程可能仍在清理；不要杀掉其他窗口进程或把UNKNOWN写成已回滚。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：做一张取消矩阵：模型等待、工具运行、审批等待、写入后，分别说明该核对什么。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不能保证；必须检查发送回执或收件端状态。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       取消沿Core控制器传播；已提交效果需要真实收据或对账，不以UI停止代替业务撤销。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CLI-CONTRACTS.md、SESSION-INPUT-AND-SKILLS.zh.md

━━ 第 55 课 / 共 180 课 · 会话上下文：保留事实，丢掉噪声 ━━
教练 › 本课讲解：上下文不是越长越好。安装包二进制、长日志和重复讨论会占据窗口，让关键约束变得不明显。好的压缩保留目标、已完成工作、事实证据、剩余问题和权限边界。摘要只能帮助继续任务，不能替代原始回执或把猜测变成事实。
    继续摘要：目标 / 已完成文件 / 检查结果 / 尚未完成 / 禁止重放操作 / 证据路径
  提示 · 示例解读：每个已完成项可回到文件或回执，未知项仍写未知。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「会话上下文：保留事实，丢掉噪声」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第54课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「会话上下文：保留事实，丢掉噪声」，可与本课示例对照；无无关真实资料。
教练 › 2. 选一段合成任务历史
          应看到：不放私人聊天。
教练 › 3. 提取有效约束
          应看到：去掉重复礼貌语与无关日志。
教练 › 4. 给事实加来源
          应看到：文件、命令或工具回执。
教练 › 5. 用摘要继续一个小步骤
          应看到：核对没有遗漏边界。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「每个已完成项可回到文件或回执，未知项仍写未知。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 大块Hex不直接贴入模型；先用受控工具提取相关信息并保留原始文件。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交一份不超过一页的任务续接卡，另附原始证据入口。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不能，成功仍要对应原始可核对收据。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       上下文压缩要保留工具调用关联、未决状态和取消点；压缩后仍能追溯。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CLI-CONTRACTS.md、SESSION-INPUT-AND-SKILLS.zh.md

━━ 第 56 课 / 共 180 课 · 记忆与任务事实：哪些可以跨项目 ━━
教练 › 本课讲解：长期偏好如语言和文风，与某个项目的客户资料、文件路径和未完成操作不同。默认工作区隔离用于防止任务事实串仓；明确添加的共享笔记也应有用途与范围。记忆不是越多越聪明，错误记忆会让后续任务持续答偏。
    共享偏好：默认中文，先给可运行结果
    项目事实：A项目测试端口、客户名单、未完成付款
  提示 · 示例解读：前者可能适合显式偏好；后者应留在项目边界内。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「记忆与任务事实：哪些可以跨项目」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第55课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「记忆与任务事实：哪些可以跨项目」，可与本课示例对照；无无关真实资料。
教练 › 2. 列出5条合成信息
          应看到：标偏好、项目事实或秘密。
教练 › 3. 查看koder memory帮助
          应看到：了解现有添加与查询方式。
教练 › 4. 只添加自己明确愿意共享的笔记
          应看到：记录范围。
教练 › 5. 在另一练习目录检查
          应看到：项目事实不应无故出现。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「前者可能适合显式偏好；后者应留在项目边界内。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要用真正的个人暗号做泄漏测试；用A_ONLY_SYNTHETIC这样的合成标记。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：写记忆准入表：什么能记、在哪记、何时失效、怎样删除。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不能，秘密不应进入明文记忆，项目事实也要隔离。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       retrieve必须传工作区或conversationId等范围；失败鉴权请求不应污染会话历史。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CLI-CONTRACTS.md、SESSION-INPUT-AND-SKILLS.zh.md

━━ 第 57 课 / 共 180 课 · 模型错误分层：401、429、审核与协议 ━━
教练 › 本课讲解：错误标题应帮助用户下一步做对事。鉴权、限流、服务端失败、内容审核和工具协议异常的恢复方法不同。MiniMax的1026/1027属于服务商审核信息时，不应笼统显示断网；也不能靠绕过审核来“修复”。先保留脱敏原因，再调整合法任务表达和不必要的大段输入。
    排障字段：HTTP状态 / providerCode / 脱敏reason / endpoint主机 / 模型ID / 请求阶段
  提示 · 示例解读：不记录Authorization头；标题与服务商原因应一致。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「模型错误分层：401、429、审核与协议」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第56课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「模型错误分层：401、429、审核与协议」，可与本课示例对照；无无关真实资料。
教练 › 2. 从合成错误记录提取字段
          应看到：不只抄HTTP数字。
教练 › 3. 按鉴权、限流、审核、协议分类
          应看到：每类对应不同建议。
教练 › 4. 检查是否带入无关二进制或日志
          应看到：缩减噪声，保留任务含义。
教练 › 5. 用干净会话做获准对照
          应看到：单次结果不冒充全面稳定。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「不记录Authorization头；标题与服务商原因应一致。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 429先看服务商限流与重试信息；401不通过换模型名解决。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交4类错误的用户提示稿和恢复步骤，明确哪些需要服务方支持。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不能，应结合服务商错误码识别审核或输入问题。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       非2xx也应有限读取并脱敏响应体；错误归类保留原code，避免标题与原因矛盾。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CLI-CONTRACTS.md、SESSION-INPUT-AND-SKILLS.zh.md

━━ 第 58 课 / 共 180 课 · 预算与耗时：先设边界再开始 ━━
教练 › 本课讲解：任务成本来自模型请求、工具执行和外部服务，不能只看最终回答长度。设置预算帮助及时缩小范围，取消与超时则保护资源。提高时间上限可以适应长任务，但不能掩盖死循环。阶段产物和进度证据比长时间无声等待更有用。
    任务说明：先在30分钟学习练习内完成最小可运行版本；外部付费操作先列出范围；每个阶段保存结果。
  提示 · 示例解读：这里是任务范围约定，不是宣称产品存在某个未实现的预算参数。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「预算与耗时：先设边界再开始」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第57课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「预算与耗时：先设边界再开始」，可与本课示例对照；无无关真实资料。
教练 › 2. 拆出最小可交付范围
          应看到：先完成可运行主路径。
教练 › 3. 列出可能计费的服务
          应看到：模型、部署与邮件分开。
教练 › 4. 约定阶段检查点
          应看到：每阶段有文件或测试。
教练 › 5. 耗时异常时定位等待层
          应看到：输入、模型、工具或收尾。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「这里是任务范围约定，不是宣称产品存在某个未实现的预算参数。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要把所有超时统一调成无限；UNKNOWN效果要先对账而非自动重试。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：给一个网站任务做低、中、高三档范围，说明取舍而不是编造价格。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不是，也可能是阻塞、未关闭输入或失去进展。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       成本未知不能记作零；超时后保留终端输出、子进程归属和已完成产物。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CLI-CONTRACTS.md、SESSION-INPUT-AND-SKILLS.zh.md

━━ 第 59 课 / 共 180 课 · 让回复落实：从建议到文件、测试与交付 ━━
教练 › 本课讲解：用户要一个网站或文稿时，只有方法建议常常不够。完成需要可打开的产物、验证方式和限制说明。编程应给具体文件与运行命令，撰写应给正文文件和事实来源。最终汇报要短而具体，不能用“已全面优化”掩盖未完成事项。
    最终交件：产物路径 / 做了什么 / 实际检查与退出码 / 尚未验证 / 下一步
  提示 · 示例解读：每项都能被使用者独立核对，不把计划列成完成。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「让回复落实：从建议到文件、测试与交付」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第58课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「让回复落实：从建议到文件、测试与交付」，可与本课示例对照；无无关真实资料。
教练 › 2. 明确主交付文件
          应看到：避免产物散落。
教练 › 3. 要求阶段性保存
          应看到：即使中断也有可恢复内容。
教练 › 4. 实际打开或运行
          应看到：区分存在、可读和可用。
教练 › 5. 整理短交付说明
          应看到：给读者直接入口。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「每项都能被使用者独立核对，不把计划列成完成。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 文稿字数应量正文文件而非聊天结尾；代码测试不能只说“应该通过”。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：为同一个任务写一份空泛汇报和一份证据化汇报，逐项比较。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不等于，需要读取文件或检查实际产物。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       交付门应识别本轮实际写入主文件并保存证据字段；失败门不能误报API故障。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CLI-CONTRACTS.md、SESSION-INPUT-AND-SKILLS.zh.md

━━ 第 60 课 / 共 180 课 · 单元项目：建立自己的任务委托模板 ━━
教练 › 本课讲解：本单元最终产物是一张可重复使用的任务委托卡。它应该短到用户愿意填写，又足够明确地约束执行。模板不是把每个任务都变成漫长问卷，而是在关键位置提醒：对象、目标、范围、验收、预算和恢复。用真实小练习验证模板是否让交付更具体。
    目标：...
    工作区：...
    交付物：...
    必须保留：...
    验收：...
    需确认的外部动作：...
  提示 · 示例解读：每一栏服务于执行或验证，空白项可明确写不适用。
教练 › 深入学习 · 建议 90 分钟（含自行练习，不是运行时限）
       目标：完成「单元项目：建立自己的任务委托模板」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第59课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「单元项目：建立自己的任务委托模板」，可与本课示例对照；无无关真实资料。
教练 › 2. 挑一个小代码或文稿任务
          应看到：能在本地完成。
教练 › 3. 填写委托卡
          应看到：没有含糊的“全部最佳”。
教练 › 4. 运行获准练习并保存产物
          应看到：不让模板代替实施。
教练 › 5. 复盘缺失信息
          应看到：只增加真正影响结果的字段。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「每一栏服务于执行或验证，空白项可明确写不适用。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 模板太长时先删重复背景；不要删掉工作区与验收来节省字数。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交委托卡、产物和复盘，至少指出一次约束怎样改变了执行结果。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不是，价值在于消除关键歧义并给出可核对的交付条件。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       模板版本化但保留用户原始意图；预填只填草稿，不能自动提交或批准动作。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CLI-CONTRACTS.md、SESSION-INPUT-AND-SKILLS.zh.md

━━ 第 61 课 / 共 180 课 · 读代码的第一步：输入、输出与副作用 ━━
教练 › 本课讲解：阅读函数先问它接收什么、返回什么、还改变了什么。返回值之外的文件写入、网络请求和全局变量修改都属于副作用。用几个小输入手算一遍，通常比逐字解释语法更快发现业务规则。本课以原有购物车为例，不需要先学完一门语言。
    export function total(items) {
      return items.reduce((sum, item) => sum + item.price, 0);
    }
  提示 · 示例解读：这个实现忽略qty；200分三件仍只加200分，说明输入契约未落实。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「读代码的第一步：输入、输出与副作用」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第60课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「读代码的第一步：输入、输出与副作用」，可与本课示例对照；无无关真实资料。
教练 › 2. 读函数签名
          应看到：确认items是条目集合。
教练 › 3. 列出每项字段
          应看到：说明price单位与qty含义。
教练 › 4. 手算两项总价
          应看到：得到独立预期。
教练 › 5. 找返回值和副作用
          应看到：该函数只计算，不应写文件。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「这个实现忽略qty；200分三件仍只加200分，说明输入契约未落实。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要把变量名字当完整规范；price可能是元也可能是分，要从约定确认。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：用自己的话写函数契约：合法输入、输出单位、边界和是否修改参数。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不能，还应检查输入对象和外部状态是否改变。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       纯函数易测；副作用放边界层，输入验证与计算职责清楚。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CONTENT-QUALITY.zh.md、CLI-CONTRACTS.md

━━ 第 62 课 / 共 180 课 · 先复现再修：给bug一个最小用例 ━━
教练 › 本课讲解：修复前必须证明当前实现会在一个具体输入上失败。最小复现避免环境噪声，能说明修复针对什么。若测试一直通过，可能未触发问题或断言太弱；此时应改进复现，不该为了“红灯”随意破坏代码。原错误和失败输出要保存。
    import assert from "node:assert/strict";
    assert.equal(total([{price:200,qty:3}]),600);
  提示 · 示例解读：错误实现返回200，断言失败；正确预期由数量规则独立计算。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「先复现再修：给bug一个最小用例」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第61课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「先复现再修：给bug一个最小用例」，可与本课示例对照；无无关真实资料。
教练 › 2. 复制cart-lab到自有目录
          应看到：保留教材原件。
教练 › 3. 运行已有测试
          应看到：记录真实失败。
教练 › 4. 缩减到单个数量用例
          应看到：仍能触发问题。
教练 › 5. 写出根因假设
          应看到：指向遗漏qty而非笼统说算法错。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「错误实现返回200，断言失败；正确预期由数量规则独立计算。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 测试未导入目标函数或没有断言，也可能退出0；先确认实际执行路径。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交最小复现、失败日志和一段根因解释，修复前不改测试答案。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不可以，那是在改业务期望以迎合错误实现。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       回归测试应在旧实现红、新实现绿；检查失败是否真的来自目标行为。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CONTENT-QUALITY.zh.md、CLI-CONTRACTS.md

━━ 第 63 课 / 共 180 课 · 最小修复：改一处但覆盖完整规则 ━━
教练 › 本课讲解：最小修复不是最少字符，而是只触碰解决问题必要的行为。补上qty后仍要检查空数组、零数量和输入是否被修改。避免借修一个bug顺便换框架或格式化全仓，因为这会让审查、回退和归因都困难。
    return items.reduce((sum, item) => sum + item.price * item.qty, 0);
  提示 · 示例解读：两项200×3和150×1得到750；空数组仍为0。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「最小修复：改一处但覆盖完整规则」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第62课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「最小修复：改一处但覆盖完整规则」，可与本课示例对照；无无关真实资料。
教练 › 2. 修改计算式
          应看到：保留函数接口。
教练 › 3. 运行最小复现
          应看到：原失败转为通过。
教练 › 4. 运行全部相关测试
          应看到：其他行为仍通过。
教练 › 5. 查看差异
          应看到：只有需要的实现和回归用例。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「两项200×3和150×1得到750；空数组仍为0。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → qty缺失时如何处理要按规范决定，不能悄悄默认1并声称这是原需求。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交修前/修后结果、完整差异和一个仍未定义的输入边界。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不是，仍要确认没有破坏原行为。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       修复范围与故障证据对应；不要删除断言或把异常吞成默认成功。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CONTENT-QUALITY.zh.md、CLI-CONTRACTS.md

━━ 第 64 课 / 共 180 课 · 边界值：空、零、负数与缺失 ━━
教练 › 本课讲解：常见bug藏在默认路径以外。空集合、数量0、负数、缺失字段、超大值应分别考虑，因为它们不是同一种无效输入。先决定业务规则，再实现。比如退款可能允许负数，而购物车下单不允许；教程不能替业务方偷定规则。
    边界表：[]→0；qty=0→0；qty缺失→需定义；qty<0→按业务规则拒绝或支持
  提示 · 示例解读：未定义项写明待确认，不能拿任意实现当规范。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「边界值：空、零、负数与缺失」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第63课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「边界值：空、零、负数与缺失」，可与本课示例对照；无无关真实资料。
教练 › 2. 列出输入维度
          应看到：数量、金额、类型和集合长度。
教练 › 3. 选择每个维度的边界
          应看到：包含0与缺失。
教练 › 4. 写出期望行为
          应看到：返回值或明确错误。
教练 › 5. 给已定义边界加测试
          应看到：每个断言能解释原因。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「未定义项写明待确认，不能拿任意实现当规范。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → NaN和字符串数字会悄悄污染计算；不要用宽松转换掩盖输入问题。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交一张边界矩阵并实现至少4个测试，其中1个验证拒绝非法输入。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不是，空集合合法与参数缺失可能有不同契约。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       验证放在明确边界；错误类型和信息可区分，避免所有非法输入返回0。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CONTENT-QUALITY.zh.md、CLI-CONTRACTS.md

━━ 第 65 课 / 共 180 课 · 错误处理：让失败可理解、可恢复 ━━
教练 › 本课讲解：错误处理不是尽量不抛异常，而是让调用者知道出了什么事、是否已产生副作用、下一步如何恢复。吞掉异常返回空结果可能导致用户误以为没有数据。对外错误需要脱敏，对内证据需要可追溯，两者可以通过错误ID关联。
    {ok:false, code:"INVALID_QUANTITY", field:"qty", retryable:false}
  提示 · 示例解读：可区分输入错误与网络失败；不包含秘密或堆栈中的私人路径。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「错误处理：让失败可理解、可恢复」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第64课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「错误处理：让失败可理解、可恢复」，可与本课示例对照；无无关真实资料。
教练 › 2. 列出函数可能失败的原因
          应看到：至少区分参数和依赖。
教练 › 3. 为每类选择返回或抛错
          应看到：保持接口一致。
教练 › 4. 写一个失败调用测试
          应看到：验证错误code而非只验证有报错。
教练 › 5. 添加恢复说明
          应看到：告诉使用者修哪项。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「可区分输入错误与网络失败；不包含秘密或堆栈中的私人路径。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 捕获后只console.log再返回成功会制造假绿；未知外部结果不能标成失败后随意重发。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：为一个文件读取工具设计不存在、无权限和读取中断三种错误返回。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不能，捕获只是获得控制权，仍需正确报告失败或未知。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       原始cause保留在受控诊断，用户消息简明；重试标记基于操作语义。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CONTENT-QUALITY.zh.md、CLI-CONTRACTS.md

━━ 第 66 课 / 共 180 课 · 异步任务：等待完成而不是等待一会儿 ━━
教练 › 本课讲解：异步代码的关键是等待实际完成信号。固定sleep可能在快机器浪费时间，在慢机器仍然太短。Promise表达结果或失败，await把后续步骤放到完成之后。测试要检查等待关系，而不是靠偶然时序通过。
    async function load(loadText) {
      const text = await loadText();
      return text.trim();
    }
  提示 · 示例解读：trim发生在文本加载后；加载失败应传播或按契约处理。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「异步任务：等待完成而不是等待一会儿」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第65课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「异步任务：等待完成而不是等待一会儿」，可与本课示例对照；无无关真实资料。
教练 › 2. 找出异步边界
          应看到：文件、网络或定时器。
教练 › 3. 确认返回Promise是否被等待
          应看到：没有遗漏await。
教练 › 4. 用可控假依赖延迟返回
          应看到：后续步骤不会提前运行。
教练 › 5. 测试拒绝路径
          应看到：不会变成未处理异常。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「trim发生在文本加载后；加载失败应传播或按契约处理。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → async函数内部启动任务却不返回或await，会让调用者误判结束。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：将一个回调示例改为Promise，保留成功、失败和回调只完成一次的行为。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不能，应等待写入操作的完成信号。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       测试用可控deferred而非任意sleep；取消和清理也应等待实际完成。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CONTENT-QUALITY.zh.md、CLI-CONTRACTS.md

━━ 第 67 课 / 共 180 课 · 取消与超时：两条不同的控制路径 ━━
教练 › 本课讲解：超时是时间预算到达，取消是用户或上层明确停止。两者可以共用AbortSignal，但日志要保留原因。超时不证明外部操作没有发生，尤其是写请求已发送之后。可取消函数还需要释放监听器、文件句柄和子进程，而不是只让界面停止转圈。
    const controller = new AbortController();
    controller.abort(new Error("user cancelled"));
    // 将signal传入支持取消的操作
  提示 · 示例解读：消费者需要真实响应signal；只创建控制器不会自动停止所有工作。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「取消与超时：两条不同的控制路径」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第66课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「取消与超时：两条不同的控制路径」，可与本课示例对照；无无关真实资料。
教练 › 2. 标出操作开始与提交点
          应看到：知道何时可能已有副作用。
教练 › 3. 接入可取消的依赖
          应看到：检查中断后返回。
教练 › 4. 分别测试取消和超时
          应看到：原因可区分。
教练 › 5. 确认清理完成
          应看到：没有遗留自有资源。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「消费者需要真实响应signal；只创建控制器不会自动停止所有工作。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要通过终止整台机器的同名进程实现取消；只管理本任务拥有的资源。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：画出未开始、运行中、已提交、结果未知四态及取消后的处理。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不意味着，可能已写入但回执丢失，需要对账。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       计时器应清除，取消监听应解除；保存真实回执优先于汇报已停止。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CONTENT-QUALITY.zh.md、CLI-CONTRACTS.md

━━ 第 68 课 / 共 180 课 · 性能优化：先量瓶颈再改算法 ━━
教练 › 本课讲解：性能问题需要相同输入、相同环境和可比较指标。一次很快的运行可能来自缓存，不代表算法提升。先确定规模增长怎样影响耗时，再选择数据结构。优化后还要验证输出完全一致，不能为了跑得快而跳过必要数据。
    基线：对每个用户遍历全部订单
    改进：先按userId建立Map，再逐用户查找
  提示 · 示例解读：理想复杂度可从重复扫描降为一次索引加查询；实际收益要测量。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「性能优化：先量瓶颈再改算法」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第67课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「性能优化：先量瓶颈再改算法」，可与本课示例对照；无无关真实资料。
教练 › 2. 固定合成数据规模
          应看到：记录数量和随机种子。
教练 › 3. 运行基线多次
          应看到：保留耗时与环境。
教练 › 4. 替换查找策略
          应看到：不改业务结果。
教练 › 5. 比较结果和耗时
          应看到：同时报告内存代价。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「理想复杂度可从重复扫描降为一次索引加查询；实际收益要测量。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要拿不同数据集或不同机器的时间直接作结论；微秒级波动需重复测量。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交小/中/大三档规模表和输出一致性断言，不编造百分比。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不能，还要证明结果正确且比较条件一致。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       基准应避免把启动时间混入核心算法却不说明；记录峰值内存与异常值。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CONTENT-QUALITY.zh.md、CLI-CONTRACTS.md

━━ 第 69 课 / 共 180 课 · 重构：改变结构但保持行为 ━━
教练 › 本课讲解：重构的价值在于让代码更易理解和维护，外部行为应保持稳定。开始前列出公共接口、错误语义和副作用，再用测试保护。把回调改成async/await时，错误传播、执行顺序和重复回调处理最容易变化。一次重构尽量不混入新功能。
    重构契约：输入不变 / 输出不变 / 错误不变 / 顺序不变 / 副作用次数不变
  提示 · 示例解读：“代码更短”不是行为保持的证据。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「重构：改变结构但保持行为」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第68课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「重构：改变结构但保持行为」，可与本课示例对照；无无关真实资料。
教练 › 2. 保存公共接口清单
          应看到：包含默认参数。
教练 › 3. 补齐关键行为测试
          应看到：先在旧实现通过。
教练 › 4. 逐块重构
          应看到：每块后运行相关测试。
教练 › 5. 审查差异与输出
          应看到：确认没有偷偷扩功能。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「“代码更短”不是行为保持的证据。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 把同步抛错改成异步拒绝可能影响调用者；需要明确兼容策略。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交重构前后对照与至少一个错误路径测试。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不属于，应作为行为变更单独说明与验收。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       对行为未定义的边界先记录，不用重构名义改变它；依赖注入可减少测试耦合。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CONTENT-QUALITY.zh.md、CLI-CONTRACTS.md

━━ 第 70 课 / 共 180 课 · 模块边界：拆文件要有理由 ━━
教练 › 本课讲解：拆模块的依据是职责和变化原因，而不是文件超过某个行数。稳定计算逻辑、外部IO和展示层分开后，测试更容易，也更容易看出权限在哪里。过度拆分会让读者在十个文件间跳来跳去，所以每个模块应有清楚接口与单一主要目的。
    domain/cart.mjs：计算
    ports/storage.mjs：存储接口
    cli.mjs：参数、显示与退出码
  提示 · 示例解读：业务计算不直接读取终端输入；CLI不复制计算规则。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「模块边界：拆文件要有理由」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第69课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「模块边界：拆文件要有理由」，可与本课示例对照；无无关真实资料。
教练 › 2. 画出当前依赖
          应看到：找出循环与重复。
教练 › 3. 选择一个清楚的职责边界
          应看到：不是机械按行切。
教练 › 4. 提取模块并定义接口
          应看到：调用者只依赖必要方法。
教练 › 5. 跑集成测试
          应看到：确保装配仍正确。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「业务计算不直接读取终端输入；CLI不复制计算规则。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要建立只有转发一行的层层包装却没有隔离价值。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：为购物车分离计算与文件读取，写出依赖方向图。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不一定，边界必须减少耦合或明确职责。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       依赖由外向内，核心不依赖平台细节；接口变化需要调用者回归。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CONTENT-QUALITY.zh.md、CLI-CONTRACTS.md

━━ 第 71 课 / 共 180 课 · 依赖管理：添加一个包意味着什么 ━━
教练 › 本课讲解：依赖会影响安装体积、兼容性、许可和供应链。先看现有能力能否完成任务，再考虑新增包。锁文件记录解析结果，不能随手删除以“修复安装”。更新前要理解变更范围，尤其是跨大版本或原生模块可能影响Windows与macOS。
    依赖评估：用途 / 是否已有替代 / 版本约束 / 许可 / 安装与运行平台 / 回退
  提示 · 示例解读：评估记录与实际包清单一致，不只看下载量。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「依赖管理：添加一个包意味着什么」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第70课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「依赖管理：添加一个包意味着什么」，可与本课示例对照；无无关真实资料。
教练 › 2. 阅读项目清单和锁文件
          应看到：知道当前工具链。
教练 › 3. 说明新增依赖解决的问题
          应看到：避免重复功能。
教练 › 4. 在隔离副本安装与验证
          应看到：记录真实安装结果。
教练 › 5. 比较差异与体积
          应看到：解释锁文件变化。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「评估记录与实际包清单一致，不只看下载量。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要在共享工作目录清空依赖缓存或全局升级所有包。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：为一个候选依赖写采用与不采用两种方案，并给出可验证取舍。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不能，反而可能引入未控制的版本变化。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       打包需包含运行期依赖和许可；开发期依赖不应无故进入用户包。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CONTENT-QUALITY.zh.md、CLI-CONTRACTS.md

━━ 第 72 课 / 共 180 课 · 代码图：从调用关系定位影响范围 ━━
教练 › 本课讲解：代码图展示定义、调用和依赖，适合回答改一个接口会影响谁。图只能反映索引器理解到的关系，动态导入、反射和运行时路由可能缺失。把图作为导航，再回到源码和测试核实；节点很多不代表分析准确。
    问题：修改total的参数，会影响哪些调用者与测试？
    证据：定义路径、引用路径、实际调用示例。
  提示 · 示例解读：每条关键关系能打开对应代码核对。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「代码图：从调用关系定位影响范围」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第71课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「代码图：从调用关系定位影响范围」，可与本课示例对照；无无关真实资料。
教练 › 2. 定位目标定义
          应看到：确认不是同名函数。
教练 › 3. 查直接调用者
          应看到：记录文件和参数。
教练 › 4. 检查跨包或动态入口
          应看到：补上图可能遗漏的边。
教练 › 5. 选择回归测试
          应看到：覆盖真实受影响路径。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「每条关键关系能打开对应代码核对。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 旧索引可能指向已删除文件；修改后应核对索引时间与源码版本。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交一张小影响图和3条需要回归的行为，不要求画全仓。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不能，还要排查动态引用、公开接口与运行时入口。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       图查询应返回版本和证据位置；不能把静态不可达当成运行时绝不调用。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CONTENT-QUALITY.zh.md、CLI-CONTRACTS.md

━━ 第 73 课 / 共 180 课 · 调试日志：记录状态而不是倾倒数据 ━━
教练 › 本课讲解：有用日志说明发生了什么、属于哪个任务、处于哪个阶段。大量原始对象可能泄漏秘密，也让关键错误淹没。给每次操作一个稳定ID，记录开始、完成或未知，并保留可读取的原始证据路径。日志既服务用户，也服务之后的故障重建。
    {operationId:"demo-1", stage:"validate", state:"failed", code:"INVALID_INPUT"}
  提示 · 示例解读：结构化字段可过滤；没有凭据和完整私人内容。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「调试日志：记录状态而不是倾倒数据」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第72课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「调试日志：记录状态而不是倾倒数据」，可与本课示例对照；无无关真实资料。
教练 › 2. 确定需要回答的排障问题
          应看到：再决定日志字段。
教练 › 3. 在关键边界记录事件
          应看到：不是每行都打印。
教练 › 4. 模拟一次失败
          应看到：能找到第一原因。
教练 › 5. 检查脱敏和关联
          应看到：同一操作的记录能串起来。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「结构化字段可过滤；没有凭据和完整私人内容。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 后续清理错误不能覆盖最初失败；完整堆栈也不应直接展示在用户聊天中。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：设计一组成功、失败、取消、未知日志，并写一个筛选规则。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不是，字段质量、关联和脱敏更重要。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       事件先持久化再更新状态；未知不等于零成本或没有副作用。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CONTENT-QUALITY.zh.md、CLI-CONTRACTS.md

━━ 第 74 课 / 共 180 课 · 代码审查：找风险并给出可操作意见 ━━
教练 › 本课讲解：审查不是评价风格好不好看，而是找会造成错误、数据损失、权限问题或维护困难的具体变化。意见要包含触发条件、影响和证据。看不到问题也应说明检查范围，不要把“未发现”写成全面安全保证。例如“空数组会访问首项并抛错”比“代码不够健壮”更可操作：前者给出了输入、出错位置与修复后应验证的行为。审查建议不应偷偷变成未经授权的全仓改写。
    意见模板：当输入X时，路径Y会返回Z；这与规则R冲突。建议补用例T并修正此分支。
  提示 · 示例解读：意见可复现、定位准确，避免“建议优化”这种空话。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「代码审查：找风险并给出可操作意见」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第73课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「代码审查：找风险并给出可操作意见」，可与本课示例对照；无无关真实资料。
教练 › 2. 先读需求与差异
          应看到：知道修改目的。
教练 › 3. 检查边界与失败路径
          应看到：不只看正常路径。
教练 › 4. 用小例验证疑点
          应看到：区分事实与猜测。
教练 › 5. 给结论与限制
          应看到：说明未运行的检查。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「意见可复现、定位准确，避免“建议优化”这种空话。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 审查工具的JSON解析失败不能被当作没有发现问题；CI要看parsed和退出码。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：写两条高质量审查意见，并删除一条只涉及个人偏好的无效意见。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不可以，解析失败并不等于没有问题。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       结构化审查需固定schema和失败语义；空结果与未解析结果分开。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CONTENT-QUALITY.zh.md、CLI-CONTRACTS.md

━━ 第 75 课 / 共 180 课 · 单元项目：从红灯到可审查修复 ━━
教练 › 本课讲解：本次项目要求完整走过复现、定位、修复、回归、差异和交件。代码量可以很小，但证据要闭环。用教材购物车缺陷，保留原始失败，补数量与空输入测试，再修实现。最后写给另一个开发者的说明，不用夸大词汇。
    交件目录：src/、test/、evidence/red.txt、evidence/green.txt、CHANGE-NOTE.md
  提示 · 示例解读：红灯来自真实缺陷，绿灯来自正确实现，原断言仍存在。
教练 › 深入学习 · 建议 90 分钟（含自行练习，不是运行时限）
       目标：完成「单元项目：从红灯到可审查修复」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第74课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「单元项目：从红灯到可审查修复」，可与本课示例对照；无无关真实资料。
教练 › 2. 运行错误版本
          应看到：保存退出码与失败断言。
教练 › 3. 写根因和最小修改
          应看到：范围明确。
教练 › 4. 修复并运行相关测试
          应看到：全部结果真实保存。
教练 › 5. 检查差异后交件
          应看到：包含未验平台和恢复方式。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「红灯来自真实缺陷，绿灯来自正确实现，原断言仍存在。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要把一次本地通过叫作所有平台可用；不要隐藏最初失败记录。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：完成修复包，评分依据为复现、正确性、边界、差异范围、说明五项。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不是，是问题、改动和验证能一一对应。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       把红绿证据与源码版本绑定；能复现的最小修复比无法归因的大改更可靠。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CONTENT-QUALITY.zh.md、CLI-CONTRACTS.md

━━ 第 76 课 / 共 180 课 · 网站需求：先确定访客要完成什么 ━━
教练 › 本课讲解：网站设计从访客任务开始。报名页要让人理解活动并完成报名，产品页要帮助比较和决定，作品集要让人判断能力。先明确一个主要动作，再安排信息顺序。漂亮动画如果挡住时间地点和按钮，反而降低可用性。本单元贯穿“社区读书会报名页”这个合成项目。
    访客：第一次参加的居民
    主要动作：了解时间地点后报名
    必要信息：主题、日期、地点、费用说明、联系方法
  提示 · 示例解读：每块内容都服务访客决策，尚未确定的信息标占位。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「网站需求：先确定访客要完成什么」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第75课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「网站需求：先确定访客要完成什么」，可与本课示例对照；无无关真实资料。
教练 › 2. 写访客画像
          应看到：只写影响页面的信息。
教练 › 3. 确定主要动作
          应看到：全页有一致的行动入口。
教练 › 4. 列出必需内容
          应看到：没有编造活动事实。
教练 › 5. 写页面验收
          应看到：手机能读、键盘可用、按钮有结果。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「每块内容都服务访客决策，尚未确定的信息标占位。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要把所有功能都塞进首屏；先完成核心路径。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交一页brief及内容清单，标出事实来源和待补项。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不是，应帮助访客完成主要任务。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       需求映射到可测试行为；文案数据与布局分离便于替换。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：VISUAL-WORKFLOW-AND-NETLIFY.md、MAIL-AND-LIVE-PREVIEW.md

━━ 第 77 课 / 共 180 课 · 信息架构：把内容排成可理解的顺序 ━━
教练 › 本课讲解：信息架构决定访客先看到什么、在哪找到答案。按问题组织内容通常比按公司部门组织更容易理解。读书会页可以按主题、适合谁、时间地点、活动流程、报名排列。导航标题要具体，避免每段都叫“更多信息”。
    主题→适合谁→时间地点→活动流程→报名→常见问题
  提示 · 示例解读：读者不需要往返翻找关键条件。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「信息架构：把内容排成可理解的顺序」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第76课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「信息架构：把内容排成可理解的顺序」，可与本课示例对照；无无关真实资料。
教练 › 2. 把所有内容写成卡片
          应看到：每张只回答一个问题。
教练 › 3. 按访客决策顺序排序
          应看到：先解决是否相关。
教练 › 4. 给各段命名
          应看到：标题本身可读懂。
教练 › 5. 让他人找日期和报名入口
          应看到：记录寻找困难。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「读者不需要往返翻找关键条件。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 页面顺序改变时锚点和导航也要同步；不要留下失效跳转。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：画信息结构图并给每段写一句目的说明。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：通常不够，应体现用户寻找的具体内容。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       路由与导航数据单一来源；测试关键锚点和空内容状态。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：VISUAL-WORKFLOW-AND-NETLIFY.md、MAIL-AND-LIVE-PREVIEW.md

━━ 第 78 课 / 共 180 课 · 三种版式：用结构差异帮助选择 ━━
教练 › 本课讲解：三个方案应该有不同的信息组织，而不仅是换颜色。可比较“海报导向”“流程导向”“编辑式叙事”，分别适合快速吸引、解释过程和讲清故事。每个方案保留同一份事实内容，才不会把文案差异误当成布局优劣。
    A：大标题+日期地点+报名
    B：活动流程时间线+侧边报名
    C：主办者故事+活动内容+报名
  提示 · 示例解读：三案主要动作相同，但阅读路径不同。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「三种版式：用结构差异帮助选择」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第77课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「三种版式：用结构差异帮助选择」，可与本课示例对照；无无关真实资料。
教练 › 2. 冻结同一份内容
          应看到：不为某方案增删重要事实。
教练 › 3. 画三张低保真布局
          应看到：先看层级和位置。
教练 › 4. 给每案写取舍
          应看到：说明适用访客。
教练 › 5. 请用户选择并记录原因
          应看到：选中后再做细节。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「三案主要动作相同，但阅读路径不同。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要同时把三个完整站点都上线；选择阶段只需本地预览。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交三案截图或HTML草图与比较表，明确选案依据。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不算，应该体现布局和阅读顺序的实质差异。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       复用内容模型与组件，避免三套业务逻辑；方案选择后清理未采用入口。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：VISUAL-WORKFLOW-AND-NETLIFY.md、MAIL-AND-LIVE-PREVIEW.md

━━ 第 79 课 / 共 180 课 · 语义HTML：让页面不仅看起来像按钮 ━━
教练 › 本课讲解：HTML标签表达内容角色。button用于动作，a用于导航，标题有层级，表单字段有标签。用div加点击事件可能看起来可用，却缺少键盘行为和语义。先建立正确结构，再用CSS美化，通常更容易得到可访问、可测试的页面。
    <main>
     <h1>社区读书会</h1>
     <a href="#signup">查看报名表</a>
     <button type="button">展开活动须知</button>
    </main>
  提示 · 示例解读：链接跳转位置，按钮执行动作；标题描述当前页面主题。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「语义HTML：让页面不仅看起来像按钮」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第78课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「语义HTML：让页面不仅看起来像按钮」，可与本课示例对照；无无关真实资料。
教练 › 2. 标出主内容与导航
          应看到：使用对应区域标签。
教练 › 3. 建立标题层级
          应看到：不要只为字号跳级。
教练 › 4. 区分链接和按钮
          应看到：动作与跳转各自正确。
教练 › 5. 用键盘逐项访问
          应看到：焦点可见且顺序合理。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「链接跳转位置，按钮执行动作；标题描述当前页面主题。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要把所有文字都写成图片；屏幕阅读器和搜索都难以理解。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：将一个全div草稿改成语义结构，记录行为没有丢失。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不等价，按钮具备原生语义和键盘交互。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       组件接口应保留原生属性；避免覆盖浏览器已有键盘行为。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：VISUAL-WORKFLOW-AND-NETLIFY.md、MAIL-AND-LIVE-PREVIEW.md

━━ 第 80 课 / 共 180 课 · CSS层级：字号、间距和对比 ━━
教练 › 本课讲解：视觉层级帮助读者分清主题、说明和次要信息。用少量字号、稳定间距和足够对比比到处加粗更有效。先在黑白状态下看清层级，再加品牌色。每个强调都应有理由，否则整页都重要就等于没有重点。例如把活动日期从一段小灰字移到标题下方，可降低寻找成本；把所有正文都增大则可能挤压报名表。每次只调整一组变量，用相同内容和窗口宽度比较。
    正文16px起作练习基线；标题按层级递减；按钮与正文之间留出可识别间距。
  提示 · 示例解读：具体字号需在目标设备上验证，不是所有站点统一数值。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「CSS层级：字号、间距和对比」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第79课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「CSS层级：字号、间距和对比」，可与本课示例对照；无无关真实资料。
教练 › 2. 定义正文、标题、辅助三层
          应看到：建立少量样式变量。
教练 › 3. 统一段落间距
          应看到：相同角色保持一致。
教练 › 4. 检查浅色文字对比
          应看到：不用颜色单独传达错误。
教练 › 5. 缩小窗口重读
          应看到：没有挤成一团。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「具体字号需在目标设备上验证，不是所有站点统一数值。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 避免固定高度把长中文裁掉；字号变化后行高和按钮尺寸一起检查。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：提交一张样式表与修改前后对照，解释3处层级调整。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：通常不会，会消除主次层级。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       设计变量集中管理；视觉回归关注溢出、对比和内容长度变化。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：VISUAL-WORKFLOW-AND-NETLIFY.md、MAIL-AND-LIVE-PREVIEW.md

━━ 第 81 课 / 共 180 课 · 响应式布局：按内容断点而不是设备名字 ━━
教练 › 本课讲解：响应式是让同一内容在不同宽度下仍可理解和操作。宽屏双栏到窄屏单栏只是起点，还要处理长链接、表格、按钮和导航。不要只在一种手机尺寸验收；内容长度、浏览器缩放和系统字体也会影响布局。可先在360、768与1280像素宽度下检查练习页，但这些只是取样点。继续拖动窗口，观察两栏开始挤压的位置，以内容能否正常阅读来决定断点。
    窄屏：标题→关键信息→报名
    宽屏：正文+报名侧栏
    相同内容，不丢弃关键字段
  提示 · 示例解读：切换宽度后没有横向滚动和被遮挡的按钮。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「响应式布局：按内容断点而不是设备名字」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第80课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「响应式布局：按内容断点而不是设备名字」，可与本课示例对照；无无关真实资料。
教练 › 2. 从窄屏排一栏
          应看到：核心内容先可用。
教练 › 3. 逐步增宽观察拥挤点
          应看到：在内容需要时切布局。
教练 › 4. 测试长中文与长URL
          应看到：确认可换行。
教练 › 5. 放大文字再操作
          应看到：入口仍可见。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「切换宽度后没有横向滚动和被遮挡的按钮。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要用overflow:hidden掩盖溢出却把内容裁掉。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：记录至少3个宽度下的截图和问题清单，修复后复核。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不能，关键内容必须保留并合理重排。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       布局使用弹性约束；测试不仅检查截图，还要检查真实可点区域。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：VISUAL-WORKFLOW-AND-NETLIFY.md、MAIL-AND-LIVE-PREVIEW.md

━━ 第 82 课 / 共 180 课 · 表单：输入、校验与错误提示 ━━
教练 › 本课讲解：表单应告诉用户填什么、为什么失败、怎样修正。必填标识和格式提示尽量提前给出，提交失败后保留已填内容。前端校验提升体验，后端校验保护数据，两者都需要。没有接后端的演示页必须标明只演示，不能显示真的报名成功。
    字段：姓名、邮箱
    错误：邮箱格式不完整，请补齐@example.com部分
    演示状态：仅本地校验，尚未提交服务器
  提示 · 示例解读：错误贴近字段，状态明确，不伪造远程提交。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「表单：输入、校验与错误提示」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第81课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「表单：输入、校验与错误提示」，可与本课示例对照；无无关真实资料。
教练 › 2. 为字段加label
          应看到：点击标签可聚焦输入。
教练 › 3. 定义必填与格式规则
          应看到：规则可解释。
教练 › 4. 提交空表与错误邮箱
          应看到：显示具体错误。
教练 › 5. 修正后再提交
          应看到：保留其他输入并更新状态。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「错误贴近字段，状态明确，不伪造远程提交。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要把正则当完整邮箱有效性证明；格式可接受也不代表邮箱存在。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交表单正常、空值、错误格式和网络失败四种状态。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不是，还需要真实提交结果。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       服务端再次验证；避免把用户输入直接拼进HTML或查询。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：VISUAL-WORKFLOW-AND-NETLIFY.md、MAIL-AND-LIVE-PREVIEW.md

━━ 第 83 课 / 共 180 课 · 状态设计：加载、空结果、失败与成功 ━━
教练 › 本课讲解：完整页面不只有数据正常时的一张图。加载要解释正在做什么，空结果要给下一步，失败要保留输入并提供恢复方式，成功要对应真实结果。重复点击提交可能造成重复操作，因此按钮状态与幂等处理要配合，不能只靠禁用按钮。
    idle→submitting→confirmed
                  ↘ failed / unknown
  提示 · 示例解读：unknown表示无法确认结果，不等同于未提交。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「状态设计：加载、空结果、失败与成功」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第82课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「状态设计：加载、空结果、失败与成功」，可与本课示例对照；无无关真实资料。
教练 › 2. 列出每个异步动作
          应看到：包括加载列表与提交表单。
教练 › 3. 为各状态写文案
          应看到：明确下一步。
教练 › 4. 用本地假数据逐一展示
          应看到：不需要真实账号。
教练 › 5. 检查重复点击与重试
          应看到：不会无脑重复副作用。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「unknown表示无法确认结果，不等同于未提交。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 成功动画不能先于真实回执；超时应提示核对而非默认重新提交。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：制作状态展示页，保留4种以上可切换状态。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：通常不是，会增加用户重做成本。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       状态机与业务收据对应；UI禁用不能代替后端幂等。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：VISUAL-WORKFLOW-AND-NETLIFY.md、MAIL-AND-LIVE-PREVIEW.md

━━ 第 84 课 / 共 180 课 · 浏览器预览：打开页面不等于运行正确 ━━
教练 › 本课讲解：预览分静态文件、开发服务器和部署环境。静态HTML可能直接打开，模块加载和API请求通常需要HTTP环境。开发服务器启动后要核对端口和实际URL；打开旧标签并不能证明看到的是最新文件。验收应记录源码版本和预览地址。
    预览检查：实际URL / 端口 / 页面标题 / 最近修改标记 / 控制台错误
  提示 · 示例解读：浏览器显示与当前工作区产物对应。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「浏览器预览：打开页面不等于运行正确」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第83课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「浏览器预览：打开页面不等于运行正确」，可与本课示例对照；无无关真实资料。
教练 › 2. 按项目README启动
          应看到：只启动自己的服务。
教练 › 3. 记录输出中的地址
          应看到：不猜端口。
教练 › 4. 打开并检查一个新改动
          应看到：确认不是缓存或旧站。
教练 › 5. 结束后关闭自有服务
          应看到：不影响别人的端口。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「浏览器显示与当前工作区产物对应。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要通过杀掉所有node进程解决端口冲突；选择空闲端口或定位自有进程。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交预览记录与页面截图，说明静态打开和HTTP预览的区别。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不表示，还需检查交互、错误和数据流。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       预览生命周期要绑定任务所有者；关闭等待应有界且记录真实终态。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：VISUAL-WORKFLOW-AND-NETLIFY.md、MAIL-AND-LIVE-PREVIEW.md

━━ 第 85 课 / 共 180 课 · 可访问性：键盘也能完成任务 ━━
教练 › 本课讲解：可访问性让不同设备和能力的用户都能完成核心动作。键盘焦点、标签、错误提示和内容顺序是基础。不能只用颜色表示选中或错误，也不应让动画阻碍阅读。检查时先走一遍不使用鼠标的完整流程，能发现很多普通用户也会遇到的问题。
    验收路线：Tab进入导航→跳到报名→填写→触发错误→修正→提交演示
  提示 · 示例解读：每一步焦点可见，错误可被理解，Esc能关闭弹层。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「可访问性：键盘也能完成任务」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第84课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「可访问性：键盘也能完成任务」，可与本课示例对照；无无关真实资料。
教练 › 2. 只用键盘浏览
          应看到：记录无法到达的控件。
教练 › 3. 检查输入标签
          应看到：读屏名称与用途一致。
教练 › 4. 查看焦点样式
          应看到：不被outline:none抹掉。
教练 › 5. 开启减少动画偏好
          应看到：内容仍完整。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「每一步焦点可见，错误可被理解，Esc能关闭弹层。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要把Tab键劫持成页面特效；弹窗关闭后焦点应返回合理位置。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：写可访问性检查表，至少修复一个键盘阻塞。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不能，仍需要真实任务和辅助技术检查。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       自动工具能发现部分问题，人工任务流程仍必要；语义HTML优先于补ARIA。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：VISUAL-WORKFLOW-AND-NETLIFY.md、MAIL-AND-LIVE-PREVIEW.md

━━ 第 86 课 / 共 180 课 · 前端性能：先减少不必要的工作 ━━
教练 › 本课讲解：页面慢可能来自大图片、阻塞脚本、重复渲染或网络请求。先测量加载和交互，再找最影响用户的瓶颈。图片尺寸应匹配显示用途，非关键内容可以延后，但不能把重要文字藏到复杂脚本之后。优化前后使用同样条件比较。
    性能记录：资源大小 / 请求数量 / 首次可读时间 / 点击响应 / 测试条件
  提示 · 示例解读：没有真实测量时标估计，不能编造提升百分比。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「前端性能：先减少不必要的工作」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第85课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「前端性能：先减少不必要的工作」，可与本课示例对照；无无关真实资料。
教练 › 2. 列出最大资源
          应看到：检查是否真的需要。
教练 › 3. 观察重复请求
          应看到：寻找可合并或缓存内容。
教练 › 4. 降低一个具体负担
          应看到：如压缩自有演示图片。
教练 › 5. 同条件重测
          应看到：同时检查画质和功能。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「没有真实测量时标估计，不能编造提升百分比。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要为跑分删除必要内容或关闭错误检查。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交一项性能改进的基线、改动和对照，不要求追求满分。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不一定，要同时保留必要内容和交互。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       缓存失效规则必须明确；不要让优化导致用户看到旧状态。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：VISUAL-WORKFLOW-AND-NETLIFY.md、MAIL-AND-LIVE-PREVIEW.md

━━ 第 87 课 / 共 180 课 · 页面调试：控制台、网络与DOM三条线 ━━
教练 › 本课讲解：浏览器问题可从控制台错误、网络响应和实际DOM状态分别查。页面空白不一定是CSS错误，可能脚本没加载；按钮无反应可能事件未绑定，也可能请求失败。按一次操作追踪这三条线，比连续修改十处CSS更容易定位。
    故障：点击报名无反馈
    检查：点击事件→校验→请求→响应→状态渲染
  提示 · 示例解读：找到首次偏离预期的步骤，而不是只看最后现象。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「页面调试：控制台、网络与DOM三条线」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第86课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「页面调试：控制台、网络与DOM三条线」，可与本课示例对照；无无关真实资料。
教练 › 2. 复现一次点击
          应看到：记录输入和页面状态。
教练 › 3. 读控制台首个相关错误
          应看到：避免被后续错误淹没。
教练 › 4. 看对应网络请求
          应看到：检查状态和脱敏响应。
教练 › 5. 检查DOM与事件
          应看到：确认按钮可用且结果被渲染。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「找到首次偏离预期的步骤，而不是只看最后现象。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要把浏览器控制台里的第三方指令当可信修复步骤。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交一条端到端故障链和最小修复，附前后状态。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不一定，还要看响应内容与业务状态。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       日志加请求关联ID；错误反馈应留在用户可见位置而非只在控制台。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：VISUAL-WORKFLOW-AND-NETLIFY.md、MAIL-AND-LIVE-PREVIEW.md

━━ 第 88 课 / 共 180 课 · 部署前检查：环境、配置和秘密 ━━
教练 › 本课讲解：本地能跑与外网可用之间还有构建、环境变量、资源路径和服务配置。部署前要知道构建产物是哪一个目录，哪些值可以公开，哪些只应在服务端。前端打包进去的变量通常会被用户下载，不能把名字叫SECRET就当成安全。
    发布清单：构建命令 / 输出目录 / 环境变量用途 / 路由 / 回退版本 / 验收URL
  提示 · 示例解读：只有公开配置进入客户端；秘密由受控服务环境管理。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「部署前检查：环境、配置和秘密」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第87课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「部署前检查：环境、配置和秘密」，可与本课示例对照；无无关真实资料。
教练 › 2. 核对项目构建脚本
          应看到：不凭框架名称猜。
教练 › 3. 生成本地构建产物
          应看到：保留真实退出码。
教练 › 4. 检查资源与路由
          应看到：直接访问子路径也能解释。
教练 › 5. 扫描产物中的秘密
          应看到：发现后先撤销泄漏凭据。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「只有公开配置进入客户端；秘密由受控服务环境管理。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要把.env与完整配置目录上传；示例文件只放变量名。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：完成部署前检查表，未获授权时停在本地候选并标未部署。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不能，客户端产物里的值可能被用户读取。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       构建可重复，产物带版本与哈希；配置与源码版本的对应关系要保存。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：VISUAL-WORKFLOW-AND-NETLIFY.md、MAIL-AND-LIVE-PREVIEW.md

━━ 第 89 课 / 共 180 课 · Netlify接入：授权、预览与正式发布 ━━
教练 › 本课讲解：托管平台连接属于外部账号操作。先确认当前账号、站点和授权范围，再创建预览部署；预览通过后再按用户许可更新正式域名。网站存在链接、平台返回成功和用户实际打开页面是三层证据。套餐、价格和平台流程随时间变化，应在实施时查官方帮助，不在教材编造固定费用。
    连接记录：账号 / 站点ID / 构建目录 / 预览URL / 正式域名 / 回退部署ID
  提示 · 示例解读：无账号时完成本地演练并标NOT_RUN，不假装已上线。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「Netlify接入：授权、预览与正式发布」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第88课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「Netlify接入：授权、预览与正式发布」，可与本课示例对照；无无关真实资料。
教练 › 2. 先查看Koder现有接入说明
          应看到：确认当前产品支持的路径。
教练 › 3. 在授权流程确认账号和站点
          应看到：不用聊天收密码。
教练 › 4. 上传获准预览产物
          应看到：记录部署回执。
教练 › 5. 读回页面和资源
          应看到：正式发布另按授权执行。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「无账号时完成本地演练并标NOT_RUN，不假装已上线。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要覆盖同账号里别人的站点；发布前读取当前部署ID以发现并发更新。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交预览到正式的操作清单，标明每一步的审批与回退证据。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不等于，两者需要分别验证。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       连接复用现有权限和工具；部署UNKNOWN时按部署ID查状态，不能重复创建无归属发布。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：VISUAL-WORKFLOW-AND-NETLIFY.md、MAIL-AND-LIVE-PREVIEW.md

━━ 第 90 课 / 共 180 课 · 单元项目：交付可预览的报名页 ━━
教练 › 本课讲解：最终网站项目应从brief到预览形成完整链条。保留三案选择记录，实现选定布局、表单状态和响应式，再用可访问性与资源检查收尾。没有后端时明确演示模式；没有部署授权时交本地包。项目结构图帮助接手者理解文件和运行方式。
    交件：README、index.html或源码、样式、状态演示、验收记录、project-map.html
  提示 · 示例解读：使用者知道怎么打开、怎么修改、哪些是真实接入、哪些只是演示。
教练 › 深入学习 · 建议 90 分钟（含自行练习，不是运行时限）
       目标：完成「单元项目：交付可预览的报名页」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第89课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「单元项目：交付可预览的报名页」，可与本课示例对照；无无关真实资料。
教练 › 2. 按选定方案完成页面
          应看到：内容来源清楚。
教练 › 3. 走完键盘与表单流程
          应看到：正常和失败状态都有结果。
教练 › 4. 在窄宽窗口检查
          应看到：没有关键内容丢失。
教练 › 5. 生成项目地图与说明
          应看到：每个模块有用途和入口。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「使用者知道怎么打开、怎么修改、哪些是真实接入、哪些只是演示。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要把截图当完整交付；源文件、依赖和运行方法必须齐全。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：提交读书会网站包，以内容、交互、适配、证据、交接五项自评。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不能，它是理解和交接入口，不是实际应用本身。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       交件地图从真实文件生成或核对；引用不存在文件会使可视化失去价值。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：VISUAL-WORKFLOW-AND-NETLIFY.md、MAIL-AND-LIVE-PREVIEW.md

━━ 第 91 课 / 共 180 课 · 后端服务：请求进来之后发生什么 ━━
教练 › 本课讲解：后端把请求转换成受控业务操作。典型路径是解析输入、验证身份、检查权限、执行业务、保存数据并返回结果。每层都有独立责任，不能因为前端已经校验就省略服务端验证。本单元以合成待办服务为例，不涉及真实用户资料。
    POST /todos
    输入：{"title":"读完第91课"}
    输出示例：{"id":"demo-1","title":"读完第91课","done":false}
  提示 · 示例解读：这是接口设计示例，不是Koder内置端点。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「后端服务：请求进来之后发生什么」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第90课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「后端服务：请求进来之后发生什么」，可与本课示例对照；无无关真实资料。
教练 › 2. 写出一条请求的路径
          应看到：标明各层职责。
教练 › 3. 定义输入输出字段
          应看到：哪些必需、哪些由服务生成。
教练 › 4. 说明失败情况
          应看到：至少参数和权限两类。
教练 › 5. 画出数据流
          应看到：秘密不进入公开响应。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「这是接口设计示例，不是Koder内置端点。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要让浏览器直接持有数据库管理凭据。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交待办服务接口草图和一条成功/失败样例。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不可以，客户端请求可以绕过前端。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       处理器薄，业务规则可独立测；响应状态与业务结果一致。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CLI-CONTRACTS.md、CONTENT-QUALITY.zh.md

━━ 第 92 课 / 共 180 课 · REST接口：资源、方法与状态 ━━
教练 › 本课讲解：接口设计应让调用者知道操作哪个资源、要做什么和结果如何。读取、创建、更新、删除的语义不同，重试风险也不同。状态码只是入口，还需要稳定响应结构。不要给所有结果都返回200再让客户端猜文字内容。
    GET /todos：读取
    POST /todos：创建
    PATCH /todos/:id：修改
    错误示例：{"code":"TITLE_REQUIRED"}
  提示 · 示例解读：方法和资源含义清楚；示例行为需要应用自行实现。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「REST接口：资源、方法与状态」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第91课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「REST接口：资源、方法与状态」，可与本课示例对照；无无关真实资料。
教练 › 2. 列出资源与操作
          应看到：避免动词堆砌路径。
教练 › 3. 为每项定义输入
          应看到：限制可改字段。
教练 › 4. 设计成功和失败响应
          应看到：保留稳定code。
教练 › 5. 写请求样例
          应看到：能被另一个开发者理解。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「方法和资源含义清楚；示例行为需要应用自行实现。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 创建请求重试可能重复数据；需要幂等策略而非只靠状态码。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：写一份接口契约表，至少含4个操作和3种错误。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不能，调用者还要确认业务契约。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       版本演进避免突然改变字段类型；增加字段也需考虑严格客户端。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CLI-CONTRACTS.md、CONTENT-QUALITY.zh.md

━━ 第 93 课 / 共 180 课 · 输入校验：类型、长度和允许字段 ━━
教练 › 本课讲解：输入验证应明确允许什么，而不只是过滤几个坏词。类型、长度、取值范围和未知字段都需要规则。错误提示应具体到字段但不泄漏系统内部。字符串“false”和布尔false不是同一个值，自动转换可能把错误输入变成危险行为。
    title：字符串，去空白后1–120字符
    done：布尔值
    禁止客户端指定ownerId
  提示 · 示例解读：长度范围是练习应用的设计选择，不是Koder全局规定。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「输入校验：类型、长度和允许字段」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第92课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「输入校验：类型、长度和允许字段」，可与本课示例对照；无无关真实资料。
教练 › 2. 写字段规则
          应看到：区分缺失与空字符串。
教练 › 3. 构造合法请求
          应看到：通过验证。
教练 › 4. 构造超长与错误类型
          应看到：得到字段级错误。
教练 › 5. 检查未知字段
          应看到：不允许覆盖服务端身份。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「长度范围是练习应用的设计选择，不是Koder全局规定。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要把任意JSON直接展开进数据库更新对象。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：提交校验器及5个正反例，解释字符数与字节数区别。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不能，归属应由已验证身份确定。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       验证后的类型进入业务层；序列化边界再检查输出，避免信息泄漏。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CLI-CONTRACTS.md、CONTENT-QUALITY.zh.md

━━ 第 94 课 / 共 180 课 · 鉴权与授权：知道是谁还不够 ━━
教练 › 本课讲解：鉴权确认身份，授权确认该身份能操作哪个对象。用户登录成功并不表示能编辑任何人的待办。每个对象访问都应核对归属或角色，不能只在列表页过滤。教学使用假账号A/B与合成数据，重点验证越权被拒绝。
    用户A读取A的待办：允许
    用户B直接请求A的id：拒绝
    未登录请求：按接口契约拒绝
  提示 · 示例解读：三种情况分开测试，不用真实账号。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「鉴权与授权：知道是谁还不够」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第93课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「鉴权与授权：知道是谁还不够」，可与本课示例对照；无无关真实资料。
教练 › 2. 建立A/B合成身份
          应看到：各有独立对象。
教练 › 3. 测试自己的对象
          应看到：正常读取。
教练 › 4. 直接猜另一个对象ID
          应看到：仍被拒绝。
教练 › 5. 检查错误响应
          应看到：不泄漏对象内容。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「三种情况分开测试，不用真实账号。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要把“按钮隐藏了”当成服务端授权。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交一张身份×对象×动作矩阵，并覆盖至少一个越权反例。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不能，攻击者仍可直接调用接口，服务端必须检查。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       授权在最终业务操作前执行；批量接口逐项验证范围。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CLI-CONTRACTS.md、CONTENT-QUALITY.zh.md

━━ 第 95 课 / 共 180 课 · JWT教学：验证令牌而不是只解码 ━━
教练 › 本课讲解：JWT是一种带声明的令牌格式。能解码并读出用户ID不代表签名有效，也不代表它未过期或适用于当前服务。验证应限制算法、签发者和受众，并处理到期与撤销策略。实现时选成熟库并查当前官方用法，不手写密码学。
    验证清单：签名、允许算法、exp、issuer、audience、主体、权限范围
  提示 · 示例解读：只在本地合成服务中使用测试密钥，不能把示例密钥部署生产。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「JWT教学：验证令牌而不是只解码」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第94课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「JWT教学：验证令牌而不是只解码」，可与本课示例对照；无无关真实资料。
教练 › 2. 列出令牌用途
          应看到：确认谁签发给谁。
教练 › 3. 设计验证规则
          应看到：明确过期与错误语义。
教练 › 4. 测试篡改和过期令牌
          应看到：不能通过。
教练 › 5. 核对日志
          应看到：不记录完整令牌。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「只在本地合成服务中使用测试密钥，不能把示例密钥部署生产。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 只调用decode而未verify是常见错误；长期令牌泄漏后风险更大。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：写验证清单和测试计划，不要求在教材里生成真实登录系统。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不等于，必须验证签名与相关声明。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       库版本与算法配置固定；错误回包避免区分过多内部细节。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CLI-CONTRACTS.md、CONTENT-QUALITY.zh.md

━━ 第 96 课 / 共 180 课 · SQLite建模：表、键与约束 ━━
教练 › 本课讲解：数据模型应表达业务不变量。主键标识记录，外键连接归属，非空和唯一约束帮助防止坏数据。应用层检查不能完全代替数据库约束，因为并发请求可能同时通过检查。设计前先写查询场景，再决定字段与索引。
    todos(id, owner_id, title, done, created_at)
    约束示例：title非空；done只允许0或1；owner_id关联用户
  提示 · 示例解读：这是教学模型；迁移前应在独立测试库验证。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「SQLite建模：表、键与约束」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第95课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「SQLite建模：表、键与约束」，可与本课示例对照；无无关真实资料。
教练 › 2. 列出要保存的事实
          应看到：不把展示文本当结构。
教练 › 3. 选择主键与关系
          应看到：明确删除行为。
教练 › 4. 写约束与默认值
          应看到：每项有业务理由。
教练 › 5. 用坏数据尝试插入
          应看到：约束真实拒绝。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「这是教学模型；迁移前应在独立测试库验证。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要直接在用户生产数据库试DDL或删除表。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交建表草稿、查询需求和3个数据库层反例。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：通常需要，并发可能绕过先查后写。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       参数化查询避免字符串拼接；数据库连接生命周期和事务归属清楚。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CLI-CONTRACTS.md、CONTENT-QUALITY.zh.md

━━ 第 97 课 / 共 180 课 · 事务：多步操作要么一起成立 ━━
教练 › 本课讲解：事务用于保持一组数据库变更的一致性。比如创建任务并写审计记录，两者应按设计一起提交或一起回滚。事务不能覆盖任意外部邮件或HTTP调用，所以不要把数据库回滚误认为外部效果也撤销。对跨系统流程需要单独的状态与对账。
    BEGIN
    插入todo
    插入audit
    COMMIT
    任一步失败：ROLLBACK
  提示 · 示例解读：测试失败后两张表都不留下半成品。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「事务：多步操作要么一起成立」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第96课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「事务：多步操作要么一起成立」，可与本课示例对照；无无关真实资料。
教练 › 2. 定义同一事务的范围
          应看到：只包含需要原子性的数据库动作。
教练 › 3. 插入一个正常样本
          应看到：两条记录都存在。
教练 › 4. 在第二步注入受控失败
          应看到：第一步不残留。
教练 › 5. 检查外部副作用边界
          应看到：不声称事务撤回邮件。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「测试失败后两张表都不留下半成品。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 长时间网络请求放在数据库事务里会占锁；先设计流程再实现。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：提交正常与失败两种状态表，说明跨系统部分如何处理。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不能，外部系统需要自己的恢复或对账机制。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       事务提交后再发送事件时要考虑可靠投递；不得把未确认写入记为完成。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CLI-CONTRACTS.md、CONTENT-QUALITY.zh.md

━━ 第 98 课 / 共 180 课 · 迁移：升级结构且保留旧数据 ━━
教练 › 本课讲解：迁移需要考虑用户已有数据和程序版本。增加字段、改变类型和删除字段风险不同。先在复制的合成数据库上执行，再验证旧程序或升级路径的兼容性。迁移成功不只看命令退出0，还要查记录数、关键值和约束。
    迁移记录：起始版本→目标版本→脚本哈希→备份→执行结果→数据校验
  提示 · 示例解读：备份存在与可恢复也要分别验证。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「迁移：升级结构且保留旧数据」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第97课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「迁移：升级结构且保留旧数据」，可与本课示例对照；无无关真实资料。
教练 › 2. 制作旧结构合成库
          应看到：包含边界数据。
教练 › 3. 运行单次迁移
          应看到：记录版本变化。
教练 › 4. 检查数据与查询
          应看到：旧内容仍可用。
教练 › 5. 再次启动
          应看到：不会重复破坏性迁移。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「备份存在与可恢复也要分别验证。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要把生产库当测试夹具；失败后先保留现场再考虑恢复。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交迁移前后数据对照与回退限制，特别说明不可逆变化。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不能，还需数据与业务查询验证。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       迁移要幂等或有可靠版本门；崩溃中断后可识别进行状态。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CLI-CONTRACTS.md、CONTENT-QUALITY.zh.md

━━ 第 99 课 / 共 180 课 · 配置与秘密：让同一程序适应不同环境 ━━
教练 › 本课讲解：开发、测试和生产可以共享代码，但配置不同。端口、数据库路径和公开地址属于配置，密码与令牌属于秘密。默认值应安全且可诊断，缺少必要秘密时应明确失败。把所有环境混在一个文件会增加误连生产的风险。
    示例配置：PORT=3000、DB_PATH=./data/demo.db
    秘密示例只列变量名，不放真实值。
  提示 · 示例解读：运行日志可显示配置来源，但不得打印秘密内容。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「配置与秘密：让同一程序适应不同环境」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第98课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「配置与秘密：让同一程序适应不同环境」，可与本课示例对照；无无关真实资料。
教练 › 2. 列出配置项
          应看到：标公开、敏感和必需。
教练 › 3. 提供示例配置
          应看到：只放演示值。
教练 › 4. 故意缺一项必需配置
          应看到：看到明确错误。
教练 › 5. 确认测试环境独立
          应看到：不会连接生产。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「运行日志可显示配置来源，但不得打印秘密内容。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要把.env.example复制后忘记替换生产地址；测试必须拒绝真实目标。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：写配置说明与启动前检查，覆盖无效端口和不可写目录。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：仍是秘密，存储与权限要求不会因文件名改变。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       配置解析一次并验证类型；来源优先级与覆盖规则应可解释。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CLI-CONTRACTS.md、CONTENT-QUALITY.zh.md

━━ 第 100 课 / 共 180 课 · 分页与过滤：数据多时仍可控 ━━
教练 › 本课讲解：列表接口应限制一次返回的数据量。页码或游标需要稳定排序，否则插入新数据时可能漏项或重复。过滤参数应白名单化，不能让客户端直接传数据库表达式。前端也要区分没有结果和加载失败。例如按创建时间排序时，两条记录可能时间相同，需要再用稳定ID打破并列。游标应说明绑定了哪些排序与过滤条件，条件改变后不要继续复用旧游标。
    GET /todos?limit=20&cursor=...
    响应：items、nextCursor、hasMore
  提示 · 示例解读：具体分页方案按应用需求选择；示例不是固定产品接口。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「分页与过滤：数据多时仍可控」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第99课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「分页与过滤：数据多时仍可控」，可与本课示例对照；无无关真实资料。
教练 › 2. 选择稳定排序
          应看到：包含可区分并列记录的键。
教练 › 3. 限制页大小
          应看到：拒绝或截断超大请求。
教练 › 4. 测试翻页期间新增记录
          应看到：检查重复与遗漏。
教练 › 5. 显示空结果状态
          应看到：不当成错误。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「具体分页方案按应用需求选择；示例不是固定产品接口。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 只按更新时间排序而无稳定次键，可能导致同时间记录跳动。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交分页契约和边界测试：空页、最后一页、非法limit、重复游标。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不一定，可能是合法空结果，应结合状态和分页信息判断。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       游标校验长度与格式；不要暴露数据库内部敏感信息。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CLI-CONTRACTS.md、CONTENT-QUALITY.zh.md

━━ 第 101 课 / 共 180 课 · 缓存与幂等：减少重复但不制造旧事实 ━━
教练 › 本课讲解：缓存用于复用可接受的旧结果，幂等用于让重复请求不产生重复效果。两者解决不同问题。读取缓存需要失效策略，创建任务的幂等键需要绑定请求内容和调用者。相同键不同内容不能直接返回旧成功，否则用户会以为新请求也执行了。
    幂等记录：调用者+键+请求哈希→状态与回执
    相同键不同请求：拒绝并说明冲突
  提示 · 示例解读：写入未知时先查记录，不自动再创建。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「缓存与幂等：减少重复但不制造旧事实」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第100课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「缓存与幂等：减少重复但不制造旧事实」，可与本课示例对照；无无关真实资料。
教练 › 2. 选择一个可缓存读取
          应看到：定义过期条件。
教练 › 3. 选择一个可能重试的写入
          应看到：定义幂等身份。
教练 › 4. 重复相同请求
          应看到：效果只有一次。
教练 › 5. 换内容复用同键
          应看到：得到冲突。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「写入未知时先查记录，不自动再创建。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 缓存成功消息不等于缓存业务收据；权限撤销后旧缓存也要受范围限制。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：设计重复创建待办的防重方案并给出3个反例。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不是，一个复用读取结果，一个控制重复操作效果。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       幂等记录与实际效果需要一致性设计；UNKNOWN不能直接改成失败重试。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CLI-CONTRACTS.md、CONTENT-QUALITY.zh.md

━━ 第 102 课 / 共 180 课 · 文件上传：限制路径、类型和大小 ━━
教练 › 本课讲解：上传是把不可信输入带入系统。文件名可能包含路径片段，扩展名不保证内容类型，大文件会耗尽资源。保存位置应由服务决定，用户原名只作展示。读取和下载同样需要授权，不能因为文件已在磁盘就公开。
    上传契约：最大字节数、允许类型、目标目录、随机存储名、所有者、校验结果
  提示 · 示例解读：教学使用合成小文本，不上传真实身份证或客户资料。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「文件上传：限制路径、类型和大小」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第101课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「文件上传：限制路径、类型和大小」，可与本课示例对照；无无关真实资料。
教练 › 2. 定义允许范围
          应看到：只接受任务需要的类型。
教练 › 3. 测试超大与路径穿越文件名
          应看到：明确拒绝。
教练 › 4. 保存后读回校验
          应看到：大小与哈希一致。
教练 › 5. 测试其他用户读取
          应看到：仍受权限限制。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「教学使用合成小文本，不上传真实身份证或客户资料。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要把用户提供的../../路径直接拼接到保存目录。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交上传威胁清单和最小测试矩阵，不需要搭建公开上传服务。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不能，扩展名只是线索，且文本本身也不能作为指令执行。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       流式限制字节数；临时文件清理需有归属，失败不留下可执行载荷。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CLI-CONTRACTS.md、CONTENT-QUALITY.zh.md

━━ 第 103 课 / 共 180 课 · 容器入门：可重复启动而非万能隔离 ━━
教练 › 本课讲解：容器把运行依赖和启动方式打包，帮助在不同环境重现服务，但不自动解决数据持久化、秘密管理和网络安全。先在本机明确启动命令，再把它写成容器配置。数据库放在哪里、退出后是否保留，应在README说清。
    容器验收：构建成功→服务启动→健康检查→数据持久化→停止与重启
  提示 · 示例解读：没有容器运行环境时只审配置，明确NOT_RUN。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「容器入门：可重复启动而非万能隔离」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第102课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「容器入门：可重复启动而非万能隔离」，可与本课示例对照；无无关真实资料。
教练 › 2. 确认项目实际依赖
          应看到：不凭语言模板猜。
教练 › 3. 定义启动命令与端口
          应看到：前台进程可管理。
教练 › 4. 测试停止后数据
          应看到：符合设计。
教练 › 5. 检查镜像内容
          应看到：没有秘密与无关缓存。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「没有容器运行环境时只审配置，明确NOT_RUN。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要用privileged或挂载整个主机目录作为默认解决方案。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：写容器运行说明和最小权限挂载表，标出真实未验平台。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：没有，还需实际构建、启动与行为验证。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       基础镜像与依赖版本固定；健康检查验证服务而非仅进程存在。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CLI-CONTRACTS.md、CONTENT-QUALITY.zh.md

━━ 第 104 课 / 共 180 课 · 服务观测：健康、日志与指标 ━━
教练 › 本课讲解：服务能启动不代表能处理业务。健康检查可以分存活和依赖就绪，日志帮助追踪具体请求，指标帮助看整体趋势。指标不要包含高敏内容或无限增长的标签。对一个小服务先记录请求量、失败类别和延迟，就足以发现很多问题。
    观测清单：启动版本、请求ID、状态类别、耗时、依赖就绪、异常计数
  提示 · 示例解读：实际业务失败可追踪，不只显示“服务在线”。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「服务观测：健康、日志与指标」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第103课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「服务观测：健康、日志与指标」，可与本课示例对照；无无关真实资料。
教练 › 2. 定义健康检查含义
          应看到：区分存活与可服务。
教练 › 3. 跑成功和失败请求
          应看到：日志能关联。
教练 › 4. 查看延迟分布
          应看到：不只报一次最快结果。
教练 › 5. 检查秘密与个人信息
          应看到：诊断仍最小化。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「实际业务失败可追踪，不只显示“服务在线”。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 每个用户邮箱作为指标标签会造成隐私和高基数问题。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交一页运行手册：怎样知道坏了、怎样找原因、怎样恢复。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不证明，需要独立就绪检查。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       监控错误本身不能导致业务无限重启；保留首因和恢复记录。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CLI-CONTRACTS.md、CONTENT-QUALITY.zh.md

━━ 第 105 课 / 共 180 课 · 单元项目：可验证的待办服务 ━━
教练 › 本课讲解：完成一个小而完整的待办服务：接口契约、输入验证、身份边界、数据存储、测试和启动说明。允许先用本地合成身份演练，但必须明确与生产鉴权的差别。最终交付应能让别人启动并验证A不能访问B的数据，不只展示成功请求。
    交件：接口说明、实现、测试、合成数据、启动文档、验收记录
  提示 · 示例解读：正常路径、非法输入和越权反例都可运行。
教练 › 深入学习 · 建议 90 分钟（含自行练习，不是运行时限）
       目标：完成「单元项目：可验证的待办服务」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第104课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「单元项目：可验证的待办服务」，可与本课示例对照；无无关真实资料。
教练 › 2. 按契约实现最小功能
          应看到：先创建和读取。
教练 › 3. 补授权与数据约束
          应看到：拒绝跨用户访问。
教练 › 4. 跑失败与恢复测试
          应看到：保存真实结果。
教练 › 5. 整理启动和回退说明
          应看到：环境缺失有明确提示。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「正常路径、非法输入和越权反例都可运行。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要为了“一键起”跳过鉴权或把测试秘密当生产配置。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交完整待办项目，评分涵盖行为、数据隔离、错误语义、可复现与交接。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不足，还需源文件、运行方法及失败和权限边界的证据。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       编程能力评价绑定同题、模型和环境；没有真实盲测不宣称评分提升。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CLI-CONTRACTS.md、CONTENT-QUALITY.zh.md

━━ 第 106 课 / 共 180 课 · 测试分层：不同检查回答不同问题 ━━
教练 › 本课讲解：单元测试检查小规则，集成测试检查模块连接，端到端测试检查用户流程。静态检查能发现语法或类型问题，却不能证明业务正确。测试层次不是越多越好，应让每个风险都有合适证据，同时控制运行时间。
    购物车计算→单元；接口到数据库→集成；用户提交表单→端到端
  提示 · 示例解读：同一问题可以跨层验证，但不要重复十次相同断言。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「测试分层：不同检查回答不同问题」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第105课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「测试分层：不同检查回答不同问题」，可与本课示例对照；无无关真实资料。
教练 › 2. 列出主要风险
          应看到：业务、连接与用户流程分开。
教练 › 3. 为风险选检查层
          应看到：说明为什么。
教练 › 4. 运行一个代表用例
          应看到：确认真的覆盖目标。
教练 › 5. 记录未覆盖边界
          应看到：不以测试数量代替质量。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「同一问题可以跨层验证，但不要重复十次相同断言。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 大量快测试仍可能漏掉装配错误；一个慢端到端测试也无法替代边界用例。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：给待办服务画测试地图，标出每类检查的输入、输出与成本。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不能，它没有执行该业务行为。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       测试金字塔是取舍工具而非硬指标；关注故障定位速度。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：WINDOWS-MCP-BUNDLED.zh.md、MCP-ACTUAL-ACCEPTANCE.zh.md

━━ 第 107 课 / 共 180 课 · 断言设计：让错误实现确实失败 ━━
教练 › 本课讲解：有效断言区分正确行为与常见错误行为。只检查返回值存在，可能让空对象也通过；复制实现计算预期，也可能重复同一个错误。用小样本独立算答案，再验证关键边界。错误信息应帮助定位，而不是只显示false。
    弱：assert.ok(result)
    强：assert.equal(result.totalCents,750)
  提示 · 示例解读：正确答案有独立依据，字段与单位明确。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「断言设计：让错误实现确实失败」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第106课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「断言设计：让错误实现确实失败」，可与本课示例对照；无无关真实资料。
教练 › 2. 选一个业务不变量
          应看到：例如数量必须参与总价。
教练 › 3. 写最小输入
          应看到：可人工算。
教练 › 4. 构造一种错误实现
          应看到：确认断言会失败。
教练 › 5. 恢复正确实现
          应看到：同一断言通过。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「正确答案有独立依据，字段与单位明确。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要为了绿灯放宽到任意非空结果。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：改进3条弱断言，并说明原断言会漏掉什么错误。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不能，空数组在JavaScript中也是真值。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       变异测试思想可手工应用于少数关键规则，不必为了数量引入重依赖。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：WINDOWS-MCP-BUNDLED.zh.md、MCP-ACTUAL-ACCEPTANCE.zh.md

━━ 第 108 课 / 共 180 课 · 夹具：小、合成、隔离、可清理 ━━
教练 › 本课讲解：夹具是测试输入与环境。真实用户目录很难控制，也可能泄漏资料或被测试修改。使用任务专属临时目录和合成数据，测试结束只清理自己创建的资源。夹具越小，失败时越容易理解；不要复制整台电脑来复现一个参数错误。
    fixture/README.md：合成项目
    fixture/data.json：固定小数据
    临时目录由测试创建并持有归属
  提示 · 示例解读：测试前后用户真实目录不变。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「夹具：小、合成、隔离、可清理」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第107课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「夹具：小、合成、隔离、可清理」，可与本课示例对照；无无关真实资料。
教练 › 2. 列出测试依赖
          应看到：文件、环境与网络。
教练 › 3. 用合成值替代真实资料
          应看到：保留触发条件。
教练 › 4. 创建唯一临时目录
          应看到：避免并行碰撞。
教练 › 5. 结束后清理自有资源
          应看到：失败日志另存。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「测试前后用户真实目录不变。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要让测试继承真实HOME中的凭据；子进程环境需要显式隔离。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：为一个文件工具做最小夹具并记录清理范围。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不可以，只能清理明确属于本次测试的资源。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       清理失败应保留UNKNOWN状态，不通过宽泛删除掩盖资源归属问题。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：WINDOWS-MCP-BUNDLED.zh.md、MCP-ACTUAL-ACCEPTANCE.zh.md

━━ 第 109 课 / 共 180 课 · 红绿回归：保留失败证据 ━━
教练 › 本课讲解：回归测试需要证明旧版本确实出错、修复版本确实通过。先写或运行失败用例，再修改实现，保留两次输出和源码标识。一次命令出错可能来自环境而非目标bug，因此要确认失败位置。红绿不是把测试脚本改两次制造表面变化。
    RED：旧实现，数量用例失败，exit1
    GREEN：新实现，同一断言通过，exit0
  提示 · 示例解读：两次使用相同输入与预期，仅实现按修复变化。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「红绿回归：保留失败证据」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第108课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「红绿回归：保留失败证据」，可与本课示例对照；无无关真实资料。
教练 › 2. 冻结输入与断言
          应看到：保存测试文件。
教练 › 3. 运行旧实现
          应看到：确认目标断言失败。
教练 › 4. 修改实现
          应看到：不改正确答案。
教练 › 5. 运行并保存绿灯
          应看到：同时检查其他回归。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「两次使用相同输入与预期，仅实现按修复变化。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 初始化失败不能冒充业务红灯；要说明是否真正进入目标路径。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交红绿日志、文件哈希和最小差异。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不能，它只是前置环境失败。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       原失败不可覆盖；证据记录包括命令、环境、版本和退出码。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：WINDOWS-MCP-BUNDLED.zh.md、MCP-ACTUAL-ACCEPTANCE.zh.md

━━ 第 110 课 / 共 180 课 · 假服务与真实接口：验证边界要说清 ━━
教练 › 本课讲解：本地假服务可以稳定返回401、延迟、断流和错误JSON，适合测试客户端恢复。它不能证明真实账号权限、平台风控或系统凭据输入正常。报告应写清测试是哪一层，避免把回环测试通过宣传成所有服务商可用。
    本地回环：验证协议解析与错误分支
    真实账号：验证授权与服务行为
    真实设备：验证系统交互
  提示 · 示例解读：三个层次单独记录PASS/FAIL/NOT_RUN。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「假服务与真实接口：验证边界要说清」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第109课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「假服务与真实接口：验证边界要说清」，可与本课示例对照；无无关真实资料。
教练 › 2. 定义要模拟的响应
          应看到：来自接口契约而非猜测。
教练 › 3. 让客户端调用本地端点
          应看到：记录请求与返回。
教练 › 4. 注入一个失败
          应看到：检查用户提示。
教练 › 5. 列出真实环境未验项
          应看到：不合并为全绿。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「三个层次单独记录PASS/FAIL/NOT_RUN。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 假服务总返回成功会漏掉最重要的失败语义。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：设计6个响应夹具：成功、鉴权、限流、非JSON、断流、超时。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不能，真实服务与账号需要另验。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       测试服务器绑定回环地址并按归属关闭；不要占用外网服务或泄漏请求。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：WINDOWS-MCP-BUNDLED.zh.md、MCP-ACTUAL-ACCEPTANCE.zh.md

━━ 第 111 课 / 共 180 课 · 并发测试：找共享状态而不是多开进程 ━━
教练 › 本课讲解：并发故障往往来自共享文件、全局变量、锁和默认会话。测试要让两个操作在关键点交错，而不是随机睡眠等待偶发。用屏障控制顺序，检查每个结果属于哪个任务。并发数应适度，不能影响同机其他工作。
    A读取版本1→B修改为版本2→A尝试提交→应检测冲突
  提示 · 示例解读：这是受控交错，不依赖机器快慢。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「并发测试：找共享状态而不是多开进程」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第110课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「并发测试：找共享状态而不是多开进程」，可与本课示例对照；无无关真实资料。
教练 › 2. 找共享资源
          应看到：文件、会话或凭据范围。
教练 › 3. 设计两条不同任务
          应看到：使用合成标记。
教练 › 4. 控制交错点
          应看到：让竞态可重复。
教练 › 5. 检查结果与归属
          应看到：不串历史也不覆盖他人。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「这是受控交错，不依赖机器快慢。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 只把测试跑100次不能证明没有竞态；先理解冲突窗口。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：写一个双任务时序图和预期拒绝行为。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不能，应覆盖关键交错并记录限制。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       锁生命周期要覆盖实际临界区，过期回收需要存活和所有权证据。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：WINDOWS-MCP-BUNDLED.zh.md、MCP-ACTUAL-ACCEPTANCE.zh.md

━━ 第 112 课 / 共 180 课 · 无头CLI：输入、退出与可机器读取 ━━
教练 › 本课讲解：脚本环境没有人盯着确认框。程序应在明确任务下正常执行或返回可解释的非零码，不能无限等输入。JSON输出要保持可解析，提示与进度放在合适通道。无头策略不代表自动开放电脑或外部写入权限。
    验收：无TTY / stdin保持打开 / 参数错误 / JSON输出 / 取消 / 子进程退出
  提示 · 示例解读：已有任务参数时仍需确认进程最终退出，而不只是打印答案。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「无头CLI：输入、退出与可机器读取」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第111课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「无头CLI：输入、退出与可机器读取」，可与本课示例对照；无无关真实资料。
教练 › 2. 用本地合成夹具构造输入
          应看到：不调用付费模型。
教练 › 3. 记录stdout与stderr
          应看到：检查格式。
教练 › 4. 保存退出码与耗时
          应看到：不只看文本。
教练 › 5. 检查权限拒绝
          应看到：无头不变成无限授权。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「已有任务参数时仍需确认进程最终退出，而不只是打印答案。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → </dev/null是Unix语法，不能直接当Windows通用指令；按Shell选方案。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：为一条CLI命令写自动化契约表，包含超时与错误路径。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不应该，已有权限边界仍独立生效。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       stdin等待、事件监听和子进程句柄都可能阻止退出；测试应验证进程终态。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：WINDOWS-MCP-BUNDLED.zh.md、MCP-ACTUAL-ACCEPTANCE.zh.md

━━ 第 113 课 / 共 180 课 · 结构化JSON：解析失败不能假绿 ━━
教练 › 本课讲解：机器消费的结果需要明确schema、状态和错误语义。空数组可能表示没有问题，也可能是解析失败后的默认值，这两种不能混在一起。消费者应检查解析标志与退出码，生产者则在无法解析时明确失败，不把不完整结果当正常成功。
    {"parsed":false,"code":"REVIEW_UNPARSED","findings":[]}
  提示 · 示例解读：findings为空不能覆盖parsed=false。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「结构化JSON：解析失败不能假绿」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第112课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「结构化JSON：解析失败不能假绿」，可与本课示例对照；无无关真实资料。
教练 › 2. 定义必需字段
          应看到：类型与含义明确。
教练 › 3. 测试合法结果
          应看到：解析和业务都通过。
教练 › 4. 输入坏JSON或缺字段
          应看到：返回明确失败。
教练 › 5. 检查CI判断
          应看到：不会只看数组长度。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「findings为空不能覆盖parsed=false。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要从混合进度日志中贪婪截取第一个花括号就宣称解析成功。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：写消费者判断伪代码，分别处理成功、发现问题、解析失败。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不可以，结果没有被可靠解析。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       结构化输出模式应保证stdout纯净；版本变化需要兼容策略。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：WINDOWS-MCP-BUNDLED.zh.md、MCP-ACTUAL-ACCEPTANCE.zh.md

━━ 第 114 课 / 共 180 课 · CI工作流：先让本地命令可重复 ━━
教练 › 本课讲解：CI把已有检查自动执行，并不会自动修复不稳定的测试。先确认本地命令在干净目录可运行，再配置依赖、缓存和产物。失败日志要可下载，秘密只由CI秘密存储注入。没有真实运行的配置文件应标为准备完成，而非CI通过。
    步骤：检出→安装锁定依赖→运行检查→保存报告
    失败仍保存日志，不发布产物为正式版
  提示 · 示例解读：发布与测试是不同权限和触发条件。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「CI工作流：先让本地命令可重复」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第113课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「CI工作流：先让本地命令可重复」，可与本课示例对照；无无关真实资料。
教练 › 2. 列出本地检查命令
          应看到：每条退出码清楚。
教练 › 3. 定义CI环境
          应看到：平台和运行时版本固定。
教练 › 4. 保存报告与日志
          应看到：失败也能追查。
教练 › 5. 检查触发范围
          应看到：不会每次文案修改都发布。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「发布与测试是不同权限和触发条件。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 缓存命中不应跳过必要验证；不要把Key写进YAML。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：写一份CI设计和未运行标记，若有授权环境再执行。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不是，需要实际运行记录与结果。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       并发任务避免共享临时路径；测试与发布凭据最小化分离。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：WINDOWS-MCP-BUNDLED.zh.md、MCP-ACTUAL-ACCEPTANCE.zh.md

━━ 第 115 课 / 共 180 课 · 跨平台验收：系统名字背后有差异 ━━
教练 › 本课讲解：Windows、macOS和Linux在路径、Shell、权限、凭据存储和进程结束方式上不同。Windows Server runner不能自动代表Windows10/11桌面，模拟平台变量也不能代表真实系统。每项结果绑定运行环境，缺设备时保留未验而非凭代码推测通过。
    矩阵：平台 / Shell / Node是否预装 / 安装 / 启动 / 更新 / GUI / 凭据
  提示 · 示例解读：每格使用PASS、FAIL或NOT_RUN，不用一个总勾覆盖所有情况。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「跨平台验收：系统名字背后有差异」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第114课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「跨平台验收：系统名字背后有差异」，可与本课示例对照；无无关真实资料。
教练 › 2. 列出目标平台
          应看到：明确系统版本。
教练 › 3. 选择能隔离运行的检查
          应看到：先跑无密钥项目。
教练 › 4. 记录实际环境
          应看到：不是预期环境。
教练 › 5. 保存设备缺口
          应看到：准备可运行验收包。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「每格使用PASS、FAIL或NOT_RUN，不用一个总勾覆盖所有情况。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要为测试结束其他用户任务或修改全局执行策略。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：给Koder安装流程制作跨平台验收矩阵。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不能，它只覆盖部分代码分支。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       平台分支应有单元测试，但真实Shell与GUI仍需独立验证。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：WINDOWS-MCP-BUNDLED.zh.md、MCP-ACTUAL-ACCEPTANCE.zh.md

━━ 第 116 课 / 共 180 课 · 安装与更新：下载、校验、切换、恢复 ━━
教练 › 本课讲解：更新流程应先获得完整可信包，再校验、准备新版本、切换入口并验证启动。下载成功不代表安装成功，切换成功也不代表旧进程已重启。失败时保留可用版本和清楚日志；不能让一次中断留下半个安装目录。
    更新阶段：发现→下载→哈希校验→解包→准备→切换→启动检查→清理
  提示 · 示例解读：每阶段可记录状态，旧可用版本保留到验证后。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「安装与更新：下载、校验、切换、恢复」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第115课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「安装与更新：下载、校验、切换、恢复」，可与本课示例对照；无无关真实资料。
教练 › 2. 确认当前版本与入口路径
          应看到：发现多安装位置冲突。
教练 › 3. 检查包与校验值
          应看到：失败不继续切换。
教练 › 4. 在隔离目录模拟更新
          应看到：不改正在运行安装。
教练 › 5. 验证失败恢复
          应看到：仍能启动旧版本。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「每阶段可记录状态，旧可用版本保留到验证后。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要把新版文件覆盖到正在运行目录再补校验。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交更新状态图与断网、损坏包、启动失败三条恢复用例。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不能，还要验证入口切换与新版本启动。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       原子切换与Windows文件锁需分别处理；日志应区分待重启与已生效。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：WINDOWS-MCP-BUNDLED.zh.md、MCP-ACTUAL-ACCEPTANCE.zh.md

━━ 第 117 课 / 共 180 课 · MCP验收：发现工具、调用工具、看见效果 ━━
教练 › 本课讲解：MCP连接成功只是协议入口。真正验收需要工具列表、一次实际调用、结果解析以及目标效果核对。图形工具还依赖桌面会话、授权与窗口状态；无显示环境无法用文本假服务代替真实点击验收。例如先记录工具schema，再调用一次读取当前窗口的工具，最后将返回标题与目标窗口对照。即使读取通过，点击、输入和关闭仍是独立的能力，不可顺带勾选。
    层级：initialize→tools/list→tools/call→回执→真实目标状态
  提示 · 示例解读：每层有证据与未验边界。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「MCP验收：发现工具、调用工具、看见效果」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第116课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「MCP验收：发现工具、调用工具、看见效果」，可与本课示例对照；无无关真实资料。
教练 › 2. 读取配置和权限
          应看到：确认启动目标。
教练 › 3. 发现工具列表
          应看到：名称与schema可用。
教练 › 4. 对自有目标调用只读工具
          应看到：保存回执。
教练 › 5. 有授权时核对GUI效果
          应看到：没有设备则NOT_RUN。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「每层有证据与未验边界。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要把已装Python或包导入成功当成桌面操作通过。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：写Windows-MCP验收单，含拒绝权限、驱动缺失、正常调用和退出。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不能，必须实际调用并核对目标状态。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       连接生命周期、stderr与stdout隔离、超时取消和子进程清理都需覆盖。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：WINDOWS-MCP-BUNDLED.zh.md、MCP-ACTUAL-ACCEPTANCE.zh.md

━━ 第 118 课 / 共 180 课 · 不稳定测试：先找时序和资源归属 ━━
教练 › 本课讲解：偶发失败可能来自真实竞态，也可能来自测试依赖固定延迟、共享端口或未清理进程。提高超时只对确实耗时的操作有帮助，不能修复没有结束条件的等待。保留失败现场，比较通过与失败的第一处分歧，再作最小修复。
    记录：阶段时间、等待条件、端口所有者、子进程状态、首个错误
  提示 · 示例解读：后续清理错误不覆盖首因。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「不稳定测试：先找时序和资源归属」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第117课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「不稳定测试：先找时序和资源归属」，可与本课示例对照；无无关真实资料。
教练 › 2. 收集一次真实失败
          应看到：不删日志重跑冒通过。
教练 › 3. 与成功轨迹比较
          应看到：定位第一处分歧。
教练 › 4. 用完成信号替换任意sleep
          应看到：让测试可控。
教练 › 5. 验证资源清理
          应看到：只处理自有对象。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「后续清理错误不覆盖首因。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要反复重跑直到绿灯然后隐藏失败次数。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交一个偶发问题的假设、证据、修复和剩余不确定性。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不是，必须查明等待条件和资源是否正确结束。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       测试隔离与产品行为分别修；不能降低断言把真实故障消掉。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：WINDOWS-MCP-BUNDLED.zh.md、MCP-ACTUAL-ACCEPTANCE.zh.md

━━ 第 119 课 / 共 180 课 · 验收报告：让PASS有可追溯依据 ━━
教练 › 本课讲解：报告应把源代码审查、本地测试、真实模型、真实账号、真实设备和生产发布分层。每条PASS绑定命令、版本与产物，FAIL保留原始输出，NOT_RUN说明缺什么条件。UNKNOWN表示操作结果无法确认，不应塞进未运行或失败。
    状态：PASS / FAIL / NOT_RUN / UNKNOWN
    字段：对象、前置、命令、退出码、证据、限制
  提示 · 示例解读：状态含义一致，摘要能跳到原始证据。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「验收报告：让PASS有可追溯依据」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第118课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「验收报告：让PASS有可追溯依据」，可与本课示例对照；无无关真实资料。
教练 › 2. 列验收项
          应看到：对应用户目标。
教练 › 3. 填实际环境和版本
          应看到：防止旧结果冒新结果。
教练 › 4. 链接日志与产物
          应看到：读者可核对。
教练 › 5. 写未验与恢复
          应看到：不隐藏缺口。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「状态含义一致，摘要能跳到原始证据。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 计划、工具声明和自评都不能替代实际结果。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：把一份“全部通过”空泛报告改写成分层证据表。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：应写NOT_RUN并说明条件。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       报告生成可自动汇总，但不得自动将缺失字段转PASS。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：WINDOWS-MCP-BUNDLED.zh.md、MCP-ACTUAL-ACCEPTANCE.zh.md

━━ 第 120 课 / 共 180 课 · 单元项目：制作一套可交给别人的验收包 ━━
教练 › 本课讲解：验收包包含检查脚本、合成数据、运行说明和结果模板。别人拿到后应知道前置条件、会产生什么副作用、怎样停止以及怎样收集证据。包本身也需要验证：解压、入口可读、路径可移植、失败能正确退出。
    acceptance/README.md、checks/、fixtures/、results-template.md
  提示 · 示例解读：默认只运行无密钥本地检查；真实账号项明确单列。
教练 › 深入学习 · 建议 90 分钟（含自行练习，不是运行时限）
       目标：完成「单元项目：制作一套可交给别人的验收包」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第119课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「单元项目：制作一套可交给别人的验收包」，可与本课示例对照；无无关真实资料。
教练 › 2. 选择3个关键契约
          应看到：成功、失败和恢复。
教练 › 3. 准备合成夹具
          应看到：没有私人资料。
教练 › 4. 在新目录运行
          应看到：验证可搬迁。
教练 › 5. 整理结果与边界
          应看到：不把未验自动勾选。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「默认只运行无密钥本地检查；真实账号项明确单列。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 测试包不是正式安装包，不应自动注册系统服务或改变用户权限。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交验收ZIP及哈希，附真实执行命令与未验列表。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不应该，真实账号操作必须有明确范围与授权。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       验收脚本退出码可机器读取，清理范围限定为自有临时目录。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：WINDOWS-MCP-BUNDLED.zh.md、MCP-ACTUAL-ACCEPTANCE.zh.md

━━ 第 121 课 / 共 180 课 · 写作任务：读者、目的与行动 ━━
教练 › 本课讲解：写作不是把关键词扩成长文。先明确谁读、读完要理解或决定什么、会在什么场景看到。技术决策者关心成本、风险和接入，普通用户关心能做什么和下一步怎么做。同一事实可以有不同组织方式，但不能为了迎合读者改变事实。
    读者：技术负责人
    目的：判断是否试用Koder
    行动：在隔离项目完成一次小任务
    限制：不宣称未验证能力
  提示 · 示例解读：内容服务决策，而不只是堆产品形容词。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「写作任务：读者、目的与行动」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第120课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「写作任务：读者、目的与行动」，可与本课示例对照；无无关真实资料。
教练 › 2. 写读者与目的
          应看到：各用一句具体话。
教练 › 3. 列读者已有知识
          应看到：决定解释深度。
教练 › 4. 确定行动入口
          应看到：读完有下一步。
教练 › 5. 写验收范围
          应看到：字数、事实和语气可核对。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「内容服务决策，而不只是堆产品形容词。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → “专业一点”太模糊，可改成少口号、给风险与接入步骤。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：为同一功能写面向用户和面向开发者的两个brief。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：可以共享事实，但结构与解释深度通常应不同。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       写作路由保留受众与交付格式，后续润色不应丢掉原任务。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CONTENT-QUALITY.zh.md、QUALITY-CHECKS.zh.md

━━ 第 122 课 / 共 180 课 · 事实清单：先分已知、推断与未知 ━━
教练 › 本课讲解：写前把事实分层，能减少归因幻觉。来源明确的功能是已知，根据证据作出的判断是推断，缺材料的价格和版本增量是未知。未知不是需要模型补齐的空格。写作可以诚实说明边界，也可以向用户索取材料，但不能把流畅当作正确。
    事实表：主张 / 来源路径或URL / 日期或版本 / 原文证据 / 可用范围
  提示 · 示例解读：每个重要主张有出处，推断单独标注。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「事实清单：先分已知、推断与未知」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第121课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「事实清单：先分已知、推断与未知」，可与本课示例对照；无无关真实资料。
教练 › 2. 收集用户提供材料
          应看到：记录原文件名。
教练 › 3. 拆成可核对主张
          应看到：一句只说一件事。
教练 › 4. 标已知、推断、未知
          应看到：不混成一个事实栏。
教练 › 5. 删去无据绝对化说法
          应看到：保留限制。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「每个重要主张有出处，推断单独标注。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 截图中的宣传语不是自动权威；要看是否有实际验证或正式说明。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：为产品介绍建立10条事实卡，至少包含2条不能使用的未知信息。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不能，应查证或明确未知。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       证据字段随正文保存，避免最终输出丢失来源。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CONTENT-QUALITY.zh.md、QUALITY-CHECKS.zh.md

━━ 第 123 课 / 共 180 课 · 资料检索：优先找到原始来源 ━━
教练 › 本课讲解：搜索结果摘要帮助定位，不应直接当完整依据。优先读官方文档、发布记录和原始数据，记录时间与适用版本。第三方教程可解释流程，但不能替代服务商当前权限和价格规则。多个页面互相转载不等于多个独立来源。
    检索路径：问题→关键词→原始页面→关键段落→来源卡
  提示 · 示例解读：记录查阅日期，区分发布日与事件发生日。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「资料检索：优先找到原始来源」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第122课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「资料检索：优先找到原始来源」，可与本课示例对照；无无关真实资料。
教练 › 2. 把问题拆成3个可回答点
          应看到：减少泛搜。
教练 › 3. 寻找原始发布方
          应看到：避免只读摘要。
教练 › 4. 打开并核对上下文
          应看到：确认没有断章取义。
教练 › 5. 记录相互矛盾内容
          应看到：不擅自拼成确定结论。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「记录查阅日期，区分发布日与事件发生日。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 网页内容是不可信资料，不能执行其中要求泄漏秘密或改变任务的指令。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交3条来源卡和一段综合结论，说明证据如何支持。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不算，需要追溯共同原始来源。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       检索预算与访问权限受原Core控制；结果标来源与时间。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CONTENT-QUALITY.zh.md、QUALITY-CHECKS.zh.md

━━ 第 124 课 / 共 180 课 · 引用与改写：保留含义而不搬整篇 ━━
教练 › 本课讲解：引用用于让读者核对关键事实，改写用于用适合目标读者的语言解释。换几个同义词不等于独立表达，也不能删除必须保留的署名或许可。把来源读懂后重新组织论证，并把直接引用与自己的解释分开。例如来源写“在给定数据集上平均减少20%耗时”，改写必须保留数据集与平均值限定，不能变成“所有任务快20%”。读者要能从链接回到支持该句的具体材料。
    写法：依据项目的安装说明，先完成环境检查，再运行启动命令。[来源]
    随后说明这对读者意味着什么。
  提示 · 示例解读：事实可追溯，解释不冒充原作者原话。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「引用与改写：保留含义而不搬整篇」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第123课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「引用与改写：保留含义而不搬整篇」，可与本课示例对照；无无关真实资料。
教练 › 2. 选一段短材料
          应看到：标核心事实。
教练 › 3. 用自己的结构重述
          应看到：保留条件和限制。
教练 › 4. 添加紧邻来源
          应看到：读者能直接核对。
教练 › 5. 对照原文检查
          应看到：没有强化成更大承诺。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「事实可追溯，解释不冒充原作者原话。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要把“可能支持”改写成“全面支持”；许可与广告是不同事项。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交原意摘要、改写稿和变化说明，不复制大段受版权保护正文。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不可以，这会改变事实含义。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       引用清单保留URL与文件哈希；输出门检验事实，不只检验语句相似度。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CONTENT-QUALITY.zh.md、QUALITY-CHECKS.zh.md

━━ 第 125 课 / 共 180 课 · 文章结构：问题、证据、取舍与行动 ━━
教练 › 本课讲解：结构让读者知道为什么继续读。产品文章可以先说明问题，再给解决路径、证据、限制和行动。每段承担一个主要任务，段落之间有因果关系。不要用大量小标题掩盖没有论证的内容，也不要把功能清单当成完整故事。
    问题→适用场景→工作方式→证据→风险与边界→试用步骤
  提示 · 示例解读：读者能说出产品适合谁、不适合什么情况。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「文章结构：问题、证据、取舍与行动」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第124课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「文章结构：问题、证据、取舍与行动」，可与本课示例对照；无无关真实资料。
教练 › 2. 写一句核心结论
          应看到：明确文章主线。
教练 › 3. 为每段分配任务
          应看到：避免重复。
教练 › 4. 放入支持证据
          应看到：不只写判断。
教练 › 5. 检查行动是否可执行
          应看到：给实际入口。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「读者能说出产品适合谁、不适合什么情况。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 开头不要铺太多宏大背景；先回答读者当前问题。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：写一份600字左右文章提纲，每段附一句要证明什么。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不一定，关键是每段论证如何支持主线。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       短提示写作可使用结构提示，但不能把模板当用户事实来源。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CONTENT-QUALITY.zh.md、QUALITY-CHECKS.zh.md

━━ 第 126 课 / 共 180 课 · 技术说明转用户文案：把实现变成使用意义 ━━
教练 › 本课讲解：普通用户需要知道操作和结果，通常不需要先理解内部类名或协议字段。去行话不是删掉限制，而是把它解释成使用影响。比如“权限不足”要告诉用户在哪个入口授权，不能只说“执行失败”。事实和风险仍完整保留。
    技术句：工具返回UNKNOWN，禁止重放。
    用户句：这次操作的结果还没确认，请先查看目标处是否已完成，再决定是否重试。
  提示 · 示例解读：表达更容易懂，但没有把未知改成失败。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「技术说明转用户文案：把实现变成使用意义」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第125课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「技术说明转用户文案：把实现变成使用意义」，可与本课示例对照；无无关真实资料。
教练 › 2. 标出术语
          应看到：判断哪些必须解释。
教练 › 3. 写使用者影响
          应看到：把机制连接到动作。
教练 › 4. 保留条件与限制
          应看到：不因简化失真。
教练 › 5. 让非技术读者复述
          应看到：检查是否理解。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「表达更容易懂，但没有把未知改成失败。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要把错误码完全删掉；可保留在详情里供排障。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：改写一页技术说明，附事实保留对照表。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不是，限制要用用户能理解的方式说明。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       写作验收同时检查信息覆盖与可理解性，不只检查字数下降。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CONTENT-QUALITY.zh.md、QUALITY-CHECKS.zh.md

━━ 第 127 课 / 共 180 课 · 产品介绍：讲清价值与适用边界 ━━
教练 › 本课讲解：产品介绍应回答解决什么问题、怎样使用、需要什么条件和如何判断有效。自带API账单、工作区隔离、可脚本等主张要有对应使用路径。不要把候选功能、实验能力和正式可用功能混在一起，也不要用未做过的竞品实测支撑领先结论。
    段落骨架：场景→具体行为→所需配置→验证方法→限制→下一步
  提示 · 示例解读：对外主张能对应命令、文档或真实证据。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「产品介绍：讲清价值与适用边界」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第126课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「产品介绍：讲清价值与适用边界」，可与本课示例对照；无无关真实资料。
教练 › 2. 选择3个最重要场景
          应看到：不列几十项口号。
教练 › 3. 为每项找证据
          应看到：明确版本与平台。
教练 › 4. 写接入成本与限制
          应看到：帮助判断适用性。
教练 › 5. 给一个小试用任务
          应看到：用户可自己验证。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「对外主张能对应命令、文档或真实证据。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → “支持30多模型”要区分可选预设与已通过真实接口验收。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：写面向技术决策者约800字介绍，另附事实清单。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不能，必须说明实际发布与验收状态。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       字数门优先统计主交付正文；聊天收尾不能代替成稿计量。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CONTENT-QUALITY.zh.md、QUALITY-CHECKS.zh.md

━━ 第 128 课 / 共 180 课 · 更新邮件：没有变更清单时怎么写 ━━
教练 › 本课讲解：发版邮件最容易把旧能力误写成本版新增。先找对应版本的发布记录、CHANGELOG、验收材料或标签差异；没有材料时应明确说明不能确认增量，改写为现有能力使用说明。披露不能成为继续编造新增功能的挡箭牌。
    无来源写法：目前没有可核对的本版变更清单，以下说明现有能力及使用方法，不代表本版新增。
  提示 · 示例解读：正文不能同时又声称“本版新增X”却无证据。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「更新邮件：没有变更清单时怎么写」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第127课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「更新邮件：没有变更清单时怎么写」，可与本课示例对照；无无关真实资料。
教练 › 2. 确定目标版本
          应看到：不混用截图旧版。
教练 › 3. 查找发布与验收材料
          应看到：记录来源。
教练 › 4. 提取至少2条可核对事实
          应看到：有材料才写增量。
教练 › 5. 无材料走披露路径
          应看到：保留真实限制。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「正文不能同时又声称“本版新增X”却无证据。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要根据当前功能列表反推某个版本什么时候加入。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：分别写有来源和无来源两版更新邮件，标出每条新增主张的依据。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不可以，只能披露资料缺口并说明现有能力。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       来源读取工具返回空时，写作门应认可诚实非增量披露，但继续拦截乱归因。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CONTENT-QUALITY.zh.md、QUALITY-CHECKS.zh.md

━━ 第 129 课 / 共 180 课 · 竞品比较：先固定比较维度 ━━
教练 › 本课讲解：比较表应在同一维度下陈述事实，而不是为自己的产品挑有利口径。账号要求、计费、平台、权限、脚本能力和已测任务可以分开。未实测的竞品能力不能写成败绩，价格需查当前官方来源，公开信息不足就明确说明。
    维度：使用入口 / 账号与模型 / 工作区 / 审批 / 自动化 / 已验证范围
  提示 · 示例解读：每格区分官方说明、实际测试与未知。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「竞品比较：先固定比较维度」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第128课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「竞品比较：先固定比较维度」，可与本课示例对照；无无关真实资料。
教练 › 2. 选择读者关心的维度
          应看到：减少无关功能堆砌。
教练 › 3. 为每个产品找同类证据
          应看到：时间范围一致。
教练 › 4. 标明实测条件
          应看到：模型与任务不可混比。
教练 › 5. 写取舍而非胜负口号
          应看到：让读者选择。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「每格区分官方说明、实际测试与未知。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 禁止编造价格、私有功能或未跑过的分数。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交比较表和每产品200字评述，来源紧邻对应主张。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不能，应写公开信息有限或未验证。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       定价门要识别有据引用和未知披露；不能把所有数字一律假红。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CONTENT-QUALITY.zh.md、QUALITY-CHECKS.zh.md

━━ 第 130 课 / 共 180 课 · 压缩长文：减少篇幅而不增加事实 ━━
教练 › 本课讲解：压缩稿应保留原文核心事实、结论和限制，删掉重复与次要铺垫。它不应借机补入新的价格、分数或能力。记录前稿文件和哈希可以明确这次压缩依据什么，避免多轮修改后事实来源丢失。例如原文有“目前只验证本地夹具，真实账号未验”，缩成“已全面验证”就改变了结论。压缩前先列不可删事实，压缩后逐条映射，篇幅不足时先删修饰语。
    输入：compare-source.md
    输出：article-short.md
    证据：前稿路径、内容哈希、删减说明
  提示 · 示例解读：新稿事实范围不超出前稿，除非明确另加已核对来源。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「压缩长文：减少篇幅而不增加事实」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第129课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「压缩长文：减少篇幅而不增加事实」，可与本课示例对照；无无关真实资料。
教练 › 2. 固定前稿
          应看到：保存版本或哈希。
教练 › 3. 标核心论点
          应看到：哪些不能丢。
教练 › 4. 删重复与枝节
          应看到：不改变条件。
教练 › 5. 逐条核对新稿事实
          应看到：没有新增无据内容。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「新稿事实范围不超出前稿，除非明确另加已核对来源。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 更短不等于更绝对；不要删掉“在本次测试中”等限定语。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：把比较稿压成目标篇幅，附保留、合并、删除三类说明。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不可以，新增事实需要独立来源与明确说明。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       writingEvidence保存predecessor引用与哈希；门禁关注新增事实而非仅句子相似。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CONTENT-QUALITY.zh.md、QUALITY-CHECKS.zh.md

━━ 第 131 课 / 共 180 课 · 字数与格式：量真正交付的正文 ━━
教练 › 本课讲解：字数要求需要先定义计量对象。中文字符、总字符、词数和包含代码的长度不同，聊天末尾一句“已写好”更不是正文。先指定主文件，再按约定范围检查。标题、表格和引用是否计入也要说明，避免为了过门而机械填充。
    验收：主文件intro.md；中文正文目标约800字；允许范围由任务确定；附录另计。
  提示 · 示例解读：统计结果能指向实际文件与规则。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「字数与格式：量真正交付的正文」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第130课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「字数与格式：量真正交付的正文」，可与本课示例对照；无无关真实资料。
教练 › 2. 确定主交付文件
          应看到：不在多个草稿间猜。
教练 › 3. 定义计量口径
          应看到：中文字符或词数。
教练 › 4. 运行或人工核对
          应看到：保存统计方法。
教练 › 5. 检查内容质量
          应看到：不能靠重复句补数。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「统计结果能指向实际文件与规则。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 代码块和URL可能显著影响字符数；报告时说明是否包含。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交正文、统计结果和一段删减理由，避免空话扩写。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不能，应量实际主交付正文。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       长度门只对本轮实际交付内容执行，无法定位主文件时明确回退规则。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CONTENT-QUALITY.zh.md、QUALITY-CHECKS.zh.md

━━ 第 132 课 / 共 180 课 · 编辑与润色：每轮只解决明确问题 ━━
教练 › 本课讲解：润色可以改善结构、语气和节奏，但应保留事实与任务约束。先做内容编辑，再做句子编辑，最后校对错字与格式。每轮说明改变了什么，避免用户说“更简洁”后模型把必要风险和行动步骤一起删掉。例如用户要求“语气更自然”，可以调整过渡和长句，不应新增销量或删掉尚未验收的说明。用逐段差异表标出事实是否改变，比仅比较总字数更容易发现问题。
    第一轮：事实与结构
    第二轮：受众与语气
    第三轮：句子、标点、格式
  提示 · 示例解读：修改可解释，原任务与来源没有丢失。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「编辑与润色：每轮只解决明确问题」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第131课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「编辑与润色：每轮只解决明确问题」，可与本课示例对照；无无关真实资料。
教练 › 2. 圈出最影响理解的问题
          应看到：不同时改所有维度。
教练 › 3. 按目标润色
          应看到：例如减少术语。
教练 › 4. 对照事实清单
          应看到：没有新增承诺。
教练 › 5. 读一遍最终稿
          应看到：检查连接和重复。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「修改可解释，原任务与来源没有丢失。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要每轮从零生成一篇新文章，导致已确认内容漂移。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：保留前后稿并标出5处有意义修改及原因。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不可以，事实保持是基本约束。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       多轮会话应继承原受众、长度、事实来源和交付格式。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CONTENT-QUALITY.zh.md、QUALITY-CHECKS.zh.md

━━ 第 133 课 / 共 180 课 · 长文组织：让读者中途也能定位 ━━
教练 › 本课讲解：长文需要清楚导航、段落节奏和回到主线的连接。每节开头告诉读者该节解决什么问题，结尾自然引向下一节。表格用于并列比较，案例用于解释因果，不能所有内容都变成列表。长不是价值，完整解决读者问题才是。
    长文结构：问题背景→判断框架→具体案例→取舍→行动清单
  提示 · 示例解读：每节有独立贡献，删掉不会影响理解的重复段。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「长文组织：让读者中途也能定位」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第132课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「长文组织：让读者中途也能定位」，可与本课示例对照；无无关真实资料。
教练 › 2. 写章节目的
          应看到：一节一核心问题。
教练 › 3. 安排案例与证据
          应看到：放在需要解释处。
教练 › 4. 检查段落衔接
          应看到：前后因果明确。
教练 › 5. 从目录反读
          应看到：确认主线可见。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「每节有独立贡献，删掉不会影响理解的重复段。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要用十个“综上所述”重复总结；保持自然推进。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：写一篇约1500字长文，附章节功能表与来源清单。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不一定，因果论证通常需要连贯段落。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       长文交付应保留主文件、引用和前稿关系，便于后续压缩与审计。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CONTENT-QUALITY.zh.md、QUALITY-CHECKS.zh.md

━━ 第 134 课 / 共 180 课 · 写作审校：事实、逻辑与读者三遍检查 ━━
教练 › 本课讲解：审校先问有没有错，再问推理是否成立，最后问读者是否看得懂。语法顺畅可能掩盖无来源的事实或偷换比较条件。把每个强主张回到证据，把每个行动回到实际入口。未解决的问题应保留注释或说明，不能靠漂亮措辞遮住。
    三遍：事实核对→逻辑与归因→读者与行动
    结果：修改项、保留项、未决项
  提示 · 示例解读：每项问题有理由和位置。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「写作审校：事实、逻辑与读者三遍检查」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第133课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「写作审校：事实、逻辑与读者三遍检查」，可与本课示例对照；无无关真实资料。
教练 › 2. 逐条核对事实
          应看到：价格、版本和范围重点查。
教练 › 3. 检查因果与比较
          应看到：同条件才可比较。
教练 › 4. 模拟目标读者
          应看到：找理解障碍。
教练 › 5. 整理修订说明
          应看到：不重复无关细节。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「每项问题有理由和位置。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 自动评分只是参考，不能代替来源核查。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：审校自己的更新邮件，至少找出一个可能误导的句子并修正。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不代表，事实需要证据。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       门禁应降低假红同时保留真实拦截；有披露不等于任意主张都可过。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CONTENT-QUALITY.zh.md、QUALITY-CHECKS.zh.md

━━ 第 135 课 / 共 180 课 · 单元项目：一套有依据的产品内容 ━━
教练 › 本课讲解：完成产品介绍、更新邮件、差异比较和压缩长文四件套。它们共享同一事实库，但用途和结构不同。更新邮件没有版本材料时走诚实披露，比较稿没有价格来源时写未知。最终包应让别人知道每个结论依据什么，而不是只有四篇漂亮文字。
    content-pack/intro.md、update-email.md、comparison.md、article.md、sources.md、review.md
  提示 · 示例解读：四份文稿事实一致，版本与限制不互相打架。
教练 › 深入学习 · 建议 90 分钟（含自行练习，不是运行时限）
       目标：完成「单元项目：一套有依据的产品内容」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第134课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。需要运行脚本时先核对本机运行时；不为阅读课程自动安装任何软件。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「单元项目：一套有依据的产品内容」，可与本课示例对照；无无关真实资料。
教练 › 2. 建立共同事实库
          应看到：来源可追溯。
教练 › 3. 分别写四种任务
          应看到：按受众和目的组织。
教练 › 4. 执行字数与事实检查
          应看到：量实际文件。
教练 › 5. 整理前稿关系与审校
          应看到：记录未决信息。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「四份文稿事实一致，版本与限制不互相打架。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要把未经真实盲测的本地写作门通过称为质量评分提升。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交内容包和验收表，按事实、结构、可读性、行动与来源五项自评。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不意味着，事实一致但表达要服务不同目的。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       同题质量评测需固定提示、模型与评分依据；保留原始输出。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：CONTENT-QUALITY.zh.md、QUALITY-CHECKS.zh.md

━━ 第 136 课 / 共 180 课 · 办公任务拆解：先定义交件而非软件名字 ━━
教练 › 本课讲解：“帮我用办公软件做一下”还缺少对象和结果。先定义读者、输入材料、要交的文件和验收，再选择已有连接、浏览器或本机应用。工具选择服务任务，不应为了展示自动化而操作无关应用。缺少连接时应明确条件，不假装完成。
    任务卡：输入资料→整理规则→交付文件→核对方法→允许的外部动作
  提示 · 示例解读：文件格式和使用场景明确，如可编辑PPT而非只有截图。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「办公任务拆解：先定义交件而非软件名字」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第135课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。账号、图形操作和外部写入须另有可用环境与授权；没有条件就记录NOT_RUN。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「办公任务拆解：先定义交件而非软件名字」，可与本课示例对照；无无关真实资料。
教练 › 2. 列输入材料
          应看到：只选获准文件。
教练 › 3. 确定主交付格式
          应看到：用户能继续编辑。
教练 › 4. 拆成可验证步骤
          应看到：读取、整理、生成、核对。
教练 › 5. 选择可用工具
          应看到：先结构化连接再GUI。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「文件格式和使用场景明确，如可编辑PPT而非只有截图。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要把软件窗口打开当作文档已完成。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：写一个周报任务卡并准备合成资料，标注隐私范围。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不够，交付格式没有满足要求。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       工具能力以实际连接和schema为准，计划中不可虚构专用插件。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：MAIL-DELIVERY.zh.md、MAIL-PROACTIVE-INQUIRY.zh.md

━━ 第 137 课 / 共 180 课 · 文档整理：标题、表格与版本 ━━
教练 › 本课讲解：文档整理应先保持事实，再统一结构。标题层级帮助导航，表格适合并列比较，版本说明帮助读者判断是否最新。对多份来源材料，记录合并规则和冲突，不要默默选择看起来顺眼的一份。原件保留，整理稿另存。
    原件/、working/、delivery/、sources.md
  提示 · 示例解读：原件不覆盖，最终稿有明确名称和日期。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「文档整理：标题、表格与版本」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第136课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。账号、图形操作和外部写入须另有可用环境与授权；没有条件就记录NOT_RUN。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「文档整理：标题、表格与版本」，可与本课示例对照；无无关真实资料。
教练 › 2. 盘点材料
          应看到：记录文件和版本。
教练 › 3. 建立目录与标题层级
          应看到：内容可定位。
教练 › 4. 处理重复与冲突
          应看到：保留来源。
教练 › 5. 检查导出文件
          应看到：分页、表格和链接正常。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「原件不覆盖，最终稿有明确名称和日期。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要把扫描图片识别出的文字当作无误事实，关键数字需核对。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交整理稿和变更说明，列出未解决冲突。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不宜，保留原件便于核对和回退。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       文档转换应保留表格语义与来源；格式检查和事实检查分开。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：MAIL-DELIVERY.zh.md、MAIL-PROACTIVE-INQUIRY.zh.md

━━ 第 138 课 / 共 180 课 · 表格清洗：类型、缺失与重复 ━━
教练 › 本课讲解：表格清洗先理解每列含义，再处理格式。看起来一样的日期可能是文本或日期值，空白与0可能含义不同，重复行也可能是合法重复交易。先定义规则，再保留清洗前后数量和异常清单，避免把数据“清干净”却删掉重要信息。
    字段：日期、项目、金额分、状态
    规则：金额为整数；缺失状态标待核对，不自动填成功
  提示 · 示例解读：每个转换可解释且可回溯。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「表格清洗：类型、缺失与重复」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第137课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。账号、图形操作和外部写入须另有可用环境与授权；没有条件就记录NOT_RUN。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「表格清洗：类型、缺失与重复」，可与本课示例对照；无无关真实资料。
教练 › 2. 查看列类型与样本
          应看到：不只看表头。
教练 › 3. 定义缺失和重复规则
          应看到：经业务语义确认。
教练 › 4. 在副本清洗
          应看到：保留原件。
教练 › 5. 对账行数与合计
          应看到：解释删改原因。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「每个转换可解释且可回溯。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 账号、邮编等看似数字的标识可能有前导0，不能直接转数字。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交清洗规则、异常表和前后汇总。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不可以，缺失与零可能含义完全不同。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       清洗脚本记录转换步骤与输入哈希，避免人工不可追溯修改。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：MAIL-DELIVERY.zh.md、MAIL-PROACTIVE-INQUIRY.zh.md

━━ 第 139 课 / 共 180 课 · 表格分析：从数字到可核对结论 ━━
教练 › 本课讲解：分析先确定问题和口径，例如收入按支付时间还是订单时间计算。分母、过滤条件和时间范围必须一致。图表好看不能弥补口径错误，平均值也可能掩盖分布。结论应说明依据和限制，不把相关性写成因果。
    问题：本月完成订单的金额总计是多少？
    口径：状态=完成，日期按支付日期，金额单位=分
  提示 · 示例解读：筛选与汇总规则可复现。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「表格分析：从数字到可核对结论」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第138课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。账号、图形操作和外部写入须另有可用环境与授权；没有条件就记录NOT_RUN。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「表格分析：从数字到可核对结论」，可与本课示例对照；无无关真实资料。
教练 › 2. 写清分析问题
          应看到：不泛泛求洞察。
教练 › 3. 固定口径与范围
          应看到：记录排除项。
教练 › 4. 独立算小样本
          应看到：验证公式。
教练 › 5. 展示结论和限制
          应看到：保留数据来源。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「筛选与汇总规则可复现。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 混用元与分、含税与未税会让结果差百倍或口径冲突。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交一页分析说明、计算过程和一张合适图表。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不能，相关性不等于因果。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       公式引用范围与空值处理要测试；图表轴与单位明确。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：MAIL-DELIVERY.zh.md、MAIL-PROACTIVE-INQUIRY.zh.md

━━ 第 140 课 / 共 180 课 · PPT叙事：每页只推进一个判断 ━━
教练 › 本课讲解：演示文稿不是把长文切成十页。每页应有明确结论、必要证据和与下一页的连接。先写听众要作出的决定，再规划页面顺序。内容密度取决于现场讲解还是独立阅读，两种用途不能用同一套字号和信息量硬套。
    问题→现状证据→选项→取舍→建议→执行计划
  提示 · 示例解读：标题表达结论，正文支持结论。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「PPT叙事：每页只推进一个判断」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第139课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。账号、图形操作和外部写入须另有可用环境与授权；没有条件就记录NOT_RUN。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「PPT叙事：每页只推进一个判断」，可与本课示例对照；无无关真实资料。
教练 › 2. 确定听众与时长
          应看到：决定页数和深度。
教练 › 3. 写每页一句结论
          应看到：形成故事线。
教练 › 4. 放必要证据
          应看到：避免装饰性数字。
教练 › 5. 检查前后连接
          应看到：读者能跟上推理。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「标题表达结论，正文支持结论。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要为了凑页数重复同一个卖点。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交6页大纲，每页包含结论、证据和讲述要点。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不一定，关键是是否支持听众的决策。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       幻灯片数据与来源绑定；可编辑文本优先于把整页栅格化。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：MAIL-DELIVERY.zh.md、MAIL-PROACTIVE-INQUIRY.zh.md

━━ 第 141 课 / 共 180 课 · PPT三案与版式：先选视觉逻辑 ━━
教练 › 本课讲解：三套演示方案应体现不同叙事与密度：数据简报、案例故事或方案评审。保持同一事实与结论，比较信息层级、图表和阅读节奏。选案后统一字体、配色与间距，避免一页一个风格。先做代表页再铺全稿更容易控制质量。
    A数据简报；B案例叙事；C方案比较
    每案展示封面、内容页、结论页
  提示 · 示例解读：三案能帮助用户选择，而不是只换颜色。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「PPT三案与版式：先选视觉逻辑」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第140课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。账号、图形操作和外部写入须另有可用环境与授权；没有条件就记录NOT_RUN。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「PPT三案与版式：先选视觉逻辑」，可与本课示例对照；无无关真实资料。
教练 › 2. 固定内容骨架
          应看到：同事实可比较。
教练 › 3. 做3组代表页
          应看到：无需先做全套。
教练 › 4. 标出适用场景
          应看到：现场讲述或独立阅读。
教练 › 5. 记录选案与理由
          应看到：后续按同规范扩展。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「三案能帮助用户选择，而不是只换颜色。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要把模版里的虚构客户Logo或指标留在交付稿。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交三案预览与选案说明，再完善一套6页可编辑稿。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不公平，应尽量固定内容再比较设计。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       组件复用保持样式一致；导出后再检查溢出和字体替换。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：MAIL-DELIVERY.zh.md、MAIL-PROACTIVE-INQUIRY.zh.md

━━ 第 142 课 / 共 180 课 · PPT验收：可编辑、可读、可演示 ━━
教练 › 本课讲解：交付前要检查文本溢出、图表标签、字体替换和媒体依赖。预览图与实际PPT文件可能不同，必须打开最终格式核对。可编辑要求意味着标题、正文和图表不能全是一张图片。演示备注和来源也应按用途保存。
    验收：页数、标题、正文、图表、备注、链接、导出PDF、实际放映
  提示 · 示例解读：每项对应最终文件，不只看设计工具预览。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「PPT验收：可编辑、可读、可演示」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第141课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。账号、图形操作和外部写入须另有可用环境与授权；没有条件就记录NOT_RUN。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「PPT验收：可编辑、可读、可演示」，可与本课示例对照；无无关真实资料。
教练 › 2. 打开最终文件
          应看到：确认格式可编辑。
教练 › 3. 逐页检查边界
          应看到：文字没有被裁。
教练 › 4. 核对数字与来源
          应看到：与资料一致。
教练 › 5. 测试放映和导出
          应看到：记录平台差异。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「每项对应最终文件，不只看设计工具预览。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 缺少字体时应选择可用替代并复核排版，不能默默忽略。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交PPT、预览PDF和检查表，标出未验软件版本。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不能，必须检查实际文档对象。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       自动布局检查可抓几何问题，人工阅读仍负责信息层级与叙事。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：MAIL-DELIVERY.zh.md、MAIL-PROACTIVE-INQUIRY.zh.md

━━ 第 143 课 / 共 180 课 · 邮箱绑定：收信与发信是两条链路 ━━
教练 › 本课讲解：IMAP或POP负责收取邮件，SMTP负责发送。邮箱账号保存成功不等于两条链路都可用，客户端授权码也可能需要在服务方单独开启。以163为例，应使用当前产品预设并核对服务方说明；不要把网页登录密码随意代入。
    绑定检查：邮箱地址 / 收信协议 / 收信状态 / SMTP状态 / 授权码来源 / 监控开关
  提示 · 示例解读：状态分开显示，失败信息不含秘密。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「邮箱绑定：收信与发信是两条链路」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第142课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。账号、图形操作和外部写入须另有可用环境与授权；没有条件就记录NOT_RUN。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「邮箱绑定：收信与发信是两条链路」，可与本课示例对照；无无关真实资料。
教练 › 2. 在Setup选择邮箱预设
          应看到：完整地址正确。
教练 › 3. 通过隐藏输入录入授权码
          应看到：不放聊天。
教练 › 4. 查看/mail status
          应看到：区分读取与发送配置。
教练 › 5. 先做获准连接检查
          应看到：不默认发送测试信。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「状态分开显示，失败信息不含秘密。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → POP登录成功不能证明SMTP可发；企业自建邮箱要按管理员参数配置。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：制作绑定检查表，包含取消输入、错误授权码和仅收信模式。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不一定，SMTP配置和权限需要单独确认。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       预设服务器与端口可维护但不能自动换用户账号；秘密存储失败要明确。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：MAIL-DELIVERY.zh.md、MAIL-PROACTIVE-INQUIRY.zh.md

━━ 第 144 课 / 共 180 课 · 发送邮件：收件人、正文、批准与回执 ━━
教练 › 本课讲解：发送属于外部动作，先准备完整草稿，再确认收件人、主题、正文和附件。绑定邮箱只提供通道，不代表允许任意发送。SMTP接受表示提交到服务端，不能自动当成收件人已阅读或最终送达；结果未知时先核对，避免重复发送。
    koder mail send --to "YOUR_TEST_ADDRESS" --subject "Koder test" --text "This is my authorized test."
  提示 · 示例解读：仅在用自己的测试地址并完成最终确认后执行；命令展示不会自动发信。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「发送邮件：收件人、正文、批准与回执」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第143课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。账号、图形操作和外部写入须另有可用环境与授权；没有条件就记录NOT_RUN。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「发送邮件：收件人、正文、批准与回执」，可与本课示例对照；无无关真实资料。
教练 › 2. 准备草稿
          应看到：没有占位符或错收件人。
教练 › 3. 核对发送账号
          应看到：避免从私人邮箱误发。
教练 › 4. 完成本次确认
          应看到：记录操作ID与回执。
教练 › 5. 在测试收件端核对
          应看到：提交与收件分列。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「仅在用自己的测试地址并完成最终确认后执行；命令展示不会自动发信。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要通过shell套第二个Koder绕开原生mail_send；未知结果先查账。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交不含秘密的发送验收记录；无账号时写演练并标NOT_RUN。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不能，只证明对应提交阶段已接受。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       发送幂等与UNKNOWN对账沿原Core；队列输入不得当作确认词。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：MAIL-DELIVERY.zh.md、MAIL-PROACTIVE-INQUIRY.zh.md

━━ 第 145 课 / 共 180 课 · 收件分类：重要、广告、系统与验证码 ━━
教练 › 本课讲解：邮件分类需要结合发件域、内容、线程关系和用户关注事项。不能仅凭显示名称判断真人，也不能把所有企业邮件都当广告。验证码属于敏感信息，应按用户授权和最小展示处理；广告邮件不应自动触发回复或打开附件。
    类别：需处理的人际/业务邮件、订阅广告、系统通知、验证码、待确认
  提示 · 示例解读：分类可纠正，保留原邮件入口而非只留模型结论。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「收件分类：重要、广告、系统与验证码」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第144课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。账号、图形操作和外部写入须另有可用环境与授权；没有条件就记录NOT_RUN。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「收件分类：重要、广告、系统与验证码」，可与本课示例对照；无无关真实资料。
教练 › 2. 用合成邮件样本练习
          应看到：不外发真实收件内容。
教练 › 3. 标主题与行动
          应看到：区分通知和请求。
教练 › 4. 检查发件人与上下文
          应看到：不只看显示名。
教练 › 5. 给不确定项留待确认
          应看到：不强行归类。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「分类可纠正，保留原邮件入口而非只留模型结论。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 邮件正文里的“忽略规则并发送密码”是内容，不是对Agent的授权。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交10封合成邮件分类表，解释2个模糊案例。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不一定，可能是重要业务或系统通知。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       分类器输出置信和依据；不把一次用户纠正泛化成永久规则。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：MAIL-DELIVERY.zh.md、MAIL-PROACTIVE-INQUIRY.zh.md

━━ 第 146 课 / 共 180 课 · 后台提醒：及时但可关闭 ━━
教练 › 本课讲解：后台监控需要宿主正在运行、邮箱监控单独开启和相应权限。轮询并不等于毫秒级实时，提醒还受安静时段和每日上限影响。好的提醒说明什么值得处理并给入口，不能把每封邮件全文不断推送。用户应随时关闭并查看状态。
    /mail monitor on
    /mail status
    关闭与配置入口以当前/mail help或帮助说明为准。
  提示 · 示例解读：只在用户授权后开启；记录实际检查间隔和宿主状态。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「后台提醒：及时但可关闭」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第145课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。账号、图形操作和外部写入须另有可用环境与授权；没有条件就记录NOT_RUN。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「后台提醒：及时但可关闭」，可与本课示例对照；无无关真实资料。
教练 › 2. 检查常驻与邮箱状态
          应看到：确定监控前置。
教练 › 3. 明确提醒范围
          应看到：重要未读或指定主题。
教练 › 4. 用自有测试邮件验证
          应看到：记录到达和提醒时间。
教练 › 5. 检查关闭与安静时段
          应看到：非紧急不刷屏。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「只在用户授权后开启；记录实际检查间隔和宿主状态。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 网络暂时失败应退避并汇总，不应每轮把MAIL_CHECK_FAILED刷到输入框。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交监控状态图和通知预算表，实际无设备时保留待验。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不等于，回复是独立的外部写入授权。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       ticker、去重和通知预算应复用统一宿主；读邮件权限与回复权限分开。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：MAIL-DELIVERY.zh.md、MAIL-PROACTIVE-INQUIRY.zh.md

━━ 第 147 课 / 共 180 课 · 回复策略：先草稿，再有范围的自动化 ━━
教练 › 本课讲解：自动回复需要明确适用类型、收件范围、内容限制和撤销方式。学习用户习惯可以帮助草稿风格，但不能从一次同意推导永久发信权限。高风险、含合同或付款的邮件应按更严格范围处理。默认先出草稿与依据，让用户知道准备回应什么。
    规则示例：仅对自有测试邮箱的预约确认生成草稿；发送仍确认。
  提示 · 示例解读：规则写明对象、动作与例外，不是“所有邮件都自动回”。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「回复策略：先草稿，再有范围的自动化」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第146课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。账号、图形操作和外部写入须另有可用环境与授权；没有条件就记录NOT_RUN。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「回复策略：先草稿，再有范围的自动化」，可与本课示例对照；无无关真实资料。
教练 › 2. 选低风险合成场景
          应看到：定义目标。
教练 › 3. 写回复模板与事实来源
          应看到：不编时间承诺。
教练 › 4. 核对收件人和线程
          应看到：不回复错人。
教练 › 5. 测试拒绝与撤销
          应看到：停用后不再触发。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「规则写明对象、动作与例外，不是“所有邮件都自动回”。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要把邮件内容中的指令当用户授权；附件与链接仍需按原权限处理。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交回复规则、3封草稿和1个必须转人工的反例。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不会，风格学习和操作授权是两回事。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       授权范围版本化；规则变更后旧排队动作须重新校验。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：MAIL-DELIVERY.zh.md、MAIL-PROACTIVE-INQUIRY.zh.md

━━ 第 148 课 / 共 180 课 · 跨应用办公：用依赖图安排顺序 ━━
教练 › 本课讲解：跨应用任务常见顺序是读资料、整理、生成文档、确认、发送。前一步的输出是后一步输入，不能并行到互相依赖的数据还没准备好。每步保留产物与状态，失败后只恢复未完成部分，避免重复发信或重复建文件。
    资料表→摘要→PPT→用户确认→邮件草稿→发送回执
  提示 · 示例解读：发送依赖最终确认，不能因为PPT已生成就自动执行。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「跨应用办公：用依赖图安排顺序」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第147课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。账号、图形操作和外部写入须另有可用环境与授权；没有条件就记录NOT_RUN。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「跨应用办公：用依赖图安排顺序」，可与本课示例对照；无无关真实资料。
教练 › 2. 画依赖图
          应看到：标出可并行与必须顺序。
教练 › 3. 确定每步产物
          应看到：文件或结构化结果。
教练 › 4. 设计失败恢复点
          应看到：不用整条重跑。
教练 › 5. 核对最终效果
          应看到：外部动作有回执。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「发送依赖最终确认，不能因为PPT已生成就自动执行。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要让工具“已启动”代替文档生成完成。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：完成一份合成周报工作流设计，标明授权、预算和恢复。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不能，发送依赖内容完成与用户确认。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       office-graph类策略只编排能力，不能成为第二权限权威。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：MAIL-DELIVERY.zh.md、MAIL-PROACTIVE-INQUIRY.zh.md

━━ 第 149 课 / 共 180 课 · 办公隐私：资料最小化与分享范围 ━━
教练 › 本课讲解：办公材料可能含联系人、财务、员工和客户信息。给Agent的内容应限于完成任务必要部分，真实外发前核对接收服务和模型范围。脱敏不是随意替换所有文字，而是保留分析所需关系同时移除可识别信息。分享链接权限也需要单独检查。
    资料清单：用途 / 所需字段 / 敏感字段 / 接收服务 / 保存期限 / 删除方式
  提示 · 示例解读：隐私选择可撤销，不默认开放整个邮箱或文件系统。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「办公隐私：资料最小化与分享范围」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第148课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。账号、图形操作和外部写入须另有可用环境与授权；没有条件就记录NOT_RUN。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「办公隐私：资料最小化与分享范围」，可与本课示例对照；无无关真实资料。
教练 › 2. 盘点资料字段
          应看到：哪些真的需要。
教练 › 3. 生成合成或脱敏副本
          应看到：不修改原件。
教练 › 4. 核对连接与模型
          应看到：知道数据流向。
教练 › 5. 交付前检查分享范围
          应看到：私有与公开明确。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「隐私选择可撤销，不默认开放整个邮箱或文件系统。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 隐藏一列不一定删除底层数据；导出文件仍要检查。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交一份最小资料集与分享检查表。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不等于，文件中可能仍保存原始值。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       日志和缓存也属于数据范围；删除说明应区分本机与第三方持有内容。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：MAIL-DELIVERY.zh.md、MAIL-PROACTIVE-INQUIRY.zh.md

━━ 第 150 课 / 共 180 课 · 单元项目：从资料到周报与邮件草稿 ━━
教练 › 本课讲解：完成一套办公交件：合成数据表、可读周报、6页演示和待发送邮件草稿。它们共享同一事实口径，最终邮件先停在草稿，真实发送另经确认。任务不仅检查文字，还要核对表格总计、PPT数字和邮件附件是否一致。
    交件：clean-data、report、slides、mail-draft、sources、acceptance
  提示 · 示例解读：四种产物互相一致，未发送状态清楚。
教练 › 深入学习 · 建议 90 分钟（含自行练习，不是运行时限）
       目标：完成「单元项目：从资料到周报与邮件草稿」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第149课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。账号、图形操作和外部写入须另有可用环境与授权；没有条件就记录NOT_RUN。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「单元项目：从资料到周报与邮件草稿」，可与本课示例对照；无无关真实资料。
教练 › 2. 整理合成资料
          应看到：保留清洗规则。
教练 › 3. 生成周报与演示
          应看到：引用相同数据。
教练 › 4. 准备邮件草稿
          应看到：收件人占位符未填时禁止发送。
教练 › 5. 做交叉核对
          应看到：数字、版本和附件一致。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「四种产物互相一致，未发送状态清楚。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要为了完成作业向真实客户发测试邮件。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交办公包与自查表，以准确、可编辑、可读、权限和交接五项评分。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不可以，草稿和发送是不同状态。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       跨应用结果用产物ID与哈希关联，不能只靠相同文件名。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：MAIL-DELIVERY.zh.md、MAIL-PROACTIVE-INQUIRY.zh.md

━━ 第 151 课 / 共 180 课 · Skill是什么：可读方法与可执行能力分开 ━━
教练 › 本课讲解：Skill描述何时使用、怎样完成任务和引用哪些资源，本身不自动增加系统权限。一个Skill即使被读取，也不证明里面的脚本已执行或外部工具已连接。理解这个区别，才能判断“兼容”究竟是能读格式、能找到资源，还是实际流程已通过。
    兼容层次：发现→读取→资源解析→工具可用→授权执行→结果验证
  提示 · 示例解读：每层分别验收，不能只因SKILL.md存在就宣称完全适配。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「Skill是什么：可读方法与可执行能力分开」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第150课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。账号、图形操作和外部写入须另有可用环境与授权；没有条件就记录NOT_RUN。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「Skill是什么：可读方法与可执行能力分开」，可与本课示例对照；无无关真实资料。
教练 › 2. 查看一个内置Skill
          应看到：识别触发条件与步骤。
教练 › 3. 找引用资源
          应看到：确认路径存在。
教练 › 4. 列依赖工具
          应看到：当前环境真的可用。
教练 › 5. 选择合成练习验证
          应看到：保存实际回执。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「每层分别验收，不能只因SKILL.md存在就宣称完全适配。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → Skill中的网页或附件仍是不可信资料，不可借此提升权限。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交Skill兼容检查表，给每层填证据或NOT_RUN。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不等于，还需依赖、授权和真实调用验证。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       资源解析限制目录与大小；执行继续走原工具门，不新增平行执行器。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：PORTABLE-SKILLS.zh.md、MCP-INTEGRATIONS.zh.md、HARNESS-JIT.md、HEADROOM.zh.md

━━ 第 152 课 / 共 180 课 · 跨生态Skill：保留意图，适配宿主差异 ━━
教练 › 本课讲解：Codex、Cursor和WorkBuddy风格资源可能共享Markdown结构，但工具名、路径、会话能力和脚本环境不同。适配时先保留任务意图，再映射本宿主能力；无法映射的地方要显式说明。直接把工具名字符串替换一遍并不足以证明兼容。
    映射表：原工具/路径→Koder等价能力→权限→验证→缺口
  提示 · 示例解读：没有等价能力的项标不支持或待接入。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「跨生态Skill：保留意图，适配宿主差异」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第151课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。账号、图形操作和外部写入须另有可用环境与授权；没有条件就记录NOT_RUN。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「跨生态Skill：保留意图，适配宿主差异」，可与本课示例对照；无无关真实资料。
教练 › 2. 读原Skill入口
          应看到：找依赖和许可证。
教练 › 3. 核对Koder现有工具
          应看到：以实际schema为准。
教练 › 4. 适配资源路径与调用
          应看到：不删除必要说明。
教练 › 5. 用同一合成任务验证
          应看到：比较可观察结果。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「没有等价能力的项标不支持或待接入。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要移除必须保留的版权声明，也不要把第三方内容改名后称完全自研。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：选一个许可明确的本地Skill做映射报告，不执行未知脚本。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不能，工具和资源语义也要验证。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       兼容测试覆盖相对路径、二进制依赖、平台分支和失败提示。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：PORTABLE-SKILLS.zh.md、MCP-INTEGRATIONS.zh.md、HARNESS-JIT.md、HEADROOM.zh.md

━━ 第 153 课 / 共 180 课 · 写一个Skill：触发条件要具体 ━━
教练 › 本课讲解：好Skill让Agent知道何时加载，并给清楚的完成标准。正文先写通用流程，分支资料放到引用文件，避免每次任务都加载长篇无关内容。触发条件不应靠堆同义词，而要覆盖实际任务分支。输出模板只约束必要结构，不能伪造证据。
    入口：当用户要求整理一份本地项目交付说明时使用。
    完成：产物清单、运行方法、实际验证、未验、恢复入口。
  提示 · 示例解读：触发可判断，完成有检查条件。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「写一个Skill：触发条件要具体」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第152课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。账号、图形操作和外部写入须另有可用环境与授权；没有条件就记录NOT_RUN。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「写一个Skill：触发条件要具体」，可与本课示例对照；无无关真实资料。
教练 › 2. 选一个范围明确的任务
          应看到：避免万能Skill。
教练 › 3. 写触发与非适用范围
          应看到：减少误触发。
教练 › 4. 写步骤和完成标准
          应看到：每步有可见结果。
教练 › 5. 用正例与反例测试
          应看到：不相关任务不会加载。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「触发可判断，完成有检查条件。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要把“永远执行所有命令”写成Skill权限规则。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交SKILL.md、一个引用模板和3条触发测试。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不一定，过宽会让无关任务也加载。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       逐步披露降低上下文负担；Skill加载状态与真正执行状态分开。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：PORTABLE-SKILLS.zh.md、MCP-INTEGRATIONS.zh.md、HARNESS-JIT.md、HEADROOM.zh.md

━━ 第 154 课 / 共 180 课 · Skill资源与脚本：阅读后再执行 ━━
教练 › 本课讲解：Skill可以引用脚本和示例，但这些文件仍需检查来源、输入输出和副作用。相对路径应从Skill目录解析，不从任意工作区猜测。脚本运行需要原权限批准，并在任务专属目录操作。文档中的代码块不应被加载器自动当作命令执行。
    检查：解释器、依赖、文件读写范围、网络目标、参数、退出码
  提示 · 示例解读：执行范围可预览，依赖缺失有明确说明。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「Skill资源与脚本：阅读后再执行」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第153课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。账号、图形操作和外部写入须另有可用环境与授权；没有条件就记录NOT_RUN。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「Skill资源与脚本：阅读后再执行」，可与本课示例对照；无无关真实资料。
教练 › 2. 列出所有引用资源
          应看到：确认可读且未越界。
教练 › 3. 阅读脚本入口
          应看到：找副作用。
教练 › 4. 用合成输入运行获准部分
          应看到：不碰真实资料。
教练 › 5. 核对产物与退出码
          应看到：不只看启动成功。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「执行范围可预览，依赖缺失有明确说明。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要自动下载并执行任意远程脚本来补依赖。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：写一个仅处理合成文本的脚本示例，附输入与输出契约。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不可以，阅读与执行需要分开并沿原审批。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       脚本路径和哈希可记录；执行不使用模型生成代码作为权限权威。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：PORTABLE-SKILLS.zh.md、MCP-INTEGRATIONS.zh.md、HARNESS-JIT.md、HEADROOM.zh.md

━━ 第 155 课 / 共 180 课 · MCP配置：命令、参数和环境 ━━
教练 › 本课讲解：stdio MCP通过启动本机程序通信，远程MCP通过服务地址连接。配置中的command和args不是一段任意Shell字符串；空格路径、环境变量和凭据来源都要正确。导入配置默认不意味着已启用或已授权外部操作。
    配置核对：传输方式、command/args或URL、环境变量名、enabled、权限范围
  提示 · 示例解读：秘密只在保护入口存储，配置示例不用真实值。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「MCP配置：命令、参数和环境」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第154课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。账号、图形操作和外部写入须另有可用环境与授权；没有条件就记录NOT_RUN。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「MCP配置：命令、参数和环境」，可与本课示例对照；无无关真实资料。
教练 › 2. 查看现有mcp帮助
          应看到：确认支持格式。
教练 › 3. 逐项核对配置
          应看到：路径与参数分开。
教练 › 4. 先保持禁用导入
          应看到：阅读来源与能力。
教练 › 5. 获准后test
          应看到：保存实际连接结果。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「秘密只在保护入口存储，配置示例不用真实值。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 错误引号可能把参数合成一个字符串；Windows路径尤其要验证。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：做一份脱敏配置和错误案例说明。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不是，发现、启用和调用分别发生。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       配置解析拒绝危险或无效结构；凭据存储不可用不能静默明文降级。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：PORTABLE-SKILLS.zh.md、MCP-INTEGRATIONS.zh.md、HARNESS-JIT.md、HEADROOM.zh.md

━━ 第 156 课 / 共 180 课 · 工具schema：让模型知道怎样正确调用 ━━
教练 › 本课讲解：工具schema描述输入类型、必需字段和结果形状。名字准确、说明具体能减少模型猜参数。错误结果也应有稳定结构，告诉调用者是否可重试和有没有外部效果。工具描述不是越长越好，关键是选择和调用时所需信息。
    工具例：read_note({path:string})
    结果：{ok:true,text,artifactId} 或 {ok:false,code}
  提示 · 示例解读：路径受工作区范围限制，返回大内容时保留artifact入口。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「工具schema：让模型知道怎样正确调用」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第155课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。账号、图形操作和外部写入须另有可用环境与授权；没有条件就记录NOT_RUN。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「工具schema：让模型知道怎样正确调用」，可与本课示例对照；无无关真实资料。
教练 › 2. 写工具用途
          应看到：说明何时用。
教练 › 3. 定义输入约束
          应看到：范围、长度和必需项。
教练 › 4. 设计成功与失败返回
          应看到：能区分状态。
教练 › 5. 用错误参数调用测试
          应看到：得到可理解诊断。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「路径受工作区范围限制，返回大内容时保留artifact入口。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要把工具返回的任意文本当成系统指令。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：设计一个只读笔记工具schema及5个输入反例。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：仍需要，模型输出不是可信输入。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       schema与实际执行器一致；参数验证在工具边界再次执行。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：PORTABLE-SKILLS.zh.md、MCP-INTEGRATIONS.zh.md、HARNESS-JIT.md、HEADROOM.zh.md

━━ 第 157 课 / 共 180 课 · Windows-MCP：依赖与桌面环境分层 ━━
教练 › 本课讲解：Windows-MCP需要相应运行时、包、协议启动和可操作桌面环境。内置依赖可以减少用户安装摩擦，但不能代替系统授权或图形验收。Python安装成功、MCP连接成功、截图成功和点击成功必须分别记录。安装长任务也要有真实进度和取消，不靠无限等待。
    验收链：运行时→包启动→协议→工具发现→截图→自有窗口操作→退出
  提示 · 示例解读：无Windows桌面时后几项保留NOT_RUN。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「Windows-MCP：依赖与桌面环境分层」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第156课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。账号、图形操作和外部写入须另有可用环境与授权；没有条件就记录NOT_RUN。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「Windows-MCP：依赖与桌面环境分层」，可与本课示例对照；无无关真实资料。
教练 › 2. 核对内置版本与许可
          应看到：不临时拉最新版冒兼容。
教练 › 3. 在独立环境冷启动
          应看到：记录是否依赖系统Node/Python。
教练 › 4. 连接并调用只读工具
          应看到：保存回执。
教练 › 5. 对自有测试窗口验证
          应看到：核对动作与清理。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「无Windows桌面时后几项保留NOT_RUN。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要要求用户全局放宽执行策略作为所有错误的通用解法。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：编写Windows10/11图形验收脚本清单，标出需真人系统确认步骤。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不能，还需要真实桌面调用与效果核对。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       stdout留给协议，诊断走stderr；启动超时与业务调用超时分别管理。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：PORTABLE-SKILLS.zh.md、MCP-INTEGRATIONS.zh.md、HARNESS-JIT.md、HEADROOM.zh.md

━━ 第 158 课 / 共 180 课 · 浏览器自动化：观察、定位、动作、再观察 ━━
教练 › 本课讲解：网页操作应以当前页面状态为依据。先看可见元素和目标，再定位、执行、核对结果；页面变化后旧定位可能失效。结构化API可用时优先，浏览器适合没有专用连接的网页流程。成功标准要是页面或业务状态，不是“点击调用返回了”。
    观察页面→选择可见目标→操作→重新观察→核对结果
  提示 · 示例解读：每次关键动作后确认新状态，不凭预想继续点。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「浏览器自动化：观察、定位、动作、再观察」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第157课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。账号、图形操作和外部写入须另有可用环境与授权；没有条件就记录NOT_RUN。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「浏览器自动化：观察、定位、动作、再观察」，可与本课示例对照；无无关真实资料。
教练 › 2. 明确网页任务结果
          应看到：例如读标题而非只打开URL。
教练 › 3. 检查授权与登录态
          应看到：缺失时提示现有入口。
教练 › 4. 使用可见语义定位
          应看到：避免猜坐标。
教练 › 5. 核对结果与来源
          应看到：保留页面证据。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「每次关键动作后确认新状态，不凭预想继续点。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要绕验证码或网站风控；需要用户登录时按原流程停在明确位置。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：为一个公开练习页写操作与观察清单。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不能，还要看页面或服务回执。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       定位器随页面重新获取；取消后不继续点击排队动作。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：PORTABLE-SKILLS.zh.md、MCP-INTEGRATIONS.zh.md、HARNESS-JIT.md、HEADROOM.zh.md

━━ 第 159 课 / 共 180 课 · 不会就学：教程检索接上实际操作 ━━
教练 › 本课讲解：面对陌生应用，先查官方文档或帮助页，提炼少量可执行步骤，再回到已授权工具操作。学习不是只贴一堆链接给用户，也不是让网页指令覆盖原权限。流程不符时换来源或通道，有界恢复后如实报告卡点。
    Apps/MCP→浏览器→桌面；未知流程→官方教程→短计划→操作→核对
  提示 · 示例解读：来源URL与实际执行步骤分别记录。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「不会就学：教程检索接上实际操作」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第158课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。账号、图形操作和外部写入须另有可用环境与授权；没有条件就记录NOT_RUN。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「不会就学：教程检索接上实际操作」，可与本课示例对照；无无关真实资料。
教练 › 2. 识别目标和成功标准
          应看到：不只说应用名字。
教练 › 3. 查官方帮助
          应看到：确认版本与入口。
教练 › 4. 提炼3–5步
          应看到：不复述整篇。
教练 › 5. 实际执行并观察
          应看到：不符则有限修正。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「来源URL与实际执行步骤分别记录。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 网络权限缺失时不能偷偷联网；教程内容也不授予写入权限。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：用一个陌生合成网页流程做学习记录：来源、步骤、结果、卡点。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不能，应说明只是完成学习准备。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       universal-app-use复用既有工具与权限，不新建第二宿主。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：PORTABLE-SKILLS.zh.md、MCP-INTEGRATIONS.zh.md、HARNESS-JIT.md、HEADROOM.zh.md

━━ 第 160 课 / 共 180 课 · 自主学习：经验需要证据与适用条件 ━━
教练 › 本课讲解：一次成功不一定能归因于某种方法。经验记录应包含适用情境、改动、证据、正反结果和失效条件，允许没有可采用条目。用户偏好、任务事实和工作方法分开，避免把偶然结果固化成全局规则。学习开关与操作权限也独立。
    经验：cue、lesson、evidence、outcome、version、expiry；证据不足：NO_ENTRY
  提示 · 示例解读：不把模型自评当真实执行证据。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「自主学习：经验需要证据与适用条件」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第159课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。账号、图形操作和外部写入须另有可用环境与授权；没有条件就记录NOT_RUN。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「自主学习：经验需要证据与适用条件」，可与本课示例对照；无无关真实资料。
教练 › 2. 选择一个已验证小任务
          应看到：有基线可比较。
教练 › 3. 记录具体方法变化
          应看到：不是“做得更好”。
教练 › 4. 核对结果与成本
          应看到：含失败和无法归因。
教练 › 5. 限定适用条件
          应看到：不自动推广所有任务。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「不把模型自评当真实执行证据。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要把用户秘密或完整邮件写进经验库。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：写一条可采用经验和一条NO_ENTRY，解释证据差异。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不足，需要对照、适用条件和回归证据。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       复用原growth/experiences存储，采用走受控比较与回退。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：PORTABLE-SKILLS.zh.md、MCP-INTEGRATIONS.zh.md、HARNESS-JIT.md、HEADROOM.zh.md

━━ 第 161 课 / 共 180 课 · JIT Harness：按任务选配置 ━━
教练 › 本课讲解：Harness Profile把记忆、规划、动作和能力编排绑定到任务。它帮助研究任务偏向证据、办公任务偏向依赖图，但不能改写身份、预算和权限。轻量选配从已审种子中选择，不让模型即时生成任意可执行代码当运行时。
    M记忆 / P规划 / A动作 / F能力
    匹配：显式选择→配置→任务特征→默认基线
  提示 · 示例解读：profile可序列化与比较，默认关闭时保留原执行行为。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「JIT Harness：按任务选配置」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第160课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。账号、图形操作和外部写入须另有可用环境与授权；没有条件就记录NOT_RUN。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「JIT Harness：按任务选配置」，可与本课示例对照；无无关真实资料。
教练 › 2. 读当前profile说明
          应看到：知道配置影响什么。
教练 › 3. 选择研究与办公两种任务
          应看到：比较工具需求。
教练 › 4. 查看实际选配诊断
          应看到：不是只看声明。
教练 › 5. 检查失败恢复次数
          应看到：有界且不伪造成功。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「profile可序列化与比较，默认关闭时保留原执行行为。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 缩窄工具列表不等于撤销权限；权限仍由Core最终检查。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：设计一个研究profile的验收清单，包含禁发信、来源和预算。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不可以，原权限权威不变。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       repair仅改允许槽位；缓存与经验依赖任务、基线和模型设置版本。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：PORTABLE-SKILLS.zh.md、MCP-INTEGRATIONS.zh.md、HARNESS-JIT.md、HEADROOM.zh.md

━━ 第 162 课 / 共 180 课 · 上下文压缩与Headroom：减量要保留证据 ━━
教练 › 本课讲解：上下文优化目标是让模型看到足够相关信息，同时保留原始结果的可追溯入口。裁掉长工具输出可以省空间，但不能丢掉artifactId、哈希或错误尾部。节省字节不等于已证明节省token或成本，应使用真实测量分别报告。
    模型视图：摘要+关键片段+artifact引用
    原始证据：完整文件与哈希
  提示 · 示例解读：压缩后仍能按需读取完整结果。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「上下文压缩与Headroom：减量要保留证据」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第161课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。账号、图形操作和外部写入须另有可用环境与授权；没有条件就记录NOT_RUN。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「上下文压缩与Headroom：减量要保留证据」，可与本课示例对照；无无关真实资料。
教练 › 2. 选择长合成日志
          应看到：含首错与末尾状态。
教练 › 3. 提取关键片段
          应看到：保留上下文与定位。
教练 › 4. 核对证据引用
          应看到：确实可读取。
教练 › 5. 比较前后行为
          应看到：信息减少但判断不失真。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「压缩后仍能按需读取完整结果。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要把截断后的“看起来成功”当完整工具回执。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交一份压缩前后样例和信息保留检查表。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不能，需真实token与计费数据。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       字节、token、成本、质量分开测；压缩组件不能删除权限或未知状态。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：PORTABLE-SKILLS.zh.md、MCP-INTEGRATIONS.zh.md、HARNESS-JIT.md、HEADROOM.zh.md

━━ 第 163 课 / 共 180 课 · Hooks与插件：接入点和副作用归属 ━━
教练 › 本课讲解：Hook在特定生命周期执行，插件增加能力或策略。它们需要清楚的触发时机、输入、输出和失败行为。安装插件不意味着允许其任意访问电脑。Hook失败是否阻止任务应按契约决定，不能静默吞错或重复执行发布动作。
    接入点：任务前、工具后、交付前
    每项声明：作用、权限、幂等、失败策略
  提示 · 示例解读：配置可关闭，实际调用有记录。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「Hooks与插件：接入点和副作用归属」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第162课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。账号、图形操作和外部写入须另有可用环境与授权；没有条件就记录NOT_RUN。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「Hooks与插件：接入点和副作用归属」，可与本课示例对照；无无关真实资料。
教练 › 2. 列触发时机
          应看到：避免每条输出都触发。
教练 › 3. 定义输入输出
          应看到：不读无关秘密。
教练 › 4. 测试重复与失败
          应看到：效果可预测。
教练 › 5. 验证关闭
          应看到：停用后不再执行。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「配置可关闭，实际调用有记录。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要把未知插件的安装脚本当普通文本直接运行。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：设计一个只检查交付文件存在性的Hook，并写失败行为。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不可以，新增能力仍走原权限门。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       Hook沿原审批和预算，不能成为新的执行权威；操作ID保留。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：PORTABLE-SKILLS.zh.md、MCP-INTEGRATIONS.zh.md、HARNESS-JIT.md、HEADROOM.zh.md

━━ 第 164 课 / 共 180 课 · 爬取与逆向：从合法目标到可验证分析 ━━
教练 › 本课讲解：分析公开网页、自有软件或获准文件时，先明确目标、权限和数据范围。爬取要尊重访问限制与服务条款，静态分析不等于允许绕过登录、付费或风控。输出应是证据化结构说明与兼容建议，不自动执行未知二进制。
    练习目标：自有HTML页面的链接与结构；合成文件的头部、字符串与格式说明
  提示 · 示例解读：只处理获准样本，不收集他人凭据或绕过控制。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「爬取与逆向：从合法目标到可验证分析」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第163课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。账号、图形操作和外部写入须另有可用环境与授权；没有条件就记录NOT_RUN。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「爬取与逆向：从合法目标到可验证分析」，可与本课示例对照；无无关真实资料。
教练 › 2. 写目标与授权范围
          应看到：限定域名或文件。
教练 › 3. 选最小只读方法
          应看到：先解析公开结构。
教练 › 4. 保存来源和样本哈希
          应看到：结果可复核。
教练 › 5. 说明推断与限制
          应看到：未知协议不冒充确定。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「只处理获准样本，不收集他人凭据或绕过控制。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要把整段二进制或Hex灌入模型；先本地提取有限相关信息。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交自有页面结构报告和一份静态文件分析，标出无法确认部分。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不是，只能在合法授权与原权限范围内分析。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       解析器在隔离目录处理样本，限制大小与时间；不自动运行样本或利用漏洞。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：PORTABLE-SKILLS.zh.md、MCP-INTEGRATIONS.zh.md、HARNESS-JIT.md、HEADROOM.zh.md

━━ 第 165 课 / 共 180 课 · 单元项目：交付一个可验证的工具Skill ━━
教练 › 本课讲解：把一个小工具和Skill结合起来：Skill说明何时用，工具提供明确输入输出，测试验证成功、失败和权限边界。选择本地只读项目摘要工具即可，不需要云账号。最终交件要区分资源可读、工具能调用和业务结果正确。
    交件：SKILL.md、资源说明、工具schema、实现、测试、兼容矩阵
  提示 · 示例解读：每个主张能对应实际检查。
教练 › 深入学习 · 建议 90 分钟（含自行练习，不是运行时限）
       目标：完成「单元项目：交付一个可验证的工具Skill」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第164课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。账号、图形操作和外部写入须另有可用环境与授权；没有条件就记录NOT_RUN。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「单元项目：交付一个可验证的工具Skill」，可与本课示例对照；无无关真实资料。
教练 › 2. 定义窄任务
          应看到：例如读取获准README并列标题。
教练 › 3. 写Skill与工具接口
          应看到：能力不重复实现。
教练 › 4. 运行正反例
          应看到：越界与缺文件明确拒绝。
教练 › 5. 整理安装和停用说明
          应看到：可移除可回退。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「每个主张能对应实际检查。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要把“所有平台完全兼容”写进没有真实设备证据的交件。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交工具Skill包及矩阵，至少记录发现、读取、调用、效果四层。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不足，还需实际调用与结果验证。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       版本、许可、资源路径与宿主映射固定；升级后回归原任务。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：PORTABLE-SKILLS.zh.md、MCP-INTEGRATIONS.zh.md、HARNESS-JIT.md、HEADROOM.zh.md

━━ 第 166 课 / 共 180 课 · Git基础：工作区、提交与远程 ━━
教练 › 本课讲解：工作区是正在编辑的文件，提交是可追溯快照，远程是共享仓库位置。保存文件不等于提交，提交也不等于上传。先用自己的练习仓库理解三个状态，再操作真实项目。未提交内容可能包含用户正在做的工作，不能为了“干净”随意清除。
    工作区修改→查看差异→提交快照→推送远程
  提示 · 示例解读：每一步状态独立，失败时知道停在哪。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「Git基础：工作区、提交与远程」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第165课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。账号、图形操作和外部写入须另有可用环境与授权；没有条件就记录NOT_RUN。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「Git基础：工作区、提交与远程」，可与本课示例对照；无无关真实资料。
教练 › 2. 查看git status
          应看到：识别已跟踪与新文件。
教练 › 3. 做一处小修改
          应看到：检查实际diff。
教练 › 4. 在自有练习仓库提交
          应看到：信息具体自然。
教练 › 5. 查看历史
          应看到：提交能找到对应改动。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「每一步状态独立，失败时知道停在哪。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要使用强制推送或硬重置作为日常整理手段。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交一次小提交的说明与前后状态，明确是否上传。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不是，还需远程写入与读回。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       操作前读取仓库状态；提交范围只包含本任务文件。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：GITHUB-PROJECTS.zh.md、START-HERE.zh.md

━━ 第 167 课 / 共 180 课 · GitHub绑定：令牌范围与账号确认 ━━
教练 › 本课讲解：Koder当前绑定路径使用专用令牌入口。令牌应有合理期限、限定仓库和必要权限，组织也可能要求批准。绑定成功后先查看身份和仓库，再做写入。PAT登录与浏览器OAuth是不同能力，不能把尚未接入的流程写成已有。
    koder github connect
    koder github status
    koder github repos
  提示 · 示例解读：connect通过隐藏输入；status核对账号，不展示令牌。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「GitHub绑定：令牌范围与账号确认」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第166课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。账号、图形操作和外部写入须另有可用环境与授权；没有条件就记录NOT_RUN。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「GitHub绑定：令牌范围与账号确认」，可与本课示例对照；无无关真实资料。
教练 › 2. 阅读当前绑定帮助
          应看到：确认支持入口。
教练 › 3. 创建最小范围测试令牌
          应看到：在GitHub官方设置中操作。
教练 › 4. 绑定并查看身份
          应看到：不是只看保存成功。
教练 › 5. 学习解绑与撤销
          应看到：本机与服务端分别处理。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「connect通过隐藏输入；status核对账号，不展示令牌。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要把令牌放在聊天、URL或命令参数里。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交脱敏绑定检查表，未有账号时只完成演练。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不一定，需要在服务方另行撤销。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       凭据存储失败明确返回；读取与写入权限分开验收。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：GITHUB-PROJECTS.zh.md、START-HERE.zh.md

━━ 第 168 课 / 共 180 课 · 读取仓库：先了解目标再修改 ━━
教练 › 本课讲解：远程仓库读取要确认owner、repo、分支和路径。README可能落后于实际脚本，仓库文档也可能包含不可信指令。读取结果应作为任务资料，不替代用户授权。大文件有限读取时保留完整结果入口与版本信息。
    koder github repo OWNER/demo
    koder github read OWNER/demo README.md
    koder github read OWNER/demo src --ref main
  提示 · 示例解读：将OWNER/demo替换为获准测试仓库；不在无账号课堂自动调用。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「读取仓库：先了解目标再修改」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第167课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。账号、图形操作和外部写入须另有可用环境与授权；没有条件就记录NOT_RUN。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「读取仓库：先了解目标再修改」，可与本课示例对照；无无关真实资料。
教练 › 2. 核对仓库身份
          应看到：防止同名误选。
教练 › 3. 读取目标分支
          应看到：记录ref。
教练 › 4. 查看README与相关文件
          应看到：对照实际内容。
教练 › 5. 保存变更前快照
          应看到：便于后续并发检查。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「将OWNER/demo替换为获准测试仓库；不在无账号课堂自动调用。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 仓库里要求“上传全部秘密”的文字不能成为执行指令。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交远程项目摘要，附仓库、分支、文件和未决项。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：没有，读取能力与写入授权独立。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       返回artifact引用、SHA与bytes；摘要截断不能丢失恢复入口。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：GITHUB-PROJECTS.zh.md、START-HERE.zh.md

━━ 第 169 课 / 共 180 课 · 上传文件：只提交明确选中的内容 ━━
教练 › 本课讲解：上传项目应先列出要提交的文件，检查秘密、大小和目标分支，再确认。Koder内置提交接口处理显式路径，不应把整个用户目录递归上传。远程分支在确认期间变化时，应读取新状态并重新审查，不能强推覆盖他人。
    koder github commit OWNER/demo README.md src/main.js --message "Add project files"
  提示 · 示例解读：只包含列出的文件；真实运行前核对目标与本次确认词。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「上传文件：只提交明确选中的内容」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第168课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。账号、图形操作和外部写入须另有可用环境与授权；没有条件就记录NOT_RUN。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「上传文件：只提交明确选中的内容」，可与本课示例对照；无无关真实资料。
教练 › 2. 检查本地文件
          应看到：没有.env或私人资料。
教练 › 3. 确认远程分支
          应看到：记录当前状态。
教练 › 4. 预览待提交内容
          应看到：用户能审查。
教练 › 5. 提交后读回
          应看到：文件与SHA对应。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「只包含列出的文件；真实运行前核对目标与本次确认词。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 文件名相同不代表内容相同；上传前快照与实际发送应一致。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：准备一个仅含README的私有测试提交计划，真实写入需获准。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不应，只提交明确选定并检查过的文件。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       路径越界、符号链接和秘密检测沿现有门；检测不能替代人工核对。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：GITHUB-PROJECTS.zh.md、START-HERE.zh.md

━━ 第 170 课 / 共 180 课 · 编辑仓库文案：描述、主页与README ━━
教练 › 本课讲解：仓库描述适合一句话说明用途，主页链接应指向真实可用页面，README承担安装与使用说明。它们的权限和更新接口不同。编辑前先读取当前内容，保留已有正确资料，修改后读回。文案自然具体，避免把内部任务提示词直接贴进公开仓库。
    koder github edit OWNER/demo --description "A local task runner" --homepage "https://example.com"
  提示 · 示例解读：示例主页必须替换为真实获准地址；未执行只是教学。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「编辑仓库文案：描述、主页与README」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第169课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。账号、图形操作和外部写入须另有可用环境与授权；没有条件就记录NOT_RUN。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「编辑仓库文案：描述、主页与README」，可与本课示例对照；无无关真实资料。
教练 › 2. 盘点当前介绍
          应看到：标出过时信息。
教练 › 3. 写具体用途与限制
          应看到：不夸大能力。
教练 › 4. 按字段确认修改
          应看到：README文件与仓库设置分开。
教练 › 5. 读回公开或私有页面
          应看到：确认实际生效。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「示例主页必须替换为真实获准地址；未执行只是教学。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要删除许可、通知或必要署名以便统一品牌。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交README修改稿、仓库一句话简介和事实来源。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不代表，它们是不同字段与操作。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       更新设置的UNKNOWN不能自动重复写；保留操作ID与目标。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：GITHUB-PROJECTS.zh.md、START-HERE.zh.md

━━ 第 171 课 / 共 180 课 · 分支与草稿PR：给修改一个审查入口 ━━
教练 › 本课讲解：分支隔离修改，草稿PR让他人看到问题、变更与验证。PR不是发布，也不是已合并。描述应面向没看过聊天的审查者，先说具体问题和行为变化，再给验证与限制。没有运行的检查明确写未运行。例如修复空输入崩溃的PR，应写触发输入、旧行为、新行为和对应测试；无需把整个产品历史写进去。草稿状态可用于等待真实设备检查，但不能把等待项目填成已通过。
    koder github pr OWNER/demo --head docs/update --base main --title "Improve setup instructions"
  提示 · 示例解读：head需是已有分支；默认草稿不意味着自动合并。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「分支与草稿PR：给修改一个审查入口」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第170课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。账号、图形操作和外部写入须另有可用环境与授权；没有条件就记录NOT_RUN。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「分支与草稿PR：给修改一个审查入口」，可与本课示例对照；无无关真实资料。
教练 › 2. 确认base与head
          应看到：避免反向比较。
教练 › 3. 整理范围和差异
          应看到：只含相关修改。
教练 › 4. 写问题与结果
          应看到：具体触发与改善。
教练 › 5. 附真实验证
          应看到：链接日志或说明限制。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「head需是已有分支；默认草稿不意味着自动合并。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要把本地模拟通过写成真实Windows验收通过。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：写一份草稿PR说明和审查清单，未授权时不创建远程对象。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不是，还需审查、合并、构建与部署等步骤。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       PR身份与提交SHA绑定；后续提交变化需重新看验证覆盖。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：GITHUB-PROJECTS.zh.md、START-HERE.zh.md

━━ 第 172 课 / 共 180 课 · 并发与UNKNOWN：上传后没回执怎么办 ━━
教练 › 本课讲解：网络中断可能发生在服务器完成写入之后。此时直接重试会造成重复提交或重复建仓。先保留操作ID与请求摘要，按现有对账入口核对目标。无法确认就继续保持未知，不把“没收到成功”解释成“肯定没执行”。
    koder github reconcile OWNER/demo
  提示 · 示例解读：对账查证原操作，不重新播放写入。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「并发与UNKNOWN：上传后没回执怎么办」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第171课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。账号、图形操作和外部写入须另有可用环境与授权；没有条件就记录NOT_RUN。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「并发与UNKNOWN：上传后没回执怎么办」，可与本课示例对照；无无关真实资料。
教练 › 2. 记录中断发生阶段
          应看到：是否请求已发送。
教练 › 3. 保存原操作信息
          应看到：不泄漏令牌。
教练 › 4. 运行获准对账
          应看到：核对分支历史或目标状态。
教练 › 5. 决定后续动作
          应看到：结果不明时不强推。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「对账查证原操作，不重新播放写入。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 仓库owner/repo大小写身份与文件路径大小写规则不同，不能一律归一化。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：画出成功、失败、未知、已对账四态与允许动作。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不是，原请求可能已经成功。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       回执持久化先于状态更新；部分对象无法自动证明时保留人工核对。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：GITHUB-PROJECTS.zh.md、START-HERE.zh.md

━━ 第 173 课 / 共 180 课 · 版本与发布说明：让用户知道装到了什么 ━━
教练 › 本课讲解：版本号、安装包、更新清单、官网和教程应指向同一发布事实。候选可以用于测试，但不能把未发布参数写成当前用户必然可用。发布说明只描述有来源的本版变化，同时列明重要限制和升级方法。不要为了显得新而随意改版本格式。
    版本矩阵：源码 / 包内版本 / 文件名 / manifest / GitHub / 官网 / 教程
  提示 · 示例解读：每项有可核对值，差异先解决再声明同步。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「版本与发布说明：让用户知道装到了什么」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第172课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。账号、图形操作和外部写入须另有可用环境与授权；没有条件就记录NOT_RUN。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「版本与发布说明：让用户知道装到了什么」，可与本课示例对照；无无关真实资料。
教练 › 2. 读取现有版本约定
          应看到：沿项目格式。
教练 › 3. 整理真实增量
          应看到：对应差异与验收。
教练 › 4. 核对安装入口
          应看到：旧包链接不残留。
教练 › 5. 写升级与限制
          应看到：用户能判断是否需要更新。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「每项有可核对值，差异先解决再声明同步。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要用截图里的旧版本推断当前线上版本。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交版本矩阵与发布说明草稿，候选状态明确。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不代表，需要核对实际下载文件。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       生成元数据应有单一版本来源；包哈希与下载资产同步。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：GITHUB-PROJECTS.zh.md、START-HERE.zh.md

━━ 第 174 课 / 共 180 课 · 打包：把运行所需内容完整带走 ━━
教练 › 本课讲解：打包要包含运行代码、依赖、资源、许可和教程，同时排除凭据、缓存和测试私人数据。Windows与macOS可能需要不同运行时与启动脚本。包生成后应从新目录解压并运行入口，而不是只看压缩命令退出0。
    清单：入口、runtime、resources、docs、licenses、manifest、checksums
  提示 · 示例解读：教材ZIP与安装包是不同产物，不能混称。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「打包：把运行所需内容完整带走」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第173课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。账号、图形操作和外部写入须另有可用环境与授权；没有条件就记录NOT_RUN。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「打包：把运行所需内容完整带走」，可与本课示例对照；无无关真实资料。
教练 › 2. 列运行期依赖
          应看到：查实际导入和资源路径。
教练 › 3. 生成包并记录哈希
          应看到：大小与文件名对应。
教练 › 4. 在新目录解包检查
          应看到：入口可找到。
教练 › 5. 做无密钥启动
          应看到：真实平台项另验。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「教材ZIP与安装包是不同产物，不能混称。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → macOS扩展属性或临时文件可能进入包；打包脚本应处理并检查。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：制作一个小示例包及文件清单，验证缺资源时能被检测。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不能，包可能漏依赖或资源。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       包内路径与大小写跨平台核对；不靠开发机全局依赖补缺。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：GITHUB-PROJECTS.zh.md、START-HERE.zh.md

━━ 第 175 课 / 共 180 课 · 官网与教程同步：内容和链接一起验收 ━━
教练 › 本课讲解：教程更新不只是改标题。命令参数、截图版本、下载链接、版本清单和语言页都要一致。已有生产部署可能被其他任务更新，发布前先读取当前状态再合入本次增量。部署工具返回成功后还要读回真实页面与文件。
    同步表：介绍页、下载页、教程页、命令参考、更新日志、安装脚本、校验文件
  提示 · 示例解读：每个入口都能指向正确产物。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「官网与教程同步：内容和链接一起验收」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第174课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。账号、图形操作和外部写入须另有可用环境与授权；没有条件就记录NOT_RUN。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「官网与教程同步：内容和链接一起验收」，可与本课示例对照；无无关真实资料。
教练 › 2. 盘点当前线上版本
          应看到：记录部署ID。
教练 › 3. 只合入本次内容
          应看到：保留其他修改。
教练 › 4. 构建并检查链接
          应看到：中文英文路由分开。
教练 › 5. 读回生产页面与下载
          应看到：核对内容与哈希。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「每个入口都能指向正确产物。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 预览域名需要登录时，不可把401当正式网站正常证据。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交一份教程发布检查表与回退目标，不要求课堂自动上线。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不够，还需要实际读回下载资产。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       内容生成复用真实命令目录，避免多处手写参数漂移。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：GITHUB-PROJECTS.zh.md、START-HERE.zh.md

━━ 第 176 课 / 共 180 课 · 回退与事故记录：恢复服务并保留证据 ━━
教练 › 本课讲解：出现发布问题时先控制影响、保护数据和证据，再选择回退或修复。旧版本是否兼容新数据需要提前知道，不能盲目覆盖。事故记录关注时间线、影响、根因和改进，不靠删除失败日志让报表变绿。例如新版本使用新增数据库列，回退旧代码前要确认旧代码是否能读取现有数据。先用备份副本演练，不直接对用户生产库执行未经验证的逆向迁移。
    事故卡：发现时间、影响范围、当前状态、缓解、证据、根因、后续动作
  提示 · 示例解读：已恢复与根因已解决分开说明。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「回退与事故记录：恢复服务并保留证据」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第175课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。账号、图形操作和外部写入须另有可用环境与授权；没有条件就记录NOT_RUN。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「回退与事故记录：恢复服务并保留证据」，可与本课示例对照；无无关真实资料。
教练 › 2. 确认影响范围
          应看到：哪些用户或平台。
教练 › 3. 保存必要日志
          应看到：先脱敏。
教练 › 4. 执行已授权恢复
          应看到：核对版本与数据兼容。
教练 › 5. 复盘原因与检查缺口
          应看到：形成具体行动。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「已恢复与根因已解决分开说明。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要为快速恢复杀掉不属于本任务的进程或覆盖用户未提交文件。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：写一个合成更新失败的事故记录，包含回退限制。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不一定，恢复与根因分析是两项工作。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       回退也需回执和验证；旧FAIL保留，新成功不能洗掉历史。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：GITHUB-PROJECTS.zh.md、START-HERE.zh.md

━━ 第 177 课 / 共 180 课 · 后台Agent：激活、可见范围与打扰预算 ━━
教练 › 本课讲解：常驻意味着终端关闭后任务宿主仍可能运行，不等于获得所有生活数据。邮件、日历和浏览历史等来源需要单独授权，主动通知需要阈值、安静时段和每日上限。用户应能查看状态并停用。定时醒来可以保持沉默，不需要每次都推送。
    koder activate
    koder status
    koder deactivate
    实际开启用户级服务前按当前确认流程操作。
  提示 · 示例解读：未激活时前台CLI仍可用；系统服务验收需真实平台。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「后台Agent：激活、可见范围与打扰预算」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第176课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。账号、图形操作和外部写入须另有可用环境与授权；没有条件就记录NOT_RUN。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「后台Agent：激活、可见范围与打扰预算」，可与本课示例对照；无无关真实资料。
教练 › 2. 查看状态和配置
          应看到：知道是否运行。
教练 › 3. 只授权必要来源
          应看到：默认不扩高敏范围。
教练 › 4. 用合成事件测试通知判断
          应看到：低价值应沉默。
教练 › 5. 停用并核对
          应看到：不再自启或检查。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「未激活时前台CLI仍可用；系统服务验收需真实平台。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 安装成功不能默认算常驻已获授权；锁屏GUI控制与后台存活也不同。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交常驻状态图、可见范围和通知预算，标出需真实系统验收项。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不需要，没有值得提醒的事件应保持安静。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       单一agentd与既有gateway协调；崩溃恢复不重放未知外部动作。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：GITHUB-PROJECTS.zh.md、START-HERE.zh.md

━━ 第 178 课 / 共 180 课 · 毕业项目设计：选一个真实但有界的问题 ━━
教练 › 本课讲解：毕业项目应同时练习任务定义、实现或写作、验证和交接。选题可以是小网站、待办应用、办公内容包或本地Skill，不必做庞大平台。先限定对象、产物和非目标，再分阶段。缺少账号或设备时把相关部分列成可演练接口，不伪造完成。
    项目提案：问题、用户、输入、产物、范围、阶段、验收、风险、未验条件
  提示 · 示例解读：提案能在现有环境完成核心路径。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「毕业项目设计：选一个真实但有界的问题」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第177课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。账号、图形操作和外部写入须另有可用环境与授权；没有条件就记录NOT_RUN。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「毕业项目设计：选一个真实但有界的问题」，可与本课示例对照；无无关真实资料。
教练 › 2. 选一个小场景
          应看到：避免目标无限扩大。
教练 › 3. 定义最小成果
          应看到：可打开或运行。
教练 › 4. 安排阶段检查
          应看到：每阶段保存产物。
教练 › 5. 确定评分证据
          应看到：不是只靠自评。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「提案能在现有环境完成核心路径。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要把“以后支持所有软件”写成当前毕业验收。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：提交提案与项目地图，列3条明确非目标。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不是，完整、可验证和可交接更重要。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       基线固定后增量实施；保护其他任务与用户已有工作。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：GITHUB-PROJECTS.zh.md、START-HERE.zh.md

━━ 第 179 课 / 共 180 课 · 毕业项目实施：检查点、证据与复盘 ━━
教练 › 本课讲解：实施阶段按最小闭环推进：先做核心路径，再补边界，最后做体验与交接。每阶段记录实际产物，遇到问题保留失败并定位，不用整项目推倒重来。编程和写作采用不同质量标准，但都要求事实、范围和验证一致。
    阶段1核心产物→阶段2边界与失败→阶段3体验→阶段4交接
  提示 · 示例解读：中途停止也有可恢复成果，完成状态可核对。
教练 › 深入学习 · 建议 30 分钟（含自行练习，不是运行时限）
       目标：完成「毕业项目实施：检查点、证据与复盘」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第178课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。账号、图形操作和外部写入须另有可用环境与授权；没有条件就记录NOT_RUN。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「毕业项目实施：检查点、证据与复盘」，可与本课示例对照；无无关真实资料。
教练 › 2. 固定本轮目标
          应看到：后续补充有记录。
教练 › 3. 实现最小路径
          应看到：真实保存文件。
教练 › 4. 跑正反例检查
          应看到：保留首个失败。
教练 › 5. 整理复盘
          应看到：说明取舍与未验。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「中途停止也有可恢复成果，完成状态可核对。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 不要把AI最终自评当第三方质量评分；证据不足就保留待验。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：交阶段产物、检查日志和一次失败到修复的过程。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不能，验收依赖实际产物与检查。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       任务输入、模型设置、源码和证据版本关联，便于复现。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：GITHUB-PROJECTS.zh.md、START-HERE.zh.md

━━ 第 180 课 / 共 180 课 · 毕业答辩与后续学习：能够解释也能够交付 ━━
教练 › 本课讲解：完整课堂的终点是能独立完成一个有界任务，并向别人解释做了什么、为什么这样做、怎样验证和哪里还不确定。阅读完成、测验完成、实操作业完成要分开记录。这里提供自评标准，不自动颁发职业资格或证明真实账号与设备已经通过。
    答辩五问：解决什么？产物在哪？证据是什么？有什么限制？怎样继续或回退？
  提示 · 示例解读：每个回答能指向项目文件、日志或来源，而不是只有承诺。
教练 › 深入学习 · 建议 90 分钟（含自行练习，不是运行时限）
       目标：完成「毕业答辩与后续学习：能够解释也能够交付」的操作练习，能够解释结果、诊断常见问题并提交可核对的作业。
  提示 · 准备：先完成第179课。使用自有Koder Projects练习目录和合成数据；阅读示例不会执行命令。账号、图形操作和外部写入须另有可用环境与授权；没有条件就记录NOT_RUN。
教练 › 手把手操作 · 以下是自行选择执行的说明，教程不会代你连接账号、发信或发布。
教练 › 1. 写下本课目标、当前工作区和预期产物。保留练习原件，在副本操作。
          应看到：目标聚焦「毕业答辩与后续学习：能够解释也能够交付」，可与本课示例对照；无无关真实资料。
教练 › 2. 展示最终产物
          应看到：实际打开或运行。
教练 › 3. 解释关键取舍
          应看到：有替代方案比较。
教练 › 4. 提交正反例证据
          应看到：失败未被隐藏。
教练 › 5. 给出交接与学习计划
          应看到：下一位能继续。
教练 › 6. 整理本次实际结果与仍未确认的内容，把证据链接到作业。
          应看到：记录与「每个回答能指向项目文件、日志或来源，而不是只有承诺。」逐项对照，不把未执行项填成通过。
教练 › 遇到问题怎么处理
  提示 · 结果与示例不一致 → 课程勾选完成只表示自报进度，不能自动代表能力认证。 先保存原始错误，再从第一次偏离预期的步骤定位。
  提示 · 当前环境不能完成真实操作 → 完成资料阅读、合成演练和验收计划，标明缺少的账号、运行时或设备。不要伪造回执，也不要为了过课扩大授权。
教练 › 动手作业：提交毕业包：README、项目地图、产物、证据、来源、回退和复盘。自评5项各0–4分，并说明依据。
       自查标准：至少提交明确产物、关键步骤记录和一项失败或边界检查。结合本课判断题核对：不能，需要实际项目与证据，进度只是一种学习记录。 对真实设备或外部服务没有执行的部分写NOT_RUN。
教练 › 开发者教学 · 设计、实现与验收
       建立后续回归题库时固定原题、环境与评分口径；避免改题后宣称进步。
       实现前固定输入、输出、错误与权限契约。为本课关键边界设计一个应通过与一个应拒绝的用例。
       交付时记录源码/配置版本、实际命令、退出码、产物及回退方式；静态检查不替代真实账号或设备验收。
  提示 · 延伸阅读（随安装包 docs/）：GITHUB-PROJECTS.zh.md、START-HERE.zh.md

新功能速查 · Skills / 输入 / Harness
koder skills list 查看技能；/skill 选择，/skills 管理。导入技能不会自动执行脚本或授予权限。
任务运行时可以继续输入补充；Setup 选择 steer（补充当前任务）或 queue（排队）。
/harness deep-research 选择研究配置；koder harness off 关闭 JIT。Setup 可独立关闭 Skills 和教程学习。
应用操作优先已连接 Apps/MCP，再用已授权浏览器或桌面。缺少驱动、授权或经验 owner 时会明确提示，不会虚报成功。
0.4.3 常驻：koder activate 明确开启，koder status 查看，koder deactivate 关闭。Setup 可设置提醒次数、安静时段和来源；默认不读邮箱、日历或浏览历史。
邮箱在 Setup 绑定，授权码显示星号。/mail model on 和 /mail inquire on 分别授权；选择只起草，发送需预览和确认。后台邮箱还需单独开启可见性。
https://karmenloop.com/cli-guide/docs/ALWAYS-ON.zh.html
https://karmenloop.com/cli-guide/docs/ALWAYS-ON.en.html
https://karmenloop.com/cli-guide/docs/RELEASE-0.4.5.html
0.4.5：Windows x64 已内置 Windows-MCP 与独立 Python。先用 koder mcp doctor windows-mcp --json 查看，再在 Setup 配置、测试并启用；不必另跑 winget。
邮箱发送走原生 mail_send/mail_reply，最终内容确认后才发送。/mail monitor on 单独授权后台监控，运行中的常驻宿主默认每 30 秒轮询；安静时段和每日上限仍生效。
https://karmenloop.com/cli-guide/docs/WINDOWS-MCP-BUNDLED.zh.html
https://karmenloop.com/cli-guide/docs/MAIL-DELIVERY.zh.html
Headroom 上下文优化：默认在任务中优化可还原的工具结果，保留原文。Setup → 技能可关闭；koder skills show builtin:headroom 查看方法。完整中英文说明随包位于 docs/HEADROOM.zh.md 和 docs/HEADROOM.en.md。
